diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index f5ba4e1c..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.coverage b/.coverage deleted file mode 100644 index 869b2e39..00000000 Binary files a/.coverage and /dev/null differ diff --git a/.github/.DS_Store b/.github/.DS_Store deleted file mode 100644 index 0f5e5739..00000000 Binary files a/.github/.DS_Store and /dev/null differ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2993e691..66002141 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,22 +1,20 @@ -name: build and test +name: Build and Test on: push: branches: - - master - - develop - pull_request: - branches: - - master - - develop + - main + - v[0-9]+.[0-9]+.x + tags: + - v* jobs: - build: + test: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [3.9] - os: [ubuntu-latest] #ubuntu-latest [macos-latest, ] # + python-version: [3.8] + os: [ubuntu-latest] #ubuntu-latest [macos-latest, ] # env: PYTHON_VERSION: ${{ matrix.python-version }} @@ -32,53 +30,91 @@ jobs: GITHUB_OAUTH_KEY: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install libomp - run: | - if [ "$RUNNER_OS" == "macOS" ]; then - brew install libomp - fi - shell: bash - - name: install dependencies - run: | - pip install --upgrade pip - pip install certifi - pip install tox tox-wheel tox-gh-actions - pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r requirements_tox.txt - python setup_build.py build_ext --inplace - python setup_build.py install - - name: tests - run: | - coverage run --omit gators/*/test*.py -m pytest gators && coverage report && coverage xml - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v2 - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: coverage.xml + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install libomp + run: | + if [ "$RUNNER_OS" == "macOS" ]; then + brew install libomp + fi + shell: bash + # - name: install dependencies + # run: | + # pip install --upgrade pip + # pip install certifi + # pip install tox tox-wheel tox-gh-actions + # # pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r requirements_tox.txt + # # python setup.py build_ext --inplace + # # python setup.py install + # pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r requirements.txt + # pip install -e ."[dev]" + + # - name: tests + # run: | + # coverage run --omit gators/*/test*.py -m pytest gators && coverage report && coverage xml + # - name: Upload coverage to Codecov + # uses: codecov/codecov-action@v2 + # with: + # token: ${{ secrets.CODECOV_TOKEN }} + # file: coverage.xml + + build_wheels: + runs-on: ${{ matrix.os }} + needs: [test] + strategy: + matrix: + os: [macos-latest, ubuntu-latest] + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - uses: actions/checkout@v2 + name: Install java + with: + java-version: 1.8 + + - uses: actions/setup-python@v2 + name: Install Python + with: + python-version: "3.8" + + - name: Install python depencies + run: | + python -m pip install --upgrade pip + python -m pip install certifi cibuildwheel + python -m pip install -r requirements.txt + + - name: Build MacOS wheel + # if: matrix.os == 'macos-latest' + env: + CIBW_BUILD: "cp311-macosx_x86_64" #cp37-macosx_x86_64 cp38-macosx_x86_64 cp311-macosx_x86_64 cp39-macosx_x86_64 cp310-macosx_x86_64 cp311-macosx_x86_64 cp312-macosx_x86_64" + # CIBW_BEFORE_ALL: brew install libomp + CIBW_BEFORE_BUILD_MACOS: | + python -m pip install -U pip + python -m pip install certifi cibuildwheel + python -m pip install -r requirements.txt -# run: | -# - name: Test with tox -# run: tox -# with: -# token: {{ secrets.CODECOV_TOKEN }} + run: python -m cibuildwheel --platform macos --output-dir dist -# - run: coverage run -m pytest gators && coverage report && coverage xml - - # token: 'ce68bafd-388e-42e8-abf8-b5ea3b328037' + # - name: Build linux wheels + # if: matrix.os == 'ubuntu-latest' + # env: + # CIBW_BUILD: "cp37-manylinux_x86_64 cp38-manylinux_x86_64 cp39-manylinux_x86_64 cp310-manylinux_x86_64 cp311-manylinux_x86_64" + # CIBW_BEFORE_BUILD_LINUX: | + # python -m pip install -U pip + # python -m pip install certifi cibuildwheel + # python -m pip install -r requirements.txt + # run: python -m cibuildwheel --platform linux --output-dir dist - # - name: Install dependencies - # run: | - # python -m pip install --upgrade pip - # pip install tox tox-wheel tox-gh-actions - # pip install numpy<1.20.0 - # pip install Cython - # - name: Test with tox - # run: tox + - uses: actions/upload-artifact@v2 + with: + name: wheels + path: ./dist/*.whl diff --git a/.gitignore b/.gitignore index c0066d22..f340f232 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,13 @@ __pycache__/ *.py[cod] *$py.class +.DS_Store +dist # C extensions *.so -.DS_Store +*.pyc + # Distribution / packaging .Python @@ -73,7 +76,7 @@ instance/ .scrapy # Sphinx documentation -doc +doc/ # PyBuilder target/ @@ -131,3 +134,6 @@ dmypy.json # Pyre type checker .pyre/ + +#dask +dask-worker-space \ No newline at end of file diff --git a/.tox/dist/gators-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl b/.tox/dist/gators-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl deleted file mode 100644 index 73dba912..00000000 Binary files a/.tox/dist/gators-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl and /dev/null differ diff --git a/.tox/log/py36-0.log b/.tox/log/py36-0.log deleted file mode 100644 index dff579ed..00000000 --- a/.tox/log/py36-0.log +++ /dev/null @@ -1,8 +0,0 @@ -action: py36, msg: packaging -cwd: /Users/cpoli/opensource/gators/.tox -cmd: /Users/cpoli/gators38/bin/python -m virtualenv --no-download --python /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 py36 -created virtual environment CPython3.6.8.final.0-64 in 707ms - creator CPython3Posix(dest=/Users/cpoli/opensource/gators/.tox/py36, clear=False, no_vcs_ignore=False, global=False) - seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/cpoli/Library/Application Support/virtualenv) - added seed packages: pip==21.2.4, setuptools==58.1.0, wheel==0.37.0 - activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator diff --git a/.tox/log/py36-1.log b/.tox/log/py36-1.log deleted file mode 100644 index 643a36c8..00000000 --- a/.tox/log/py36-1.log +++ /dev/null @@ -1,12 +0,0 @@ -action: py36, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py36/bin/python -m pip install -i https://pypi.python.org/simple numpy==1.19.5 cython -Looking in indexes: https://pypi.python.org/simple -Collecting numpy==1.19.5 - Using cached numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl (15.6 MB) -Collecting cython - Using cached Cython-0.29.24-cp36-cp36m-macosx_10_9_x86_64.whl (1.9 MB) -Installing collected packages: numpy, cython -Successfully installed cython-0.29.24 numpy-1.19.5 -WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py36/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py36-2.log b/.tox/log/py36-2.log deleted file mode 100644 index 9a899e9e..00000000 --- a/.tox/log/py36-2.log +++ /dev/null @@ -1,261 +0,0 @@ -action: py36, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py36/bin/python -m pip install -rrequirements_tox.txt -Requirement already satisfied: setuptools>=51.0.0 in ./.tox/py36/lib/python3.6/site-packages (from -r requirements_tox.txt (line 1)) (58.1.0) -Requirement already satisfied: numpy==1.19.5 in ./.tox/py36/lib/python3.6/site-packages (from -r requirements_tox.txt (line 2)) (1.19.5) -Collecting requests>=2.23.0 - Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB) -Collecting tqdm>=4.43.0 - Using cached tqdm-4.62.3-py2.py3-none-any.whl (76 kB) -Collecting scipy>=1.5.2 - Using cached scipy-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl (28.8 MB) -Requirement already satisfied: Cython>=0.29.24 in ./.tox/py36/lib/python3.6/site-packages (from -r requirements_tox.txt (line 6)) (0.29.24) -Collecting dill>=0.3.1.1 - Using cached dill-0.3.4-py2.py3-none-any.whl (86 kB) -Collecting scikit-learn==0.23.1 - Using cached scikit_learn-0.23.1-cp36-cp36m-macosx_10_9_x86_64.whl (7.2 MB) -Collecting seaborn>=0.11.0 - Using cached seaborn-0.11.2-py3-none-any.whl (292 kB) -Collecting pandas>=0.25.3 - Using cached pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl (10.2 MB) -Collecting treelite>=0.93 - Using cached treelite-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (523 kB) -Collecting treelite-runtime>=0.93 - Using cached treelite_runtime-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (64 kB) -Collecting xgboost>=0.90 - Using cached xgboost-1.5.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.3 MB) -Collecting pyDOE>=0.3.8 - Using cached pyDOE-0.3.8-py3-none-any.whl -Collecting scikit-optimize>=0.8.1 - Using cached scikit_optimize-0.9.0-py2.py3-none-any.whl (100 kB) -Collecting emcee>=3.0.2 - Using cached emcee-3.1.1-py2.py3-none-any.whl (45 kB) -Collecting pyspark>=2.4.3 - Using cached pyspark-3.2.0-py2.py3-none-any.whl -Collecting koalas - Using cached koalas-1.8.2-py3-none-any.whl (390 kB) -Collecting hyperopt>=0.2.5 - Using cached hyperopt-0.2.5-py2.py3-none-any.whl (965 kB) -Collecting Lightgbm - Using cached lightgbm-3.3.1-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.2 MB) -Collecting pytest>=5.0.0 - Using cached pytest-6.2.5-py3-none-any.whl (280 kB) -Collecting pytest-cov>=2.6.0 - Using cached pytest_cov-3.0.0-py3-none-any.whl (20 kB) -Collecting pylama>=7.6.5 - Using cached pylama-7.7.1-py2.py3-none-any.whl (35 kB) -Collecting docutils==0.16.0 - Using cached docutils-0.16-py2.py3-none-any.whl (548 kB) -Collecting sphinx>=3.3.0 - Using cached Sphinx-4.2.0-py3-none-any.whl (3.1 MB) -Collecting nbsphinx>=0.8.0 - Using cached nbsphinx-0.8.7-py3-none-any.whl (25 kB) -Collecting pydata_sphinx_theme - Using cached pydata_sphinx_theme-0.7.1-py3-none-any.whl (1.4 MB) -Collecting ipykernel - Using cached ipykernel-5.5.6-py3-none-any.whl (121 kB) -Collecting jupyter - Using cached jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB) -Collecting numpydoc - Using cached numpydoc-1.1.0-py3-none-any.whl (47 kB) -Collecting threadpoolctl>=2.0.0 - Using cached threadpoolctl-3.0.0-py3-none-any.whl (14 kB) -Collecting joblib>=0.11 - Using cached joblib-1.1.0-py2.py3-none-any.whl (306 kB) -Collecting idna<4,>=2.5 - Using cached idna-3.3-py3-none-any.whl (61 kB) -Collecting urllib3<1.27,>=1.21.1 - Using cached urllib3-1.26.7-py2.py3-none-any.whl (138 kB) -Collecting charset-normalizer~=2.0.0 - Using cached charset_normalizer-2.0.7-py3-none-any.whl (38 kB) -Collecting certifi>=2017.4.17 - Using cached certifi-2021.10.8-py2.py3-none-any.whl (149 kB) -Collecting matplotlib>=2.2 - Using cached matplotlib-3.3.4-cp36-cp36m-macosx_10_9_x86_64.whl (8.5 MB) -Collecting python-dateutil>=2.7.3 - Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) -Collecting pytz>=2017.2 - Using cached pytz-2021.3-py2.py3-none-any.whl (503 kB) -Collecting pyaml>=16.9 - Using cached pyaml-21.10.1-py2.py3-none-any.whl (24 kB) -Collecting py4j==0.10.9.2 - Using cached py4j-0.10.9.2-py2.py3-none-any.whl (198 kB) -Collecting pyarrow>=0.10 - Using cached pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl (19.1 MB) -Collecting six - Using cached six-1.16.0-py2.py3-none-any.whl (11 kB) -Collecting future - Using cached future-0.18.2-py3-none-any.whl -Collecting networkx>=2.2 - Using cached networkx-2.5.1-py3-none-any.whl (1.6 MB) -Collecting cloudpickle - Using cached cloudpickle-2.0.0-py3-none-any.whl (25 kB) -Requirement already satisfied: wheel in ./.tox/py36/lib/python3.6/site-packages (from Lightgbm->-r requirements_tox.txt (line 20)) (0.37.0) -Collecting importlib-metadata>=0.12 - Using cached importlib_metadata-4.8.1-py3-none-any.whl (17 kB) -Collecting packaging - Using cached packaging-21.2-py3-none-any.whl (40 kB) -Collecting toml - Using cached toml-0.10.2-py2.py3-none-any.whl (16 kB) -Collecting pluggy<2.0,>=0.12 - Using cached pluggy-1.0.0-py2.py3-none-any.whl (13 kB) -Collecting py>=1.8.2 - Using cached py-1.10.0-py2.py3-none-any.whl (97 kB) -Collecting iniconfig - Using cached iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB) -Collecting attrs>=19.2.0 - Using cached attrs-21.2.0-py2.py3-none-any.whl (53 kB) -Collecting coverage[toml]>=5.2.1 - Using cached coverage-6.0.2-cp36-cp36m-macosx_10_9_x86_64.whl (218 kB) -Collecting pycodestyle>=2.3.1 - Using cached pycodestyle-2.8.0-py2.py3-none-any.whl (42 kB) -Collecting pydocstyle>=2.0.0 - Using cached pydocstyle-6.1.1-py3-none-any.whl (37 kB) -Collecting mccabe>=0.5.2 - Using cached mccabe-0.6.1-py2.py3-none-any.whl (8.6 kB) -Collecting pyflakes>=1.5.0 - Using cached pyflakes-2.4.0-py2.py3-none-any.whl (69 kB) -Collecting sphinxcontrib-applehelp - Using cached sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB) -Collecting sphinxcontrib-jsmath - Using cached sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) -Collecting imagesize - Using cached imagesize-1.2.0-py2.py3-none-any.whl (4.8 kB) -Collecting Pygments>=2.0 - Using cached Pygments-2.10.0-py3-none-any.whl (1.0 MB) -Collecting alabaster<0.8,>=0.7 - Using cached alabaster-0.7.12-py2.py3-none-any.whl (14 kB) -Collecting snowballstemmer>=1.1 - Using cached snowballstemmer-2.1.0-py2.py3-none-any.whl (93 kB) -Collecting sphinxcontrib-htmlhelp>=2.0.0 - Using cached sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB) -Collecting sphinxcontrib-serializinghtml>=1.1.5 - Using cached sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB) -Collecting babel>=1.3 - Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB) -Collecting sphinxcontrib-qthelp - Using cached sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB) -Collecting Jinja2>=2.3 - Using cached Jinja2-3.0.2-py3-none-any.whl (133 kB) -Collecting sphinxcontrib-devhelp - Using cached sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB) -Collecting nbconvert!=5.4 - Using cached nbconvert-6.0.7-py3-none-any.whl (552 kB) -Collecting traitlets - Using cached traitlets-4.3.3-py2.py3-none-any.whl (75 kB) -Collecting nbformat - Using cached nbformat-5.1.3-py3-none-any.whl (178 kB) -Collecting beautifulsoup4 - Using cached beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) -Collecting appnope - Using cached appnope-0.1.2-py2.py3-none-any.whl (4.3 kB) -Collecting ipython>=5.0.0 - Using cached ipython-7.16.1-py3-none-any.whl (785 kB) -Collecting jupyter-client - Using cached jupyter_client-7.0.6-py3-none-any.whl (125 kB) -Collecting tornado>=4.2 - Using cached tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl (416 kB) -Collecting ipython-genutils - Using cached ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB) -Collecting ipywidgets - Using cached ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB) -Collecting qtconsole - Using cached qtconsole-5.1.1-py3-none-any.whl (119 kB) -Collecting jupyter-console - Using cached jupyter_console-6.4.0-py3-none-any.whl (22 kB) -Collecting notebook - Using cached notebook-6.4.5-py3-none-any.whl (9.9 MB) -Collecting tomli - Using cached tomli-1.2.2-py3-none-any.whl (12 kB) -Collecting zipp>=0.5 - Using cached zipp-3.6.0-py3-none-any.whl (5.3 kB) -Collecting typing-extensions>=3.6.4 - Using cached typing_extensions-3.10.0.2-py3-none-any.whl (26 kB) -Collecting jedi>=0.10 - Using cached jedi-0.18.0-py2.py3-none-any.whl (1.4 MB) -Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 - Using cached prompt_toolkit-3.0.21-py3-none-any.whl (374 kB) -Collecting decorator - Using cached decorator-5.1.0-py3-none-any.whl (9.1 kB) -Collecting pexpect - Using cached pexpect-4.8.0-py2.py3-none-any.whl (59 kB) -Collecting backcall - Using cached backcall-0.2.0-py2.py3-none-any.whl (11 kB) -Collecting pickleshare - Using cached pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB) -Collecting parso<0.9.0,>=0.8.0 - Using cached parso-0.8.2-py2.py3-none-any.whl (94 kB) -Collecting MarkupSafe>=2.0 - Using cached MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl (13 kB) -Collecting kiwisolver>=1.0.1 - Using cached kiwisolver-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl (61 kB) -Collecting cycler>=0.10 - Using cached cycler-0.11.0-py3-none-any.whl (6.4 kB) -Collecting pillow>=6.2.0 - Using cached Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl (3.0 MB) -Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 - Using cached pyparsing-3.0.3-py3-none-any.whl (96 kB) -Collecting jupyterlab-pygments - Using cached jupyterlab_pygments-0.1.2-py2.py3-none-any.whl (4.6 kB) -Collecting entrypoints>=0.2.2 - Using cached entrypoints-0.3-py2.py3-none-any.whl (11 kB) -Collecting defusedxml - Using cached defusedxml-0.7.1-py2.py3-none-any.whl (25 kB) -Collecting bleach - Using cached bleach-4.1.0-py2.py3-none-any.whl (157 kB) -Collecting mistune<2,>=0.8.1 - Using cached mistune-0.8.4-py2.py3-none-any.whl (16 kB) -Collecting testpath - Using cached testpath-0.5.0-py3-none-any.whl (84 kB) -Collecting jupyter-core - Using cached jupyter_core-4.9.1-py3-none-any.whl (86 kB) -Collecting pandocfilters>=1.4.1 - Using cached pandocfilters-1.5.0-py2.py3-none-any.whl (8.7 kB) -Collecting nbclient<0.6.0,>=0.5.0 - Using cached nbclient-0.5.4-py3-none-any.whl (66 kB) -Collecting nest-asyncio - Using cached nest_asyncio-1.5.1-py3-none-any.whl (5.0 kB) -Collecting async-generator - Using cached async_generator-1.10-py3-none-any.whl (18 kB) -Collecting pyzmq>=13 - Using cached pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl (1.3 MB) -Collecting jsonschema!=2.5.0,>=2.4 - Using cached jsonschema-3.2.0-py2.py3-none-any.whl (56 kB) -Collecting pyrsistent>=0.14.0 - Using cached pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl (68 kB) -Collecting decorator - Using cached decorator-4.4.2-py2.py3-none-any.whl (9.2 kB) -Collecting wcwidth - Using cached wcwidth-0.2.5-py2.py3-none-any.whl (30 kB) -Collecting PyYAML - Using cached PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl (189 kB) -Collecting soupsieve>1.2 - Using cached soupsieve-2.2.1-py3-none-any.whl (33 kB) -Collecting webencodings - Using cached webencodings-0.5.1-py2.py3-none-any.whl (11 kB) -Collecting widgetsnbextension~=3.5.0 - Using cached widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB) -Collecting jupyterlab-widgets>=1.0.0 - Using cached jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB) -Collecting prometheus-client - Using cached prometheus_client-0.11.0-py2.py3-none-any.whl (56 kB) -Collecting terminado>=0.8.3 - Using cached terminado-0.12.1-py3-none-any.whl (15 kB) -Collecting Send2Trash>=1.5.0 - Using cached Send2Trash-1.8.0-py3-none-any.whl (18 kB) -Collecting argon2-cffi - Using cached argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl (38 kB) -Collecting ptyprocess - Using cached ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB) -Collecting cffi>=1.0.0 - Using cached cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl (178 kB) -Collecting pycparser - Using cached pycparser-2.20-py2.py3-none-any.whl (112 kB) -Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 - Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB) -Collecting qtpy - Using cached QtPy-1.11.2-py2.py3-none-any.whl (58 kB) -Installing collected packages: zipp, typing-extensions, six, ipython-genutils, decorator, traitlets, pyrsistent, importlib-metadata, attrs, wcwidth, tornado, pyzmq, python-dateutil, pyparsing, ptyprocess, parso, nest-asyncio, jupyter-core, jsonschema, entrypoints, webencodings, Pygments, pycparser, prompt-toolkit, pickleshare, pexpect, packaging, nbformat, MarkupSafe, jupyter-client, jedi, backcall, async-generator, appnope, testpath, pandocfilters, nbclient, mistune, jupyterlab-pygments, Jinja2, ipython, defusedxml, cffi, bleach, terminado, Send2Trash, prometheus-client, nbconvert, ipykernel, argon2-cffi, urllib3, pytz, notebook, idna, charset-normalizer, certifi, widgetsnbextension, tomli, toml, threadpoolctl, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, soupsieve, snowballstemmer, scipy, requests, qtpy, PyYAML, py, pluggy, pillow, kiwisolver, jupyterlab-widgets, joblib, iniconfig, imagesize, docutils, cycler, coverage, babel, alabaster, tqdm, sphinx, scikit-learn, qtconsole, pytest, pyflakes, pydocstyle, pycodestyle, pyarrow, pyaml, py4j, pandas, networkx, mccabe, matplotlib, jupyter-console, ipywidgets, future, cloudpickle, beautifulsoup4, xgboost, treelite-runtime, treelite, seaborn, scikit-optimize, pytest-cov, pyspark, pylama, pyDOE, pydata-sphinx-theme, numpydoc, nbsphinx, Lightgbm, koalas, jupyter, hyperopt, emcee, dill -Successfully installed Jinja2-3.0.2 Lightgbm-3.3.1 MarkupSafe-2.0.1 PyYAML-6.0 Pygments-2.10.0 Send2Trash-1.8.0 alabaster-0.7.12 appnope-0.1.2 argon2-cffi-21.1.0 async-generator-1.10 attrs-21.2.0 babel-2.9.1 backcall-0.2.0 beautifulsoup4-4.10.0 bleach-4.1.0 certifi-2021.10.8 cffi-1.15.0 charset-normalizer-2.0.7 cloudpickle-2.0.0 coverage-6.0.2 cycler-0.11.0 decorator-4.4.2 defusedxml-0.7.1 dill-0.3.4 docutils-0.16 emcee-3.1.1 entrypoints-0.3 future-0.18.2 hyperopt-0.2.5 idna-3.3 imagesize-1.2.0 importlib-metadata-4.8.1 iniconfig-1.1.1 ipykernel-5.5.6 ipython-7.16.1 ipython-genutils-0.2.0 ipywidgets-7.6.5 jedi-0.18.0 joblib-1.1.0 jsonschema-3.2.0 jupyter-1.0.0 jupyter-client-7.0.6 jupyter-console-6.4.0 jupyter-core-4.9.1 jupyterlab-pygments-0.1.2 jupyterlab-widgets-1.0.2 kiwisolver-1.3.1 koalas-1.8.2 matplotlib-3.3.4 mccabe-0.6.1 mistune-0.8.4 nbclient-0.5.4 nbconvert-6.0.7 nbformat-5.1.3 nbsphinx-0.8.7 nest-asyncio-1.5.1 networkx-2.5.1 notebook-6.4.5 numpydoc-1.1.0 packaging-21.2 pandas-1.1.5 pandocfilters-1.5.0 parso-0.8.2 pexpect-4.8.0 pickleshare-0.7.5 pillow-8.4.0 pluggy-1.0.0 prometheus-client-0.11.0 prompt-toolkit-3.0.21 ptyprocess-0.7.0 py-1.10.0 py4j-0.10.9.2 pyDOE-0.3.8 pyaml-21.10.1 pyarrow-6.0.0 pycodestyle-2.8.0 pycparser-2.20 pydata-sphinx-theme-0.7.1 pydocstyle-6.1.1 pyflakes-2.4.0 pylama-7.7.1 pyparsing-2.4.7 pyrsistent-0.18.0 pyspark-3.2.0 pytest-6.2.5 pytest-cov-3.0.0 python-dateutil-2.8.2 pytz-2021.3 pyzmq-22.3.0 qtconsole-5.1.1 qtpy-1.11.2 requests-2.26.0 scikit-learn-0.23.1 scikit-optimize-0.9.0 scipy-1.5.4 seaborn-0.11.2 six-1.16.0 snowballstemmer-2.1.0 soupsieve-2.2.1 sphinx-4.2.0 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 terminado-0.12.1 testpath-0.5.0 threadpoolctl-3.0.0 toml-0.10.2 tomli-1.2.2 tornado-6.1 tqdm-4.62.3 traitlets-4.3.3 treelite-2.1.0 treelite-runtime-2.1.0 typing-extensions-3.10.0.2 urllib3-1.26.7 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.5.2 xgboost-1.5.0 zipp-3.6.0 -WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py36/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py37-0.log b/.tox/log/py37-0.log deleted file mode 100644 index 8b0c9d50..00000000 --- a/.tox/log/py37-0.log +++ /dev/null @@ -1,8 +0,0 @@ -action: py37, msg: packaging -cwd: /Users/cpoli/opensource/gators/.tox -cmd: /Users/cpoli/gators38/bin/python -m virtualenv --no-download --python /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 py37 -created virtual environment CPython3.7.9.final.0-64 in 690ms - creator CPython3Posix(dest=/Users/cpoli/opensource/gators/.tox/py37, clear=False, no_vcs_ignore=False, global=False) - seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/cpoli/Library/Application Support/virtualenv) - added seed packages: pip==21.2.4, setuptools==58.1.0, wheel==0.37.0 - activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator diff --git a/.tox/log/py37-1.log b/.tox/log/py37-1.log deleted file mode 100644 index e2f88f62..00000000 --- a/.tox/log/py37-1.log +++ /dev/null @@ -1,12 +0,0 @@ -action: py37, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py37/bin/python -m pip install -i https://pypi.python.org/simple numpy==1.19.5 cython -Looking in indexes: https://pypi.python.org/simple -Collecting numpy==1.19.5 - Using cached numpy-1.19.5-cp37-cp37m-macosx_10_9_x86_64.whl (15.6 MB) -Collecting cython - Using cached Cython-0.29.24-cp37-cp37m-macosx_10_9_x86_64.whl (1.9 MB) -Installing collected packages: numpy, cython -Successfully installed cython-0.29.24 numpy-1.19.5 -WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py37/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py37-2.log b/.tox/log/py37-2.log deleted file mode 100644 index b99fef84..00000000 --- a/.tox/log/py37-2.log +++ /dev/null @@ -1,263 +0,0 @@ -action: py37, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py37/bin/python -m pip install -rrequirements_tox.txt -Requirement already satisfied: setuptools>=51.0.0 in ./.tox/py37/lib/python3.7/site-packages (from -r requirements_tox.txt (line 1)) (58.1.0) -Requirement already satisfied: numpy==1.19.5 in ./.tox/py37/lib/python3.7/site-packages (from -r requirements_tox.txt (line 2)) (1.19.5) -Collecting requests>=2.23.0 - Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB) -Collecting tqdm>=4.43.0 - Using cached tqdm-4.62.3-py2.py3-none-any.whl (76 kB) -Collecting scipy>=1.5.2 - Using cached scipy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl (32.6 MB) -Requirement already satisfied: Cython>=0.29.24 in ./.tox/py37/lib/python3.7/site-packages (from -r requirements_tox.txt (line 6)) (0.29.24) -Collecting dill>=0.3.1.1 - Using cached dill-0.3.4-py2.py3-none-any.whl (86 kB) -Collecting scikit-learn==0.23.1 - Using cached scikit_learn-0.23.1-cp37-cp37m-macosx_10_9_x86_64.whl (7.2 MB) -Collecting seaborn>=0.11.0 - Using cached seaborn-0.11.2-py3-none-any.whl (292 kB) -Collecting pandas>=0.25.3 - Using cached pandas-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl (11.3 MB) -Collecting treelite>=0.93 - Using cached treelite-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (523 kB) -Collecting treelite-runtime>=0.93 - Using cached treelite_runtime-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (64 kB) -Collecting xgboost>=0.90 - Using cached xgboost-1.5.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.3 MB) -Collecting pyDOE>=0.3.8 - Using cached pyDOE-0.3.8-py3-none-any.whl -Collecting scikit-optimize>=0.8.1 - Using cached scikit_optimize-0.9.0-py2.py3-none-any.whl (100 kB) -Collecting emcee>=3.0.2 - Using cached emcee-3.1.1-py2.py3-none-any.whl (45 kB) -Collecting pyspark>=2.4.3 - Using cached pyspark-3.2.0-py2.py3-none-any.whl -Collecting koalas - Using cached koalas-1.8.2-py3-none-any.whl (390 kB) -Collecting hyperopt>=0.2.5 - Using cached hyperopt-0.2.5-py2.py3-none-any.whl (965 kB) -Collecting Lightgbm - Using cached lightgbm-3.3.1-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.2 MB) -Collecting pytest>=5.0.0 - Using cached pytest-6.2.5-py3-none-any.whl (280 kB) -Collecting pytest-cov>=2.6.0 - Using cached pytest_cov-3.0.0-py3-none-any.whl (20 kB) -Collecting pylama>=7.6.5 - Using cached pylama-7.7.1-py2.py3-none-any.whl (35 kB) -Collecting docutils==0.16.0 - Using cached docutils-0.16-py2.py3-none-any.whl (548 kB) -Collecting sphinx>=3.3.0 - Using cached Sphinx-4.2.0-py3-none-any.whl (3.1 MB) -Collecting nbsphinx>=0.8.0 - Using cached nbsphinx-0.8.7-py3-none-any.whl (25 kB) -Collecting pydata_sphinx_theme - Using cached pydata_sphinx_theme-0.7.1-py3-none-any.whl (1.4 MB) -Collecting ipykernel - Using cached ipykernel-6.4.2-py3-none-any.whl (124 kB) -Collecting jupyter - Using cached jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB) -Collecting numpydoc - Using cached numpydoc-1.1.0-py3-none-any.whl (47 kB) -Collecting threadpoolctl>=2.0.0 - Using cached threadpoolctl-3.0.0-py3-none-any.whl (14 kB) -Collecting joblib>=0.11 - Using cached joblib-1.1.0-py2.py3-none-any.whl (306 kB) -Collecting idna<4,>=2.5 - Using cached idna-3.3-py3-none-any.whl (61 kB) -Collecting urllib3<1.27,>=1.21.1 - Using cached urllib3-1.26.7-py2.py3-none-any.whl (138 kB) -Collecting charset-normalizer~=2.0.0 - Using cached charset_normalizer-2.0.7-py3-none-any.whl (38 kB) -Collecting certifi>=2017.4.17 - Using cached certifi-2021.10.8-py2.py3-none-any.whl (149 kB) -Collecting matplotlib>=2.2 - Using cached matplotlib-3.4.3-cp37-cp37m-macosx_10_9_x86_64.whl (7.2 MB) -Collecting python-dateutil>=2.7.3 - Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) -Collecting pytz>=2017.3 - Using cached pytz-2021.3-py2.py3-none-any.whl (503 kB) -Collecting pyaml>=16.9 - Using cached pyaml-21.10.1-py2.py3-none-any.whl (24 kB) -Collecting py4j==0.10.9.2 - Using cached py4j-0.10.9.2-py2.py3-none-any.whl (198 kB) -Collecting pyarrow>=0.10 - Using cached pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl (19.1 MB) -Collecting six - Using cached six-1.16.0-py2.py3-none-any.whl (11 kB) -Collecting future - Using cached future-0.18.2-py3-none-any.whl -Collecting networkx>=2.2 - Using cached networkx-2.6.3-py3-none-any.whl (1.9 MB) -Collecting cloudpickle - Using cached cloudpickle-2.0.0-py3-none-any.whl (25 kB) -Requirement already satisfied: wheel in ./.tox/py37/lib/python3.7/site-packages (from Lightgbm->-r requirements_tox.txt (line 20)) (0.37.0) -Collecting importlib-metadata>=0.12 - Using cached importlib_metadata-4.8.1-py3-none-any.whl (17 kB) -Collecting packaging - Using cached packaging-21.2-py3-none-any.whl (40 kB) -Collecting toml - Using cached toml-0.10.2-py2.py3-none-any.whl (16 kB) -Collecting pluggy<2.0,>=0.12 - Using cached pluggy-1.0.0-py2.py3-none-any.whl (13 kB) -Collecting py>=1.8.2 - Using cached py-1.10.0-py2.py3-none-any.whl (97 kB) -Collecting iniconfig - Using cached iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB) -Collecting attrs>=19.2.0 - Using cached attrs-21.2.0-py2.py3-none-any.whl (53 kB) -Collecting coverage[toml]>=5.2.1 - Using cached coverage-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl (218 kB) -Collecting pycodestyle>=2.3.1 - Using cached pycodestyle-2.8.0-py2.py3-none-any.whl (42 kB) -Collecting pydocstyle>=2.0.0 - Using cached pydocstyle-6.1.1-py3-none-any.whl (37 kB) -Collecting mccabe>=0.5.2 - Using cached mccabe-0.6.1-py2.py3-none-any.whl (8.6 kB) -Collecting pyflakes>=1.5.0 - Using cached pyflakes-2.4.0-py2.py3-none-any.whl (69 kB) -Collecting sphinxcontrib-applehelp - Using cached sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB) -Collecting sphinxcontrib-jsmath - Using cached sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) -Collecting imagesize - Using cached imagesize-1.2.0-py2.py3-none-any.whl (4.8 kB) -Collecting Pygments>=2.0 - Using cached Pygments-2.10.0-py3-none-any.whl (1.0 MB) -Collecting alabaster<0.8,>=0.7 - Using cached alabaster-0.7.12-py2.py3-none-any.whl (14 kB) -Collecting snowballstemmer>=1.1 - Using cached snowballstemmer-2.1.0-py2.py3-none-any.whl (93 kB) -Collecting sphinxcontrib-htmlhelp>=2.0.0 - Using cached sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB) -Collecting sphinxcontrib-serializinghtml>=1.1.5 - Using cached sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB) -Collecting babel>=1.3 - Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB) -Collecting sphinxcontrib-qthelp - Using cached sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB) -Collecting Jinja2>=2.3 - Using cached Jinja2-3.0.2-py3-none-any.whl (133 kB) -Collecting sphinxcontrib-devhelp - Using cached sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB) -Collecting nbconvert!=5.4 - Using cached nbconvert-6.2.0-py3-none-any.whl (553 kB) -Collecting traitlets - Using cached traitlets-5.1.1-py3-none-any.whl (102 kB) -Collecting nbformat - Using cached nbformat-5.1.3-py3-none-any.whl (178 kB) -Collecting beautifulsoup4 - Using cached beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) -Collecting appnope - Using cached appnope-0.1.2-py2.py3-none-any.whl (4.3 kB) -Collecting jupyter-client<8.0 - Using cached jupyter_client-7.0.6-py3-none-any.whl (125 kB) -Collecting tornado<7.0,>=4.2 - Using cached tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl (416 kB) -Collecting ipython<8.0,>=7.23.1 - Using cached ipython-7.28.0-py3-none-any.whl (788 kB) -Collecting argcomplete>=1.12.3 - Using cached argcomplete-1.12.3-py2.py3-none-any.whl (38 kB) -Collecting ipython-genutils - Using cached ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB) -Collecting debugpy<2.0,>=1.0.0 - Using cached debugpy-1.5.1-cp37-cp37m-macosx_10_15_x86_64.whl (1.7 MB) -Collecting matplotlib-inline<0.2.0,>=0.1.0 - Using cached matplotlib_inline-0.1.3-py3-none-any.whl (8.2 kB) -Collecting ipywidgets - Using cached ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB) -Collecting qtconsole - Using cached qtconsole-5.1.1-py3-none-any.whl (119 kB) -Collecting jupyter-console - Using cached jupyter_console-6.4.0-py3-none-any.whl (22 kB) -Collecting notebook - Using cached notebook-6.4.5-py3-none-any.whl (9.9 MB) -Collecting tomli - Using cached tomli-1.2.2-py3-none-any.whl (12 kB) -Collecting zipp>=0.5 - Using cached zipp-3.6.0-py3-none-any.whl (5.3 kB) -Collecting typing-extensions>=3.6.4 - Using cached typing_extensions-3.10.0.2-py3-none-any.whl (26 kB) -Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 - Using cached prompt_toolkit-3.0.21-py3-none-any.whl (374 kB) -Collecting decorator - Using cached decorator-5.1.0-py3-none-any.whl (9.1 kB) -Collecting pexpect>4.3 - Using cached pexpect-4.8.0-py2.py3-none-any.whl (59 kB) -Collecting backcall - Using cached backcall-0.2.0-py2.py3-none-any.whl (11 kB) -Collecting pickleshare - Using cached pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB) -Collecting jedi>=0.16 - Using cached jedi-0.18.0-py2.py3-none-any.whl (1.4 MB) -Collecting parso<0.9.0,>=0.8.0 - Using cached parso-0.8.2-py2.py3-none-any.whl (94 kB) -Collecting MarkupSafe>=2.0 - Using cached MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl (13 kB) -Collecting jupyter-core>=4.6.0 - Using cached jupyter_core-4.9.1-py3-none-any.whl (86 kB) -Collecting entrypoints - Using cached entrypoints-0.3-py2.py3-none-any.whl (11 kB) -Collecting pyzmq>=13 - Using cached pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl (1.3 MB) -Collecting nest-asyncio>=1.5 - Using cached nest_asyncio-1.5.1-py3-none-any.whl (5.0 kB) -Collecting kiwisolver>=1.0.1 - Using cached kiwisolver-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl (61 kB) -Collecting pyparsing>=2.2.1 - Using cached pyparsing-3.0.3-py3-none-any.whl (96 kB) -Collecting cycler>=0.10 - Using cached cycler-0.11.0-py3-none-any.whl (6.4 kB) -Collecting pillow>=6.2.0 - Using cached Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl (3.0 MB) -Collecting jupyterlab-pygments - Using cached jupyterlab_pygments-0.1.2-py2.py3-none-any.whl (4.6 kB) -Collecting defusedxml - Using cached defusedxml-0.7.1-py2.py3-none-any.whl (25 kB) -Collecting bleach - Using cached bleach-4.1.0-py2.py3-none-any.whl (157 kB) -Collecting mistune<2,>=0.8.1 - Using cached mistune-0.8.4-py2.py3-none-any.whl (16 kB) -Collecting testpath - Using cached testpath-0.5.0-py3-none-any.whl (84 kB) -Collecting pandocfilters>=1.4.1 - Using cached pandocfilters-1.5.0-py2.py3-none-any.whl (8.7 kB) -Collecting nbclient<0.6.0,>=0.5.0 - Using cached nbclient-0.5.4-py3-none-any.whl (66 kB) -Collecting jsonschema!=2.5.0,>=2.4 - Using cached jsonschema-4.1.2-py3-none-any.whl (69 kB) -Collecting pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 - Using cached pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl (68 kB) -Collecting ptyprocess>=0.5 - Using cached ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB) -Collecting wcwidth - Using cached wcwidth-0.2.5-py2.py3-none-any.whl (30 kB) -Collecting PyYAML - Using cached PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl (189 kB) -Collecting soupsieve>1.2 - Using cached soupsieve-2.2.1-py3-none-any.whl (33 kB) -Collecting webencodings - Using cached webencodings-0.5.1-py2.py3-none-any.whl (11 kB) -Collecting widgetsnbextension~=3.5.0 - Using cached widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB) -Collecting jupyterlab-widgets>=1.0.0 - Using cached jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB) -Collecting prometheus-client - Using cached prometheus_client-0.11.0-py2.py3-none-any.whl (56 kB) -Collecting terminado>=0.8.3 - Using cached terminado-0.12.1-py3-none-any.whl (15 kB) -Collecting Send2Trash>=1.5.0 - Using cached Send2Trash-1.8.0-py3-none-any.whl (18 kB) -Collecting argon2-cffi - Using cached argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl (38 kB) -Collecting cffi>=1.0.0 - Using cached cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl (178 kB) -Collecting pycparser - Using cached pycparser-2.20-py2.py3-none-any.whl (112 kB) -Collecting pyparsing>=2.2.1 - Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB) -Collecting qtpy - Using cached QtPy-1.11.2-py2.py3-none-any.whl (58 kB) -Installing collected packages: zipp, typing-extensions, traitlets, six, pyrsistent, importlib-metadata, attrs, wcwidth, tornado, pyzmq, python-dateutil, pyparsing, ptyprocess, parso, nest-asyncio, jupyter-core, jsonschema, ipython-genutils, entrypoints, webencodings, Pygments, pycparser, prompt-toolkit, pickleshare, pexpect, packaging, nbformat, matplotlib-inline, MarkupSafe, jupyter-client, jedi, decorator, backcall, appnope, testpath, pandocfilters, nbclient, mistune, jupyterlab-pygments, Jinja2, ipython, defusedxml, debugpy, cffi, bleach, argcomplete, terminado, Send2Trash, prometheus-client, nbconvert, ipykernel, argon2-cffi, urllib3, pytz, notebook, idna, charset-normalizer, certifi, widgetsnbextension, tomli, toml, threadpoolctl, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, soupsieve, snowballstemmer, scipy, requests, qtpy, PyYAML, py, pluggy, pillow, kiwisolver, jupyterlab-widgets, joblib, iniconfig, imagesize, docutils, cycler, coverage, babel, alabaster, tqdm, sphinx, scikit-learn, qtconsole, pytest, pyflakes, pydocstyle, pycodestyle, pyarrow, pyaml, py4j, pandas, networkx, mccabe, matplotlib, jupyter-console, ipywidgets, future, cloudpickle, beautifulsoup4, xgboost, treelite-runtime, treelite, seaborn, scikit-optimize, pytest-cov, pyspark, pylama, pyDOE, pydata-sphinx-theme, numpydoc, nbsphinx, Lightgbm, koalas, jupyter, hyperopt, emcee, dill -Successfully installed Jinja2-3.0.2 Lightgbm-3.3.1 MarkupSafe-2.0.1 PyYAML-6.0 Pygments-2.10.0 Send2Trash-1.8.0 alabaster-0.7.12 appnope-0.1.2 argcomplete-1.12.3 argon2-cffi-21.1.0 attrs-21.2.0 babel-2.9.1 backcall-0.2.0 beautifulsoup4-4.10.0 bleach-4.1.0 certifi-2021.10.8 cffi-1.15.0 charset-normalizer-2.0.7 cloudpickle-2.0.0 coverage-6.0.2 cycler-0.11.0 debugpy-1.5.1 decorator-5.1.0 defusedxml-0.7.1 dill-0.3.4 docutils-0.16 emcee-3.1.1 entrypoints-0.3 future-0.18.2 hyperopt-0.2.5 idna-3.3 imagesize-1.2.0 importlib-metadata-4.8.1 iniconfig-1.1.1 ipykernel-6.4.2 ipython-7.28.0 ipython-genutils-0.2.0 ipywidgets-7.6.5 jedi-0.18.0 joblib-1.1.0 jsonschema-4.1.2 jupyter-1.0.0 jupyter-client-7.0.6 jupyter-console-6.4.0 jupyter-core-4.9.1 jupyterlab-pygments-0.1.2 jupyterlab-widgets-1.0.2 kiwisolver-1.3.2 koalas-1.8.2 matplotlib-3.4.3 matplotlib-inline-0.1.3 mccabe-0.6.1 mistune-0.8.4 nbclient-0.5.4 nbconvert-6.2.0 nbformat-5.1.3 nbsphinx-0.8.7 nest-asyncio-1.5.1 networkx-2.6.3 notebook-6.4.5 numpydoc-1.1.0 packaging-21.2 pandas-1.3.4 pandocfilters-1.5.0 parso-0.8.2 pexpect-4.8.0 pickleshare-0.7.5 pillow-8.4.0 pluggy-1.0.0 prometheus-client-0.11.0 prompt-toolkit-3.0.21 ptyprocess-0.7.0 py-1.10.0 py4j-0.10.9.2 pyDOE-0.3.8 pyaml-21.10.1 pyarrow-6.0.0 pycodestyle-2.8.0 pycparser-2.20 pydata-sphinx-theme-0.7.1 pydocstyle-6.1.1 pyflakes-2.4.0 pylama-7.7.1 pyparsing-2.4.7 pyrsistent-0.18.0 pyspark-3.2.0 pytest-6.2.5 pytest-cov-3.0.0 python-dateutil-2.8.2 pytz-2021.3 pyzmq-22.3.0 qtconsole-5.1.1 qtpy-1.11.2 requests-2.26.0 scikit-learn-0.23.1 scikit-optimize-0.9.0 scipy-1.7.1 seaborn-0.11.2 six-1.16.0 snowballstemmer-2.1.0 soupsieve-2.2.1 sphinx-4.2.0 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 terminado-0.12.1 testpath-0.5.0 threadpoolctl-3.0.0 toml-0.10.2 tomli-1.2.2 tornado-6.1 tqdm-4.62.3 traitlets-5.1.1 treelite-2.1.0 treelite-runtime-2.1.0 typing-extensions-3.10.0.2 urllib3-1.26.7 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.5.2 xgboost-1.5.0 zipp-3.6.0 -WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py37/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py38-0.log b/.tox/log/py38-0.log deleted file mode 100644 index 9905616a..00000000 --- a/.tox/log/py38-0.log +++ /dev/null @@ -1,8 +0,0 @@ -action: py38, msg: packaging -cwd: /Users/cpoli/opensource/gators/.tox -cmd: /Users/cpoli/gators38/bin/python -m virtualenv --no-download --python /Users/cpoli/gators38/bin/python py38 -created virtual environment CPython3.8.10.final.0-64 in 735ms - creator CPython3Posix(dest=/Users/cpoli/opensource/gators/.tox/py38, clear=False, no_vcs_ignore=False, global=False) - seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/cpoli/Library/Application Support/virtualenv) - added seed packages: pip==21.2.4, setuptools==58.1.0, wheel==0.37.0 - activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator diff --git a/.tox/log/py38-1.log b/.tox/log/py38-1.log deleted file mode 100644 index 7e076826..00000000 --- a/.tox/log/py38-1.log +++ /dev/null @@ -1,12 +0,0 @@ -action: py38, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py38/bin/python -m pip install -i https://pypi.python.org/simple numpy==1.19.5 cython -Looking in indexes: https://pypi.python.org/simple -Collecting numpy==1.19.5 - Using cached numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl (15.6 MB) -Collecting cython - Using cached Cython-0.29.24-cp38-cp38-macosx_10_9_x86_64.whl (1.9 MB) -Installing collected packages: numpy, cython -Successfully installed cython-0.29.24 numpy-1.19.5 -WARNING: You are using pip version 21.2.4; however, version 21.3 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py38/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py38-2.log b/.tox/log/py38-2.log deleted file mode 100644 index baa6b7d4..00000000 --- a/.tox/log/py38-2.log +++ /dev/null @@ -1,255 +0,0 @@ -action: py38, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py38/bin/python -m pip install -rrequirements_tox.txt -Requirement already satisfied: setuptools>=51.0.0 in ./.tox/py38/lib/python3.8/site-packages (from -r requirements_tox.txt (line 1)) (58.1.0) -Requirement already satisfied: numpy==1.19.5 in ./.tox/py38/lib/python3.8/site-packages (from -r requirements_tox.txt (line 2)) (1.19.5) -Collecting requests>=2.23.0 - Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB) -Collecting tqdm>=4.43.0 - Using cached tqdm-4.62.3-py2.py3-none-any.whl (76 kB) -Collecting scipy>=1.5.2 - Using cached scipy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl (32.6 MB) -Requirement already satisfied: Cython>=0.29.24 in ./.tox/py38/lib/python3.8/site-packages (from -r requirements_tox.txt (line 6)) (0.29.24) -Collecting dill>=0.3.1.1 - Using cached dill-0.3.4-py2.py3-none-any.whl (86 kB) -Collecting scikit-learn==0.23.1 - Using cached scikit_learn-0.23.1-cp38-cp38-macosx_10_9_x86_64.whl (7.2 MB) -Collecting seaborn>=0.11.0 - Using cached seaborn-0.11.2-py3-none-any.whl (292 kB) -Collecting pandas>=0.25.3 - Using cached pandas-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl (11.4 MB) -Collecting treelite>=0.93 - Using cached treelite-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (523 kB) -Collecting treelite-runtime>=0.93 - Using cached treelite_runtime-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (64 kB) -Collecting xgboost>=0.90 - Using cached xgboost-1.5.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.3 MB) -Collecting pyDOE>=0.3.8 - Using cached pyDOE-0.3.8-py3-none-any.whl -Collecting scikit-optimize>=0.8.1 - Using cached scikit_optimize-0.9.0-py2.py3-none-any.whl (100 kB) -Collecting emcee>=3.0.2 - Using cached emcee-3.1.1-py2.py3-none-any.whl (45 kB) -Collecting pyspark>=2.4.3 - Using cached pyspark-3.2.0-py2.py3-none-any.whl -Collecting koalas - Using cached koalas-1.8.2-py3-none-any.whl (390 kB) -Collecting hyperopt>=0.2.5 - Using cached hyperopt-0.2.5-py2.py3-none-any.whl (965 kB) -Collecting Lightgbm - Using cached lightgbm-3.3.1-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.2 MB) -Collecting pytest>=5.0.0 - Using cached pytest-6.2.5-py3-none-any.whl (280 kB) -Collecting pytest-cov>=2.6.0 - Using cached pytest_cov-3.0.0-py3-none-any.whl (20 kB) -Collecting pylama>=7.6.5 - Using cached pylama-7.7.1-py2.py3-none-any.whl (35 kB) -Collecting docutils==0.16.0 - Using cached docutils-0.16-py2.py3-none-any.whl (548 kB) -Collecting sphinx>=3.3.0 - Using cached Sphinx-4.2.0-py3-none-any.whl (3.1 MB) -Collecting nbsphinx>=0.8.0 - Using cached nbsphinx-0.8.7-py3-none-any.whl (25 kB) -Collecting pydata_sphinx_theme - Using cached pydata_sphinx_theme-0.7.1-py3-none-any.whl (1.4 MB) -Collecting ipykernel - Using cached ipykernel-6.4.2-py3-none-any.whl (124 kB) -Collecting jupyter - Using cached jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB) -Collecting numpydoc - Using cached numpydoc-1.1.0-py3-none-any.whl (47 kB) -Collecting joblib>=0.11 - Using cached joblib-1.1.0-py2.py3-none-any.whl (306 kB) -Collecting threadpoolctl>=2.0.0 - Using cached threadpoolctl-3.0.0-py3-none-any.whl (14 kB) -Collecting urllib3<1.27,>=1.21.1 - Using cached urllib3-1.26.7-py2.py3-none-any.whl (138 kB) -Collecting charset-normalizer~=2.0.0 - Using cached charset_normalizer-2.0.7-py3-none-any.whl (38 kB) -Collecting idna<4,>=2.5 - Using cached idna-3.3-py3-none-any.whl (61 kB) -Collecting certifi>=2017.4.17 - Using cached certifi-2021.10.8-py2.py3-none-any.whl (149 kB) -Collecting matplotlib>=2.2 - Using cached matplotlib-3.4.3-cp38-cp38-macosx_10_9_x86_64.whl (7.2 MB) -Collecting python-dateutil>=2.7.3 - Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) -Collecting pytz>=2017.3 - Using cached pytz-2021.3-py2.py3-none-any.whl (503 kB) -Collecting pyaml>=16.9 - Using cached pyaml-21.10.1-py2.py3-none-any.whl (24 kB) -Collecting py4j==0.10.9.2 - Using cached py4j-0.10.9.2-py2.py3-none-any.whl (198 kB) -Collecting pyarrow>=0.10 - Using cached pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl (19.1 MB) -Collecting six - Using cached six-1.16.0-py2.py3-none-any.whl (11 kB) -Collecting cloudpickle - Using cached cloudpickle-2.0.0-py3-none-any.whl (25 kB) -Collecting networkx>=2.2 - Using cached networkx-2.6.3-py3-none-any.whl (1.9 MB) -Collecting future - Using cached future-0.18.2-py3-none-any.whl -Requirement already satisfied: wheel in ./.tox/py38/lib/python3.8/site-packages (from Lightgbm->-r requirements_tox.txt (line 20)) (0.37.0) -Collecting packaging - Using cached packaging-21.2-py3-none-any.whl (40 kB) -Collecting iniconfig - Using cached iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB) -Collecting pluggy<2.0,>=0.12 - Using cached pluggy-1.0.0-py2.py3-none-any.whl (13 kB) -Collecting toml - Using cached toml-0.10.2-py2.py3-none-any.whl (16 kB) -Collecting attrs>=19.2.0 - Using cached attrs-21.2.0-py2.py3-none-any.whl (53 kB) -Collecting py>=1.8.2 - Using cached py-1.10.0-py2.py3-none-any.whl (97 kB) -Collecting coverage[toml]>=5.2.1 - Using cached coverage-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl (218 kB) -Collecting mccabe>=0.5.2 - Using cached mccabe-0.6.1-py2.py3-none-any.whl (8.6 kB) -Collecting pydocstyle>=2.0.0 - Using cached pydocstyle-6.1.1-py3-none-any.whl (37 kB) -Collecting pyflakes>=1.5.0 - Using cached pyflakes-2.4.0-py2.py3-none-any.whl (69 kB) -Collecting pycodestyle>=2.3.1 - Using cached pycodestyle-2.8.0-py2.py3-none-any.whl (42 kB) -Collecting sphinxcontrib-devhelp - Using cached sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB) -Collecting sphinxcontrib-htmlhelp>=2.0.0 - Using cached sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB) -Collecting sphinxcontrib-qthelp - Using cached sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB) -Collecting babel>=1.3 - Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB) -Collecting snowballstemmer>=1.1 - Using cached snowballstemmer-2.1.0-py2.py3-none-any.whl (93 kB) -Collecting sphinxcontrib-jsmath - Using cached sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) -Collecting Pygments>=2.0 - Using cached Pygments-2.10.0-py3-none-any.whl (1.0 MB) -Collecting alabaster<0.8,>=0.7 - Using cached alabaster-0.7.12-py2.py3-none-any.whl (14 kB) -Collecting sphinxcontrib-applehelp - Using cached sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB) -Collecting sphinxcontrib-serializinghtml>=1.1.5 - Using cached sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB) -Collecting imagesize - Using cached imagesize-1.2.0-py2.py3-none-any.whl (4.8 kB) -Collecting Jinja2>=2.3 - Using cached Jinja2-3.0.2-py3-none-any.whl (133 kB) -Collecting nbconvert!=5.4 - Using cached nbconvert-6.2.0-py3-none-any.whl (553 kB) -Collecting nbformat - Using cached nbformat-5.1.3-py3-none-any.whl (178 kB) -Collecting traitlets - Using cached traitlets-5.1.1-py3-none-any.whl (102 kB) -Collecting beautifulsoup4 - Using cached beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) -Collecting ipython-genutils - Using cached ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB) -Collecting tornado<7.0,>=4.2 - Using cached tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl (416 kB) -Collecting debugpy<2.0,>=1.0.0 - Using cached debugpy-1.5.1-cp38-cp38-macosx_10_15_x86_64.whl (1.7 MB) -Collecting matplotlib-inline<0.2.0,>=0.1.0 - Using cached matplotlib_inline-0.1.3-py3-none-any.whl (8.2 kB) -Collecting ipython<8.0,>=7.23.1 - Using cached ipython-7.28.0-py3-none-any.whl (788 kB) -Collecting appnope - Using cached appnope-0.1.2-py2.py3-none-any.whl (4.3 kB) -Collecting jupyter-client<8.0 - Using cached jupyter_client-7.0.6-py3-none-any.whl (125 kB) -Collecting jupyter-console - Using cached jupyter_console-6.4.0-py3-none-any.whl (22 kB) -Collecting qtconsole - Using cached qtconsole-5.1.1-py3-none-any.whl (119 kB) -Collecting ipywidgets - Using cached ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB) -Collecting notebook - Using cached notebook-6.4.5-py3-none-any.whl (9.9 MB) -Collecting tomli - Using cached tomli-1.2.2-py3-none-any.whl (12 kB) -Collecting decorator - Using cached decorator-5.1.0-py3-none-any.whl (9.1 kB) -Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 - Using cached prompt_toolkit-3.0.21-py3-none-any.whl (374 kB) -Collecting backcall - Using cached backcall-0.2.0-py2.py3-none-any.whl (11 kB) -Collecting pexpect>4.3 - Using cached pexpect-4.8.0-py2.py3-none-any.whl (59 kB) -Collecting jedi>=0.16 - Using cached jedi-0.18.0-py2.py3-none-any.whl (1.4 MB) -Collecting pickleshare - Using cached pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB) -Collecting parso<0.9.0,>=0.8.0 - Using cached parso-0.8.2-py2.py3-none-any.whl (94 kB) -Collecting MarkupSafe>=2.0 - Using cached MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl (13 kB) -Collecting entrypoints - Using cached entrypoints-0.3-py2.py3-none-any.whl (11 kB) -Collecting nest-asyncio>=1.5 - Using cached nest_asyncio-1.5.1-py3-none-any.whl (5.0 kB) -Collecting pyzmq>=13 - Using cached pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl (1.3 MB) -Collecting jupyter-core>=4.6.0 - Using cached jupyter_core-4.9.1-py3-none-any.whl (86 kB) -Collecting pillow>=6.2.0 - Using cached Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl (3.0 MB) -Collecting pyparsing>=2.2.1 - Using cached pyparsing-3.0.3-py3-none-any.whl (96 kB) -Collecting cycler>=0.10 - Using cached cycler-0.11.0-py3-none-any.whl (6.4 kB) -Collecting kiwisolver>=1.0.1 - Using cached kiwisolver-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl (61 kB) -Collecting mistune<2,>=0.8.1 - Using cached mistune-0.8.4-py2.py3-none-any.whl (16 kB) -Collecting bleach - Using cached bleach-4.1.0-py2.py3-none-any.whl (157 kB) -Collecting nbclient<0.6.0,>=0.5.0 - Using cached nbclient-0.5.4-py3-none-any.whl (66 kB) -Collecting jupyterlab-pygments - Using cached jupyterlab_pygments-0.1.2-py2.py3-none-any.whl (4.6 kB) -Collecting pandocfilters>=1.4.1 - Using cached pandocfilters-1.5.0-py2.py3-none-any.whl (8.7 kB) -Collecting defusedxml - Using cached defusedxml-0.7.1-py2.py3-none-any.whl (25 kB) -Collecting testpath - Using cached testpath-0.5.0-py3-none-any.whl (84 kB) -Collecting jsonschema!=2.5.0,>=2.4 - Using cached jsonschema-4.1.2-py3-none-any.whl (69 kB) -Collecting pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 - Using cached pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl (68 kB) -Collecting ptyprocess>=0.5 - Using cached ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB) -Collecting wcwidth - Using cached wcwidth-0.2.5-py2.py3-none-any.whl (30 kB) -Collecting PyYAML - Using cached PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl (192 kB) -Collecting soupsieve>1.2 - Using cached soupsieve-2.2.1-py3-none-any.whl (33 kB) -Collecting webencodings - Using cached webencodings-0.5.1-py2.py3-none-any.whl (11 kB) -Collecting jupyterlab-widgets>=1.0.0 - Using cached jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB) -Collecting widgetsnbextension~=3.5.0 - Using cached widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB) -Collecting argon2-cffi - Using cached argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl (38 kB) -Collecting prometheus-client - Using cached prometheus_client-0.11.0-py2.py3-none-any.whl (56 kB) -Collecting Send2Trash>=1.5.0 - Using cached Send2Trash-1.8.0-py3-none-any.whl (18 kB) -Collecting terminado>=0.8.3 - Using cached terminado-0.12.1-py3-none-any.whl (15 kB) -Collecting cffi>=1.0.0 - Using cached cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl (178 kB) -Collecting pycparser - Using cached pycparser-2.20-py2.py3-none-any.whl (112 kB) -Collecting pyparsing>=2.2.1 - Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB) -Collecting qtpy - Using cached QtPy-1.11.2-py2.py3-none-any.whl (58 kB) -Installing collected packages: traitlets, six, pyrsistent, attrs, wcwidth, tornado, pyzmq, python-dateutil, pyparsing, ptyprocess, parso, nest-asyncio, jupyter-core, jsonschema, ipython-genutils, entrypoints, webencodings, Pygments, pycparser, prompt-toolkit, pickleshare, pexpect, packaging, nbformat, matplotlib-inline, MarkupSafe, jupyter-client, jedi, decorator, backcall, appnope, testpath, pandocfilters, nbclient, mistune, jupyterlab-pygments, Jinja2, ipython, defusedxml, debugpy, cffi, bleach, terminado, Send2Trash, prometheus-client, nbconvert, ipykernel, argon2-cffi, urllib3, pytz, notebook, idna, charset-normalizer, certifi, widgetsnbextension, tomli, toml, threadpoolctl, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, soupsieve, snowballstemmer, scipy, requests, qtpy, PyYAML, py, pluggy, pillow, kiwisolver, jupyterlab-widgets, joblib, iniconfig, imagesize, docutils, cycler, coverage, babel, alabaster, tqdm, sphinx, scikit-learn, qtconsole, pytest, pyflakes, pydocstyle, pycodestyle, pyarrow, pyaml, py4j, pandas, networkx, mccabe, matplotlib, jupyter-console, ipywidgets, future, cloudpickle, beautifulsoup4, xgboost, treelite-runtime, treelite, seaborn, scikit-optimize, pytest-cov, pyspark, pylama, pyDOE, pydata-sphinx-theme, numpydoc, nbsphinx, Lightgbm, koalas, jupyter, hyperopt, emcee, dill -Successfully installed Jinja2-3.0.2 Lightgbm-3.3.1 MarkupSafe-2.0.1 PyYAML-6.0 Pygments-2.10.0 Send2Trash-1.8.0 alabaster-0.7.12 appnope-0.1.2 argon2-cffi-21.1.0 attrs-21.2.0 babel-2.9.1 backcall-0.2.0 beautifulsoup4-4.10.0 bleach-4.1.0 certifi-2021.10.8 cffi-1.15.0 charset-normalizer-2.0.7 cloudpickle-2.0.0 coverage-6.0.2 cycler-0.11.0 debugpy-1.5.1 decorator-5.1.0 defusedxml-0.7.1 dill-0.3.4 docutils-0.16 emcee-3.1.1 entrypoints-0.3 future-0.18.2 hyperopt-0.2.5 idna-3.3 imagesize-1.2.0 iniconfig-1.1.1 ipykernel-6.4.2 ipython-7.28.0 ipython-genutils-0.2.0 ipywidgets-7.6.5 jedi-0.18.0 joblib-1.1.0 jsonschema-4.1.2 jupyter-1.0.0 jupyter-client-7.0.6 jupyter-console-6.4.0 jupyter-core-4.9.1 jupyterlab-pygments-0.1.2 jupyterlab-widgets-1.0.2 kiwisolver-1.3.2 koalas-1.8.2 matplotlib-3.4.3 matplotlib-inline-0.1.3 mccabe-0.6.1 mistune-0.8.4 nbclient-0.5.4 nbconvert-6.2.0 nbformat-5.1.3 nbsphinx-0.8.7 nest-asyncio-1.5.1 networkx-2.6.3 notebook-6.4.5 numpydoc-1.1.0 packaging-21.2 pandas-1.3.4 pandocfilters-1.5.0 parso-0.8.2 pexpect-4.8.0 pickleshare-0.7.5 pillow-8.4.0 pluggy-1.0.0 prometheus-client-0.11.0 prompt-toolkit-3.0.21 ptyprocess-0.7.0 py-1.10.0 py4j-0.10.9.2 pyDOE-0.3.8 pyaml-21.10.1 pyarrow-6.0.0 pycodestyle-2.8.0 pycparser-2.20 pydata-sphinx-theme-0.7.1 pydocstyle-6.1.1 pyflakes-2.4.0 pylama-7.7.1 pyparsing-2.4.7 pyrsistent-0.18.0 pyspark-3.2.0 pytest-6.2.5 pytest-cov-3.0.0 python-dateutil-2.8.2 pytz-2021.3 pyzmq-22.3.0 qtconsole-5.1.1 qtpy-1.11.2 requests-2.26.0 scikit-learn-0.23.1 scikit-optimize-0.9.0 scipy-1.7.1 seaborn-0.11.2 six-1.16.0 snowballstemmer-2.1.0 soupsieve-2.2.1 sphinx-4.2.0 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 terminado-0.12.1 testpath-0.5.0 threadpoolctl-3.0.0 toml-0.10.2 tomli-1.2.2 tornado-6.1 tqdm-4.62.3 traitlets-5.1.1 treelite-2.1.0 treelite-runtime-2.1.0 urllib3-1.26.7 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.5.2 xgboost-1.5.0 -WARNING: You are using pip version 21.2.4; however, version 21.3 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py38/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py39-0.log b/.tox/log/py39-0.log deleted file mode 100644 index 2e743d1d..00000000 --- a/.tox/log/py39-0.log +++ /dev/null @@ -1,8 +0,0 @@ -action: py39, msg: packaging -cwd: /Users/cpoli/opensource/gators/.tox -cmd: /Users/cpoli/gators38/bin/python -m virtualenv --no-download --python /Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 py39 -created virtual environment CPython3.9.6.final.0-64 in 615ms - creator CPython3Posix(dest=/Users/cpoli/opensource/gators/.tox/py39, clear=False, no_vcs_ignore=False, global=False) - seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/cpoli/Library/Application Support/virtualenv) - added seed packages: pip==21.2.4, setuptools==58.1.0, wheel==0.37.0 - activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator diff --git a/.tox/log/py39-1.log b/.tox/log/py39-1.log deleted file mode 100644 index ee716f63..00000000 --- a/.tox/log/py39-1.log +++ /dev/null @@ -1,12 +0,0 @@ -action: py39, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py39/bin/python -m pip install -i https://pypi.python.org/simple numpy==1.19.5 cython -Looking in indexes: https://pypi.python.org/simple -Collecting numpy==1.19.5 - Using cached numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl (15.6 MB) -Collecting cython - Using cached Cython-0.29.24-cp39-cp39-macosx_10_9_x86_64.whl (1.9 MB) -Installing collected packages: numpy, cython -Successfully installed cython-0.29.24 numpy-1.19.5 -WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py39/bin/python -m pip install --upgrade pip' command. diff --git a/.tox/log/py39-2.log b/.tox/log/py39-2.log deleted file mode 100644 index 083dac85..00000000 --- a/.tox/log/py39-2.log +++ /dev/null @@ -1,271 +0,0 @@ -action: py39, msg: packaging -cwd: /Users/cpoli/opensource/gators -cmd: /Users/cpoli/opensource/gators/.tox/py39/bin/python -m pip install -rrequirements_tox.txt -Requirement already satisfied: setuptools>=51.0.0 in ./.tox/py39/lib/python3.9/site-packages (from -r requirements_tox.txt (line 1)) (58.1.0) -Requirement already satisfied: numpy==1.19.5 in ./.tox/py39/lib/python3.9/site-packages (from -r requirements_tox.txt (line 2)) (1.19.5) -Collecting requests>=2.23.0 - Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB) -Collecting tqdm>=4.43.0 - Using cached tqdm-4.62.3-py2.py3-none-any.whl (76 kB) -Collecting scipy>=1.5.2 - Using cached scipy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl (32.8 MB) -Requirement already satisfied: Cython>=0.29.24 in ./.tox/py39/lib/python3.9/site-packages (from -r requirements_tox.txt (line 6)) (0.29.24) -Collecting dill>=0.3.1.1 - Using cached dill-0.3.4-py2.py3-none-any.whl (86 kB) -Collecting scikit-learn==0.23.1 - Using cached scikit-learn-0.23.1.tar.gz (7.2 MB) - Installing build dependencies: started - Installing build dependencies: still running... - Installing build dependencies: finished with status 'done' - Getting requirements to build wheel: started - Getting requirements to build wheel: finished with status 'done' - Preparing wheel metadata: started - Preparing wheel metadata: finished with status 'done' -Collecting seaborn>=0.11.0 - Using cached seaborn-0.11.2-py3-none-any.whl (292 kB) -Collecting pandas>=0.25.3 - Using cached pandas-1.3.4-cp39-cp39-macosx_10_9_x86_64.whl (11.6 MB) -Collecting treelite>=0.93 - Using cached treelite-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (523 kB) -Collecting treelite-runtime>=0.93 - Using cached treelite_runtime-2.1.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (64 kB) -Collecting xgboost>=0.90 - Using cached xgboost-1.5.0-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.3 MB) -Collecting pyDOE>=0.3.8 - Using cached pyDOE-0.3.8-py3-none-any.whl -Collecting scikit-optimize>=0.8.1 - Using cached scikit_optimize-0.9.0-py2.py3-none-any.whl (100 kB) -Collecting emcee>=3.0.2 - Using cached emcee-3.1.1-py2.py3-none-any.whl (45 kB) -Collecting pyspark>=2.4.3 - Using cached pyspark-3.2.0-py2.py3-none-any.whl -Collecting koalas - Using cached koalas-1.8.2-py3-none-any.whl (390 kB) -Collecting hyperopt>=0.2.5 - Using cached hyperopt-0.2.5-py2.py3-none-any.whl (965 kB) -Collecting Lightgbm - Using cached lightgbm-3.3.1-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.2 MB) -Collecting pytest>=5.0.0 - Using cached pytest-6.2.5-py3-none-any.whl (280 kB) -Collecting pytest-cov>=2.6.0 - Using cached pytest_cov-3.0.0-py3-none-any.whl (20 kB) -Collecting pylama>=7.6.5 - Using cached pylama-7.7.1-py2.py3-none-any.whl (35 kB) -Collecting docutils==0.16.0 - Using cached docutils-0.16-py2.py3-none-any.whl (548 kB) -Collecting sphinx>=3.3.0 - Using cached Sphinx-4.2.0-py3-none-any.whl (3.1 MB) -Collecting nbsphinx>=0.8.0 - Using cached nbsphinx-0.8.7-py3-none-any.whl (25 kB) -Collecting pydata_sphinx_theme - Using cached pydata_sphinx_theme-0.7.1-py3-none-any.whl (1.4 MB) -Collecting ipykernel - Using cached ipykernel-6.4.2-py3-none-any.whl (124 kB) -Collecting jupyter - Using cached jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB) -Collecting numpydoc - Using cached numpydoc-1.1.0-py3-none-any.whl (47 kB) -Collecting joblib>=0.11 - Using cached joblib-1.1.0-py2.py3-none-any.whl (306 kB) -Collecting threadpoolctl>=2.0.0 - Using cached threadpoolctl-3.0.0-py3-none-any.whl (14 kB) -Collecting urllib3<1.27,>=1.21.1 - Using cached urllib3-1.26.7-py2.py3-none-any.whl (138 kB) -Collecting charset-normalizer~=2.0.0 - Using cached charset_normalizer-2.0.7-py3-none-any.whl (38 kB) -Collecting certifi>=2017.4.17 - Using cached certifi-2021.10.8-py2.py3-none-any.whl (149 kB) -Collecting idna<4,>=2.5 - Using cached idna-3.3-py3-none-any.whl (61 kB) -Collecting matplotlib>=2.2 - Using cached matplotlib-3.4.3-cp39-cp39-macosx_10_9_x86_64.whl (7.2 MB) -Collecting python-dateutil>=2.7.3 - Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) -Collecting pytz>=2017.3 - Using cached pytz-2021.3-py2.py3-none-any.whl (503 kB) -Collecting pyaml>=16.9 - Using cached pyaml-21.10.1-py2.py3-none-any.whl (24 kB) -Collecting py4j==0.10.9.2 - Using cached py4j-0.10.9.2-py2.py3-none-any.whl (198 kB) -Collecting pyarrow>=0.10 - Using cached pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl (19.1 MB) -Collecting cloudpickle - Using cached cloudpickle-2.0.0-py3-none-any.whl (25 kB) -Collecting networkx>=2.2 - Using cached networkx-2.6.3-py3-none-any.whl (1.9 MB) -Collecting future - Using cached future-0.18.2-py3-none-any.whl -Collecting six - Using cached six-1.16.0-py2.py3-none-any.whl (11 kB) -Requirement already satisfied: wheel in ./.tox/py39/lib/python3.9/site-packages (from Lightgbm->-r requirements_tox.txt (line 20)) (0.37.0) -Collecting iniconfig - Using cached iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB) -Collecting attrs>=19.2.0 - Using cached attrs-21.2.0-py2.py3-none-any.whl (53 kB) -Collecting packaging - Using cached packaging-21.2-py3-none-any.whl (40 kB) -Collecting pluggy<2.0,>=0.12 - Using cached pluggy-1.0.0-py2.py3-none-any.whl (13 kB) -Collecting toml - Using cached toml-0.10.2-py2.py3-none-any.whl (16 kB) -Collecting py>=1.8.2 - Using cached py-1.10.0-py2.py3-none-any.whl (97 kB) -Collecting coverage[toml]>=5.2.1 - Using cached coverage-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl (218 kB) -Collecting pyflakes>=1.5.0 - Using cached pyflakes-2.4.0-py2.py3-none-any.whl (69 kB) -Collecting pydocstyle>=2.0.0 - Using cached pydocstyle-6.1.1-py3-none-any.whl (37 kB) -Collecting pycodestyle>=2.3.1 - Using cached pycodestyle-2.8.0-py2.py3-none-any.whl (42 kB) -Collecting mccabe>=0.5.2 - Using cached mccabe-0.6.1-py2.py3-none-any.whl (8.6 kB) -Collecting sphinxcontrib-jsmath - Using cached sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) -Collecting imagesize - Using cached imagesize-1.2.0-py2.py3-none-any.whl (4.8 kB) -Collecting alabaster<0.8,>=0.7 - Using cached alabaster-0.7.12-py2.py3-none-any.whl (14 kB) -Collecting sphinxcontrib-serializinghtml>=1.1.5 - Using cached sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB) -Collecting sphinxcontrib-devhelp - Using cached sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB) -Collecting sphinxcontrib-applehelp - Using cached sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB) -Collecting Pygments>=2.0 - Using cached Pygments-2.10.0-py3-none-any.whl (1.0 MB) -Collecting snowballstemmer>=1.1 - Using cached snowballstemmer-2.1.0-py2.py3-none-any.whl (93 kB) -Collecting sphinxcontrib-htmlhelp>=2.0.0 - Using cached sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB) -Collecting sphinxcontrib-qthelp - Using cached sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB) -Collecting babel>=1.3 - Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB) -Collecting Jinja2>=2.3 - Using cached Jinja2-3.0.2-py3-none-any.whl (133 kB) -Collecting traitlets - Using cached traitlets-5.1.1-py3-none-any.whl (102 kB) -Collecting nbconvert!=5.4 - Using cached nbconvert-6.2.0-py3-none-any.whl (553 kB) -Collecting nbformat - Using cached nbformat-5.1.3-py3-none-any.whl (178 kB) -Collecting beautifulsoup4 - Using cached beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) -Collecting debugpy<2.0,>=1.0.0 - Using cached debugpy-1.5.1-cp39-cp39-macosx_10_15_x86_64.whl (1.7 MB) -Collecting matplotlib-inline<0.2.0,>=0.1.0 - Using cached matplotlib_inline-0.1.3-py3-none-any.whl (8.2 kB) -Collecting appnope - Using cached appnope-0.1.2-py2.py3-none-any.whl (4.3 kB) -Collecting ipython-genutils - Using cached ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB) -Collecting tornado<7.0,>=4.2 - Using cached tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl (416 kB) -Collecting jupyter-client<8.0 - Using cached jupyter_client-7.0.6-py3-none-any.whl (125 kB) -Collecting ipython<8.0,>=7.23.1 - Using cached ipython-7.28.0-py3-none-any.whl (788 kB) -Collecting ipywidgets - Using cached ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB) -Collecting notebook - Using cached notebook-6.4.5-py3-none-any.whl (9.9 MB) -Collecting qtconsole - Using cached qtconsole-5.1.1-py3-none-any.whl (119 kB) -Collecting jupyter-console - Using cached jupyter_console-6.4.0-py3-none-any.whl (22 kB) -Collecting tomli - Using cached tomli-1.2.2-py3-none-any.whl (12 kB) -Collecting jedi>=0.16 - Using cached jedi-0.18.0-py2.py3-none-any.whl (1.4 MB) -Collecting pickleshare - Using cached pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB) -Collecting pexpect>4.3 - Using cached pexpect-4.8.0-py2.py3-none-any.whl (59 kB) -Collecting backcall - Using cached backcall-0.2.0-py2.py3-none-any.whl (11 kB) -Collecting decorator - Using cached decorator-5.1.0-py3-none-any.whl (9.1 kB) -Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 - Using cached prompt_toolkit-3.0.21-py3-none-any.whl (374 kB) -Collecting parso<0.9.0,>=0.8.0 - Using cached parso-0.8.2-py2.py3-none-any.whl (94 kB) -Collecting MarkupSafe>=2.0 - Using cached MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl (13 kB) -Collecting jupyter-core>=4.6.0 - Using cached jupyter_core-4.9.1-py3-none-any.whl (86 kB) -Collecting entrypoints - Using cached entrypoints-0.3-py2.py3-none-any.whl (11 kB) -Collecting pyzmq>=13 - Using cached pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl (2.0 MB) -Collecting nest-asyncio>=1.5 - Using cached nest_asyncio-1.5.1-py3-none-any.whl (5.0 kB) -Collecting pillow>=6.2.0 - Using cached Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl (3.0 MB) -Collecting pyparsing>=2.2.1 - Using cached pyparsing-3.0.3-py3-none-any.whl (96 kB) -Collecting kiwisolver>=1.0.1 - Using cached kiwisolver-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl (61 kB) -Collecting cycler>=0.10 - Using cached cycler-0.11.0-py3-none-any.whl (6.4 kB) -Collecting nbclient<0.6.0,>=0.5.0 - Using cached nbclient-0.5.4-py3-none-any.whl (66 kB) -Collecting pandocfilters>=1.4.1 - Using cached pandocfilters-1.5.0-py2.py3-none-any.whl (8.7 kB) -Collecting testpath - Using cached testpath-0.5.0-py3-none-any.whl (84 kB) -Collecting defusedxml - Using cached defusedxml-0.7.1-py2.py3-none-any.whl (25 kB) -Collecting jupyterlab-pygments - Using cached jupyterlab_pygments-0.1.2-py2.py3-none-any.whl (4.6 kB) -Collecting bleach - Using cached bleach-4.1.0-py2.py3-none-any.whl (157 kB) -Collecting mistune<2,>=0.8.1 - Using cached mistune-0.8.4-py2.py3-none-any.whl (16 kB) -Collecting jsonschema!=2.5.0,>=2.4 - Using cached jsonschema-4.1.2-py3-none-any.whl (69 kB) -Collecting pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 - Using cached pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl (68 kB) -Collecting ptyprocess>=0.5 - Using cached ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB) -Collecting wcwidth - Using cached wcwidth-0.2.5-py2.py3-none-any.whl (30 kB) -Collecting PyYAML - Using cached PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl (197 kB) -Collecting soupsieve>1.2 - Using cached soupsieve-2.2.1-py3-none-any.whl (33 kB) -Collecting webencodings - Using cached webencodings-0.5.1-py2.py3-none-any.whl (11 kB) -Collecting widgetsnbextension~=3.5.0 - Using cached widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB) -Collecting jupyterlab-widgets>=1.0.0 - Using cached jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB) -Collecting Send2Trash>=1.5.0 - Using cached Send2Trash-1.8.0-py3-none-any.whl (18 kB) -Collecting terminado>=0.8.3 - Using cached terminado-0.12.1-py3-none-any.whl (15 kB) -Collecting argon2-cffi - Using cached argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl (38 kB) -Collecting prometheus-client - Using cached prometheus_client-0.11.0-py2.py3-none-any.whl (56 kB) -Collecting cffi>=1.0.0 - Using cached cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl (178 kB) -Collecting pycparser - Using cached pycparser-2.20-py2.py3-none-any.whl (112 kB) -Collecting pyparsing>=2.2.1 - Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB) -Collecting qtpy - Using cached QtPy-1.11.2-py2.py3-none-any.whl (58 kB) -Building wheels for collected packages: scikit-learn - Building wheel for scikit-learn (PEP 517): started - Building wheel for scikit-learn (PEP 517): still running... - Building wheel for scikit-learn (PEP 517): still running... - Building wheel for scikit-learn (PEP 517): still running... - Building wheel for scikit-learn (PEP 517): finished with status 'done' - Created wheel for scikit-learn: filename=scikit_learn-0.23.1-cp39-cp39-macosx_11_0_x86_64.whl size=6939801 sha256=c030bd773bab77fd0c12cbcd325d334a1ee61b931fa3460e4f63518afa102ef8 - Stored in directory: /Users/cpoli/Library/Caches/pip/wheels/90/dc/33/9925b35a5a994256489b73bfb1672ee6ca87559dfdcc86226f -Successfully built scikit-learn -Installing collected packages: traitlets, six, pyrsistent, attrs, wcwidth, tornado, pyzmq, python-dateutil, pyparsing, ptyprocess, parso, nest-asyncio, jupyter-core, jsonschema, ipython-genutils, entrypoints, webencodings, Pygments, pycparser, prompt-toolkit, pickleshare, pexpect, packaging, nbformat, matplotlib-inline, MarkupSafe, jupyter-client, jedi, decorator, backcall, appnope, testpath, pandocfilters, nbclient, mistune, jupyterlab-pygments, Jinja2, ipython, defusedxml, debugpy, cffi, bleach, terminado, Send2Trash, prometheus-client, nbconvert, ipykernel, argon2-cffi, urllib3, pytz, notebook, idna, charset-normalizer, certifi, widgetsnbextension, tomli, toml, threadpoolctl, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, soupsieve, snowballstemmer, scipy, requests, qtpy, PyYAML, py, pluggy, pillow, kiwisolver, jupyterlab-widgets, joblib, iniconfig, imagesize, docutils, cycler, coverage, babel, alabaster, tqdm, sphinx, scikit-learn, qtconsole, pytest, pyflakes, pydocstyle, pycodestyle, pyarrow, pyaml, py4j, pandas, networkx, mccabe, matplotlib, jupyter-console, ipywidgets, future, cloudpickle, beautifulsoup4, xgboost, treelite-runtime, treelite, seaborn, scikit-optimize, pytest-cov, pyspark, pylama, pyDOE, pydata-sphinx-theme, numpydoc, nbsphinx, Lightgbm, koalas, jupyter, hyperopt, emcee, dill -Successfully installed Jinja2-3.0.2 Lightgbm-3.3.1 MarkupSafe-2.0.1 PyYAML-6.0 Pygments-2.10.0 Send2Trash-1.8.0 alabaster-0.7.12 appnope-0.1.2 argon2-cffi-21.1.0 attrs-21.2.0 babel-2.9.1 backcall-0.2.0 beautifulsoup4-4.10.0 bleach-4.1.0 certifi-2021.10.8 cffi-1.15.0 charset-normalizer-2.0.7 cloudpickle-2.0.0 coverage-6.0.2 cycler-0.11.0 debugpy-1.5.1 decorator-5.1.0 defusedxml-0.7.1 dill-0.3.4 docutils-0.16 emcee-3.1.1 entrypoints-0.3 future-0.18.2 hyperopt-0.2.5 idna-3.3 imagesize-1.2.0 iniconfig-1.1.1 ipykernel-6.4.2 ipython-7.28.0 ipython-genutils-0.2.0 ipywidgets-7.6.5 jedi-0.18.0 joblib-1.1.0 jsonschema-4.1.2 jupyter-1.0.0 jupyter-client-7.0.6 jupyter-console-6.4.0 jupyter-core-4.9.1 jupyterlab-pygments-0.1.2 jupyterlab-widgets-1.0.2 kiwisolver-1.3.2 koalas-1.8.2 matplotlib-3.4.3 matplotlib-inline-0.1.3 mccabe-0.6.1 mistune-0.8.4 nbclient-0.5.4 nbconvert-6.2.0 nbformat-5.1.3 nbsphinx-0.8.7 nest-asyncio-1.5.1 networkx-2.6.3 notebook-6.4.5 numpydoc-1.1.0 packaging-21.2 pandas-1.3.4 pandocfilters-1.5.0 parso-0.8.2 pexpect-4.8.0 pickleshare-0.7.5 pillow-8.4.0 pluggy-1.0.0 prometheus-client-0.11.0 prompt-toolkit-3.0.21 ptyprocess-0.7.0 py-1.10.0 py4j-0.10.9.2 pyDOE-0.3.8 pyaml-21.10.1 pyarrow-6.0.0 pycodestyle-2.8.0 pycparser-2.20 pydata-sphinx-theme-0.7.1 pydocstyle-6.1.1 pyflakes-2.4.0 pylama-7.7.1 pyparsing-2.4.7 pyrsistent-0.18.0 pyspark-3.2.0 pytest-6.2.5 pytest-cov-3.0.0 python-dateutil-2.8.2 pytz-2021.3 pyzmq-22.3.0 qtconsole-5.1.1 qtpy-1.11.2 requests-2.26.0 scikit-learn-0.23.1 scikit-optimize-0.9.0 scipy-1.7.1 seaborn-0.11.2 six-1.16.0 snowballstemmer-2.1.0 soupsieve-2.2.1 sphinx-4.2.0 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 terminado-0.12.1 testpath-0.5.0 threadpoolctl-3.0.0 toml-0.10.2 tomli-1.2.2 tornado-6.1 tqdm-4.62.3 traitlets-5.1.1 treelite-2.1.0 treelite-runtime-2.1.0 urllib3-1.26.7 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.5.2 xgboost-1.5.0 -WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available. -You should consider upgrading via the '/Users/cpoli/opensource/gators/.tox/py39/bin/python -m pip install --upgrade pip' command. diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..ec1bdd88 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.formatOnSave": true, + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "python.formatting.provider": "none" +} \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 409a2aad..69e9a09c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,4 @@ global-include *.pyx -global-include *.pxd global-exclude *.c -global-exclude .tox include requirements.txt global-include test_*.py diff --git a/README.md b/README.md index 0c00810f..f732df2f 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ ![PyPI](https://img.shields.io/pypi/v/gators) [![build](https://github.com/paypal/gators/actions/workflows/build.yml/badge.svg)](https://github.com/paypal/gators/actions/workflows/build.yml) [![codecov](https://codecov.io/gh/paypal/gators/branch/graph/badge.svg?token=vllGApc9v9)](https://codecov.io/gh/paypal/gators) +![Python Version](https://img.shields.io/badge/python-3.6%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-blue) ![GitHub](https://img.shields.io/github/license/paypal/gators) - [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/) diff --git a/act_result b/act_result new file mode 100644 index 00000000..0676e7a3 --- /dev/null +++ b/act_result @@ -0,0 +1,5392 @@ +[Build and Test/test ] 🧪 Matrix: map[os:ubuntu-latest python-version:3.9] +[Build and Test/test ] 🚀 Start image=catthehacker/ubuntu:act-latest +[Build and Test/test ] 🐳 docker run image=catthehacker/ubuntu:act-latest platform= entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[] +[Build and Test/test ] 🐳 docker exec cmd=[mkdir -m 0777 -p /var/run/act] user=root +[Build and Test/test ] 🐳 docker cp src=/Users/cpoli/opensource/gators/. dst=/Users/cpoli/opensource/gators +[Build and Test/test ] 🐳 docker exec cmd=[mkdir -p /Users/cpoli/opensource/gators] user= +[Build and Test/test ] ⭐ Run actions/checkout@v2 +[Build and Test/test ] ✅ Success - actions/checkout@v2 +[Build and Test/test ] ⭐ Run actions/setup-java@v1 +[Build and Test/test ] 🐳 docker cp src=/Users/cpoli/.cache/act/actions-setup-java@v1/ dst=/var/run/act/actions/actions-setup-java@v1/ +[Build and Test/test ] 🐳 docker exec cmd=[mkdir -p /var/run/act/actions/actions-setup-java@v1/] user= +[Build and Test/test ] 🐳 docker exec cmd=[node /var/run/act/actions/actions-setup-java@v1/dist/setup/index.js] user= +[Build and Test/test ] 💬 ::debug::isExplicit: +[Build and Test/test ] 💬 ::debug::explicit? false +[Build and Test/test ] 💬 ::debug::evaluating 0 versions +[Build and Test/test ] 💬 ::debug::match not found +[Build and Test/test ] 💬 ::debug::Downloading JDK from Azul +[Build and Test/test ] | (node:25) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification. +[Build and Test/test ] | (Use `node --trace-warnings ...` to show where the warning was created) +[Build and Test/test ] 💬 ::debug::Searching for files with extension: -linux_x64.tar.gz +[Build and Test/test ] 💬 ::debug::Downloading https://static.azul.com/zulu/bin/zulu8.60.0.21-ca-jdk8.0.322-linux_x64.tar.gz +[Build and Test/test ] 💬 ::debug::Downloading /tmp/7ed56a16-e7c7-4165-8697-bdb07e262555 +[Build and Test/test ] 💬 ::debug::download complete +[Build and Test/test ] | [command]/usr/bin/tar --version +[Build and Test/test ] | tar (GNU tar) 1.30 +[Build and Test/test ] | Copyright (C) 2017 Free Software Foundation, Inc. +[Build and Test/test ] | License GPLv3+: GNU GPL version 3 or later . +[Build and Test/test ] | This is free software: you are free to change and redistribute it. +[Build and Test/test ] | There is NO WARRANTY, to the extent permitted by law. +[Build and Test/test ] | +[Build and Test/test ] | Written by John Gilmore and Jay Fenlason. +[Build and Test/test ] | [command]/usr/bin/tar xz --warning=no-unknown-keyword -C /tmp/temp_1900062275 -f /tmp/7ed56a16-e7c7-4165-8697-bdb07e262555 +[Build and Test/test ] 💬 ::debug::jdk extracted to /tmp/temp_1900062275/zulu8.60.0.21-ca-jdk8.0.322-linux_x64 +[Build and Test/test ] 💬 ::debug::Caching tool jdk 8.0.322 x64 +[Build and Test/test ] 💬 ::debug::source dir: /tmp/temp_1900062275/zulu8.60.0.21-ca-jdk8.0.322-linux_x64 +[Build and Test/test ] 💬 ::debug::destination /opt/hostedtoolcache/jdk/8.0.322/x64 +[Build and Test/test ] 💬 ::debug::finished caching tool +[Build and Test/test ] ⚙ ::set-output:: path=/opt/hostedtoolcache/jdk/8.0.322/x64 +[Build and Test/test ] ⚙ ::set-output:: version=8.0.322 +[Build and Test/test ] ❓ ##[add-matcher]/run/act/actions/actions-setup-java@v1/.github/java.json +[Build and Test/test ] | creating settings.xml with server-id: github; environment variables: username=$GITHUB_ACTOR, password=$GITHUB_TOKEN, and gpg-passphrase=null +[Build and Test/test ] 💬 ::debug::created directory /root/.m2 +[Build and Test/test ] | writing /root/.m2/settings.xml +[Build and Test/test ] ✅ Success - actions/setup-java@v1 +[Build and Test/test ] ⭐ Run Set up Python ${{ matrix.python-version }} +[Build and Test/test ] 🐳 docker cp src=/Users/cpoli/.cache/act/actions-setup-python@v2/ dst=/var/run/act/actions/actions-setup-python@v2/ +[Build and Test/test ] 🐳 docker exec cmd=[mkdir -p /var/run/act/actions/actions-setup-python@v2/] user= +[Build and Test/test ] 🐳 docker exec cmd=[node /var/run/act/actions/actions-setup-python@v2/dist/setup/index.js] user= +[Build and Test/test ] 💬 ::debug::Semantic version spec of 3.9 is 3.9 +[Build and Test/test ] 💬 ::debug::isExplicit: +[Build and Test/test ] 💬 ::debug::explicit? false +[Build and Test/test ] 💬 ::debug::evaluating 0 versions +[Build and Test/test ] 💬 ::debug::match not found +[Build and Test/test ] | Version 3.9 was not found in the local cache +[Build and Test/test ] | (node:50) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification. +[Build and Test/test ] | (Use `node --trace-warnings ...` to show where the warning was created) +[Build and Test/test ] 💬 ::debug::check 3.11.0-alpha.4 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.11.0-alpha.3 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.11.0-alpha.2 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.11.0-alpha.1 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.2 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.1 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-rc.2 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-rc.1 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-beta.4 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-beta.3 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-beta.2 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-beta.1 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.7 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.6 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.5 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.4 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.3 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.2 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.10.0-alpha.1 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::check 3.9.10 satisfies 3.9 +[Build and Test/test ] 💬 ::debug::x64===x64 && darwin===linux +[Build and Test/test ] 💬 ::debug::x64===x64 && linux===linux +[Build and Test/test ] 💬 ::debug::x64===x64 && linux===linux +[Build and Test/test ] 💬 ::debug::matched 3.9.10 +[Build and Test/test ] | Version 3.9 is available for downloading +[Build and Test/test ] | Download from "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-linux-20.04-x64.tar.gz" +[Build and Test/test ] 💬 ::debug::Downloading https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-linux-20.04-x64.tar.gz +[Build and Test/test ] 💬 ::debug::Destination /tmp/7733d72b-00ac-4159-9168-a981751f5f31 +[Build and Test/test ] 💬 ::debug::download complete +[Build and Test/test ] | Extract downloaded archive +[Build and Test/test ] 💬 ::debug::Checking tar --version +[Build and Test/test ] 💬 ::debug::tar (GNU tar) 1.30%0ACopyright (C) 2017 Free Software Foundation, Inc.%0ALicense GPLv3+: GNU GPL version 3 or later .%0AThis is free software: you are free to change and redistribute it.%0AThere is NO WARRANTY, to the extent permitted by law.%0A%0AWritten by John Gilmore and Jay Fenlason. +[Build and Test/test ] | [command]/usr/bin/tar xz --warning=no-unknown-keyword -C /tmp/0e855ee3-5e37-4e38-b7ad-701eece80d54 -f /tmp/7733d72b-00ac-4159-9168-a981751f5f31 +[Build and Test/test ] | Execute installation script +[Build and Test/test ] | Check if Python hostedtoolcache folder exist... +[Build and Test/test ] | Creating Python hostedtoolcache folder... +[Build and Test/test ] | Create Python 3.9.10 folder +[Build and Test/test ] | Copy Python binaries to hostedtoolcache folder +[Build and Test/test ] | Create additional symlinks (Required for the UsePythonVersion Azure Pipelines task and the setup-python GitHub Action) +[Build and Test/test ] | Upgrading pip... +[Build and Test/test ] | Looking in links: /tmp/tmpzdt20snh +[Build and Test/test ] | Requirement already satisfied: setuptools in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (58.1.0) +[Build and Test/test ] | Requirement already satisfied: pip in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (21.2.4) +[Build and Test/test ] ❗ ::error::WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +[Build and Test/test ] | Collecting pip +[Build and Test/test ] | Downloading pip-22.0.3-py3-none-any.whl (2.1 MB) +[Build and Test/test ] | Installing collected packages: pip +[Build and Test/test ] | Successfully installed pip-22.0.3 +[Build and Test/test ] ❗ ::error::WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +[Build and Test/test ] | Create complete file +[Build and Test/test ] 💬 ::debug::isExplicit: +[Build and Test/test ] 💬 ::debug::explicit? false +[Build and Test/test ] 💬 ::debug::isExplicit: 3.9.10 +[Build and Test/test ] 💬 ::debug::explicit? true +[Build and Test/test ] 💬 ::debug::evaluating 1 versions +[Build and Test/test ] 💬 ::debug::matched: 3.9.10 +[Build and Test/test ] 💬 ::debug::checking cache: /opt/hostedtoolcache/Python/3.9.10/x64 +[Build and Test/test ] 💬 ::debug::Found tool in cache Python 3.9.10 x64 +[Build and Test/test ] ⚙ ::set-output:: python-version=3.9.10 +[Build and Test/test ] | Successfully setup CPython (3.9.10) +[Build and Test/test ] ❓ ##[add-matcher]/run/act/actions/actions-setup-python@v2/.github/python.json +[Build and Test/test ] ✅ Success - Set up Python ${{ matrix.python-version }} +[Build and Test/test ] ⭐ Run Install libomp +[Build and Test/test ] 🐳 docker exec cmd=[bash --noprofile --norc -e -o pipefail /Users/cpoli/opensource/gators/workflow/3.sh] user= +[Build and Test/test ] ✅ Success - Install libomp +[Build and Test/test ] ⭐ Run install dependencies +[Build and Test/test ] 🐳 docker exec cmd=[bash --noprofile --norc -e -o pipefail /Users/cpoli/opensource/gators/workflow/4] user= +[Build and Test/test ] | Requirement already satisfied: pip in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (22.0.3) +[Build and Test/test ] | WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +[Build and Test/test ] | Collecting certifi +[Build and Test/test ] | Downloading certifi-2021.10.8-py2.py3-none-any.whl (149 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 149.2/149.2 KB 2.4 MB/s eta 0:00:00 +[Build and Test/test ] | Installing collected packages: certifi +[Build and Test/test ] | Successfully installed certifi-2021.10.8 +[Build and Test/test ] | WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +[Build and Test/test ] | Collecting tox +[Build and Test/test ] | Downloading tox-3.24.5-py2.py3-none-any.whl (85 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.6/85.6 KB 2.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting tox-wheel +[Build and Test/test ] | Downloading tox_wheel-0.7.0-py2.py3-none-any.whl (6.3 kB) +[Build and Test/test ] | Collecting tox-gh-actions +[Build and Test/test ] | Downloading tox_gh_actions-2.9.1-py2.py3-none-any.whl (10 kB) +[Build and Test/test ] | Collecting six>=1.14.0 +[Build and Test/test ] | Downloading six-1.16.0-py2.py3-none-any.whl (11 kB) +[Build and Test/test ] | Collecting filelock>=3.0.0 +[Build and Test/test ] | Downloading filelock-3.4.2-py3-none-any.whl (9.9 kB) +[Build and Test/test ] | Collecting packaging>=14 +[Build and Test/test ] | Downloading packaging-21.3-py3-none-any.whl (40 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.8/40.8 KB 5.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pluggy>=0.12.0 +[Build and Test/test ] | Downloading pluggy-1.0.0-py2.py3-none-any.whl (13 kB) +[Build and Test/test ] | Collecting virtualenv!=20.0.0,!=20.0.1,!=20.0.2,!=20.0.3,!=20.0.4,!=20.0.5,!=20.0.6,!=20.0.7,>=16.0.0 +[Build and Test/test ] | Downloading virtualenv-20.13.0-py2.py3-none-any.whl (6.5 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 4.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting py>=1.4.17 +[Build and Test/test ] | Downloading py-1.11.0-py2.py3-none-any.whl (98 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.7/98.7 KB 5.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting toml>=0.9.4 +[Build and Test/test ] | Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB) +[Build and Test/test ] | Collecting wheel>=0.33.1 +[Build and Test/test ] | Downloading wheel-0.37.1-py2.py3-none-any.whl (35 kB) +[Build and Test/test ] | Collecting importlib-resources +[Build and Test/test ] | Downloading importlib_resources-5.4.0-py3-none-any.whl (28 kB) +[Build and Test/test ] | Collecting pyparsing!=3.0.5,>=2.0.2 +[Build and Test/test ] | Downloading pyparsing-3.0.7-py3-none-any.whl (98 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.0/98.0 KB 4.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting distlib<1,>=0.3.1 +[Build and Test/test ] | Downloading distlib-0.3.4-py2.py3-none-any.whl (461 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 461.2/461.2 KB 4.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting platformdirs<3,>=2 +[Build and Test/test ] | Downloading platformdirs-2.4.1-py3-none-any.whl (14 kB) +[Build and Test/test ] | Collecting zipp>=3.1.0 +[Build and Test/test ] | Downloading zipp-3.7.0-py3-none-any.whl (5.3 kB) +[Build and Test/test ] | Installing collected packages: distlib, zipp, wheel, toml, six, pyparsing, py, pluggy, platformdirs, filelock, virtualenv, packaging, importlib-resources, tox, tox-wheel, tox-gh-actions +[Build and Test/test ] | Successfully installed distlib-0.3.4 filelock-3.4.2 importlib-resources-5.4.0 packaging-21.3 platformdirs-2.4.1 pluggy-1.0.0 py-1.11.0 pyparsing-3.0.7 six-1.16.0 toml-0.10.2 tox-3.24.5 tox-gh-actions-2.9.1 tox-wheel-0.7.0 virtualenv-20.13.0 wheel-0.37.1 zipp-3.7.0 +[Build and Test/test ] | WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +[Build and Test/test ] | Requirement already satisfied: wheel in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from -r requirements_tox.txt (line 1)) (0.37.1) +[Build and Test/test ] | Collecting numpy +[Build and Test/test ] | Downloading numpy-1.22.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.8 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.8/16.8 MB 4.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting Cython +[Build and Test/test ] | Downloading Cython-0.29.27-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (1.9 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 4.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting scipy +[Build and Test/test ] | Downloading scipy-1.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (39.8 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 39.8/39.8 MB 4.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting dill +[Build and Test/test ] | Downloading dill-0.3.4-py2.py3-none-any.whl (86 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 86.9/86.9 KB 3.1 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting scikit-learn +[Build and Test/test ] | Downloading scikit_learn-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.4 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.4/26.4 MB 4.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting seaborn +[Build and Test/test ] | Downloading seaborn-0.11.2-py3-none-any.whl (292 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 292.8/292.8 KB 4.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pandas +[Build and Test/test ] | Downloading pandas-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.7 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.7/11.7 MB 4.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting treelite>=0.93 +[Build and Test/test ] | Downloading treelite-2.2.2-py3-none-manylinux2014_x86_64.whl (781 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 781.2/781.2 KB 4.5 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting treelite-runtime>=0.93 +[Build and Test/test ] | Downloading treelite_runtime-2.2.2-py3-none-manylinux2014_x86_64.whl (124 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 124.0/124.0 KB 5.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting docutils==0.16.0 +[Build and Test/test ] | Downloading docutils-0.16-py2.py3-none-any.whl (548 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 548.2/548.2 KB 4.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pytest-cov +[Build and Test/test ] | Downloading pytest_cov-3.0.0-py3-none-any.whl (20 kB) +[Build and Test/test ] | Collecting coverage +[Build and Test/test ] | Downloading coverage-6.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (210 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 210.1/210.1 KB 5.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pylama>=7.6.5 +[Build and Test/test ] | Downloading pylama-8.3.7-py3-none-any.whl (32 kB) +[Build and Test/test ] | Collecting ipykernel +[Build and Test/test ] | Downloading ipykernel-6.8.0-py3-none-any.whl (128 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 128.3/128.3 KB 4.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting jupyter +[Build and Test/test ] | Downloading jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB) +[Build and Test/test ] | Collecting numpydoc +[Build and Test/test ] | Downloading numpydoc-1.2-py3-none-any.whl (51 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 51.1/51.1 KB 4.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinx==3.3.0 +[Build and Test/test ] | Downloading Sphinx-3.3.0-py3-none-any.whl (2.9 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.9/2.9 MB 4.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting nbsphinx>=0.8.0 +[Build and Test/test ] | Downloading nbsphinx-0.8.8-py3-none-any.whl (25 kB) +[Build and Test/test ] | Collecting pydata_sphinx_theme +[Build and Test/test ] | Downloading pydata_sphinx_theme-0.8.0-py3-none-any.whl (3.3 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 4.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pandoc +[Build and Test/test ] | Downloading pandoc-2.0.1.tar.gz (29 kB) +[Build and Test/test ] | Preparing metadata (setup.py): started +[Build and Test/test ] | Preparing metadata (setup.py): finished with status 'done' +[Build and Test/test ] | Requirement already satisfied: tox in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from -r requirements_tox.txt (line 23)) (3.24.5) +[Build and Test/test ] | Requirement already satisfied: tox-wheel in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from -r requirements_tox.txt (line 24)) (0.7.0) +[Build and Test/test ] | Collecting black +[Build and Test/test ] | Downloading black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB 4.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting isort +[Build and Test/test ] | Downloading isort-5.10.1-py3-none-any.whl (103 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.4/103.4 KB 5.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pyspark +[Build and Test/test ] | Downloading pyspark-3.2.1.tar.gz (281.4 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 281.4/281.4 MB 4.9 MB/s eta 0:00:00 +[Build and Test/test ] | Preparing metadata (setup.py): started +[Build and Test/test ] | Preparing metadata (setup.py): finished with status 'done' +[Build and Test/test ] | Collecting koalas +[Build and Test/test ] | Downloading koalas-1.8.2-py3-none-any.whl (390 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 390.8/390.8 KB 6.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting distributed +[Build and Test/test ] | Downloading distributed-2022.1.1-py3-none-any.whl (830 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 830.7/830.7 KB 6.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting dask +[Build and Test/test ] | Downloading dask-2022.1.1-py3-none-any.whl (1.1 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 7.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting Pygments>=2.0 +[Build and Test/test ] | Downloading Pygments-2.11.2-py3-none-any.whl (1.1 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 5.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting babel>=1.3 +[Build and Test/test ] | Downloading Babel-2.9.1-py2.py3-none-any.whl (8.8 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.8/8.8 MB 6.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinxcontrib-devhelp +[Build and Test/test ] | Downloading sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 84.7/84.7 KB 8.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinxcontrib-htmlhelp +[Build and Test/test ] | Downloading sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.5/100.5 KB 7.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinxcontrib-jsmath +[Build and Test/test ] | Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) +[Build and Test/test ] | Collecting requests>=2.5.0 +[Build and Test/test ] | Downloading requests-2.27.1-py2.py3-none-any.whl (63 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.1/63.1 KB 7.0 MB/s eta 0:00:00 +[Build and Test/test ] | Requirement already satisfied: packaging in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from sphinx==3.3.0->-r requirements_tox.txt (line 19)) (21.3) +[Build and Test/test ] | Collecting imagesize +[Build and Test/test ] | Downloading imagesize-1.3.0-py2.py3-none-any.whl (5.2 kB) +[Build and Test/test ] | Collecting alabaster<0.8,>=0.7 +[Build and Test/test ] | Downloading alabaster-0.7.12-py2.py3-none-any.whl (14 kB) +[Build and Test/test ] | Collecting Jinja2>=2.3 +[Build and Test/test ] | Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.6/133.6 KB 7.3 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinxcontrib-serializinghtml +[Build and Test/test ] | Downloading sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 94.0/94.0 KB 6.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinxcontrib-applehelp +[Build and Test/test ] | Downloading sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.2/121.2 KB 6.5 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sphinxcontrib-qthelp +[Build and Test/test ] | Downloading sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.6/90.6 KB 9.1 MB/s eta 0:00:00 +[Build and Test/test ] | Requirement already satisfied: setuptools in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from sphinx==3.3.0->-r requirements_tox.txt (line 19)) (58.1.0) +[Build and Test/test ] | Collecting snowballstemmer>=1.1 +[Build and Test/test ] | Downloading snowballstemmer-2.2.0-py2.py3-none-any.whl (93 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 93.0/93.0 KB 10.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting threadpoolctl>=2.0.0 +[Build and Test/test ] | Downloading threadpoolctl-3.1.0-py3-none-any.whl (14 kB) +[Build and Test/test ] | Collecting joblib>=0.11 +[Build and Test/test ] | Downloading joblib-1.1.0-py2.py3-none-any.whl (306 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 307.0/307.0 KB 7.3 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting matplotlib>=2.2 +[Build and Test/test ] | Downloading matplotlib-3.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (11.2 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.2/11.2 MB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting python-dateutil>=2.8.1 +[Build and Test/test ] | Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 247.7/247.7 KB 7.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pytz>=2020.1 +[Build and Test/test ] | Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 503.5/503.5 KB 7.1 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pytest>=4.6 +[Build and Test/test ] | Downloading pytest-6.2.5-py3-none-any.whl (280 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 280.7/280.7 KB 7.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pycodestyle>=2.8.0 +[Build and Test/test ] | Downloading pycodestyle-2.8.0-py2.py3-none-any.whl (42 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.1/42.1 KB 6.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting mccabe>=0.6.1 +[Build and Test/test ] | Downloading mccabe-0.7.0-py2.py3-none-any.whl (7.3 kB) +[Build and Test/test ] | Collecting pyflakes>=2.4.0 +[Build and Test/test ] | Downloading pyflakes-2.4.0-py2.py3-none-any.whl (69 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 69.7/69.7 KB 6.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pydocstyle>=6.1.1 +[Build and Test/test ] | Downloading pydocstyle-6.1.1-py3-none-any.whl (37 kB) +[Build and Test/test ] | Collecting traitlets<6.0,>=5.1.0 +[Build and Test/test ] | Downloading traitlets-5.1.1-py3-none-any.whl (102 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 102.0/102.0 KB 6.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting matplotlib-inline<0.2.0,>=0.1.0 +[Build and Test/test ] | Downloading matplotlib_inline-0.1.3-py3-none-any.whl (8.2 kB) +[Build and Test/test ] | Collecting debugpy<2.0,>=1.0.0 +[Build and Test/test ] | Downloading debugpy-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.9 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 7.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting jupyter-client<8.0 +[Build and Test/test ] | Downloading jupyter_client-7.1.2-py3-none-any.whl (130 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 130.3/130.3 KB 4.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting tornado<7.0,>=4.2 +[Build and Test/test ] | Downloading tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl (427 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 427.2/427.2 KB 7.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting ipython>=7.23.1 +[Build and Test/test ] | Downloading ipython-8.0.1-py3-none-any.whl (747 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 747.5/747.5 KB 7.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting nest-asyncio +[Build and Test/test ] | Downloading nest_asyncio-1.5.4-py3-none-any.whl (5.1 kB) +[Build and Test/test ] | Collecting jupyter-console +[Build and Test/test ] | Downloading jupyter_console-6.4.0-py3-none-any.whl (22 kB) +[Build and Test/test ] | Collecting nbconvert +[Build and Test/test ] | Downloading nbconvert-6.4.1-py3-none-any.whl (557 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 557.4/557.4 KB 7.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting qtconsole +[Build and Test/test ] | Downloading qtconsole-5.2.2-py3-none-any.whl (120 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 120.2/120.2 KB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting notebook +[Build and Test/test ] | Downloading notebook-6.4.8-py3-none-any.whl (9.9 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.9/9.9 MB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting ipywidgets +[Build and Test/test ] | Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.8/121.8 KB 12.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting nbformat +[Build and Test/test ] | Downloading nbformat-5.1.3-py3-none-any.whl (178 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 178.9/178.9 KB 7.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting beautifulsoup4 +[Build and Test/test ] | Downloading beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 97.4/97.4 KB 7.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting plumbum +[Build and Test/test ] | Downloading plumbum-1.7.2-py2.py3-none-any.whl (117 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 117.8/117.8 KB 7.3 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting ply +[Build and Test/test ] | Downloading ply-3.11-py2.py3-none-any.whl (49 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 49.6/49.6 KB 7.1 MB/s eta 0:00:00 +[Build and Test/test ] | Requirement already satisfied: filelock>=3.0.0 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from tox->-r requirements_tox.txt (line 23)) (3.4.2) +[Build and Test/test ] | Requirement already satisfied: six>=1.14.0 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from tox->-r requirements_tox.txt (line 23)) (1.16.0) +[Build and Test/test ] | Requirement already satisfied: virtualenv!=20.0.0,!=20.0.1,!=20.0.2,!=20.0.3,!=20.0.4,!=20.0.5,!=20.0.6,!=20.0.7,>=16.0.0 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from tox->-r requirements_tox.txt (line 23)) (20.13.0) +[Build and Test/test ] | Requirement already satisfied: toml>=0.9.4 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from tox->-r requirements_tox.txt (line 23)) (0.10.2) +[Build and Test/test ] | Requirement already satisfied: pluggy>=0.12.0 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from tox->-r requirements_tox.txt (line 23)) (1.0.0) +[Build and Test/test ] | Requirement already satisfied: py>=1.4.17 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from tox->-r requirements_tox.txt (line 23)) (1.11.0) +[Build and Test/test ] | Collecting typing-extensions>=3.10.0.0 +[Build and Test/test ] | Downloading typing_extensions-4.0.1-py3-none-any.whl (22 kB) +[Build and Test/test ] | Requirement already satisfied: platformdirs>=2 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from black->-r requirements_tox.txt (line 25)) (2.4.1) +[Build and Test/test ] | Collecting tomli>=1.1.0 +[Build and Test/test ] | Downloading tomli-2.0.0-py3-none-any.whl (12 kB) +[Build and Test/test ] | Collecting mypy-extensions>=0.4.3 +[Build and Test/test ] | Downloading mypy_extensions-0.4.3-py2.py3-none-any.whl (4.5 kB) +[Build and Test/test ] | Collecting pathspec>=0.9.0 +[Build and Test/test ] | Downloading pathspec-0.9.0-py2.py3-none-any.whl (31 kB) +[Build and Test/test ] | Collecting click>=8.0.0 +[Build and Test/test ] | Downloading click-8.0.3-py3-none-any.whl (97 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 97.5/97.5 KB 7.1 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting py4j==0.10.9.3 +[Build and Test/test ] | Downloading py4j-0.10.9.3-py2.py3-none-any.whl (198 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 199.0/199.0 KB 7.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pyarrow>=0.10 +[Build and Test/test ] | Downloading pyarrow-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.7 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.7/26.7 MB 7.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting msgpack>=0.6.0 +[Build and Test/test ] | Downloading msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (322 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 322.2/322.2 KB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting zict>=0.1.3 +[Build and Test/test ] | Downloading zict-2.0.0-py3-none-any.whl (10 kB) +[Build and Test/test ] | Collecting toolz>=0.8.2 +[Build and Test/test ] | Downloading toolz-0.11.2-py3-none-any.whl (55 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 55.8/55.8 KB 6.3 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting psutil>=5.0 +[Build and Test/test ] | Downloading psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (280 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 280.4/280.4 KB 7.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting sortedcontainers!=2.0.0,!=2.0.1 +[Build and Test/test ] | Downloading sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB) +[Build and Test/test ] | Collecting cloudpickle>=1.5.0 +[Build and Test/test ] | Downloading cloudpickle-2.0.0-py3-none-any.whl (25 kB) +[Build and Test/test ] | Collecting tblib>=1.6.0 +[Build and Test/test ] | Downloading tblib-1.7.0-py2.py3-none-any.whl (12 kB) +[Build and Test/test ] | Collecting pyyaml +[Build and Test/test ] | Downloading PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (661 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 661.8/661.8 KB 6.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting partd>=0.3.10 +[Build and Test/test ] | Downloading partd-1.2.0-py3-none-any.whl (19 kB) +[Build and Test/test ] | Collecting fsspec>=0.6.0 +[Build and Test/test ] | Downloading fsspec-2022.1.0-py3-none-any.whl (133 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.2/133.2 KB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 +[Build and Test/test ] | Downloading prompt_toolkit-3.0.26-py3-none-any.whl (375 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 375.7/375.7 KB 7.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting backcall +[Build and Test/test ] | Downloading backcall-0.2.0-py2.py3-none-any.whl (11 kB) +[Build and Test/test ] | Collecting pexpect>4.3 +[Build and Test/test ] | Downloading pexpect-4.8.0-py2.py3-none-any.whl (59 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 59.0/59.0 KB 7.1 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting stack-data +[Build and Test/test ] | Downloading stack_data-0.1.4-py3-none-any.whl (20 kB) +[Build and Test/test ] | Collecting pickleshare +[Build and Test/test ] | Downloading pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB) +[Build and Test/test ] | Collecting decorator +[Build and Test/test ] | Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB) +[Build and Test/test ] | Collecting jedi>=0.16 +[Build and Test/test ] | Downloading jedi-0.18.1-py2.py3-none-any.whl (1.6 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 7.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting MarkupSafe>=2.0 +[Build and Test/test ] | Downloading MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (30 kB) +[Build and Test/test ] | Collecting jupyter-core>=4.6.0 +[Build and Test/test ] | Downloading jupyter_core-4.9.1-py3-none-any.whl (86 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 86.7/86.7 KB 4.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting entrypoints +[Build and Test/test ] | Downloading entrypoints-0.4-py3-none-any.whl (5.3 kB) +[Build and Test/test ] | Collecting pyzmq>=13 +[Build and Test/test ] | Downloading pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.1 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 7.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting fonttools>=4.22.0 +[Build and Test/test ] | Downloading fonttools-4.29.1-py3-none-any.whl (895 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 895.5/895.5 KB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Requirement already satisfied: pyparsing>=2.2.1 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from matplotlib>=2.2->seaborn->-r requirements_tox.txt (line 8)) (3.0.7) +[Build and Test/test ] | Collecting cycler>=0.10 +[Build and Test/test ] | Downloading cycler-0.11.0-py3-none-any.whl (6.4 kB) +[Build and Test/test ] | Collecting pillow>=6.2.0 +[Build and Test/test ] | Downloading Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3/4.3 MB 8.2 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting kiwisolver>=1.0.1 +[Build and Test/test ] | Downloading kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.6 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 6.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting jupyterlab-pygments +[Build and Test/test ] | Downloading jupyterlab_pygments-0.1.2-py2.py3-none-any.whl (4.6 kB) +[Build and Test/test ] | Collecting mistune<2,>=0.8.1 +[Build and Test/test ] | Downloading mistune-0.8.4-py2.py3-none-any.whl (16 kB) +[Build and Test/test ] | Collecting bleach +[Build and Test/test ] | Downloading bleach-4.1.0-py2.py3-none-any.whl (157 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 157.9/157.9 KB 6.5 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pandocfilters>=1.4.1 +[Build and Test/test ] | Downloading pandocfilters-1.5.0-py2.py3-none-any.whl (8.7 kB) +[Build and Test/test ] | Collecting testpath +[Build and Test/test ] | Downloading testpath-0.5.0-py3-none-any.whl (84 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 84.9/84.9 KB 6.4 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting nbclient<0.6.0,>=0.5.0 +[Build and Test/test ] | Downloading nbclient-0.5.10-py3-none-any.whl (69 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 69.9/69.9 KB 5.8 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting defusedxml +[Build and Test/test ] | Downloading defusedxml-0.7.1-py2.py3-none-any.whl (25 kB) +[Build and Test/test ] | Collecting ipython-genutils +[Build and Test/test ] | Downloading ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB) +[Build and Test/test ] | Collecting jsonschema!=2.5.0,>=2.4 +[Build and Test/test ] | Downloading jsonschema-4.4.0-py3-none-any.whl (72 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 72.7/72.7 KB 5.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting locket +[Build and Test/test ] | Downloading locket-0.2.1-py2.py3-none-any.whl (4.1 kB) +[Build and Test/test ] | Collecting attrs>=19.2.0 +[Build and Test/test ] | Downloading attrs-21.4.0-py2.py3-none-any.whl (60 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 60.6/60.6 KB 6.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting iniconfig +[Build and Test/test ] | Downloading iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB) +[Build and Test/test ] | Collecting idna<4,>=2.5 +[Build and Test/test ] | Downloading idna-3.3-py3-none-any.whl (61 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 KB 7.0 MB/s eta 0:00:00 +[Build and Test/test ] | Requirement already satisfied: certifi>=2017.4.17 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from requests>=2.5.0->sphinx==3.3.0->-r requirements_tox.txt (line 19)) (2021.10.8) +[Build and Test/test ] | Collecting charset-normalizer~=2.0.0 +[Build and Test/test ] | Downloading charset_normalizer-2.0.11-py3-none-any.whl (39 kB) +[Build and Test/test ] | Collecting urllib3<1.27,>=1.21.1 +[Build and Test/test ] | Downloading urllib3-1.26.8-py2.py3-none-any.whl (138 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 138.7/138.7 KB 7.0 MB/s eta 0:00:00 +[Build and Test/test ] | Requirement already satisfied: distlib<1,>=0.3.1 in /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages (from virtualenv!=20.0.0,!=20.0.1,!=20.0.2,!=20.0.3,!=20.0.4,!=20.0.5,!=20.0.6,!=20.0.7,>=16.0.0->tox->-r requirements_tox.txt (line 23)) (0.3.4) +[Build and Test/test ] | Collecting heapdict +[Build and Test/test ] | Downloading HeapDict-1.0.1-py3-none-any.whl (3.9 kB) +[Build and Test/test ] | Collecting soupsieve>1.2 +[Build and Test/test ] | Downloading soupsieve-2.3.1-py3-none-any.whl (37 kB) +[Build and Test/test ] | Collecting widgetsnbextension~=3.5.0 +[Build and Test/test ] | Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 7.9 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting jupyterlab-widgets>=1.0.0 +[Build and Test/test ] | Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 243.4/243.4 KB 12.7 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting terminado>=0.8.3 +[Build and Test/test ] | Downloading terminado-0.13.1-py3-none-any.whl (14 kB) +[Build and Test/test ] | Collecting prometheus-client +[Build and Test/test ] | Downloading prometheus_client-0.13.1-py3-none-any.whl (57 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.1/57.1 KB 6.3 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting argon2-cffi +[Build and Test/test ] | Downloading argon2_cffi-21.3.0-py3-none-any.whl (14 kB) +[Build and Test/test ] | Collecting Send2Trash>=1.8.0 +[Build and Test/test ] | Downloading Send2Trash-1.8.0-py3-none-any.whl (18 kB) +[Build and Test/test ] | Collecting qtpy +[Build and Test/test ] | Downloading QtPy-2.0.1-py3-none-any.whl (65 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.7/65.7 KB 6.5 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting parso<0.9.0,>=0.8.0 +[Build and Test/test ] | Downloading parso-0.8.3-py2.py3-none-any.whl (100 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.8/100.8 KB 7.3 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 +[Build and Test/test ] | Downloading pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (115 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 115.6/115.6 KB 6.5 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting ptyprocess>=0.5 +[Build and Test/test ] | Downloading ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB) +[Build and Test/test ] | Collecting wcwidth +[Build and Test/test ] | Downloading wcwidth-0.2.5-py2.py3-none-any.whl (30 kB) +[Build and Test/test ] | Collecting argon2-cffi-bindings +[Build and Test/test ] | Downloading argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (86 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 86.2/86.2 KB 5.0 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting webencodings +[Build and Test/test ] | Downloading webencodings-0.5.1-py2.py3-none-any.whl (11 kB) +[Build and Test/test ] | Collecting pure-eval +[Build and Test/test ] | Downloading pure_eval-0.2.2-py3-none-any.whl (11 kB) +[Build and Test/test ] | Collecting executing +[Build and Test/test ] | Downloading executing-0.8.2-py2.py3-none-any.whl (16 kB) +[Build and Test/test ] | Collecting asttokens +[Build and Test/test ] | Downloading asttokens-2.0.5-py2.py3-none-any.whl (20 kB) +[Build and Test/test ] | Collecting cffi>=1.0.1 +[Build and Test/test ] | Downloading cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (444 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 444.3/444.3 KB 7.6 MB/s eta 0:00:00 +[Build and Test/test ] | Collecting pycparser +[Build and Test/test ] | Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB) +[Build and Test/test ] | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 118.7/118.7 KB 6.2 MB/s eta 0:00:00 +[Build and Test/test ] | Building wheels for collected packages: pandoc, pyspark +[Build and Test/test ] | Building wheel for pandoc (setup.py): started +[Build and Test/test ] | Building wheel for pandoc (setup.py): finished with status 'done' +[Build and Test/test ] | Created wheel for pandoc: filename=pandoc-2.0.1-py3-none-any.whl size=29579 sha256=5f8df31c7ec778762bff3fcdb4f42824b83c22bff0d95640bc1a40537a9af6d8 +[Build and Test/test ] | Stored in directory: /root/.cache/pip/wheels/2c/e3/89/89ab2e7b2c48753cd84f54c13dce591468b3dff770cc03d672 +[Build and Test/test ] | Building wheel for pyspark (setup.py): started +[Build and Test/test ] | Building wheel for pyspark (setup.py): finished with status 'done' +[Build and Test/test ] | Created wheel for pyspark: filename=pyspark-3.2.1-py2.py3-none-any.whl size=281853642 sha256=930397eb35d163f7093f9dfbf56d0546baf1e98b61801c0307b13b6c8688a232 +[Build and Test/test ] | Stored in directory: /root/.cache/pip/wheels/52/45/50/69db7b6e1da74a1b9fcc097827db9185cb8627117de852731e +[Build and Test/test ] | Successfully built pandoc pyspark +[Build and Test/test ] | Installing collected packages: webencodings, wcwidth, sortedcontainers, snowballstemmer, Send2Trash, pytz, py4j, pure-eval, ptyprocess, ply, pickleshare, mypy-extensions, msgpack, mistune, ipython-genutils, iniconfig, heapdict, executing, backcall, alabaster, zict, urllib3, typing-extensions, traitlets, tornado, toolz, tomli, threadpoolctl, testpath, tblib, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, soupsieve, pyzmq, pyyaml, python-dateutil, pyspark, pyrsistent, Pygments, pyflakes, pydocstyle, pycparser, pycodestyle, psutil, prompt-toolkit, prometheus-client, plumbum, pillow, pexpect, pathspec, parso, pandocfilters, numpy, nest-asyncio, mccabe, MarkupSafe, locket, kiwisolver, jupyterlab-widgets, joblib, isort, imagesize, idna, fsspec, fonttools, entrypoints, docutils, dill, defusedxml, decorator, debugpy, Cython, cycler, coverage, cloudpickle, click, charset-normalizer, babel, attrs, asttokens, terminado, stack-data, scipy, requests, qtpy, pytest, pylama, pyarrow, partd, pandoc, pandas, matplotlib-inline, matplotlib, jupyterlab-pygments, jupyter-core, jsonschema, Jinja2, jedi, cffi, bleach, black, beautifulsoup4, treelite-runtime, treelite, sphinx, seaborn, scikit-learn, pytest-cov, nbformat, koalas, jupyter-client, ipython, dask, argon2-cffi-bindings, pydata_sphinx_theme, numpydoc, nbclient, ipykernel, distributed, argon2-cffi, qtconsole, nbconvert, jupyter-console, notebook, nbsphinx, widgetsnbextension, ipywidgets, jupyter +[Build and Test/test ] | Successfully installed Cython-0.29.27 Jinja2-3.0.3 MarkupSafe-2.0.1 Pygments-2.11.2 Send2Trash-1.8.0 alabaster-0.7.12 argon2-cffi-21.3.0 argon2-cffi-bindings-21.2.0 asttokens-2.0.5 attrs-21.4.0 babel-2.9.1 backcall-0.2.0 beautifulsoup4-4.10.0 black-22.1.0 bleach-4.1.0 cffi-1.15.0 charset-normalizer-2.0.11 click-8.0.3 cloudpickle-2.0.0 coverage-6.3.1 cycler-0.11.0 dask-2022.1.1 debugpy-1.5.1 decorator-5.1.1 defusedxml-0.7.1 dill-0.3.4 distributed-2022.1.1 docutils-0.16 entrypoints-0.4 executing-0.8.2 fonttools-4.29.1 fsspec-2022.1.0 heapdict-1.0.1 idna-3.3 imagesize-1.3.0 iniconfig-1.1.1 ipykernel-6.8.0 ipython-8.0.1 ipython-genutils-0.2.0 ipywidgets-7.6.5 isort-5.10.1 jedi-0.18.1 joblib-1.1.0 jsonschema-4.4.0 jupyter-1.0.0 jupyter-client-7.1.2 jupyter-console-6.4.0 jupyter-core-4.9.1 jupyterlab-pygments-0.1.2 jupyterlab-widgets-1.0.2 kiwisolver-1.3.2 koalas-1.8.2 locket-0.2.1 matplotlib-3.5.1 matplotlib-inline-0.1.3 mccabe-0.7.0 mistune-0.8.4 msgpack-1.0.3 mypy-extensions-0.4.3 nbclient-0.5.10 nbconvert-6.4.1 nbformat-5.1.3 nbsphinx-0.8.8 nest-asyncio-1.5.4 notebook-6.4.8 numpy-1.22.2 numpydoc-1.2 pandas-1.4.0 pandoc-2.0.1 pandocfilters-1.5.0 parso-0.8.3 partd-1.2.0 pathspec-0.9.0 pexpect-4.8.0 pickleshare-0.7.5 pillow-9.0.1 plumbum-1.7.2 ply-3.11 prometheus-client-0.13.1 prompt-toolkit-3.0.26 psutil-5.9.0 ptyprocess-0.7.0 pure-eval-0.2.2 py4j-0.10.9.3 pyarrow-7.0.0 pycodestyle-2.8.0 pycparser-2.21 pydata_sphinx_theme-0.8.0 pydocstyle-6.1.1 pyflakes-2.4.0 pylama-8.3.7 pyrsistent-0.18.1 pyspark-3.2.1 pytest-6.2.5 pytest-cov-3.0.0 python-dateutil-2.8.2 pytz-2021.3 pyyaml-6.0 pyzmq-22.3.0 qtconsole-5.2.2 qtpy-2.0.1 requests-2.27.1 scikit-learn-1.0.2 scipy-1.7.3 seaborn-0.11.2 snowballstemmer-2.2.0 sortedcontainers-2.4.0 soupsieve-2.3.1 sphinx-3.3.0 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 stack-data-0.1.4 tblib-1.7.0 terminado-0.13.1 testpath-0.5.0 threadpoolctl-3.1.0 tomli-2.0.0 toolz-0.11.2 tornado-6.1 traitlets-5.1.1 treelite-2.2.2 treelite-runtime-2.2.2 typing-extensions-4.0.1 urllib3-1.26.8 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.5.2 zict-2.0.0 +[Build and Test/test ] | WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +[Build and Test/test ] | Compiling gators/imputers/imputer.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/encoders/encoder.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/data_cleaning/data_cleaning.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/binning/binning.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/clipping/clipping.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/scalers/scaler.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/feature_generation/feature_gen.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/feature_generation_dt/feature_gen_dt.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | Compiling gators/feature_generation_str/feature_gen_str.pyx because it depends on /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd. +[Build and Test/test ] | [1/9] Cythonizing gators/binning/binning.pyx +[Build and Test/test ] | [2/9] Cythonizing gators/clipping/clipping.pyx +[Build and Test/test ] | [3/9] Cythonizing gators/data_cleaning/data_cleaning.pyx +[Build and Test/test ] | [4/9] Cythonizing gators/encoders/encoder.pyx +[Build and Test/test ] | [5/9] Cythonizing gators/feature_generation/feature_gen.pyx +[Build and Test/test ] | [6/9] Cythonizing gators/feature_generation_dt/feature_gen_dt.pyx +[Build and Test/test ] | [7/9] Cythonizing gators/feature_generation_str/feature_gen_str.pyx +[Build and Test/test ] | [8/9] Cythonizing gators/imputers/imputer.pyx +[Build and Test/test ] | [9/9] Cythonizing gators/scalers/scaler.pyx +[Build and Test/test ] | running build_ext +[Build and Test/test ] | building 'imputer' extension +[Build and Test/test ] | creating build +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9 +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/imputers/imputer.c -o build/temp.linux-x86_64-3.9/gators/imputers/imputer.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/imputers/imputer.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9 +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/imputers/imputer.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/imputer.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'encoder' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/encoders/encoder.c -o build/temp.linux-x86_64-3.9/gators/encoders/encoder.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/encoders/encoder.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/encoders/encoder.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/encoder.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'data_cleaning' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/data_cleaning/data_cleaning.c -o build/temp.linux-x86_64-3.9/gators/data_cleaning/data_cleaning.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/data_cleaning/data_cleaning.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/data_cleaning/data_cleaning.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/data_cleaning.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'binning' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/binning/binning.c -o build/temp.linux-x86_64-3.9/gators/binning/binning.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/binning/binning.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/binning/binning.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/binning.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'clipping' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/clipping +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/clipping/clipping.c -o build/temp.linux-x86_64-3.9/gators/clipping/clipping.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/clipping/clipping.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/clipping/clipping.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/clipping.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'scaler' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/scalers +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/scalers/scaler.c -o build/temp.linux-x86_64-3.9/gators/scalers/scaler.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/scalers/scaler.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/scalers/scaler.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/scaler.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'feature_gen' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/feature_generation/feature_gen.c -o build/temp.linux-x86_64-3.9/gators/feature_generation/feature_gen.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/feature_generation/feature_gen.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/feature_generation/feature_gen.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/feature_gen.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'feature_gen_dt' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/feature_generation_dt/feature_gen_dt.c -o build/temp.linux-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/feature_generation_dt/feature_gen_dt.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/feature_gen_dt.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | building 'feature_gen_str' extension +[Build and Test/test ] | creating build/temp.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include -I/opt/hostedtoolcache/Python/3.9.10/x64/include/python3.9 -c gators/feature_generation_str/feature_gen_str.c -o build/temp.linux-x86_64-3.9/gators/feature_generation_str/feature_gen_str.o -O3 +[Build and Test/test ] | In file included from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarraytypes.h:1960, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/ndarrayobject.h:12, +[Build and Test/test ] | from /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/arrayobject.h:5, +[Build and Test/test ] | from gators/feature_generation_str/feature_gen_str.c:706: +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] +[Build and Test/test ] | 17 | #warning "Using deprecated NumPy API, disable it with " \ +[Build and Test/test ] | | ^~~~~~~ +[Build and Test/test ] | gcc -pthread -shared -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib -Wl,--rpath=/opt/hostedtoolcache/Python/3.9.10/x64/lib build/temp.linux-x86_64-3.9/gators/feature_generation_str/feature_gen_str.o -L/opt/hostedtoolcache/Python/3.9.10/x64/lib -o build/lib.linux-x86_64-3.9/feature_gen_str.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/imputer.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/encoder.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/data_cleaning.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/binning.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/clipping.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/scaler.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/feature_gen.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/feature_gen_dt.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/feature_gen_str.cpython-39-x86_64-linux-gnu.so -> +[Build and Test/test ] | running install +[Build and Test/test ] | running bdist_egg +[Build and Test/test ] | running egg_info +[Build and Test/test ] | creating gators.egg-info +[Build and Test/test ] | writing gators.egg-info/PKG-INFO +[Build and Test/test ] | writing dependency_links to gators.egg-info/dependency_links.txt +[Build and Test/test ] | writing requirements to gators.egg-info/requires.txt +[Build and Test/test ] | writing top-level names to gators.egg-info/top_level.txt +[Build and Test/test ] | writing manifest file 'gators.egg-info/SOURCES.txt' +[Build and Test/test ] | reading manifest file 'gators.egg-info/SOURCES.txt' +[Build and Test/test ] | reading manifest template 'MANIFEST.in' +[Build and Test/test ] | adding license file 'LICENSE' +[Build and Test/test ] | writing manifest file 'gators.egg-info/SOURCES.txt' +[Build and Test/test ] | installing library code to build/bdist.linux-x86_64/egg +[Build and Test/test ] | running install_lib +[Build and Test/test ] | running build_py +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators +[Build and Test/test ] | copying gators/__init__.py -> build/lib.linux-x86_64-3.9/gators +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | copying gators/imputers/Numeric_imputer.py -> build/lib.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | copying gators/imputers/_base_imputer.py -> build/lib.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | copying gators/imputers/object_imputer.py -> build/lib.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | copying gators/imputers/__init__.py -> build/lib.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/transformers +[Build and Test/test ] | copying gators/transformers/transformer.py -> build/lib.linux-x86_64-3.9/gators/transformers +[Build and Test/test ] | copying gators/transformers/__init__.py -> build/lib.linux-x86_64-3.9/gators/transformers +[Build and Test/test ] | copying gators/transformers/transformer_xy.py -> build/lib.linux-x86_64-3.9/gators/transformers +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/split_extract.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/lower_case.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/upper_case.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/length.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/contains.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/extract.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/_base_string_feature.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | copying gators/feature_generation_str/__init__.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/correlation_filter.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/select_from_models.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/information_value.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/select_from_model.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/_base_feature_selection.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/__init__.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | copying gators/feature_selection/variance_filter.py -> build/lib.linux-x86_64-3.9/gators/feature_selection +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/scalers +[Build and Test/test ] | copying gators/scalers/minmax_scaler.py -> build/lib.linux-x86_64-3.9/gators/scalers +[Build and Test/test ] | copying gators/scalers/standard_scaler.py -> build/lib.linux-x86_64-3.9/gators/scalers +[Build and Test/test ] | copying gators/scalers/__init__.py -> build/lib.linux-x86_64-3.9/gators/scalers +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/util +[Build and Test/test ] | copying gators/util/util.py -> build/lib.linux-x86_64-3.9/gators/util +[Build and Test/test ] | copying gators/util/__init__.py -> build/lib.linux-x86_64-3.9/gators/util +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/drop_high_nan_ratio.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/convert_column_datatype.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/drop_low_cardinality.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/replace.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/_base_data_cleaning.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/keep_columns.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/drop_datatype_columns.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/drop_high_cardinality.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/drop_columns.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | copying gators/data_cleaning/__init__.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/woe_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/binned_columns_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/_base_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/target_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/onehot_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/ordinal_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | copying gators/encoders/__init__.py -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/sampling +[Build and Test/test ] | copying gators/sampling/supervised_sampling.py -> build/lib.linux-x86_64-3.9/gators/sampling +[Build and Test/test ] | copying gators/sampling/unsupervised_sampling.py -> build/lib.linux-x86_64-3.9/gators/sampling +[Build and Test/test ] | copying gators/sampling/__init__.py -> build/lib.linux-x86_64-3.9/gators/sampling +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/pipeline +[Build and Test/test ] | copying gators/pipeline/pipeline.py -> build/lib.linux-x86_64-3.9/gators/pipeline +[Build and Test/test ] | copying gators/pipeline/__init__.py -> build/lib.linux-x86_64-3.9/gators/pipeline +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/ordinal_minute_of_hour.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/cyclic_day_of_month.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/ordinal_hour_of_day.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/cyclic_minute_of_hour.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/ordinal_day_of_week.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/ordinal_day_of_month.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/ordinal_month_of_year.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/cyclic_month_of_year.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/_base_datetime_feature.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/delta_time.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/cyclic_day_of_week.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/cyclic_hour_of_day.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | copying gators/feature_generation_dt/__init__.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | copying gators/model_building/lgbm_treelite_dumper.py -> build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | copying gators/model_building/xgb_booster_builder.py -> build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | copying gators/model_building/train_test_split.py -> build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | copying gators/model_building/xgb_treelite_dumper.py -> build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | copying gators/model_building/model.py -> build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | copying gators/model_building/__init__.py -> build/lib.linux-x86_64-3.9/gators/model_building +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/converter +[Build and Test/test ] | copying gators/converter/to_numpy.py -> build/lib.linux-x86_64-3.9/gators/converter +[Build and Test/test ] | copying gators/converter/__init__.py -> build/lib.linux-x86_64-3.9/gators/converter +[Build and Test/test ] | copying gators/converter/to_pandas.py -> build/lib.linux-x86_64-3.9/gators/converter +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/clipping +[Build and Test/test ] | copying gators/clipping/clipping.py -> build/lib.linux-x86_64-3.9/gators/clipping +[Build and Test/test ] | copying gators/clipping/__init__.py -> build/lib.linux-x86_64-3.9/gators/clipping +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/quantile_binning.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/tree_binning.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/custom_binning.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/_base_binning.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/bin_rare_categories.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/bin_single_target_class_categories.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/bin_factory.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/binning.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | copying gators/binning/__init__.py -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/is_equal.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/polynomial_features.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/elementary_arithmethics.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/one_hot.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/cluster_statistics.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/plane_rotation.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/_base_feature_generation.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/__init__.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/is_null.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/feature_generation/polynomial_object_features.py -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | copying gators/imputers/imputer.pyx -> build/lib.linux-x86_64-3.9/gators/imputers +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/imputers/tests +[Build and Test/test ] | copying gators/imputers/tests/test_imputers_dd.py -> build/lib.linux-x86_64-3.9/gators/imputers/tests +[Build and Test/test ] | copying gators/imputers/tests/test_imputers_ks.py -> build/lib.linux-x86_64-3.9/gators/imputers/tests +[Build and Test/test ] | copying gators/imputers/tests/test_imputers_pd.py -> build/lib.linux-x86_64-3.9/gators/imputers/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/transformers/tests/test_transformer_dd.py -> build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/transformers/tests/test_transformer_ks.py -> build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/transformers/tests/test_transformer_pd.py -> build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/transformers/tests/test_transformer_xy_dd.py -> build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/transformers/tests/test_transformer_xy_ks.py -> build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/transformers/tests/test_transformer_xy_pd.py -> build/lib.linux-x86_64-3.9/gators/transformers/tests +[Build and Test/test ] | copying gators/feature_generation_str/feature_gen_str.pyx -> build/lib.linux-x86_64-3.9/gators/feature_generation_str +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_extract_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_extract_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_extract_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_lower_case_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_lower_case_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_lower_case_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_split_extract_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_split_extract_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_split_extract_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_contains_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_contains_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_contains_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_length_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_length_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_length_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_upper_case_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_upper_case_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | copying gators/feature_generation_str/tests/test_upper_case_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_correlation_filter_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_correlation_filter_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_correlation_filter_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_information_value_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_information_value_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_information_value_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_select_from_model_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_select_from_model_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_select_from_model_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_select_from_models_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_select_from_models_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_select_from_models_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_variance_filter_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_variance_filter_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/feature_selection/tests/test_variance_filter_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_selection/tests +[Build and Test/test ] | copying gators/scalers/scaler.pyx -> build/lib.linux-x86_64-3.9/gators/scalers +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | copying gators/scalers/tests/test_minmax_scaler_dd.py -> build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | copying gators/scalers/tests/test_minmax_scaler_ks.py -> build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | copying gators/scalers/tests/test_minmax_scaler_pd.py -> build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | copying gators/scalers/tests/test_standard_scaler_dd.py -> build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | copying gators/scalers/tests/test_standard_scaler_ks.py -> build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | copying gators/scalers/tests/test_standard_scaler_pd.py -> build/lib.linux-x86_64-3.9/gators/scalers/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/util/tests +[Build and Test/test ] | copying gators/util/tests/test_util.py -> build/lib.linux-x86_64-3.9/gators/util/tests +[Build and Test/test ] | copying gators/util/tests/test_util_dd.py -> build/lib.linux-x86_64-3.9/gators/util/tests +[Build and Test/test ] | copying gators/util/tests/test_util_ks.py -> build/lib.linux-x86_64-3.9/gators/util/tests +[Build and Test/test ] | copying gators/data_cleaning/data_cleaning.pyx -> build/lib.linux-x86_64-3.9/gators/data_cleaning +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_convert_column_datatype_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_convert_column_datatype_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_convert_column_datatype_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_columns_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_columns_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_columns_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_datatype_columns_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_datatype_columns_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_datatype_columns_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_high_cardinality_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_high_cardinality_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_high_cardinality_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_low_cardinality_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_low_cardinality_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_drop_low_cardinality_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_keep_columns_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_keep_columns_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_keep_columns_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_replace_dd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_replace_ks.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/data_cleaning/tests/test_replace_pd.py -> build/lib.linux-x86_64-3.9/gators/data_cleaning/tests +[Build and Test/test ] | copying gators/encoders/encoder.pyx -> build/lib.linux-x86_64-3.9/gators/encoders +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_base_encoder.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_binned_columns_encoder_dd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_binned_columns_encoder_ks.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_binned_columns_encoder_pd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_onehot_encoder_dd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_onehot_encoder_ks.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_onehot_encoder_pd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_ordinal_encoder_dd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_ordinal_encoder_ks.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_ordinal_encoder_pd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_target_encoder_dd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_target_encoder_ks.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_target_encoder_pd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_woe_encoder_dd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_woe_encoder_ks.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | copying gators/encoders/tests/test_woe_encoder_pd.py -> build/lib.linux-x86_64-3.9/gators/encoders/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | copying gators/sampling/tests/test_supervised_sampling_dd.py -> build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | copying gators/sampling/tests/test_supervised_sampling_ks.py -> build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | copying gators/sampling/tests/test_supervised_sampling_pd.py -> build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | copying gators/sampling/tests/test_unsupervised_sampling_dd.py -> build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | copying gators/sampling/tests/test_unsupervised_sampling_ks.py -> build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | copying gators/sampling/tests/test_unsupervised_sampling_pd.py -> build/lib.linux-x86_64-3.9/gators/sampling/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/pipeline/tests +[Build and Test/test ] | copying gators/pipeline/tests/test_pipeline_dd.py -> build/lib.linux-x86_64-3.9/gators/pipeline/tests +[Build and Test/test ] | copying gators/pipeline/tests/test_pipeline_ks.py -> build/lib.linux-x86_64-3.9/gators/pipeline/tests +[Build and Test/test ] | copying gators/pipeline/tests/test_pipeline_pd.py -> build/lib.linux-x86_64-3.9/gators/pipeline/tests +[Build and Test/test ] | copying gators/feature_generation_dt/feature_gen_dt.pyx -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_delta_time_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_delta_time_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_delta_time_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | copying gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_lgbm_treelite_dumper.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_model_dd.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_model_ks.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_model_pd.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_train_test_split_dd.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_train_test_split_ks.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_train_test_split_pd.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_xgb_booster_builder.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | copying gators/model_building/tests/test_xgb_treelite_dumper.py -> build/lib.linux-x86_64-3.9/gators/model_building/tests +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/converter/tests/test_to_numpy_dd.py -> build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/converter/tests/test_to_numpy_ks.py -> build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/converter/tests/test_to_numpy_pd.py -> build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/converter/tests/test_to_pandas_dd.py -> build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/converter/tests/test_to_pandas_ks.py -> build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/converter/tests/test_to_pandas_pd.py -> build/lib.linux-x86_64-3.9/gators/converter/tests +[Build and Test/test ] | copying gators/clipping/clipping.pyx -> build/lib.linux-x86_64-3.9/gators/clipping +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/clipping/tests +[Build and Test/test ] | copying gators/clipping/tests/test_clipping_dd.py -> build/lib.linux-x86_64-3.9/gators/clipping/tests +[Build and Test/test ] | copying gators/clipping/tests/test_clipping_ks.py -> build/lib.linux-x86_64-3.9/gators/clipping/tests +[Build and Test/test ] | copying gators/clipping/tests/test_clipping_pd.py -> build/lib.linux-x86_64-3.9/gators/clipping/tests +[Build and Test/test ] | copying gators/binning/binning.pyx -> build/lib.linux-x86_64-3.9/gators/binning +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_bin_rare_categories_dd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_bin_rare_categories_ks.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_bin_rare_categories_pd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_bin_single_target_class_categories_dd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_bin_single_target_class_categories_ks.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_bin_single_target_class_categories_pd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_binning_dd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_binning_ks.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_binning_pd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_custom_binning_dd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_custom_binning_ks.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_custom_binning_pd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_quantile_binning_dd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_quantile_binning_ks.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_quantile_binning_pd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_tree_binning_dd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_tree_binning_ks.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/binning/tests/test_tree_binning_pd.py -> build/lib.linux-x86_64-3.9/gators/binning/tests +[Build and Test/test ] | copying gators/feature_generation/feature_gen.pyx -> build/lib.linux-x86_64-3.9/gators/feature_generation +[Build and Test/test ] | creating build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_cluster_statistics_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_cluster_statistics_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_cluster_statistics_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_elementary_arithmetics_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_elementary_arithmetics_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_elementary_arithmetics_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_is_equal_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_is_equal_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_is_equal_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_is_null_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_is_null_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_is_null_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_one_hot_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_one_hot_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_one_hot_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_plane_rotation_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_plane_rotation_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_plane_rotation_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_polynomial_features_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_polynomial_features_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_polynomial_features_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_polynomial_object_features_dd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_polynomial_object_features_ks.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | copying gators/feature_generation/tests/test_polynomial_object_features_pd.py -> build/lib.linux-x86_64-3.9/gators/feature_generation/tests +[Build and Test/test ] | running build_ext +[Build and Test/test ] | creating build/bdist.linux-x86_64 +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/feature_gen_str.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/clipping.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/feature_gen_dt.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/imputer.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/binning.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/encoder.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/imputers +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/imputers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/tests/test_imputers_ks.py -> build/bdist.linux-x86_64/egg/gators/imputers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/tests/test_imputers_pd.py -> build/bdist.linux-x86_64/egg/gators/imputers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/tests/test_imputers_dd.py -> build/bdist.linux-x86_64/egg/gators/imputers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/Numeric_imputer.py -> build/bdist.linux-x86_64/egg/gators/imputers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/_base_imputer.py -> build/bdist.linux-x86_64/egg/gators/imputers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/object_imputer.py -> build/bdist.linux-x86_64/egg/gators/imputers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/imputer.pyx -> build/bdist.linux-x86_64/egg/gators/imputers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/imputers/__init__.py -> build/bdist.linux-x86_64/egg/gators/imputers +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/transformers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/transformer.py -> build/bdist.linux-x86_64/egg/gators/transformers +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/tests/test_transformer_pd.py -> build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/tests/test_transformer_dd.py -> build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/tests/test_transformer_xy_pd.py -> build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/tests/test_transformer_xy_ks.py -> build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/tests/test_transformer_xy_dd.py -> build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/tests/test_transformer_ks.py -> build/bdist.linux-x86_64/egg/gators/transformers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/__init__.py -> build/bdist.linux-x86_64/egg/gators/transformers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/transformers/transformer_xy.py -> build/bdist.linux-x86_64/egg/gators/transformers +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_length_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_upper_case_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_lower_case_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_extract_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_length_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_upper_case_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_split_extract_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_length_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_split_extract_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_contains_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_upper_case_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_contains_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_extract_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_extract_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_split_extract_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_lower_case_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_lower_case_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/tests/test_contains_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/split_extract.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/lower_case.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/upper_case.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/length.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/feature_gen_str.pyx -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/contains.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/extract.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/_base_string_feature.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_str/__init__.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_str +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/correlation_filter.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/select_from_models.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_variance_filter_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_variance_filter_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_select_from_models_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_select_from_model_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_correlation_filter_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_information_value_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_correlation_filter_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_information_value_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_select_from_model_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_information_value_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_variance_filter_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_select_from_models_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_select_from_models_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_select_from_model_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/tests/test_correlation_filter_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_selection/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/information_value.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/select_from_model.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/_base_feature_selection.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/__init__.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_selection/variance_filter.py -> build/bdist.linux-x86_64/egg/gators/feature_selection +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/scalers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/minmax_scaler.py -> build/bdist.linux-x86_64/egg/gators/scalers +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/tests/test_standard_scaler_pd.py -> build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/tests/test_minmax_scaler_pd.py -> build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/tests/test_standard_scaler_dd.py -> build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/tests/test_minmax_scaler_ks.py -> build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/tests/test_standard_scaler_ks.py -> build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/tests/test_minmax_scaler_dd.py -> build/bdist.linux-x86_64/egg/gators/scalers/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/scaler.pyx -> build/bdist.linux-x86_64/egg/gators/scalers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/standard_scaler.py -> build/bdist.linux-x86_64/egg/gators/scalers +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/scalers/__init__.py -> build/bdist.linux-x86_64/egg/gators/scalers +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/util +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/util/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/util/tests/test_util_dd.py -> build/bdist.linux-x86_64/egg/gators/util/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/util/tests/test_util.py -> build/bdist.linux-x86_64/egg/gators/util/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/util/tests/test_util_ks.py -> build/bdist.linux-x86_64/egg/gators/util/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/util/util.py -> build/bdist.linux-x86_64/egg/gators/util +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/util/__init__.py -> build/bdist.linux-x86_64/egg/gators/util +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_columns_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_replace_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_low_cardinality_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_cardinality_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_replace_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_datatype_columns_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_keep_columns_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_keep_columns_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_low_cardinality_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_datatype_columns_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_cardinality_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_convert_column_datatype_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_low_cardinality_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_keep_columns_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_columns_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_replace_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_convert_column_datatype_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_columns_dd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_convert_column_datatype_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_datatype_columns_ks.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_cardinality_pd.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/drop_high_nan_ratio.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/convert_column_datatype.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/drop_low_cardinality.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/replace.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/_base_data_cleaning.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/keep_columns.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/drop_datatype_columns.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/drop_high_cardinality.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/drop_columns.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/__init__.py -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/data_cleaning/data_cleaning.pyx -> build/bdist.linux-x86_64/egg/gators/data_cleaning +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/woe_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/binned_columns_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_target_encoder_pd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_target_encoder_dd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_base_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_target_encoder_ks.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_ordinal_encoder_dd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_woe_encoder_pd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_onehot_encoder_pd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_binned_columns_encoder_ks.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_woe_encoder_ks.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_ordinal_encoder_pd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_onehot_encoder_dd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_ordinal_encoder_ks.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_woe_encoder_dd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_onehot_encoder_ks.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_binned_columns_encoder_pd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/tests/test_binned_columns_encoder_dd.py -> build/bdist.linux-x86_64/egg/gators/encoders/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/_base_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/target_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/onehot_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/ordinal_encoder.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/encoder.pyx -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/encoders/__init__.py -> build/bdist.linux-x86_64/egg/gators/encoders +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/sampling +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/tests/test_supervised_sampling_ks.py -> build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/tests/test_unsupervised_sampling_dd.py -> build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/tests/test_supervised_sampling_pd.py -> build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/tests/test_supervised_sampling_dd.py -> build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/tests/test_unsupervised_sampling_ks.py -> build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/tests/test_unsupervised_sampling_pd.py -> build/bdist.linux-x86_64/egg/gators/sampling/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/supervised_sampling.py -> build/bdist.linux-x86_64/egg/gators/sampling +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/unsupervised_sampling.py -> build/bdist.linux-x86_64/egg/gators/sampling +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/sampling/__init__.py -> build/bdist.linux-x86_64/egg/gators/sampling +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/pipeline +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/pipeline/pipeline.py -> build/bdist.linux-x86_64/egg/gators/pipeline +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/pipeline/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/pipeline/tests/test_pipeline_pd.py -> build/bdist.linux-x86_64/egg/gators/pipeline/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/pipeline/tests/test_pipeline_dd.py -> build/bdist.linux-x86_64/egg/gators/pipeline/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/pipeline/tests/test_pipeline_ks.py -> build/bdist.linux-x86_64/egg/gators/pipeline/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/pipeline/__init__.py -> build/bdist.linux-x86_64/egg/gators/pipeline +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/ordinal_minute_of_hour.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_month.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/ordinal_hour_of_day.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/cyclic_minute_of_hour.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.pyx -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_delta_time_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_delta_time_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_delta_time_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_week.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_month.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/ordinal_month_of_year.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/cyclic_month_of_year.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/_base_datetime_feature.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/delta_time.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_week.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/cyclic_hour_of_day.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation_dt/__init__.py -> build/bdist.linux-x86_64/egg/gators/feature_generation_dt +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/lgbm_treelite_dumper.py -> build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_train_test_split_pd.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_train_test_split_dd.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_xgb_booster_builder.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_xgb_treelite_dumper.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_model_ks.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_model_dd.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_lgbm_treelite_dumper.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_model_pd.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/tests/test_train_test_split_ks.py -> build/bdist.linux-x86_64/egg/gators/model_building/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/xgb_booster_builder.py -> build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/train_test_split.py -> build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/xgb_treelite_dumper.py -> build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/model.py -> build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/model_building/__init__.py -> build/bdist.linux-x86_64/egg/gators/model_building +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/converter +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/tests/test_to_pandas_ks.py -> build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/tests/test_to_numpy_pd.py -> build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/tests/test_to_pandas_dd.py -> build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/tests/test_to_pandas_pd.py -> build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/tests/test_to_numpy_ks.py -> build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/tests/test_to_numpy_dd.py -> build/bdist.linux-x86_64/egg/gators/converter/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/to_numpy.py -> build/bdist.linux-x86_64/egg/gators/converter +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/__init__.py -> build/bdist.linux-x86_64/egg/gators/converter +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/converter/to_pandas.py -> build/bdist.linux-x86_64/egg/gators/converter +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/clipping +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/clipping/clipping.py -> build/bdist.linux-x86_64/egg/gators/clipping +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/clipping/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/clipping/tests/test_clipping_ks.py -> build/bdist.linux-x86_64/egg/gators/clipping/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/clipping/tests/test_clipping_dd.py -> build/bdist.linux-x86_64/egg/gators/clipping/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/clipping/tests/test_clipping_pd.py -> build/bdist.linux-x86_64/egg/gators/clipping/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/clipping/clipping.pyx -> build/bdist.linux-x86_64/egg/gators/clipping +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/clipping/__init__.py -> build/bdist.linux-x86_64/egg/gators/clipping +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/quantile_binning.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tree_binning.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/custom_binning.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/_base_binning.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/bin_rare_categories.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_bin_single_target_class_categories_pd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_bin_rare_categories_dd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_custom_binning_dd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_custom_binning_pd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_quantile_binning_ks.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_binning_ks.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_bin_single_target_class_categories_ks.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_binning_dd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_custom_binning_ks.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_bin_single_target_class_categories_dd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_quantile_binning_dd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_binning_pd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_quantile_binning_pd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_bin_rare_categories_ks.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_tree_binning_dd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_tree_binning_ks.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_tree_binning_pd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/tests/test_bin_rare_categories_pd.py -> build/bdist.linux-x86_64/egg/gators/binning/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/bin_single_target_class_categories.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/bin_factory.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/binning.pyx -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/binning.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/binning/__init__.py -> build/bdist.linux-x86_64/egg/gators/binning +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/is_equal.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/polynomial_features.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_plane_rotation_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_is_null_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_plane_rotation_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_polynomial_object_features_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_cluster_statistics_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_polynomial_features_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_one_hot_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_elementary_arithmetics_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_one_hot_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_polynomial_object_features_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_one_hot_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_is_equal_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_is_equal_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_polynomial_features_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_is_null_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_is_equal_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_cluster_statistics_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_cluster_statistics_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_polynomial_object_features_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_elementary_arithmetics_pd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_is_null_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_elementary_arithmetics_dd.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_plane_rotation_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/tests/test_polynomial_features_ks.py -> build/bdist.linux-x86_64/egg/gators/feature_generation/tests +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/elementary_arithmethics.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/one_hot.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/cluster_statistics.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/plane_rotation.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/feature_gen.pyx -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/_base_feature_generation.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/__init__.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/is_null.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/feature_generation/polynomial_object_features.py -> build/bdist.linux-x86_64/egg/gators/feature_generation +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/gators/__init__.py -> build/bdist.linux-x86_64/egg/gators +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/scaler.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/data_cleaning.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | copying build/lib.linux-x86_64-3.9/feature_gen.cpython-39-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/tests/test_imputers_ks.py to test_imputers_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/tests/test_imputers_pd.py to test_imputers_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/tests/test_imputers_dd.py to test_imputers_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/Numeric_imputer.py to Numeric_imputer.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/_base_imputer.py to _base_imputer.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/object_imputer.py to object_imputer.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/imputers/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/transformer.py to transformer.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/tests/test_transformer_pd.py to test_transformer_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/tests/test_transformer_dd.py to test_transformer_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/tests/test_transformer_xy_pd.py to test_transformer_xy_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/tests/test_transformer_xy_ks.py to test_transformer_xy_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/tests/test_transformer_xy_dd.py to test_transformer_xy_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/tests/test_transformer_ks.py to test_transformer_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/transformers/transformer_xy.py to transformer_xy.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_length_dd.py to test_length_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_upper_case_pd.py to test_upper_case_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_lower_case_dd.py to test_lower_case_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_extract_dd.py to test_extract_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_length_ks.py to test_length_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_upper_case_dd.py to test_upper_case_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_split_extract_ks.py to test_split_extract_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_length_pd.py to test_length_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_split_extract_dd.py to test_split_extract_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_contains_ks.py to test_contains_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_upper_case_ks.py to test_upper_case_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_contains_dd.py to test_contains_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_extract_pd.py to test_extract_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_extract_ks.py to test_extract_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_split_extract_pd.py to test_split_extract_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_lower_case_ks.py to test_lower_case_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_lower_case_pd.py to test_lower_case_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/tests/test_contains_pd.py to test_contains_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/split_extract.py to split_extract.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/lower_case.py to lower_case.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/upper_case.py to upper_case.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/length.py to length.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/contains.py to contains.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/extract.py to extract.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/_base_string_feature.py to _base_string_feature.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_str/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/correlation_filter.py to correlation_filter.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/select_from_models.py to select_from_models.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_variance_filter_ks.py to test_variance_filter_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_variance_filter_dd.py to test_variance_filter_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_select_from_models_dd.py to test_select_from_models_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_select_from_model_pd.py to test_select_from_model_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_correlation_filter_pd.py to test_correlation_filter_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_information_value_pd.py to test_information_value_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_correlation_filter_ks.py to test_correlation_filter_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_information_value_ks.py to test_information_value_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_select_from_model_ks.py to test_select_from_model_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_information_value_dd.py to test_information_value_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_variance_filter_pd.py to test_variance_filter_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_select_from_models_pd.py to test_select_from_models_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_select_from_models_ks.py to test_select_from_models_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_select_from_model_dd.py to test_select_from_model_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/tests/test_correlation_filter_dd.py to test_correlation_filter_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/information_value.py to information_value.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/select_from_model.py to select_from_model.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/_base_feature_selection.py to _base_feature_selection.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_selection/variance_filter.py to variance_filter.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/minmax_scaler.py to minmax_scaler.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/tests/test_standard_scaler_pd.py to test_standard_scaler_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/tests/test_minmax_scaler_pd.py to test_minmax_scaler_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/tests/test_standard_scaler_dd.py to test_standard_scaler_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/tests/test_minmax_scaler_ks.py to test_minmax_scaler_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/tests/test_standard_scaler_ks.py to test_standard_scaler_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/tests/test_minmax_scaler_dd.py to test_minmax_scaler_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/standard_scaler.py to standard_scaler.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/scalers/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/util/tests/test_util_dd.py to test_util_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/util/tests/test_util.py to test_util.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/util/tests/test_util_ks.py to test_util_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/util/util.py to util.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/util/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py to test_drop_high_nan_ratio_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_columns_ks.py to test_drop_columns_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_replace_pd.py to test_replace_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_low_cardinality_ks.py to test_drop_low_cardinality_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_high_cardinality_dd.py to test_drop_high_cardinality_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_replace_dd.py to test_replace_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_datatype_columns_pd.py to test_drop_datatype_columns_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_keep_columns_dd.py to test_keep_columns_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_keep_columns_ks.py to test_keep_columns_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_low_cardinality_dd.py to test_drop_low_cardinality_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py to test_drop_high_nan_ratio_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_datatype_columns_dd.py to test_drop_datatype_columns_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_high_cardinality_ks.py to test_drop_high_cardinality_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py to test_drop_high_nan_ratio_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_convert_column_datatype_dd.py to test_convert_column_datatype_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_low_cardinality_pd.py to test_drop_low_cardinality_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_keep_columns_pd.py to test_keep_columns_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_columns_pd.py to test_drop_columns_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_replace_ks.py to test_replace_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_convert_column_datatype_ks.py to test_convert_column_datatype_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_columns_dd.py to test_drop_columns_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_convert_column_datatype_pd.py to test_convert_column_datatype_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_datatype_columns_ks.py to test_drop_datatype_columns_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/tests/test_drop_high_cardinality_pd.py to test_drop_high_cardinality_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/drop_high_nan_ratio.py to drop_high_nan_ratio.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/convert_column_datatype.py to convert_column_datatype.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/drop_low_cardinality.py to drop_low_cardinality.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/replace.py to replace.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/_base_data_cleaning.py to _base_data_cleaning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/keep_columns.py to keep_columns.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/drop_datatype_columns.py to drop_datatype_columns.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/drop_high_cardinality.py to drop_high_cardinality.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/drop_columns.py to drop_columns.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/data_cleaning/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/woe_encoder.py to woe_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/binned_columns_encoder.py to binned_columns_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_target_encoder_pd.py to test_target_encoder_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_target_encoder_dd.py to test_target_encoder_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_base_encoder.py to test_base_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_target_encoder_ks.py to test_target_encoder_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_ordinal_encoder_dd.py to test_ordinal_encoder_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_woe_encoder_pd.py to test_woe_encoder_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_onehot_encoder_pd.py to test_onehot_encoder_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_binned_columns_encoder_ks.py to test_binned_columns_encoder_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_woe_encoder_ks.py to test_woe_encoder_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_ordinal_encoder_pd.py to test_ordinal_encoder_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_onehot_encoder_dd.py to test_onehot_encoder_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_ordinal_encoder_ks.py to test_ordinal_encoder_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_woe_encoder_dd.py to test_woe_encoder_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_onehot_encoder_ks.py to test_onehot_encoder_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_binned_columns_encoder_pd.py to test_binned_columns_encoder_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/tests/test_binned_columns_encoder_dd.py to test_binned_columns_encoder_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/_base_encoder.py to _base_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/target_encoder.py to target_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/onehot_encoder.py to onehot_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/ordinal_encoder.py to ordinal_encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/encoders/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/tests/test_supervised_sampling_ks.py to test_supervised_sampling_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/tests/test_unsupervised_sampling_dd.py to test_unsupervised_sampling_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/tests/test_supervised_sampling_pd.py to test_supervised_sampling_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/tests/test_supervised_sampling_dd.py to test_supervised_sampling_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/tests/test_unsupervised_sampling_ks.py to test_unsupervised_sampling_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/tests/test_unsupervised_sampling_pd.py to test_unsupervised_sampling_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/supervised_sampling.py to supervised_sampling.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/unsupervised_sampling.py to unsupervised_sampling.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/sampling/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/pipeline/pipeline.py to pipeline.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/pipeline/tests/test_pipeline_pd.py to test_pipeline_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/pipeline/tests/test_pipeline_dd.py to test_pipeline_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/pipeline/tests/test_pipeline_ks.py to test_pipeline_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/pipeline/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/ordinal_minute_of_hour.py to ordinal_minute_of_hour.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/cyclic_day_of_month.py to cyclic_day_of_month.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/ordinal_hour_of_day.py to ordinal_hour_of_day.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/cyclic_minute_of_hour.py to cyclic_minute_of_hour.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py to test_ordinal_hour_of_day_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py to test_cyclic_day_of_week_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py to test_cyclic_minute_of_hour_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py to test_cyclic_month_of_year_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py to test_ordinal_hour_of_day_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py to test_ordinal_day_of_week_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py to test_ordinal_minute_of_hour_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py to test_cyclic_day_of_month_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py to test_cyclic_day_of_month_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py to test_ordinal_month_of_year_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_delta_time_pd.py to test_delta_time_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py to test_cyclic_minute_of_hour_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_delta_time_dd.py to test_delta_time_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py to test_ordinal_day_of_month_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py to test_ordinal_minute_of_hour_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py to test_ordinal_hour_of_day_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py to test_cyclic_hour_of_day_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py to test_ordinal_minute_of_hour_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py to test_base_datetime_features_dt.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py to test_cyclic_hour_of_day_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py to test_ordinal_month_of_year_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py to test_cyclic_hour_of_day_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py to test_ordinal_day_of_month_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py to test_cyclic_minute_of_hour_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py to test_ordinal_day_of_week_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py to test_ordinal_day_of_week_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_delta_time_ks.py to test_delta_time_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py to test_cyclic_month_of_year_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py to test_cyclic_day_of_month_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py to test_ordinal_day_of_month_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py to test_cyclic_day_of_week_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py to test_ordinal_month_of_year_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py to test_cyclic_day_of_week_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py to test_cyclic_month_of_year_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/ordinal_day_of_week.py to ordinal_day_of_week.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/ordinal_day_of_month.py to ordinal_day_of_month.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/ordinal_month_of_year.py to ordinal_month_of_year.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/cyclic_month_of_year.py to cyclic_month_of_year.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/_base_datetime_feature.py to _base_datetime_feature.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/delta_time.py to delta_time.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/cyclic_day_of_week.py to cyclic_day_of_week.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/cyclic_hour_of_day.py to cyclic_hour_of_day.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation_dt/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/lgbm_treelite_dumper.py to lgbm_treelite_dumper.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_train_test_split_pd.py to test_train_test_split_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_train_test_split_dd.py to test_train_test_split_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_xgb_booster_builder.py to test_xgb_booster_builder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_xgb_treelite_dumper.py to test_xgb_treelite_dumper.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_model_ks.py to test_model_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_model_dd.py to test_model_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_lgbm_treelite_dumper.py to test_lgbm_treelite_dumper.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_model_pd.py to test_model_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/tests/test_train_test_split_ks.py to test_train_test_split_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/xgb_booster_builder.py to xgb_booster_builder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/train_test_split.py to train_test_split.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/xgb_treelite_dumper.py to xgb_treelite_dumper.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/model.py to model.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/model_building/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/tests/test_to_pandas_ks.py to test_to_pandas_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/tests/test_to_numpy_pd.py to test_to_numpy_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/tests/test_to_pandas_dd.py to test_to_pandas_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/tests/test_to_pandas_pd.py to test_to_pandas_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/tests/test_to_numpy_ks.py to test_to_numpy_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/tests/test_to_numpy_dd.py to test_to_numpy_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/to_numpy.py to to_numpy.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/converter/to_pandas.py to to_pandas.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/clipping/clipping.py to clipping.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/clipping/tests/test_clipping_ks.py to test_clipping_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/clipping/tests/test_clipping_dd.py to test_clipping_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/clipping/tests/test_clipping_pd.py to test_clipping_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/clipping/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/quantile_binning.py to quantile_binning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tree_binning.py to tree_binning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/custom_binning.py to custom_binning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/_base_binning.py to _base_binning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/bin_rare_categories.py to bin_rare_categories.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_bin_single_target_class_categories_pd.py to test_bin_single_target_class_categories_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_bin_rare_categories_dd.py to test_bin_rare_categories_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_custom_binning_dd.py to test_custom_binning_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_custom_binning_pd.py to test_custom_binning_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_quantile_binning_ks.py to test_quantile_binning_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_binning_ks.py to test_binning_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_bin_single_target_class_categories_ks.py to test_bin_single_target_class_categories_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_binning_dd.py to test_binning_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_custom_binning_ks.py to test_custom_binning_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_bin_single_target_class_categories_dd.py to test_bin_single_target_class_categories_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_quantile_binning_dd.py to test_quantile_binning_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_binning_pd.py to test_binning_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_quantile_binning_pd.py to test_quantile_binning_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_bin_rare_categories_ks.py to test_bin_rare_categories_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_tree_binning_dd.py to test_tree_binning_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_tree_binning_ks.py to test_tree_binning_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_tree_binning_pd.py to test_tree_binning_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/tests/test_bin_rare_categories_pd.py to test_bin_rare_categories_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/bin_single_target_class_categories.py to bin_single_target_class_categories.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/bin_factory.py to bin_factory.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/binning.py to binning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/binning/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/is_equal.py to is_equal.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/polynomial_features.py to polynomial_features.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_plane_rotation_dd.py to test_plane_rotation_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_is_null_pd.py to test_is_null_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_plane_rotation_pd.py to test_plane_rotation_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_polynomial_object_features_dd.py to test_polynomial_object_features_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_cluster_statistics_pd.py to test_cluster_statistics_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_polynomial_features_pd.py to test_polynomial_features_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_one_hot_dd.py to test_one_hot_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_elementary_arithmetics_ks.py to test_elementary_arithmetics_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_one_hot_pd.py to test_one_hot_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_polynomial_object_features_pd.py to test_polynomial_object_features_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_one_hot_ks.py to test_one_hot_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_is_equal_dd.py to test_is_equal_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_is_equal_ks.py to test_is_equal_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_polynomial_features_dd.py to test_polynomial_features_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_is_null_dd.py to test_is_null_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_is_equal_pd.py to test_is_equal_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_cluster_statistics_dd.py to test_cluster_statistics_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_cluster_statistics_ks.py to test_cluster_statistics_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_polynomial_object_features_ks.py to test_polynomial_object_features_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_elementary_arithmetics_pd.py to test_elementary_arithmetics_pd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_is_null_ks.py to test_is_null_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_elementary_arithmetics_dd.py to test_elementary_arithmetics_dd.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_plane_rotation_ks.py to test_plane_rotation_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/tests/test_polynomial_features_ks.py to test_polynomial_features_ks.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/elementary_arithmethics.py to elementary_arithmethics.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/one_hot.py to one_hot.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/cluster_statistics.py to cluster_statistics.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/plane_rotation.py to plane_rotation.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/_base_feature_generation.py to _base_feature_generation.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/is_null.py to is_null.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/feature_generation/polynomial_object_features.py to polynomial_object_features.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/gators/__init__.py to __init__.cpython-39.pyc +[Build and Test/test ] | creating stub loader for imputer.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for encoder.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for data_cleaning.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for binning.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for clipping.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for scaler.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for feature_gen.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for feature_gen_dt.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | creating stub loader for feature_gen_str.cpython-39-x86_64-linux-gnu.so +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/imputer.py to imputer.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/encoder.py to encoder.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/data_cleaning.py to data_cleaning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/binning.py to binning.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/clipping.py to clipping.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/scaler.py to scaler.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/feature_gen.py to feature_gen.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/feature_gen_dt.py to feature_gen_dt.cpython-39.pyc +[Build and Test/test ] | byte-compiling build/bdist.linux-x86_64/egg/feature_gen_str.py to feature_gen_str.cpython-39.pyc +[Build and Test/test ] | creating build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | copying gators.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | copying gators.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | copying gators.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | copying gators.egg-info/not-zip-safe -> build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | copying gators.egg-info/requires.txt -> build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | copying gators.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO +[Build and Test/test ] | writing build/bdist.linux-x86_64/egg/EGG-INFO/native_libs.txt +[Build and Test/test ] | creating dist +[Build and Test/test ] | creating 'dist/gators-0.2.0-py3.9-linux-x86_64.egg' and adding 'build/bdist.linux-x86_64/egg' to it +[Build and Test/test ] | removing 'build/bdist.linux-x86_64/egg' (and everything under it) +[Build and Test/test ] | Processing gators-0.2.0-py3.9-linux-x86_64.egg +[Build and Test/test ] | creating /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/gators-0.2.0-py3.9-linux-x86_64.egg +[Build and Test/test ] | Extracting gators-0.2.0-py3.9-linux-x86_64.egg to /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Adding gators 0.2.0 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Installed /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/gators-0.2.0-py3.9-linux-x86_64.egg +[Build and Test/test ] | Processing dependencies for gators==0.2.0 +[Build and Test/test ] | Searching for xgboost +[Build and Test/test ] | Reading https://pypi.org/simple/xgboost/ +[Build and Test/test ] | Downloading https://files.pythonhosted.org/packages/2b/60/fc1c9d631dcf2bcfb1ec54c5a318c0501ad2f8f44e4c47afa7f5d36db968/xgboost-1.5.2-py3-none-manylinux2014_x86_64.whl#sha256=46e43e06b1de260fe4c67e818720485559dab1bed1d97b82275220fab602a2ba +[Build and Test/test ] | Best match: xgboost 1.5.2 +[Build and Test/test ] | Processing xgboost-1.5.2-py3-none-manylinux2014_x86_64.whl +[Build and Test/test ] | Installing xgboost-1.5.2-py3-none-manylinux2014_x86_64.whl to /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Adding xgboost 1.5.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Installed /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/xgboost-1.5.2-py3.9-linux-x86_64.egg +[Build and Test/test ] | Searching for lightgbm +[Build and Test/test ] | Reading https://pypi.org/simple/lightgbm/ +[Build and Test/test ] | Downloading https://files.pythonhosted.org/packages/a1/00/84c572ff02b27dd828d6095158f4bda576c124c4c863be7bf14f58101e53/lightgbm-3.3.2-py3-none-manylinux1_x86_64.whl#sha256=f4cba3b4f29336ad7e801cb32d9b948ea4cc5300dda650b78bcdfe36b3e2c4b2 +[Build and Test/test ] | Best match: lightgbm 3.3.2 +[Build and Test/test ] | Processing lightgbm-3.3.2-py3-none-manylinux1_x86_64.whl +[Build and Test/test ] | Installing lightgbm-3.3.2-py3-none-manylinux1_x86_64.whl to /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Adding lightgbm 3.3.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Installed /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/lightgbm-3.3.2-py3.9-linux-x86_64.egg +[Build and Test/test ] | Searching for dill==0.3.4 +[Build and Test/test ] | Best match: dill 0.3.4 +[Build and Test/test ] | Adding dill 0.3.4 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for treelite-runtime==2.2.2 +[Build and Test/test ] | Best match: treelite-runtime 2.2.2 +[Build and Test/test ] | Adding treelite-runtime 2.2.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for treelite==2.2.2 +[Build and Test/test ] | Best match: treelite 2.2.2 +[Build and Test/test ] | Adding treelite 2.2.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for numpy==1.22.2 +[Build and Test/test ] | Best match: numpy 1.22.2 +[Build and Test/test ] | Adding numpy 1.22.2 to easy-install.pth file +[Build and Test/test ] | Installing f2py script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | Installing f2py3 script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | Installing f2py3.9 script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for pandas==1.4.0 +[Build and Test/test ] | Best match: pandas 1.4.0 +[Build and Test/test ] | Adding pandas 1.4.0 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for seaborn==0.11.2 +[Build and Test/test ] | Best match: seaborn 0.11.2 +[Build and Test/test ] | Adding seaborn 0.11.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for scikit-learn==1.0.2 +[Build and Test/test ] | Best match: scikit-learn 1.0.2 +[Build and Test/test ] | Adding scikit-learn 1.0.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for scipy==1.7.3 +[Build and Test/test ] | Best match: scipy 1.7.3 +[Build and Test/test ] | Adding scipy 1.7.3 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for wheel==0.37.1 +[Build and Test/test ] | Best match: wheel 0.37.1 +[Build and Test/test ] | Adding wheel 0.37.1 to easy-install.pth file +[Build and Test/test ] | Installing wheel script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for python-dateutil==2.8.2 +[Build and Test/test ] | Best match: python-dateutil 2.8.2 +[Build and Test/test ] | Adding python-dateutil 2.8.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for pytz==2021.3 +[Build and Test/test ] | Best match: pytz 2021.3 +[Build and Test/test ] | Adding pytz 2021.3 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for matplotlib==3.5.1 +[Build and Test/test ] | Best match: matplotlib 3.5.1 +[Build and Test/test ] | Adding matplotlib 3.5.1 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for threadpoolctl==3.1.0 +[Build and Test/test ] | Best match: threadpoolctl 3.1.0 +[Build and Test/test ] | Adding threadpoolctl 3.1.0 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for joblib==1.1.0 +[Build and Test/test ] | Best match: joblib 1.1.0 +[Build and Test/test ] | Adding joblib 1.1.0 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for six==1.16.0 +[Build and Test/test ] | Best match: six 1.16.0 +[Build and Test/test ] | Adding six 1.16.0 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for Pillow==9.0.1 +[Build and Test/test ] | Best match: Pillow 9.0.1 +[Build and Test/test ] | Adding Pillow 9.0.1 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for fonttools==4.29.1 +[Build and Test/test ] | Best match: fonttools 4.29.1 +[Build and Test/test ] | Adding fonttools 4.29.1 to easy-install.pth file +[Build and Test/test ] | Installing fonttools script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | Installing pyftmerge script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | Installing pyftsubset script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | Installing ttx script to /opt/hostedtoolcache/Python/3.9.10/x64/bin +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for kiwisolver==1.3.2 +[Build and Test/test ] | Best match: kiwisolver 1.3.2 +[Build and Test/test ] | Adding kiwisolver 1.3.2 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for cycler==0.11.0 +[Build and Test/test ] | Best match: cycler 0.11.0 +[Build and Test/test ] | Adding cycler 0.11.0 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for packaging==21.3 +[Build and Test/test ] | Best match: packaging 21.3 +[Build and Test/test ] | Adding packaging 21.3 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Searching for pyparsing==3.0.7 +[Build and Test/test ] | Best match: pyparsing 3.0.7 +[Build and Test/test ] | Adding pyparsing 3.0.7 to easy-install.pth file +[Build and Test/test ] | +[Build and Test/test ] | Using /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages +[Build and Test/test ] | Finished processing dependencies for gators==0.2.0 +[Build and Test/test ] ✅ Success - install dependencies +[Build and Test/test ] ⭐ Run tests +[Build and Test/test ] 🐳 docker exec cmd=[bash --noprofile --norc -e -o pipefail /Users/cpoli/opensource/gators/workflow/5] user= +[Build and Test/test ] | ============================= test session starts ============================== +[Build and Test/test ] | platform linux -- Python 3.9.10, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 +[Build and Test/test ] | rootdir: /Users/cpoli/opensource/gators, configfile: pytest.ini +[Build and Test/test ] | plugins: cov-3.0.0, pylama-8.3.7 +[Build and Test/test ] | collected 844 items +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_dd.py ........ [ 0%] +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py ........ [ 1%] +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_pd.py ......... [ 2%] +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_dd.py .. [ 3%] +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_ks.py . [ 3%] +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_pd.py ..... [ 3%] +[Build and Test/test ] | . [ 4%] +[Build and Test/test ] | gators/binning/tests/test_binning_dd.py ............ [ 5%] +[Build and Test/test ] | gators/binning/tests/test_binning_ks.py ............ [ 6%] +[Build and Test/test ] | gators/binning/tests/test_binning_pd.py ............. [ 8%] +[Build and Test/test ] | gators/binning/tests/test_custom_binning_dd.py ............ [ 9%] +[Build and Test/test ] | gators/binning/tests/test_custom_binning_ks.py ............ [ 11%] +[Build and Test/test ] | gators/binning/tests/test_custom_binning_pd.py ............. [ 12%] +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_dd.py .......... [ 13%] +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_ks.py .......... [ 15%] +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_pd.py ........... [ 16%] +[Build and Test/test ] | gators/binning/tests/test_tree_binning_dd.py .... [ 16%] +[Build and Test/test ] | gators/binning/tests/test_tree_binning_ks.py .... [ 17%] +[Build and Test/test ] | gators/binning/tests/test_tree_binning_pd.py ....... [ 18%] +[Build and Test/test ] | gators/clipping/tests/test_clipping_dd.py ...... [ 18%] +[Build and Test/test ] | gators/clipping/tests/test_clipping_ks.py ...... [ 19%] +[Build and Test/test ] | gators/clipping/tests/test_clipping_pd.py ....... [ 20%] +[Build and Test/test ] | gators/converter/tests/test_to_numpy_dd.py . [ 20%] +[Build and Test/test ] | gators/converter/tests/test_to_numpy_ks.py . [ 20%] +[Build and Test/test ] | gators/converter/tests/test_to_numpy_pd.py . [ 20%] +[Build and Test/test ] | gators/converter/tests/test_to_pandas_dd.py . [ 20%] +[Build and Test/test ] | gators/converter/tests/test_to_pandas_ks.py . [ 21%] +[Build and Test/test ] | gators/converter/tests/test_to_pandas_pd.py . [ 21%] +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_dd.py .... [ 21%] +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_ks.py .... [ 22%] +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_pd.py ..... [ 22%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_dd.py .. [ 22%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_ks.py .. [ 23%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_pd.py ..... [ 23%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_dd.py .. [ 24%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_ks.py .. [ 24%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_pd.py ... [ 24%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_dd.py .. [ 24%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py ...... [ 25%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_pd.py ....... [ 26%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py .. [ 26%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py .... [ 27%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py ..... [ 27%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_dd.py ........ [ 28%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_ks.py ....... [ 29%] +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_pd.py ........ [ 30%] +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_dd.py .. [ 30%] +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_ks.py .. [ 30%] +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_pd.py ... [ 31%] +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_dd.py .. [ 31%] +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_ks.py .. [ 31%] +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_pd.py ... [ 32%] +[Build and Test/test ] | gators/encoders/tests/test_base_encoder.py . [ 32%] +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_dd.py ...... [ 32%] +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py ...... [ 33%] +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_pd.py ....... [ 34%] +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_dd.py ...... [ 35%] +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py ...... [ 35%] +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_pd.py ...... [ 36%] +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_dd.py ...... [ 37%] +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py ...... [ 38%] +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_pd.py ....... [ 38%] +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_dd.py ...... [ 39%] +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py ...... [ 40%] +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_pd.py ...... [ 40%] +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_dd.py ...... [ 41%] +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py ...... [ 42%] +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_pd.py ....... [ 43%] +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_dd.py ...... [ 43%] +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_ks.py ...... [ 44%] +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_pd.py ....... [ 45%] +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_dd.py ...... [ 46%] +[Build and Test/test ] | .... [ 46%] +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_ks.py ...... [ 47%] +[Build and Test/test ] | .... [ 47%] +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_pd.py ...... [ 48%] +[Build and Test/test ] | ...... [ 49%] +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_dd.py ...... [ 50%] +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_ks.py ...... [ 50%] +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_pd.py ....... [ 51%] +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_dd.py ...... [ 52%] +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_ks.py ...... [ 52%] +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_pd.py ....... [ 53%] +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_dd.py .... [ 54%] +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_ks.py .... [ 54%] +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_pd.py ..... [ 55%] +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_dd.py .... [ 55%] +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_ks.py .... [ 56%] +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_pd.py ..... [ 56%] +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_dd.py .... [ 57%] +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_ks.py .... [ 57%] +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_pd.py ..... [ 58%] +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_dd.py .. [ 58%] +[Build and Test/test ] | [ 58%] +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_ks.py .. [ 58%] +[Build and Test/test ] | [ 58%] +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_pd.py .. [ 59%] +[Build and Test/test ] | . [ 59%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_base_datetime_features_dt.py .. [ 59%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py .. [ 59%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py .. [ 59%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py ... [ 60%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py .. [ 60%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py .. [ 60%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py ... [ 61%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py .. [ 61%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py .. [ 61%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py ... [ 61%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py .. [ 62%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py .. [ 62%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py ... [ 62%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py .. [ 63%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py .. [ 63%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py ... [ 63%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_dd.py .. [ 63%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_ks.py .. [ 64%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_pd.py ..... [ 64%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py .. [ 64%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py .. [ 65%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py ... [ 65%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py .. [ 65%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py .. [ 65%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py ... [ 66%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py .. [ 66%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py .. [ 66%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py ... [ 67%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py .. [ 67%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py .. [ 67%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py ... [ 68%] +[Build and Test/test ] | [ 68%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py .. [ 68%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py .. [ 68%] +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py ... [ 68%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_dd.py .. [ 69%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_ks.py .. [ 69%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_pd.py ... [ 69%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_dd.py .. [ 69%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_ks.py .. [ 70%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_pd.py ... [ 70%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_dd.py .. [ 70%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py FE [ 70%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_pd.py ... [ 71%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_dd.py .... [ 71%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py EEEE [ 72%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_pd.py ..... [ 72%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_dd.py .. [ 73%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py EE [ 73%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_pd.py ... [ 73%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_dd.py .. [ 73%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py EE [ 74%] +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_pd.py ... [ 74%] +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_dd.py .. [ 74%] +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py EE [ 75%] +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_pd.py ... [ 75%] +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_dd.py .. [ 75%] +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py EE [ 75%] +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_pd.py ... [ 76%] +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_dd.py .. [ 76%] +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py EE [ 76%] +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_pd.py ... [ 77%] +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_dd.py .. [ 77%] +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py EE [ 77%] +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_pd.py ... [ 77%] +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_dd.py ... [ 78%] +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py EE [ 78%] +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_pd.py .... [ 78%] +[Build and Test/test ] | gators/imputers/tests/test_imputers_dd.py .................. [ 81%] +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py EEEEEEEEEEEEEEEEEE [ 83%] +[Build and Test/test ] | gators/imputers/tests/test_imputers_pd.py ............................. [ 86%] +[Build and Test/test ] | gators/model_building/tests/test_lgbm_treelite_dumper.py .. [ 86%] +[Build and Test/test ] | gators/model_building/tests/test_model_dd.py .. [ 87%] +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py EE [ 87%] +[Build and Test/test ] | gators/model_building/tests/test_model_pd.py .. [ 87%] +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_dd.py ... [ 87%] +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py EEE [ 88%] +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_pd.py .... [ 88%] +[Build and Test/test ] | gators/model_building/tests/test_xgb_booster_builder.py ... [ 89%] +[Build and Test/test ] | gators/model_building/tests/test_xgb_treelite_dumper.py .. [ 89%] +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_dd.py ...... [ 90%] +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py EEEEE [ 90%] +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_pd.py ............ [ 92%] +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_dd.py . [ 92%] +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_ks.py E [ 92%] +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_pd.py .. [ 92%] +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_dd.py ... [ 92%] +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_ks.py E [ 93%] +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_pd.py ... [ 93%] +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_dd.py .... [ 93%] +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py EE.. [ 94%] +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_pd.py .... [ 94%] +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_dd.py .... [ 95%] +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py EEEE [ 95%] +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_pd.py .... [ 96%] +[Build and Test/test ] | gators/transformers/tests/test_transformer_dd.py .. [ 96%] +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py FF [ 96%] +[Build and Test/test ] | gators/transformers/tests/test_transformer_pd.py ...... [ 97%] +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_dd.py . [ 97%] +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_ks.py F [ 97%] +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_pd.py ... [ 97%] +[Build and Test/test ] | gators/util/tests/test_util.py ........ [ 98%] +[Build and Test/test ] | gators/util/tests/test_util_dd.py ...... [ 99%] +[Build and Test/test ] | gators/util/tests/test_util_ks.py EEE [100%] +[Build and Test/test ] | +[Build and Test/test ] | ==================================== ERRORS ==================================== +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["0", "1*Q", "1Q*QQ"], +[Build and Test/test ] | "E": ["0", "W*2", "W2*WW"], +[Build and Test/test ] | "F": ["0", "Q*", "qwert*"], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["0", "1Q", "1QQ"], +[Build and Test/test ] | "E": ["0", "W2", "W2W"], +[Build and Test/test ] | "F": ["0", "Q", ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["0", "1Q", "1QQ"], +[Build and Test/test ] | "E": ["0", "W2", "W2W"], +[Build and Test/test ] | "F": ["0", "Q", ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________________ ERROR at setup of test_names_ks ________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_with_names_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["0", "1Q", "1QQ"], +[Build and Test/test ] | "E": ["0", "W2", "W2W"], +[Build and Test/test ] | "F": ["0", "Q", ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py:49: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ______________________ ERROR at setup of test_names_ks_np ______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_with_names_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["0", "1Q", "1QQ"], +[Build and Test/test ] | "E": ["0", "W2", "W2W"], +[Build and Test/test ] | "F": ["0", "Q", ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py:49: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["Q", "QQ", "QQQ"], +[Build and Test/test ] | "E": ["W", "WW", "WWW"], +[Build and Test/test ] | "F": ["nan", None, ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["Q", "QQ", "QQQ"], +[Build and Test/test ] | "E": ["W", "WW", "WWW"], +[Build and Test/test ] | "F": ["nan", None, ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["q", "qq", "QQq"], +[Build and Test/test ] | "E": ["w", "WW", "WWw"], +[Build and Test/test ] | "F": ["abc", None, ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [0.0, 0.0, 0.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0], +[Build and Test/test ] | "D": ["q", "qq", "QQq"], +[Build and Test/test ] | "E": ["w", "WW", "WWw"], +[Build and Test/test ] | "F": ["abc", None, ""], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | max_corr = 0.8 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], +[Build and Test/test ] | "B": [1, 1, 0, 1, 0, 0], +[Build and Test/test ] | "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], +[Build and Test/test ] | "F": [3, 1, 2, 1, 2, 3], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | max_corr = 0.8 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], +[Build and Test/test ] | "B": [1, 1, 0, 1, 0, 0], +[Build and Test/test ] | "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], +[Build and Test/test ] | "F": [3, 1, 2, 1, 2, 3], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | k = 3 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": ["a", "b", "a", "b", "c", "b"], +[Build and Test/test ] | "B": ["true", "true", "false", "true", "false", "false"], +[Build and Test/test ] | "D": ["a", "b", "c", "d", "e", "f"], +[Build and Test/test ] | "F": ["e", "f", "g", "e", "f", "g"], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | k = 3 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": ["a", "b", "a", "b", "c", "b"], +[Build and Test/test ] | "B": ["true", "true", "false", "true", "false", "false"], +[Build and Test/test ] | "D": ["a", "b", "c", "d", "e", "f"], +[Build and Test/test ] | "F": ["e", "f", "g", "e", "f", "g"], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], +[Build and Test/test ] | "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], +[Build and Test/test ] | "B": [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], +[Build and Test/test ] | "B": [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], +[Build and Test/test ] | "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | min_var = 2.0 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], +[Build and Test/test ] | "B": [1, 1, 0, 1, 0, 0], +[Build and Test/test ] | "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], +[Build and Test/test ] | "F": [1, 2, 3, 1, 2, 4], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | min_var = 2.0 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | { +[Build and Test/test ] | "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], +[Build and Test/test ] | "B": [1, 1, 0, 1, 0, 0], +[Build and Test/test ] | "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], +[Build and Test/test ] | "F": [1, 2, 3, 1, 2, 4], +[Build and Test/test ] | } +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ________________________ ERROR at setup of test_int_ks _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) +[Build and Test/test ] | X_int_expected = pd.DataFrame( +[Build and Test/test ] | {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_float_expected = pd.DataFrame( +[Build and Test/test ] | {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_object_expected = pd.DataFrame( +[Build and Test/test ] | {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} +[Build and Test/test ] | ) +[Build and Test/test ] | > X_int_ks = ks.from_pandas(X_int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________________ ERROR at setup of test_float_ks ________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) +[Build and Test/test ] | X_int_expected = pd.DataFrame( +[Build and Test/test ] | {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_float_expected = pd.DataFrame( +[Build and Test/test ] | {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_object_expected = pd.DataFrame( +[Build and Test/test ] | {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} +[Build and Test/test ] | ) +[Build and Test/test ] | > X_int_ks = ks.from_pandas(X_int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________________ ERROR at setup of test_object_ks _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) +[Build and Test/test ] | X_int_expected = pd.DataFrame( +[Build and Test/test ] | {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_float_expected = pd.DataFrame( +[Build and Test/test ] | {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_object_expected = pd.DataFrame( +[Build and Test/test ] | {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} +[Build and Test/test ] | ) +[Build and Test/test ] | > X_int_ks = ks.from_pandas(X_int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________________ ERROR at setup of test_int_ks_np _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) +[Build and Test/test ] | X_int_expected = pd.DataFrame( +[Build and Test/test ] | {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_float_expected = pd.DataFrame( +[Build and Test/test ] | {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_object_expected = pd.DataFrame( +[Build and Test/test ] | {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} +[Build and Test/test ] | ) +[Build and Test/test ] | > X_int_ks = ks.from_pandas(X_int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ______________________ ERROR at setup of test_float_ks_np ______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) +[Build and Test/test ] | X_int_expected = pd.DataFrame( +[Build and Test/test ] | {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_float_expected = pd.DataFrame( +[Build and Test/test ] | {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_object_expected = pd.DataFrame( +[Build and Test/test ] | {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} +[Build and Test/test ] | ) +[Build and Test/test ] | > X_int_ks = ks.from_pandas(X_int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________________ ERROR at setup of test_object_ks_np ______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) +[Build and Test/test ] | X_int_expected = pd.DataFrame( +[Build and Test/test ] | {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_float_expected = pd.DataFrame( +[Build and Test/test ] | {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} +[Build and Test/test ] | ) +[Build and Test/test ] | X_object_expected = pd.DataFrame( +[Build and Test/test ] | {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} +[Build and Test/test ] | ) +[Build and Test/test ] | > X_int_ks = ks.from_pandas(X_int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ______________________ ERROR at setup of test_num_int_ks _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_num_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame( +[Build and Test/test ] | {"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}, dtype=np.float32 +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:64: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________________ ERROR at setup of test_num_float_ks ______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_num_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame( +[Build and Test/test ] | {"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}, dtype=np.float32 +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:64: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________________ ERROR at setup of test_num_int_ks_np _____________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_num_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame( +[Build and Test/test ] | {"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}, dtype=np.float32 +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:64: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ____________________ ERROR at setup of test_num_float_ks_np ____________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_num_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame( +[Build and Test/test ] | {"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}, dtype=np.float32 +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:64: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ___________________ ERROR at setup of test_no_missing_int_ks ___________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_no_missing_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:97: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________ ERROR at setup of test_no_missing_float_ks __________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_no_missing_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:97: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________ ERROR at setup of test_no_missing_object_ks __________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_no_missing_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:97: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________ ERROR at setup of test_no_missing_int_ks_np __________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_no_missing_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:97: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ________________ ERROR at setup of test_no_missing_float_ks_np _________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_no_missing_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:97: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ________________ ERROR at setup of test_no_missing_object_ks_np ________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_no_missing_ks(): +[Build and Test/test ] | > X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:97: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ________________________ ERROR at setup of test_full_ks ________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_full_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) +[Build and Test/test ] | > X = ks.from_pandas(pd.concat([X_int, X_float, X_object], axis=1)) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:128: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ______________________ ERROR at setup of test_full_ks_np _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_full_ks(): +[Build and Test/test ] | X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) +[Build and Test/test ] | X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) +[Build and Test/test ] | X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) +[Build and Test/test ] | > X = ks.from_pandas(pd.concat([X_int, X_float, X_object], axis=1)) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py:128: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/namespace.py:125: in from_pandas +[Build and Test/test ] | return DataFrame(pobj) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ________________________ ERROR at setup of test_predict ________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data(): +[Build and Test/test ] | > X = ks.DataFrame(data_iris["data"], columns=data_iris["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py:17: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________________ ERROR at setup of test_predict_proba _____________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data(): +[Build and Test/test ] | > X = ks.DataFrame(data_iris["data"], columns=data_iris["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py:17: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ______________________ ERROR at setup of test_ordered_ks _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_ordered_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) +[Build and Test/test ] | +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py:13: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________________ ERROR at setup of test_random_ks _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_random_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) +[Build and Test/test ] | +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py:51: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________________ ERROR at setup of test_stratified_ks _____________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture() +[Build and Test/test ] | def data_stratified_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.arange(40).reshape(10, 4), columns=list("ABCD")) +[Build and Test/test ] | +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py:61: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________ ERROR at setup of test_pipeline_fit_and_transform_ks _____________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def pipeline_example(): +[Build and Test/test ] | > X = ks.DataFrame(data["data"], columns=data["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py:53: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________ ERROR at setup of test_fit_transform_pipeline_ks _______________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def pipeline_example(): +[Build and Test/test ] | > X = ks.DataFrame(data["data"], columns=data["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py:53: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________ ERROR at setup of test_pipeline_predict_ks __________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def pipeline_with_model_example(): +[Build and Test/test ] | > X = ks.DataFrame(data["data"], columns=data["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py:65: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________ ERROR at setup of test_pipeline_predict_proba_ks _______________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def pipeline_with_model_example(): +[Build and Test/test ] | > X = ks.DataFrame(data["data"], columns=data["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py:65: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ____________________ ERROR at setup of test_pipeline_np_ks _____________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def pipeline_example(): +[Build and Test/test ] | > X = ks.DataFrame(data["data"], columns=data["feature_names"]) +[Build and Test/test ] | +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py:53: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | n_rows = 14 +[Build and Test/test ] | n_cols = 5 +[Build and Test/test ] | n_samples = 7 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_ks.py:16: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | n_rows = 30 +[Build and Test/test ] | n_cols = 5 +[Build and Test/test ] | n_classes = 4 +[Build and Test/test ] | n_samples = 5 +[Build and Test/test ] | > X = ks.DataFrame( +[Build and Test/test ] | np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_ks.py:34: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) +[Build and Test/test ] | +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py:20: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) +[Build and Test/test ] | +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py:20: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | __________________________ ERROR at setup of test_ks ___________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) +[Build and Test/test ] | +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________ ERROR at setup of test_ks_np _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) +[Build and Test/test ] | +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ______________________ ERROR at setup of test_float32_ks _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_float32_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.random.randn(5, 5), columns=list("ABCDF"), dtype=np.float32) +[Build and Test/test ] | +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py:20: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _____________________ ERROR at setup of test_float32_ks_np _____________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_float32_ks(): +[Build and Test/test ] | > X = ks.DataFrame(np.random.randn(5, 5), columns=list("ABCDF"), dtype=np.float32) +[Build and Test/test ] | +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py:20: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ____________ ERROR at setup of test_get_datatype_columns_object_ks _____________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > return ks.DataFrame( +[Build and Test/test ] | {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/util/tests/test_util_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _______________________ ERROR at setup of test_concat_ks _______________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > return ks.DataFrame( +[Build and Test/test ] | {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/util/tests/test_util_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ________________________ ERROR at setup of test_fillna _________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.fixture +[Build and Test/test ] | def data_ks(): +[Build and Test/test ] | > return ks.DataFrame( +[Build and Test/test ] | {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] +[Build and Test/test ] | ) +[Build and Test/test ] | +[Build and Test/test ] | gators/util/tests/test_util_ks.py:15: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | =================================== FAILURES =================================== +[Build and Test/test ] | ___________________________________ test_ks ____________________________________ +[Build and Test/test ] | +[Build and Test/test ] | self = <[ConnectionRefusedError(111, 'Connection refused') raised in repr()] DataFrame object at 0x7f55594e24f0> +[Build and Test/test ] | +[Build and Test/test ] | def collect(self): +[Build and Test/test ] | """Returns all the records as a list of :class:`Row`. +[Build and Test/test ] | +[Build and Test/test ] | .. versionadded:: 1.3.0 +[Build and Test/test ] | +[Build and Test/test ] | Examples +[Build and Test/test ] | -------- +[Build and Test/test ] | >>> df.collect() +[Build and Test/test ] | [Row(age=2, name='Alice'), Row(age=5, name='Bob')] +[Build and Test/test ] | """ +[Build and Test/test ] | with SCCallSiteSync(self._sc) as css: +[Build and Test/test ] | > sock_info = self._jdf.collectToPython() +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/dataframe.py:693: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = , args = () +[Build and Test/test ] | args_command = '', temp_args = [], command = 'c\no70978\ncollectToPython\ne\n' +[Build and Test/test ] | +[Build and Test/test ] | def __call__(self, *args): +[Build and Test/test ] | args_command, temp_args = self._build_args(*args) +[Build and Test/test ] | +[Build and Test/test ] | command = proto.CALL_COMMAND_NAME +\ +[Build and Test/test ] | self.command_header +\ +[Build and Test/test ] | args_command +\ +[Build and Test/test ] | proto.END_COMMAND_PART +[Build and Test/test ] | +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | > return_value = get_return_value( +[Build and Test/test ] | answer, self.gateway_client, self.target_id, self.name) +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1321: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | a = ('x', , 'o70978', 'collectToPython') +[Build and Test/test ] | kw = {} +[Build and Test/test ] | +[Build and Test/test ] | def deco(*a, **kw): +[Build and Test/test ] | try: +[Build and Test/test ] | > return f(*a, **kw) +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/utils.py:111: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | answer = 'x' +[Build and Test/test ] | gateway_client = +[Build and Test/test ] | target_id = 'o70978', name = 'collectToPython' +[Build and Test/test ] | +[Build and Test/test ] | def get_return_value(answer, gateway_client, target_id=None, name=None): +[Build and Test/test ] | """Converts an answer received from the Java gateway into a Python object. +[Build and Test/test ] | +[Build and Test/test ] | For example, string representation of integers are converted to Python +[Build and Test/test ] | integer, string representation of objects are converted to JavaObject +[Build and Test/test ] | instances, etc. +[Build and Test/test ] | +[Build and Test/test ] | :param answer: the string returned by the Java gateway +[Build and Test/test ] | :param gateway_client: the gateway client used to communicate with the Java +[Build and Test/test ] | Gateway. Only necessary if the answer is a reference (e.g., object, +[Build and Test/test ] | list, map) +[Build and Test/test ] | :param target_id: the name of the object from which the answer comes from +[Build and Test/test ] | (e.g., *object1* in `object1.hello()`). Optional. +[Build and Test/test ] | :param name: the name of the member from which the answer comes from +[Build and Test/test ] | (e.g., *hello* in `object1.hello()`). Optional. +[Build and Test/test ] | """ +[Build and Test/test ] | if is_error(answer)[0]: +[Build and Test/test ] | if len(answer) > 1: +[Build and Test/test ] | type = answer[1] +[Build and Test/test ] | value = OUTPUT_CONVERTER[type](answer[2:], gateway_client) +[Build and Test/test ] | if answer[1] == REFERENCE_TYPE: +[Build and Test/test ] | raise Py4JJavaError( +[Build and Test/test ] | "An error occurred while calling {0}{1}{2}.\n". +[Build and Test/test ] | format(target_id, ".", name), value) +[Build and Test/test ] | else: +[Build and Test/test ] | raise Py4JError( +[Build and Test/test ] | "An error occurred while calling {0}{1}{2}. Trace:\n{3}\n". +[Build and Test/test ] | format(target_id, ".", name, value)) +[Build and Test/test ] | else: +[Build and Test/test ] | > raise Py4JError( +[Build and Test/test ] | "An error occurred while calling {0}{1}{2}". +[Build and Test/test ] | format(target_id, ".", name)) +[Build and Test/test ] | E py4j.protocol.Py4JError: An error occurred while calling o70978.collectToPython +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/protocol.py:334: Py4JError +[Build and Test/test ] | +[Build and Test/test ] | During handling of the above exception, another exception occurred: +[Build and Test/test ] | +[Build and Test/test ] | data_ks = (SplitExtract(column_names=['D__split_by_*_idx_1', 'E__split_by_*_idx_1', +[Build and Test/test ] | 'F__split_by_*_id... Q +[Build and Test/test ] | 2 0.0 0.0 0.0 ... QQ WW qwert +[Build and Test/test ] | +[Build and Test/test ] | [3 rows x 9 columns]) +[Build and Test/test ] | +[Build and Test/test ] | @pytest.mark.pyspark +[Build and Test/test ] | def test_ks(data_ks): +[Build and Test/test ] | obj, X, X_expected = data_ks +[Build and Test/test ] | X_new = obj.transform(X) +[Build and Test/test ] | > assert_frame_equal(X_new.to_pandas(), X_expected) +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py:52: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:4897: in to_pandas +[Build and Test/test ] | return self._internal.to_pandas_frame.copy() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:578: in wrapped_lazy_property +[Build and Test/test ] | setattr(self, attr_name, fn(self)) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:934: in to_pandas_frame +[Build and Test/test ] | pdf = sdf.toPandas() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/pandas/conversion.py:157: in toPandas +[Build and Test/test ] | pdf = pd.DataFrame.from_records(self.collect(), columns=self.columns) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/dataframe.py:693: in collect +[Build and Test/test ] | sock_info = self._jdf.collectToPython() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/traceback_utils.py:78: in __exit__ +[Build and Test/test ] | self._context._jsc.setCallSite(None) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | ----------------------------- Captured stderr call ----------------------------- +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | WARNING:root:Found pyspark version "3.2.1" installed. The pyspark version 3.2 and above has a built-in "pandas APIs on Spark" module ported from Koalas. Try `import pyspark.pandas as ps` instead. +[Build and Test/test ] | +[Stage 1055:> (0 + 8) / 8] +---------------------------------------- +[Build and Test/test ] | Exception occurred during processing of request from ('127.0.0.1', 59518) +[Build and Test/test ] | Traceback (most recent call last): +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/socketserver.py", line 316, in _handle_request_noblock +[Build and Test/test ] | self.process_request(request, client_address) +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/socketserver.py", line 347, in process_request +[Build and Test/test ] | self.finish_request(request, client_address) +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/socketserver.py", line 360, in finish_request +[Build and Test/test ] | self.RequestHandlerClass(request, client_address, self) +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/socketserver.py", line 747, in __init__ +[Build and Test/test ] | self.handle() +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/accumulators.py", line 262, in handle +[Build and Test/test ] | poll(accum_updates) +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/accumulators.py", line 235, in poll +[Build and Test/test ] | if func(): +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/accumulators.py", line 239, in accum_updates +[Build and Test/test ] | num_updates = read_int(self.rfile) +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/serializers.py", line 564, in read_int +[Build and Test/test ] | raise EOFError +[Build and Test/test ] | EOFError +[Build and Test/test ] | ---------------------------------------- +[Build and Test/test ] | ------------------------------ Captured log call ------------------------------- +[Build and Test/test ] | ERROR root:java_gateway.py:1055 Exception while sending command. +[Build and Test/test ] | Traceback (most recent call last): +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py", line 480, in send_command +[Build and Test/test ] | raise Py4JNetworkError("Answer from Java side is empty") +[Build and Test/test ] | py4j.protocol.Py4JNetworkError: Answer from Java side is empty +[Build and Test/test ] | +[Build and Test/test ] | During handling of the above exception, another exception occurred: +[Build and Test/test ] | +[Build and Test/test ] | Traceback (most recent call last): +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py", line 1038, in send_command +[Build and Test/test ] | response = connection.send_command(command) +[Build and Test/test ] | File "/opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py", line 503, in send_command +[Build and Test/test ] | raise Py4JNetworkError(Numeric +[Build and Test/test ] | py4j.protocol.Py4JNetworkError: Error while sending or receiving +[Build and Test/test ] | ____________________ test_check_dataframe_contains_numerics ____________________ +[Build and Test/test ] | Numeric +[Build and Test/test ] | @pytest.mark.pysparkNumeric +[Build and Test/test ] | def test_check_dataframe_contains_numerics(): +[Build and Test/test ] | > Transformer.check_dataframe_contains_numerics(ks.DataFrame({"A": [1], "B": ["b"]})) +[Build and Test/test ] | +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py:23: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________________ test_checks __________________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.mark.pyspark +[Build and Test/test ] | def test_checks(): +[Build and Test/test ] | > X = ks.DataFrame() +[Build and Test/test ] | +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py:28: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | _________________________________ test_checks __________________________________ +[Build and Test/test ] | +[Build and Test/test ] | @pytest.mark.pyspark +[Build and Test/test ] | def test_checks(): +[Build and Test/test ] | with pytest.raises(TypeError): +[Build and Test/test ] | TransformerXY.check_dataframe([]) +[Build and Test/test ] | with pytest.raises(TypeError): +[Build and Test/test ] | > TransformerXY.check_dataframe(ks.DataFrame({"A": [1], 0: ["x"]})) +[Build and Test/test ] | +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_ks.py:14: +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:510: in __init__ +[Build and Test/test ] | internal = InternalFrame.from_pandas(pdf) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/internal.py:1364: in from_pandas +[Build and Test/test ] | sdf = default_session().createDataFrame(pdf, schema=schema) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/utils.py:456: in default_session +[Build and Test/test ] | session = builder.getOrCreate() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/session.py:233: in getOrCreate +[Build and Test/test ] | session._jsparkSession.sessionState().conf().setConfString(key, value) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1320: in __call__ +[Build and Test/test ] | answer = self.gateway_client.send_command(command) +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/java_gateway.py:1036: in send_command +[Build and Test/test ] | connection = self._get_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:281: in _get_connection +[Build and Test/test ] | connection = self._create_new_connection() +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:288: in _create_new_connection +[Build and Test/test ] | connection.connect_to_java_server() +[Build and Test/test ] | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +[Build and Test/test ] | +[Build and Test/test ] | self = +[Build and Test/test ] | +[Build and Test/test ] | def connect_to_java_server(self): +[Build and Test/test ] | try: +[Build and Test/test ] | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +[Build and Test/test ] | if self.java_parameters.read_timeout: +[Build and Test/test ] | self.socket.settimeout(self.java_parameters.read_timeout) +[Build and Test/test ] | if self.ssl_context: +[Build and Test/test ] | self.socket = self.ssl_context.wrap_socket( +[Build and Test/test ] | self.socket, server_hostname=self.java_address) +[Build and Test/test ] | > self.socket.connect((self.java_address, self.java_port)) +[Build and Test/test ] | E ConnectionRefusedError: [Errno 111] Connection refused +[Build and Test/test ] | +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/py4j/clientserver.py:402: ConnectionRefusedError +[Build and Test/test ] | =============================== warnings summary =============================== +[Build and Test/test ] | ../../../../opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/xgboost-1.5.2-py3.9-linux-x86_64.egg/xgboost/compat.py:36 +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/xgboost-1.5.2-py3.9-linux-x86_64.egg/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead. +[Build and Test/test ] | from pandas import MultiIndex, Int64Index +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_dd.py::test_num_dd +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_dd.py::test_num_dd_np +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py::test_num_ks +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py::test_num_ks_np +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_pd.py::test_num_pd +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_pd.py::test_num_pd_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/binning/bin_rare_categories.py:102: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `BinRareCategories` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py: 639 warnings +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_ks.py: 82 warnings +[Build and Test/test ] | gators/binning/tests/test_binning_ks.py: 2197 warnings +[Build and Test/test ] | gators/binning/tests/test_custom_binning_ks.py: 1318 warnings +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_ks.py: 1367 warnings +[Build and Test/test ] | gators/binning/tests/test_tree_binning_ks.py: 524 warnings +[Build and Test/test ] | gators/clipping/tests/test_clipping_ks.py: 496 warnings +[Build and Test/test ] | gators/converter/tests/test_to_numpy_ks.py: 18 warnings +[Build and Test/test ] | gators/converter/tests/test_to_pandas_ks.py: 18 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 129 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_ks.py: 20 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 30 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 124 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 248 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 85 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_ks.py: 20 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_ks.py: 28 warnings +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py: 239 warnings +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py: 2440 warnings +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py: 329 warnings +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py: 465 warnings +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py: 457 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_ks.py: 3876 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 1006 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_ks.py: 339 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_ks.py: 429 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_ks.py: 302 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_ks.py: 1584 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_ks.py: 746 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_ks.py: 191 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 1262 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 882 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 877 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 877 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 957 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_ks.py: 822 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 412 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 417 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 412 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 412 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 412 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_ks.py: 106 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_ks.py: 133 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py: 129 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py: 16 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py: 10 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py: 10 warnings +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py: 58 warnings +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py: 10 warnings +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py: 17 warnings +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py: 25 warnings +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py: 12 warnings +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py: 24 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py: 2 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_ks.py: 2 warnings +[Build and Test/test ] | gators/util/tests/test_util_ks.py: 18 warnings +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/typedef/typehints.py:158: DeprecationWarning: Converting `np.character` to a dtype is deprecated. The current result is `np.dtype(np.str_)` which is not strictly correct. Note that `np.character` is generally deprecated and 'S1' should be used. +[Build and Test/test ] | elif tpe in (bytes, np.character, np.bytes_, np.string_): +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py: 1254 warnings +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_ks.py: 177 warnings +[Build and Test/test ] | gators/binning/tests/test_binning_ks.py: 3518 warnings +[Build and Test/test ] | gators/binning/tests/test_custom_binning_ks.py: 2053 warnings +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_ks.py: 2153 warnings +[Build and Test/test ] | gators/binning/tests/test_tree_binning_ks.py: 813 warnings +[Build and Test/test ] | gators/clipping/tests/test_clipping_ks.py: 741 warnings +[Build and Test/test ] | gators/converter/tests/test_to_numpy_ks.py: 26 warnings +[Build and Test/test ] | gators/converter/tests/test_to_pandas_ks.py: 26 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 197 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_ks.py: 32 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 48 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 245 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 412 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 171 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_ks.py: 32 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_ks.py: 53 warnings +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py: 396 warnings +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py: 3878 warnings +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py: 580 warnings +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py: 854 warnings +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py: 874 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_ks.py: 7208 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 1512 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_ks.py: 477 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_ks.py: 678 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_ks.py: 554 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_ks.py: 2390 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_ks.py: 1144 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_ks.py: 414 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 2001 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 1431 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 1426 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 1426 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 1546 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_ks.py: 1310 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 696 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_ks.py: 187 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_ks.py: 244 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py: 240 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py: 16 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py: 10 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py: 10 warnings +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py: 58 warnings +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py: 10 warnings +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py: 17 warnings +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py: 25 warnings +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py: 12 warnings +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py: 24 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py: 2 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_ks.py: 2 warnings +[Build and Test/test ] | gators/util/tests/test_util_ks.py: 18 warnings +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/typedef/typehints.py:161: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here. +[Build and Test/test ] | Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations +[Build and Test/test ] | elif tpe in (bool, np.bool, "bool", "?"): +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py: 1137 warnings +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_ks.py: 177 warnings +[Build and Test/test ] | gators/binning/tests/test_binning_ks.py: 3518 warnings +[Build and Test/test ] | gators/binning/tests/test_custom_binning_ks.py: 2053 warnings +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_ks.py: 2153 warnings +[Build and Test/test ] | gators/binning/tests/test_tree_binning_ks.py: 813 warnings +[Build and Test/test ] | gators/clipping/tests/test_clipping_ks.py: 741 warnings +[Build and Test/test ] | gators/converter/tests/test_to_numpy_ks.py: 26 warnings +[Build and Test/test ] | gators/converter/tests/test_to_pandas_ks.py: 26 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 160 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_ks.py: 32 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 48 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 245 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 356 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 171 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_ks.py: 32 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_ks.py: 53 warnings +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py: 396 warnings +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py: 2858 warnings +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py: 580 warnings +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py: 854 warnings +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py: 874 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_ks.py: 7208 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 1512 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_ks.py: 429 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_ks.py: 628 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_ks.py: 434 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_ks.py: 2390 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_ks.py: 1144 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_ks.py: 414 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 2001 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 1431 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 1426 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 1426 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 1546 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_ks.py: 1310 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 696 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_ks.py: 187 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_ks.py: 244 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py: 240 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py: 16 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py: 10 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py: 8 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py: 10 warnings +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py: 58 warnings +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py: 10 warnings +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py: 17 warnings +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py: 25 warnings +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py: 12 warnings +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py: 24 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py: 2 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_ks.py: 2 warnings +[Build and Test/test ] | gators/util/tests/test_util_ks.py: 18 warnings +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/typedef/typehints.py:172: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here. +[Build and Test/test ] | Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations +[Build and Test/test ] | elif tpe in (float, np.float, np.float64, "float", "float64", "double"): +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_rare_categories_ks.py: 1129 warnings +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_ks.py: 175 warnings +[Build and Test/test ] | gators/binning/tests/test_binning_ks.py: 2830 warnings +[Build and Test/test ] | gators/binning/tests/test_custom_binning_ks.py: 1837 warnings +[Build and Test/test ] | gators/binning/tests/test_quantile_binning_ks.py: 1853 warnings +[Build and Test/test ] | gators/binning/tests/test_tree_binning_ks.py: 675 warnings +[Build and Test/test ] | gators/clipping/tests/test_clipping_ks.py: 563 warnings +[Build and Test/test ] | gators/converter/tests/test_to_numpy_ks.py: 17 warnings +[Build and Test/test ] | gators/converter/tests/test_to_pandas_ks.py: 17 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 136 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_columns_ks.py: 25 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 42 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 245 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 279 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 153 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_keep_columns_ks.py: 25 warnings +[Build and Test/test ] | gators/data_cleaning/tests/test_replace_ks.py: 53 warnings +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py: 326 warnings +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py: 2799 warnings +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py: 506 warnings +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py: 746 warnings +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py: 774 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_cluster_statistics_ks.py: 4967 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 946 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_equal_ks.py: 307 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_is_null_ks.py: 444 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_ks.py: 434 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_plane_rotation_ks.py: 1526 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_features_ks.py: 724 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_polynomial_object_features_ks.py: 414 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 1726 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 1241 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 1236 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 1236 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 1356 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_delta_time_ks.py: 1152 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 696 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 691 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_ks.py: 157 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_lower_case_ks.py: 214 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py: 213 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_contains_ks.py: 4 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_length_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_generation_str/tests/test_upper_case_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_ks.py: 6 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_information_value_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_model_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_select_from_models_ks.py: 2 warnings +[Build and Test/test ] | gators/feature_selection/tests/test_variance_filter_ks.py: 6 warnings +[Build and Test/test ] | gators/imputers/tests/test_imputers_ks.py: 30 warnings +[Build and Test/test ] | gators/model_building/tests/test_model_ks.py: 2 warnings +[Build and Test/test ] | gators/model_building/tests/test_train_test_split_ks.py: 17 warnings +[Build and Test/test ] | gators/pipeline/tests/test_pipeline_ks.py: 5 warnings +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/sampling/tests/test_unsupervised_sampling_ks.py: 6 warnings +[Build and Test/test ] | gators/scalers/tests/test_minmax_scaler_ks.py: 12 warnings +[Build and Test/test ] | gators/scalers/tests/test_standard_scaler_ks.py: 4 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_ks.py: 2 warnings +[Build and Test/test ] | gators/transformers/tests/test_transformer_xy_ks.py: 2 warnings +[Build and Test/test ] | gators/util/tests/test_util_ks.py: 9 warnings +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/typedef/typehints.py:178: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information. +[Build and Test/test ] | Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations +[Build and Test/test ] | elif tpe in (int, np.int, np.int64, "int", "int64", "long"): +[Build and Test/test ] | +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_pd.py::test__num_pd +[Build and Test/test ] | gators/binning/tests/test_bin_single_target_class_categories_pd.py::test_pd__num_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/binning/bin_single_target_class_categories.py:112: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `BinSingleTargetClassCategories` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 7 warnings +[Build and Test/test ] | gators/feature_generation/tests/test_one_hot_ks.py: 12 warnings +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/pandas/conversion.py:238: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here. +[Build and Test/test ] | Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations +[Build and Test/test ] | return np.bool +[Build and Test/test ] | +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py::test_no_object_ks +[Build and Test/test ] | gators/data_cleaning/tests/test_drop_high_cardinality_ks.py::test_no_object_ks_np +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/databricks/koalas/frame.py:6359: FutureWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning. +[Build and Test/test ] | return pd.Series( +[Build and Test/test ] | +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py::test_ks +[Build and Test/test ] | gators/encoders/tests/test_binned_columns_encoder_ks.py::test_inplace_ks +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py::test_ks +[Build and Test/test ] | gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py::test_ks +[Build and Test/test ] | gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py::test_ks +[Build and Test/test ] | gators/feature_generation_str/tests/test_extract_ks.py::test_ks +[Build and Test/test ] | gators/feature_generation_str/tests/test_split_extract_ks.py::test_ks +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/pyspark/sql/pandas/functions.py:389: UserWarning: In Python 3.6+ and Spark 3.0+, it is preferred to specify type hints for pandas UDF instead of specifying pandas UDF type which will be deprecated in the future releases. See SPARK-28264 for more details. +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_dd.py::test_without_cat_dd +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_dd.py::test_without_cat_dd_np +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py::test_without_cat_ks +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_ks.py::test_without_cat_ks_np +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_pd.py::test_without_cat_pd +[Build and Test/test ] | gators/encoders/tests/test_onehot_encoder_pd.py::test_without_cat_pd_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/encoders/onehot_encoder.py:92: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `OneHotEncoder` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_dd.py::test_no_cat_dd +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_dd.py::test_no_cat_dd_np +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py::test_no_cat_ks +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_ks.py::test_no_cat_ks_np +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_pd.py::test_no_cat_pd +[Build and Test/test ] | gators/encoders/tests/test_ordinal_encoder_pd.py::test_no_cat_pd_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/encoders/ordinal_encoder.py:92: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `OrdinalEncoder` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_dd.py::test_no_cat_dd +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_dd.py::test_no_cat_dd_np +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py::test_no_cat_ks +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_ks.py::test_no_cat_ks_np +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_pd.py::test_no_cat_pd +[Build and Test/test ] | gators/encoders/tests/test_target_encoder_pd.py::test_no_cat_pd_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/encoders/target_encoder.py:99: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `TargetEncoder` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_dd.py::test_no_cat_dd +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_dd.py::test_no_cat_dd_np +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py::test_no_cat_ks +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_ks.py::test_no_cat_ks_np +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_pd.py::test_no_cat_pd +[Build and Test/test ] | gators/encoders/tests/test_woe_encoder_pd.py::test_no_cat_pd_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/encoders/woe_encoder.py:108: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `WOEEncoder` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd_np +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_pd.py::test_pd +[Build and Test/test ] | gators/feature_selection/tests/test_correlation_filter_pd.py::test_pd_np +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/feature_selection/correlation_filter.py:87: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here. +[Build and Test/test ] | Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations +[Build and Test/test ] | corr.where(np.tril(np.ones(corr.shape), k=-1).astype(np.bool)) +[Build and Test/test ] | +[Build and Test/test ] | gators/imputers/tests/test_imputers_pd.py::test_empty_columns_object +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/imputers/object_imputer.py:154: UserWarning: `X` does not contain object columns: +[Build and Test/test ] | `ObjectImputer` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | Numeric +[Build and Test/test ] | gators/imputers/tesNumericimputers_pd.py::test_num_idx_columns_empty +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/imputers/numerics_imputer.py:140: UserWarning: `X` does not contain numerical columns, +[Build and Test/test ] | `NumericsImputer` is not needed +[Build and Test/test ] | warnings.warn( +[Build and Test/test ] | +[Build and Test/test ] | gators/model_building/tests/test_xgb_booster_builder.py::test_num_class +[Build and Test/test ] | gators/model_building/tests/test_xgb_booster_builder.py::test_input +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/xgboost-1.5.2-py3.9-linux-x86_64.egg/xgboost/sklearn.py:1224: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1]. +[Build and Test/test ] | warnings.warn(label_encoder_deprecation_msg, UserWarning) +[Build and Test/test ] | +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +[Build and Test/test ] | /Users/cpoli/opensource/gators/gators/sampling/supervised_sampling.py:115: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected. +[Build and Test/test ] | Before: .apply(func) +[Build and Test/test ] | After: .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result +[Build and Test/test ] | or: .apply(func, meta=('x', 'f8')) for series result +[Build and Test/test ] | Xy.groupby(y.name) +[Build and Test/test ] | +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +[Build and Test/test ] | gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +[Build and Test/test ] | /opt/hostedtoolcache/Python/3.9.10/x64/lib/python3.9/site-packages/partd/pandas.py:113: DeprecationWarning: The Index._get_attributes_dict method is deprecated, and will be removed in a future version +[Build and Test/test ] | header = (type(ind), ind._get_attributes_dict(), values.dtype, cat) +[Build and Test/test ] | +[Build and Test/test ] | -- Docs: https://docs.pytest.org/en/stable/warnings.html +[Build and Test/test ] | =========================== short test summary info ============================Numeric +[Build and Test/test ] | FAILED gators/feature_generation_str/tests/test_split_extract_ks.py::test_ks +[Build and Test/test ] | FAILED gators/transformers/tests/test_transformer_ks.py::test_check_dataframe_contains_numerics +[Build and Test/test ] | FAILED gators/transformers/tests/test_transformer_ks.py::test_checks - Connec... +[Build and Test/test ] | FAILED gators/transformers/tests/test_transformer_xy_ks.py::test_checks - Con... +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_split_extract_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_contains_ks.py::test_ks +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_contains_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_contains_ks.py::test_names_ks +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_contains_ks.py::test_names_ks_np +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_length_ks.py::test_ks +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_length_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_upper_case_ks.py::test_ks - Co... +[Build and Test/test ] | ERROR gators/feature_generation_str/tests/test_upper_case_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_correlation_filter_ks.py::test_ks +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_correlation_filter_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_information_value_ks.py::test_ks - ... +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_information_value_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_select_from_model_ks.py::test_ks - ... +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_select_from_model_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_select_from_models_ks.py::test_ks +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_select_from_models_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_variance_filter_ks.py::test_ks - Co... +[Build and Test/test ] | ERROR gators/feature_selection/tests/test_variance_filter_ks.py::test_ks_np +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_int_ks - ConnectionRefu... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_float_ks - ConnectionRe... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_object_ks - ConnectionR... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_int_ks_np - ConnectionR... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_float_ks_np - Connectio... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_object_ks_np - Connecti... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_num_int_ks - Connection... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_num_float_ks - Connecti... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_num_int_ks_np - Connect... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_num_float_ks_np - Conne... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_no_missing_int_ks - Con... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_no_missing_float_ks - C... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_no_missing_object_ks - ... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_no_missing_int_ks_np - ... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_no_missing_float_ks_np +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_no_missing_object_ks_np +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_full_ks - ConnectionRef... +[Build and Test/test ] | ERROR gators/imputers/tests/test_imputers_ks.py::test_full_ks_np - Connection... +[Build and Test/test ] | ERROR gators/model_building/tests/test_model_ks.py::test_predict - Connection... +[Build and Test/test ] | ERROR gators/model_building/tests/test_model_ks.py::test_predict_proba - Conn... +[Build and Test/test ] | ERROR gators/model_building/tests/test_train_test_split_ks.py::test_ordered_ks +[Build and Test/test ] | ERROR gators/model_building/tests/test_train_test_split_ks.py::test_random_ks +[Build and Test/test ] | ERROR gators/model_building/tests/test_train_test_split_ks.py::test_stratified_ks +[Build and Test/test ] | ERROR gators/pipeline/tests/test_pipeline_ks.py::test_pipeline_fit_and_transform_ks +[Build and Test/test ] | ERROR gators/pipeline/tests/test_pipeline_ks.py::test_fit_transform_pipeline_ks +[Build and Test/test ] | ERROR gators/pipeline/tests/test_pipeline_ks.py::test_pipeline_predict_ks - C... +[Build and Test/test ] | ERROR gators/pipeline/tests/test_pipeline_ks.py::test_pipeline_predict_proba_ks +[Build and Test/test ] | ERROR gators/pipeline/tests/test_pipeline_ks.py::test_pipeline_np_ks - Connec... +[Build and Test/test ] | ERROR gators/sampling/tests/test_supervised_sampling_ks.py::test_ks - Connect... +[Build and Test/test ] | ERROR gators/sampling/tests/test_unsupervised_sampling_ks.py::test_ks - Conne... +[Build and Test/test ] | ERROR gators/scalers/tests/test_minmax_scaler_ks.py::test_ks - ConnectionRefu... +[Build and Test/test ] | ERROR gators/scalers/tests/test_minmax_scaler_ks.py::test_ks_np - ConnectionR... +[Build and Test/test ] | ERROR gators/scalers/tests/test_standard_scaler_ks.py::test_ks - ConnectionRe... +[Build and Test/test ] | ERROR gators/scalers/tests/test_standard_scaler_ks.py::test_ks_np - Connectio... +[Build and Test/test ] | ERROR gators/scalers/tests/test_standard_scaler_ks.py::test_float32_ks - Conn... +[Build and Test/test ] | ERROR gators/scalers/tests/test_standard_scaler_ks.py::test_float32_ks_np - C... +[Build and Test/test ] | ERROR gators/util/tests/test_util_ks.py::test_get_datatype_columns_object_ks +[Build and Test/test ] | ERROR gators/util/tests/test_util_ks.py::test_concat_ks - ConnectionRefusedEr... +[Build and Test/test ] | ERROR gators/util/tests/test_util_ks.py::test_fillna - ConnectionRefusedError... +[Build and Test/test ] | ==== 4 failed, 782 passed, 156673 warnings, 58 errors in 167.16s (0:02:47) ===== +[Build and Test/test ] ❌ Failure - tests diff --git a/benchmarks/benchmark.py b/benchmarks/benchmark.py new file mode 100644 index 00000000..4ab4e5bb --- /dev/null +++ b/benchmarks/benchmark.py @@ -0,0 +1,332 @@ +# License: Apache-2.0 +from typing import List + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from IPython import get_ipython + +from gators.transformers import Transformer + + +def get_runtime_in_milliseconds(ipynb_benchmark: str) -> float: + """Return the runtime in seconds. + + Parameters + ---------- + ipynb_benchmark : str + Output of the jupyter + timeit magic command. + + Returns + ------- + float: + Runtime in milliseconds. + """ + if not isinstance(ipynb_benchmark, str): + raise TypeError("`ipynb_benchmark` should be a str") + dump = ipynb_benchmark.split(" ± ")[0].split(" ") + if "s" not in ipynb_benchmark: + raise ValueError("`ipynb_benchmark` format not supported") + if "min" in dump[0]: + return float(dump[0][:-3]) * 1e3 + + val = float(dump[0]) + t_unit = dump[1] + if "ms" in t_unit: + return val + if "ms" in t_unit: + return val + if "µs" in t_unit: + return val * 1e-3 + if "ns" in t_unit: + return val * 1e-6 + if "s" in t_unit: + return val * 1e3 + + +def generate_per_sample_benchmarking( + objs: List[Transformer], + Xs: List[pd.DataFrame], + extra_info_X_vec: List[str] = None, + extra_info_O_vec: List[str] = None, + ys: List[np.ndarray] = None, + timeit_args="", +) -> pd.DataFrame: + """Calculate the per-sample benchmarking. + + Parameters + ---------- + objs List[Transformer]: + List of transformers. + Xs List[pd.DataFrame]: + List of dataFrames. + ys List[pd.Series], default None: + List of target values. + + + Returns + ------- + pd.DataFrame: + Benchmarking results. + """ + if ys is None: + ys = len(Xs) * [None] + if not extra_info_O_vec: + index = [ + f"{obj.__class__.__name__}{extra_info_X}" + for obj, extra_info_X in zip(objs, extra_info_X_vec) + ] + elif not extra_info_X_vec: + index = [ + f"{obj.__class__.__name__}{extra_info_O}" + for obj, extra_info_O in zip(objs, extra_info_O_vec) + ] + else: + index = [ + f"{obj.__class__.__name__}{extra_info_O}{extra_info_X}" + for obj, extra_info_O, extra_info_X in zip( + objs, extra_info_X_vec, extra_info_O_vec + ) + ] + columns = ["pandas", "numpy"] + results = pd.DataFrame(np.nan, columns=columns, index=index) + if not extra_info_O_vec: + extra_info_O_vec = len(objs) * [""] + if not extra_info_X_vec: + extra_info_X_vec = len(Xs) * [""] + for i, (obj, extra_info_O) in enumerate(zip(objs, extra_info_O_vec)): + for X, y, extra_info_X in zip(Xs, ys, extra_info_X_vec): + mask = pd.Series({c: True for c in X.columns if c.startswith("Dates")}) + X_row = X.iloc[[0]].copy() + X_row_np = X_row.to_numpy().copy() + + if ( + mask.sum() + ): # ensure that the input datatype is an object for NumPy and a datetime for Pandas + X = X.astype(object) + X_row = X.iloc[[0]].copy() + X_row_np = X_row.to_numpy().copy() + cols = mask[mask].index + X[cols] = X[cols].astype("datetime64[ns]") + X_row[cols] = X_row[cols].astype("datetime64[ns]") + _ = obj.fit(X.copy(), y) + dummy = get_ipython().run_line_magic( + "timeit", f"-o {timeit_args} -q obj.transform(X_row.copy())" + ) + results.loc[ + f"{obj.__class__.__name__}{extra_info_O}{extra_info_X}", "pandas" + ] = get_runtime_in_milliseconds(str(dummy)) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" + ) + results.loc[ + f"{obj.__class__.__name__}{extra_info_O}{extra_info_X}", "numpy" + ] = get_runtime_in_milliseconds(str(dummy)) + return results + + +def benchmark_with_same_X( + objs: List[Transformer], + X: pd.DataFrame, + info_vec: List[str], + y: pd.Series = None, + timeit_args="", +) -> pd.DataFrame: + index = [f"{obj.__class__.__name__}{info}" for obj, info in zip(objs, info_vec)] + columns = ["pandas", "numpy"] + results = pd.DataFrame(np.nan, columns=columns, index=index) + for obj, info in zip(objs, info_vec): + idx = f"{obj.__class__.__name__}{info}" + X_row = X.iloc[[0]].copy() + X_row_np = X_row.to_numpy() + _ = obj.fit(X.copy(), y) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform(X_row)" + ) + results.loc[idx, "pandas"] = get_runtime_in_milliseconds(str(dummy)) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" + ) + results.loc[idx, "numpy"] = get_runtime_in_milliseconds(str(dummy)) + return results + + +def benchmark( + objs: object, + Xs: List[pd.DataFrame], + info_vec: List[str], + y: pd.Series = None, + timeit_args="", +) -> pd.DataFrame: + + index = [f"{obj.__class__.__name__}{info}" for obj, info in zip(objs, info_vec)] + columns = ["pandas", "numpy"] + bench = pd.DataFrame(np.nan, columns=columns, index=index) + + for obj, X, info in zip(objs, Xs, info_vec): + idx = f"{obj.__class__.__name__}{info}" + X_row = X.iloc[[0]].copy() + X_row_np = X_row.to_numpy() + _ = obj.fit(X.copy(), y) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform(X_row)" + ) + bench.loc[idx, "pandas"] = get_runtime_in_milliseconds(str(dummy)) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" + ) + bench.loc[idx, "numpy"] = get_runtime_in_milliseconds(str(dummy)) + return bench + + +def benchmark_with_same_obj( + obj: object, + Xs: List[pd.DataFrame], + info_vec: List[str], + y: pd.Series = None, + timeit_args="", +) -> pd.DataFrame: + + index = [f"{obj.__class__.__name__}{info}" for info in info_vec] + columns = ["pandas", "numpy"] + results = pd.DataFrame(np.nan, columns=columns, index=index) + for X, info in zip(Xs, info_vec): + idx = f"{obj.__class__.__name__}{info}" + X_row = X.iloc[[0]].copy() + X_row_np = X_row.to_numpy() + _ = obj.fit(X.copy(), y) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform(X_row)" + ) + results.loc[idx, "pandas"] = get_runtime_in_milliseconds(str(dummy)) + dummy = get_ipython().run_line_magic( + "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" + ) + results.loc[idx, "numpy"] = get_runtime_in_milliseconds(str(dummy)) + return results + + +def plot_comparison(bench_dict): + for key, val in bench_dict.items(): + column = "column" if key == 1 else "columns" + (val[columns] * 1e-3).plot.bar( + logy=True, + ylabel="runtime (s)", + xlabel="trasformer", + rot=90, + color=["#c73d22", "#0077ea"], + legend=True, + figsize=[5 * 1.61, 5], + title=f"per-sample transform vs transform_numpy\n datetime feature generation - {key} {column}", + width=0.75, + fontsize=10, + ) + plt.show() + + +def plot_ratios(bench_dict): + for key, val in bench_dict.items(): + ratio = val["pandas"] / val["numpy"] + column = "column" if key == 1 else "columns" + ax = ratio.plot.bar( + rot=90, + color=["#0077ea"], + legend=False, + figsize=[5 * 1.61, 5], + title=f"per-sample transform vs transform_numpy\n datetime feature generation - {key} {column}", + width=0.75, + fontsize=10, + ) + for p in ax.patches: + ax.annotate( + f"{round(p.get_height())}X", + (p.get_x() * 1 + 0.25, p.get_height() * 1.02), + ) + ax.spines["top"].set_visible(False) + ax.spines["right"].set_visible(False) + ax.spines["bottom"].set_visible(False) + ax.spines["left"].set_visible(False) + ax.get_yaxis().set_ticks([]) + plt.show() + + +def plot_all(bench_dict): + # key = list(bench_dict.keys())[-1] + # val = bench_dict[key] + # columns = (val['pandas']/val['numpy']).sort_values().index + for key, val in bench_dict.items(): + fig, ax = plt.subplots(1, 2, figsize=[18, 8]) + column = "column" if key == 1 else "columns" + val.index = val.index.str.split("_").str[0] + (val * 1e-3).plot.bar( + ax=ax[0], + logy=True, + ylabel="runtime (s)", + xlabel="transformers", + rot=90, + color=["#c73d22", "#0077ea"], + legend=True, + figsize=[5 * 1.61, 5], + width=0.75, + fontsize=10, + ylim=[1e-6, 1], + ) + (val["pandas"] / val["numpy"]).plot.bar( + ax=ax[1], + rot=90, + color=["#0077ea"], + legend=False, + figsize=[5 * 1.61, 5], + ylabel="runtime speed-up", + xlabel="transformers", + width=0.75, + fontsize=10, + ) + for p in ax[1].patches: + ax[1].annotate( + f"{round(p.get_height())}X", + (p.get_x() + p.get_width() / 2.0, p.get_height()), + ha="center", + va="center", + xytext=(0, 10), + textcoords="offset points", + ) + + ax[1].spines["top"].set_visible(False) + ax[1].spines["right"].set_visible(False) + ax[1].spines["bottom"].set_visible(False) + ax[1].spines["left"].set_visible(False) + ax[1].get_yaxis().set_ticks([]) + + title = f"""per-sample transform vs transform_numpy - {key} {column}""" + plt.suptitle(title, fontsize=12) + plt.tight_layout() + plt.show() + + +def run_X(objs, X, columns, n_vec=[1, 10, 100], y=None, timeit_args=""): + bench_dict = {} + if y is None: + ys = None + else: + ys = [y] + for n in n_vec: + if n == 1: + bench_dict[1] = generate_per_sample_benchmarking( + objs, [X], extra_info_X_vec=["_1column"], ys=ys, timeit_args=timeit_args + ) + + else: + XN = X.copy() + for col in columns: + for i in range(n - 1): + XN[f"{col}{i}"] = X[col].copy() + bench_dict[n] = generate_per_sample_benchmarking( + objs, + [XN], + extra_info_X_vec=[f"_{n}column"], + ys=ys, + timeit_args=timeit_args, + ) + return bench_dict diff --git a/benchmarks/benchmark_fit_transform.csv b/benchmarks/benchmark_fit_transform.csv new file mode 100644 index 00000000..520fd57f --- /dev/null +++ b/benchmarks/benchmark_fit_transform.csv @@ -0,0 +1,43 @@ +,pandas,dask,koalas +DropLowCardinality,811.0,319.0,9360.0 +DropHighCardinality,1480.0,1130.0,9810.0 +DropDatatypeColumns,116.0,97.0,10.3 +DropColumns,43.5,56.0,4.34 +KeepColumns,42.2,56.0,3.48 +DropHighNaNRatio,349.0,333.0,6430.0 +SupervisedSampling,1020.0,46.8,43500.0 +UnsupervisedSampling,971.0,38.1,18600.0 +MinMaxScaler,108.0,126.0,12200.0 +StandardScaler,155.0,213.0,12600.0 +SplitExtract,8870.0,4890.0,79.3 +Extract,3170.0,2020.0,47.3 +Contains,2110.0,1240.0,35.0 +Length,3600.0,2330.0,102.0 +LowerCase,2950.0,1950.0,71.6 +UpperCase,3730.0,2390.0,86.9 +PlaneRotation,249.0,137.0,79.7 +ClusterStatistics,1090.0,344.0,9990.0 +ElementaryArithmetics,133.0,146.0,41.0 +IsNull,56.1,77.7,16.8 +IsEqual,570.0,1220.0,61.9 +OneHot,817.0,3290.0,103.0 +PolynomialFeatures,345.0,4610.0,52.8 +WOEEncoder,4010.0,24100.0,28000.0 +TargetEncoder,3980.0,25400.0,27800.0 +OrdinalEncoder,10500.0,14200.0,7860.0 +CyclicMinuteOfHour,503.0,5630.0,65.3 +CyclicHourOfDay,483.0,5560.0,47.2 +CyclicDayOfMonth,776.0,5730.0,130.0 +CyclicDayOfWeek,526.0,5560.0,48.4 +CyclicMonthOfYear,497.0,5740.0,56.4 +OrdinalMinuteOfHour,279.0,5470.0,12.8 +OrdinalDayOfMonth,277.0,5500.0,12.4 +OrdinalMonthOfYear,300.0,5550.0,12.2 +OrdinalDayOfWeek,320.0,5690.0,23.8 +OrdinalHourOfDay,274.0,5710.0,12.2 +BinRareCategories,1020.0,12400.0,20600.0 +Binning,379.0,17100.0,28300.0 +QuantileBinning,644.0,11600.0,17500.0 +TreeBinning,17000.0,25100.0,12000.0 +NumericImputer,84.1,12700.0,8500.0 +ObjectImputer,726.0,13600.0,11400.0 diff --git a/benchmarks/benchmark_fit_transform.ipynb b/benchmarks/benchmark_fit_transform.ipynb new file mode 100644 index 00000000..441359dc --- /dev/null +++ b/benchmarks/benchmark_fit_transform.ipynb @@ -0,0 +1,1093 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c696d1ca", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "620cd91c", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "\n", + "from gators.util import benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "38a2bfd5", + "metadata": {}, + "outputs": [], + "source": [ + "from gators.util import util\n", + "\n", + "# sampling\n", + "from gators.sampling import SupervisedSampling, UnsupervisedSampling\n", + "\n", + "# converter\n", + "# data cleaning\n", + "from gators.data_cleaning import (\n", + " ConvertColumnDatatype,\n", + " DropHighNaNRatio,\n", + " DropLowCardinality,\n", + " DropHighCardinality,\n", + " DropDatatypeColumns,\n", + " DropColumns,\n", + " KeepColumns,\n", + ")\n", + "\n", + "# imputers\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "from gators.scalers import (\n", + " StandardScaler,\n", + " MinMaxScaler,\n", + ")\n", + "\n", + "# encoders\n", + "from gators.encoders import (\n", + " OneHotEncoder,\n", + " WOEEncoder,\n", + " TargetEncoder,\n", + " OrdinalEncoder,\n", + ")\n", + "\n", + "# clipping\n", + "from gators.clipping import Clipping\n", + "\n", + "# binning\n", + "from gators.binning import (\n", + " BinRareCategories,\n", + " QuantileBinning,\n", + " TreeBinning,\n", + " CustomBinning,\n", + " Binning,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import (\n", + " ClusterStatistics,\n", + " ElementaryArithmetics,\n", + " PolynomialFeatures,\n", + " OneHot,\n", + " IsEqual,\n", + " IsNull,\n", + ")\n", + "from gators.feature_generation_str import (\n", + " Contains,\n", + " Length,\n", + " Extract,\n", + " SplitExtract,\n", + " LowerCase,\n", + " UpperCase,\n", + ")\n", + "from gators.feature_generation_dt import (\n", + " CyclicMinuteOfHour,\n", + " CyclicHourOfDay,\n", + " CyclicDayOfMonth,\n", + " CyclicDayOfWeek,\n", + " CyclicMonthOfYear,\n", + " OrdinalMinuteOfHour,\n", + " OrdinalDayOfMonth,\n", + " OrdinalMonthOfYear,\n", + " OrdinalDayOfWeek,\n", + " OrdinalHourOfDay,\n", + " DeltaTime,\n", + ")\n", + "\n", + "# feature selection\n", + "from gators.feature_selection import (\n", + " InformationValue,\n", + " SelectFromModel,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import PlaneRotation\n", + "\n", + "# model building\n", + "from gators.model_building import (\n", + " TrainTestSplit,\n", + " XGBBoosterBuilder,\n", + " XGBTreeliteDumper,\n", + " LGBMTreeliteDumper,\n", + ")\n", + "\n", + "# pipeline\n", + "from gators.pipeline import Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "61c453a9", + "metadata": {}, + "outputs": [], + "source": [ + "def run_benchmark(X):\n", + " runtime_vec = []\n", + " class_name_vec = []\n", + "\n", + " # DATA CLEANING\n", + "\n", + " obj = DropHighNaNRatio(max_ratio=0.5)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = DropLowCardinality(min_categories=10)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = DropHighCardinality(max_categories=100)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict', 'Address']]).compute()\n", + " else:\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict', 'Address']])\n", + " )\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = DropDatatypeColumns(dtype=object)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Address']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = DropColumns(columns=[\"X\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = KeepColumns(columns_to_keep=[\"X\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + "\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # SAMPLING\n", + " if \"dask\" in str(type(X)):\n", + " frac_dict = (\n", + " (X[\"y_multiclass\"].value_counts(normalize=True) / 2).compute().to_dict()\n", + " )\n", + " else:\n", + " frac_dict = (X[\"y_multiclass\"].value_counts(normalize=True) / 2).to_dict()\n", + "\n", + " obj = SupervisedSampling(frac_dict=frac_dict)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new, y_new = obj.transform(X[['X']], X['y_multiclass'])\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new, y_new = obj.transform(X[['X']], X['y_multiclass'])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = UnsupervisedSampling(n_samples=5000000)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new, y_new = obj.transform(X[['X']], X['y_multiclass'])\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new, y_new = obj.transform(X[['X']], X['y_multiclass'])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # SCALERS\n", + "\n", + " obj = MinMaxScaler()\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = StandardScaler()\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # STRING FEATURE SELECTION\n", + "\n", + " obj = SplitExtract(columns=[\"Address\"], str_split_vec=[\"\\\\\"], idx_split_vec=[0])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = Extract(columns=[\"Address\"], i_min_vec=[0], i_max_vec=[10])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = Contains(columns=[\"Address\"], contains_vec=[\"/\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = Length(columns=[\"Address\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = LowerCase(columns=[\"Address\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = UpperCase(columns=[\"Address\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # FEATURE SELECTION\n", + "\n", + " obj = PlaneRotation(columns=[[\"X\", \"Y\"]], theta_vec=[45])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = ClusterStatistics(clusters_dict={\"dummy\": [\"X\", \"Y\"]})\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = ElementaryArithmetics(\n", + " columns_a=[\"X\"], columns_b=[\"Y\"], operator=\"+\", coef=0.1\n", + " )\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = IsNull(columns=[\"X\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X','Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = IsEqual(columns_a=[\"Descript\"], columns_b=[\"Resolution\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X)\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OneHot(\n", + " categories_dict={\"Descript\": [\"RESISTING ARREST\", \"VEHICLE, RECOVERED, AUTO\"]}\n", + " )\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X)\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = PolynomialFeatures(columns=[\"X\", \"Y\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Y']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X', 'Y']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # ENCODERS\n", + "\n", + " obj = WOEEncoder()\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_binary']).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_binary'])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = TargetEncoder()\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_binary']).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_binary'])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OrdinalEncoder()\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_multiclass']).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_multiclass'])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OneHotEncoder()\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # X['y_multiclass'] = X['y_multiclass'].where(X['y_multiclass'] < 9, 9)\n", + " # obj = MultiClassEncoder(WOEEncoder())\n", + " # class_name_vec.append(obj.__class__.__name__)\n", + " # print(obj.__class__.__name__)\n", + " # print(psutil.swap_memory())\n", + " # X['y_multiclass'] = X['y_multiclass'].where(X['y_multiclass'] < 9, 9)\n", + " # if 'dask' in str(type(X)):\n", + " # result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_multiclass']).compute()\n", + " # else:\n", + " # result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_multiclass'])\n", + " # runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # obj = RegressionEncoder(encoder=WOEEncoder(), binning=Binning(n_bins=10))\n", + " # class_name_vec.append(obj.__class__.__name__)\n", + " # print(obj.__class__.__name__)\n", + " # print(psutil.swap_memory())\n", + " # X['y_multiclass'] = X['y_multiclass'].where(X['y_multiclass'] < 9, 9)\n", + " # if 'dask' in str(type(X)):\n", + " # result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_regression']).compute()\n", + " # else:\n", + " # result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']], X['y_regression'])\n", + " # runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # DATETIME FEATURES\n", + " X[[\"Dates\"]] = X[[\"Dates\"]].astype(\"datetime64[ns]\")\n", + "\n", + " obj = CyclicMinuteOfHour(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = CyclicHourOfDay(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = CyclicDayOfMonth(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = CyclicDayOfWeek(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = CyclicMonthOfYear(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OrdinalMinuteOfHour(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OrdinalDayOfMonth(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OrdinalMonthOfYear(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OrdinalDayOfWeek(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = OrdinalHourOfDay(columns=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = DeltaTime(columns_a=[\"Dates\"], columns_b=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " # BINNING\n", + "\n", + " obj = BinRareCategories(min_ratio=0.003)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Address']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = Binning(n_bins=10, inplace=True)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = QuantileBinning(n_bins=10, inplace=True)\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=6, random_state=0, min_samples_leaf=500),\n", + " inplace=True,\n", + " )\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 1 X_new = obj.fit_transform(X[['X']], X['y_binary']).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 1 X_new = obj.fit_transform(X[['X']], X['y_binary'])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " if \"dask\" in str(type(X)):\n", + " X[[\"X\"]] = X[[\"X\"]].mask(X[\"Unnamed: 0\"] < 1000, np.nan)\n", + " X[[\"PdDistrict\"]] = X[[\"PdDistrict\"]].mask(X[\"Unnamed: 0\"] < 1000, np.nan)\n", + " else:\n", + " X[[\"X\"]].loc[:1000] = np.nan\n", + " X[[\"PdDistrict\"]].loc[:1000] = None\n", + "\n", + " obj = NumericImputer(strategy=\"mean\")\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " obj = ObjectImputer(strategy=\"most_frequent\")\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " if \"dask\" in str(type(X)):\n", + " result = (\n", + " %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']]).compute()\n", + " )\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['PdDistrict']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + " # SAMPLING\n", + " if \"dask\" in str(type(X)):\n", + " frac_dict = (\n", + " (X[\"y_multiclass\"].value_counts(normalize=True) / 2).compute().to_dict()\n", + " )\n", + " else:\n", + " frac_dict = (X[\"y_multiclass\"].value_counts(normalize=True) / 2).to_dict()\n", + "\n", + " # CLIPPING\n", + "\n", + " obj = Clipping(clip_dict={\"X\": [-122.0, -120.0]})\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['X']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " return class_name_vec, runtime_vec" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "ce3069fe", + "metadata": {}, + "outputs": [], + "source": [ + "def run_benchmark(X):\n", + " runtime_vec = []\n", + " class_name_vec = []\n", + "\n", + " # CLIPPING\n", + " X[\"Dates\"] = X[\"Dates\"].astype(\"datetime64[ns]\")\n", + " obj = DeltaTime(columns_a=[\"Dates\"], columns_b=[\"Dates\"])\n", + " class_name_vec.append(obj.__class__.__name__)\n", + " print(psutil.swap_memory())\n", + " print(obj.__class__.__name__)\n", + " if \"dask\" in str(type(X)):\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']]).compute()\n", + " else:\n", + " result = %timeit -o -n 1 -r 3 X_new = obj.fit_transform(X[['Dates']])\n", + " runtime_vec.append(benchmark.get_runtime_in_milliseconds(str(result)))\n", + "\n", + " return class_name_vec, runtime_vec" + ] + }, + { + "cell_type": "markdown", + "id": "20364df0", + "metadata": {}, + "source": [ + "# Pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "aab3f401", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import psutil" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "2457f3e3", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sswap(total=3221225472, used=2610167808, free=611057664, percent=81.0, sin=12782731264, sout=114159616)\n", + "DeltaTime\n", + "262 ms ± 26.2 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "# X = pd.read_parquet('../../../Documents/data/data_10mil.parquet')\n", + "class_name_vec, runtime_vec = run_benchmark(X)\n", + "results = pd.DataFrame(index=class_name_vec, columns=[\"pandas\", \"dask\", \"koalas\"])\n", + "results[\"pandas\"] = runtime_vec" + ] + }, + { + "cell_type": "markdown", + "id": "c3d05206", + "metadata": {}, + "source": [ + "# Dask" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "363251ad", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import dask.dataframe as dd" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "47118177", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sswap(total=3221225472, used=2610167808, free=611057664, percent=81.0, sin=12782731264, sout=114159616)\n", + "DeltaTime\n", + "1.46 s ± 54.1 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "X = dd.read_csv(\"../../../Documents/data/data_10mil_*.csv\")\n", + "X = X.persist()\n", + "class_name_vec, runtime_vec = run_benchmark(X)\n", + "results[\"dask\"] = runtime_vec" + ] + }, + { + "cell_type": "markdown", + "id": "95fabb57", + "metadata": {}, + "source": [ + "# Koalas" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2a732328", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: An illegal reflective access operation has occurred\n", + "WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/Users/cpoli/gators38/lib/python3.8/site-packages/pyspark/jars/spark-unsafe_2.12-3.2.0.jar) to constructor java.nio.DirectByteBuffer(long,int)\n", + "WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform\n", + "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", + "WARNING: All illegal access operations will be denied in a future release\n", + "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "21/12/10 10:49:33 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "21/12/10 10:49:34 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.\n", + "WARNING:root:Found pyspark version \"3.2.0\" installed. The pyspark version 3.2 and above has a built-in \"pandas APIs on Spark\" module ported from Koalas. Try `import pyspark.pandas as ps` instead. \n" + ] + } + ], + "source": [ + "from pyspark import SparkConf, SparkContext\n", + "\n", + "conf = SparkConf()\n", + "conf.set(\"spark.executor.memory\", \"20g\")\n", + "conf.set(\"spark.driver.memory\", \"20g\")\n", + "sc = SparkContext(conf=conf)\n", + "import pyspark.pandas as ps\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "ks.set_option(\"compute.default_index_type\", \"distributed-sequence\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "bba3ca87", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sswap(total=3221225472, used=2610167808, free=611057664, percent=81.0, sin=12783185920, sout=114159616)\n", + "DeltaTime\n", + "48.9 ms ± 8.31 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "X = ps.read_parquet(\"../../../Documents/data/data_10mil.parquet\")\n", + "class_name_vec, runtime_vec = run_benchmark(X)\n", + "results[\"koalas\"] = runtime_vec" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a7684b2b", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "94882335", + "metadata": {}, + "outputs": [], + "source": [ + "# results.to_csv('benchmark_fit_transform.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d1a40f8c", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pandas 262.0\n", + "Name: DeltaTime, dtype: float64\n", + "1.46\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAFXCAYAAADDOWbhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de7xdZX3n8c8XEK1GsUIMoEap6Shaa4DUCwpiaxAv6Xip0qpTUy+MUBGljiOUVtFK1aIdakUNrQ0ynY4FcYQaxnijiqg0UURERSuiIoTESwS5ir/+sVbqdnNWcvbJ2Wfvc/bn/Xrt1znrctb67WRln2+e51nPSlUhSZI0lV1GXYAkSRpfBgVJktTJoCBJkjoZFCRJUieDgiRJ6mRQkCRJnQwK0gKSZHWS6nn9NMm3k3wwyXOTZAbHPKw91mE9616Z5FkzONaD+urrel041Xklzb3dRl2ApKF4DvA94K7AUuBpwD8BRyVZVVU37+TxXwlcBJw74M9dCzy2b91ngbXAe3rW/YSm/scCV8ysREmzwaAgLUyXVtU3e5bPSnI2cDbwVuDYURRVVbcCn+td1zZyXFNVn5viR6ZaJ2kO2fUgTYiq+gDwIeClSe4OkOTuSd6S5Kokt7Vf/zRJ52dDkm8DDwSe39NVsLbdtizJWe1xbk7yrSTvSvKrg9bb0eVxYZKLkhyR5NL2HF9M8ugkuyU5Jcm1SX6YZG2Se/Qdc+D3K006WxSkybIOeAawIsnFwEeAhwFvBL4MPAb4M+A+wJ90HOOZ7XG+BLy+Xbe5/bov8F2arokfAb8GnNju39/lMFPLgL8C3gTcSNNCcl772g1YDezf7nM98BqAJLsxs/crTTSDgjRZvtN+3Qf4A+DxwBOq6lPt+o+3XQGvS/KWqrq+/wBV9cUktwJb+rsL2uNsOxZtGPkm8OkkB1TVF2fhPewJHFxV32rPsQtNS8l+VfWkdp+PJDmUZqzGa9p1M3q/0qSzuU2aLNvueijgCOBq4OK22X639n/d64G70Pxve7CDJ7snOTHJ15LcDNwOfLrd/JCdLx+AK7eFhNbX2q8f6dvva8D9e+70mPX3K00CWxSkyfKA9uu1wH1pxhrc3rHvnjM4/l/SDJR8A3AxcANwf5q7I+42g+NN5Ud9y7dtZ/1uwK7AzxjO+5UWPIOCNFmeBtwCbAR+AFwFPLdj32/P4Pi/D7yvqv5i24oki2ZwnGEYxvuVFjyDgjQhkjwb+F3gtKq6Kcn/B54N3FhVX9v+T9/JrcCvTLH+7tz5f+x/NHCxw7Ez71eaWAYFaWFanmQvYHeaCZeeTjOw76PACe0+/0jzS/zjSd5GcxfD7sCDaQLFM6rqpo7jXwEckuTpwHU0Axu/TfPL+IVJvkwziPFZwMGz//ZmZGferzSxDArSwnR2+/UWmlsEv0DTLXBOVRVAVd2e5MnAa4GjgP2AnwL/DnyYX/T9T+UE4Azgn2laFs6kuS3xWJoBk29q91tHc7fBJbP0vmZsJ9+vNLHSfmZIkiTdibdHSpKkTgYFSZLUyaAgSZI6GRQkSVIng4IkSepkUJAkSZ0MCpIkqZNBQZIkdTIoSJKkTgYFSZLUyaAgSZI6GRQkSVIng4IkSepkUJAkSZ0MCpIkqZNBQZIkdTIoSJKkTgYFSZLUacEFhSQPSHJhkiuSXJbkOaOuSZKk+SpVNeoaZlWSfYAlVXVpkr2BjcB/qaqfjrg0SZLmnd1GXcBsq6prgWvb769LsgW4D2BQkCRpQGPX9ZDk0CTnJbkmSSVZPcU+xyS5KsktSTYmOaTjWAcBu1bVd4ddtyRJC9HYBQVgEXA5cBxwc//GJEcCpwGnAAcAFwMXJFnat999gPcBRw27YEmSFqqxHqOQ5Ebg5VW1tmfd54HLquqlPeu+AZxTVSe0y3cFPgqcUVVnTedce+21Vz3oQQ+axeolSZofNm7cuKWqFk+1bV6NUUiyO3AQcGrfpvXAwe0+AdYCn9hRSEhyFG2Lw9KlS9mwYcNslyxJ0thLcnXXtnHsetievYBdgU196zcBe7ffPw44EnhGkkvb1yOmOlhVramqFVW1YvHiKYOUJEkTbV61KExHVV3EAAEoySpg1bJly4ZXlCRJ89R8a1HYAtwBLOlbvwS4biYHrKrzq+qoPfbYY2drkyRpwZlXQaGqbqOZQGll36aVNHc/DCzJqiRrtm7durPlSZK04IxdUEiyKMnyJMtp6lvaLm+7/fHtwOokL0myf5LTgH2Bd8/kfLYoSJLUbRzHKKwAPtmzfHL7OhNYXVXvT7IncBKwD82cC0+tqs4Rm5IkaWbGLihU1YVAdrDP6cDps3E+BzNKktRt7Loe5ppdD5IkdZv4oCBJkrpNfFDwrgdJkrpNfFCw60GSpG4THxQkSVI3g4IkSeo08UHBMQqSJHWb+KDgGAVJkrpNfFCQJEndDAqSJKnTxAcFxyhIktRt4oOCYxQkSeo28UFBkiR1MyhIkqROBgVJktTJoCBJkjpNfFDwrgdJkrpNfFDwrgdJkrpNfFCQJEndDAqSJKmTQUGSJHUyKEiSpE4GBUmS1MmgIEmSOk18UHAeBUmSuk18UHAeBUmSuk18UJAkSd0MCpIkqZNBQZIkdTIoSJKkTgYFSZLUaUEGhSQfTPKjJOeMuhZJkuazBRkUgNOAPxx1EZIkzXcLMihU1YXADaOuQ5Kk+W7sgkKSQ5Ocl+SaJJVk9RT7HJPkqiS3JNmY5JARlCpJ0oI3dkEBWARcDhwH3Ny/McmRNF0LpwAHABcDFyRZOpdFSpI0CcYuKFTVuqo6sarOAX4+xS7HA2ur6oyq+mpVHQtcCxw9p4VKkjQBxi4obE+S3YGDgPV9m9YDB8/geEcl2ZBkw+bNm2ejREmSFpR5FRSAvYBdgU196zcBe29bSPIx4GzgqUm+l+SxUx2sqtZU1YqqWrF48eJh1SxJ0ry126gLGIaqetJ0902yCli1bNmyIVYkSdL8NN9aFLYAdwBL+tYvAa6byQF9zLQkSd3mVVCoqtuAjcDKvk0rae5+GFiSVUnWbN26dWfLkyRpwRm7oJBkUZLlSZbT1Le0Xd52++PbgdVJXpJk/ySnAfsC757J+WxRkCSp2ziOUVgBfLJn+eT2dSawuqren2RP4CRgH5o5F55aVVfPeaWSJC1wYxcU2umXs4N9TgdOn43zOZhRkqRuY9f1MNfsepAkqdvEBwVJktRt4oOCdz1IktRt4oOCXQ+SJHWb+KAgSZK6GRQkSVKniQ8KjlGQJKnbxAcFxyhIktRt4oOCJEnqZlCQJEmdJj4oOEZBkqRuEx8UHKMgSVK3iQ8KkiSpm0FBkiR1MihIkqROBgVJktRp4oOCdz1IktRt4oOCdz1IktRt4oOCJEnqZlCQJEmdDAqSJKmTQUGSJHUyKEiSpE4GBUmS1Gnig4LzKEiS1G3ig4LzKEiS1G3ig4IkSepmUJAkSZ0MCpIkqZNBQZIkddpt1AVImpm8dvOoS1CHevPiUZcgzZoF16KQ5OlJvp7kG0leMup6JEmazxZUi0KS3YC3A08EtgIbk3ywqn4w2sokSZqfFlqLwqOAr1TVNVV1I3ABcPiIa5Ikad4aq6CQ5NAk5yW5JkklWT3FPsckuSrJLUk2JjmkZ/O+wDU9y9cA9xty2ZIkLVhjFRSARcDlwHHAzf0bkxwJnAacAhwAXAxckGTpXBYpSdKkGKugUFXrqurEqjoH+PkUuxwPrK2qM6rqq1V1LHAtcHS7/fv8cgvC/dp1kiRpBsYqKGxPkt2Bg4D1fZvWAwe3318C/EaS+yVZBDwF+Mh2jnlUkg1JNmze7K1mkiT1mzdBAdgL2BXY1Ld+E7A3QFX9DPgT4JPApcDbtnfHQ1WtqaoVVbVi8WLve5Ykqd+Cuj0SoKrOA86b7v5JVgGrli1bNryiJEmap+ZTi8IW4A5gSd/6JcB1Mz2oj5mWJKnbvAkKVXUbsBFY2bdpJc3dD5IkaZaNVddDOwBxWx/ALsDSJMuBH1bVd2hmXTwrySXAZ4CX0cyd8O6dOKddD5IkdRi3FoUVwBfb168AJ7ffvwGgqt4PvBI4iWaw4uOBp1bV1TM9oV0PkiR1G6sWhaq6EMgO9jkdOH22zmmLgiRJ3abVopBk/yRvSPKvSa5Ocn2SryQ5K8nzktx12IUOiy0KkiR1225QSHJgko/RNP8/jmbQ4KnAicCZQAFvAr6f5H/O58AgSZLubEddDx8E3go8p6p+1LVTkscCrwJeTRMc5g27HiRJ6rajoPDr7W2J21VVnwU+206zPK9U1fnA+StWrHjpqGuRJGncbLfrYUchIcldBtlfkiTNL9O+PTLJK5I8u2f574Gbk3w9yUOGUp0kSRqpQeZReAWwGSDJocBzgefRPnxp9kubG0lWJVmzdevWUZciSdLYGSQo3A+4qv1+FXB2Vf0z8HrgMbNc15zx9khJkroNEhR+Aty3/X4l8PH2+9uBu81mUZIkaTwMMjPjeuCMJF+geR7DBe36h/OLlgZJkrSADNKi8Mc0D2JaDPxeVf2wXX8g8E+zXdhccYyCJEndpt2iUFU/AY6dYv3rZrWiOeY8CpIkddvRFM73HORgg+4vSZLG2466Hr6R5KQk9+/aIckuSZ6S5KM03ROSJGmB2FHXwyE0z274VpIvAxuA7wO3AL8KPIzm1sibgVOAM4ZXqiRJmmvbDQpV9Q3guUkeQDPB0iHAo4BfAbbQPFVyDbCuqn4+5FolSdIcm9Zgxqr6Ls3si/N2BsYuPj1SkqRug9weuSA5M6MkSd0GmXBJcyCv3TzqErQd9ebFoy5BkubUxLcoSJKkbgYFSZLUyaAgSZI6DRQUkixJ8uok70qyV7vucUn2G055kiRplKYdFJIcBHwdeD7wYuBe7aaVNJMySZKkBWaQFoVTgdOq6gDg1p71HwEeN6tVzSGfHilJUrdBgsJBwJlTrL8WWDI75cw951GQJKnbIEHhZprnO/R7KHD97JQjSZLGySBB4UPA65LctV2uJA8C3gJ8YJbrkiRJY2CQoPBq4D7AZuDuwEXAN4EfAyfNfmmSJGnUpj2Fc1X9BHh8kt8GDqQJGV+oqo8NqzhJkjRaAz/roao+AXxiCLVIkqQxM1BQSHIA8ETgvvR1W1TVa2axrp2W5IPAYcDHq+r3RlyOJEnz0rSDQpLXAG8GrgY2AdWzuab8odE6DXgv8MJRFyJJ0nw1SIvCq4Cjq+o9wypmNlXVhUkOG3UdkiTNZ4Pc9bAL8PGdPWGSQ5Ocl+SaJJVk9RT7HJPkqiS3JNmY5JCdPa8kSRrcIEHhXcAfzcI5FwGXA8fRTOL0S5IcSdNtcApwAHAxcEGSpT37XJrk8ile+85CfZIkqTVI18PJwLokX6T5RX9778aqetF0DlJV64B1AEnWTrHL8cDaqjqjXT42yRHA0cAJ7TGWD1C3JEmaoUFaFN4EHA78jGYq58V9r52WZHeaZ0qs79u0Hjh4Ns7Rd76jkmxIsmHz5s2zfXhJkua9QVoUjgGeV1XvH1YxwF7ArjR3VfTaBDxpkAMl+RjwSOAeSb4HPKeqPtu7T1WtAdYArFixYhzv3JAkaaQGCQo3A18cViGzraqmFSySrAJWLVu2bMgVSZI0/wzS9fDXwCuTZFjFAFuAO7jzY6uXANcN44Q+ZlqSpG6DtCgcAhwKPC3JFdx5MOPv7mwxVXVbko3ASuDsnk0r8QmVkiTNuUGCwhbg3J09YZJFwLZ2/l2ApUmWAz+squ8AbwfOSnIJ8BngZcC+wLt39twd9dj1IElSh0GeHjkbcygArAA+2bN8cvs6E1hdVe9PsifNo6v3obkV86lVdfUsnf+XVNX5wPkrVqx46TCOL0nSfDbw0yN3VlVdCGx3nENVnQ6cPhf12KIgSVK37QaFJJcBT6iqHyX5Mtt5+FNV/eZsFzcXbFGQJKnbjloUPgDc2vO9cw1IkjRBthsUqurknu9fP/RqRsCuB0mSuk17HoUkn0hy7ynW3yvJJ2a3rLnjPAqSJHUbZMKlw4Ddp1h/N5o5FiRJ0gKzw7sekhzYs/ibSX7Ys7wr8GTgmtkuTJIkjd50bo/cQDOIsbjzUx2heQbEsbNZ1FxyjIKkhSyv9cm446zePCsPXx6q6QSF/WjmPfgW8Cig96q7Dbi+qu4YQm1zwtsjJUnqtsOg0DMj4iDjGSRJ0gIw0MyMSe5P82Co+9IXHKrq7bNYlyRJGgPTDgpJng+8F/gZTfdD7+RLRfMwp3nHMQqSJHUbpDvhDcDbgHtV1YOqar+e168Nqb6hcx4FSZK6DRIUlgB/N58HLkqSpMEMEhTWAY8eViGSJGn8DDKY8aPAW5I8HPgycHvvxqo6dzYLkyRJozdIUHhP+/XEKbYVzSyNkiRpAZl2UKiqBTmPgnc9SJLUbUH+8h+Edz1IktRtkHkUjt/edidckiRp4RlkjEL/g5/uAuxD81Co65mnEy5JkqRug4xR2K9/XZIlwD8AZ8xmUZIkaTzs1BiFqtoE/Cnw1tkpR5IkjZPZGMy4C82sjZIkaYEZZDDjs/pX0YxR+GPg07NZlCRJGg+DDGY8p2+5aJ4i+QngT2atojnmPAqSJHWbdtdDVe3S99q1qvauqudV1bXDLHKYnEdBkqRu0woKSe6S5PNJHjLsgiRJ0viYVlCoqtuB/Wi6GyRJ0oQY5K6HM4GXDqsQSZI0fgYZzHgP4PlJVgIbgZ/2bqyqV8xmYZIkafQGCQr7A19ov/+1vm12SUiStAANMoXzE4dZiCRJGj8L8jHTSR6Q5MIkVyS5LMlzRl2TJEnz0SBdD/PJz4BXVtWlSfYGNiZZV1U/3dEPSpKkX1iQQaGdAOra9vvrkmwB7kPfAExJkrR9c971kOTQJOcluSZJJVk9xT7HJLkqyS1JNiY5ZCfOdxCwa1V9d2fqliRpEo2iRWERcDnwvvb1S5IcCZwGHANc1H69IMnDquo77T6XMnXth1fV93uOdZ/2HM7/IEnSDMx5UKiqdcA6gCRrp9jleGBtVZ3RLh+b5AjgaOCE9hjLd3SeJHcF/h/w5qq6eBZKlyRp4ozVXQ9JdgcOAtb3bVoPHDzAcQKsBT5RVWdtZ7+jkmxIsmHz5s0zqFiSpIVtrIICsBewK7Cpb/0mYO8BjvM44EjgGUkubV+P6N+pqtZU1YqqWrF48eIZFy1J0kK1UO96uIjpPxlzFbBq2bJlwy1KkqR5aNxaFLYAdwBL+tYvAa4bxgmr6vyqOmqPPfYYxuElSZrXxiooVNVtNA+cWtm3aSUwlAGJSVYlWbN169ZhHF6SpHltFPMoLEqyPMny9vxL2+Wl7S5vB1YneUmS/ZOcBuwLvHsY9diiIElSt1GMUVgBfLJn+eT2dSawuqren2RP4CRgH5o5F55aVVfPeaWSJE24UcyjcCGQHexzOnD6XNTjYEZJkrqN1RiFUbDrQZKkbhMfFCRJUreJDwre9SBJUreJDwp2PUiS1G3ig4IkSeo28UHBrgdJkrpNfFCw60GSpG4THxQkSVI3g4IkSeo08UHBMQqSJHWb+KDgGAVJkrpNfFCQJEndDAqSJKmTQUGSJHUyKEiSpE4THxS860GSpG4THxS860GSpG4THxQkSVI3g4IkSepkUJAkSZ0MCpIkqZNBQZIkdTIoSJKkThMfFJxHQZKkbhMfFJxHQZKkbhMfFCRJUjeDgiRJ6mRQkCRJnQwKkiSpk0FBkiR1MihIkqROCy4oJLl3kg1JLk1yeZKXjromSZLmq91GXcAQ3AAcWlU3JbkHcHmSc6vqB6MuTJKk+WbBBYWqugO4qV28K5D2JUmSBjSnXQ9JDk1yXpJrklSS1VPsc0ySq5LckmRjkkNmcJ57J/kS8D3gr6pqyyyUL0nSxJnrMQqLgMuB44Cb+zcmORI4DTgFOAC4GLggydKefbaNPeh/7bttn6r6cVU9EtgPeF6SJcN9W5IkLUxz2vVQVeuAdQBJ1k6xy/HA2qo6o10+NskRwNHACe0xlg9wvk1ty8IhwDk7UbokSRNpbO56SLI7cBCwvm/TeuDgAY6zJMk92+/3AA4Fvt6x71HtHRIbNm/ePLPCJUlawMYmKAB7AbsCm/rWbwL2HuA4DwQ+3bYkfBp4R1V9eaodq2pNVa2oqhWLFy+eSc2SJC1oC/Guh0uAaXdPJFkFrFq2bNnwipIkaZ4apxaFLcAdQP/AwyXAdcM6aVWdX1VH7bHHHsM6hSRJ89bYBIWqug3YCKzs27SS5u6HoUiyKsmarVu3DusUkiTNW3M9j8KiJMuTLG/PvbRd3nb749uB1UlekmT/JKcB+wLvHlZNtihIktRtrscorAA+2bN8cvs6E1hdVe9PsidwErAPzZwLT62qq+e4TkmSxNzPo3AhO5hOuapOB06fk4JwMKMkSdszNmMURsWuB0mSuk18UJAkSd0mPih414MkSd0mPijY9SBJUreJDwqSJKnbxAcFux4kSeo28UHBrgdJkrpNfFCQJEndDAqSJKmTQUGSJHWa+KDgYEZJkrpNfFBwMKMkSd0mPihIkqRuBgVJktTJoCBJkjpNfFBwMKMkSd0mPig4mFGSpG4THxQkSVI3g4IkSepkUJAkSZ0MCpIkqZNBQZIkdTIoSJKkThMfFJxHQZKkbhMfFJxHQZKkbhMfFCRJUjeDgiRJ6mRQkCRJnQwKkiSpk0FBkiR1MihIkqROCzYoJLl7kquTnDrqWiRJmq8WbFAA/hT43KiLkCRpPluQQSHJrwMPBS4YdS2SJM1ncxoUkhya5Lwk1ySpJKun2OeYJFcluSXJxiSHzOBUpwIn7HTBkiRNuLluUVgEXA4cB9zcvzHJkcBpwCnAAcDFwAVJlvbsc2mSy6d47dtu/6/AlVV15Ry8H0mSFrTd5vJkVbUOWAeQZO0UuxwPrK2qM9rlY5McARxN20JQVct3cJrHAL+f5Dk0weQuSX5SVW+YhbcgSdJESVWN5sTJjcDLq2ptu7w7cBPwB1V1ds9+7wR+o6qeMINzrG5/9tUd248CjmoXHwJ8fdBzaIf2AraMugjNC14rmg6vk+F4YFUtnmrDnLYo7MBewK7Apr71m4AnDeOEVbUGWDOMY6uRZENVrRh1HRp/XiuaDq+TuTdOQWHWbWutkCRJMzNOt0duAe4AlvStXwJcN/flSJKksQkKVXUbsBFY2bdpJc3dD5qf7NrRdHmtaDq8TubYnA5mTLIIWNYuXgy8GTgP+GFVfae9PfIs4BjgM8DLgBcDD6+qq+esUEmSBMx9UDgM+OQUm86sqtXtPscArwH2oZlz4VVV9am5qlGSJP3CyG6P1GRL8nvA2VWVUdei4UryL8CWbf8Z2MljfRv426ryYW/zQJILgcur6uVDOv638XoYurEZoyBJksaPQUGSJHUyKEy4JBcmeXeS05L8qH39VZJd2u0vSPJvSW5Icn2Ss5Pcr+fnD2sf8PU7ST6f5KYkG5Ic2HeeP0xydbv9X+i7DTbJg5N8KMl1SX6a5AtJnt63z7OSXJbk5iQ/TPKvSfpvp9UIJbl7krVJbkyyKcmJfdt3dD3dJcnfJPl+kluTfDfJm7dzvhck+UmS3x3m+9LsaD8nfpzkZUkekeRjPf+e1ybZo2ff30qyPsmW9u/4oiSP3cHxj28/I37aPnzw75Lcu2f7HknOaq+9W5J8K8krh/meFwKDggCeT3MtPBb47zTTWm/7x7M78DrgkcDTaWbQ/KcpjvGXwGuBA4EfAP+YJABJHg2spbmtaTlwPtD/7I1FNI8FX9me6wPAuUke2h5jb+D/AmcC+wOH0twho/FyKs3f4bOB36F5uNuhPdt3dD29Angm8PvArwNH0jG1epLjgHcAT6+q82b1XWjWteOSPkjz+XIW8BHgRuBRNH/nBwPv7fmRe7b7HdLucymwLsme2znNz2k+ux4OPK/9uXf0bP8L4BE0195DgBcB1+zkW1v4qsrXBL+AC4EraQe2tutOAr7Xsf9DgQLu3y4f1i4/uWefx/Xt83+Aj/Yd5++ay2+7tX0OOKn9/sD2mA8c9Z+Zr86/r0XArcDz+9b9mOZhb9O5nv4G+Hjv9di3/7eBVwNvpJne/YBRv29f270mLgT+liYcbAUOb9e/tF2+Z8++2z5LlnUcK8C1wAv6r4ftnP+I9prcpV0+D3jvqP9c5tvLFgUBfK7af0WtzwL3S3KvJAe2XQJXJ7kB2NDus7TvGJf1fP/99ut926/7t8fs9UvLSe6R5K1Jrmi7P24EVvSc50vAx4DLk3wgydFJpnyAiUbmwTQtBv/5d1tVNwJf3rY8jetpLU2r05VJ3pnkadu6wXocBxwLPL6qvjict6JZ9AzgncARVbW+Xbc/cFlV3dCz38U0LQIPA0hy3yTvSXJlkq3ADTSfKf2fPf8pyW8n+WiS77XX17k01+Te7S7vAo5M8qUkpyYZ+GGDk8igoO0JTfPgTcB/A36LJqFD84+v1+09328LHYNcX6cCzwH+DHgCzS+LS7adp6ruAA5vX5fRTMT1jSSPHOAcGqEk92AH11NVfQF4EM1j5Xeh6Wr6aF9YuIjmGvuDOSlcO+tLNC0BL97WHbkD2z4/zqS5Rl5F0y2xHPged/7sASDJA4EPA1+l+Sw5iKZrAX5xfV0APJDm82Yv4MNJ/mHwtzRZDAoCeHTfP+DH0LQKLKP5x3RiVX2qqr7GL1oJBvHV9pi9+pcfD7yvqj5QVZfRfCA8uHeHany2qk6m+QD5Pk0ftsbDv9MExv/8u23DwW+0iw9lGtdTVd1QVedU1dHA04Df5hczukIz1fvhwPFJ/mwo70Sz6SqaboXDgTXtZ81XgUckuWfPfgfT/E76arv8eOAdVfXhqvoKTYvCPts5zwqaQPCq9nPiSmDf/p2qaktVnVXNvB4vBl6Y5K478wYXugX99EhN277A/0pyOs1An/9BM+jnOzT9ey9P8k6a5sI3zuD4fwNcnOQE4ByaD41n9u1zJfDMJB+i+WXzOuBu2zYmeQzN48Y/Qts3DTwAuGIG9WgIqurGJH8PvCXJZpog9+c0j4+HaVxPSY6n+d/npTTXwfOAn9AEx95z/VuSw4H1Saqq/mJ470w7q6q+leSJNGMW3kPTSnAy8L4kfw78arCADQoAAAFHSURBVLv+3Kr6ZvtjVwIvSPJ54B7AW4HbtnOab9AEjVcmOZcmsP7SHQ1J3gB8AfgKze+/ZwHfqqpbZ+N9LlS2KAjgH2k+zD8PnAH8PfDXVbUZeCFNH+MVNL+8jx/04FX1OZrkfjRNt8GzgNf37XY8cD3waZq7Hz7Xfr/NVppBkv9C84HwNuCNVfW/B61HQ/VqmmnaP9h+vRz4FMA0r6cbaILqJTQf6MuBp1TVTf0nqqpLaP6X+uokJw3jzWj2VNW/0/wn4SnAXwNPBu5F83f9IZqxLS/q+ZEX0QyG3Uhzx9N7aQYvdh3/MprxK8fTXF8vobkee90KvImmO+QzNHdWrNqZ9zUJnMJ5wmXIU6xKkuY3WxQkSVIng4IkSepk14MkSepki4IkSepkUJAkSZ0MCpIkqZNBQZIkdTIoSJKkTgYFSZLU6T8An3MDsEzK2jEAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for ind in results.index:\n", + " n = np.ceil(np.log10((1e-3 * results.loc[ind]).max()))\n", + " fig, ax = plt.subplots()\n", + " ax.xaxis.label.set_fontsize(14)\n", + " ax.yaxis.label.set_fontsize(14)\n", + " print(results.loc[ind].iloc[:1])\n", + " print((1e-3 * results.loc[ind]).max())\n", + " if (1e-3 * results.loc[ind]).max() < 1:\n", + " ylim = [5e-4, 1.5]\n", + " else:\n", + " ylim = [1e-2, 10**n + 5]\n", + "\n", + " ylim = [1e-4, 10**2 + 5]\n", + "\n", + " (1e-3 * results.loc[ind]).plot.bar(\n", + " logy=True,\n", + " ax=ax,\n", + " ylabel=\"runtime (s)\",\n", + " ylim=ylim,\n", + " rot=0,\n", + " color=\"#0077ea\",\n", + " legend=False,\n", + " figsize=[5 * 1.61, 5],\n", + " width=0.75,\n", + " fontsize=14,\n", + " )\n", + " plt.suptitle(ind, fontsize=16)\n", + " plt.show()\n", + " fig.tight_layout()\n", + " fig.savefig(f\"figs/{ind}_fit_transform.jpg\")\n", + " plt.close(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b9ee95b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas 6560.0\n", + "dask 4250.0\n", + "koalas 20700.0\n", + "dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.sum(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8f891d90", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: 'benchmarking_fit_transform.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/68/_95hrz854zx_sxf_t6vzxtc80000gq/T/ipykernel_43531/2739718552.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mresults_old\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'benchmarking_fit_transform.csv'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex_col\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mresults_old\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 309\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstacklevel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 310\u001b[0m )\n\u001b[0;32m--> 311\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 312\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 313\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m 584\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwds_defaults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 585\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 586\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 587\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 588\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 480\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 481\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 482\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 483\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 484\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 809\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 811\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 812\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 813\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 1038\u001b[0m )\n\u001b[1;32m 1039\u001b[0m \u001b[0;31m# error: Too many arguments for \"ParserBase\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1040\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mmapping\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[call-arg]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1041\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1042\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_failover_to_python\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/parsers/c_parser_wrapper.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;31m# open handles\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_open_handles\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandles\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/parsers/base_parser.py\u001b[0m in \u001b[0;36m_open_handles\u001b[0;34m(self, src, kwds)\u001b[0m\n\u001b[1;32m 220\u001b[0m \u001b[0mLet\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mreaders\u001b[0m \u001b[0mopen\u001b[0m \u001b[0mIOHandles\u001b[0m \u001b[0mafter\u001b[0m \u001b[0mthey\u001b[0m \u001b[0mare\u001b[0m \u001b[0mdone\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtheir\u001b[0m \u001b[0mpotential\u001b[0m \u001b[0mraises\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 221\u001b[0m \"\"\"\n\u001b[0;32m--> 222\u001b[0;31m self.handles = get_handle(\n\u001b[0m\u001b[1;32m 223\u001b[0m \u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0;34m\"r\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/gators38/lib/python3.8/site-packages/pandas/io/common.py\u001b[0m in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 700\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencoding\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m\"b\"\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 701\u001b[0m \u001b[0;31m# Encoding\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 702\u001b[0;31m handle = open(\n\u001b[0m\u001b[1;32m 703\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 704\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'benchmarking_fit_transform.csv'" + ] + } + ], + "source": [ + "results_old = pd.read_csv(\"benchmarking_fit_transform.csv\", index_col=0)\n", + "results_old" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba98ceee", + "metadata": {}, + "outputs": [], + "source": [ + "X[\"y_multiclass\"] = X[\"y_multiclass\"].where(X[\"y_multiclass\"] < 9, 9)\n", + "obj = MultiClassEncoder(WOEEncoder())\n", + "obj.fit_transform(X[[\"PdDistrict\"]], X[\"y_multiclass\"]).compute()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c940cee8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "631fb60e", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "to = time.time()\n", + "\n", + "time.time() - to" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff2e5d58", + "metadata": {}, + "outputs": [], + "source": [ + "results[\"koalas_old\"] = results_old[\"koalas\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6541eb2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gators38", + "language": "python", + "name": "gators38" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/benchmarks/benchmark_transform_numpy.ipynb b/benchmarks/benchmark_transform_numpy.ipynb new file mode 100644 index 00000000..82b856a2 --- /dev/null +++ b/benchmarks/benchmark_transform_numpy.ipynb @@ -0,0 +1,1685 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 43, + "id": "753d3112", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "772c967c", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import benchmark\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e13ab7d9", + "metadata": {}, + "outputs": [], + "source": [ + "housing_file_location = \"../examples/data/house_prices.parquet\"\n", + "sf_crime_file_location = \"../examples/data/sf_crime.parquet\"\n", + "titanic_file_location = \"../examples/data/titanic.parquet\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "29f511db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mkdir: figs: File exists\r\n" + ] + } + ], + "source": [ + "!mkdir figs" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c41e2841", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_all(bench_dict, name=\"test\"):\n", + " N = len(bench_dict.items())\n", + " i = 0\n", + " transformer = \"\"\n", + " fig, ax = plt.subplots(1, 2, figsize=[18, 8], tight_layout=True)\n", + " plt.subplots_adjust(wspace=0.1)\n", + " dfs = []\n", + " for key, value in bench_scalers.items():\n", + " df = value.copy()\n", + " df.index = [key]\n", + " dfs.append(df)\n", + " transformer = str(value.index[0]).split(\"_\")[0]\n", + " final_df = pd.concat(dfs)\n", + " (final_df * 1e-3).plot.bar(\n", + " ax=ax[0],\n", + " rot=0,\n", + " color=[\"#c73d22\", \"#0077ea\"],\n", + " logy=True,\n", + " ylabel=\"runtime (s)\",\n", + " xlabel=\"# of columns\",\n", + " ylim=[1e-6, 1],\n", + " width=0.75,\n", + " figsize=[7 * 1.60, 5],\n", + " legend=True,\n", + " fontsize=14,\n", + " )\n", + " (final_df[\"pandas\"] / final_df[\"numpy\"]).plot.bar(\n", + " ax=ax[1],\n", + " rot=0,\n", + " color=[\"#0077ea\"],\n", + " legend=False,\n", + " ylabel=\"runtime speed-up\",\n", + " xlabel=\"# of columns\",\n", + " figsize=[7 * 1.60, 5],\n", + " width=0.75,\n", + " fontsize=14,\n", + " )\n", + " ax[1].xaxis.label.set_fontsize(14)\n", + " ax[0].xaxis.label.set_fontsize(14)\n", + " ax[1].yaxis.label.set_fontsize(14)\n", + " ax[0].yaxis.label.set_fontsize(14)\n", + "\n", + " ax[1].set_ylabel(\"runtime speed-up\", labelpad=-25)\n", + " matplotlib.rcParams[\"legend.fontsize\"] = 12\n", + "\n", + " for p in ax[1].patches:\n", + " ax[1].annotate(\n", + " f\"{round(p.get_height())}X\",\n", + " (p.get_x() + p.get_width() / 2.0, p.get_height()),\n", + " ha=\"center\",\n", + " va=\"center\",\n", + " xytext=(0, 10),\n", + " textcoords=\"offset points\",\n", + " fontsize=14,\n", + " )\n", + "\n", + " ax[1].spines[\"top\"].set_visible(False)\n", + " ax[1].spines[\"right\"].set_visible(False)\n", + " ax[1].spines[\"bottom\"].set_visible(False)\n", + " ax[1].spines[\"left\"].set_visible(False)\n", + " ax[1].get_yaxis().set_ticks([])\n", + " ax[1].yaxis.label.set_fontsize(14)\n", + " ax[1].xaxis.label.set_fontsize(14)\n", + " title = f\"\"\"{transformer}\"\"\"\n", + " plt.suptitle(title, fontsize=16)\n", + " fig.tight_layout()\n", + " fig.savefig(f\"figs/{name}_transform_numpy.jpg\")\n", + " plt.show()\n", + " plt.close(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c13ce2a4", + "metadata": {}, + "outputs": [], + "source": [ + "n_vec = [1, 10, 100]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "07ce8ab2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/opensource/gators/benchmarks/benchmark.py:313: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " XN[f\"{col}{i}\"] = X[col].copy()\n" + ] + } + ], + "source": [ + "# DropHighCardinality\n", + "from gators.data_cleaning import DropHighCardinality\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "objs = [DropHighCardinality(max_categories=3)]\n", + "columns = [\"Category\", \"Address\"]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d5940b1b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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odRKjRs3ZpdddqFhw4aFDkXKmTVr1rBmzZpyi1AA1K9fn3XrMgvQrVy5srRsY3UAXnrpJUaOHMlLL73E3nvvzfDhw7nwwgvp3bs3X/va13L8JNKWqVXJB5llGl8qcz40e/yezOTzP0TEjsBVZHbAnQX0TinN3+BOVeSwK0m59sEHH7DtttvSsWNHh0VUkFLi448/5oMPPthgxS1pa7NixQreffddILMi1YIFC5g+fTotW7Zkt91247DDDuPyyy+nefPmdOjQgZdffpn777+fm266CYC99tqLzp07M2jQIIYNG8aOO+7Ik08+yXPPPccf//hHAD777DP69+/PBRdcwCGHZPZZHjBgAI899hj9+/dnwoQJ1KtX27Zxk/6t1g67yjeHXUnKldmzZ7PXXnuZeGxESom//OUvdOnSpVy5w660tVm/NHNF/fr1Y/To0Xz44YdcccUVPPvss3zyySd06NCBc845h0suuaT0+8OcOXO4/PLLmTRpEitWrKBz585cfPHF9OvXD4Czzz6b1157jTfffJPGjRuXtrFw4UK6devG1VdfzUUXXbRBDFKebfQHXtEnH2WGXQ2YM2dOocORVAfNnj17g1+sVV5lnyOTD0naam00+Sj6frmU0riU0sAWLVoUOhRJkiSpTqttcz4kqc57/dCanRB6wMT3avR+1XH44YczbNgwSkqq0kEhSSp2Rd/zERF9ImLUsmXLCh2KJEmSVKcVffLhsCtJxWDevHnstddenHbaaXTp0oWTTz6ZlStXcs011/CNb3yDbt26MXDgQNbPAzz88MO57LLL+OY3v8kee+zBK6+8AmT2KvjhD39Ily5d+N73vseqVatK2zjvvPMoKSlh7733ZsiQIaXll19+OV27dmXfffdl8ODB+X1wSVKtUvTJhyQVi7/+9a8MGjSI2bNns9122zFy5Eh++tOf8sYbbzBr1ixWrVrFn/70p9L6a9euZcqUKdx8880MHToUgDvvvJOmTZsye/Zshg4dyrRp00rrX3fddUydOpUZM2bw8ssvM2PGDD7++GOeeOIJ3n77bWbMmMFVV12V9+eWJNUezvmQpCKx6667ctBBBwFw+umnc+utt9KpUyduuukmVq5cySeffMLee+9Nnz59ADjppJMA6NmzJ/PmzQNg4sSJ/OxnPwNg3333Zd999y29/yOPPMKoUaNYu3YtixYt4p133qFr1640btyYs88+m+OPP57jjz8+j08s/VtcvqTQIdQJ6cbWhQ5BW7mi7/lwzoekYlFxn5GIYNCgQYwZM4aZM2cyYMCAcruwN2rUCMjsrrx27dqvvPfcuXMZNmwYL7zwAjNmzOC4445j9erVNGjQgClTpnDyySfzpz/9iWOPPbbmH0yStNUo+uTDOR+SisWCBQt47bXXAHjooYc4+OCDAWjVqhUrVqxgzJgxm7zHoYceykMPPQTArFmzmDFjBgDLly+nWbNmtGjRgsWLF/P0008DmR2fly1bRu/evfnNb37Dn//851w8miRpK+GwK0nKs0Itjbvnnntyxx13cNZZZ9G1a1fOO+88Pv30U7p168ZOO+3EN77xjU3e47zzzqN///506dKFLl260LNnTwD2228/evTowV577VVueNdnn33GiSeeyOrVq0kpMWLEiJw+oySpdiv6Hc7XKykpSVOnTi10GJLqoNqww/m8efM4/vjjmTVrVkHj2Bh3OFeuOeejZjjnQ1XkDueSJEmSCqvokw8nnEsqBh07dqy1vR6SpOJR9MmHE84lSZKk/Cj65EOSJElSfph8SJIkScoLkw9JkiRJeeE+H5KUZzW95KdLX0qSthZF3/PhaleSJElSfhR98uFqV5KKwbx58+jSpQsDBgxg77335uijj2bVqlUcfvjhrN9gdenSpXTs2BGA0aNH8x//8R8cddRRdOzYkdtvv50RI0bQo0cPDjjgAD755BMADj/8cC644AK6d+9Ot27dmDJlCuvWrePrX/86S5ZkenjWrVtH586dS88lScWr6JMPSSoWc+bM4Sc/+Qlvv/0222+/PY899thX1p81axaPP/44b7zxBldeeSVNmzblrbfe4sADD+T+++8vrbdy5UqmT5/OyJEjOeuss6hXrx6nn346Dz74IADPP/88++23H61bOzxMkoqdyYckFYlOnTrRvXt3AHr27Mm8efO+sv4RRxzBtttuS+vWrWnRogV9+vQBYJ999in33lNPPRWAQw89lOXLl/PPf/6Ts846qzRBuffee+nfv3/NP5Akaatj8iFJRaJRo0alr+vXr8/atWtp0KAB69atA2D16tUbrV+vXr3S83r16rF27drSaxFR7n0Rwa677krbtm158cUXmTJlCt/97ndr/HkkSVsfkw9JKmIdO3Zk2rRpAIwZM2az7vGH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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_all(bench_scalers, name=\"DropHighCardinality\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ced3d63c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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O3bsFp9/zTXXMH/+fP7yl6rLAo0ePZqDDjqIiy++mJtuuqm+Y0s51WCn2s2XSt2uhr755puFjiOpAXrrrbfo3Lmzf2HMgdWrV7No0aJN1uYAp9rdHNeLkNQIbPavdI1mwHmupJQmpJSGtWrVqtBRJDVQ69ato6ysrNAxilJZWZld2erB+vXrOemkkxg5ciT77bffZtvdcsstLFy4kFNOOYVrrrmGMWPGWHhIyquSLz4kqTbsapUbvq/1o67rRdx///2cdNJJrhchKe9KvviIiP4RcccHH3xQ6CiS1KB17dqVxx9/vNAxVM3G9SLuuuuuLbatab0IScqnki8+7HYlSWrMXC9CUmPSoGa7kqTG4oXee+f0+IdOfjunx1fxcL0ISY2JxYckNXJdu3bljDPOYNy4cSxevJjjjz+eW2+9lTVr1nDqqafy4osvsn79eg4//HBuu+22ir+Gf/nLX+bII4/kySefZNasWRx22GHce++9tG3bFoBx48YxcuRIVq1axfnnn1/lnC+99BLnnnsus2fPpqysjAEDBnDDDTewww47kFLi/PPP55577mHt2rXsscce3HfffRxwwAF5f2+KhetFbLv46dJCRygK6RftCh1BjVzJd7tyzIekYnDPPffw6KOP8vbbbzNnzhyuvPJKNmzYwJAhQ5g/fz4LFiygrKyMs88+u8rz7r33Xu6++26WLFnCxx9/zOjRowF4/fXXOfPMMxk3bhyLFi3in//8J++++27F85o0acIvf/lLli1bxvPPP88TTzzBLbdklmCaNGkSkydPZs6cOXzwwQfcf//97Lrrrvl7M4rQtGnT6NGjBz169GDNmjWMGjWKHj16cMkll9Tq+RvXi7j11lurbB89ejTr16/n4osvzkVsSdpEyRcfjvmQVAzOPvtsdtttN9q0acOIESO477772HXXXRkwYADNmjVj5513ZsSIETzzzDNVnjdkyBA++9nPUlZWxre//W1mzpwJZBarO/bYY+nduzc77rgjV1xxBdtt9+8fGYcccgiHHnoo22+/fcWVl43Hbtq0KStXruSNN94gpcR+++1Hp06d8vdmFKEvf/nLpJQ2uW1uobp58+ZVWePj5z//OeXl5bRrV/Wv1i1atOAf//iHC9VJypuSLz4kqRjstttuFff32GMPFi1axOrVqznjjDPYY489aNmyJb179+b999/nk08+qWjbsWPHivvNmjVj1apVACxatKjKMZs3b17l6sWcOXM49thj6dixIy1btuRnP/sZy5YtA6BPnz6cffbZnHXWWbRv355hw4axYsWKnL12SVLjYfEhSUXgnXfeqbi/YMECOnfuzPXXX8/f//53XnzxRVasWMHkyZMBSGnLC4J36tSpyjFXr17NP//5z4rHZ555Jp/73Od48803WbFiBVdffXWV4/7whz9k+vTpvP7668yZM4frrruuPl6mJKmRs/iQpCJw88038+6777J8+XKuuuoqBg4cyMqVKykrK2OXXXZh+fLlXHbZZbU+3oknnsj//u//8txzz/Hxxx9zySWXsGHDhor9K1eupGXLlrRo0YI33nijyliCqVOn8uKLL7Ju3TqaN2/OTjvtVKXLliSpdJX8TwMHnEsqBieffDJ9+/Zlr732Yu+992bkyJGcd955rFmzhrZt23LooYdyzDHH1Pp4+++/PzfffDMnn3wynTp1onXr1lXWjBg9ejT33nsvO++8M0OHDmXgwIEV+1asWMHQoUNp3bo1e+yxB7vuuis//vGP6/X1SpIap6jN5fdS0KtXrzRt2rRCx5DUAM2ePZv99tuv0DE2q2vXrowZM4ajjjqq0FG2yube34iYnlLqVYtD+INMW+RUu/XDqXZVS7G5Ha7zIUlSHfhLbP3wl1ipNJV8tytJkiRJ+eGVD0lq5ObNm1foCJIk1YpXPiRJkiTlRckXH852JUmSJOVHyRcfKaUJKaVhrVq1KnQUSZIkqaiVfPEhSZIkKT8sPiRJkiTlhcWHJEmSpLyw+JAkSZKUF67zIUlbIderXLv6sySpGHnlQ5Iaua5duzJ69GgOOuggWrVqxcCBA1m7di1jx47liCOOqNI2InjrrbcAGDx4MMOHD+drX/saLVq04PDDD+e9997jvPPOo3Xr1nzuc5/j5ZdfrnKea665hu7du9O6dWuGDBnC2rVrATjggAOYMGFCRdt169bRtm3bKs+XJKnkiw/X+ZBUDO6//37++te/MnfuXGbNmsXYsWNr/bwrr7ySZcuWseOOO3LYYYfRs2dPli1bxoknnsj5559fpf0999zDo48+yttvv82cOXO48sorARg0aBD//d//XdFu4sSJdOrUiR49etTba5QkNX4lX3y4zoekYvDDH/6Qzp0706ZNG/r378/MmTNr9bxvfvOb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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.data_cleaning import DropHighNaNRatio\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "objs = [DropHighNaNRatio(max_ratio=0.5)]\n", + "columns = [\"Category\", \"Address\"]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"DropHighNaNRatio\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "38de1cfd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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hWnTprFq1SpGjRqVp4TS1iv64sMxH5IKwVlnncUuu+xCaWkpo0aN4t5772WnnXZiyJAhtGjRgu23355Ro0bx7LPPVnrd8OHD2WOPPSgpKeGb3/wms2bNAuCBBx7g6KOPpm/fvjRr1ozLL7+80oDZ3r17c8ABB7DtttuW33nZeO6mTZvy4Ycf8ve//52UEnvuuSedOnXK3TdDaqSWLVvGwoULK/3/MnfuXEaNGsVNN93EXnvtxV133cW4ceOYOnVqHpNKn13RFx+SVAg2rmQN0K1bNxYtWsTq1as5/fTT6datGzvssAN9+/blgw8+4JNPPilv27Fjx/LnLVq0YNWqVQAsWrSo0jlbtmxZ6e7FG2+8wdFHH03Hjh3ZYYcd+MlPfsKyZcsA6NevH2eddRbf//73ad++PSNHjmTlypX19t6lhmrVqlXMmjWLWbNmsWHDBhYsWMCsWbNYsGABq1at4sILL+TFF19k/vz5PPPMMwwaNIj27dtz/PHHA7B+/XpOPfVUvv71r3PSSScBMGDAAE477TSGDx/O6tWr8/n2pM/E4kOSCsA777xT/nzBggV07tyZ66+/ntdff52//vWvrFy5kilTpgCQ0pYXBO/UqVOlc65evZr333+/fPuMM87gC1/4Av/4xz9YuXIlV111VaXznnPOOcyYMYPXXnuNN954g5/97Gd18TalRmX69On07NmTnj17smbNGsaMGUPPnj255JJLaNKkCa+88grHHnsse+yxB6eeeiqf//znefHFF9l+++0BuPrqq3n77be57bbbKp33uuuuY/369Vx88cX5eFvSVnHAuSQVgFtuuYWjjz6aFi1acOWVVzJ06FA+/PBDSkpK2HHHHVm+fDljx46t8flOOOEEvvzlL/P888/zpS99iUsuuYQNGzaUH//www/ZYYcdaNWqFX//+9+57bbbaNcuM4B42rRpbNiwgV69etGyZUuaN2++2TUOpEJ22GGHfWqx/+ijj37q63/605/y05/+dJP9rVq14p///OdW55Pyoej/NXDAuaRCcOKJJzJgwAB22203dt99d0aPHs15553HmjVraNu2LQcccABHHXVUjc+39957c8stt3DiiSfSqVMn2rRpUz5LFmT+8nrPPfew/fbbM2LECIYOHVp+bOXKlYwYMYI2bdrQrVs3dtppJ374wx/W6fuVJDVOUZPb78Wg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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.data_cleaning import DropLowCardinality\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "objs = [DropLowCardinality(min_categories=2)]\n", + "columns = [\"Category\", \"Address\"]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"DropLowCardinality\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e8fc31fa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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A71TSntkux68DvyQzC+6mcAPUkqfruUaI8lMYUmLFi12+t73nOJdUm4sXLiQ99//96RSEUGTJk1o3rw5bdq0YdNNNyUiM+b8X//6F6+88grdu3enbdu2lc6TUmL+/PksWLCAr776isaNG9O6dWu6dOlC48b/Hjc9c+ZMOnbsSKNGjViwYAErV66kRYsWdO3alebNm69xzkWLFvHpp5+ybNkyvv76a5o0aULLli1p164dG2+8cXnbTz/9lHnz5rF8+XIaNWpEq1at+M53vkOTJk3K27z88stsvPHG9OjRo3zf0qVL+eCDDygrK6Np06Z06tSJJUuWsGTJErbbbrtqX/fMmTMXppTaRcTZZLpENcmOb1n9M5wNPJlSOgTg7LPPZsyYMaxYsYINNvj339aGDRvGY489xuzZswE49dRTmTp1Ku+++y4rV65kiy22YMSIERx33HE1f0OldWjZsiVXXXUVw4YNK9/Xu3dvhgwZwpgxY8r37bHHHmy33XZcddVV1Z5n7733JiKYOnVqpf0///nPefvtt3nmmWc455xzuOGGG3jllVdo06Yuh19J31qs9UADKj5Wj+fYI6U0rUK70cAhKaWts9sHAGPJdCm7KKV0XU2u169fvzRjxoy6fRGSVCARwRlnnMF5551X6CjfWkTMTCn1W3fLNcbGSAVXXfFx1FFH8dxzz3HvvffStWtXnnrqKfbbbz8mTpzI/vvvv8Y53n33XXr27Mkdd9zBQQcdVOnYokWL6NWrF/379+eee+7h3nvvZdCgQbl+WVJNrbX4qG9jPtZbSmlSSmmrlFLPmhQeETE4Iq5bvHhxPuJJkrRO06ZN44ADDqBLly5EBOPHj690fOnSpYwaNYrvfOc7NGvWjK233prLLrusUpsf/vCHRESlx89//u/hAK+88gobbbQRd99deXH7hx56iCZNmjB9+vScvb5SdcUVV7DDDjvQrVs3mjRpwh577MH//u//Vlt4ANxwww20a9eOH//4x2sca9OmDb///e+54447+J//+R8LDzUYDan4WAh8zZqzt3QgM83jt5JSmpxSGtmqVav1ySZJUp1ZunQpvXv3Zty4cTRr1myN4yeeeCL33XcfEyZM4PXXX+eMM87gtNNOY8KECZXaDR8+nI8//rj88cc//rH8WO/evRkzZgxHHXUU8+ZlZmVevHgxw4cP56STTmLXXXfN7YssQVdeeSVPPfUUkyZNYubMmVx22WWcfPLJ/P3vf1+j7cqVK7n55ps5/PDDK3VrXG3VqlXcfPPNNG/enOeff57ly5fn4yVI663BFB/ZWVlmAntXObQ3mVmvJElZKaUG3eWq1A0aNIgLLriAgw46iEaN1vxV/dRTT3HooYey55570qNHDw477DB23nlnnn322UrtmjdvTseOHcsfVf/Qdsopp7DVVlsxcuRIAEaNGkXr1q0555xzcvfiSlRZWRmnn346F110EYMHD2b77bfn2GOP5ec//zljx45do/3kyZP55JNPOOKII6o93+WXX87LL7/M888/z9KlSznjjDNy/RKkOlGvio/sFHQ7RsSOZLJ1y26vnkr3UjKr0h4REdtExDgya3tcux7XtNuVJKlB2W233Zg8eTIffJBZJ/Kpp55i1qxZ7LvvvpXa/fnPf6Zt27b06tWLk08+mSVLllQ63qhRI2655RYeeughDjnkEP785z9z66230rRp1SVZtL5WrFjBihUrKk0MAdC4cWNWrVq1Rvvrr7+ePfbYg6222mqNY6vvdl155ZVsu+223HjjjYwbN86ucmoQ6tVUu0A/4NEK22Oyj1uAYSmlv0TEZsCZZKaiewUYlFJ6f40z1VBKaTIwuV+/fiO+fWxJxe6LL75g/vz5rFixotBRikaTJk1o3749m2yySaGjNDhXXHEFRx55JN26dSuf2evKK6+sNHbg4IMPpnv37nTu3JlXX32V008/nZdeemmNWZN69uzJKaecwpgxY/jd737HjjvumNfXUkyWLl3K22+/DWS6Rc2ZM4dZs2bRpk0bunXrxh577MFpp51Gy5Yt6d69O48//ji33norF110UaXzzJkzhwceeIBbb11ztt6VK1dy+OGH81//9V8ccsghAAwcOJAjjjiC4cOHM2vWrDVmtJPqlZSSj5TYaaedkiRVZ/Hixemtt95KX375ZVq1alWh4xSFVatWpS+//DK99dZbafHixdW2AWakmn2GF7UWLVqkm2++udK+sWPHpq222ipNmjQp/eMf/0hXXnllatGiRbr//vvXep5nn302AWnmzJmV9i9btixttdVWqXnz5mnPPff0v/H18OijjyYys69Vehx++OEppZQ+/vjjNGzYsNS5c+e00UYbpa233jpdfPHFa/zMR48enVq3bp3KysrWuMY555yT2rdvn+bPn19p/5IlS9Lmm2+ejjvuuJy9PqkW1vqZXW+n2s2XiBgMDO7Zs+eIf/7zn4WOI6keevvtt+ncubN/TcyBZcuW8dFHH9GzZ881jjnVbkbVKVvLyspo1aoVd955Z6VZkI444ghmz57NQw89VO15Vq1aRdOmTZk4cSJDhw4t33/cccdx3333MWnSJHbZZRfOP/98Ro0aldPXJKnolc5Uu7WVnO1K0jqsWLGi2hmHtP6aNWtmV7Zaqu3YgdVefvllvv76azp1+vcC2o8++ijXXHMN48ePp1evXlxyySWcdtppvPPOOznLL6m01bcxH5JUL61efVx1y59r9dZ37MA777zDxIkTGTRoEG3btuW1117jpJNOok+fPuVT6C5ZsoThw4dz/PHHs/vuuwMwYsQI7r77boYPH85jjz1W7UxbkrQ+Sv5TxdmuJKlmevTosdYuPapbM2bMoE+fPvTp04eysjLOOuss+vTpw+jRo4HMLFb/8R//wSGHHMK2227LhRdeyLnnnsuxxx4LQNOmTXn44YfZZ5992HrrrTnuuOMYOHAgDz30UPkdkxNOOIHmzZtz/vnnV7r2jTfeyMsvv8y4cePy+6IllYSSH/OxWr9+/dKMGTMKHUNSPfT666+zzTbbFDpGwfXo0YMbbriBvfbaq07Pu7afr2M+JKnBWuttbbtdSdK38Ez/LXN6/p2n2edeklR8LD4kqYHr0aMHRx55JBMmTODjjz/mJz/5CX/4wx8oKyvj0EMP5dlnn2XlypXsuuuuXHvttXznO98B4Ic//CG77747jzzyCC+99BK77LILt912G23btgVgwoQJnHnmmSxdupQTTzyx0jWfe+45jj/+eF5//XWaNWvGkCFDuPTSS2natCkpJU488UQmTpzI8uXL6d69O7fffju9e/fO+89GWi1OW1DoCEUhXdiu0BHUwDnmwzEfkorAxIkTeeCBB3jnnXd46623OO+881i1ahXDhw/n/fffZ86cOTRr1qx8TMBqt912GzfffDPz58/nq6++YuzYsQC89tprHH300UyYMIGPPvqITz/9lA8//LD8+xo3bsxll13GwoULefrpp3n44Ye55pprAJg6dSrTpk3jrbfeYvHixdxxxx1sttlm+fthSJLqrZIvPpxqV1IxOPbYY+natStt2rThjDPO4Pbbb2ezzTZjyJAhNG/enI033pgzzjiDxx9/vNL3DR8+nK222opmzZrxs5/9jFmzZgFw1113sf/++9O/f3823HBDzj333EozH+20007svPPObLDBBuV3Xlafu0mTJixZsoQ33niDlBLbbLNNpeldJUmlq+SLD0kqBl27di1/3r17dz766COWLVvGkUceSffu3dlkk03o378/n3/+OV9//XV5244dO5Y/b968OUuXLgXgo48+qnTOFi1aVLp78dZbb7H//vvTsWNHNtlkE37729+ycOFCAAYMGMCxxx7Lr371K9q3b8/IkSP54osvcvbaJUkNh2M+JKkIfPDBB+XP58yZQ+fOnbnkkkt48803efbZZ+nYsSOzZs2iT58+1GSWw06dOvH666+Xby9btoxPP/20fPvoo4+mT58+3H777Wy88cZcfvnl3HXXXeXHjzvuOI477jjmz5/Pz372My6++GLOPffcOnq1heXYgbrh2AGpNHnnQ5KKwNVXX82HH37IokWLOP/88xk6dChLliyhWbNmbLrppixatIgxY8bU+HwHHXQQ//d//8eTTz7JV199xejRoyutnr1kyRI22WQTWrZsyRtvvMEf/vCH8mPPP/88zz77LCtWrKBFixZstNFGLlYnSQIsPhxwLqkoHHzwwQwcOJAtttiCLbfckjPPPJMTTjiBsrIy2rZty84778y+++5b4/P16tWLq6++moMPPphOnTrRunXr8lmyAMaOHcttt93GxhtvzIgRIxg6dGj5sS+++IIRI0bQunVrunfvzmabbcYpp5xSp69XktQwuchglosMSlqb+r7IYK4W/8uXhrbIoN2u6ka+u135vtUNu8uphta6yGDJ3/mQJEmSlB8WH5IkSZLywtmuJKmBmz17dqEjSJJUI975kCRJkpQXJV98ONuVJEmSlB8lX3yklCanlEa2atWq0FEkSZKkolbyxYckSZKk/LD4kCRJkpQXFh+SJEmS8sLiQ5IkSVJeuM6HJH0LcdqCnJ4/Xdgup+eXJKkQvPMhSQ1cjx49GDt2LNtvvz2tWrVi6NChLF++nPHjx7PbbrtVahsRvP322wAMGzaMY445hv3224+WLVuy66678sknn3DCCSfQunVrvve97/Hiiy9Wus7vf/97tt12W1q3bs3w4cNZvnw5AL1792by5MnlbVesWEHbtm0rfb8kSSVffLjOh6RicMcdd/D3v/+d9957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/XWO00iqLwYNGsSgQYMAGDZs2BrHDz30UAAWLlz4jed5/vnnGTduHDNnzqRDh6pL1sEpp5zCpEmTGDlyJPfeey+jRo2idevWnHPOOev/IhqQbyw+IqIvcBGZGaemA08BdwFlQBugN3A+cGVEXARc3lCLEElScbvjjjvKi4958+YxevRofvrTn7LLLrsA8PTTT/O3v/2NMWPGFDKmpAZoyZIlHHzwwVx33XW0b9++2jaNGjXilltuYYcdduCQQw7hzjvv5LnnnqNp06Z5TltY67rz8Vcyxcd/p5Q+W1ujiNgF+DVwMpliRJKkeuWgg3qpeBYAACAASURBVA4qf37AAQfw+9//nhEj/n3T+xe/+AX/+Z//yd/+9jeOOeaYQkSU1EAdddRR7Lvvvuy3337f2K5nz56ccsopjBkzht/97nfsuOOOeUpYf6yr+PhuSumrdZ0kpfQ08HRENLjSzal2Jan0PPLII9X2395zzz054YQTCpBIUkM1YcIE/vGPfzBjxox1ti0rK+P222+nefPmPPnkk6SUatwdtFh844DzdRUeEdGkNu3rI6falaTS07Zt20oz0ax211130a5duwIkktRQPfzww7z22mu0bNmSDTbYgA02yPxtf+jQoey2226V2p566qmsXLmS5557jhkzZnDVVVcVInJB1XiRwYg4DpibUro7u30jcHhEvAMckFJ6M0cZJUmqU+eccw7Dhw/n0UcfLR/z8cwzz/DQQw9x4403FjidpIbk/PPP5+STT660b7vttmPs2LH8+Mc/Lt/36KOPcs011/Doo4/Sq1cvLrnkEk444QQGDRrElltume/YBVObFc6PA34BEBH9gZ8BBwNDgEuA/es8nSRJOXDYYYex9dZbc8UVVzBp0iQAttlmG6ZPn873v//9AqeTlE9Lly7l7bffBmDVqlXMmTOHWbNm0aZNG7p168aiRYuYM2cOn3/+OQBvv/02m266KR07dqRjx4506dKFLl26rHHerl27ssUWWwCZAenDhw/n+OOPZ/fddwdgxIgR3H333QwfPpzHHnus2il6i1GklGrWMKIM2Cql9EFEXAxsllL6RXYa3idSSm1zGTTX+vXrl2rSV0+SlB8RMTOl1K8GTWv2i6yOxGkL8nm5opUuzG/3Nt+3upHv9y0fHnvsMfbcc8819h9++OGMHz+e8ePHM3z48DWOn3XWWZx99tnVnjMiuPPOO8snuvjlL3/J008/zQsvvMBGG21U3m7u3Ln07t2b0aNH8+tf/7puXlD9sNaBLLUpPuYBg1JKMyNiFnBxSmliRPQEZqWUWtZN1vyqMOB8xD//+c9Cx5EkZeW6+Jg3bx4TJkzg3Xff5ZxzzqFt27ZMnz6dzp07s/nmm689l/+IrRMWHw1TMRYfyom1Fh+1ub8zFbg+Im4AepJZXBCgF/Det89WWA44l6TSM3PmTLbeemsmTpzIDTfcwBdffAHAgw8+yBlnnFHgdJJUvGpTfPyKzEKD7YCDUkqLsvv7ArfXdTBJknLl5JNP5vjjj+fFF19kww03LN+/zz77MH369AImk6TiVuMB5ymlL4BR1ew/q04TSZKUYzNnzqx2VqtOnToxb968AiSSpNLwjXc+ImLj2pystu0lSSqEZs2a8dlnn62x/4033qB9+/YFSCRJpWFddz7+GRFXAeNTSh9W1yAiGgH7ACcCDwMX1m1ESZLq1o9//GPGjBnDnXfeCWRmppk9ezannnoqQ4YMKXA6Sas5UUDdqE8TBayr+NgdOB94NyJeBmYAHwHLgdbAtsDOQBlwAXB97qLmRoXZrgodRZKUJ2PHjmXQoEG0a9eOZcuWsdtuuzFv3jx23XVXzjvvvELHk6Si9Y3FR0rpn8DPIqIrmUUFdwf+E2gGLAReBK4DpqSUVuU4a06klCYDk/v16zei0FkkSfmxySab8OSTT/LII4/wwgsvsGrVKvr27ctee+1V6GiSVNRqNOA8pfQBmVXML8ltHEmS8mfAgAEMGDCg0DEkqWSUxjrukiRVcc0119CrVy+aN2/Ou+++C8CFF17IHXfcUeBkklS8LD4kSSXn8ssv57zzzmPkyJGk9O8F0rt06cJVV11VwGSSVNwsPiRJJefaa6/l+uuv5/jjj2eDDf7dA7lv3768+uqrBUwmScXN4kOSVHLef/99evfuvcb+Jk2aUFZWVoBEklQaLD4kSSVniy224IUXXlhj/5QpU9h2220LkEiSSkONZrtaLSI6AIcCWwK/SyktjIhdgY9SSu/lImCuuc6HJJWek08+mWOPPZZly5aRUuLpp59mwoQJXHTRRdx0002FjidJRavGxUdE7ERmBfP3gF7AxWTW+tgb2Ao4OBcBc811PiSp9AwfPpyVK1fy29/+lmXLlnHooYfSuXNnrrjiCoYOHVroeJJUtGpz52MsMC6ldFZELKmw/wFgeN3GkiQpt0aMGMGIESNYuHAhq1aton379oWOJElFrzbFx07AL6vZ/zHQoW7iSJKUP++88w6vv/46ANtuuy1bbLFFgRNJUnGrTfFRBrSuZv/3gPl1E0eSpNz79NNP+eUvf8mkSZNo1Cgz90pKif3335+bbrqJzTbbrMAJJak41Wa2q3uBsyJiw+x2iogewP8Cd9dxLkmScuaII47g7bff5oknnmD58uUsX76cadOm8d577zFihEMAJSlXanPn42RgCrAAaA48Saa71XTgzLqPJklSbjzwwAM8/PDD7LLLLuX7dt11V/74xz+y1157FTCZJBW3GhcfKaUvgN0iYgDQl8xdkxdSSg/lKpwkSbnQrl07WrRoscb+5s2b2+VKknKo1osMppQeSSmNTSldZOEhSWqIRo8ezQknnMDcuXPL982dO5eTTjqJ0aNHFzCZJBW32i4y2AfYE2hPlcIlpfSbOsz1rUXEpsBDZF7bBmSmB76+sKkkSfXJ5ZdfzuzZs+nRowddunQBMsXHRhttxPz587niiivK27700kuFiilJRac2iwz+BrgQeB+YB6QKh1O131QYS4D+KaVlEdECeCUi7kkpfVroYJKk+uGggw4qdARJKkm1ufPxa+DolNIfcxWmLqSUvgaWZTc3BCL7kCQJgLPOOqvQESSpJNVmzEcj4OH1uVhE9I+ISRExNyJSRAyrps0xEfFeRCyPiJkRsfu3uM6mEfEP4EPg4pTSwvXJLUkqLgsWLGDBggXl2y+//DJnnnkmt99+ewFTSVLxq03x8Qdg+HperyXwCnA8mUULK4mIocA44AKgD/AUcH9EdKvQZlZEvFLNo/PqNimlz1NKOwCbAwdHhCuwS5LK/exnP2Py5MkALFy4kP79+/PXv/6Vo446iksuuaTA6SSpeNWm29UYYEpEvEimgFhR8WBK6RfrOkFKaQqZtUKIiPHVNDkRGF9hgPioiNgXOBo4PXuOHWsaOKU0L3sHZHfgrpp+nySpuL300kvsvPPOANx111307NmT559/nnvvvZdTTjmFk046qcAJJak41ebOx/nAQGAl0BpoV+WxXiKiKbATMLXKoanAD2pxng4RsXH2eSugP/DmWtqOjIgZETGj4u13SVJxKysro2XLlgA89NBDHHDAAQD07duXDz74oJDRJKmo1ab4OAY4OKX0Hyml/VNKgys+6iBLW6AxmZm0KpoHdKzFeboDT2TveDwBXJlSerm6himl61JK/VJK/dq1W+/6SZLUQHz3u9/lnnvu4YMPPmDq1KkMHDgQgHnz5rHpppsWOJ0kFa/aFB9lwIu5ClJXUkrPpZR2TCntkFLafl2zc0XE4Ii4bvHixfmKKEkqsLPOOotTTz2VHj16sPPOO/P9738fgAceeIA+ffoUOJ0kFa/aFB+XASdERK6mrV0IfA1UHRzeAfgkR9ckpTQ5pTSyVatWubqEJKmeOfDAA5kzZw4zZszg73//e/n+vfbai0svvbSAySSpuNVmwPnuZMZP/FdEvMaaA84PWJ8gKaWvImImsDdwZ4VDewN3r8+5JUmqqkOHDnToUPnvXavvgEiScqM2xcdC4J71uVhEtAR6ZjcbAd0iYkdgUUppDnApMCEingOmA0cBnYFr1+e668g0GBjcs2fPdbaVJEmS9O3VuPhIKa3vGh8A/YBHK2yPyT5uAYallP4SEZsBZwKdyEzpOyil9H4dXLtaKaXJwOR+/fqNyNU1JEmSJNXuzsd6Syk9BnzjmJGU0jXANXkJJEmSJClvvrH4iIiXgD1SSp9FxMtAWlvblNL2dR0uH+x2JUmSJOXHuu583A38q8LztRYfDZXdriSpNM2bN48JEybwzjvvcO6559K2bVumT59O586d2XzzzQsdT5KK0jcWHymlMRWen53zNJIk5cHMmTP50Y9+xOabb86rr77KKaecQtu2bXnwwQd56623uO222wodUZKKUo3X+YiIRyJijWVfI2KTiHikbmPlj4sMSlLpOfnkkzn++ON58cUX2XDDDcv377PPPkyfPr2AySSpuNVmkcEfAk2r2b8RmTVAGiQXGZSk0jNz5kwOP/zwNfZ36tSJefPmFSCRJJWGdc52FRF9K2xuHxGLKmw3BvYB5tZ1MEmScqVZs2Z89tlna+x/4403aN++fQESSVJpqMlUuzPIDDRPwNRqjpcBo+oylCRJufTjH/+YMWPGcOeddwIQEcyePZtTTz2VIUOGFDidJBWvmnS72hzYksz6HP+Z3V796AJsklK6KWcJc8wxH5JUesaOHcuiRYto164dy5YtY7fddqNnz55suummnHfeeYWOJ0lFa513PiqsLl6b8SENhlPtSsXvmf5bFjrCOu087Z1CRygpm2yyCU8++SSPPPIIL7zwAqtWraJv377stddehY4mSUWtViucR8R3gP5Ae6oUIymlS+swlyRJOTdgwAAGDBhQ6BiSVDJqXHxExCHATcBKYAGVFxxMgMWHJKnBePHFF3n00UeZP38+q1atqnTsoosuKlAqSSputbnzcQ5wCfC7lNLXOcqTdxExGBjcs2fPQkeRJOXJRRddxGmnnUb37t3p0KEDEVF+rOJzSVLdqk3x0QG4oZgKD3DMhySVossuu4w//OEPHHnkkYWOIkklpTaDyKcA389VEEmS8mXVqlX86Ec/KnQMSSo5tbnz8SDwvxHRC3gZWFHxYErpnroMJklSrhx99NHcfPPNnH/++YWOIkklpTbFxx+zX39bzbFEZrVzqWg1hOlawSlbpZo466yzGDRoEH369KF37940adKk0vGbbmqwy1dJUr1W4+IjpVSU63xIkkrPGWecwdSpU+nbty+fffaZg8wlKU9qtc5HMSrEbFf+BV2SCuuaa67htttuY+jQoYWOIkklpTbrfJz4Tccb6iKDznYlSaWnWbNm9OnTp9AxJKnk1ObOx6gq202ATkAZMB8XGZQkNRC//vWvufzyy7n66qvtciVJeVSbMR+bV90XER2Am4Hr6zKUJEm59MQTTzBt2jTuu+8+tt122zUGnE+aNKlAySSpuK3XmI+U0ryIOAO4A/hr3USSJCm32rZty4EHHljoGJJUcupiwHkjMqufS5LUINx8882FjiBJJak2A86r/okoyIz5+BXwRF2GkiRJklR8anPn464q2wlYADwCnFRniSRJyoHtt9+exx9/nNatW7Pddtt940Dzl156KY/JJKl0uMigJKkkDBkyhA033LD8ubNcSVL+1aj4iIgmwJPAYSmlN3MbKb8KscigJCn/zjrrrPLnZ599duGCSFIJq9HdjJTSCmBzMl2tikpKaXJKaWSrVq0KHUWSlCcDBgzg888/X2P/F198wYABAwqQSJJKQ226Ut0CuAq4JKnBe+yxx/jqq6/W2L98+XKeeMI5VCQpV2oz4LwFcEhE7A3MBL6seDCldFxdBpMkqa698MIL5c9feukl2rRpU7799ddf88ADD9ClS5dCRJOkklCb4mMbYPWn9hZVjhVddyxJUvHp168fEUFEMHDgwDWON2vWjCuvvLIAySSpNNRmtqs9cxlEkqRce++990gp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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.data_cleaning import DropColumns\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\", \"Address\"]\n", + "objs = [DropColumns(columns)]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"DropColumns\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a70f74ab", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3xUdbrH8c8DBAihSAgEghQRXSwgJVdpchWB9bJigyuuheIVFBZXFvvCBVEUrwKKCroIC4rIrm13ZcWl2CiCQJSliCJIB0OVIqHmuX/MEJMQIIHMTJj5vl+v82LO7/zOOc+ZaDLP/Jq5OyIiIiIiIqFWLNIBiIiIiIhIbFDyISIiIiIiYaHkQ0REREREwkLJh4iIiIiIhIWSDxERERERCQslHyIiIiIiEhZKPkQk6phZNzPzbNvPZrbWzP5mZreYmUUorgnZYso0s91m9o2ZjTOzZmdw3RvNrN8ZnH+VmT1uZkXqb4KZNTOzt81ss5kdMrMdZjbDzLqaWfECXmuCma0NUagiIpJPReoPjYhIIftvoBnQHvhf4CAwGZhhZvERimlbMKbmwM3Ay8BFwBdm9vRpXvNG4LSTD+AqYBBF6G+CmfUF5gKJwCNAG+AuYCXwCnBd5KITEZHTVSLSAYiIhNBid1+VbX+imb0DvAM8C9yX10lmFgcc8dCswnrI3edn2//YzF4BngceM7M0d38vBPc9a5hZK2AE8LK7/z7X4X+Y2QggIfyRiYjImSoy33KJiIRD8IP9P4AeZlbGzGoHu0H1NrNnzWwzgRaScyzgD2b2XbDbzxYze9nMyme/ZvD8p8ysv5ltNLMMM5tlZg3zGZMDDwPpQN9s161sZn8ys5Vmtt/MNpjZW2ZWPVudCUBXoHq2Ll1rg8dKm9nzZrbMzPaZ2Y9mNsXM6mU7/3ECrR4Ah7Ndo5SZbTOz53PHm61bW71jMQSfu7mZLTSzA8Fubscld2Z2nplNCl77oJktNrObclV7BNgZfE/yer9Wu/uSbNe83MxmBp/xZzP72MwuP8lbfqyrmZvZVSd4ttrZytaa2Ztmdmfwv4UMM5ttZheYWULwZ7TDzNLNbLiZlcjjPtcH/9vZHtzeNLNzct37fjNbEbz+LjNblMd7IyJyVlPLh4jEoqkEuiqlAuuDZf2BhUBPoDhwAHgKeAwYBUwBLgaeBC4zs/9098xs1+wSvFYfoBTwBIFWjQvcfeepAnL3Q2b2MdDJzEq4+xECXY4OBGPYBqQADwBzzayeux8IxlMZ+A/g+uDlDgb/LQWUA4YAW4LX6w3MM7OL3P1HYCxwLvA/QEvgaDCeg2Y2HvgfM3sseK9j7gE+d/dvs5WVB/4K/B+wCrgVeNHM9rr7BAAzqwF8CWwF/hB8ps7Ae2Z2o7t/EBzLcTXw91z3zJOZNQA+B74BugEOPAp8bmZN3f3fp7pGPrUCzieQGJUEXgDeA37I9rytgAHAamB0rvNHAv8EbgN+RaDl7SiBxBEzux0YTuC/m9lAPNCAwM9MRCR6uHtUbQT6AX8HfA/cHel4tGnTFv6NXz6E1j3B8V8Hj3cGagdffwVYtjqJBD7ET8h17h3B+tdnK3NgO5CQraw2cBh4MlvZBGDjSeIeGrxW8gmOFwdqBOvclN/r5jq/DLAX+EO28seD1yyRq34dAh+Q78xW1iBY99Zc989RFiyfAaw79r4C4wgkHJXyqLc4+Do5eK2h+fxZvwv8BJyTraw8gZaT93PFuDbb/lXB+1x1gv92amcrWxu8XoVsZb8P1hub6/yvgE/zuM/rueq9TCCxtGz7X0X6/x1t2rRpC/UWVd2ugk3dI4DWQCPgITOrFNmoRKQIOjbbVfYxHX939+z7TQl8w/1mrnP/AhwB/jNX+VR3//nYjruvBeYTGFx+2nGZWS8z+7eZ7Qve91hLza/ydcHA7F5fmtlPwfN/Bsrm53x3/wGYRqCl45h7CCQQ7+eqfpRAS0B2fwFqAse6iV1LoNVpt5mVOLYF73FZ7u5s+dQK+Ke7/5Qt7j3ABxz/MzoT89x9d7b9Y60+03LV+5ZAgpjbh7n2lxJomUoO7i8EGprZS2bWxszKnGnAIiJFUVQlH8DlwHJ33+Tu+4CPgHYRjklEip5jHw63ZCvbkqtOYl7lHugOtYPju8Ok53GfdH754J3fuA4R+Jad4JiJ0cBMAjNjXU4gKQIofaqLmVkHAl2hVhDo7nMFge5Z2/JzftBooIWZXWpmCQRafsa7+6Fc9Xa5++FcZcfek2PvQRUC3dMO59qeCx6vROC9zQBq5TO+RI7/2QH8CFTM5zXyY1eu/UMnKc/rvc3d9e5Y17hjdd8AehH4GU0DdprZ+9nHnoiIRIMilXyYWSsz+8DMNgUH6HXLo05vM1sTHNCYZmZXZjucAmzKtr+Jgv3hF5HY8BsCXV7SspXlntnq2IfFqtkLg9/UV+L4D5PJHC+ZnL+TTsjMShKYTnZ+MMGBwDiCj939AXef7u4LCYyXyK9bgVXu3s3dp7r7AuDfFGwcwVQC3Y7uAX5LYAzJmDzqVbTALGHZHXtPjr0HOwh0k/qPE2ybg8/+GdDWzErlI76d5PoZBVXl+MQgu2PjSUrmKo9Ia7kH/MndLweSCIwFuZxA8igiEjWKVPJBoCvAMuB+At985WBmnQkM2nuaQLeqL4CPzKxmOIMUkbOXmXUkMDD7VXfff5Kq8wl8i31rrvLOBCbr+CxXeftgy8Cx+9Qm0EoxLx8xGYEByFUITLl7TBkCLQPZdc/jEgcJDFDOrQyBrlbZ3Ulg7Efu88nrGh4YVP+n4Hl9gJnuvjqPexUHOuYqu5VAN7Fjyce/CIwZWe7ui/LYjsXxDIEk4Nk87nNsxqwGwd3PCbz35bIdLwd04PifUXbrgv9emqv8Nyc5JyzcfReB1pyDwH/k9WWc5VxEM/s2Kludm81sWnBmsbxm9qoanHnrgVzllwS/4Mv9376IyBkrUrNduftUAt+yHZs+Mrd+BAZ/vhbcv8/MriXQVP0YsJmcLR3VgQUhC1hEirqGZpZE4NvtmgQmpPhvAgOcHzvZie6+08yGE1h742cCv5suIjBz1ByO78OfAUw3s+cI9OUfDOwhZzIBUNLMjnWdKkNg7MUdBMaGDHH3v2er+y/gETP7I4HfZa2BTnmE+w2QaGa9gEXAAXdfGjz/RgtMl/tPArN73UdggHbu8wEeMLOPgKPuvijb8XEEBqVfxvEJxjF7gWeD7/f3BFpJ2gDdso2lGRh8jllm9jKBFpWKBBKAOu5+F4C7z7LAiu0jzOxiAoPF1wfrXgPcTaAb2RICs31dR2Bmsf8j0IL1CIH39okTxIq7bzGzzwn8fLcTaFG6g8Ag+7AzszEE3sN5wVg6Emi9WQjUz+OUarn2UwnMyPZ2trIEAl/SvUmgW1cO7v6jmf0OmGBmH7n7N8HWqzcIjIH6y5k9lYjI8cw9d0+DoiE4uLKP/zJFY0lgP/Bbd38nW71RwKXu/p/B7hArCMwusptAl4rm7r7jBPfoSWBaTRISEprUq1cvr2oicpbZvn0769aty9o3M+Li4ihTpgyJiYmcc845BBob4ODBgyxbtoxatWqRlJSU4zruztatW9m2bRuHDh2iePHiVKxYkerVq1O8+C+NB2lpaVStWpVixYqxbds2jhw5QkJCAjVq1KBMmV/GDa9du5YdO375dVSsWDFKlixJQkICSUlJlC1bNsf9MzMz2bBhAz/99BOZmZmUK1eOGjVqsGzZMqpVq0ZKSgoAR48eZd26dezZs4ejR49SsmRJ6tevj7uzefNmduzYkSOm1atXU65cOWrXrp31nBs2bGDXrl0cORJoKGnSpEmOWL7//nsyMjKoX79+1nuX/bn27NlDnTp12LBhAxkZGcTFxZGcnEyVKlVy1D106BCbN29mz549HDlyhOLFixMfH0+lSpWoVClnj6e0tLSfCIx3aUmgK9JeAsnVG8BbwVYZvvzyS+/fvz/z58/H3WnatClDhw7l8st/WeqjW7dufPbZZ6xduzarbOPGjfTq1YvZs2dTunRp7rrrLurUqUOPHj1Ys2ZN1vtTu3ZtWrZsyZtv/jL3wGeffcbVV1/NjBkzaNOmTY77zJw5k40bN5603oQJE+jevXvWfV5//XXGjx/PN998w+7du0lJSeHGG29k8ODBpKSk8PLLL9OtWzdOpEePHsyaNYvvvvvuuGPbt2+ncuXKfPrpp1x11VXHHb/11ltZtWoV8+fP54knnmDs2LEsW7aMxETN8isip81OeCTS022daAP2EfjG7Nh+CoFvtFrlqjcQ+C7b/vXASgLzrvfM7/2aNGniIiKnA/D+/ftHOoyQ2blzp5ctW9YHDBiQ5/GuXbt69erVC/2+wCLP3+/wqJaQkODjx48/4fG9e/d62bJl/bnnnsvz+LZt2xzwTz/9NM/jO3bs8KpVq/ott9ziJUqU8A8//LAQohaRGHfC39lFqttVYXD3DwhMsZgvwdlgOtStWzd0QYmInIW2bdvGd999x8iRI8nMzKR3796RDkny8NZbb3Ho0CG6du16WucnJiYydOhQunfvzp133kn79u0LOUIRkV8UtQHnJ7OdwDzyuWeUSSYwpeJpcfcp7t6zQoUKZxKbiEjU+fDDD7nyyitZsGABr7/+OtWq5R5mIEXBa6+9xg033EDlypVP6/zMzEzGjx9PmTJlWLhwIQcOnHJheRGR03bWJB8emFM+DWib61BbAgPqREQiwt0ZMmRIpMModN26dcPdWbduHZ065TXOPWDChAlZYxwkvBYvXsyiRYvo0aPHaV/jhRdeYOnSpSxcuJB9+/bRv3//QoxQRCSnIpV8mFlZM2toZg0JxFYzuH9sKt0RQDczu9vMLjKzkQTGgrx6BvfsYGZjdu/eferKIiIiRciYMWM477zzcgxmL4gVK1bQv39/XnrpJS6++GLGjRvHyJEjmTt3biFHKiISUNTGfKQCn2bbHxzcXicw+PyvZlYJGEBgmsFlQHt3X3fclfLJ3acAU1JTU0//ayMRiXp79uxh69atHD6ce9kNOV1xcXFUqVKF8uXLRzqUImffvn2sWrUKCHSLWr9+PYsXLyYxMZGaNQPfx+3fv59Jkybx8MMPHzcDGcDOnTtZv349P/0UmFl51apVnHPOOVStWpWqVaty5MgRunbtym9+8xtuv/12ANq1a8fdd99N9+7dWbx4cY7Z2kRECkORnWo33FJTU33RokWnrigiMWfPnj2kp6dTvXp14uPj8/ygJwXj7mRkZLBp0yaSk5PzTEDMLM3dU/NzucKPMLKOTdGbW9euXZkwYQIA48ePp0ePHqxfvz5r2uXsjk3nm9ugQYN4/PHHefLJJ3n55ZdZtmxZjvEi+/bto0GDBnTo0IGRI0cW3kOJSCw54R/KmE8+ss121eP777+PdDgiUgStWrWKlJQUfQscAvv372fz5s3kNeNgLCcfIiJnuRMmH0VqzEckaLYrETmVw4cPEx8fH+kwolJ8fLy6somIxJCYTz5ERPJDXa1CQ++riEhsifnkQ7NdiYjkT+3atZk5c2akwxARkbNYzCcf6nYlIiIiIhIeRW2qXRGRs8L8VueH9PpNZ60O6fVFREQiQcmHiMhZrnbt2txzzz1MnDiRLVu2cOONN/LKK6+QkZHBnXfeyZdffsmRI0do0aIFr776Kueeey4AV111FVdeeSWffPIJS5YsoVmzZrz11lskJSUBMHHiRAYMGMC+ffvo169fjnsuWLCA+++/nxUrVhAfH0/Hjh0ZMWIEJUuWxN3p168fkyZN4sCBA9SqVYvJkydz6aWXhv29CQV7dFukQ4gK/kzlU1cSkagT892uNOZDRKLBpEmTmDZtGqtXr2blypUMGTKEzMxMunfvzrp161i/fj3x8fH06dMnx3lvvfUW48ePZ+vWrRw6dIhhw4YB8M0339CrVy8mTpzI5s2b2bFjBxs3bsw6r3jx4jz//PNs376defPm8fHHHzN69GgApk+fzqxZs1i5ciW7d+/m7bffplKlSuF7M0REpMiK+eRDYz5EJBr06dOHGjVqkJiYSP/+/Zk8eTKVKlWiY8eOlClThnLlytG/f38+//zzHOd1796dCy+8kPj4eG655RYWL14MwLvvvst1111Hq1atKFWqFE8++STFiv3yJ6NJkyY0bdqUEiVKZLW8HLt2XFwce/fu5dtvv8Xdueiii6hWrVr43gwRESmyYj75EBGJBjVq1Mh6XatWLTZv3sz+/fu55557qFWrFuXLl6dVq1b89NNPHD16NKtu1apVs16XKVOGffv2AbB58+Yc10xISMjRerFy5Uquu+46qlatSvny5fnjH//I9u3bAWjdujV9+vThd7/7HVWqVKFnz57s2bMnZM8uIiJnDyUfIiJRYMOGDVmv169fT0pKCsOHD+e7777jyy+/ZM+ePcyaNQsA91MvCF6tWrUc19y/fz87duzI2u/Vqxf16tXj+++/Z8+ePTz99NM5rvv73/+etLQ0vvnmG1auXMlzzz1XGI8pIiJnOSUfIiJRYNSoUWzcuJGdO3fy1FNP0blzZ/bu3Ut8fDznnHMOO3fuZPDgwfm+XqdOnfjnP//JnDlzOHToEAMHDiQzMzPr+N69eylfvjxly5bl22+/5ZVXXsk6tnDhQr788ksOHz5MQkICpUuXztFlS0REYlfM/zXQgHMRiQa33XYb7dq1o06dOpx//vkMGDCAvn37kpGRQVJSEk2bNuXaa6/N9/UuueQSRo0axW233Ua1atWoWLFi1ixZAMOGDeOtt96iXLly9OjRg86dO2cd27NnDz169KBixYrUqlWLSpUq8dBDDxXq84qIyNnJ8tP8HgtSU1N90aJFkQ5DRIqgFStWcNFFF0U6jBOqXbs2Y8eOpU2bNpEO5bSc6P01szR3T83HJcL6h0xT7RYOTbUrEtXsRAdivuVDRERERETCQ8mHiIiIiIiEhVY4FxE5y61duzbSIYiIiOSLWj5ERERERCQsYj750GxXIiIiIiLhEfPJh7tPcfeeFSpUiHQoIiIiIiJRLeaTDxERERERCQ8lHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFhonQ8RkdNgj24L6fX9mcohvb6IFL5Zs2YxbNgw0tLS2Lx5M+PHj6dbt25Zx7t168brr7+e45wrrriC+fPnZ+0fPHiQBx98kMmTJ5ORkcE111zD6NGjOffccwGYPn06v/nNb5gzZw5XXHFF1nljx46lb9++/Pvf/+b8888P7YOKnAG1fIiInOVq167NsGHDaNCgARUqVKBz584cOHCACRMm0LJlyxx1zYxVq1YBgQ9CvXv35r/+678oW7YsLVq04Mcff6Rv375UrFiRevXq8fXXX+e4z9ChQ7n44oupWLEi3bt358CBAwBceumlTJkyJavu4cOHSUpKynG+SLTbt28fl156KSNHjiQ+Pj7POm3atGHLli1Z29SpU3Mc79u3L++99x6TJ09m9uzZ7Nmzh+uuu46jR48C0K5dO+6++266du1KRkYGEFhotF+/fgwbNkyJhxR5MZ98aJ0PEYkGb7/9Nv/6179Ys2YNS5YsYcKECfk+b8iQIWzfvp1SpUrRrFkzGjduzPbt2+nUqRP9+vXLUX/SpElMmzaN1atXs3LlSoYMGQJAly5dePPNN7PqTZ06lWrVqtGoUaNCe0aRoq59+/Y8/fTTdOrUiWLF8v6IVapUKapWrZq1JSYmZh3bvXs348aN47nnnqNt27Y0btyYiRMnsmTJEmbOnJlVb9iwYRw5coRHH30Ud6dbt240b96ce++9N+TPKHKmYj750DofIhINfv/735OSkkJiYiIdOnRg8eLF+TrvpptuokmTJpQuXZqbbrqJ0qVL06VLF4oXL07nzp2Pa7no06cPNWrUIDExkf79+zN58mQA7rjjDqZOncqePXsAmDhxInfeeWfhPqRIFJgzZw5VqlThwgsvpEePHmzdujXrWFpaGocPH6Zdu3ZZZTVq1OCiiy7iiy++yCpLSEhgwoQJjBo1ittvv51///vfjBs3LqzPIXK6Yj75EBGJBlWrVs16XaZMGfbt25ev85KTk7Nex8fHH7ef+zo1atTIel2rVi02b94MQEpKCi1atOC9997jp59+4qOPPuL2228/rWcRiVbXXnstb7zxBh9//DHDhw9nwYIFtG7dmoMHDwLw448/Urx4cZKSknKcl5yczI8//pijrGXLltxxxx1MnjyZ4cOHU7169bA9h8iZ0IBzEZEolZCQwP79+7P2c394OR0bNmzIer1+/XpSUlKy9rt27crYsWM5cuQIzZo104chkVxuvfXWrNf169enSZMm1KpViw8//JCbb765QNdKT0/nww8/pEyZMsyaNYu77rqrsMMVCQm1fIiIRKnLLruM5cuXs3jxYg4cOMDjjz9+xtccNWoUGzduZOfOnTz11FN07tw569iNN97IV199xciRI+nSpcsZ30sk2qWkpHDuuefy/fffA4EWzKNHj7J9+/Yc9dLT03O0bgL07NmTCy64gJkzZ/Lmm2/mmPBBpChT8iEiEqUuvPBCBg4cSJs2bbjggguOm/nqdNx22220a9eOOnXqcP755zNgwICsY/Hx8XTs2JE1a9YU+FtckVi0fft2Nm3aRLVq1QBo0qQJcXFxzJgxI6vOxo0bWbFiBc2bN88qmzBhAjNnzuT111+nWbNmPPLII9xzzz3s3Lkz7M8gUlDm7pGOoUhITU31RYsWRToMESmCVqxYwUUXXRTpMCKudu3ajB07ljZt2pywzhNPPMHKlStzzHx1Kid6f80szd1T83GJsP4hC/UaL7EiGtey2bdvX9ZU1s2bN+fRRx/l+uuvJzExkcTERB5//HE6duxItWrVWLt2LY899hgbNmxgxYoVlCtXDoBevXoxZcoUJkyYQKVKlejXrx+7du0iLS2N4sWLs2HDBi699FKGDBnCfffdB8ChQ4dITU2lfv36TJo0KWLPL5KNneiAWj5ERKRQ7Ny5k3HjxtGzZ89IhyISEYsWLaJRo0Y0atSIjIwMBg0aRKNGjRg4cCDFixdn6dKl3HDDDVx44YV07dqVX/3qV8ybNy8r8QB44YUXuOmmm+jcuTMtWrSgbNmyTJkyheLFi+Pu3HXXXaSmptKnT5+sc0qWLMkbb7zBO++8w9/+9rdIPLpIvmnAuYiInLHXXnuNvn37cuedd9KqVatIhyMSEVdddRUn61Eybdq0U16jVKlSvPTSS7z00kvHHTOzHF2ysmvYsCGHDh3Kf7AiERK1yYeZ/Q24CvjY3TtFOBwRkbPe2rVrT3isR48e9OjRI3zBiIjIWSmau12NBDTdioiIiIhIERG1yYe7fwbsjXQcIhIdNDlHaOh9FRGJLWFPPsyslZl9YGabzMzNrFsedXqb2RozO2BmaWZ2ZbjjFBE5Ji4ujoyMjEiHEZUyMjKIi4uLdBgiIhImkWj5KAssA+4HjvtrbmadCXSZehpoBHwBfGRmNbPVWWxmy/LYUnJfT0TkTFWpUoVNmzaxf/9+fVNfSNyd/fv3s2nTJqpUqRLpcEREJEzCPuDc3acCUwHMbEIeVfoBE9z9teD+fWZ2LdALeCx4jYZhCFVEBIDy5csDsHnzZg4fPhzhaKJHXFwcycnJWe+vSChpfZbCEY3rs0h4FanZrsysJNAEGJbr0HSg+fFnnPH9egI9AWrWrHmK2iISy8qXL68PySIiImeoqA04TwKKA+m5ytOBqgW5kJnNBN4B2pvZRjNrlruOu49x91R3T61cWZm8iIiIiEgoFamWj8Lk7m3yU8/MOgAd6tatG+KIRERERERiW1Fr+dgOHAWSc5UnAz+G4obuPsXde1aoUCEUlxcRERERkaAilXy4+yEgDWib61BbArNeiYiIiIjIWSrs3a7MrCxwrI9TMaCmmTUEdrr7emAEMNHMFgBzgXuBFODVEMWjblciIiIiImEQiZaPVODr4BYPDA6+fgLA3f8K9AUGAIuBlkB7d18XimDU7UpEREREJDwisc7HZ4Cdos5oYHQ44lHLh4iIiIhIeBSpMR+RoJYPEREREZHwiPnkQ0REREREwkPJh4iIiIiIhEXMJx9m1sHMxuzevTvSoYiIiIiIRLWYTz405kNEREREJDxiPvkQEREREZHwiPnkQ92uRERERETCI+aTD3W7EhEREREJj5hPPkREREREJDyUfIiIiIiISFgo+RARERERkbCI+eRDA85FRERERMIj5pMPDTgXEREREQmPmE8+REREREQkPJR8iIiIiIhIWCj5EBERERGRsFDyISIiIiIiYRHzyYdmuxIRERERCY+YTz4025WIiIiISHjEfPIhIiIiIiLhoeRDRERERETCQsmHiIiIiIiEhZIPEREREREJCyUfIiIiIiISFko+REREREQkLJR8iIiIiIhIWMR88qFFBkVEREREwiPmkw8tMigiIiIiEh4lIh2AiIhIpGRkZLB69WoAzj//fOLj4yMckYhIdIv5lg8REYk9Bw8epG/fviQmJnLZZZfRoEEDEhMTuf/++zlw4ECkwxMRiVpq+RARkZjTq1cvpk+fztixY2nWrBkA8+bN47HHHmPv3r38+c9/jnCEIiLRScmHiIjEnHfeeYf333+ftm3bZpXVqVOHKlWq0LFjRyUfIiIhom5XIiIScxISEqhevfpx5dWrV9e4DxGREFLyISIiMee+++5j8ODBZGRkZJVlZGTw5JNPct9990UwMhGR6KZuVyIiEnPmz5/P559/TvXq1WnQoAEAS5cu5ciRI/z8889c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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.data_cleaning import DropDatatypeColumns\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\", \"Address\", \"X\", \"Y\"]\n", + "objs = [DropDatatypeColumns(float)]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"DropDatatypeColumns\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7c8b687e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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JYVFixbtHUUgIhITlWrC+YG4+w9mtoTIpMrnilR1AWaEE5WISOWkXyDjV35+PrfddhvPPfcc3bt3B+C0004jOzubMWPGcOGFF7J69WrGjRtHdnY2p59+OgCnn346b731FuPGjWPy5MmF1xs6dCi7d+/m/fff55xzzuGRRx5hwIABoTybiMS/StXzEV06sI2ZtSESW7Po8d6ldO8nsivtNWZ2spk9RGQuyKOHcU8NuxIRkSPGrl272LVrF1WrFt+YvWrVqhQUFACQl5dXWLa/NgDz589nwoQJTJkyhVatWjF27FiGDRvG6tWrY/wUIpKoKlvPRwZQdJnI0dHXk0Qmn//DzOoCI4hsMrgC6ObuX+xzpTJy91nArIyMjL6HHraIxLtt27axadMmdu3aFXYocSMpKYn69etTs2bNsEOpdHbs2MHnn38ORFakWrduHdnZ2dSpU4dmzZpx3nnnMWzYMFJTU2nevDlvvvkmTz31FPfddx8AJ510Eunp6fTv358xY8ZQt25dXnrpJV5//XVefvllALZv305mZiYDBw6kQ4cOAPTt25cZM2aQmZnJggULqFKlUv2NUkTiQKVdajdoGRkZnpWVFXYYIlIJbdu2jZycHJo0aUJycjJm+19BUMrG3cnPz2f9+vU0aNCg1ATEzJa4e0ZZLlfxEYZrwYIFnH/++fuU9+7dmylTprBx40Zuu+025syZw5YtW2jevDnXXHMNt9xyS+F/n5999hnDhg1j0aJF7Nixg/T0dG6++WZ69+4NwO9+9zveeecdPvzww2JLQK9fv57WrVszcuRIbrrppn1iEBEpg/3+oEz45MPMugPd09PT+3722WdhhyMildDnn39O48aN99kfQw5fXl4eGzZsID09fZ+6RE4+RESOcPtNPhK+P1WrXYnIwezatavYJn9ScZKTkzWUTUQkgSR88iEiUhYaahUb+lxFRBJLwicfWu1KRKRsWrRowdy5c8MOQ0REjmAJn3xo2JWIiIiISDAq21K7IiJHhHc7Hh/T65+9UPssiIhI/FHyISJyhGvRogXXXnstU6dO5euvv+ZXv/oVf/3rX8nPz+eqq67ivffeY/fu3bRv355HH32UH/3oRwD87Gc/o0OHDsybN49ly5Zxzjnn8PTTT5OWlgbA1KlTGTFiBDt27ODmm28uds/333+fgQMH8vHHH5OcnEyPHj24//77qVatGu7OzTffzLRp09i5cyfNmzdn+vTptG7dOvDPJhZs2OawQ4gLfm+9sEMQkRAk/LArzfkQkXgwbdo0XnvtNVavXs2qVau46667KCgoIDMzky+++IJ169aRnJzMDTfcUOy8p59+mieeeIJNmzbxww8/MGbMGAA++ugjrr/+eqZOncqGDRv45ptv+OqrrwrPq1q1Kg888AC5ubm88847vPHGG0yYMAGAOXPmsHDhQlatWsXWrVt59tlnqVu3bnAfhoiIVFoJn3xozoeIxIMbbriBpk2bUqdOHYYPH8706dOpW7cuPXr0ICUlhWOOOYbhw4fz5ptvFjsvMzOTE044geTkZC6//HKys7MBeP7557nooovo2LEjRx99NHfeeWex3a7POOMMzj77bI466qjCnpe9105KSmL79u188sknuDsnn3wyjRo1Cu7DEBGRSivhkw8RkXjQtGnTwvfNmzdnw4YN5OXlce2119K8eXNq1qxJx44d+e6779izZ09h24YNGxa+T0lJYceOHQBs2LCh2DVr1KhRrPdi1apVXHTRRTRs2JCaNWvyhz/8gdzcXAA6derEDTfcwO9//3vq169Pv3792LZtW8yeXUREjhxKPkRE4sCXX35Z+H7dunU0btyYsWPH8umnn/Lee++xbds2Fi5cCID7wTcEb9SoUbFr5uXl8c033xQeX3/99Zx00kl89tlnbNu2jXvuuafYdW+88UaWLFnCRx99xKpVq/jLX/5SEY8pIiJHOCUfIiJxYPz48Xz11Vds2bKFu+++m169erF9+3aSk5M59thj2bJlC6NHjy7z9Xr27Mk///lPFi1axA8//MDIkSMpKCgorN++fTs1a9YkNTWVTz75hL/+9a+FdR988AHvvfceu3btokaNGlSvXr3YkC0REUlcCf/TQBPORSQeXHHFFXTt2pWWLVty/PHHM2LECAYNGkR+fj5paWmcffbZXHjhhWW+XqtWrRg/fjxXXHEFjRo1onbt2oWrZAGMGTOGp59+mmOOOYa+ffvSq1evwrpt27bRt29fateuTfPmzalbty5Dhgyp0OcVEZEjk5Wl+z0RZGRkeFZWVthhiEgl9PHHH3PyySeHHcZ+tWjRgsmTJ9O5c+ewQzkk+/t8zWyJu2eU4RKB/iDTUrsVQ0vtisQ1219Fwvd8iIiIiIhIMJR8iIiIiIhIILTDuYjIEW7t2rVhhyAiIlIm6vkQEREREZFAJHzyodWuRERERESCkfDJh7vPcvd+tWrVCjsUEREREZG4lvDJh4iIiIiIBEPJh4iIiIiIBELJh4iIiIiIBELJh4iIiIiIBEL7fIiIHAIbtjmm1/d768X0+iIiImFQz4eIyBGuRYsWjBkzhtNOO41atWrRq1cvdu7cyZQpUzj33HOLtTUzPv/8cwD69OlD//79+cUvfkFqairt27dn48aNDBo0iNq1a3PSSSexdOnSYvf505/+xCmnnELt2rXJzMxk586dALRu3ZpZs2YVtt21axdpaWnFzheJdwsXLuTiiy+mSZMmmBlTpkzZp82qVau47LLLOPbYY0lJSaFdu3Z8/PHHhfU/+9nPMLNir1//+teF9StWrKB69erMmDGj2HXnzp1LUlISixcvjtnziVSEhE8+tM+HiMSDZ599lldffZU1a9awbNmyUn/p2d95d911F7m5uRx99NGcc845tGvXjtzcXHr27MnNN99crP20adN47bXXWL16NatWreKuu+4C4Oqrr+bvf/97YbvZs2fTqFEj2rZtW2HPKFLZ7dixg9atW/PQQw+RnJy8T/2aNWto3749xx13HPPmzWPFihXcddddpKamFmuXmZnJ119/Xfj629/+VljXunVrRo8ezXXXXUdOTg4AW7duJTMzk1tuuYX27dvH9iFFDlPCJx/a50NE4sGNN95I48aNqVOnDt27dyc7O7tM51166aWcccYZVK9enUsvvZTq1atz9dVXU7VqVXr16rVPz8UNN9xA06ZNqVOnDsOHD2f69OkA/OY3v2H27Nls27YNgKlTp3LVVVdV7EOKVHLdunXjnnvuoWfPnlSpsu+vWMOHD6dr166MHTuWdu3a0bJlS7p160bTpk2LtUtJSaFhw4aFr5K/owwZMoQTTjiBfv36ATBgwABq167NHXfcEbuHE6kgCZ98iIjEg4YNGxa+T0lJYceOHWU6r0GDBoXvk5OT9zkueZ2ivyQ1b96cDRs2ANC4cWPat2/PjBkz+O6773jllVe48sorD+lZROJRQUEBs2bN4pRTTuHCCy+kXr16nHnmmfzjH//Yp+0zzzxDWloarVq1YvDgwWzfvr1YfZUqVXjyySeZO3cuV155Jc888wxPPfUU1apVC+pxRA6ZJpyLiMSpGjVqkJeXV3i8cePGw77m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ioiIiCSuHTt20Lp1ax566CGSk5P3qT/xxBMZP348y5cvZ9GiRRx33HFceOGF5OTkFLbJy8uja9eu3H777aXeo3Xr1owePZrrrruu8LytW7eSmZnJLbfcQvv27WPybJWRuXvYMVQKGRkZnpWVFXYYIiISZWZL3D2jDE0P+QdZfn4+q1evBuD4448v9RePfeIatvlQbydF+L31Ar2fvm8VI+jvW9BSU1N55JFH6NOnz37bbNu2jVq1avHqq69ywQUXFKvLysrizDPPZM2aNbRo0aJYXUFBAR06dCAtLY2XX36Zq6++muzsbLKysqhWrVoMniZUtr+KhO/5EBGRxPP9998zaNAg6tSpw+mnn85pp51GnTp1GDhwIDt37gw7PBGppH744QcmTpxIzZo1adOmTbnOrVKlCk8++SRz587lyiuv5JlnnuGpp56Kx8TjgJR8iIhIwrn++ut5/vnnmTx5Mp999hmff/45kydP5sUXX6R///5hhycilcw///lPUlNTqV69Og888ACvv/46DRo0KPd10tPTGTJkCE8//TTDhg0rdwITD44KOwAREZGgPffcc7zwwgt06dKlsKxly5bUr1+fHj168Pjjj4cYnYhUNueffz7Z2dnk5uYyadIkLr/8ct555x0aNWpUruvk5+czffp0UlJSWLRoEe6O2X5HKMUl9XyIiEjCqVGjBk2aNNmnvEmTJmWa9yEiiaVGjRqkp6dz9tln89hjj5GUlMTkyZPLfZ2hQ4eye/du3n//fbKysnjkkUdiEG3lpuRDREQSzoABAxg9ejT5+fmFZfn5+dx5550MGDAgxMhE5EhQUFDA999/X65z5s+fz4QJE5gyZQqtWrVi7NixDBs2rHDRi0ShYVciIpJw3n33Xd58802aNGnCaaedBsDy5cvZvXs3//3vf7n44osL286cOTOsMEUkADt27ODzzz8HIknFunXryM7Opk6dOhx77LHcd999dO/enUaNGrF582bGjx/PV199xeWXX154jY0bN7Jx40ZWrVoFwEcffcR3331Hs2bNqFOnDtu3byczM5OBAwfSoUMHAPr27cuMGTPIzMxkwYIFVKmSGH0CcZl8mFlTYCpQH9gN3Onuz4UblYiIVBZpaWn06NGjWNlxxx0XUjQiEqasrCzOP//8wuNRo0YxatQoevfuzYQJE1i5ciWPP/4433zzDXXr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EFWaOR9mVg04A5hTomoO8NNyXKeGmR0TfZ8KdAJW7qdtPzPLMrOszZs3H1rgIiIiIiJSJpUm+QDSgKpATonyHKBhOa7TAFhkZv8G3gWecvcPSmvo7hPdPcPdM+rVq3coMYuIiIiISBnF3VK77v4f4PSytjez7kD39PT02AUlIiIiIiKVqucjF9hDpOeiqAbAxljd1N1nuXu/WrVqxeoWIiIiIiJCJUo+3P0HYAnQpURVF+Dt4CMSEREREZGKFOiwq+gE8L3jm6oAzcysDbAlupTu/cBUM3sfWAxcBzQGHo1hTBp2JSIiIiISgKB7PjKApdFXMjA6+v4OAHf/BzAIGAFkA+cC3dz9i1gFpGFXIiIiIiLBCHqfjwWAHaTNBGBCIAGJiIiIiEhgKs2cj7CYWXczm7h169awQxERERERiWsJn3xo2JWIiIiISDASPvkQEREREZFgJHzyoWFXIiIiIiLBSPjkQ8OuRERERESCkfDJh4iIiIiIBEPJh4iIiIiIBCLhkw/N+RARERERCUbCJx+a8yEiIiIiEoyETz5ERERERCQYSj5ERERERCQQSj5ERERERCQQCZ98aMK5iIiIiEgwEj750IRzEREREZFgJHzyISIiIiIiwVDyISIiIiIigVDyISIiIiIigTgq7ABERARs2OawQzgov7de2CGIiMgRLuF7PrTalYiIiIhIMBI++dBqVyIiIiIiwUj45ENERERERIKh5ENERERERAKh5ENERERERAKh5ENERERERAKh5ENERERERAKh5ENERERERAKR8MmH9vkQEREREQlGwicf2udDRERERCQYR4UdgIhULBu2OewQDsrvrRd2CCIiIhKChO/5EBERERGRYKjnQ/ZLf0EXERERkYqkng8REREREQmEkg8REREREQmEkg8REREREQmEkg8REREREQlEXCYfZnacmc03s4/MbLmZ1Qg7JhERERGRRBevq11NAUa4+1tmVgf4PuR4REREREQSXtwlH2bWCtjl7m8BuPuWkEMSERERERECHnZlZh3NbKaZrTczN7M+pbTpb2ZrzGynmS0xsw7lvM2PgR1mNsvMPjSzP1RI8CIiIiIicliC7vlIBVYAT0VfxZhZL+AhoD+wKPr1FTM7xd3XRdtkU3rcXd19Q7SuA9AG2AS8amYfuPvrMXgeEREREREpo0CTD3efDcwGMLMp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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.data_cleaning import KeepColumns\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\", \"Address\", \"X\", \"Y\"]\n", + "objs = [KeepColumns([\"Category\", \"Address\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"KeepColumns\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e1bf1520", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde5jOdf7H8ecbg0EO40yOqc0xh+lgycaiUjqx2a0tVIiySlkVJSW1LZ2psFGiX8ctWpVEiUJOK0pKDmUYJjkOOcz798d9m50TZpj7vsd9vx7XdV/zPXzuz+f9vV2Xud/zOZm7IyIiIiIiEmqFIh2AiIiIiIjEBiUfIiIiIiISFko+REREREQkLJR8iIiIiIhIWCj5EBERERGRsFDyISIiIiIiYaHkQ0QkBMysh5l5htdhM9tkZm+Y2e8ylHvQzE5ozXMzm5SljVQzW2pmN+Xfk+Q5pk+zxJTx9VSk4grGVjv4edeNZBwiIrGsSKQDEBGJcn8CfgYKA2cA9wOfmFlDd98JTAA+PIn6twFXBI8rAwOAf5nZTnd/+yTqPRkrgD45XN8c7kCyqA0MA+YBP0Y2FBGR2KTkQ0QktJa7+w/B4/lmlgR8DPwe+MDdfyaQnJyoA+6+4MiJmX0C/AT0Ak46+TCzOOCQ521H2t0ZYxIRETlCw65ERMJrV/BnHOQ87Co4RGmEmf3NzNaZ2W4z+8zMGh6vcnffA6wBamap83Yz+9LMtpvZDjNbYGaXZSlTO9h2PzN7PJgo/QaUDd6/Jvi+1GAdb5pZpnZyw8zGmFmymRXJcr2Ymf1qZk9nuFbRzF4IDln7zcxWm1nvLO87MsTtAjObYma7zCzJzJ4xs+LBMhcBc4Jv+TjDULCLgvevM7NlZrYn+P6vzSyn3hsRETkJSj5EREKrsJkVCX6xrg+MBLYCnx7nfX8FLiMwjKongWTivaxf2LMys8JADWBtllu1CQzx+hPQDVgMvG9ml+RQzRDgLKA3cDWw38xuJdCT8g3QlcCwqkbAZ2Z2Wg5xFMnhZcHbk4FKQMcsb7ucQKLzSrCO0gSGSHUCHgx+HtOB582sfw5xTw4+9zXA88BtwL3Be0uD5wB/A1oGX0vNrDXwKvAZcFXw+cYHYxERkXwUdcOuzOxyYDSBxOof7j4hwiGJSGxbneU8Cbjc3XflVDiDg8FyBwGC39vfBM4DvshYMENCUonAl+0ywIiMZdz97gzlCwGfEEgw+pJ9zkkycPWRoVZmVgr4BzDR3W/KUM8i4DvgZiDjZPJWwfiz+hPwlrsvMLPvgRuAGRnu3wB86+5LgucDgFpAY3f/PnhtlpmVBYaZ2fPufijD+6e6+7AM5c4H/gIMc/ddZvZN8N63WYaqXQDscPc7MtQ1M4f4RUTkJEVVz0fwF/ATQDugGTDIzMpHNioRiXFXA+cSSBquItBzMCPYC3IsHx9JPIK+Dv7MOsypOoEv+geBTQT+un+Tuy/MWMjMWpjZ+2aWDBwKlu8A/I7s3s0yx6MlUBqYkrEng8DcktVAmyzv/2/wmbO+PslQZjJw5ZFek+D/1Z2C14+4BFgIrMvS7kdAeaBBlnb/k+X8a7J/Xjn5CihnZq+a2eXB5EZEREIgqpIPAr/cV7n7puC45w/I3q0vIhJOK919sbt/5e7vEViZyggMIzqW7VnOfwv+LJ7l+lYCX+zPB64D1gEvmdnZRwqYWQ0CX/wTgP4EJrufS6DHI2t9kH1VqkrBn7P4X6Jz5NWYQCKQ0Z7gM2d9/ZqhzKvBtrsGz7sR6I1/NUu7bXJo883g/azt5vSZFcvh+TJx988I9MrUAP4NbDOzWWbW5HjvFRGRvClQw67MrA1wN9ACqAb0dPdJWcr0AwYBVYFVwB3u/nnwdjUCf/k7YhOBvwqKiBQI7r7PzH4E8uuL7UF3Xxw8XmRmSwksdTuawBwJCPQglAGuDa6uBYCZlThamFnOfwn+7EHg/92sduc1aHdfZ2bzCcxtmRj8+am7/5Sl3a0Ehl/l5Lu8tnuMeN4C3goOMbuIwDCzD83sdHdPy692RERiXUHr+SgFrCTwi2Zf1ptm1g14msCEzWYExj1/cCKrrYiIRELwC/8ZBPbnyHfu/h0wBuhkZucGLx9JMtKHcZnZWQTmZuTGFwQSjHpH6dE40STgFeCi4IpTLck85AoCPTNnAxuP0m5ek54jvUfxRyvg7nvc/X3gRQJ/5NLQXZFTmJm1MbNpwRXz3Mx6ZLlf2QIbtiYFV/L70MzOzFKmt5nNCa7y52ZWO4d2zjKzd80sxQIrFC7IuqCHmT1tZovNbL+Zrc+hjl7B1fZqZ7k+Ihh/wol+DgVJger5cPcZBCcfmtmkHIoMBCa5+/jgef/gP2xfApMsk8jc01EdWBSygEVEjq+pmVUgMNSqKnA7geFPz4awzccIrFT1ANCZwHCpQ8ArZjY6GMdwYCO5+CNUcLL2IGCMmVUkMKR1J4H/Y/9AoMdiaoa3nBacxJ3Vr1kSlTcJfA6vEviD01tZyj9JYDjW52b2JIGejpIEEpIL3f3K48WexRoCn8NNZradQDLyHYHe9MoEluJNAk4nsCLWcncPSZIoImFz5A/brwRf6YIr8L0LpBGYk7eTwHfNWWbWwN33BouWILAIxXsE/l/KyfsENi/9I7AXuJXACoUN3P3I6oOFgJcJDFfNNi3A3ceb2dXAJDNr6+4eXDhjMHCFu2cdWnpKsrztGxU+ZrYHuP3IsCszKwqkAn9x9zczlBsDNHL3PwQnIn5LoMt8J7AE+L27/0IOLLBWfG+AkiVLtjj77LNzKiYikmcpKSls2LAh07UiRYoQHx9P5cqVKVOmDABJSUls3ryZFi1apJdbsmQJVapUoXr1//0t5bfffmPlypXUqlWLChUqALB+/Xp27dpFkybZR3Bt2rSJLVu2UL9+fUqUKMH27dtJSkriwIEDFCtWjKpVq7Jr1y52795N48aNj9pGRjt37mTLli2kpqbi7hQtWpRSpUpRuXJl4uMDnQnfffcde/bsyfEzKVOmDPXq1ct0be3atezYsYNy5cpRt27dTPeWLFmSQmBFrgcIfDGoDuwgkDC87e5PAUyaNMl79uzJ999/n6n+Bx98kOHDh5Px99yLL77IP/7xDzZu3Mjhw4eZM2cOe/fu5ZlnnmHFihVs376dSpUq0bFjRx5++GGqVauW47OIyKmnVKlSPPfcc/To0QOANWvW8Lvf/Y7ly5dzzjnnAJCWlkaVKlUYOXIkt9xyS6b3L168mHPPPZd169ZRu3bt9OspKSlUrFiR2bNn07ZtWwAOHTpEsWLFeP311+natWumekaNGsVzzz3H+vXrs8WYlJREo0aNuP/++7n11ltp1qwZf/jDH3jxxRfz74MIDzvajQLV83EcFYDCBJaAzCgZaA/g7ofM7C4Cf70qBDx+tMQjWH4cMA4gMTHRFy9efLSiIiISZma2IThJ/c7gK0c9evRI/zKR0YMPPsiDDz6Y6VqfPn3o0yf73oGXXXZZtmsiEt1++y0wErN48f+tu1GoUCGKFSvGvHnzsiUfR1O+fHnq16/P5MmTOffcc4mPj2fcuHGcdtpptGqV29GtAdWqVeO5557j5ptvZt68eRw4cIDRo0fnqY6C7lRKPnLF3acB03Jb3sw6A52z/jVORERERKLX2WefTc2aNbnvvvsYP348pUqV4sknn+Tnn39m8+asi/4dnZnx8ccfc/XVV1O6dGkKFSpEQkICH3zwAVWrVs1zXNdddx3jxo3jnXfe4ZNPPqFUqVJ5rqMgK2gTzo8lBThMYFxuRpWBLSdaqbtPd/feR4ZAiIiIiEj0i4uL45133mHt2rWUL1+eEiVKMGfOHC699FIKFcr9V2R3p1+/fpQvX57PP/+cRYsW0bVrV7p06cKmTZuOX0EWq1atYsGCBZQoUYK5c+fm+f0F3SmTfLj7AQJzODpkudWBLLv9ioiIiIgcT4sWLVi+fDk7duxg8+bNfPjhh/zyyy/Z5qAdy+zZs5k+fTqvvfYarVq1onnz5owdO5aSJUsyceLEPMVz6NAhbrzxRq688komT57MyJEjWbZsWV4fq0ArUMOuguurHxn/VAioaWZNge3uvpHA7uWTzWwRMJ/ASgLVgBdOok0NuxIRERGJYUdGwHz//fcsXryYhx9+ONfvTU1NBcjWW1KoUCHS0vK2TdCIESNISkpi5syZlC9fnj/96U90796dxYsXU7Ro0TzVVVAVqOQDSCQwWfyI4cHXy0APd3/dzMoDQwksFbkS6OTuG7LVlEvuPh2YnpiY2OvEwxaRaLdr1y62bt3KwYMHj19YciUuLo5KlSpRunTpSIciIlFqz549/PDDD0BgJauNGzeyfPlyEhISqFmzJm+++SYVKlSgVq1afP311wwYMICrrrqKjh3/txLuli1b2LJlC2vWrAHgm2++YceOHdSsWZOEhARatmxJQkICPXv25IEHHiA+Pp7x48fz448/cvnll6fX88MPP7Bnz570lQeXL18OQIMGDShatChLlizhkUce4Z133qF8+cAWQ88++yyNGjVi+PDhPPLII+H62ELL3fVyp0WLFi4ikpOdO3f6mjVrfO/evZ6WlhbpcKJCWlqa792719esWeM7d+7MsQyw2HP3f7iISI7mzJnjQLZX9+7d3d396aef9tNPP93j4uK8Zs2aPnToUP/tt98y1TFs2LAc65g4cWJ6ma+++so7duzoCQkJftppp/l5553n77//fqZ6/vCHP+RYz7p163z//v3eoEED79GjR7ZneP/9971I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ZtbZzMbt3Lkz0qGIiIiIiES1mE8+NOdDRERERCQ8Yj75EBERERGR8Ij55EPDrkREREREwiPmkw8NuxIRERERCY+YTz5ERERERCQ8lHyIiIiIiEhYKPkQEREREZGwiPnkQxPORURERETCI+aTD004FxEREREJj5hPPkREREREJDyUfIiIiIiISFgo+RARERERkbBQ8iEiIiIiImER88mHVrsSEREREQmPmE8+tNqViIiIiEh4xHzyISIiIiIi4aHkQ0REREREwkLJh4iIiIiIhIWSDxERERERCQslHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFjEfPKhTQZFRERERMIj5pMPbTIoIiIiIhIeRSIdgIiISKTs27ePtWvXAnDGGWcQHx8f4YhERKJbzPd8iIhI7Pntt9+44447SEhI4JxzzqFJkyYkJCQwYMAA9u/fH+nwRESilno+REQk5vTt25eZM2cyYcIEWrZsCcCXX37Jvffey+7du3nppZciHKGISHRS8iEiIjHnzTff5J133qFDhw7p1+rWrUulSpXo0qWLkg8RkRDRsCsREYk5JUuWpHr16tmuV69eXfM+RERCSMmHiIjEnP79+zN8+HD27duXfm3fvn08/PDD9O/fP4KRiYhENw27EhGRmLNgwQI+++wzqlevTpMmTQD4+uuvOXToEHv37uWKK65ILztt2rRIhSkiEnWiMvkwsxrAZKAScAh42N3fjGxUIiJSUFSoUIEuXbpkulanTp0IRSMiEjuiMvkgkHDc4e7LzawKsMTMZrj73kgHJiIikTdx4sRIhyAiEpOiMvlw983A5uDxFjNLARIAJR8iIiIiIhES9uTDzNoAdwMtgGpAT3eflKVMP2AQUBVYRaAX4/MTbK8FUNjdfzqZuEVEJHo0btwYMzvq/RUrVoQxGhGR2BGJno9SwErgleArEzPrBjwN9APmBX9+YGYN3H1jsMxyco69o7snZagrIdhGr/x+CBEROXV17do10/nBgwdZvnw58+fP57bbbotQVCIi0S/syYe7zwBmAJjZpByKDAQmufv44Hl/M7sE6AvcG6yj6fHaMbNiwLvAY+7+xVHK9AZ6A9SsWTNvDyIiIqesYcOG5Xj9n//8Jxs2bAhzNCIisaNAzfkws6IEhmONynJrJvD7PNRjwCRgtrtPPlo5dx8HjANITEz0vMYrsWVB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F7qgRERERESkQPV8pACHCfRcZFQZ2BKqRt19urv3LlOmTKiaEBERERERClDy4e4HgCVAhyy3OgBfhD8iERERERHJT2EddhWcAH5kfFMhoKaZNQW2B5fSfQKYbGaLgPnArUA14IUQxqRhVyIiIiIiYRDuno9EYFnwFQ8MDx4/BODurwN3AEOB5UBroJO7bwhVQBp2JSIiIiISHuHe5+NTwI5TZiwwNiwBiYiIiIhI2BSYOR+RYmadzWzczp07Ix2KiIiIiEhUi/nkQ8OuRERERETCI+aTDxERERERCY+YTz407EpEREREJDxiPvnQsCsRERERkfCI+eRDRERERETCQ8mHiIiIiIiERcwnH5rzISIiIiISHmHdZLAgcvfpwPTExMRekY5FRGKX3bMt0iEclz9WMdIhiIjIKS7mez5ERERERCQ8lHyIiIiIiEhYKPkQEREREZGwiPnkQxPORURERETCI+aTD20yKCIiBcnhw4e5//77qVOnDsWLF6dOnToMHTqUQ4cOZSq3Zs0arrnmGsqWLUuJEiVo3rw53377baYyixYtokOHDpQqVYrTTjuN3//+96SkpACwcuVKihcvzttvv53pPbNmzSIuLo758+eH9kFFJCbF/GpXIiIiBck//vEPxowZw8svv0zjxo1ZsWIF3bt3p1ixYtx///0ArFu3jlatWnHjjTcye/ZsypYty+rVqylVqlR6PQsXLuTiiy9m0KBBPPnkkxQtWpSVK1cSFxcHQKNGjRg+fDi33norrVu3pnLlyuzcuZOePXty11130apVq4g8v4hENyUfIiIiBcgXX3xB586d6dy5MwC1a9fmiiuuYOHChellhgwZQseOHRk9enT6tbp162aq58477+S2225jyJAh6dfOOuusTGUGDRrEtGnT6N27N++99x79+/enXLlyPPTQQ6F4NBERDbsSEREpSFq3bs2cOXNYvXo1AN988w2zZ8+mU6dOAKSlpTF9+nQaNGjAJZdcQsWKFTn33HN5/fXX0+vYunUrX375JVWrVqV169ZUqlSJCy+8kE8++SRTW4UKFeLll19m1qxZXH/99fzf//0fr7zyCkWLFg3fA4tITFHyISIiUoAMHjyYG264gQYNGhAXF0fDhg3p3r07/fr1AwKJxZ49exg5ciQdO3bk448/5i9/+QvXX389//nPfwD48ccfARg2bBg33XQTH330ERdeeCEXX3wx//3vfzO1V69ePQYNGsTUqVO55557aNq0aXgfWERiSswPuzKzzkDnevXqRToUERERXn/9dV555RWmTp1Kw4YNWb58OQMGDKBOnTrcfPPNpKWlAXDllVcycOBAAJo2bcrixYt57rnnuOyyy9LL9OnTh5tuugmAZs2aMWfOHF544QWef/759Pb27dvHa6+9RokSJZg3bx7ujpmF+alFJFbEfM+HVrsSEZGCZNCgQdx99938+c9/pnHjxtxwww0MHDiQRx99FIAKFSpQpEgRGjRokOl99evXZ+PGjQBUrVoVIFuZBg0apJc5YvDgwRw6dIhFixalJzAiIqES88mHiIhIQZKamkrhwoUzXStcuHB6b0bRokU599xz+e677zKVWbNmDbVq1QICk9SrVat2zDIAc+bMYezYsUyaNImGDRsyevRo7rnnHtauXRuKRxMR0bArERGRgqRz58489thj1KlTh4YNG7Js2TKeeOIJbrzxxvQyf//737n22mu58MILadeuHXPmzOH//u//ePfddwEwMwYNGsSwYcNo0qQJzZo144033mDBggXpPRu7d++mZ8+eDBjw/+3dcaxe9V3H8fenljlKdaLtWkwcLqOyrSgd6RSQdlUHdhCVTZPFzJiS2c5VScEui1sGakyRxBklzCWtYgosbMlSI6WhCDN0QMcYVIUhG0IyQKltgY4qrIPBvv5xDuz26b239/bee5773Pt+JSfPc875Pb/zffrr/Z78zu+c37OBFStWALB27Vq2bdvGJZdcwq5du5gzx2uUkiaXnQ9JkqaRa6+9liuuuIL169dz4MABTjnlFNauXcuVV175epmLL76YLVu2cNVVV7FhwwaWLFnCDTfcwEUXXfR6mcsuu4yXXnqJjRs38txzz7F06VJ27tzJmWee+fr+efPmsWnTpiOOf91113HGGWdwzTXXcPnll3fzpSXNGqmqfscwLSxfvrweeOCBTo711ZVv6+Q4E3X2XQ67DzUo7XbOuV/tdwjHVFcv7PR4g9B2ttvRkuypquVjKOqJTMeUP36m3yHMCJ3nAdttUnTdbsCIs1Y48qERDcIffB/+mCRJknScvJlTkiRJUidmfecjya8l2XLo0KF+hyJJkiTNaLO+8+HvfEiSJEnd8JkPSZLGYRCehxsEPrMnzU6zfuRDkiRJUjfsfEiS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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.binning import BinRareCategories\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\", \"Address\"]\n", + "objs = [BinRareCategories(min_ratio=0.5)]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"BinRareCategories\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e81cc834", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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GXY1cuHChfkOR1ID9PLLL9OjRw9atWqV71AKztq1a1m6dGmt+3JExLyUUmktb6upuH+RSVLDs8W/0hV9f6qrXUnamg0bNlBSUpLvMApSSUmJQ9kkqYgUffIhSdvCoVbZ4fdVkopL0ScfETE0Im5atWpVvkORpAZt11135YEHHsh3GJKkRqzokw+HXUmSJEm50aBWu5KkxuLxQ7O7B8KBD7+S1ftLkpQPJh+S1MjtuuuufPe732XSpEksW7aMY445hhtuuIF169Zx0kkn8a9//YuNGzdy8MEHc+ONN/KZz3wGgMMOO4yBAwfy0EMPsWDBAg466CBuv/12OnXqBMCkSZO49NJLee+99zjnnHOqtfnEE08wevRoXnjhBUpKShg2bBjXXHMNLVq0IKXEOeecw+TJk1m/fj29evViypQplXtUNHZx4dv5DqEgpJ92zncIkvKg6IddOedDUiGYPHky9957L6+88govvfQSV155JZs2baKsrIxXX32V1157jZKSEs4888xq77v99tu59dZbeeutt/jwww8ZP348ULEh3emnn86kSZNYunQp77zzDm+88Ubl+5o2bcq1117L8uXLeeyxx3jwwQeZMKFiC6b77ruPhx9+mJdeeolVq1Zxxx13sNNOO+XumyFJarCKPvlwzoekQnDmmWey884707FjRy655BKmTJnCTjvtxLBhw2jVqhU77rgjl1xyCf/85z+rva+srIw999yTkpISvvGNbzB//nwA7rzzTr72ta9x6KGH0rJlS3784x9X2+16wIABHHjggTRr1qyy5+Xjezdv3pw1a9bw73//m5QSn/vc5+jevXvuvhmSpAar6JMPSSoEO++8c+XrXr16sXTpUtauXct3v/tdevXqRdu2bTn00ENZuXIlH330UWXdbt26Vb5u1aoV7733HgBLly6tds/WrVtX67146aWX+NrXvka3bt1o27YtF198McuXLwdg0KBBnHnmmXzve9+jS5cujBo1itWrV2ft2SVJjYfJhyQVgNdff73y9WuvvUaPHj24+uqrefHFF/nXv/7F6tWrefjhhwFIaesbgnfv3r3aPdeuXcs777xTeX766aez9957s3DhQlavXs1VV11V7b5nn3028+bN4/nnn+ell17iF7/4RX08piSpkTP5kKQCcP311/PGG2+wYsUKxo0bx/Dhw1mzZg0lJSW0b9+eFStWMHbs2G2+3/HHH8///M//MHv2bD788EMuu+wyNm3aVFm+Zs0a2rZtS5s2bfj3v//NDTfcUFn25JNP8q9//YsNGzbQunVrdthhh2pDtiRJxavofxs44VxSITjhhBMYMmQIu+++O3vssQeXXnopY8aMYd26dXTq1IkDDzyQI444Ypvv16dPH66//npOOOEEunfvTocOHSpXyQIYP348t99+OzvuuCMjR45k+PDhlWWrV69m5MiRdOjQgV69erHTTjtx/vnn1+vzSpIap9iW7vdiUFpamubOnZvvMCQ1QC+88AKf+9zn8h3GFu2666787ne/Y/DgwfkO5VPZ0vc3IuallEq34RY5/UXmUrv1w6V2pYIWWyoo+p4PSZIkSblh8iFJkiQpJ9zhXJIaucWLF+c7BEmStok9H5IkSZJyouiTD1e7kiRJknKj6JOPlNLdKaVR7dq1y3cokiRJUkEr+uRDkiRJUm6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ9znQ5I+hbjw7azeP/20c1bvL0lSPtjzIUmN3K677sr48ePZb7/9aNeuHcOHD2f9+vVMnDiRQw45pFrdiODll18GYMSIEZxxxhkceeSRtGnThoMPPpg333yTMWPG0KFDB/bee2+efvrpau385Cc/YZ999qFDhw6UlZWxfv16APr27cvdd99dWXfDhg106tSp2vslSSr65MN9PiQVgjvuuIN//OMfLFq0iAULFjBx4sRtft+VV17J8uXLadmyJQcddBD9+/dn+fLlHH/88ZxzzjnV6k+ePJl7772XV155hZdeeokrr7wSgJNPPpk//vGPlfVmzJhB9+7dOeCAA+rtGSVJjV/RJx/u8yGpEJx99tn06NGDjh07MnToUObPn79N7zv22GMZMGAAO+ywA8ceeyw77LADJ598Mk2bNmX48OGb9VyceeaZ7LzzznTs2JFLLrmEKVOmAPCtb32LGTNmsHr1agAmTZrESSedVL8PKUlq9Io++ZCkQtCtW7fK161ateK9997bpvd17dq18nVJSclm5zXvs/POO1e+7tWrF0uXLgWgR48eHHzwwUybNo2VK1dyzz33cOKJJ36qZ5EkFS6TD0kqUK1bt2bt2rWV52+++eZ23/P111+vfP3aa6/Ro0ePyvNTTjmFP/7xj0ydOpWDDjqInj17bnd7UmNx/fXXs99++9G2bVvatm3LQQcdxN///vfK8hEjRhAR1Y4DDzyw1nullDjyyCOJCO68887K688++yw77LAD06ZNq1b/gQceoHnz5syZMyc7DyfVI5MPSSpQ+++/P8899xzz589n/fr1XHHFFdt9z+uvv5433niDFStWMG7cOIYPH15Zdswxx/DUU09x3XXXcfLJJ293W1Jj8pnPfIaf/exnPPXUU8ydO5dBgwZxzDHHsGDBgso6gwcPZtmyZZXHjBkzar3X1VdfTZMmm/8TrW/fvowdO5bTTjuN8vJyAFatWkVZWRnnnnsuBx98cHYeTqpHJh+SVKD23HNPLrvsMgYPHsxnP/vZzVa++jROOOEEhgwZwu67784ee+zBpZdeWllWUlLCsGHDWLRoEccdd9x2tyU1JkcffTRHHnkkvXv3Zs8992TcuHHsuOOOPPbYY5V1WrZsSbdu3SqPjh07bnafJ598kuuuu45bb7211nbOP/989txzT0aNGgXAWWedRYcOHfjRj36UnQeT6pn7fEjSp9CQ9uFYvHhxtfOqPRyXXHIJl1xySeX5t771rcrXNVfEOvXUUzn11FMrz3v37s3GjRur1fn85z/PRRddtMVYdtllF4499ljatGlThyeQCstHH33E1KlTee+99/jiF79YeX327Nl06dKF9u3b89///d+MGzeOLl26VJavWbOGE044gZtuuqna9aqaNGnCbbfdxv7778+JJ57I1KlTeeKJJ2jRokXWn0uqDyYfkqR6sWLFCm655RYmTZqU71CkvHjmmWc46KCDWL9+PW3atOEvf/kL++67LwBHHHEExx13HLvtthuLFy/m0ksvZdCgQcybN4+WLVsCcNppp3HEEUdw5JFHfmI7vXv35vzzz2fs2LH88Ic/pF+/fll/Nqm+mHxIkrbbzTffzJgxYzjppJM49NBD8x2OlBd77bUX8+fPZ9WqVdx5552ccsopzJo1i759+/LNb36zst6+++7LgAED6NWrF3//+9857rjjmDRpEv/7v//L3Llzt9rOunXrmDJlCq1atWL27NmklIiIbD6aVG8Kds5HRPwlIt6NiDu3XluStDWLFy9m8ODBtZaNHDmS999/nxtvvDHHUUkNR4sWLejduzcDBgzgJz/5Cf369ePaa6+ttW6PHj34zGc+w8KFCwF48MEHef7552nTpg3NmjWjWbOKvw8PHz58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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.binning import Binning\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\", \"Address\"]\n", + "objs = [Binning(n_bins=3)]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"Binning\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ba9f302e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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wQcf5JprrqFNmzb07NmzwH9jZ5xxBieddBLPPPNMka+fNm0a559/Pr/88gs1agTWgcjNzaVTp04kJSXxzjvv0KdPHxYuXEhGRkaB300iEWbFlhz4JVzeHsBOoF++44YExs52LlRvKPBdvuMLgOUEvj27uqTttW/f3kVEitO7d29PSEjwefPmRTqUmAFkeMl+h0eVZ555xk866SSvXr26V69e3U877TR/991388qDn4UHPfr3759XZ8eOHT5gwABv1KiRV61a1Vu2bOmPPfZYXvnGjRu9bt26PmLEiAJtL1myxKtUqeITJ04M/Y1GsX379vnEiRM9Li7OFy1a5O7u11xzjZ966qm+du1ad3efO3eu16hRw6dOnVrsdSZOnOhVq1b1nJycAudXrFjhCQkJftlll3lcXJwvWLAgdDcjcniK/xv/1woj+Tjc5OMw2ukBvJCSklIG77OIRKs9e/b4GWec4XXq1PFvvvkm0uHEhFhNPiZPnuzTpk3zFStW+Hfffee33367V6pUyf/zn/+4eyBxyP+YOnWqAz5r1qy8a6Snp3vz5s19xowZvmrVKn/55Ze9cuXK/sorr+TVefXVV71q1aq+dOlSd3ffu3evt2vXznv16hXeG44iixYt8mrVqnnFihW9Zs2aBZLGPXv2eL9+/RzwSpUqeaVKlfy5554r9lo///yzp6Sk+PXXX19k+bBhwxzwu+66q8zvQ6QMREXyURnYB/ypUL1ngU+OtD31fIiIlC+xmnwUpXbt2v78888XWXbVVVd5y5YtC5w78cQTfejQoQXOde7c2a+77roC53r16uXt27f3nJwcv+uuu7xBgwb+008/lW3wMWTPnj2+YsUKz8jI8CFDhnjdunV98eLF7u4+YsQIb9mypU+ZMsX/85//+NNPP+3VqlXz995776Dr7Nixw08//XQ/44wzPDs7+6DyrKwsb9mypSckJPiZZ57pubm5Ib83kVIq9nd2eVvtqljuvpfAHI6zCxWdTWDVKxERkaiyf/9+Xn31VXbu3Mnvf//7g8p37tzJq6++Snp6eoHzp59+OlOnTuWHH34A4LPPPmPhwoWcc845BeqNHDmS9evX07t3bx588EFGjx5NnTp1QndDUa5y5cqkpKTQvn17HnzwQdq2bcvjjz9OdnY2t912Gw8//DA9evTg5JNPZsCAAfzlL39hxIgRBa6xc+dOunfvDsC7775L1aoHb+9z6623sm/fPr788ksyMjKKnTMiUh6Vq9WuzCyRwOZNEFgpoomZtQW2uvtaAitFjDOzL4G5wN8IDMd6/gja7AH00IRAEREpLxYvXkyHDh3YvXs3iYmJvP3225x00kkH1ZswYQJ79+6lb9++Bc4/9dRTXHPNNTRp0oRKlQIf9U8//TTnn39+gXoHJkSnpaVx+eWX5/3RK2UjNzeXPXv2kJOTk7foQn4VK1YkN/d/e1ju2LGDc889F3fn/fffJzEx8aBrzpw5k5EjRzJz5kxOPPFEHn30UQYNGkT37t059thjQ35PIkeqXCUfBDagmpnveHjw8TKBIVivBde7vpPAJoNLgO7uvuagK5WQu08FpqampqYfsrKIxKzt27ezadMmcnKK29haSisuLo569erlreIj/9OqVSsWLlzItm3bePPNN+nbty+zZs2iTZuCW8qMGjWKCy+8kOTk5ALnn376aT777DOmTJlC06ZNmT17NjfffDPNmjUr0PuRm5vLmDFjSEhI4KuvvmL37t1FftMuhzZkyBDOO+88GjduzI4dO5gwYQKzZs3i3//+NzVq1OCMM85gyJAhJCYm0rRpUz755BNeeeUVHn74YSCQeHTr1o3t27czefJkdu3axa5dgT0u69SpQ+XKldmxYwdpaWkMHDiQTp06AZCens6kSZNIS0tj1qxZVKhw1AxqkVj1a2OyYumhOR8iUpxt27b58uXLfdeuXRpbXUZyc3N9165dvnz5ct+2bVuRddCcjzxnnXWWX3HFFQXOLViwwAGfPn16gfNZWVkeFxfnkydPLnD+yiuv9LPOOqvAuUcffdRr167tS5cu9d/85jc+ePDg0NxADOjbt683adLEK1eu7MnJyX7WWWf5+++/n1e+ceNG79evnzds2NCrVq3qrVq18kceeSTvd8rMmTOLXcls5syZ7u5+xRVX+AknnHDQPJB169Z5rVq1CqxoJhJhxf7OLm89H2GnYVciciibNm2iUaNGJCQkHLqylIiZkZCQQKNGjdiwYYN6Pw7hwPCd/F544QWaN29O165dC5wv6RCfZcuWcccddzB69Ghat27Niy++SPfu3bnkkkvo2FEbZZfW2LFjf7X8mGOOYcyYMcWW/+EPfziwkE6xXnzxxSLPN2rUiJ9//vmQMYqUBzHfN+fuU9396po1a0Y6FBEpp3JycoiPj490GFEpPj5eQ9kKGTJkCJ9++imrV69m8eLF3HbbbcyaNYvevXvn1cnKymL8+PFceeWVBTZ6BAoM8Zk1axarVq1i7NixvPLKK1x88cVAYHPMvn37ct555+Vdt1u3blx11VWkpaWRlZUVvhsWkZgS88mHiEhJFP4DT8qG3teD/fjjj/z1r3+lVatWnHXWWXz11Ve89957nHvuuXl1XnvtNXbt2kVaWlqR13j11Vf57W9/S+/evWndujUPPfQQ9957LwMGDADgwQcfZM2aNTz33HMFXjdixAj27dvHbbfdFrobFJGYZofq4ot2+YZdpa9YsSLS4YhIObRs2TJOOOGESIcRcc2aNWP06NEHDfM5UsW9v2Y2391TS3CJ2P4gExEpf4r9Zinmez407EpEREREJDxifsK5iMjh+LxzaNfTP232ypBeX0REJBKUfIiIHOWaNWvGNddcw7hx49i4cSMXXXQRzz33HNnZ2Vx++eV88cUX7Nu3j44dO/L888/zm9/8BgisrtOpUydmzJjBokWL6NChAxMmTCApKQmAcePGceedd7Jz504GDx5coM0vv/ySgQMHsmzZMuLj4+nZsyePPfYYlStXxt0ZPHgw48ePZ/fu3TRt2pSJEycetEeFSDjZkM2RDiEq+EPJh64k8itiftiVmfUwsxe2bdsW6VBERA7b+PHj+eCDD1i5ciXLly/nvvvuIzc3l7S0NNasWcPatWuJj4/Pm3B8wIQJExgzZgybNm1i7969jBgxAoBvvvmGa6+9lnHjxrFhwwZ++ukn1q1bl/e6ihUr8vjjj7NlyxbmzZvHxx9/zMiRIwGYPn06s2fPZvny5Wzbto3XX3+dunXrhu/NEBGRcivmkw/N+RCRaDBgwAAaN25MnTp1uOOOO5g4cSJ169alZ8+eJCQkUL16de644w4++eSTAq9LS0ujZcuWxMfH8+c//5mFCxcC8Oabb3L++efTuXNnqlSpwr333ltg5+T27dtz2mmnUalSpbyelwPXjouLY8eOHXz77be4OyeccAINGjQI35shIiLlloZdiYhEgcaNG+c9b9q0KRs2bCArK4sbb7yR999/P28Dsh07drB///68DeiOOeaYvNclJCSwc+dOADZs2FDgmtWqVSvQe7F8+XIGDx5MRkYGWVlZ7Nu3j/bt2wPQpUsXBgwYwHXXXceaNWu45JJLGDFiRNRsJKjhO2VDw3dEYlPM93yIiESDH374Ie/52rVradiwIY8++ijfffcdX3zxBdu3b2f27NkAh9xFGaBBgwYFrpmVlcVPP/2Ud3zttddy/PHHs2LFCrZv384DDzxQ4Lo33HAD8+fP55tvvmH58uU88sgjZXGbIiJylFPyISISBZ599lnWrVvH1q1buf/+++nVqxc7duwgPj6eWrVqsXXrVoYPH17i61166aW8++67zJkzh7179zJ06FByc3Pzynfs2EGNGjVITEzk22+/LbBZ3VdffcUXX3xBTk4O1apVo2rVqgWGbImISOyK+U8DTTgXkWhw2WWX0a1bN1q0aMGxxx7LnXfeyaBBg8jOziYpKYnTTjuNc845p8TXO/HEE3n22We57LLLaNCgAbVr185bJQsCO2FPmDCB6tWrk56eTq9evfLKtm/fTnp6OrVr16Zp06bUrVuXW265pUzvV0REjk4xv8P5AampqZ6RkRHpMESkHCrvO5yHaufxcDnadjjXnI+yEe45H/p3KxuaqyMlpB3ORUREREQkspR8iIiIiIhIWGipXRGRo9zq1asjHYKIiEiJqOdDRERERETCIuaTD612JSIiIiISHjGffLj7VHe/umbNmpEORUREREQkqsV88iEiIiIiIuGh5ENERERERMJCyYeIiIiIiISFkg8REREREQkL7fMhInIYbMjmkF7fH0oO6fVFREQiQT0fIiJHuWbNmjFixAhOPvlkatasSa9evdi9ezdjx47l9NNPL1DXzPj+++8B6NevH/379+fcc88lMTGRjh078uOPPzJo0CBq167N8ccfz4IFCwq08+CDD9K6dWtq165NWloau3fvBqBNmzZMnTo1r25OTg5JSUkFXi8iIhLzyYf2+RCRaPD666/z/vvvs2rVKhYtWsTYsWNL/Lr77ruPLVu2UKVKFTp06EC7du3YsmULl156KYMHDy5Qf/z48XzwwQesXLmS5cuXc9999wHQp08f/vWvf+XVmzZtGg0aNODUU08ts3sUEZGjX8wnH9rnQ0SiwQ033EDDhg2pU6cOPXr0YOHChSV63cUXX0z79u2pWrUqF198MVWrVqVPnz5UrFiRXr16HdRzMWDAABo3bkydOnW44447mDhxIgB//etfmTZtGtu3bwdg3LhxXH755WV7kyIictSL+eRDRCQaHHPMMXnPExIS2LlzZ4leV79+/bzn8fHxBx0Xvk7jxo3znjdt2pQNGzYA0LBhQzp27MikSZP45ZdfeO+99+jdu/dh3YuIiEQvTTgXEYlS1apVIysrK+/4xx9/POJr/vDDD3nP165dS8OGDfOO+/bty+jRo9m3bx8dOnSgUaNGR9yeiIhEF/V8iIhEqVNOOYWlS5eycOFCdu/ezd13333E13z22WdZt24dW7du5f7776dXr155ZRdddBFff/01Tz75JH369DnitkREJPoo+RARiVItW7Zk6NChdO3aleOOO+6gla8Ox2WXXUa3bt1o0aIFxx57LHfeeWdeWXx8PD179mTVqlVccsklR9yWiIhEH3P3SMdQLqSmpnpGRkakwxCRcmjZsmWccMIJkQ4j4po1a8bo0aPp2rVrsXXuueceli9fXmDlq0Mp7v01s/nunlqCS4T1gyzUe7zEinDvZaN/t7KhPYikhKy4As35EBGRMrF161ZefPFFxo0bF+lQRESknNKwKxEROWKjRo2icePGnHvuuXTu3DnS4YiISDkVtT0fZvY28AfgY3e/NMLhiIgc9VavXl1sWXp6Ounp6eELRkREjkrR3PPxJKDlVkREREREyomoTT7cfRawI9JxiEh00OIcoaH3VUQktoQ9+TCzzmY2xczWm5mbWb8i6vQ3s1VmttvM5ptZp3DHKSJyQFxcHNnZ2ZEOIyplZ2cTFxcX6TBERCRMItHzkQgsAQYCB32am1kvAkOmHgBOBT4D3jOzJvnqLDSzJUU8Gha+nojIkapXrx7r168nKytL39SXEXcnKyuL9evXU69evUiHIyIiYRL2CefuPg2YBmBmY4uoMhgY6+6jgsfXm9k5wLXAbcFrtA1DqCIiANSoUQOADRs2kJOTE+FookdcXBz169fPe39FRCT6lavVrsysMtAeGFGoaDrw+xC0dzVwNUCTJk0OUVtEYlmNGjX0R7KIiMgRKm8TzpOAikBmofOZwDGluZCZfQS8AXQ3s3Vm1qFwHXd/wd1T3T01OVk7doqIiIiIhFK56vkoS+7etST1zKwH0CMlJSXEEYmIiIiIxLby1vOxBdgP1C90vj7wYygadPep7n51zZo1Q3F5EREREREJKlfJh7vvBeYDZxcqOpvAqlciIiIiInKUCvuwKzNLBA6McaoANDGztsBWd18LPAaMM7MvgbnA34CGwPMhikfDrkREREREwiASPR+pwILgIx4YHnx+D4C7vwYMAu4EFgKnA93dfU0ogtGwKxERERGR8IjEPh+zADtEnZHAyHDEo54PEREREZHwKFdzPiJBPR8iIiIiIuER88mHiIiIiIiEh5IPEREREREJi5hPPsysh5m9sG3btkiHIiIiIiIS1WI++dCcDxERERGR8Ij55ENERERERMIj5pMPDbsSERERiU0PPvggv/3tb6lRowbJycn06NGDJUuWFKiTmZlJv379aNiwIQkJCZxzzjmsWLGiQJ309HSOPfZY4uPjSU5O5sILL2TZsmV55UuWLKFq1apMmjSpwOs++ugj4uLimDt3buhuspyJ+eRDw65EREREYtOsWbPo378/n332GTNmzKBSpUp07dqVrVu3AuDuXHTRRaxYsYLJkyezYMECmjZtSteuXdm1a1fedVJTUxk7dizLli3jgw8+wN3p2rUrOTk5ALRp04bhw4fzt7/9jczMTAC2bdtGWloaN910Ex07dgz/zUeIuXukYygXUlNTPSMjI9JhiIhIkJnNd/fUElQN6weZDdkczuailj+UHNb29O9WNsL97xZuO3fupGbNmkyePJkePXqwfPlyWrVqxcKFCznllFMAyM3N5ZhjjuGBBx7gqquuKvI6ixYt4pRTTuHbb7+lVatWea/r1KkTSUlJvPPOO/Tp04eFCxeSkZFB5cqVw3aPYVLshuIx3/MhIiIiIgKwY8cOcnNzqV27NgB79uwBoGrVqnl1KlSoQJUqVZgzZ06R19i1axdjxoyhSZMmNGvWrMDrXn75ZT766CN69+7Nq6++yiuvvBKNicevUvIhIiIiIgIMHDiQtm3b0qFDBwCOP/54mjRpwu23387WrVvZu3cv//jHP1i3bh0bN24s8NqRI0eSmJhIYmIi7733Hh9//DFVqlQpUCclJYVbbrmFCRMmMGTIENq2bRu2eysvYj750IRzERERERk8eDBz5sxh0qRJVKxYEYC4uDjeeustVq5cSd26dUlISGDmzJmce+65VKhQ8M/o3r17s2DBAj755BNatmzJn/70J7KysgrUyc7OZuLEiSQkJDBnzhxicfpDzCcfmnAuIiIiEttuvPFGJk6cyIwZM2jRokWBsvbt27Nw4UJ++eUXNm7cyPvvv89PP/10UL2aNWty3HHH0blzZ958802WL19+0OpWt956K/v27ePLL78kIyODZ555JuT3Vt7EfPIhIiIiIrFr4MCBeYnH8ccfX2y9mjVrkpyczIoVK8jIyODCCy8stq674+55c0YAZs6cyciRIxk7diwnnngijz76KEOGDGHlypVlej/lXaVIByAiIiIiEgnXXXcd48aNY/LkydSuXZsff/wRIG/uBsAbb7xBUlISTZs2ZfHixQwcOJCLLrqIbt26AfD9998zadIkunbtSnJyMuvWreOhhx6iSpUqnH/++UBgIntaWhoDBw6kU6dOQGBvkEmTJpGWlsasWbMOGsYVrWLjLkVEREREChk5cqBO9qYAACAASURBVCQ7duzgrLPOokGDBnmPESNG5NXZuHEjffr04fjjj+eGG27g8ssvZ+LEiXnlVapUYdasWZx77rmkpKTQq1cvqlevzrx58zjmmGMAGDRoEAkJCdx///0F2n/xxRdZvHgxTz75ZHhuuBzQPh9B2udDRKR80T4f0U37fBydon2fDykz2uejOFrtSkREREQkPGI++dBqVyIiIiIi4RHzyYeIiIiIiISHkg8REREREQkLJR8iIiIiIhIW2udDRERERMolrVJWNsrTKmXq+RARERERkbBQ8iEiIiIiImGh5ENERERERMIi5pMPbTIoIiIiIhIeMZ98aJNBEREREZHw0GpXIiISs7Kzs1m5ciUAxx57LPHx8RGOSEQkusV8z4eIiMSePXv2MGjQIOrUqcMpp5zCySefTJ06dRg4cCC7d++OdHgiIlFLPR8iIhJzrr32WqZPn87o0aPp0KEDAPPmzeO2225jx44dvPTSSxGOUEQkOin5EBGRmPPGG2/w1ltvcfbZZ+eda9GiBfXq1aNnz55KPkREQkTDrkREJOZUq1aNRo0aHXS+UaNGmvchIhJCSj5ERCTmXH/99QwfPpzs7Oy8c9nZ2dx7771cf/31EYxMRCS6adiViIjEnM8//5xPPvmERo0acfLJJwOwePFi9u3bx65du7jgggvy6k6ZMiVSYYqIRJ2oTD7MrDEwDqgH7APudfc3IhuViIiUF0lJSfTs2bPAuebNm0coGhGR2BGVyQeBhGOQuy80s2OA+WY2zd13RTowERGJvDFjxkQ6BBGRmBSVyYe7bwQ2Bp//aGZbgDqAkg8RERERkQgJe/JhZp2Bm4H2QEMgzd3HFqrTH7gFaAAsJdCL8elhttceqOjuPxxJ3CIiEj1OOukkzKzY8kWLFoUxGhGR2BGJno9EYAnwSvBRgJn1Ap4E+gNzgj/fM7PW7r42WGchRcfezd035LtWnWAb6WV9EyIicvS69NJLCxzn5OSwcOFC5s6dy3XXXRehqEREol/Ykw93nwZMAzCzsUVUGQyMdfdRwePrzewc4FrgtuA12h6qHTOrAkwGHnL3z4qpczVwNUCTJk1KdyMiInLUGjZsWJHnH3nkEdasWRPmaEREYke52ufDzCoTGI41vVDRdOD3pbiOAWOBGe4+rrh67v6Cu6e6e2pycvJhRCwiItHkkksuYfz48ZEOQ0QkapWr5ANIAioCmYXOZwLHlOI6HYFewEVmtjD4OKmMYhQRkSg1e/ZsEhISIh2GiEjUitbVruZQwsTKzHoAPVJSUkIblIiIlBv5NxEEcHc2btzIggULih2SJSIiR668JR9bgP1A/ULn6wM/hqJBd58KTE1NTdWkdBGRGFG3bt0CxxUqVODEE0/kgQceoFu3bhGKSkQk+pWr5MPd95rZfOBsIP+O5GcDk0LRpno+RERijzYZFBGJjLDP+TCzRDNra2Ztg+03CR4fWG7qMaCfmV1lZieY2ZME9gN5PhTxuPtUd7+6Zs2aobi8iIiUcw899BC//PJLpMMQEYkJkZhwngosCD7igeHB5/cAuPtrwCDgTmAhcDrQ3d219qGIiJS5Bx54gK1bt0Y6DBGRmBCJfT5mAcVvKxuoMxIYGY54NOxKRCS2uXukQxARiRnlbandsNOwKxERERGR8ChXE85FRETC7ZtvvqFhw4aRDkNEJCbEfM+HmfUwsxe2bdsW6VBERCQCGjduTMWKFSMdhohITCjpRnwnmNk9ZvaJma0xs01mttTMxpnZZWZWJdSBhoqGXYmIxIYKFSpQsWLFEj1ERCQ0fnXYlZm1Ax4msOLUXOAz4E0gG6gDtAHuB542s4eBJ9x9T0gjFhEROQyvv/46ZoH1TjIzMxk6dCgXX3wxHTp0AGDevHlMnjyZ4cOHRzJMEZGodqg5H28TSD7+5O4/F1fJzDoANwI3E0hGREREypVLL7007/kFF1zAgw8+SHp6et65K664gv/7v/9j8uTJ9O/fPxIhiohEvUMNuzrO3Z/9tcQDwN3nufufgUfKLrTw0JwPEZHYM2PGDM4888yDzp955pnMmjUr/AGJiMSIX00+3H3vr5WbWVxp6pdHmvMhIhJ7kpKSePPNNw86/+abb5KcnByBiEREYkOJl9o1sxuA9e4+KXj8ItDXzFYCF7j7dyGKUUREpEzdc889pKWlMXPmzLw5H59//jkfffQRL774YoSjExGJXqVZavcGYDOAmXUG/gxcBiwEHi370EREREKjT58+fPbZZyQlJTFlyhSmTJlC3bp1mTt3Ln379o10eCIiUas0mww2AlYFn/cA3nD3181sMfBpmUcmIiISQr/73e8YP358pMMQEYkppen52A7UCz4/G/g4+DwHqFqWQYWTJpyLiMSmzMxMRowYQf/+/dmyZQsAc+fOZdWqVYd4pYiIHK7SJB/TgVFmNhpIAd4Lnj+R//WIHHU04VxEJPbMnz+fVq1aMX78eEaPHs327dsB+PDDD7njjjsiHJ2ISPQqTfJxHYGNBpOBS919a/B8O2BiWQcmIiISKjfffDMDBw5kwYIFVKlSJe/8H//4R+bOnRvByEREoluJ53y4+3bg+iLODyvTiEREREJs/vz5Ra5q1aBBAzIzMyMQkYhIbPjVng8zq16ai5W2voiISCTEx8fz888H75/77bffUq9evSJeISIiZeFQw65WmNmdZvab4iqYWQUzO9fMPiQwNEtERKRcu/DCCxk+fDh79uwBwMxYvXo1t956Kz179oxwdCIi0etQw646AfcD/w0uqZsBbAB2A7WB1sBpQDbwADAqdKGGhpn1AHqkpKREOhQREQmTESNG0L17d5KTk8nKyuL0008nMzOTjh07ct9990U6PBGRqPWryYe7rwD+bGaNCWwq2An4PyAe2AIsAF4Aprl7bohjDQl3nwpMTU1NTY90LCIiEh41atRgzpw5zJgxg6+//prc3FzatWtH165dIx2aiEhUK9GEc3f/gcAu5trJXEREokaXLl3o0qVLpMMQEYkZpVlqV0REJGqMHDmSE088kYSEBP773/8C8NBDD/H6669HODIRkeil5ENERGLOE088wX333cfVV1+Nu+edb9SoEc8880wEIxMRiW5KPkREJOY8//zzjBo1ioEDB1Kp0v9GILdr146lS5dGMDIRkeim5ENERGLOmjVraNOmzUHn4+LiyM7OjkBEIiKxocQ7nEvZ+bzzsZEOoUROm70y0iGIlImj4f85/f8WXi1atODrr7+madOmBc5PmzaN1q1bRygqEZHo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WTp16hShqEREol+49/mYBdgh6owERoYlIDThXEQkFl166aUFjs2M5ORkunTpwqOPPhqhqEREol95mnAeEZpwLiISe7TJoIhIZJSbCeciIiLhkJOTw+9+9zu+++67SIciIhJzYj750GpXIiKxJS4ujlWrVmH2q6OARUQkBGI++dBqVyIisadv376MGjUq0mGIiMScmJ/zISIisWfXrl2MHz+eDz/8kPbt21OtWrUC5U899VSEIhMRiW5KPkREJOYsW7aMdu3aAfDf//63QJmGY4mIhE7MJx9aaldEJPbMnDnz0JVERKTMac6H5nyIiIiIiIRFzCcfIiIiIiISHko+REREREQkLJR8iIiIiIhIWMR88qFNBkVEREREwiPmkw9NOBcRERERCY+YTz5ERERERCQ8lHyIiIiIiEhYKPkQEREREZGwUPIhIiIiIiJhEfPJh1a7EhEREREJj5hPPrTalYiIiIhIeMR88iEiIiIiIuGh5ENERERERMJCyYeIiIiIiISFkg8REREREQkLJR8iIiIiIhIWSj5ERERERCQslHyIiIiIiEhYxHzyoU0GRURERETCI+aTD20yKCIiIiISHjGffIiIiIiISHgo+RARERERkbBQ8iEiIiIiImGh5ENERERERMJCyYeIiIiIiISFkg8REREREQmLSpEOIBTMbDWwHcgFfnb3MyMbkYiIiIiIRGXyEfR7d98Z6SBERERERCRAw65ERERERCQswpp8mFlnM5tiZuvNzM2sXxF1+pvZKjPbbWbzzazTYTTlwCdm9pWZ9T7iwEVERERE5IiFe9hVIrAEeCX4KMDMegFPAv2BOcGf75lZa3dfG6yzkKLj7ubuG4LPT3f39WbWAPjIzBa7+6Kyvx0RERERESmpsCYf7j4NmAZgZmOLqDIYGOvuo4LH15vZOcC1wG3Ba7QtQTvrgz83mtk0oB2g5ENEREREJILKzZwPM6sMtAemFyqaDvy+FNepZmbVg88TgS7A0mLqXm1mGWaWsXnz5sMLXERERERESqTcJB9AElARyCx0PhM4phTXqQ/MMbP/AJ8Dr7j7V0VVdPcX3D3V3VOTk5MPJ2YRERERESmhqFtq193/C5xS0vpm1gPokZKSErqgRERERESkXPV8bAH2E+i5yK8+8GOoGnX3qe5+dc2aNUPVhIiIiIiIUI6SD3ffC8wHzi5UdDbw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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.binning import QuantileBinning\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\", \"Address\"]\n", + "objs = [QuantileBinning(n_bins=3)]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"QuantileBinning\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ac7bb198", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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dt+pGb179+aNN96osG/27NnsuOO/1wBdtWoVgwcPZtasWUyZMoXttttuvfMsXbqUgw46iK+++opJkybRtGnT9dpMmTKFsWPHMm7cOLp06cKll17Kqaeeyttvv13zb0yqYbVqtquIOACYUsWhm1NKQzJtRlA2BV1byqaQPD6VTTW5WXr27JmmT5++uaeRVKCWLFnC/PnzWbVqVb6jFIwGDRrQunXr8hl8KouIGSmlnptwqtrzg6wGbLnllvTs2ZOnnvr3Tf3TTz+df/zjH7z22msV2i5YsIBWrVoxZcoUDjjggPL9Tz31FL179+a0007jwgsvLN/fq1cvunXrxjXXXFO+b8WKFXTr1o0PP/yQvffem0ceecTuO9/A888/z7777ss555zD4MGDefHFFznqqKO48MILOeaYY1i9ejWHHXYYzz//PBMnTqRdu3blr23WrBklJSUsXbqUAQMGsGTJEu6991622mqr8jbNmzdnyy23ZOnSpey+++4MGjSISy+9tPz4QQcdxPLly3nsscfKZ6aT8miDXyK1asxHSukxvm5qrrI2Y4GxOQkkSZQVHqWlpbRv356SkhL/YVYDUkqsWLGCuXPLFkPfUAFSjDbUfefyyy+v1jmA9c7TuXPn9boBrdt9p1evXlx11VWMHDnyG6YvXv/xH//Bvffey+mnn855553HDjvswHnnnceIESMA+PDDD7nvvvsAKkwpDXDTTTcxZMgQZsyYwTPPPAOsPz5nbYE5evRoGjduzAUXXFDh+I033kjXrl25/PLLOf7447P1NqXNVquKj3yIiIHAwI31cZZUvObPn0/79u1p3LhxvqMUjIigcePGtG/fnnnz5ll8rGNTuu9sTIcOHWjXrl2V51l3PYm13XemTJlS3n1n9OjRHHzwwey8886b90aK0Pe//32+//3vV3ls7Vipr3PAAQdstM2NN1Y97Kl9+/Z89tlnmxZUyqOivy+XUpqYUhrerFmzfEeRVEutWrWKkpKSfMcoSCUlJXZlq+T444/nmWee4YILLuCtt97izjvv5IorruCYY44pb7Nw4UJmzpzJyy+/DMBbb73FzJkz+fjjsskfI4KTTz6ZK664gjvvvJO33nqLCy+8kGeeeYbf/OY3QNnYgqFDhzJq1Cj69OkDwLBhw+jTpw9Dhw5lzRoXkZdU84q++JCkTWFXq+zw73V9a7vv3HHHHXTt2pUzzjijQvcdgAkTJrDXXntx4IEHAmVFw1577cW11/57/pXRo0dz+umnc+KJJ7Lnnnty7733cv/997PnnnuWH99Q952XXnqpWt28JGlT1aoB5/mwTrerYW+++Wa+40iqhV577TV22223fMfIuw4dOnDDDTfQr1+/Gj3vhv5+i3XAuSQVgA3+Zqno73zY7UqSJKk4nXPOOUREhce6UyCXlpYyZMgQ2rVrR+PGjTnooINY95fVCxcuZOTIkey6666UlJSw/fbbc/TRR/Ppp5+Wt3n55Zdp1KgRd999d4VrP/zwwzRo0IBp06Zl/43WIkU/4FySvoln9s/uYNx9nnC+fknKhe985zs89thj5dv169cHymbl+9GPfkS9evW49957adasGZdddhn9+vXj1VdfpUmTJsybN4+5c+dy0UUX0blzZ+bOncuIESP42c9+xuTJkwHo2rUrY8aM4be//S377bcfbdq0YfHixQwdOpQTTzyR3r175+Nt543FhyTVcR06dOA3v/kN48eP56OPPuJHP/oR11xzDStWrOCXv/wlzz77LKtXr6Z3795ce+21fOtb3wLKZtbp06cPjz76KLNmzaJXr17cdttttGzZEoDx48dz5plnsmzZMk444YQK13zuuecYNWoUr732GiUlJQwaNIjLLruMLbfckpQSJ5xwArfeeisrV65kxx135Pbbb6dr1645/7uR1opTP8l3hIKQ/tgq3xFq3BZbbFHlgo9vvvkmzzzzDDNnziwfK3XNNdew3Xbbcfvtt3PUUUfRtWtX7rnnnvLXdOrUiYsvvphDDjmEJUuWlM/kd/LJJzNhwgSGDx/Offfdx8iRI9l2220599xzc/Mma5Gi73blCueSCsGtt97Kgw8+yNtvv83s2bM5//zzWbNmDUOHDuW9997j/fffp6SkhGOPPbbC62677TZuuukm5s+fz5dffskll1wCwKuvvsrRRx/N+PHjmTdvHp9++ikffvhh+evq16/Pn//8ZxYsWMDTTz/NI488wtixZUswTZ48mSeeeILZs2ezePFi7rjjDlq0aJG7vwxJqoZ33nmHdu3asdNOO/HTn/6Ud955B4AvvvgCgEaNGpW3rVevHg0bNmTq1KkbPN+SJUto2LBhhenZ69Wrx80338zDDz/Mz3/+c/7+979zyy23sOWWW2bpXdVeRV98OOZDUiE49thj2X777WnevDlnnHEGt99+Oy1atGDQoEE0btyYrbbaijPOOIPHH3+8wuuGDh3KLrvsQklJCT/5yU+YOXMmAHfddReHHHII+++/Pw0bNuS8886rsGpyjx492Geffdhiiy3K77ysPXeDBg1YunQpr7/+Oikldtttt/JF7ySpNtl7770ZN24cDzzwANdffz0ff/wx++67L59++im77rorO+ywA6effjoLFy7kyy+/5E9/+hMffvghH330UZXnW7RoEb///e8ZNmwYW2xRsYNRp06dOPnkk7nttts49dRT6datWy7eYq1jtytJKgDbb799+fMdd9yRefPmsXz5co4//ngeeOCB8sXHli5dyldffVXep3ndrgaNGzdm2bJlAMybN6/COZs0aVLh7sXs2bM54YQTmD59OsuXL2f16tXlqzb37duXY489lmOOOYb33nuPQw89lEsuuaRgFhK0+07NKMTuO6p7vve971XY3meffejYsSM333wzJ5xwAvfccw+//vWvadGiBfXr16dfv35873vfq3IxyGXLljFw4EDat2/PRRddtN7xFStWcPvtt9O4cWOmTp1KSqkopxsv+jsfklQIPvjgg/Ln77//Pu3atePSSy/ljTfe4Nlnn2XJkiU88cQTABtdQRmgbdu2Fc65fPnyCrO3HH300ey66668+eabLFmyhAsvvLDCeY877jhmzJjBq6++yuzZs7n44otr4m1KUlY1bdqULl26lM9o1aNHD2bOnMmiRYv46KOPeOCBB/j000/p2LFjhdctW7aMgw8+GIB//vOfFbpqrXXKKaewevVqnnvuOaZPn85VV12V/TdUC1l8SFIBuPrqq/nwww9ZuHAhF1xwAYMHD2bp0qWUlJSwzTbbsHDhQsaMGbPJ5zvssMP45z//ydSpU/nyyy8566yzKqx4vXTpUrbeemuaNm3K66+/zjXXXFN+7Pnnn+fZZ59l1apVNGnShEaNGlXosiVJtdXKlSt5/fXX1+sq2qxZM1q1asWbb77J9OnT+eEPf1h+bOnSpRx00EF89dVXTJo0iaZNm6533ilTpjB27FjGjRtHly5duPTSSzn11FN5++3im9mw6H8aOOBcUiE4/PDDGTBgAB07dmTnnXfmzDPPZPTo0axYsYKWLVuyzz77cNBBB23y+bp06cLVV1/N4YcfTtu2bdl2223LZ8kC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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.clipping import Clipping\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "sf_crime_df = sf_crime_df[columns]\n", + "objs = [Clipping({\"X\": [-121.5, 122.5], \"Y\": [37.5, 37.75]})]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"Clipping\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b7737483", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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VH73u9/xyiuvcM0115zstyLcCvxFGfPJh5n1BHo2adJk4L///e9IhyMiJdC3335L3bp1qVChwokrS5EcO+ejSZMmee4p+RAROW0VmHyUqDUfkaDdrkTkRI4cOUJ8fHykw4hK8fHxmsomIhJDYj75EBEpDE21Cg19X0VEYkvMJx/a7UpEpHAaNGjAokWLIh2GiIicxmI++dC0KxERERGR8ChpW+2KiJwWPurUOKTtt1u2MaTti4iIRIKSDxGR01yDBg249dZbSUlJYdeuXfzxj3/kb3/7GxkZGdx44418/PHHHD16lA4dOvDss89y1llnAXDppZdy8cUXs3jxYtasWUP79u2ZNWsWCQkJAKSkpHD//fdz8OBBRowYkaPPTz75hGHDhvH1118THx9Pr169ePzxxylbtizuzogRI5g5cyaHDh2ifv36zJ49m+bNm4f9eyMipze7Z3ekQ4gKPrFGpEPIEvPTrrTmQ0SiwcyZM3nnnXfYuHEjGzZs4KGHHiIzM5MBAwawZcsWtm7dSnx8PHfccUeOz82aNYuXXnqJ77//nsOHDzNp0iQAvvrqKwYPHkxKSgo7d+7khx9+YPv27VmfK126NE888QR79uzhww8/5L333mPatGkALFy4kGXLlrFhwwb27dvHq6++SvXq1cP3zRARkRIr5pMPrfkQkWhwxx13UK9ePapVq8bo0aOZPXs21atXp1evXlSoUIEzzjiD0aNH8/777+f43IABAzjnnHOIj4/nuuuuIzU1FQicwnvVVVfRqVMnypUrx4MPPkipUv/3K6Nt27a0a9eOMmXKZI28HGs7Li6OAwcO8M033+DunHfeedSpUyd83wwRESmxYj75EBGJBvXq1ct6X79+fXbu3El6ejq33nor9evXp3LlynTq1ImffvqJX3/9Natu7dq1s95XqFCBgwcPArBz584cbVasWDHH6MWGDRu46qqrqF27NpUrV+a+++5jz549AHTp0oU77riD22+/nZo1azJo0CD2798fsmcXEZHTh5IPEZEosG3btqz3W7dupW7dukyePJn169fz8ccfs3//fpYtWwaA+4kPBK9Tp06ONtPT0/nhhx+yrgcPHsy5557Lv//9b/bv38/DDz+co90///nPrF69mq+++ooNGzbw2GOPFcdjiojIaU7Jh4hIFJg6dSrbt29n7969TJgwgT59+nDgwAHi4+M588wz2bt3L+PHjy90e7179+Zf//oXy5cv5/Dhw4wZM4bMzMys+wcOHKBy5cpUqlSJb775hr/97W9Z9z799FM+/vhjjhw5QsWKFSlfvnyOKVsiIhK7Yv63gRaci0g06Nu3L926daNRo0Y0btyY+++/n+HDh5ORkUFCQgLt2rWje/fuhW7v/PPPZ+rUqfTt25c6depQtWrVrF2yACZNmsSsWbM444wzGDhwIH369Mm6t3//fgYOHEjVqlWpX78+1atX5+677y7W5xURkdOTFWb4PRYkJSX5qlWrIh2GiJRAX3/9Needd16kwyhQgwYNeP755+natWukQzkpBX1/zWy1uycVogn9IhOJUtpqt3hEYKtdK+hGzI98iIiIiIhIeCj5EBERERGRsNAJ5yIip7nNmzdHOgQREZFC0ciHiIiIiIiERcwnH9rtSkREREQkPGI++XD3ee4+qEqVKpEORUREREQkqsV88iEiIiIiIuGh5ENERERERMJCyYeIiIiIiISFkg8REREREQkLnfMhInIS7J7dIW3fJ9YIafsiIiKRoJEPEZHTXIMGDZg0aRItWrSgSpUq9OnTh0OHDpGcnEzHjh1z1DUzvv32WwD69+/PkCFDuPLKK6lUqRIdOnTgu+++Y/jw4VStWpVzzz2Xzz//PEc/jzzyCM2aNaNq1aoMGDCAQ4cOAdC8eXPmzZuXVffIkSMkJCTk+LyIiEjMJx8650NEosGrr77KggUL2LRpE2vWrCE5ObnQn3vooYfYs2cP5cqVo3379rRp04Y9e/bQu3dvRowYkaP+zJkzeeedd9i4cSMbNmzgoYceAuCmm27iH//4R1a9+fPnU6dOHVq3bl1szygiIqe/mE8+dM6HiESDP//5z9StW5dq1arRs2dPUlNTC/W5a665hrZt21K+fHmuueYaypcvz0033UTp0qXp06dPnpGLO+64g3r16lGtWjVGjx7N7NmzAbjhhhuYP38++/fvByAlJYUbb7yxeB9SREROezGffIiIRIPatWtnva9QoQIHDx4s1Odq1aqV9T4+Pj7Pde526tWrl/W+fv367Ny5E4C6devSoUMHXn/9dX766Sfefvttrr/++pN6FhERiV5acC4iEqUqVqxIenp61vV33313ym1u27Yt6/3WrVupW7du1nW/fv14/vnnOXr0KO3btycxMfGU+xMR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EYluRRn5eACYDPy3u/8aonjCzsx6Aj2bNGkS6VBERCRMHn30Ue655x7q169PrVq1MLOse9nfi4hI8SpK8lELeD6aEg/Qmg8RkVj0xBNP8Le//Y1bb7010qGIiMSUoiwinw9cGKpAREREwiUzM5PLLrss0mGIiMScoox8vAv81czOB74EjmS/6e5vFGdgIiIioTJ48GBeeuklJkyYEOlQRERiSlGSj78Hv96Xzz0ncNq5iIhIiTd27Fh69OhB69atad68OXFxcTnuv/jiaXt8lYhIiVbo5MPdo/KcDxERiT2jR49m4cKFtGnThh9//FGLzEVEwqRI53xEI+12JSISe6ZNm8asWbPo06dPpEMREYkpRTnnY8Tx7p+uhwxqtysRkdgTHx9P69atIx2GiEjMKcrIx9Bc13FAHSAD+B4dMigiIqeJO++8kyeffJKpU6dqypWISBgVZc1Hw9xlZlYLeAl4rjiDEhERCaUPPviAZcuW8dZbb9GsWbM8C87nzp0bochERKLbKa35cPc0MxsNvAq8WTwhiYiIhFZCQgLXXnttpMMQEYk5xbHgvBSB089FREROCy+99FKkQxARiUlFWXCe+09ERmDNx+3AB8UZlIiIiIiIRJ+ijHy8luvagd3AYuCuYotIREQkBFq0aMH7779P1apVueCCC4670HzNmjVhjExEJHbokEEREYkJvXr1oly5clnvtcuViEj4FSr5MLM4YDlwk7uvD21I4aVDBkVEYsPYsWOz3o8bNy5ygYiIxLBCjWa4+xGgIYGpVlHF3ee5+6AqVapEOhQREQmTLl268NNPP+Up379/P126dIlARCIisaEoU6leBnQKuIiInPaWLl3K4cOH85QfOnSIDz7QHioiIqFSlAXnFYHrzexyYDXwc/ab7v7n4gxMRESkuH322WdZ79esWUO1atWyrn/99VfeeecdEhMTIxGaiEhMKErycR5w7Kd2o1z3om46loiIRJ+kpCTMDDOjW7duee7Hx8fz9NNPRyAyEZHYUJTdrjqHMhAREZFQ27RpE+5Oo0aN+OSTT6hRo0bWvbJly1KzZk1Kly4dwQhFRKJbcZxwLiIiclqoX78+AJmZmRGOREQkNin5EBGRmLR9+3aWLVvG999/nycZGTFiRISiEhGJbko+REQk5sycOZObb76ZMmXKUKNGjRwHDpqZkg8RkRCJ2uTDzCoAXwNz3H1kpOMREZGSY8yYMdx11108+OCDWuMhIhJGRTnn43QzGvgo0kGIiEjJk5aWxi233KLEQ0QkzKIy+TCzpsC5wNuRjkVEREqeHj168PHHH0c6DBGRmBPWaVdm1gkYCbQF6gID3D05V50hwN1AHWAdMNzdi3rc7KRgGxedaswiIhJ9Lr/8ckaNGsW6deu44IILiIuLy3H/2muvjVBkIiLRLdxrPioBa4EZwVcOZtYHmAIMAZYHv75tZs3cfWuwTir5x93N3Xea2R+ADe6+wcyUfIiISB633norAA8//HCee2bGr7/+Gu6QRERiQliTD3efD8wHMLPkfKqMAJLd/bng9VAz6w4MBu4NttHqBN20A/4/M/t/BJKdODPb7+4PFMMjiIhIFNA5HyIikVFi1nyYWVkC07EW5rq1kCJMn3L3e929nrs3IDDF67mCEg8zG2Rmq8xs1e7du08ychERERERKYyStNVuAlAaSMtVngZ0DUWH7j4dmA6QlJTkoehDRERKnscff/y493XOh4hIaJSk5KPY5V7Mnh8z6wn0bNKkSegDEhGREuHpp5/OcX3kyBF27dpFfHw8NWvWVPIhIhIiJSn52AP8CtTKVV4L+C5Unbr7PGBeUlLSwFD1ISIiJcumTZvylKWlpTFgwAAGDtSvAxGRUCkxaz7c/TCwGrg8163LgZWh6tfMeprZ9H379oWqCxEROQ3UqlWLCRMm8Je//CXSoYiIRK2wJh9mVsnMWplZq2DfZwevzw5WeRzob2a3mNl5ZjaFwHkgz4YqJnef5+6DqlSpEqouRETkNJGZmUlaWu6lhyIiUlzCPe0qCViS7Xp88PUy0N/dXzGz6sD9BA4ZXAv0cPctYY5TRESi2BtvvJHj2t3ZtWsXU6dO5eKLL45QVCIi0S/c53wsBewEdaYB08ISEFpwLiISi3r37p3j2syoUaMGXbp0YfLkyRGKSkQk+pWkBecRoQXnIiKxR4cMiohERolZcC4iIhIOR44c4cILL2T9+vWRDkVEJObEfPKh3a5ERGJLXFwcmzZtwuy4s4BFRCQEYj750G5XIiKxp1+/fjz33HORDkNEJObE/JoPERGJPT///DMzZ87k3XffpW3btlSsWDHH/aeeeipCkYmIRDclHyIiEnO+/vpr2rRpA8B//vOfHPc0HUtEJHRiPvnQVrsiIrFnyZIlJ64kIiLFTms+tOZDRERERCQsYj75EBERERGR8FDyISIiIiIiYaHkQ0REREREwiLmkw8dMigiIiIiEh4xn3xowbmIiIiISHjEfPIhIiIiIiLhoeRDRERERETCQsmHiIiIiIiEhZIPEREREREJi5hPPrTblYiIiIhIeMR88qHdrkREREREwiPmkw8REREREQkPJR8iIiIiIhIWSj5ERERERCQslHyIiIiIiEhYKPkQEREREZGwUPIhIiIiIiJhoeRDRERERETCIuaTDx0yKCIiIiISHjGffOiQQRERERGR8Ij55ENERERERMJDyYeIiIiIiISFkg8REREREQkLJR8iIiIiIhIWSj5ERERERCQslHyIiIiIiEhYlIl0AKFgZpuB/UAm8KO7d45sRCIiIiIiEpXJR9BF7n4w0kGIiIiIiEiApl2JiIiIFNGyZcu4+uqrSUxMxMxITk7Ocf/gwYMMHTqUs846i/j4eH7zm9/wxBNP5Kgzffp0OnfuzJlnnomZsXnz5jz9TJgwgQ4dOlCxYkXMLM/9hQsXEhcXx8cff5yj/Pnnn6dSpUps3LjxlJ9VpDiFNfkws05mNtfMdpiZm1n/fOoMMbNNZnbIzFab2cUn0ZUD75vZp2Z2/SkHLiIiIpLNwYMHad68OVOmTCE+Pj7P/REjRvDWW2+RkpLC119/zejRo7nnnntISUnJqpOenk63bt0YN25cgf388ssvXHvttQwfPjzf+926deOWW26hX79+ZGRkALB582ZGjBjBpEmTaNy48ak9qEgxC/e0q0rAWmBG8JWDmfUBpgBDgOXBr2+bWTN33xqsk0r+cXdz953B9x3dfYeZ1QEWmdmX7r6m+B9HREREYlGPHj3o0aMHAP37989zf+XKldx444107hxYdtqgQQNeeOEFPv74Y2688UaArIRi1apVBfbzwAMPAPDaa68VWGfSpEm0bNmSe+65hyeffJL+/ftz0UUXcdttt53Us4mEUliTD3efD8wHMLPkfKqMAJLd/bng9VAz6w4MBu4NttGqEP3sCH7dZWbzgTaAkg8REREJi44dOzJv3jxuueUW6tWrx8qVK0lNTeXuu+8u9r4qVqxIcnIyl156Kbt37+aLL75g7dq1xd6PSHEoMWs+zKws0BZYmOvWQuCiIrRT0czOCL6vBHQB1hVQd5CZrTKzVbt37z65wEVERERyeeqpp2jZsiVnn302cXFxXHLJJfz1r3/lqquuCkl/HTt25IYbbmD27NlMnjyZxMTEkPQjcqpKTPIBJAClgbRc5WlA7SK0UwtYbmZfAB8BM9z90/wquvt0d09y96QaNWqcTMwiIiIieTz99NOsXLmSuXPnsnr1ap544glGjhzJggULQtJfWloab731FhUqVGDZsmUh6UOkOETdVrvu/h+gZWHrm1lPoGeTJk1CF5SIiIjEjIyMDO69917mzJlDz549AWjRogWpqalMmjSJ7t27F3ufgwYNomnTpkyePJmLL76YXr16ZfUtUpKUpJGPPcCvBEYusqsFfBeqTt19nrsPqlKlSqi6EBERkRhy5MgRjhw5QunSpXOUly5dmszMzGLvLzk5mUWLFvHyyy/Tvn17Ro0axa233srevXuLvS+RU1Vikg93PwysBi7PdetyYGX4IxIRERHJ38GDB0lNTSU1NZXMzEy2bt1KamoqW7dupXLlylxyySXcc889LF26lE2bNpGcnMyMGTO45pprstr47rvvSE1NZcOGDQB89dVXpKam5kgajrV77AyQY30ePBg4R3nbtm0MGzaMiRMn0rRpUwDGjh1LQkICQ4cODdN3Q6Twwn3ORyUza2VmrYJ9nx28PjtY5XGgv5ndYmbnmdkUoC7wbAhj6mlm0/ft2xeqLkRERCTKrFq1itatW9O6dWsyMjIYO3YsrVu3ZsyYMQD8z//8D7/97W+5/vrradasGRMnTuTBBx/kjjvuyGrj2WefpXXr1lx/feBIst///ve0bt2auXPnZtUZM2YMrVu3ztol61ifq1atwt25+eabSUpKytFu2bJlmTFjBnPmzOHNN98Mx7dDpNDM3cPXmdmlwJJ8br3s7v2DdYYAfwHqEDgT5E53D/nKqaSkJD/ePtvF6aNOp8eBP+2W6VTU7PTvdvo6Hf7t9O+Wl5mtdvekQlQN3y8yEQkru0e7kRYHnxj2jZWsoBvhPudjKccJJlhnGjAtLAGJiIiIiEjYlJg1H5GiaVciIiIiIuER88mHdrsSEREREQmPmE8+REREREQkPKLukMGi0iGDIiIi0U8Ll4tHBBYuS5SJ+ZEPTbsSEREREQmPmE8+REREREQkPJR8iIiIiIhIWMR88qGtdkVEREREwiPmkw+t+RARERERCY+YTz5ERERERCQ8lHyIiIiIiEhYKPkQEREREZGwiPnkQwvORURERETCI+aTDy04FxEREREJj5hPPkREREREJDyUfIiIiIiISFgo+RARERERkbBQ8iEiIiIiImER88mHdrsSEREREQmPmE8+tNuViIiIiEh4lIl0ACIiAnbP7kiHcEI+sUakQ4gJjzzyCG+88Qbr16+nXLlytGvXjkceeYTmzZvnW//WW29l+vTpPPbYY4wcOTLPfXenR48eLFiwgDlz5tC7d28A1q5dS1JSEjNnzqRXr15Z9RctWsSVV17J0qVL6dChQ2geUkRiVsyPfIiIiJQkS5cuZciQIaxcuZLFixdTpkwZunbtyt69e/PUfe211/jkk0+oW7duge1NnjyZUqXy/rpv3rw548eP57bbbiMtLQ2Affv2MWDAAO666y4lHiISEko+RERESpB33nmHAQMG0Lx5cy644AJSUlLYvXs3K1asyFFvy5YtDBs2jFmzZhEXF5dvW59++ilTpkzhpZdeyvf+3XffzTnnnMOgQYMAGDp0KFWrVuWBBx4o3ocSEQnStCsREZES7MCBA2RmZlK1atWssqNHj/KnP/2J+++/n/POO6/Az/Xt25fp06dTs2bNfOuUKlWKl19+mZYtW3L99dczZ84cPvnkE8qWLRuSZxER0ciHiIhICTZs2DBatWpF+/bts8rGjh1LQkICgwcPLvBzt912G927d+fKK688bvtNmjTh7rvvZtasWdxzzz20atWq2GIXEclNIx9SIC2APT3p300keowYMYLly5ezfPlySpcuDQTWhCQnJ5Oamlrg51JSUvjiiy9YtWrVCfvIyMhg9uzZVKhQgeXLl+PumFmxPYOISHYxP/Khcz5ERKQkuvPOO5k9ezaLFy+mUaNGWeVLly5l165d1KlThzJlylCmTBm2bNnCqFGjOOusswB47733+Oqrr6hUqVJWHYA+ffrQsWPHHP2MGjWKo0eP8sknn7Bq1SqeeeaZ8D2kiMScmB/5cPd5wLykpKSBkY5FREQEAlOtXnnlFZYsWcK5556b496QIUOytss95oorruBPf/oTAwcGfpVNmDAhz7a7F1xwAZMmTeIPf/hDVtmSJUuYNm0aS5Ys4fzzz2fy5MkMHz6cHj160Lhx4xA9nYjEsphPPkREREqS22+/nZSUFP75z39StWpVvvvuOwAqVapEpUqVqFmzZp4F5HFxcdSuXZvf/OY3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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.scalers import MinMaxScaler\n", + "\n", + "housing_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "sf_crime_df = housing_df[columns]\n", + "objs = [MinMaxScaler()]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"MinMaxScaler\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a62bc159", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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8/RerF+/np/97GfUrVuXatWq8cgjj5CZmQlA586dufvuu7nrrruoXbs2AwcOZN++fSF7dhERKTuUfIiIRIHt27fnvN62bRvJyck89dRTfPHFF3zyySfs27ePRYsWAeB+6g3B69Wrl6fNgwcP8u233+ac33nnnZx33nls2LCBffv2MX78+Dzt3nvvvSxfvpzPPvuM9evX87vf/a4kHlNERMo4JR8iIlFg0qRJfPXVV+zevZtx48bRp08fvv/+e+Lj4znzzDPZvXs3Y8aMKXJ7vXv35u9//zsfffQRR44cYdSoUWRnZ+eUf//991SrVo2EhAQ+//xznn/++Zyyf/3rX3zyySdkZWVRtWpVKleunGfIloiIxK6Y/22gCeciEg1uvPFGunXrRtOmTTn77LMZOXIk9913H4cOHSIxMZFLL72Uq6++usjtXXDBBUyaNIkbb7yRevXqUaNGjZxVsgAmTJjA9OnTOeOMMxgwYAB9+vTJKdu3bx8DBgygRo0aNGrUiFq1ajFs2LASfV4RESmbrCjd77EgNTXVly1bFukwRKQUWrduHeeff36kwzihxo0b8/LLL9OlS5dIh/KjnOjzNbPl7p5ahCb0i0wkSmmp3ZIRgaV27UQFMd/zISIiIiIi4aHkQ0REREREwkI7nIuIlHFbtmyJdAgiIiJFop4PEREREREJi5hPPrTalYiIiIhIeMR88uHuM919YPXq1SMdioiIiIhIVIv55ENERERERMJDyYeIiIiIiISFkg8REREREQkLJR8iIiIiIhIW2udDRORHsId2hbR9fyIppO2LiIhEgno+RETKuMaNGzNhwgRatmxJ9erV6dOnD4cPHyYtLY3LL788T10zY+PGjQD069ePwYMHc80115CQkED79u355ptvuO+++6hRowbnnXceK1euzHOf3/zmN7Ro0YIaNWrQv39/Dh8+DEBKSgozZ87MqZuVlUViYmKe94uIiMR88qF9PkQkGrz22mu89957bN68mdWrV5OWllbk940dO5bMzEwqVapEu3btaNOmDZmZmfTu3ZsHHnggT/1p06Yxe/ZsNm3axPr16xk7diwAt9xyC3/5y19y6s2aNYt69erRunXrEntGEREp+2I++dA+HyISDe69916Sk5OpWbMmPXr0YNWqVUV63w033EDbtm2pXLkyN9xwA5UrV+aWW26hfPny9OnT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c+fOPPXUUxGKSkQk+pWmCecRoQnnIiKxR5sMiohERqmZcC4iIhIOWVlZXHLJJXzxxReRDkVEJObEfPKh1a5ERGJLXFwcmzdvxuyko4BFRCQEYj750GpXIiKxp2/fvrz00kuRDkNEJObE/JwPERGJPQcOHGDatGm8//77tG3blqpVq+Yp/8Mf/hChyEREopuSDxERiTnr1q2jTZs2AHz55Zd5yjQcS0QkdGI++dBSuyIisWfBggWnriQiIiVOcz4050NEREREJCxiPvkQEREREZHwUPIhIiIiIiJhoeRDRERERETCIuaTD20yKCIiIiISHjGffGjCuYiIiIhIeMR88iEiIiIiIuGh5ENERERERMJCyYeIiIiIiISFkg8REREREQmLmE8+tNqViIiIiEh4xHzyodWuRERERETCI+aTDxERERERCQ8lHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFgo+RARERERkbBQ8iEiIiIiImGh5ENERERERMIi5pMPbTIoIiIiIhIeMZ98aJNBEREREZHwiPnkQ0REREREwkPJh4iIiIiIhIWSDxERERERCQslHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFhUiHQAoWBmW4B9QDbwnbt3imxEIiIiIiISlclH0GXuvj/SQYiIiIiISICGXYmIiIiISFiENfkwsw5m9o6ZfW1mbmb9Cqkz2Mw2m9lhM1tuZlf8iFs58IGZ/cvMbjrtwEVERERE5LSFu+cjAfgUGAIcyl9oZn2AicB4oDXwT+BdM2uYq84qM/u0kCM5V1OXu3tb4FrgETNrGcJnEhERkRizaNEirr32WurXr4+ZkZaWdsK6gwYNwsyYMGFCgbKlS5fStWtXEhISOOOMM7jsssvIzMwEYMuWLdx22200bdqU+Ph4mjZtysMPP8yhQ//5E2rOnDnExcXxySef5Gn35ZdfJiEhgU2bNpXMA4uUkLAmH+4+y90fcfc3CEwGz+8BIM3dX3L3de5+D7ADuDNXG63cPaWQIz1Xna+D/+4AZgFtQvpgIiIiElP2799PSkoKEydOJD4+/oT13njjDZYuXUpycnKBsk8++YRu3brRsWNHlixZwvLly3nwwQeJi4sD4PPPP+fYsWM8//zzrF27lmeffZZXX32VIUOG5LTRrVs3br/9dvr27ZuTlGzZsoUHHniACRMmcPbZZ5fwk4ucnlIz58PMKgJtgTn5iuYAlxWjnapmdkbwdQLQGVh7groDzWyZmS3btWvXjwtcREREYk737t0ZP348vXv3ply5wv+c2rp1K0OGDGH69Ok5CUVu999/P3fddRcjRowgJSWFc845h549e1K9enUArr76atLS0rjqqqto2rQp//Vf/8WIESN4880387QzYcIEjh49ykMPPYS7069fPy677DLuuOOOkn9wkdNUapIPIBEoD2Tku54B1C1GO3WAj8zs38AS4FV3/1dhFd39RXdPdffUpKSkHxOziIiISAFHjx7ll7/8JSNHjuT8888vUL5z504+/vhj6tWrx+WXX07t2rW54oormDdv3knb3bdvHzVq1MhzrWrVqqSlpTFp0iRuuukm/v3vf/OnP/2pRJ9HpKSUpuSjRLj7l+5+UfBIcfeJJ6tvZj3M7MW9e/eGK0QRERGJcqNHjyYxMZE777yz0PIvv/wyp96tt97K7NmzueKKK7jqqqv497//Xeh7tm7dyoQJExg8eHCBsssvv5xf/epXzJgxg6eeeor69euX3MOIlKDSlHxkAscI9FzkVgf4JlQ3dfeZ7j7weBeniIiIyOlYuHAhaWlpJ+19yM4OTH0dNGgQt956K61bt2b8+PH85Cc/4YUXXihQPyMjg6uvvpquXbty//33F1r+j3/8gypVqrBo0aKSexiRElZqkg93PwIsB7rmK+pKYNUrERERkVJv4cKF7Nixg3r16lGhQgUqVKjA1q1bGT58OGeddRYA9erVA6BFixZ53tuiRQu2bduW59o333xDp06dSElJYerUqZhZgXsOHDiQ5s2bM3fuXP7yl78wc+bMED2dyOkJ6w7nwQngzYKn5YCGZtYK2O3u24CngalmthRYDNwBJAMFvwIouZh6AD2aNWt2yroiIiIipzJ48GB69+6d59pVV13FL3/5SwYMGABA48aNSU5O5osvvshTb/369Vx44YU55zt27KBTp05ccMEFzJgxgwoVCv7plpaWxty5c1m1ahXNmzdn+PDhDBo0iPbt21OzZs0QPKHIjxfW5ANIBRbkOh8TPP4M9HP3v5pZLWAkUI/AniDd3X1rqAJy95nAzNTU1AGhuoeIiIhEl/3797Nx40YgMIRq27ZtrFq1ipo1a9KwYUNq166dp35cXBx169bl3HPPBcDMGDZsGKNHj6Zly5a0bt2a1157jSVLlvDcc88BkJ6eTseOHUlOTuaZZ57J2f8DICkpifLly7N9+3aGDBnCE088QfPmzYHAPJKZM2dyzz33MG3atHB8HCJFFtbkw90XAgX7CvPWmQxMDktAIiIiIj/CsmXL6NSpU8756NGjGT16NH379j3phoO53Xffffzwww8MHTqUb7/9lgsuuIB3332Xiy66CAhsILhhwwY2bNhAw4YN87x38+bNNGrUiFtvvZXU1FTuvvvunLKKFSvy6quvcvHFF9O7d29uuOGG039gkRJi7h7pGCIq17CrARs2bAjLPZd0KBsb/ly6SLui5qb/bmVXWfhvp/9uBZnZcndPLULV2P5FJhLF7CHtw1YS/Imwbylxws6GUjPhPFK02pWIiIiISHjEfPIhIiIiIiLhEfPJhzYZFBEREREJj5hPPjTsSkREREQkPGI++RARERERkfAI9z4fIiIiImGnVZNKRgRWTZIoE/M9H5rzISIiIiISHjGffGjOh4iIiIhIeMR88iEiIiIiIuGh5ENERERERMJCyYeIiIiIiIRFzCcfmnAuIiIiIhIeMZ98aMK5iIiIiEh4xHzyISIiIiIi4aHkQ0REREREwkLJh4iIiIiIhEWFSAcgIiJgD+2KdAin5E8kRToEEREp42K+50OrXYmIiIiIhEfMJx9a7UpEREREJDw07Eokymj4joiIiJRWSj7khPRHrIhIZCxatIgJEyawfPly0tPTmTJlCv369cspz8jIYPjw4cyZM4c9e/bQoUMHnn32WZo3b55TZ8CAAcyfP5/09HQSEhK47LLLeOKJJzj//PMB+PTTT0lNTWXatGn06tUr531z587lmmuuYeHChbRv3z5szywisSHmh12JiIiUNvv37yclJYWJEycSHx+fp8zduf7669mwYQNvv/02K1eupFGjRnTp0oUDBw7k1EtNTSUtLY1169Yxe/Zs3J0uXbqQlZUFQEpKCmPGjOGOO+4gIyMDgL1799K/f3+GDh2qxENEQkLJh4iISCnTvXt3xo8fT+/evSlXLu+v6g0bNrBkyRImT57MxRdfzLnnnsvzzz/PoUOHmDFjRk69QYMGccUVV9C4cWPatGnD2LFjSU9P58svv8ypM2zYMM455xwGDhwIwD333EONGjV47LHHwvOgIhJzlHyIiIiUIT/88AMAlStXzrlWrlw5KlWqxEcf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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.scalers import StandardScaler\n", + "\n", + "housing_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "sf_crime_df = housing_df[columns]\n", + "objs = [StandardScaler()]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"StandardScaler\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "79b9cc3b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/opensource/gators/benchmarks/benchmark.py:313: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " XN[f\"{col}{i}\"] = X[col].copy()\n" + ] + }, + { + "data": { + "image/png": "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kqQaGTFiBAcccAC9em35jMJLly7lZz/7GUOHDt0g8QDo1q0b5513HnfffTcXXHCBiYekOtWQko/FwFo2nu2kHfDhljaaUpqUUhq2vnuCJEn1xahRo5g2bRr3338/jRo12qI2Vq5cSf/+/enUqRPXXHPNRuVlZWXcc889NGvWjGnTplFfe0RIKgwNJvnIzgc/Czi6UtHRZAbdSZIKVEopNtHlqmCdffbZ3HPPPTz++OPstttuW9TGypUr6devHwB/+9vfNhivtN7555/PF198wfPPP8/MmTO58cYbtypuSfoy9Sr5iIgWEXFARBxAJrZdstvrp9K9DjglIk6NiL0i4noyM3rcvBXHtNuVJKleGTFiRHnisaWToaxYsYJjjjmGtWvXMnnyZFq0aLFRnSeeeIJx48Yxfvx49tlnH6699louuOAC5syZs7WnIElVqlcDzrPzlD9RRdHvU0qnZOucSWbqwA5k1gQ5u+IA9C3lgHNJX2b58uV89NFHrFmzJt+hFIwmTZrQtm3b8pmXKqs44Hwz6s8vslrwox/9iAkTJvDAAw+w9957l+9v0aJFeQKxZMkS5s2bx9KlSznyyCO59dZb6dmzJ+3bt6d9+/asWLGCvn37snz5ch544AG233778nZatWpF06ZNy2deGzBgANdee215+THHHMOqVat48skn2WabenWNUlLD0fBmu8o1kw9Jm7J8+XJKS0vp1KkTJSUlG0x/qy2TUqKsrIz58+fTrl27KhOQYk0+NvXvq+JUweun+t1UnSeffJIjjzyyynbWz4z1wx/+kGeeeYYXX3xxg+5Y8+fPp3v37lxyySWcffbZW39CkoqRycemRER/oH+3bt2Gvv322/kOR1I99M4779CxY0eaNWuW71AKzqpVq1iwYEGVa2UUa/IhSQWgeKbarSlnu5K0OWvWrKGkpCTfYRSkkpISu7JJUhEp+uRDkqrDrlZ1w/dVkopL0ScfznYlSdXTtWtXHn300XyHIUlqwIo++bDblSRJkpQbjfMdgCQ1RM8etnudtn/wVNdZkCQVHpMPSWrgunbtymmnncaECRNYuHAh3/3ud/ntb39LWVkZJ510Es899xxffPEFhxxyCDfffDNf+cpXADjiiCPo3bs3jz/+OC+//DK9evXi7rvvpnXr1gBMmDCBiy++mJUrVzJq1KgNjvn8888zYsQI3njjDUpKShgwYADXXXcdTZs2JaXEqFGjuOuuu1i9ejVdunThnnvuoXv37jl/b+pCXLAo3yEUhHR1m3yHICkPir7blWM+JBWCu+66i4cffpg5c+bw1ltvccUVV7Bu3TqGDBnCe++9x7x58ygpKeGss87a4HV33303d955Jx999BGff/45Y8eOBeD111/njDPOYMKECSxYsICPP/6YDz74oPx1jRo14le/+hWLFy/mmWee4bHHHmPcuHEATJkyhalTp/LWW2+xbNky7r33XnbeeefcvRmSpHqr6JMPx3xIKgRnnXUWnTt3plWrVlx00UXcc8897LzzzgwYMIBmzZqx/fbbc9FFF/HUU09t8LohQ4awxx57UFJSwve//31mz54NwH333cexxx7LYYcdxrbbbsvll1++wWrXBx10EAcffDCNGzcuv/Oyvu0mTZqwYsUK3nzzTVJK7LXXXnTo0CF3b4Ykqd4q+uRDkgpB586dy5936dKFBQsWsGrVKk477TS6dOnCDjvswGGHHcbSpUtZu3Zted327duXP2/WrBkrV64EYMGCBRu02bx58w3uXrz11lsce+yxtG/fnh122IGf/vSnLF68GIA+ffpw1lln8aMf/Yi2bdsybNgwli9fXmfnLklqOEw+JKkAvP/+++XP582bR8eOHbn22mv5xz/+wXPPPcfy5cuZOnUqACltfkHwDh06bNDmqlWr+Pjjj8u3zzjjDPbcc0/efvttli9fzlVXXbVBuz/+8Y+ZNWsWr7/+Om+99Ra//OUva+M0JUkNnMmHJBWAm266iQ8++IAlS5Zw5ZVXMmjQIFasWEFJSQk77rgjS5YsYcyYMdVub+DAgfztb39j2rRpfP7551xyySWsW7euvHzFihXssMMOtGjRgjfffJPf/va35WUvvPACzz33HGvWrKF58+Zst912G3TZkiQVr6L/beCAc0mF4IQTTqBv377stttu7L777lx88cWMHDmSsrIyWrduzcEHH8wxxxxT7fb22WcfbrrpJk444QQ6dOjATjvtVD5LFsDYsWO5++672X777Rk6dCiDBg0qL1u+fDlDhw5lp512okuXLuy8886cd955tXq+kqSGKapz+70Y9OzZM82cOTPfYUiqh9544w322muvfIexSV27duW2227jqKOOyncoW2RT729EzEop9axGEzn9ReZUu7XDqXalghabKij6Ox+SJEmScsPkQ5IkSVJOuMK5JDVw7777br5DkCSpWrzzIUmSJCknij75cLYrSZIkKTeKPvlIKU1KKQ1r2bJlvkORJEmSClrRJx+SJEmScsPkQ5IkSVJOmHxIkiRJygmTD0mSJEk54TofkrQF4oJFddp+urpNnbYvSVI+eOdDkhq4rl27MnbsWPbbbz9atmzJoEGDWL16NePHj+fQQw/doG5E8M477wBwyimncOaZZ/Ltb3+bFi1acMghh/Dhhx8ycuRIdtppJ/bcc09eeumlDY7z85//nL333puddtqJIUOGsHr1agC6d+/OpEmTyuuuWbOG1q1bb/B6SZKKPvlwnQ9JheDee+/l73//O3PnzuXll19m/Pjx1X7dFVdcweLFi9l2223p1asXPXr0YPHixQwcOJBRo0ZtUP+uu+7i4YcfZs6cObz11ltcccUVAAwePJg//vGP5fUmT55Mhw4dOPDAA2vtHCVJDV/RJx+u8yGpEPz4xz+mY8eOtGrViv79+zN79uxqve573/seBx10ENtttx3f+9732G677Rg8eDCNGjVi0KBBG925OOuss+jcuTOtWrXioosu4p577gHgv//7v5k8eTLLly8HYMKECZx00km1e5KSpAav6JMPSSoE7du3L3/erFkzVq5cWa3XtWvXrvx5SUnJRtuV2+ncuXP58y5durBgwQIAOnbsyCGHHML999/P0qVLeeihhzjxxBO36FwkKZemTp3KcccdR6dOnYiIje4cr1y5kuHDh/OVr3yFkpISvva1r/GrX/2qyrZSSnz7298mIrjvvvvK97/66qtst9123H///RvUf/TRR2nSpAnTp0+v9fOqrxxwLkkFqnnz5qxatap8+8MPP9zqNt9///3y5/PmzaNjx47l2yeffDK33XYbX3zxBb169aJTp05bfTxJqmsrV66ke/fuDB48mMGDB29UPmrUKB599FEmTJjArrvuytSpUxk6dCitW7fe6A7vtddeyzbbbHxtv3v37owZM4bTTz+dQw89lHbt2rFs2TKGDBnCOeecwyGHHFJn51ffeOdDkgrU/vvvz2uvvcbs2bNZvXo1l1566Va3edNNN/HBBx+wZMkSrrzySgYNGlRe9t3vfpcXX3yR66+/vspf4FKh29or6EuWLGH48OHsueeelJSU0LlzZ8444ww+/vjj8jpeQa99/fr146qrrmLgwIFVJg4zZszgpJNO4sgjj6Rr164MHjyYgw8+mOeee26Dei+88ALXX389d955Z5XHOe+889hjjz0YNmwYAMOHD2ennXbisssuq/2TqsdMPiSpQO2xxx5ccsklHHXUUXz1q1/daOarLXHCCSfQt29fdtttN3bffXcuvvji8rKSkhIGDBjA3LlzOf7447f6WFJDs/4K+vXXX09JSclG5aNGjeJ///d/mTBhAm+88QYXXXQRF1xwARMmTABgwYIFzJ8/n2uuuYZXXnmFP/7xj0ydOpX/+q//Km+j4hX00tJSgKK9gp4rhx56KJMmTSq/8ztjxgxmz57NMcccU15nxYoVnHDCCdxyyy20bdu2yna22WYbfv/73/Poo49y4okn8qc//Yk//OEPNG3aNCfnUV9ESinfMdQLPXv2TDNnzsx3GJLqoTfeeIO99tor32HkXdeuXbnttts46qijNlnnsssu46233tpg5qvN2dT7GxGzUko9q9FETn+R1fUaL8Wi0NeyadGiBTfeeCOnnHJK+b7u3bszYMAAxowZU77v8MMPZ9999+XGG2+ssp3Jkydz7LHHsnTpUnbYYQcA1q1bR+/evWndujV//etfGTx4MLNnz2bmzJlF94dsbavqc/v888857bTTGD9+PI0bZ0Ys3HDDDZx++unldU488URatWrFDTfcAGSmNZ84cSIDBw7c6BiXXnopY8aM4Wc/+1kh3/WITRU45kOSVCuWLFnC7bffXn4VV9KG1l9BP/XUU+ncuXP5FfTzzjtvk69Zvnw52267Lc2aNSvft/4K+v7778+JJ57IxIkTef7550086sgNN9zAjBkzePDBB+nSpQtTp07l3HPPpWvXrhxzzDFMmDCB//u//6M6F7HLysq45557aNasGdOmTSOlRMQm/04vSHa7kiRttVtvvZXOnTvz7W9/m8MOOyzf4Uj10m9+8xv2339/dtllF5o0acLhhx/OL37xC4499tgq6y9dupSf/exnDB06tPyK+3rdunXjvPPO4+677+aCCy7ggAMOyMUpFJ2ysjIuvPBCrrnmGvr3789+++3HWWedxX/+538yduxYAB577DFef/11WrRoQePGjcs/q0GDBm3U3fX888/niy++4Pnnn2fmzJmbvONVyAr2zkdE/AU4AngspbTxPS9JUo28++67mywbOnQoQ4cOzV0w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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.imputers import NumericImputer\n", + "\n", + "housing_df = pd.read_parquet(housing_file_location)\n", + "columns = [\"MasVnrArea\", \"GarageYrBlt\", \"LotFrontage\"]\n", + "housing_df = housing_df[columns]\n", + "objs = [NumericImputer(strategy=\"median\")]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"NumericImputer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "77a64956", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/opensource/gators/benchmarks/benchmark.py:313: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " XN[f\"{col}{i}\"] = X[col].copy()\n" + ] + }, + { + "data": { + "image/png": "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ccaMGbRv357NNtuMjz/+mJUrV9KkSRM6d+5M48aNK+q9+Wb5KKHtt/93XrBy5Uo++ugjPvvsM1asWEG9evXYfPPNadGiBe3a/Xtk01dffcW8efNYsmQJq1evpkGDBrRo0YLOncsX3FqxYgVz587liy++YPXq1TRt2pTtt9+ezz//nLfeeosePXrQrFkzAObOncuSJUvo3bt3pftdcx+dOv37u6CFCxfy7rvv0rNnTzbffPNq3e+MGTMWppTaRMRmwIXAzylfTvcJypcFfge4JKU0CuDLL7/khBNO4B//+AefffYZXbp0Ye7cuQB8+umnXHrppfztb39j3rx5tGjRgu23355BgwYxYsQIAMaNG8fQoUN5++236d69+3f9dW+0iy++mIkTJ/LKK69Uq/5rr71Gz549mTVrFjvvXJ6j7LvvvvTq1Yv//u//3uDrVq9ezT777EPr1q35+9//zjHHHMPMmTOZPn06DRs23ODrJKkaYoMFm1DysWY+x3+svbJKRFwEHJVS2j5zfCjlQx02A65KKd1UneuVlpam6dOn1+5NSFIW9OnTh27dujFx4sR8h7JRIoILLriA0aNHb6h8RkqptBpN1c0Psu/o4osv5qqrrqJFixY0atSI3XffnSuuuIJu3bqtt/6zzz5L3759ef/999lqq62A8uRjTfLSrl07DjroIEaNGsUWW2xR6bXvvPMO3/ve9zjssMO45557eP7559lll13WuYYk1dAGk486NeG8NqSU7qN8465qiYiBwMB8fsslSdXxr3/9i8cff5xZs2Zx5JFH5jscZcnuu+/OuHHj2GGHHViwYAGjR49mzz335NVXX6VVq8rz7L/++mvOPPNMBg4cWJF4ABx55JF06dKFjh078uqrr/KrX/2KWbNmMWXKlEqv7969O2effTaXXHIJ//Vf/2XiISnrNqXkYyGwinVXRmkHzP+ujaaUJgGTSktLh21EbJKUdb/73e8YP348Rx11FKecckq+w1GWHHTQQZWO99hjD7p168Ydd9zByJEjK86vXLmSo48+ms8++4z77qv8ndvw4cMrnu+8885069aN3XffnRdffJE+ffpUlC1btoy77rqLxo0b8+STT5JSIrNUsiRlRZ2acP5NUkpfUz6Ho3+Vov6Ur3olSQXtuuuu45NPPuGOO+6oNAdkU5VS2uCQK/1b06ZN6dmzJ2+//XbFuZUrV/LTn/6UWbNm8fDDD6/TI1JVaWkp9erVq9QGwLnnnsvKlSt5/vnnmT59+jfOEZGk2lCnko+IaBoRu0TELpTHtnXmeM0SgtcAx0XECRGxY0RcT/neHjduxDUHRsRNixcv3vgbkCSpli1fvpw33niDDh3KV0hesWIFQ4YMYdasWTz66KO0b9/+W9t4+eWXWbVqVUUbAI8++ig33HAD48aNo2fPnlx99dWcd955zJ49O2v3Ikl1asJ5ROwLPLqeojtSSsdl6pwCnEP5soGvAGesPQH9u3LCuaRvsmTJEhYsWMCKFRvaJFs11aBBA9q2bVuxelZVxTrh/KyzzmLgwIFsvfXWLFiwgMsuu4xp06bx8ssv06lTJwYPHswLL7zApEmT6NixY8XrmjdvTklJCbNnz2bChAkcfPDBtG7dmtdee40zzzyTkpISXnjhBerVq8fnn3/OzjvvzKBBg7j66qsr2vjhD3/I0qVLeeyxx9hsszr1/aSkTcumt9pVrpl8SNqQJUuWUFZWRqdOnSgpKXFMfC1IKbFs2TLmzZtHu3bt1puAFGvy8Z//+Z9MmzaNhQsX0qZNG/bYYw8uu+wydtppJ+bOncs222yz3tfdfvvtHHfccbz//vscffTRvPLKK3zxxRd07tyZH/3oR4waNYqWLVsC8POf/5xnnnmGF198sWLpY4B58+bRq1cvLrroIs4444yc3K+kgmTysSFrrXY1rOpYWEmC8uVIO3bsWBDzLOqapUuX8uGHH653X41iTT4kqQBsMPko+j7VlNKklNLw5s2b5zsUSXXUihUrKCkpyXcYBamkpMShbJJURIo++ZCk6nCoVXb4vkpScSn65MPVriSperp27crUqVPzHYYkaRNW9MmHw64kSZKk3NiUdjiXpDrj2X7bZrX9Paa514IkqfCYfEjSJq5r166ceOKJjB8/no8++ojDDjuMP/zhDyxbtoyf/exnPPfcc6xcuZK99tqLG2+8ka222gqAfffdl3322YdHHnmEWbNm0bdvX+68805at24NwPjx47nwwgv54osvGDlyZKVrPv/885x++um8/vrrlJSUMGjQIK655hoaNmxISomRI0cyYcIEli9fTpcuXbjrrrvo1atXzt+bbIjzPs53CAUhXdkm3yFIyoOiH3blnA9JhWDChAk8+OCDzJ49m7feeovRo0ezevVqhg4dyrvvvst7771HSUkJp556aqXX3Xnnndx+++0sWLCAr7/+mjFjxgDw2muvcfLJJzN+/Hg+/PBDPvnkEz744IOK19WrV49rr72WhQsX8swzz/Dwww9zww03ADBlyhSmTZvGW2+9xeLFi7n77rtp1apV7t4MSVKdVfTJh3M+JBWCU089lc6dO9OyZUsuuOAC7rrrLlq1asWgQYNo3LgxW2yxBRdccAGPP/54pdcNHTqU7bbbjpKSEn7yk58wc+ZMACZOnMghhxxCv379aNSoEZdddlmlHa9322039thjD+rXr1/R87Km7QYNGvD555/zxhtvkFJixx13pEOHDrl7MyRJdVbRJx+SVAg6d+5c8bxLly58+OGHLF26lBNPPJEuXbrQrFkz+vXrx2effcaqVasq6rZv377ieePGjfniiy8A+PDDDyu12aRJk0q9F2+99RaHHHII7du3p1mzZpx//vksXLgQgP33359TTz2VX/ziF7Rt25bhw4ezZMmSrN27JGnTYfIhSQXg/fffr3j+3nvv0bFjR66++mrefPNNnnvuOZYsWcK0adMASOnbNwTv0KFDpTaXLl3KJ598UnF88skns8MOO/D222+zZMkSrrjiikrt/vKXv2TGjBm89tprvPXWW/z2t7+tjduUJG3iTD4kqQCMHTuWDz74gEWLFnH55ZczZMgQPv/8c0pKSmjRogWLFi3ikksuqXZ7gwcP5v/+7/948skn+frrr7noootYvXp1Rfnnn39Os2bNaNq0KW+88QZ/+MMfKspeeOEFnnvuOVasWEGTJk3YfPPNKw3ZkiQVr6L/NHDCuaRCcOSRRzJgwAC6devGtttuy4UXXsiIESNYtmwZrVu3Zo899uCHP/xhtdvr2bMnY8eO5cgjj6RDhw5sueWWFatkAYwZM4Y777yTLbbYgmHDhjFkyJCKsiVLljBs2DC23HJLunTpQqtWrTj77LNr9X4lSZumqE73ezEoLS1N06dPz3cYkuqg119/nR133DHfYWxQ165dueWWWzjggAPyHcp3sqH3NyJmpJRKq9FETj/IXGq3drjUrlTQYkMFRd/zIUmSJCk3TD4kSZIk5YQ7nEvSJm7u3Ln5DkGSpGqx50OSJElSThR98uFqV5IkSVJuFH3ykVKalFIa3rx583yHIkmSJBW0ok8+JEmSJOWGyYckSZKknDD5kCRJkpQTJh+SJEmScsJ9PiTpO4jzPs5q++nKNlltX5KkfLDnQ5I2cV27dmXMmDH07t2b5s2bM2TIEJYvX864cePYe++9K9WNCN555x0AjjvuOE455RQOOuggmjZtyl577cX8+fMZMWIEW265JTvssAMvvfRSpev8+te/ZqeddmLLLbdk6NChLF++HIBevXoxadKkirorVqygdevWlV4vSVLRJx/u8yGpENx999384x//YM6cOcyaNYtx48ZV+3WjR49m4cKFNGrUiL59+9KnTx8WLlzI4MGDGTlyZKX6EyZM4MEHH2T27Nm89dZbjB49GoBjjjmGP/3pTxX1Jk+eTIcOHdh1111r7R4lSZu+ok8+3OdDUiH45S9/SceOHWnZsiUDBw5k5syZ1Xrd4Ycfzm677cbmm2/O4Ycfzuabb84xxxxDvXr1GDJkyDo9F6eeeiqdO3emZcuWXHDBBdx1110AHH300UyePJklS5YAMH78eH72s5/V7k1KkjZ5RZ98SFIhaN++fcXzxo0b88UXX1Trde3atat4XlJSss5x1XY6d+5c8bxLly58+OGHAHTs2JG99tqLv/zlL3z22Wc88MADHHXUUd/pXiRJhcsJ55JUoJo0acLSpUsrjufPn7/Rbb7//vsVz9977z06duxYcXzsscdyyy23sHLlSvr27UunTp02+nqSpMJiz4ckFajvfe97vPrqq8ycOZPly5dz8cUXb3SbY8eO5YMPPmDRokVcfvnlDBkypKLssMMO48UXX+T666/nmGOO2ehrSZIKj8mHJBWo7bbbjosuuogDDjiAHj16rLPy1Xdx5JFHMmDAALp168a2227LhRdeWFFWUlLCoEGDmDNnDkccccRGX0uSVHgipZTvGOqE0tLSNH369HyHIakOev3119lxxx3zHUbede3alVtuuYUDDjhgg3UuvfRS3nrrrUorX32bDb2/ETEjpVRajSZy+kGW7T1eioV72UgFLTZU4JwPSVKtWLRoEbfeeivjx4/PdyiSpDrKYVeSpI12880307lzZw466CD69euX73AkSXVUwfZ8RMS9wL7AwymlwXkOR5I2eXPnzt1g2bBhwxg2bFjugpEkbZIKuefjesDlViRJUs79+te/JiI49dRT11t+4oknEhGMGTOm0vmvvvqK0047jdatW9OkSRMOPfRQPvjgg4ryKVOm0KBBA5577rlKr7vlllto2rQps2fPrv2bkWpRwSYfKaXHgM/zHYekwuDiHNnh+6pC9Oyzz3LTTTfRu3fv9ZZPnDiR559/vtI+OWuMGDGCv/zlL9x111088cQTLFmyhEMOOYRVq1YBMGDAAE444QSOPfZYli1bBpT3So4cOZIxY8aw7bbbZu/GpFqQ8+QjIvpFxH0RMS8iUkQct546p0TEnIhYHhEzImKfXMcpSWs0aNCg4kNetWvZsmU0aNAg32FItWbx4sUcddRR3HbbbWy55ZbrlL/77rucfvrp3Hnnnev821+8eDG33norv/3tb+nfvz99+vRh/PjxzJo1i6lTp1bUGzNmDCtXruS8884jpcRxxx3HnnvuyUknnZT1+5M2Vj56PpoCrwCnA+t8mkfEEMqHTF0B7Ao8DTwQEVuvVWdmRLyynse6XyFI0kZq27Yt8+bNY+nSpX5TX0tSSixdupR58+bRtm3bfIcj1Zrhw4czePBg9ttvv3XKVq5cyU9/+lMuvPDC9S4vPWPGDFasWMGAAQMqznXu3Jkdd9yRp59+uuJckyZNGDduHGPHjuWoo47in//8J7feemt2bkiqZTmfcJ5SmgxMBoiIceupMhIYl1K6OXN8WkT8EDgZ+FWmjV1yEKokAdCsWTMAPvzwQ1asWJHnaApHgwYNaNeuXcX7K23qbr75Zt55550N7nMzatQoWrduzcknn7ze8vnz51OvXj1at25d6Xy7du2YP39+pXN77703Rx99NHfccQe33nornTp1qp2bkLKsTq12FRENgd2AMVWKpgB7ZuF6w4HhAFtvvfW31JZUzJo1a+YfyZI26M033+T888/nySefXO9Qwscee4xx48Yxc+bMWrleWVkZ999/P40bN2batGkcf/zxtdKulG11bcJ5a6AeUFblfBnQviYNRcRU4B7g4Ij4ICL6Vq2TUroppVSaUipt08adViVJ0nfzzDPPsHDhQnr27En9+vWpX78+jz/+ODfccAP169fnwQcf5KOPPqJDhw4V5e+++y7nnnsuW221FQDt27dn1apVLFy4sFLbZWVltG9f+c+g4cOH06NHD6ZOncqf/vQnJk2alLN7lTZGner5qE0ppQOqUy8iBgIDu3fvnuWIJElSoTrssMMoLS2tdG7o0KH06NGD888/nzZt2nDUUUdVKj/wwAP56U9/WrFHzm677UaDBg14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w64iog9wFeUrTj0FPA1MBJYBLYFewOXA7yPiKuC6lNJXWY1YkqTv4O677yaifL2TsrIyLrroIg4//HD69u0LwDPPPMPf/vY3LrnkknyGKUkF7dvmfNxLefLx/6WUPt1QpYjoC5wBnEV5MiJJUp0yePDgiueHHnoov/71rxk2bFjFueOPP57vf//7/O1vf+OUU07JR4iSVPC+bdhVj5TS2G9KPABSSs+klH4C/Lb2QssN53xIUvF55JFH2G+//dY5v99++/HYY4/lPiBJKhLfmHyklL7+pvKIaFCT+nWRcz4kqfi0bt2aiRMnrnN+4nsl2SMAACAASURBVMSJtGnTJg8RSVJxqPZSuxHxS2BeSukvmeNbgWMjYjZwaErpzSzFKElSrbr00ksZOnQojz76aMWcj2effZapU6dy66235jk6SSpcNVlq95fAxwAR0Q/4CXAkMBO4uvZDkyQpO4455hiefvppWrduzX333cd9991Hq1ateOqppzj22GPzHZ6kHBk7diy9e/emWbNmNGvWjL59+3L//fdXlKeUuPjii+nYsSMlJSXsu+++vPrqq5Xa6Nq1KxFR6XHeeedVlE+ZMoUGDRrw3HPPVXrdLbfcQtOmTZk9e3Z2b7KOqckmg52AOZnnA4F7Ukp3R8TLwBO1HpkkSVm0++67M2HChHyHISmPttpqK37zm9/Qo0cPVq9ezR133MFhhx3GjBkz6N27N1dddRVXX30148aNY/vtt+fSSy+lf//+vPnmm2yxxRYV7Vx00UWcfPLJFcdNmzateD5gwABOOOEEjj32WF566SVKSkqYO3cuI0eOZMyYMWy77bY5ved8q0nPxxKgbeZ5f+DhzPMVwOa1GVQuOeFckopTWVkZY8aM4ZRTTmHhwoUAPPXUU8yZM+dbXimpUPz4xz/moIMOonv37my33XZcfvnlbLHFFjzzzDOklLjuuus477zzGDRoEL169eKOO+7g888/584776zUzhZbbEH79u0rHmsnHwBjxoxh5cqVnHfeeaSUOO6449hzzz056aSTcnm7dUJNko8pwM0RcQvQHXggc74n/+4R2eQ44VySis+MGTPYfvvtmTBhArfccgtLliwB4KGHHuKCCy7Ic3SS8mHVqlX87//+L1988QV77rknc+bMYf78+QwYMKCiTklJCf369ePpp5+u9NoxY8bQqlUrdtll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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.imputers import ObjectImputer\n", + "\n", + "housing_df = pd.read_parquet(housing_file_location)\n", + "columns = [\"MasVnrType\", \"BsmtFinType2\", \"FireplaceQu\"]\n", + "housing_df = housing_df[columns]\n", + "objs = [ObjectImputer(strategy=\"most_frequent\")]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"ObjectImputer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "147d8ddd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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fIhIKLz77rsMGjSItWvXUqNGDXr16kXv3r0xs4xltnPy0ksv0bVrV7Zs2ULPnj1Zvnw5P//8M4mJibRq1Yq//OUvWZY6v/3223n33Xf55ZdfaNCgAQ8++CC33RbY7sndadeuHenp6cydOzfL35WUlBQuu+wy/vnPf3LTTTeF9sMIHSUfJ5Np2FWPb7/9NtLhiEgBtH79epKSkihRokSkQ4k6Bw8eZNu2beQ09FXJh4jIOeukycc5M+E8VLTalYicztGjRzPWZ5f8FR8fr6FsIiIxJOaTDxGR3NBQq9DQ5yoiEltiPvnQJoMiIrlTq1Yt5s6dG+kwRETkHBbzyYeGXYmIiIiIhEeB2udDRORcsaRVnZBe//L5G0J6fRERkUhQ8iEico6rVasWd911F1OnTmX79u3ceOONPP/886SlpXHbbbfx2WefcezYMVq0aMELL7zAb37zGwCuuuoqrrzySj766CNWrVpF8+bNee2110hISABg6tSpPProo/zyyy/0798/yz0///xz+vbty9dff018fDwdO3Zk7NixFC1aFHenf//+TJs2jUOHDlGzZk2mT59Ow4YNw/7ZiMi5zQbuinQIUcFHVYp0CBliftiV5nyISDSYNm0aH3zwARs2bGDdunUMHz6c9PR0unXrxvfff8/mzZuJj4+nV69eWc577bXXeOmll9i5cydHjhxh9OjRAHz11Vfcc889TJ06lW3btvHjjz/yww8/ZJxXuHBh/vrXv7J7924WL17Mhx9+yPjx4wGYPXs28+fPZ926dezdu5fXX3+dihUrhu/DEBGRAivmkw/N+RCRaNCrVy+qV69OhQoVeOSRR5g+fToVK1akY8eOlChRgtKlS/PII48wb968LOd169aN+vXrEx8fzx/+8AdSUlIAmDFjBtdddx2tWrWiWLFiPP744xQq9N8/GZdeeimXX345RYoUyeh5OX7tuLg49u/fzzfffIO7c8EFF1C1atXwfRgiIlJgxXzyISISDapXr57xvmbNmmzbto2DBw9y1113UbNmTcqUKUOrVq34+eef+fXXXzPaVqlSJeN9iRIl+OWXXwDYtm1blmuWLFkyS+/FunXruO6666hSpQplypRh0KBB7N69G4DWrVvTq1cv7rvvPipXrkzPnj3Zt29fyJ5dRETOHUo+RESiwJYtWzLeb968maSkJMaMGcPatWv57LPP2LdvH/PnzwfA/fQbgletWjXLNQ8ePMiPP/6YcXzPPffQoEEDvv32W/bt28fIkSOzXLdPnz4sX76cr776inXr1vH000/nx2OKiMg5TsmHiEgUeO655/jhhx/Ys2cPI0aMoHPnzuzfv5/4+HjKlSvHnj17GDZsWK6v16lTJ/7zn/+wcOFCjhw5wuDBg0lPT8+o379/P2XKlKFUqVJ88803PP/88xl1S5cu5bPPPuPo0aOULFmS4sWLZxmyJSIisSvm/xpowrmIRIMuXbrQrl07ateuTZ06dXj00Ufp168faWlpJCQkcPnll3PNNdfk+noXXXQRzz33HF26dKFq1aqUL18+Y5UsgNGjR/Paa69RunRpevToQefOnTPq9u3bR48ePShfvjw1a9akYsWKPPTQQ/n6vCIicm6y3HS/x4Lk5GRftmxZpMMQkQLo66+/5oILLoh0GCdVq1YtJk2aRJs2bSIdyhk52edrZsvdPTkXl9AfMpEopaV280cEltq1k1XEfM+HiIiIiIiEh5IPEREREREJC+1wLiJyjtu0aVOkQxAREckV9XyIiIiIiEhYxHzyodWuRERERETCI+aTD3ef6e49y5YtG+lQRERERESiWswnHyIiIiIiEh5KPkREREREJCyUfIiIiIiISFgo+RARERERkbDQPh8iImfABu4K6fV9VKWQXl9ERCQS1PMhInKOq1WrFqNHj6ZRo0aULVuWzp07c+jQIaZMmULLli2ztDUz1q9fD0DXrl259957ufbaaylVqhQtWrRgx44d9OvXj/Lly9OgQQNWrlyZ5T5PPPEEF154IeXLl6dbt24cOnQIgIYNGzJz5syMtkePHiUhISHL+SIiIjGffGifDxGJBq+//jrvv/8+GzduZNWqVUyZMiXX5w0fPpzdu3dTrFgxmjdvTtOmTdm9ezedOnWif//+WdpPmzaNDz74gA0bNrBu3TqGDx8OwO23386rr76a0W7WrFlUrVqVJk2a5NsziojIuS/mkw/t8yEi0aBPnz4kJSVRoUIFOnToQEpKSq7Ou+mmm7j00kspXrw4N910E8WLF+f222+ncOHCdO7c+YSei169elG9enUqVKjAI488wvTp0wG49dZbmTVrFvv27QNg6tSp3Hbbbfn7kCIics6L+eRDRCQaVKlSJeN9iRIl+OWXX3J1XmJiYsb7+Pj4E46z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N2/mP//5zwltWrZsya233sr06dMZM2YM1apVy/fnEskPBWbOh5kVJTAca3a2qtnkYfiUu//Z3au7ey0CQ7wmuvtjJ7lnTzNbZmbLdu3adYaRi4iIiPxXXFwcb731Fhs2bKBixYqUKFGCjz/+mGuvvTZjbsfUqVP54osvePrpp097vYceeoiVK1cye/ZsChcuzK233oq7Z2mTmprKu+++S4kSJZg/f35InkskPxSkpXYTgMJAarbyVKBNKG7o7hOACQDJycl+muYiIhIlxo4de8p67fMhZ+vSSy8lJSWFvXv3cuTIESpVqkSzZs1ITk4G4MMPP+Srr76iVKlSWc7r3LkzzZs3Z+HChRllCQkJJCQkUL9+fS644AKqV6/OwoULufLKKzPa9OzZk3r16jFmzBiuvPJKOnbsSIcOHcLzsCJ5UJCSj3yXfTJ7TsysA9Chbt26oQ9IREQKhGeffTbL8dGjR9m+fTvx8fFUrlxZyYfkm7JlywKBSejLli3j8ccfB2DEiBE8+GDWbcguvvhiRo8ezQ033HDS66WnB0atH59XAjBlyhTmzp1LSkoK9erVY8CAAdx11120aNGCChUq5PcjiZyVgpR87AZ+BRKzlScCO0J1U3efCcxMTk7uEap7iIhIwbJx48YTylJTU+nWrRs9eujPgZzeL7/8wvr164FAQrB582ZSUlKoUKECNWrU4I033iAhIYGaNWuyevVq+vbty4033ki7du0AqFatWo7zMqpXr07t2rUBWLx4MStWrKBly5aUK1eODRs28Je//IVatWrRsmVLALZs2ULfvn0ZNWoU9erVA2DIkCHMnDmT3r17M23atHB8HCK5VmDmfLj7EWA50DZbVVvg01Dd18w6mNmEvXv3huoWIiJyDkhMTGTEiBE8/PDDkQ5FzgHLli2jSZMmNGnShLS0NIYMGUKTJk0YPDiwxs327du5/fbbadCgAX369OG2225j+vTpebpHfHw8M2bMoHXr1px//vn86U9/olGjRixYsIDixYvj7tx5550kJyfTq1evjPOKFi3KK6+8whtvvMG//vWvfH1ukbMV7n0+SgHHxzcVAmqYWWNgT3Ap3bHAVDP7HFgE3E1gP5AXQhWTej5EROS49PR0UlOzTz0UOdFVV111wqTvzPr06UOfPn3ydM3s12vcuDEff/zxSdubGXPmzMmxrnHjxhw5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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# ENCODERS\n", + "from gators.encoders import OrdinalEncoder\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\"]\n", + "sf_crime_df = sf_crime_df[columns]\n", + "objs = [OrdinalEncoder()]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OrdinalEncoder\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d449325c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/gators-0.2.0-py3.8-macosx-10.9-x86_64.egg/gators/encoders/onehot_encoder.py:140: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " X[onehot_col] = X[col] == cat\n" + ] + }, + { + "data": { + "image/png": "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G5k5DjNTShus4rQZ1/0wIq4FLomIT8n8zt2ZzNyQJ/j3ilZLyPQQHB8Rc4FPgfkppfW9Bk0jYt9qbrHyS/zxPgYYAjwVEWPJTAbvBhyaUjoppfR5RFwG/G9E/JbMfJVuZFbt+gdwW/bZXo+IO4CfZVftep7M0NshVT6DFBHfJ7O6WFMyc0SWkekh+SawMKV0XQ2fQVLDsP6L7t9kj4pakPm9fRVQCrQBrgX+GhG7p5TWAWQThgeBXwA/JPOFzq5AxXl8fybTA3swmd+f3yPzO6d3SumNlNJDETEJ+HVE9Ekprcr++3EdmYU73qj1J68nIqX62ZscESuAs9cPu8r+A7ES+HZK6Z4K7cYDu6aU/iM7bOA14EAy/0jPIbNyzAdUI7t04+kALVu23GunnXaquweSVPA+/vhjli5dyqeffkpZWRlNmzZl6623pnPnzmy11b+/65kzZw6dO3emW7d/f1fy2Wef8fLLL9O9e3fat29f6ZrvvfceK1euJKVE06ZNadWqFZ06daKkJNMp8frrr5NSorrfYcuWLWPBggXsuuuuNGvWDMiscrh06VLef/991qxZQ+PGjdlmm23o1q0bjRs3Ln/vRx99xKJFi1i9OjOSbH1sb731Fh98UO2vVZo3b84uu2S2K3nrrbdYvnw5u+++e6U2r7+e6bT5+te/Xun5Fy1axPLlyykrK6NJkyasWbNmVUqpxfo2EXESmWG3O5FZHWs68KOKE9VXrlzJBRdcwF133cWaNWsYOHAgF198Mfvvvz+33347p556avk9n376aa666iqefPJJVq1aRefOndl3330599xz2W+//QA48MADWbduHU888US1zyup4WrVqhW/+tWvKv1eqOrVV19ll112Ye7cuey2224AfPOb3+Sggw7iqquuqvY9y5Yto0OHDjz66KMcdFBmVfF169bRrFkz7rrrLoYNGwbAp59+yh577MFhhx3G9ddfz0EHHUTz5s3561//WrsPmh9Vl10vV696PjahPf9ebrGiJcAgKB97fQHwGJkhZT/fWOKRbX8LcAtAv3790uzZmzN3UpKUCxHxasXzlNL6Xo+NatGiBTfddBM33XRTpfLqvmjbb7/9+POf//yFMcycOXMzo5VUiJYvXw7ANttsA8DSpUt5+umnOeGEE9h///2ZN28eX//61/npT3/KwQcfDEC7du3YeeedmTJlCnvvvTclJSXccsstfOUrX6F///7l127ZsiWTJ0/mwAMP5P333+f//u//ePnll3P/kDnWkJKPzZJSup9/b+i1SRExFBjaq1evugtKkiRJDcqaNWu44IILGDp0KF/96lcBePPNzFoWY8aM4Re/+AV9+vThnnvu4Vvf+hZz5sxhjz32ICKYMWMGRx99NK1bt6ZRo0a0bduWBx54gC5dKk9t23///TnppJP49a9/za233lqpR7xQ1bcJ519kGZnNo6quWtKJzFKLX0pKaVpK6fQ2bdpsSWySJEkqEOvWreOkk07io48+4vbbby8vLysrA+CMM87gu9/9Ln369GHs2LHsvffe3HzzzUCmp/Wss86iXbt2PP744zz33HMMGzaMY489lkWLFlW6z5IlS/jLX/5CixYtmDVrVu4eMI8aTPKRUlpDZg7HIVWqDiGzKowkSZK0RdatW8e3v/1t5s6dyyOPPEK7dv/er3p9z0Xv3r0rvad3794sXJjZIujRRx9l2rRp3HnnnfTv35++ffsyYcIEWrZsWSmRATj99NPZcccdefjhh/ntb3/LtGnT6vjp8q9eDbuKiFbA+vFPjYDtshtkfZhSWkhmBYApEfEc8CSZlQO6AjdvwT0ddiVJkiTWrl3L8ccfz8svv8zMmTPp3Lny9kI9evSga9eu5QtnrDdv3rzyCekrV64EoFGjyt/xN2rUqLznBGDy5Mk8/PDDlJaWsuOOO3LxxRdzxhln0L9/f9q23dz9XhueepV8AP3ITBZf7/Ls8Wvg1JTSXRHRDhhNZpPBl4EhKaUFX/aGKaVpwLR+/fqNrK6+rKyMd955h08//fTL3kLVaNmyJV/96lc3+D+mJElSXVmxYgX//Oc/gczfeAsXLqS0tJS2bdvStWtX/uu//ovnn3+eadOmERG8915mZH+bNm0oKSkhIrjooosYM2YMu+++O3369OHuu+/mmWee4Ve/+hWQWcyibdu2jBgxgssuu4ySkhImTpzIm2++yeGHHw7A22+/zbnnnss111zDjjvuCGTmkUybNo1zzjmHqVOn5uHTyY16u9Rurm1staulS5fy2Wef0a1bN/9QriVlZWUsWrSIZs2a0bFjx3yHI6meiog5KaV+m9HUf8gkbZaZM2eWL39b0SmnnMJPf/pTevbsWe37qi7V/d///d+MHz+eDz74gF122YWxY8cyaNCg8vrZs2czatQoZs+ezdq1a9l555257LLLOOyww0gpMXjwYMrKynj44YeJ+PeqtKWlpXzjG9/grrvu4uijj669B8+9jS61W/TJR4VhVyP/8Y9/bFA/b948evToQdOmTXMfXAFbs2YNCxYsKM/2Jakqkw9JarA2mnwU/Vf5m1rt6vPPP6dJkyY5jqrwNWnShHXr1uU7DEmSJOVQ0Scfm6Nid5hqh5+pJElS8Sn65CMihkbELR9//HG+Q6m3evTowcMPP5zvMCRJktTAFX3y4SaDkiRJUm7Ut6V2G4RnBuxQp9ffd9YbdXp9SZIkKR9MPhqwHj16cMYZZzBlyhQWL17MUUcdxU033cSqVav4zne+w7PPPsu6devo378/N998M1/96lcBOPDAAznggAN49NFHmTt3Lvvttx933HEH7du3B2DKlCmMHj2aFStWcP7551e653PPPce5557La6+9RklJCcceeyzXXXcdTZs2JaXE+eefz9SpU1m9ejXdu3fnzjvvZNddd835ZyNJkhq++PH7+Q6hIKRrOuQ7hHJFP+yqoc/5mDp1Kg8++CBvvPEG8+bN48orr6SsrIwRI0awYMECFi5cSElJCWeffXal991xxx3cfvvtLF26lDVr1jBu3DgAXn31Vc4880ymTJnCu+++ywcffMA777xT/r7GjRvzP//zPyxbtoynn36aRx55hAkTJgDw0EMPMWvWLObNm8fHH3/M3XffTbt27XL3YUiSJKleK/rko6HP+Tj77LPZdtttadu2LaNGjeLOO++kXbt2HHvssbRo0YKvfOUrjBo1ir/97W+V3jdixAi+9rWvUVJSwnHHHUdpaSkA9957L4cffjgDBgygWbNmXHHFFZU2V9xrr73Yd9992Wqrrcp7XtZfu0mTJnzyySf8/e9/J6XEzjvvTJcuXXL3YUiSJKleK/rko6Hbdttty193796dd999l5UrV3LGGWfQvXt3WrduzYABA/joo4/4/PPPy9t27ty5/HWLFi1YsWIFAO+++26la7Zs2bJS78W8efM4/PDD6dy5M61bt+YnP/kJy5YtA2DgwIGcffbZfP/736djx46cfvrpLF++vM6eXZIkSQ2LyUcD9/bbb5e/XrhwIV27duXaa6/l9ddf59lnn2X58uXMmjULgM3Zzb5Lly6Vrrly5Uo++OCD8vMzzzyTnXbaiX/84x8sX76csWPHVrruD37wA+bMmcOrr77KvHnz+MUvflEbjylJkqQCYPLRwI0fP5533nmHDz/8kKuuuorhw4fzySefUFJSwtZbb82HH37I5ZdfvtnXGzZsGH/+85954oknWLNmDZdddhllZWXl9Z988gmtW7emVatW/P3vf+emm24qr3v++ed59tlnWbt2LS1btqR58+aVhmxJkiSpuBX9X4YNfcL5CSecwODBg9l+++3ZYYcdGD16NOeddx6rVq2iffv27Lvvvhx66KGbfb1ddtmF8ePHc8IJJ9ClSxe22Wab8lWyAMaNG8cdd9zBV77yFUaOHMnw4cPL65YvX87IkSPZZptt6N69O+3ateOiiy6q1eeVJElSwxWbMxSnGPTr1y/Nnj17g/LXXnuNnXfeOQ8RbVqPHj2YNGkSgwYNyncoX0p9/mwl5V9EzEkp9duMpv5DJhUol9qtHXlYajc2VlH0PR+SJEmScsPkQ5IkSVJOuMN5A/bWW2/lOwRJkiRps9nzIUmSJCknij75aOirXUmSJEkNRdEnHymlaSml09u0aZPvUCRJkqSCVvTJhyRJkqTcMPmQJEmSlBMmH5IkSZJywuRDkiRJUk64z8eXED9+v06vn67pUKfXlyRJkvLBno8GrEePHowbN47dd9+dNm3aMHz4cFavXs3kyZPZf//9K7WNCP75z38CcOqpp3LWWWfxn//5n7Rq1Yr+/fvz3nvvcd5557HNNtuw00478eKLL1a6z9VXX03v3r3ZZpttGDFiBKtXrwZg1113Zdq0aeVt165dS/v27Su9X5IkSQKTjwa/z8fdd9/NX//6V+bPn8/cuXOZPHnyZr/vyiuvZNmyZTRr1oz99tuPvn37smzZMoYNG8b5559fqf3UqVN58MEHeeONN5g3bx5XXnklACeffDK//e1vy9tNnz6dLl260KdPn1p7RkmSJBWGok8+Gvo+Hz/4wQ/o2rUrbdu2ZejQoZSWlm7W+44++mj22msvmjdvztFHH03z5s05+eSTady4McOHD9+g5+Lss89m2223pW3btowaNYo777wTgJNOOonp06ezfPlyAKZMmcJ3vvOd2n1ISZIkFYSiTz4aus6dO5e/btGiBStWrNis93Xq1Kn8dUlJyQbnVa+z7bbblr/u3r077777LgBdu3alf//+/P73v+ejjz7igQce4MQTT/xS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Rx55JB06dCgvKyvLfL935JFHcv755wOw5557Mnv2bH71q19x2GGHVWp7++2306JFC55//nlWr15N8+bNc/sQkopGfZpw3h5oDCypUr4E6Lxh843qBDwREf8HPAP8JqX0fHUNU0q3pJT6pZT6VfylLUlSQ1BaWsrs2bMrDbkCaN++PVtttRW9e/euVL7zzjuzcOHCSmXXX389L730Es8//zwrVqxg1KhRdR63pOJVb3o+aktK6U1gj81tHxFDgaG9evWqu6AkSaoDt9xyCz179mTQoEGVyps2bcree+/N66+/Xql83rx5dO/evfz8tddeY9SoUUyaNInevXtz6623MmTIEI455hj69++fk2eQVFzqU/KxDPicTM9FRZ2A9+rqpimlacC0fv36jdxk4yITP34/3yFsUrrGHitJhWfFihX885//BDLDohYuXEhpaSlt27YtHya8cuVKpk6dyo9+9CMiYoNr/OhHP+K4447jgAMOYODAgTz22GP87ne/449//CMA69at45RTTuGwww7jxBNPBGDw4MGcdtppjBgxgtLSUlq0aJGjJ5ZULOrNsKuU0hpgDnBIlapDyKx6JUlSUZg9ezZ9+vShT58+rFq1ijFjxtCnTx8uu+yy8jZ33XUXn376KSNGjKj2GkcddRS33HIL48aNY7fdduPGG2/kN7/5Tfl8j6uvvpoFCxZw0003VXrfuHHjWLduHZdcckndPaCkopXrfT5aAevHNzUCtouIPYEPU0oLgeuAKRHxHPAk8D0y+4HcXIcxOexKklSvHHjggaSUvrDNiBEjNpp4rHfqqadWu08IwKWXXsqll166QXmrVq148803NztWSaqJXPd89ANezB4lwOXZ1z8DSCndBZwHjAZKgf2BISmlBXUVUEppWkrp9DZt2tTVLSRJkiSR456PlNJMYMOBqZXbTAAm5CQgSZIkSTlTb+Z85EtEDI2IWz7++ON8hyJJkiQVtKJPPhx2JUmSJOVGfVpqV5Kkeq8hLEPeELhUulScir7nw2FXkiRJUm4UffLhsCtJkiQpN4o++ZAkSZKUGyYfkiRJknKi6JMP53xIkiRJuVH0yYdzPiRJkqTcKPrkQ5IkSVJumHxIkiRJygmTD0mSJEk5UfTJhxPOJUmSpNwo+uTDCeeSJElSbhR98iFJkiQpN0w+JEmSJOWEyYckSZKknDD5kCRJ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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.encoders import OneHotEncoder\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\"]\n", + "sf_crime_df = sf_crime_df[columns]\n", + "objs = [OneHotEncoder()]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OneHotEncoder\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "c80d8f88", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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drKKsB/5EBERERGR4FDyISIiIiIiQaETzsuwLVu2eB2CiIiIiEiRaeRDRERERESCIuyTj7K+25WIiIiISFkR9smHc26hc25g1apVvQ5FRERERCSkhX3yISIiIiIiwaHkQ0REREREgkLJh4iIiIiIBIWSDxERERERCQqd83EGbPiegPbvxscGtH8RERERES9o5KMMq1+/PhMmTKBFixZUrVqVPn36cOTIEWbOnEmHDh3ytDUz/vvf/wLQv39/7r33Xq699lqqVKlC+/bt2bVrF4MHD6Z69epcdNFFrFu3Ls99/vCHP3DJJZdQvXp1BgwYwJEjRwBo1qwZCxcuzGl77NgxYmJi8nxeRERERASUfJT5cz5ef/113nnnHTZv3sz69euZOXNmkT83ZswYMjMziYyMpF27drRu3ZrMzEx69+7NkCFD8rSfPXs27777Lps2bWLjxo2MGTMGgL59+/LXv/41p92iRYuIj4+nVatWJfaMIiIiIhIawj75KOvnfDz44IMkJCQQHR1N9+7dSUtLK9LnbrzxRtq0acM555zDjTfeyDnnnEPfvn2JiIigT58+BUYu7r//furUqUN0dDQjRoxg7ty5APz2t79l0aJF7N+/H4BZs2Zx2223lexDioiIiEhICPvko6yrVatWzvtKlSpx8ODBIn2uZs2aOe+joqIKXOfvp06dOjnv69Wrx44dOwBISEigffv2zJs3jx9//JG3336bW2+99YyeRURERERCmxach6DKlStz6NChnOtdu3addZ/fffddzvutW7eSkJCQc92vXz+mT5/O8ePHadeuHbVr1z7r+4mIiIhI6NHIRwi69NJL2bBhA2lpaRw5coQnnnjirPucPHky27ZtY+/evYwdO5Y+ffrk1N1www2sXbuWSZMm0bdv37O+l4iIiIiEJiUfIahx48Y8/vjjJCUlceGFFxbY+epM3HLLLXTt2pWGDRtywQUXMHLkyJy6qKgoevXqxebNm+nZs+dZ30tEREREQpM557yOoVRITEx0a9asKVD+xRdfcPHFF3sQUelRv359pk+fTlJS0knbPPnkk2zcuDHPzleno9+tBMvqThd4HcJptV2+yesQSh0zS3XOJRahqf4iEwlRgT5bLVx4cIacnaxCaz7krO3du5eXX36ZWbNmeR2KiIiIiJRimnYlZ2XatGnUqVOHa6+9lk6dOnkdjoiIiIiUYiE78mFm/wCuAN53zvX2OJwybcuWLSetS05OJjk5OXjBiIiIiEiZFcojH5MAbb0kIiIiIlJKhGzy4ZxbBhwoob5KohvJRb9TERERkfAT9OTDzDqZ2QIz225mzsz6F9LmXjPbbGZHzCzVzDoGO85sERERHDt2zKvbh6xjx45RvnzIzvoTERERkUJ4MfJRBfgMGAQczl9pZn3wTZkaB7QCPgLeNrO6udqkmdlnhbwS8vd3tqpVq0ZGRgZZWVkl3XXYysrKIiMjg6pVq3odioiIiIgEUdC/enbOLQIWAZjZzEKaDAFmOuem+a8fMLNrgHuAR/19tAxCqADExMSwbds2vvrqq2DdMixUrlyZmJgYr8MQERERkSAqVfNezKwi0AaYkK9qMXB5AO43EBgIULdu3ULblCtX7qR1IiIiIiJSdKVtwXkMEAFk5CvPAGoVpyMzWwK8AXQzs21m1i5/G+fcVOdconMuMTY26Cc/ioiIiIiElVI18lGSnHNJRWlnZt2B7o0aNQpwRCIiIiIi4a20jXxkAieAmvnKawK7AnFD59xC59xALX4WEREREQmsUpV8OOeOAqlAl3xVXfDteiUiIiIiImVU0KddmVkVIHuOUzmgrpm1BPY657YCzwKzzOwTYCVwN5AAvBSgeDTtSkREREQkCLwY+UgE1vlfUcBo//snAZxzfwcGAyOBNKAD0M05920ggtG0KxERERGR4PDinI9lgJ2mzRRgSjDi0ciHiIiIiEhwlKo1H17QyIeIiIicjT/84Q+YGffff39OWf/+/TGzPK+2bdvm1G/ZsqVAffbrmWeeyWl3xRVXFKi/+eabc+o/++wzzjnnHObNm5cnpiVLllChQgVWrlwZwCcXKb6Q3WpXREREJNBWr17N1KlTadGiRYG6pKQkZs2alXNdsWLFnPd16tRh586dedr/4x//4L777qN37955ygcMGMC4ceNyrqOionLeN2vWjNGjR3P33XfToUMHatasyb59+xgwYAAPPfQQ7du3P+tnFClJYT/yISIiInIm9u3bx6233sorr7xC9erVC9RHRkZSq1atnFd0dHROXURERJ66WrVqMX/+fJKSkmjQoEGefipVqpSnXf7ZGsOGDaNx48YMHDgQgAceeIDq1avz5JNPBuCpRc5O2CcfZtbdzKbu27fP61BERESkDBk4cCC9e/fmyiuvLLQ+JSWFuLg4GjduTHJyMrt37z5pX9988w3vv/9+TgKR29/+9jdiYmJo2rQpQ4cO5cCBA3nqy5Urx6uvvsqSJUu49dZb+dvf/sZrr72WZ6RFpLQI+2lXzrmFwMLExMRkr2MRERGRsmHatGn897//5a9//Wuh9ddccw09e/akQYMGbNmyhZEjR9K5c2dSU1OJjIws0H769OnExsbSo0ePPOW33HIL9erVIyEhgQ0bNvDoo4+yfv16Fi9enKddo0aNGDZsGKNHj+b3v/89LVu2LLmHFSlBYZ98iIiIiBTHV199xWOPPUZKSgoVKlQotE3uReHNmzenTZs21KtXj7feeouePXvmaXv8+HFmzJhBv379CvSXeySkefPmNGzYkMsuu4y1a9fSunXrnLrDhw8zd+5cKlWqREpKCs45zE65uaiIJzTtStOuREREpBhWrVpFZmYmTZs2pXz58pQvX54PP/yQKVOmUL58eX7++ecCn0lISOD888/n66+/LlC3cOFCdu3axZ133nnaeycmJhIREVGgn0ceeYTjx4/zySefsGbNGl588cUzf0CRAAr75ENb7YqIiEhx3HDDDaSnp5OWlpbzSkxM5OabbyYtLa3QtRaZmZls376d+Pj4AnXTpk3jl7/8JY0bNz7tvdPT0zlx4kSefpYuXcqUKVOYOXMmTZs2ZeLEiQwfPpxNmzad3YOKBICmXYmIiIgUQ7Vq1ahWrVqessqVKxMdHU2zZs04ePAgTzzxBL169SI+Pp4tW7bw6KOPEhcXx4033pjnc1u3buXdd9/ltddeK3CfTZs2MXv2bLp160ZMTAyff/45Dz30EK1atcrZQvfAgQMMGDCAQYMG0bFjRwCSk5OZN28eAwYMYNmyZZQrF/bfNUspov8bRUREREpQREQE6enp9OjRg8aNG9OvXz+aNGnCqlWrOPfcc/O0ffnll6latSq9evUq0E/FihV5//33ufrqq2nSpAkPPvggXbt2ZcmSJURERAAwePBgKlWqxNixYwv0m56ezqRJkwL3oCJnwJxzXsdQKiQmJro1a9Z4HYaIBMDqThd4HcJptV2u6RH5mVmqcy6xCE31F5lIiLLhe7wOISS48bHBvuVJdzsI+5EPLTgXEREREQmOsE8+tOBcRERERCQ4tOBcpIjKwtQd0PQdERERKb3CfuRDRERERESCQyMfIiIiEvK0cLlkeLBwWUKMRj5ERERERCQowj750G5XIiIiIiLBEfbJh3a7EhEREREJjrBPPkREREREJDiUfIiIiIiISFAo+RARERERkaBQ8iEiIiIiIkGh5ENERERERIJCyYeIiIiIiASFkg8REREREQmKsE8+dMigiIiIiEhwhH3yoUMGRURERESCo7zXAYiIiHjl8OHDbNq0CYALLriAqKgojyMSEQltYT/yISIi4efnn39m8ODBREdHc+mll9KiRQuio6MZNGgQR44c8To8EZGQpZEPEREJO/fccw+LFy9m+vTptGvXDoBVq1bx6KOPcuDAAV555RWPIxQRCU1KPkREJOy88cYbzJ8/ny5duuSUNWzYkLi4OHr16qXkQ0QkQDTtSkREwk7lypWpXbt2gfLatWtr3YeISAAp+RARkbDzwAMPMHr0aA4fPpxTdvjwYZ566ikeeOABDyMTEQltmnYlIiJhZ/Xq1Xz44YfUrl2bFi1aAJCens7x48f56aefuP7663PaLliwwKswRURCTkgmH2ZWB5gFxAHHgaecc294G5WIiJQWMTEx9OrVK09ZgwYNPIpGRCR8hGTygS/hGOycSzOzWkCqmS1yzv3kdWAiIuK9GTNmeB2CiEhYCsnkwzm3E9jpf7/LzDKBaEDJh4iIiIiIR4KefJhZJ2Ao0AZIAAY452bma3MvMAyIBzbgG8VYcYb3awNEOOe+O5u4RUQkdDRv3hwzO2n9+vXrgxiNiEj48GLkowrwGfCa/5WHmfUBJgH3Ain+n2+b2SXOua3+NmkUHntX59yOXH1F+++RXNIPISIiZVfv3r3zXB87doy0tDRWrlzJfffd51FUIiKhL+jJh3NuEbAIwMxmFtJkCDDTOTfNf/2AmV0D3AM86u+j5enuY2aRwD+B8c65j07SZiAwEKBu3brFexARESmzRo0aVWj5M888w7fffhvkaEREwkepOufDzCrim461OF/VYuDyYvRjwEzgA+fcrJO1c85Ndc4lOucSY2NjzyBiEREJJT179mT27NlehyEiErJKVfIBxAARQEa+8gygVjH6aQ/0AW4wszT/q3kJxSgiIiFq+fLlVKpUyeswRERCVqjudpVCERMrM+sOdG/UqFFggxIRkVIj9yGCAM45du7cybp16046JUtERM5eaUs+MoETQM185TWBXYG4oXNuIbAwMTFRi9JF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88c//pHp06cr8RCREhH2Ix+adiUiEn769evHtGnTeOaZZ7wOhW7dutGtWzeAPCMeuUVGRlKrVq1C6/bt28fLL7/MjBkz6NLFt1v9rFmzqFevHkuWLOHqq6/m9ttvz/OZhg0bsnbtWubNm8djjz2WUz59+nSaNWvG888/z913302/fv24/fbbufbaa0vgSUVElHyIiEgY+umnn5g9ezbvvfcebdq0oXLlynnq//SnP3kUWeFSUlKIi4ujWrVq/PKXv2Ts2LHExcUBvlGNY8eO0bVr15z2derU4eKLL+ajjz7i6quvLrTP/fv3U7169TxlCQkJvPjii9xxxx2kpKRw9OhRLcAXkRKl5ENERMLOF198QevWrQH45ptv8tSVlulY2a655hp69uxJgwYN2LJlCyNHjqRz586kpqYSGRnJrl27iIiIICYmJs/natasya5duwrtc+3atcycOZPZs2cXqLvllluYOnUq8+fP5/3336dKlSoBeS4RCU9hn3xoq10RkfCzdOnS0zcqJW6++eac982bN6dNmzbUq1ePt956i549exa7v6+++opf/epXDB48mF69ehWo37BhA6tXr6ZSpUosX76czp07n1X8IiK5hf2Cc51wLiIiZUlCQgLnn38+X3/9NQC1atXixIkTZGZm5mmXkZFRYJ3Il19+yRVXXMHNN9+cZ7F5tuPHj9O3b1969OjBrFmzGDduHOvWrQvcw4hI2An75ENERKQsyczMZPv27cTHxwPQpk0bKlSowHvvvZfTZtu2bXzxxRdcfvnlOWWff/45V1xxBb/+9a957rnnCu17zJgx7NixgylTptCzZ09+/etf069fP44ePRrYhxKRsKHkQ0RExEMHDx4kLS2NtLQ0srKy2Lp1K2lpaWzdupWDBw8ydOhQVq1axZYtW1i2bBndu3cnLi6OG2+8EYCqVatyxx138PDDD7NkyRLWrVvHbbfdRosWLUhKSgJ8U6muvPJKrrjiCh577DF27dqV88qWmprK2LFjmTp1KjVq1ADghRdeIDMzk9GjRwf/FyMiIUnJh4iIiIfWrFlDq1ataNWqFYcPH2bUqFG0atWKxx9/nIiICNLT0+nRoweNGzemX79+NGnShFWrVnHuuefm9PH8889z44030qdPH9q3b0+VKlVYuHAhERERALzxxhvs3r2bv//978THx+d5ge+Qwr59+/Lb3/6W7t275/QbHR3NtGnTePrpp/n000+D+4sRkZBk2QcJhatcC86Ts+fPBtrqThcE5T5nq+3yTV6HUKrov1vZVRb+27W7fPXpG3ks2Cecm1mqcy6xCE3D+y8yKRIbvsfrEEJC0P8c0H+3EhHs/27ASbcNDPuRDy04FxEREREJjrBPPkREREREJDiUfIiIiIiISFAo+RARERERkaBQ8iEiIiIiIkFR3usAvJZrtyuvQxERkTJAu++UDA923xGRUiDsRz6025WIiIiISHCEffIhIiIiIiLBoeRDRERERESCQsmHiIiIiIgEhZIPEREREREJCiUfIiIiIiISFEo+REREREQkKJR8iIiIiIhIUIR98mFm3c1s6r59+7wORUREREQkpIV98qFDBkVEREREgiPskw8REREREQkOJR8iIiIiIhIUSj5ERERERCQolHyIiIiIiEhQKPkQEREREZGgUPIhIiIiIiJBUd7rAALBzLYA+4Es4Afn3JXeRiQiIiIiIiGZfPhd7pw76HUQIiIiIiLio2lXIiIiIiISFEFNPsysk5ktMLPtZubMrH8hbe41s81mdsTMUs2s4xncygEfmtmnZnbrWQcuIiIiIiJnLdjTrqoAnwGv+V95mFkfYBJwL5Di//m2mV3inNvqb5NG4XF3dc7t8L/v4JzbbmbxwBIzS3fOrS/5xxERERERkaIKavLhnFsELAIws5mFNBkCzHTOTfNfP2Bm1wD3AI/6+2hZhPts9//caWaLgNaAkg8REREREQ+VmjUfZlYRaAMszle1GLi8GP1UNrNz/e+rAJ2BDSdpO9DM1pjZmj179pxZ4CIiIiIiUiSlJvkAYoAIICNfeQZQqxj91ARSzOw/wGrgNefcp4U1dM5Ndc4lOucSY2NjzyRmEREREREpopDbatc59w1waVHbm1l3oHujRo0CF5SIiIiIiJSqkY9M4AS+kYvcagK7AnVT59xC59zAqlWrBuoWIiIiIiJCKUo+nHNHgVSgS76qLsBHwY9IRERERERKUlCnXfkXgGfPbyoH1DWzlsBe/1a6zwKzzOwTYCVwN5AAvBTAmDTtSkKKDS/9mye48VpjJSIiEo6CPfKRCKzzv6KA0f73TwI45/4ODAZGAmlAB6Cbc+7bQAWkaVciIiIiIsER7HM+lgF2mjZTgClBCUhERERERIKm1Kz58IqZdTezqfv27fM6FBERERGRkBb2yYemXYmIiIiIBEfYJx8iIiIiIhIcYZ98aNqViIiIiEhwhH3yoWlXIiIiIiLBEfbJh4iIiIiIBIeSDxERERERCYqwTz605kNEREREJDjCPvnQmg8RERERkeAI++RDRERERESCQ8mHiIiIiIgEhZIPEREREREJirBPPrTgXEREREQkOMI++dCCcxERERGR4Aj75ENERERERIJDyYeIiIiIiASFkg8REREREQkKJR8iIiIiIhIUYZ98aLcrEREREZHgKO91AF5zzi0EFiYmJiZ7HUtpY8P3eB3CabnxsV6HICIiIiJFFPYjHyIiIiIiEhxKPkREREREJCiUfIiIiIiISFAo+RARERERkaBQ8iEiIiIiIkGh5ENERERERIIi7JMPnfMhIiIiIhIcYZ98OOcWOucGVq1a1etQRERERERCWtgnHyIiIiIiEhxKPkREREREJCiUfIiIiIiISFAo+RARERERkaBQ8iEiIiIiIkGh5ENERERERIJCyYeIiIiIiARFSCYfZtbAzJaa2edmlm5mlb2OSUREREQk3JX3OoAAmQmMdM6tMLNo4GeP4xERERERCXshl3yYWVPgmHNuBYBzbq/HIYmIiIiICEGedmVmncxsgZltNzNnZv0LaXOvmW02syNmlmpmHYt5mwuBg2a20Oz/27v7GDuqMo7j3x8WFagvxEKriaARBcWXQnwBRagvYOEPDWhijMbUqEWqBBFiotGoMaiJGjUqSdGYIgZNDEZKAwgYEakEERVEBCERUGoLWKkCVQQf/5ip3l7ubne7d+fu3f1+ksnemTn3zDM922dy5sycza+SfHQowUuSJEmaka5HPhYDNwHfbpedJHkr8BVgDXB1+/OSJC+oqrvaMr9hcNzHVdWmdt+rgeXAPcClSa6rqstn4XwkSZIkTVGnnY+quhi4GCDJugFFPgSsq6pvtOunJlkJnAJ8pK1j+S4Oczfwy6r6U3uci2k6InY+JEmSpBFKVY3mwMkDwAeqal27/njgIeBtVfX9nnJfB15YVcdMsd5FwHXAa4FtwIXA2qraMKDsamB1u3owcOtun9D8tAS4b9RBaNpst/Fkuz3WgVW136iDGEdJVlfVOaOOQ9Nju40n22165tIL50uAxwFb+rZvAV4/1Uqq6pH2PY+rgACXDep4tGXPAfxlmUCSX1bVS0cd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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.encoders import WOEEncoder\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "imputer = ObjectImputer(strategy=\"most_frequent\")\n", + "titanic_df = imputer.fit_transform(titanic_df)\n", + "columns = [\"Cabin\", \"Embarked\"]\n", + "sf_crime_df = titanic_df[columns]\n", + "objs = [WOEEncoder()]\n", + "bench_scalers = benchmark.run_X(\n", + " objs, sf_crime_df, columns, n_vec=n_vec, y=titanic_df[\"Survived\"]\n", + ")\n", + "plot_all(bench_scalers, name=\"WOEEncoder\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "7e4b0d45", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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tGG6devGww8/XOgwJCmn5s+fz9FHH027du3YfPPN6dmzJ48//njl8YiodTvxxBOBTHfSHXfckZNPPrnaeSsqKmjXrh2XXXZZXu+noSn55MNuV5IkSQL46KOP2GuvvUgp8cADDzBz5kyuv/562rdvX1ln/vz51bbx48cDVK5c37x5c2677TZuvPFGHnnkkcrnHXvssey444786le/yu9NNTANarYrSWosnu27fU7P/40n3szp+SVJa7v88svp1KkTt99+e2VZ9+7dq9WpORXyfffdx4477sg3v/nNyrI99tiDM844g4EDB/Liiy/yl7/8hcmTJ/Ovf/2LTTYp7e/+TT4kqZHr1q0bxx13HGPGjGH+/Pn84Ac/4Pe//z3Lli3jyCOP5B//+AerVq2qnE3nf/7nfwD41re+xT777MPkyZOZMWMGe+yxB3fccQdt27YFYMyYMZx77rl88sknnH766dWu+c9//pNTTjmFmTNnUlZWxqGHHsrVV1/NZpttRkqJ008/nbFjx7J8+XK6du3KnXfeSa9evfL+2uRC/Pr9QodQFNJl7QodgrSWe++9lwMOOIABAwbw6KOP0rlzZ4499lhOPPHEWqdZ/+STT/jTn/7E+eefv9axCy+8kAceeIAjjzySxx9/nCuuuKLWmf1KTWmnXjjmQ1JxGDt2LA899BBvvvkms2bNYvjw4axevZqBAwcyZ84c3n77bcrKyjjppJOqPe+OO+7g1ltvZcGCBaxYsYIrr7wSgFdeeYUTTjiBMWPGMG/ePD744APefffdyuc1adKE3/72tyxcuJBnnnmGRx55hBEjMkswTZw4kSeeeIJZs2axePFixo0bx9Zbb52/F0OSvqB///vfjBgxgu22246HHnqIU045hV//+tfVFois6o477mDFihUcffTRax3bbLPNuP766xk/fjy77bYbJ5xwQq7DbxRKvuXDFc4lFYOTTjqJbbbZBoChQ4dy8sknM3z48GqLlQ0dOpRvf/vb1Z43cOBAdtxxRyDTX/n+++8H4O677+b73/8+ffv2BeCiiy7id7/7XeXz+vTpU/l4TcvL448/zqmnnkrTpk35+OOPefXVV/na177mTGFqEGyxqh/F3mK1evVqysvLufTSSwHYfffdef3117nhhhvW+vIGYOTIkRx88MG0a1f763LzzTfTvHlzZs6cycKFC9dZr5SUfMuHJBWDNYkHQNeuXZk3bx5Lly7luOOOo2vXrrRq1Yq+ffvy0Ucf8dlnn1XWrdp3uXnz5nzyyScAzJs3r9o5W7RoUa31YtasWXz/+9+nY8eOtGrVit/85jcsXLgQgH79+nHSSSdx4okn0r59ewYPHsySJUtydu+SVF86depEz549q5XttNNOvP3222vVnT59OlOnTq11DReAv/71r4wbN47HH3+cbbbZxpaPLJMPSSoC77zzTuXjt99+m86dO3PVVVfx2muv8Y9//IMlS5bwxBNPAJkVl9enU6dO1c65dOlSPvjgg8r9E044gS9/+cu8/vrrLFmyhEsuuaTaeX/5y18ybdo0XnnlFWbNmsUVV1xRH7cpSTm111578dprr1UrmzVrVuXCj1XddNNNdO/enX333XetYwsWLOC4447jvPPOo7y8nNtuu43x48dz55135iz2xsLkQ5KKwA033MC7777LokWLuPjiixkwYAAff/wxZWVlbLnllixatIhhw4Zt8PkOO+ww/va3v/HUU0+xYsUKzjvvPFavXl15/OOPP6ZVq1a0bNmSV199tdoKzM899xz/+Mc/WLlyJS1atGDzzTcv+dldJDUOp512Gs8++ywXX3wxb7zxBnfddRfXXXdd5RoeayxdupSxY8fyi1/8otaB6Mcffzzdu3fn17/+NQC9evVi2LBhnHzyyVRUVOTlXhqqkv9r4IBzScXgiCOOYP/992e77bZj++2359xzz+XUU09l2bJltG3blm984xsccMABG3y+nXfemRtuuIEjjjiCTp06sdVWW1XOkgVw5ZVXcscdd7DFFlswaNAgBgwYUHlsyZIlDBo0iK222oquXbuy9dZbc9ZZZ9Xr/UpSLnz1q1/l3nvvZdy4cfTq1YuhQ4dy0UUXMWTIkGr1/vznP/Of//yHgQMHrnWOMWPG8OCDD3LbbbfRpEmTyvKzzjqLHXbYgcGDB+f8Phqy2JDm91JQXl6epk6dWugwJDVAM2fObNCDprt168aoUaNqbfpvDNb1+kbEtJRS+QacIq9/yBy4XD/yPXDZ961+FPuAc9WbtZuDskq+5UOSJElSfph8SJIkScqLkl/nQ5Iau7feeqvQIUiStEFs+ZAkSZKUFyXf8hER/YH+PXr0KHQokiRJqsKJAupHQ5oooORbPlJK41NKg1u3bl3oUCRJkqSiVvLJhyRJkqT8MPmQJEmSlBcmH5IkSZLywuRDkiRJUl6U/GxXkvRF5HoGloY0M4kkSfXFlg9JauS6devGlVdeyS677ELr1q0ZMGAAy5cvZ/To0ey9997V6kYEb7zxBgDHHHMMQ4YM4Xvf+x4tW7Zkr7324r333uPUU09lq6224stf/jIvvPBCtetceuml9OzZk6222oqBAweyfPlyAHr16sX48eMr665cuZK2bdtWe74kSSWffERE/4i4afHixYUORZK+sHHjxvH3v/+d2bNnM2PGDEaPHr3Bzxs+fDgLFy6kWbNm7LHHHvTu3ZuFCxdy2GGHcfrpp1erP3bsWB566CHefPNNZs2axfDhwwE46qij+OMf/1hZb8KECXTq1Indd9+93u5RktT4lXzy4TofkorBL3/5Szp37kybNm3o378/06dP36Dn/fCHP6RPnz5svvnm/PCHP2TzzTfnqKOOokmTJgwYMGCtlouTTjqJbbbZhjZt2jB06FDuvPNOAH72s58xYcIElixZAsCYMWM48sgj6/cmJUmNXsknH5JUDDp27Fj5uHnz5nzyyScb9LwOHTpUPi4rK1trv+Z5ttlmm8rHXbt2Zd68eQB07tyZvfbai7/85S989NFHPPjgg/z0pz/9QvciSSpeDjiXpCLVokULli5dWrn/3nvvbfQ533nnncrHb7/9Np07d67cP/rooxk1ahSrVq1ijz32oEuXLht9PUlScbHlQ5KK1K677srLL7/M9OnTWb58ORdccMFGn/OGG27g3XffZdGiRVx88cUMGDCg8tgPfvADnn/+ea699lqOOuqojb6WJKn4mHxIUpHacccdOe+889h3333ZYYcd1pr56os44ogj2H///dluu+3YfvvtOffccyuPlZWVceihhzJ79mwOOeSQjb6WJKn4REqp0DE0COXl5Wnq1KmFDkNSAzRz5kx22mmnQodRcN26dWPUqFHsu+++66xz4YUXMmvWrGozX63Pul7fiJiWUirfgFPk9Q9Zrtd4KRX5XsvG961++L41TgVYOyrWdcAxH5KkerFo0SJuvvlmxowZU+hQJEkNlN2uJEkbbeTIkWyzzTZ873vfo2/fvoUOR5LUQBVty0dE/BX4FvBISumwAocjSY3eW2+9tc5jgwYNYtCgQfkLRpLUKBVzy8e1gNOtSJIkSQ1E0SYfKaXHgI8LHYek4uDkHLnh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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Feature Generation\n", + "from gators.feature_generation import ElementaryArithmetics\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "sf_crime_df = sf_crime_df[columns]\n", + "# Why filter for columns , even though column names are given in constructor\n", + "objs = [ElementaryArithmetics(columns_a=[\"X\"], columns_b=[\"Y\"], operator=\"+\", coef=0.1)]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"ElementaryArithmetics\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "0a49a6d3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7s3EiROZPXs2vXr1YuzYsbRu3RqA0aNHc+mll7JixQrOP//8Std84YUXOOecc3jttddo2rQpxx13HDfccAM77rgjKSXOP/98xowZw5o1a9hjjz2455576NatW87/bbIhLn4/3xEKQrq6JN8RJOVB0Xe7csyHpEIwZswYHn30UebOncucOXO44oor2LhxI4MGDWL+/PksWLCApk2bctZZZ1V63dixY7nzzjtZvHgxa9eu5brrrgPg1Vdf5YwzzmD06NEsWrSIDz74gHfeeafidQ0bNuS3v/0tS5Ys4dlnn+XJJ59k5MiRADz22GNMmTKFOXPmsGzZMu6991523XXX3P1jSHkyZcoUjj76aDp27EhEMGrUqErHH3zwQY466ihKSkqICCZPnrzZOebOncsxxxxDSUkJO+20EyeccAJlZWUVx19++WWaNGnCAw88UOl1TzzxBI0aNWLatGnZeGtSrSn64sMxH5IKwVlnncVuu+3GLrvswiWXXMI999zDrrvuynHHHUezZs34whe+wCWXXMJTTz1V6XWDBg1ir732omnTppxwwgnMmjULgPvvv59vf/vb9OnTh8aNG/OrX/2q0mrXPXv25KCDDmKHHXaouPPy6bkbNWrExx9/zOuvv05KiX322Yf27dvn7h9DypMVK1bQrVs3brzxxmqn5165ciUHH3wwN9xwQ7WvX7lyJUceeSQpJSZOnMi0adNYu3YtAwYMYOPGjQB069aNESNGcPrpp1cUJcuWLWPQoEFccMEFHHLIIdl7g1ItsNuVJBWA3XbbreL5HnvswaJFi1i1ahXnnXce//jHP/jwww8B+Pjjj9mwYQMNGzYEoF27dhWva9asGStWrABg0aJFlc7ZvHnzSncv5syZw/nnn8/06dNZtWoV69evp2fPngD07duXs846i5/+9KfMnz+fY489luuuu67aVcylQtK/f3/69+8PUGml+U+ddNJJACxZsqTa10+bNo158+Yxffp0WrVqBcBdd91Fq1atmDhxYsXq9EOHDmXcuHEMGTKEhx9+mLPPPptWrVpx+eWXZ+FdSbWr6O98SFIhePvttyueL1iwgA4dOnD99dfzxhtv8Pzzz7N8+XKmTJkCQEpbXxC8ffv2lc65atUqPvjgg4rtM844g7333pt///vfLF++nKuuuqrSeX/2s58xY8YMXn31VebMmcO1115bG29TKmiffPIJEUGTJk0q9jVp0oQGDRowderUin0NGjTgrrvu4oknnuAHP/gBf/nLX7j77rvZcccd8xFbqhGLD0kqADfddBPvvPMOS5cu5corr2TgwIF8/PHHNG3alJ133pmlS5cyYsSIbT7f8ccfz//+7/8ydepU1q5dy7Bhwyq6fUD5HZSddtqJFi1a8Prrr/OnP/2p4tg///lPnn/+edatW0fz5s0r/udJ0mc76KCDaNGiBUOHDmXlypWsXLmSCy+8kA0bNvDuu+9WatulSxeGDh3K2LFjufjiiznwwAPzlFqqmaL/beCAc0mF4MQTT+TII49kzz335Etf+hKXXnop5557LqtXr6Z169YcdNBBfPOb39zm83Xt2pWbbrqJE088kfbt29OqVauKWbIArrvuOsaOHcsXvvAFBg8ezMCBAyuOLV++nMGDB9OqVSv22GMPdt11V4YOHVqr71cqRCUlJdx333088sgjfOELX6Bly5Z89NFH9OjRY7MCfvXq1dxzzz00a9aMqVOnbtMdTakuCP9jLVdaWpqmT5+e7xiS6qDXXnuNffbZJ98xtqhTp07cdtttFf3B65st/ftGxIyUUuk2nCKnv8icard2FPpUuy1atOCPf/xjtWM/lixZQklJCZMmTeKwww6r9vVLlixhhx12YOedd6Zdu3ZccMEFlYr4n/3sZ/z9739n3Lhx9OrViyuvvJKzzz47S+9GqrHY0oGiv/MhSZJU17Ru3Zqdd96ZiRMnsnjxYo4++uiKY5MmTWLkyJGMGjWKrl27cv3113PxxRczd66Lk6ruc7YrSZKkWrBixQrefPNNADZu3MiCBQuYNWsWu+yyC7vvvjtLly5lwYIFfPTRRwC8+eabFXc2Pp157s4772TvvfemTZs2PPvss5xzzjmcd955fOUrXwHKx1sNGjSIc845h969ewMwePBgHnjgAQYNGsTkyZMdY6U6zf86Jamee+utt+ptlyupkEyfPp3u3bvTvXt3Vq9ezfDhw+nevTvDhg0DYNy4cXTv3p3DDz8cKC8aunfvzs0331xxjjfeeINjjjmGffbZh8svv5xLLrmkYvFPgHPPPZdmzZpx5ZVXVrr27bffzksvvcSNN96Yg3cqfX6O+chwzIekLanrYz7qO8d8FKdCH/MhFTnHfGyJs11JkiRJuVH0xUdKaXxKaUjLli3zHUWSJEkqaEVffEiSJEnKDYsPSZIkSTnhVLuSJKngOVFA7XCiAG0v73xIkiRJygnvfEjS55Dtv6L610VJUiHyzock1XOdOnXiuuuuY//996dly5YMHDiQNWvWMGrUKA499NBKbSOiYgXmU089lTPPPJNvfetbtGjRgkMOOYT33nuPc889l1atWrH33nszc+bMStf59a9/zb777kurVq0YNGgQa9asAaBbt26MHz++ou26deto3bp1pddLklT0xYfrfEgqBPfeey//+Mc/mDdvHrNnz2bUqFHb/LorrriCJUuW0LhxY3r16kWPHj1YsmQJxx9/POeff36l9mPGjOHRRx9l7ty5zJkzhyuuuAKAk08+mf/3//5fRbsJEybQvn17unfvXmvvUZJU/xV98eE6H5IKwc9+9jM6dOjALrvswoABA5g1a9Y2ve6YY46hZ8+eNGnShGOOOYYmTZpw8skn07BhQwYOHLjZnYuzzjqL3XbbjV122YVLLrmEe+65B4Af/vCHTJgwgeXLlwMwevRoTjrppNp9k5Kkeq/oiw9JKgTt2rWreN6sWTNWrFixTa9r27ZtxfOmTZtutl31PLvttlvF8z322INFixYB0KFDBw455BAeeOABPvroIx555BF+8IMffK73IkkqXA44l6QC1bx5c1atWlWx/d577233Od9+++2K5wsWLKBDhw4V26eccgq33XYb69evp1evXnTs2HG7rydJKize+ZCkAnXAAQfwyiuvMGvWLNasWcNll1223ee86aabeOedd1i6dClXXnklAwcOrDj23e9+lxdffJEbb7yRk08+ebuvJUkqPBYfklSg9tprL4YNG0a/fv348pe/vNnMV5/HiSeeyJFHHsmee+7Jl770JS699NKKY02bNuW4445j3rx5HHvssdt9LUlS4YmUUr4z1AmlpaVp+vTp+Y4hqQ567bXX2GefffIdI+86derEbbfdRr9+/bbY5vLLL2fOnDmVZr7ami39+0bEjJRS6TacIqe/yFwpu3bkei0bP7fa4RpE2kaxpQOO+ZAk1YqlS5dy++23M3r06HxHkSTVUXa7kiRtt1tvvZXddtuNb33rW/Tp0yffcSRJdVTB3vmIiIeAw4AnU0rH5zmOJNV7b7311haPDR48mMGDB+cujCSpXirkOx83Ak63IkmSJNURBVt8pJQmAx/nO4ekwuDkHNnhv6skFZecFx8R0ScixkXEwohIEXFqNW3OjIh5EbEmImZERO9c55SkTzVq1IjVq1fnO0ZBWr16NY0aNcp3DElSjuTjzkcL4GXgHGCz3+YRMZDyLlNXAd2BZ4BHImL3TdrMioiXq3l0qHo+Sdpebdq0YeHChaxatcq/1NeSlBKrVq1i4cKFtGnTJt9xJEk5kvMB5ymlCcAEgIgYVU2T84FRKaVbM9tnR8Q3gTOAX2TOcWAOokoSADvttBMAixYtYt26dXlOUzgaNWpE27ZtK/59JUmFr07NdhUROwI9geuqHHoMODgL1xsCDAHYfffdt9JaUjHbaaed/J9kSZK2U10bcN4aaAiUVdlfBrSryYki4gngPqB/RLwTEb2qtkkp3ZJSKk0plZaUuGKnJEmSlE116s5HbUop9duWdhExABjQpUuXLCeSJEmSiltdu/OxBNgAtK2yvy3wXjYumFIan1Ia0rJly2ycXpIkSVJGnSo+UkprgRnAEVUOHUH5rFeSJEmS6qmcd7uKiBbAp32cGgC7R8SBwNKU0gLgBmB0RLwATANOBzoAN2cpj92uJEmSpBzIx52PUmBm5tEUGJF5fjlASumvwLnApcAs4FCgf0ppfjbC2O1KkiRJyo18rPMxGYittBkJjMxFHu98SJIkSblRp8Z85IN3PiRJkqTcKPriQ5IkSVJuWHxIkiRJyomiLz4iYkBE3LJs2bJ8R5EkSZIKWtEXH475kCRJknKj6IsPSZIkSblR9MWH3a4kSZKk3Cj64sNuV5IkSVJuFH3xIUmSJCk3LD4kSZIk5YTFhyRJkqScKPriwwHnkiRJUm4UffHhgHNJkiQpN4q++JAkSZKUGxYfkiRJknLC4kOSJElSTlh8SJIkScqJoi8+nO1KkiRJyo2iLz6c7UqSJEnKjaIvPiRJkiTlhsWHJEmSpJyw+JAkSZKUExYfkiRJknLC4kOSJElSTlh8SJIkScoJiw9JkiRJOVH0xYeLDEqSJEm5UfTFh4sMSpIkCWDDhg388pe/pHPnzjRp0oTOnTtz6aWXsn79+oo2EVHt46c//SkAq1atYq+99uLss8+udO6ysjJKSkq4+uqrc/qe6pod8h1AkqR8Wb16NXPnzgXgS1/6Ek2bNs1zIkn59Jvf/IabbrqJu+66i/3224/Zs2dzyimn0LhxY375y18C8O6771Z6zfTp0xkwYAAnnHACAM2aNeOuu+6iT58+fPe73+Ub3/gGAD/5yU/Ya6+9+PnPf57bN1XHWHxIkorOJ598wkUXXcSf//xn1q5dS0qJxo0bM2TIEH7zm9/QpEmTfEeUlAfPPPMMAwYMYMCAAQB06tSJo48+mueff76iTbt27Sq95uGHH2avvfbi61//esW+Xr16ccEFFzBo0CBeeuklHnjgASZOnMi//vUvGjQo7o5Hxf3uJUlF6YwzzuD+++/ntttu49///jdvvvkmt912Gw899BBnnnlmvuNJypNDDz2USZMm8frrrwPw6quvMnHiRPr3719t+xUrVvCXv/yFwYMHb3bs8ssvp2XLlpx00kmcd955XHvttXTp0iWr+esD73xIkorOfffdx4MPPsgRRxxRsW/PPfekTZs2HHfccdxxxx15TCcpXy666CI+/vhj9t13Xxo2bMj69eu55JJLtvhHibFjx7J27VpOOeWUzY7tuOOO/OEPf+Dwww+nT58+nHHGGdmOXy9450OSVHSaN29Ox44dN9vfsWNHx31IReyvf/0rd999N2PHjuXFF1/k7rvvZuTIkdx+++3Vtr/11lv5zne+Q0lJSbXHb7/9dpo1a8Zrr73GkiVLshm93rD4kCQVnbPPPpsRI0awevXqin2rV6/mV7/61WYz1EgqHkOHDuXCCy/ke9/7Hvvttx8nnXQS559/Pr/+9a83aztr1iymT59ebZcrgIceeoh7772Xp556it122807Hxl2u5IkFZ3nnnuOp556io4dO7L//vsD8NJLL7F+/XpWrlzJ0UcfXdF23Lhx+YopKcdWrVpFw4YNK+1r2LAhGzdu3KztLbfcQufOnenXr99mxxYvXsxpp53GsGHDKC0t5a677qJnz57cc889fP/7389a/vqgIIuPiNgNGA20AdYDv0op3ZffVJKkuqJ169Ycd9xxlfZ17tw5T2kk1RUDBgzg6quvpnPnznTt2pWZM2dyww03cPLJJ1dqt2rVKsaMGcPPf/5zImKz85x++ul07tyZiy++GIBu3boxYsQIzj77bPr27Uvbtm1z8n7qokgp5TtDrYuI9kDblNKsiGgHzAD2Simt3NJrSktL0/Tp03OWUZL02SJiRkqpdBua5vQXWVz8fi4vV7DS1dX3kc8WP7fakevPLdc+/vhjfvnLX/LQQw+xePFi2rdvz/e+9z2GDRtW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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation import IsEqual\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "# sf_crime_df = sf_crime_df[columns]\n", + "objs = [IsEqual(columns_a=[\"X\"], columns_b=[\"Y\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"IsEqual\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "10b0c0bc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7rrraN68Oeedd94265aVlfGnP/2JFi1aMGvWLH74wx9uT8hSzhR9e2pytitJ27B+/fqtdn/Q9ikpKbErmwrK9kwU8MQTTzBjxgyaNWvGDjvswKY/jB5++OFbTBgwcuRI9tlnHx5//HH+67/+i6lTp2bzsqR6U/QtH5JUG3a1yg5/ryoko0aN4ve//z1PPvkk++23X5WyPffck06dOvHYY4/xla98BaiYTvepp57i5z//OQB33XUXH3/8ceVnlixZwtFHH82kSZOqdJ2bMGECjz/+OPPnz2efffbh4osv5rTTTuOII45g1113zcGVSl9c0bd8uMigJNVO9+7defzxx/MdhtQgnXnmmdx1111Mnjy5cqKApUuXsmbNGoDKiQL+8z//k4ceeohXXnmFU089tcpEAXvuuSc9e/asfO27774A7L333pXT7r7zzjuMGjWK66+/nn322QeoGA/Url07zj777DxcuVQ3RZ982O1KkiRtr3HjxrF69Wq+8Y1v0Llz58rX2LFjK+tcdNFFnHvuuZx55pmUlpby3nvv1ThRwNaklPjhD39IaWkpZ511VuX+5s2bc88993D//ffzhz/8od6vTapPdruSpC/gr/2zu5DX4bNcpVhqTOpzooBNunfvXuW4EcFjjz1WY91evXrx6aef1uq4Uj6ZfEhSI9e9e3dOO+00Jk6cyHvvvcd3vvMdfvOb31BeXs4PfvADnn32WTZs2MARRxzBbbfdVtl946ijjqJfv37MmDGDl156ib59+zJ58mTatWsHwMSJE7nssstYs2bNFrPvPPfcc4waNYrXX3+dkpIShg4dyk033UTz5s1JKXHeeecxadIk1q1bR7du3bj33nvp2bNnzn832RCXvJ/vEApCur59vkOQlAdF3+3KMR+SCsGkSZN49NFHeeutt3jzzTe59tpr2bhxI8OHD+ftt99m0aJFlJSUVOmqATB58mTuuusuli1bxqefflrZReS1117j9NNPZ+LEiSxZsoQPPviAd999t/JzTZs25Re/+AXLly/nmWee4Yknnqhcn2L69OnMmjWLN998k5UrV3Lfffex22675e6XIUlqsIo++XDMh6RCcNZZZ7H77ruz6667cumll3Lvvfey2267MXToUFq0aMHOO+/MpZdeyl/+8pcqnxs+fDj77rsvJSUlfO9732P+/PkAPPDAA3zrW9+if//+7LjjjlxzzTVVVrs+9NBDOfzww9lhhx0qW142HbtZs2asXr2aN954g5QS+++/P507d87dL0OS1GAVffIhSYVg9913r3zfrVs3lixZwtq1aznttNPo1q0brVu3pn///nz00Ud89tlnlXU3rS8A0KJFi8qZeZYsWVLlmC1btqzSevHmm2/yrW99i06dOtG6dWt++tOfsnz5cgAGDBjAWWedxZlnnkmHDh0YOXIkq1atytq1S5IaD8d8SFIBeOeddyrfL1q0iC5dunDjjTfyt7/9jWeffZZOnToxf/58evfuXauBsZ07d+b111+v3F67di0ffPBB5fbpp59O7969uffee9l55525+eabeeCBByrLzznnHM455xyWLVvG9773PX7+859zzTXX1NPVSnXnWJ364VgdbS9bPiSpANx66628++67rFixgjFjxjBs2DBWr15NSUkJu+yyCytWrOCqq66q9fFOOOEE/vu//5vZs2fz6aefcvnll7Nx48bK8tWrV9O6dWtatWrFG2+8wW9+85vKsueff55nn32W9evX07JlS3baaacqXbYkScWr6L8NHHAuqRCceOKJDB48mL322ou9996byy67jNGjR1NeXk67du04/PDDOeaYY2p9vAMPPJBbb72VE088kc6dO9O2bdvKWbIAxo4dy+TJk9l5550ZMWIEw4YNqyxbtWoVI0aMoG3btnTr1o3ddtuNCy+8sF6vV5LUOEVtmt+LQWlpaZo7d26+w5DUAL3++uvsv//++Q5jq7p3784dd9zBwIED8x3KF7K1329EzEspldbiEDn9IrP7Tv3Idfcd71v9sNuVaim2VlD0LR+SJEmScsPkQ5IkSVJOONuVJDVyCxcuzHcIkiTVii0fkiRJknKi6JMPZ7uSJEmScqPok4+U0tSU0sg2bdrkOxRJkiSpoBV98iFJkiQpN0w+JEmSJOWEyYckSZKknDD5kCRJkpQTrvMhSV9AXPJ+Vo+frm+f1eNLkpQPtnxIUiPXvXt3xo4dy8EHH0ybNm0YNmwY69atY8KECRx55JFV6kYE//jHPwA49dRTOeOMM/jmN79Jq1atOOKII1i6dCmjR4+mbdu27Lfffrz44otVzvOzn/2MAw44gLZt2zJ8+HDWrVsHQM+ePZk6dWpl3fXr19OuXbsqn5ckqeiTD9f5kFQI7rvvPv785z+zYMEC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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation import IsNull\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "# sf_crime_df = sf_crime_df[columns]\n", + "objs = [IsNull(columns=[\"X\", \"Y\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"IsNull\")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "e2213844", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde7yVY9748c+3dNiVoqPqoZBniHHINg7RjB4aY2SGGhnGoXkUwkQYQ36MQxhiGKOZUY1o4nEYg2ZCJaQcS42zSE7JTqKiUun6/bFXe9od1NZea+3W+rxfr/Xa676va133996L1v6u6xQpJSRJkiQp22rlOwBJkiRJxcHkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJBWQiOgWEQ9HxKcRsTQiZkTE7yJi6yxf94mImLSeslMiIkVE+yq2uVVE/DYiOlVHjJKk/DP5kKQCEREXAY8CS4FTgB8CfwZOBl6IiG3zF923shVwKWDyIUkFYot8ByBJ2nQRcTBwJXBjSumc1YqejIh/AFOBO4CD8xGfJElgz4ckFYpfA/OBC9csSCnNAq4BfhAR+wJkhkFdGRG/iohZEbEoIp6MiF3XfH1EHB0Rz0bE4oj4PCLujYjtNiXYKHdORLwZEcsiYk5E/DEiGmfK2wOzMtWHZuJNEXHyplxXkpRfJh+StJmLiC2A7wPjUkpL11PtoczPrqud+wXwY6A/0BvYDngw096qtk8D/g68BvQETgV2o7xHZct1xbLmg3V/1gwCbgDGAd2BaykfHvaviKgFzAGOztS9Gtg/8/jXN/wqJEk1XMENu4qII4DrKf+w+11KaVieQ5KkbGsGlADvfkOdVWWrz/tYDhyRUloOEBEA9wLfA56OiEbA74DbUkq/XPWiiHgeeBP4X+DG1drrnGnzG0VEU+Bc4PaU0pmZ049GxCfAyExMD0XEtEzZOymlZzfUriSp5iuono/MN2w3UP7N3l7A+RHRLL9RSVKNNW5V4pHxcubnqiFV+wONgVFr9GR8ALwBdFmjvX8D+6zjceUa9fYD6gJ/W+P8/wErKO/FkSQVoELr+fge8GpKaTZARDwMdAPuymtUkpRdn1K+wlX7b6izquyD1c7NX6POV5mf9TM/W2Z+jl9Pm5+tcfxFSmnKmpUiYs81TjXN/Jyz+smU0oqI+HS1cklSgalRPR8R0SUiHoqI2eubWBgR/TKTI5dGxNSIOGi14jbA7NWOZwNtsxy2JOVVSmkF8CRwaETUX0+1IzM/J1Sh6U8zP09m3T0afascbLlVSc82q5/M9Ko0Y+2kSJJUIGpU8gE0Al6hfPLjkjULI6IXcBNwFeXDqp4GHt7UVVckqQAMpvwP96vWLIiI7YELgIkppeeq0ObTwCKgQ0ppyjoeb37LWJ8FlgHHrnG+F+U98k9kjlf1xJR8y+tIORMR7662Ktvqj39lymtHxBWrfYE6K7Pi3OoLPFwREW9ExJcR8VlEPBYRB6xWvk1EzIuIc9e49q6ZNtf8f0qqcWrUsKuU0hhgDEBEjFhHlQHAiJTS0MzxWRFxGHA65ctLfkTlno62wPNZC1iSaoiU0viIuBS4LLNM7R2UD4vqBPwGWACcUMU2F0bE+cAtEdECeDjTTlvK52U8kVK681vEOj8irgcujIgvKf93fxfK54ZM4j8rWpVR3vtybES8BHwJzEopfbqOZqV82weovdpxa8r317knc3wBcAZwEuXzq3YHbqc8yb4iU+fNTJ1ZlCfd5wCPRMROKaWylNLHEXEGMCIiHk4pvRYRdSj///2BlNL/ZfUOpWoQKaV8x7BOEfEFcGZKaUTmuC6wGPh5Sune1erdAuyWUvp+5tuD14EfUP4BORU4YH0fVBHRl8ywgYYNG+698847Z++GJCkHFixYwNy5c/nyyy9ZuXIldevWZauttmKbbbZhiy3+833T1KlT2WabbWjb9j/f13z11Ve88sortGvXjubNm1dq8+OPP2bx4sWklKhbty6NGjWiVatWlJSUd0q8+eabpJRY17+j8+bN47333mO33XajXr16AKSUmDt3Lp988gnLli2jdu3abL311rRt25batWuvinEe0Ify3pydKP/CrPeqz4XV1MwPMhW1QYMGcd111zFnzhxKSko44ogjaNasGbfffntFnZNOOolPP/2Uf/7zn+tsY+HChTRp0oRHHnmEH/7whxXnjz32WN5++22effZZLr/8coYNG8Yrr7xC06ZOl1KNEesrqFE9HxvQnPJvFMrWOF8GHAIVkxXPBR6nfEjZtd/0DVlK6VbgVoDS0tI0Zcpa8yQlSXkSEe+llB4AHsh3LFJVpJQYPnw4v/jFLyoS9AMPPJAhQ4bwxhtvsPPOO/Paa68xYcIELrxwrX1BAVi2bBm33norjRs3Zs89K6/ZMGTIEHbddVeOP/547r//fh588EETD202NqfkY6OklB7iP5tpbVBEdAe6d+jQIXtBSZKkojFu3DhmzZpFnz59Ks5dcMEFLFq0iI4dO1K7dm1WrFjBwIED6devX6XX/vOf/+TYY49l8eLFtG7dmnHjxtGqVatKdZo2bcrVV19N7969OeGEEzj88MNzcl9SdahpE86/yTzga6DVGudbAR9/20ZTSqNTSn2bNGmyKbFJkiQBMHToUPbZZx/22GOPinN33303d9xxB3feeScvvvgid9xxB0OGDGH48OGVXnvwwQczffp0nn76aQ477DCOOeYY5syptCo1K1eu5LbbbqNBgwa88MILLF26NCf3JVWHzSb5SCkto3wOx6FrFB1K+YoskiRJeTV37lwefPDBSr0eAOeffz7nnXcexx57LN/97nc54YQTGDBgAFdffXWleg0bNqRDhw7st99+DB8+nDp16jBs2LBKdW688UZefvllXnjhBb744gsGDhyY9fuSqkuNSj4iolFE7JnZkKoWsF3meNVSujcAJ0fEKRGxS0TcRPneHn/ehGt2j4hbFyxYsOk3IEmSitqIESOoV68eP//5zyudX7x4ccViCqvUrl2blStXfmN7K1eu5Kuvvqo4fv311xk4cCA333wzHTt2ZPjw4dx0001Mnjy5+m5CyqIatdpVRPyA8snia7o9pXRypk4/4NeUL2H3CnBOSmnipl7bCeeSvsnChQuZO3cuy5cvz3coBaNOnTq0bNmSxo0br7M8IqamlEo3oqma80GmopZS4jvf+Q7f//73GTp0aKWyk08+mfHjx/OXv/yFXXfdlWnTptG3b19OPPFErr/+ehYuXMi1115L9+7dad26NZ988gm33HILo0aN4oUXXmD33XdnxYoVHHDAAWy33Xbcd999FW2fdtppTJgwgenTp9OgQYNc37a0Lutd7apGJR/5ZPIhaX0WLlxIWVkZbdu2paSkhIj1/puqjZRSYsmSJcyePZtWrVqtMwEx+dDm5vHHH6dr164899xzfO9736tUtmjRIv7f//t//OMf/2Du3Lm0bt2aY489lksuuYT69euzePFijj/+eJ577jk+/fRTmjVrxj777MNFF13EvvvuC8AVV1zBH//4R1555RVatGhR0fYXX3zB7rvvTvfu3bnppptyes/Seph8rM9qq131eeutt/IdjqQa6O2336ZNmzZ+o5gFixcv5qOPPmJdKw6afEjSZmu9yUeNmvORD652JWlDli9fXrFWv6pXSUmJQ9kkqYgUffIhSRvDoVbZ4e9VkopL0ScfrnYlSRunffv2jB8/Pt9hSJI2Y0WffDjsSpIkScqNLfIdgCRtjp7tsmNW299v4systi9JUj6YfEjSZq59+/aceuqpjBw5kjlz5vDTn/6UP/3pTyxZsoQTTjiB5557jhUrVtC5c2f+/Oc/81//9V8A/OAHP+Cggw5iwoQJvPTSS+y///7ceeedNG/eHICRI0dy8cUX88UXXzBgwIBK13z++efp378/r7/+OiUlJfTo0YMbbriBunXrklJiwIABjBo1iqVLl9KuXTvuuusudtttt5z/bqRV4jef5DuEgpCuabHhStI3KPphV875kFQIRo0axaOPPsrMmTOZMWMGV155JStXrqR379689957vP/++5SUlHDmmWdWet2dd97Jbbfdxty5c1m2bBmDBw8G4LXXXuP0009n5MiRfPTRR3z66ad8+OGHFa+rXbs2v//975k3bx7PPPMMjz32GEOGDAFg7NixTJw4kRkzZrBgwQLuuecemjVrlrtfhiSpxir65MM5H5IKwZlnnsm2225L06ZNGThwIHfddRfNmjWjR48eNGjQgC233JKBAwfy5JNPVnpd7969+e///m9KSko45phjmD59OgD33XcfRxxxBF26dKFevXpcccUV1Kr1n4+Mvffem/32248tttiioudlVdt16tRh0aJFvPHGG6SU2GWXXWjdunXufhmSpBqr6JMPSSoE2267bcXzdu3a8dFHH7F48WJOPfVU2rVrR+PGjenSpQuff/45X3/9dUXdbbbZpuJ5gwYN+OKLLwD46KOPKrXZsGHDSr0XM2bM4IgjjmCbbbahcePGXHTRRcybNw+Arl27cuaZZ3LGGWfQsmVL+vbty8KFC7N275KkzYfJhyQVgA8++KDi+fvvv0+bNm24/vrrefPNN3nuuedYuHAhEydOBCClDW8I3rp160ptLl68mE8//bTi+PTTT2fnnXfmrbfeYuHChVx11VWV2v3Vr37F1KlTee2115gxYwbXXXddddymJGkzZ/IhSQXglltu4cMPP2T+/PkMGjSIXr16sWjRIkpKSthqq62YP38+l1122Ua317NnT/75z38yadIkli1bxiWXXMLKlSsryhctWkTjxo1p1KgRb7zxBn/6058qyl544QWee+45li9fTsOGDalfv36lIVuSpOJV9J8GTjiXVAiOO+44unXrxg477MCOO+7IxRdfzNlnn82SJUto3rw5++23H4cddthGt7frrrtyyy23cNxxx9G6dWu23nrrilWyAAYPHsydd97JlltuSZ8+fejVq1dF2cKFC+nTpw9bb7017dq1o1mzZpx//vnVer+SpM1TbEz3ezEoLS1NU6ZMyXcYkmqg119/nV122SXfYaxX+/btGTZsGIcccki+Q/lW1vf7jYipKaXSjWjCDzJtkEvtVg+X2tVGivUVFH3PhyRJkqTcMPmQJEmSlBPucC5Jm7l333033yFIkrRR7PmQJKkGad++PRGx1uPHP/5xRZ0hQ4aw/fbbU79+ffbee2+eeuqpSm3MnDmTo446ihYtWtC4cWOOOeYYysrKKspfeeUV6tevz9///vdKrxs/fjx16tRh8uTJ2b1JSUWr6JMPV7uSJNUkL7zwAnPmzKl4vPjii0QExxxzDAB33303/fv356KLLmLatGkccMAB/OhHP+L9998H4Msvv6Rbt26klJgwYQKTJ09m2bJldO/evWK55N12243LLruM0047rSIpWbBgAb179+bcc8+lc+fO+bl5SQXP1a4yXO1K0vrU9NWuNneudvXNBg0axHXXXcecOXMoKSlh3333Zffdd2fo0KEVdXbaaSd69uzJ1VdfzdixYznssMP49NNP2XrrrYHyxGLrrbdm7NixFauirVy5koMOOojmzZvz4IMPcuKJJzJ9+nSmTJlC3bp183Kv2eRqV9XD1a60kVztSpKkzU1KieHDh/OLX/yCkpISli1bxtSpU+nWrVulet26dePpp58G4KuvviIiqF+/fkX5qo0eJ02aVHGuVq1a3H777YwfP57jjz+e//u//+OOO+4oyMRDUs1h8iFJUg01btw4Zs2aRZ8+fQCYN28eX3/9Na1atapUr1WrVnz88ccA7LfffjRq1Ijzzz+fL7/8ki+//JLzzjuPr7/+mjlz5lR6XYcOHTj//PO58847+c1vfsOee+6ZmxuTVLRMPiRJqqGGDh3KPvvswx577LHRr2nRogX33nsvDz/8MFtuuSVNmjTh888/p1OnTtSqVfljf8mSJdx11100aNCASZMm4VBsSdlm8iFJUg00d+5cHnzwwYpeD4DmzZtTu3btSitXAZSVlbHNNttUHHfr1o2ZM2cyd+5c5s2bx8iRI5k9ezY77LBDpdddcMEFrFixgueff54pU6bwxz/+Mbs3Janouc+HJH0L2Z686qROjRgxgnr16vHzn/+84lzdunXZe++9GTduHD/72c8qzo8bN44ePXqs1Ubz5s0BmDBhAnPnzuXII4+sKHv88ccZMmQIjz/+OLvuuivXX389Z599Nocffjg77rhjFu9MUjGz50OSNnPt27dn8ODB7L777jRp0oRevXqxdOlSRowYwYEHHlipbkTw9ttvA3DyySfTr18/fvSjH9GoUSM6d+7Mxx9/zNlnn83WW2/NzjvvzLRp0ypd5+qrr6Zjx45svfXW9O7dm6VLlwLlS7eOHj26ou7y5ctp3rx5pddr46WUGDZsGMceeyyNGjWqVDZgwABGjBjBsGHDeP311+nfvz8fffQRp512WkWd2267jWeeeYaZM2fyt7/9jZ/97Gecc845fOc73wFg0aJF9O7dm/79+3PQQQcB0KdPHw466CB69+5dsSSvJFW3ok8+3OdDUiG45557eOSRR5g1axYvvfQSI0aM2OjXXXnllcybN4969eqx//7706lTJ+bNm0fPnj0ZMGBApfqjRo3i0UcfZebMmcyYMYMrr7wSgBNPPJG//e1vFfXGjBlD69at2WuvvartHovJE088wVtvvVVpyNUqvXr14sYbb+TKK69kzz33ZNKkSYwZM4Z27dpV1HnzzTc56qij2GWXXbj88ssZOHAggwcPrig/++yzadCgAYMGDarU9vDhw3n55Ze56aabsndzkopa0ScfKaXRKaW+TZo0yXcokvSt/epXv6JNmzY0bdqU7t27M3369I163VFHHcXee+9N/fr1Oeqoo6hfvz4nnngitWvXplevXmv1XJx55plsu+22NG3alIEDB3LXXXcB8Itf/IIxY8awcOFCAEaOHMkJJ5xQvTdZRA4++GBSSnzve99bZ3m/fv149913+eqrr5g6dSpdunSpVH7NNdfw8ccfs2zZMmbMmMGAAQOI+M+y+8OHD+e1116rtBwvQNu2bfnss88455xzqv+mJAmTD0kqCKtPNm7QoAFffPHFRr1u9SVbS0pK1jpes51tt9224nm7du346KOPAGjTpg2dO3fm73//O59//jkPP/wwxx9//Le6F0lS4XLCuSQVqIYNG7J48eKK41X7QGyKDz74oOL5+++/T5s2bSqOTzrpJIYNG8aKFSvYf//9adu27SZfT5JUWOz5kKQCtccee/Dqq68yffp0li5dym9/+9tNbvOWW27hww8/ZP78+QwaNIhevXpVlP30pz/lxRdf5KabbuLEE0/c5GtJkgqPyYckFaj//u//5pJLLuGQQw5hp512Wmvlq2/juOOOo1u3buywww7suOOOXHzxxRVlJSUl9OjRg1mzZnH00Udv8rUkSYUn3M20XGlpaZoyZUq+w5BUA73++uvssssu+Q4j79q3b8+wYcM45JBD1lvn8ssvZ8aMGZVWvtqQ9f1+I2JqSql0I5rwg0wblO29eYqFexBpI8X6CpzzIUmqFvPnz2f48OGMHDky36FklX/EVg//iJWKk8OuJEmbbOjQoWy77bb86Ec/WmvZV0mSVinYno+I+AfwA+CxlFLPPIcjSZu9d999d71lffr0WeeGeJIkra6Qez5uAlxuRZIkSaohCjb5SCk9ASzKdxySCoOLc2SHv1dJKi45Tz4ioktEPBQRsyMiRcTJ66jTLyJmRcTSiJgaEQflOk5JWqVOnTosWbIk32EUpCVLllCnTp18hyFJypF89Hw0Al4B+gNrfZpHRC/Kh0xdBewFPA08HBHbrVZnekS8so5HmzXbk6RN1bJlS2bPns3ixYv9pr6apJRYvHgxs2fPpmXLlvkOR5KUIzmfcJ5SGgOMAYiIEeuoMgAYkVIamjk+KyIOA04HLsy0sWcOQpUkABo3bgzARx99xPLly/McTeGoU6cOrVq1qvj9SpIKX41a7Soi6gJ7A4PXKBoLHJCF6/UF+gJst912G6gtqZg1btzYP5IlSdpENW3CeXOgNlC2xvkyYJuqNBQR44F7gcMj4sOI2H/NOimlW1NKpSml0hYt3OxIkiRJyqYa1fNRnVJKh2xMvYjoDnTv0KFDliOSJEmSiltN6/mYB3wNtFrjfCvg42xcMKU0OqXUt0mTJtloXpIkSVJGjUo+UkrLgKnAoWsUHUr5qleSJEmSNlM5H3YVEY2AVWOcagHbRcSewPyU0vvADcDIiHgemAycBrQB/pyleBx2JUmSJOVAPno+SoFpmUcJcFnm+eUAKaW7gbOBi4HpwIHA4Sml97IRjMOuJEmSpNzIxz4fTwCxgTpDgCG5iMeeD0mSJCk3atScj3yw50OSJEnKjaJPPiRJkiTlhsmHJEmSpJwo+uQjIrpHxK0LFizIdyiSJElSQSv65MM5H5IkScVrzpw5nHTSSbRo0YL69evTsWNHnnzyyYrylBK//e1vadOmDSUlJfzgBz/g1VdfrdTGjBkz+OlPf0rz5s3Zcsst2W+//XjkkUcqyseOHUudOnV47rnnKr1u2LBhNGrUiJkzZ2b3JmuQok8+JEmSVJw+//xzOnfuTEqJf/3rX7z++uvcfPPNtGzZsqLOtddey/XXX8/NN9/MCy+8QMuWLTn00ENZtGhRRZ0jjjiCpUuX8thjjzFt2jQOPPBAfvKTn1QkFd26deOUU07hpJNOYsmSJQC8++67DBgwgMGDB7Pjjjvm9sbzKFJK+Y4hr1ZbarfPW2+9le9wJEkZETE1pVS6EVVz+kEWv/kkl5crWOmaFjm9nu9b9cj1+5ZtF110EU8++SSTJ09eZ3lKiTZt2nDmmWcycOBAAJYsWULLli0ZPHgwp556KvPmzaNFixZMmDCBgw8+GIAVK1ZQr1497r77bnr27AnAl19+yR577MGPf/xjbrzxRg4++GDq169fqYekgKx3W42i7/lw2JUkSVJxeuCBB9h3333p1asXLVu2ZM899+SPf/wjq76cnzVrFh9//DHdunWreE1JSQldunTh6aefBqBZs2bssssujBw5ki+++IKvv/6aW2+9lS233JLOnTtXvK5hw4aMGDGCW265heOPP55///vfDB8+PLc3XAPkfJNBSZIkqSZ45513GDJkCOeccw6/+c1vmD59OmeddRYAZ555Jh9//DEArVq1qvS6Vq1aMXv2bAAignHjxnHUUUfRuHFjatWqRdOmTXn44Ydp3bp1pdcdeOCB/OIXv+D2229n+PDhtG3bNgd3WbMUfc+HJEmSitPKlSvp1KkTV199NXvttRe9e/fmV7/6FbfccstGt5FSol+/fjRr1oynnnqK559/np49e9KjR4+KBGWVsrIy/vWvf9GgQQMmTpxY3bezWTD5kCRJUlFq3bo1HTt2rHRul1124f333wdgm222AcqThtWVlZVVlE2YMIHRo0dz11130blzZzp16sSQIUNo2LAht912W6XX9e3bl5122onx48fzt7/9jdGjR2fr1mqsok8+3OdD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation import OneHot\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Category\"]\n", + "sf_crime_df = sf_crime_df[columns]\n", + "objs = [\n", + " OneHot(\n", + " categories_dict={\n", + " \"Category\": [\n", + " \"WARRANTS\",\n", + " \"OTHER OFFENSES\",\n", + " \"LARCENY/THEFT\",\n", + " \"VEHICLE THEFT\",\n", + " \"VANDALISM\",\n", + " \"NON-CRIMINAL\",\n", + " \"ASSAULT\",\n", + " \"BURGLARY\",\n", + " \"SUSPICIOUS OCC\",\n", + " \"MISSING PERSON\",\n", + " ]\n", + " }\n", + " )\n", + "]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OneHot\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "3ff5163c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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WDKD3xdlX7pywPiJEbFXRJRHxEbAY2S6Wf0xIgZHxFHARP4zrmWlmdl6R0fE3tnXb0r9LiaT1DweEUMj4tDseVrxn+5iUi597R9RgXOAM8l0NfxfZP5PPlrj3/QzZHp21Hz8isyMeA8BpJReIzOBwk0R0RkgItqRmVziypTS1JxcmdRIIvMHraYnO8DypJXdrrK/rJYBP0op3VOj3vVA35TSt7ODJ98EBgCfAtOBb6WUPlrNOUYBowBat26923bbbZe7C5JUshYtWsScOXPYcccd2WST+ocUvPrqq2y66ab07t0bgKqqKt577z0++eQTqqqq2HTTTenRowevvfYaXbt2pVu3bgDMnz+fBQsW0K9fP2rOmDV79myWLl3KTjvtVL3vyy+/ZMGCBXzyySesWLGCFi1asMkmm7DZZpvRuXNnAJYuXcrMmTPZZpttaNu2ba0YKysreeONN+jUqRM9evTgq6++Yt68eXz88cd89dVXbLTRRnTs2JFOnTrVimX+/PksWrSIFSsyjRx9+/Zl4403ZvHixcyfP58vvviCjTfemK5du7JkyZLquKdPn74opdQxIo4js8J6T6AFsF9KaVJEzAYmpZSqpxR+/vnnOf/883nuuedIKbHnnnvyq1/9it13/89SH8OHD+exxx7j/fere3sBMGDAAAAmTZq0hk9UWrM2bdpw3XXXMXz4cABSSnTr1o2TTjqJ888/H8j8n+rUqRNjx47luOOOq/c42267LQMGDODmm2+u3ldVVcW+++5Lhw4d+Otf/8qRRx7JjBkzmDZtGhtttFHOr01aC7G6giY15mMNOpD5pVNRZ38FsD9ASunLiDiTzDSJGwBXrC7xyNa/GbgZoLy8PE2bNi0XcUuS1kFEzAFIKf0O+F3d8pRS7+zT6uRjjz324LHHHvva444bN67e/SYdyqVZs2axcOFCBg8eXL2vrKyM/v3788wzz9SbfEyaNIl33nmHO++sPancBhtswO233843v/lNfvzjH3PPPffwwgsvmHioWWhS3a4aQ0rpgZTStimlPtnk4mtFxJCIuPnTTz/NR3iSJKkELVyYmQhuZSvjSp07d64uq+vmm29ml112oby8fJWyPn36cPbZZ3PnnXfy85//nF122aXxg5ZyoDklH4vIrK7buc7+zvxnascGSyk9mFIa1a5du/WJTZIkqdF89NFH3H///YwcObLe8srKSu666y5atWrF008/TVPtRi/V1WySj+xUjtPJLEBV0yAyA7QkSZKapC5dMrNAV1TU7j1eUVFRXVbTH//4R1q0aMGPf/zjeo937rnn8uWXX/LCCy8wbdo0rrvuusYPWsqBJpV8RESbiNglInYhE1vP7PbKqXSvAoZHxLERsX1EXENmbY+b1uOcdruSJEk5teWWW9KlSxceffTR6n3Lly9nypQpfOtb31ql/q233soPf/hD6uuZ8eSTT3LDDTcwbtw4dtxxR6688kp+/vOf8+677+b0GqTG0NQGnJeTGSy+0pjs43ZgeErpzxGxBXABmennXgMOTCnNWdcTppQeBB4sLy+vv11TkoAlS5bwwQcfVM/YpPXXsmVLOnXqtMqsWlJz9dlnn/HPf2bWEa2qqmLu3LnMmDGD9u3b07NnT0477TQuu+wytttuO7bddlsuueQS2rRpwxFHHFHrOE8//TRvvPFGrRmuVlq6dCkjRozg1FNPZd999wVg5MiR3HfffYwYMYJJkyaxwQZN6m/LUi1NdqrdfHO2K0mrs2TJEioqKujevTtlZWW1ppHVukkpUVlZybx58+jcuXO9CUhETE8prTrStp7DNX6EUsNNmjSJ/fbbb5X9Rx11FOPGjSOlxJgxY/jd737Hxx9/zB577MH1119P3759V6n/4osv8sYbb6xyrGOOOYZnn32Wl156qdbU3fPmzaNv375ceOGFnH766Y1/cVLDrPYXZcknHxExBBjSp0+fke+8806hw5HUBP3zn/+kW7dutGrVas2V1SDLli1j/vz59OnTZ5Uykw9JarZWm3yUfLucs11JWpMVK1ZQVlZW6DCKUllZmV3ZJBXU5MmTOfjgg+nevTsRscpaQCklLrroIrp160ZZWRkDBgzg9ddfry6vqqri4IMPpmfPnmyyySZ07dqVn/zkJ8ybN6+6zsSJE2nZsiXPP/98rWPfeuuttGnTpqTG65R88iFJa8OuVrnh+1q/9b0Zmj17NscccwxbbbUVZWVlbLXVVpx33nlUVlZW1/FmSMr47LPP6Nu3L9dcc029f2i64ooruPLKK7n22mt58cUX6dSpE4MGDWLp0qXVdQYOHMjdd9/N22+/zX333ce//vUvDjnkkOrywYMHc+yxx3LUUUdV/z+cPXs2Z5xxBmPHjmXrrbfO/YU2FSmlkn4AQ4Cb+/TpkySpPm+88UahQ2gSevXqlR599NFGP+7q3l9gWlq77/Ki8/e//z2dd9556Z577kllZWXptttuq1V++eWXpzZt2qR77703vfrqq+mHP/xh6tq1a1qyZElKKaWHHnooHXXUUenhhx9O7777bvrb3/6WunXrlkaOHFnrOD/72c/SN77xjbRs2bKUUkqzZs1Km266abrxxhvzcp1SU9O6deta/9+qqqpSly5d0iWXXFK9b9myZalNmzbppptuWu1x/vrXvyYgVVZWVu/77LPP0tZbb51OOeWUVFVVlb797W+n7373uzm5jiZg9ffeX1dYSo/ddttt3d9eSUXN5CPD5KMwGutm6Prrr0/t27evta/EboakNar7/+3dd99NQHrhhRdq1TvwwAPTkUceWe8xPvroo3T44YenPfbYY5WyKVOmpBYtWqQf/ehHabPNNkvvv/9+o8bfhKz2O7upTbUrSc3Cc/1z20S+52S7vKh+s2bNYuHChQwePLh6X1lZGf379+eZZ57huOOOq/d1S5YsYfPNN6+1r3Xr1owbN44BAwbw4Ycf8o9//IPXXnstp/FLzcnChQsB6Ny5c639nTt3rjWmAzILP1533XUsW7aMPffck7/97W+rHG+fffbhJz/5Cbfffju///3v6d69e+6Cb6JMPiSpmevduzfHHXcc48ePZ8GCBfzgBz/gxhtvpLKykp/+9Kc8//zzfPnll+y9997cdNNN/Nd//RcAAwYMYN999+WJJ57glVdeYa+99uLOO++kQ4cOAIwfP54LLriAzz77jDPOOKPWOV944QVOPfVU3nzzTcrKyhg6dChXXXUVG220ESklzjjjDO644w6WL19Or169uOuuu1aZTlTrpiE3QyvNmTOHsWPH8otf/GKVslK5GYqff1joEIpCurxjoUNoss4++2yOOeYY5syZw5gxY/jJT37CQw89VGtsW0VFBX//+99p1aoVkydP5uijjy5gxIVR8gPOXeFcUjG44447eOSRR3j33XeZOXMml1xyCVVVVYwYMYI5c+Ywd+5cysrKOOmkk2q97s477+S2227jgw8+4IsvvmDs2LEAvPHGGxx//PGMHz+e+fPn89FHH/H+++9Xv65Fixb85je/YdGiRTz77LM8/vjj3HDDDUBmIPPkyZOZOXMmn376KXfffTdbbLFF/t4M1VJRUcEBBxzAoEGD6l3/oe7NkKT/6NKlC5D5f1JTRUVFddlKHTp0YNttt2XQoEH8v//3/3jkkUd4+umna9UZNWoU22yzDY899hh/+tOfePDBB3N7AU1QyScfyal2JRWBk046iR49etC+fXvOP/987rrrLrbYYguGDh1Kq1at2HTTTTn//PN56qmnar1uxIgRbLvttpSVlXH44YczY8YMAO69914OOugg+vfvz8Ybb8zFF19ca9Xk3XbbjT333JMNN9ywuuVl5bFbtmzJ0qVLeeutt0gpsf3229O1a9f8vRlFriE3QwsXLmS//fajb9++jB8/vt7ZxbwZklZvyy23pEuXLjz66KPV+5YvX86UKVP41re+tdrXVVVVAfD5559X7xs3bhyPPfYYt99+O3vttRfnnnsuxx13HIsXL87dBTRBJZ98SFIx6NGjR/XzXr16MX/+fJYtW8Zxxx1Hr169aNu2Lf379+eTTz7hq6++qq5b82a1VatWfPbZZwDMnz+/1jFbt25dq/Vi5syZHHTQQXTp0oW2bdvyi1/8gkWLFgGZKSdPOukkTjzxRDp16sSoUaNYsmRJzq691KztzdCCBQsYMGAA22+/PXfddRcbbrhqT2tvhqTMVLszZsxgxowZVFVVMXfuXGbMmMHcuXOJCE477TT++7//m/vvv5/XXnuN4cOH06ZNG4444ggAnn32Wa6//nr+8Y9/MGfOHJ544gl+9KMf0bt3b/bZZx8A3nvvPU499VQuv/xyttlmGwBGjx5Nhw4dOPnkkwt27YVg8iFJReC9996rfj537ly6devGlVdeydtvv83zzz/PkiVLqrvUpLTmBcG7du1a65jLli3jo48+qt4+/vjj2W677XjnnXdYsmQJl112Wa3jnnLKKUyfPp033niDmTNn8utf/7oxLrNkrO/N0Pz58/n2t79Nly5duPrqq1m0aBELFy5k4cKF1cmnN0NSxrRp09h1113ZddddqaysZPTo0ey6665ceOGFAJxzzjmcfvrpnHjiiZSXl7NgwQImTpzIpptuCmQmfLj33nsZOHAg3/jGNzjmmGPYeeedmTJlCptssgkpJY4++mjKy8trdX3daKON+OMf/8g999zD//zP/xTk2gvBAeeSVASuv/56DjroIFq1asWll17KsGHDWLp0KWVlZWy22WYsXryYMWPGrPXxDjvsMPbYYw+efvppdt99dy688MLqbgQAS5cupW3btrRp04a33nqLG2+8kY4dMwNRX3zxRaqqqujXrx+tW7dmk002qdVlS2s2bdo09ttvv+rt0aNHM3r0aI466ijGjRvHOeecQ2VlJSeeeCIff/wxe+yxR62boYkTJ/LOO+/wzjvv0LNnz1rHnjVrFr169fram6Hdd9+dww47rNYiaVKxGjBgwNf+USYiuOiii7jooovqLd9ll1148sknv/b1NVsq6772iy++aFC8zV3J/zZwwLmkYnDEEUcwePBgttpqK7beemsuuOACTjvtNCorK+nQoQN77rknBxxwwFofb8cdd+T666/niCOOoGvXrmy++ebVs2QBjB07ljvvvJNNN92UkSNHMmzYsOqyJUuWMHLkSDbffHN69erFFltswdlnn92o11vsVt4M1X2sXOl85c3QggULWL58OU899VSt2cSGDx++2jn2e/fuXX0z9Pjjj68yDmTlzZCJh6RciLVpfi8F5eXladq0aYUOQ1IT9Oabb7L99tsXOozV6t27N7feeiv7779/oUNZJ6t7fyNiekqpfC0O4S8yrZFT7TYOp9rVWlp1douskm/5kCRJkpQfJh+SJEmS8sIB55LUzM2ePbvQIUiStFZMPiRJktQkOVancTSlsToln3xExBBgSJ8+fQodiiSpGfBmqHE0pZshSflT8mM+UkoPppRGtWvXrtChSJIkSUWt5JMPSZIkSflh8iFJkiQpL0w+JEmSJOWFyYckSZKkvCj52a4kaV3kesYjZwKSJBUjWz4kqZnr3bs3Y8eOZeedd6Zdu3YMGzaM5cuXM27cOPbZZ59adSOCf/7znwAMHz6cE044ge9973u0adOGvffem4ULF3Laaaex+eabs9122/Hyyy/XOs+vfvUrdthhBzbffHNGjBjB8uXLAejbty8PPvhgdd0VK1bQoUOHWq+XJKnkk4+IGBIRN3/66aeFDkWS1tndd9/Nww8/zKxZs3jllVcYN27cWr/ukksuYdGiRWy88cbstdde9OvXj0WLFnHYYYdxxhln1Kp/xx138Mgjj/Duu+8yc+ZMLrnkEgCOPPJI/vSnP1XXmzBhAl27dmXXXXdttGuUJDV/JZ98uM6HpGJwyimn0K1bN9q3b8+QIUOYMWPGWr3ukEMOYbfddmOTTTbhkEMOYZNNNuHII4+kRYsWDBs2bJWWi5NOOokePXrQ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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation import PlaneRotation\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "# sf_crime_df = sf_crime_df[columns]\n", + "objs = [PlaneRotation(columns=[[\"X\", \"Y\"]], theta_vec=[45.0])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"PlaneRotation\")\n", + "# error in documentation check constructor syntax" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "5c82c493", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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mlim3lDgBymlPbL7fYDryLTqXJtSumNz7te9e/c0adKkTVeUpC/hnXfeYc899+TOO+/kxz/+cb7D2SpExOSUUvfNqFo7/5CpqG0q+fj888+5+eabueKKK5gxYwatW7fm2Wef5aijjuLDDz+kZcuWpXX33ntvTj75ZIYPH15a9sILL3DEEUdwyimn8OSTTzJt2jTat3eYq2qNjSYftWrAeXVIKT1BZpaRzRIRvYHenTp12mRdSaqquXPn8u677zJs2DDatm3rt99Skfvb3/7G//zP/7B8+XLatm3LuHHjaN060+tqwYIF1K1bd4NWwtatW7NgwYJyZYceeig//OEPuffee7n77rtNPLTVqFVjPjZhEZmFqFpXKG9NZorJLyWlNDqlNKBJkyZbEpskVequu+6iR48elJSUcP/991O/fmXjoKXyJk6cSJ8+fWjfvj0RwciRI0uPrV69mosvvph9992Xhg0blia1s2eXH/6yYMECTjvtNNq0aUODBg3Yb7/9GDXqv5OsTZs2je23355HHnmk3Hnjx4+nXr16vPjiizX6jMXqyCOPZMqUKbz00ksce+yxnHLKKXzwQWWzZ3+xkpIS/v73v9OgQQMmTpy46ROkWmKrST5SSp+TGcNxdIVDR5OZ9UqSap3LLruMdevW8fbbb/PNb250LUKpnGXLlrHPPvtw0003bZCwLl++nNdff51LLrmE119/nccff5w5c+Zw7LHHsmZN6dqTnH766UyfPp3HH3+cadOmcfrpp3PaaaeVflDdZ599GD58OD/96U8pKSkBMuOJ+vXrxwUXXMAhh1ScSEzVoWHDhnTq1IkDDzyQu+++m3r16nHXXXcB0KZNG9auXcuiRYvKnVNSUkKbNuVn2B4wYACdO3dm/Pjx/PnPf2b06NE5ewZpS9Sq5CMiGkXE/hGxP5nYds7ur59K9wbgzOx0cntGxE1k1vb40jPHZGeLuWPJkiVb/gCSJFWD4447jquvvpqTTz6ZOnXK/6lu0qQJ48aNo2/fvuyxxx584xvf4I9//CPTp09n+vTppfVeeuklzj33XA444AB23XVXLrjgAnbaaSdee+210joXXXQRu+++OwMGDABg4MCBNG3alMsvvzw3DyrWrVvHqlWZGaK7detGvXr1GDduXOnxuXPnMn36dA4++L8z8o4cOZLx48dz7733ctBBB3HxxRdz1llnsXhxjSz1I1Wr2jbmozswocz+8Ox2L3BmSukvEdEcuJTMdJXTgONSSu9/2RumlEYDo7t3797/y4ctqdAtXbqUDz/8kNWrKy51oS+rXr16tGrVisaNG+c7lK3e0qWZZWOaNm1aWnbooYfy4IMP0qdPH5o2bcro0aNZuHAhPXv2LK1Tp04d7r33Xvbbbz9+8IMf8NBDD/Haa6+x7bYV12LU5li2bBnvvptZo3TdunXMnj2bKVOm0KxZM3bccUeuvfZaevfuTdu2bVm4cCG33norc+fO5ZRTTgEyieWPf/xjfv7zn9OqVSuaN2/OkCFD2HfffUv/3ebMmcOgQYO45ppr6Ny5MwDDhg1j9OjRDBw4sFzXOqlWSim5pUS3bt2SJFVmyZIlacaMGemzzz5L69aty3c4BWHdunXps88+SzNmzEhLliyptA4wKW3e7/CC1rBhwzRixIiNHl+1alU6+OCDU+/evcuVL1myJH3rW99KQNpmm21Sw4YN02OPPVbpNYYNG5aA9L//+7/VGXrRmTBhQiIz+1q57YwzzkifffZZ+u53v5vatm2btt1229S2bdvUp0+f9Morr5S7xsqVK9N5552XmjVrlurXr5+OP/74NHv27JRS5v+bnj17ph49emzwu+iNN95I9erVS48++mjOnlf6Ahv9nV1rp9rNlTKzXfX/97//ne9wJNVC7777Lu3ataNBgwabrqwqWb58OfPnz6eyGQedajfji6ZsXbNmDaeeeipvvfUWEydOpHnz5qXHzj//fF555RV+/etf06JFCx577DFuuOEGJk6cyH777Vdab8WKFey///7MnTuXAw44gGeeeYaIjc6SKUmbY6O/RGrVmI98SM52JWkTVq9e7SxVNaR+/fp2ZfuS1qxZw/e//32mTp3KM888Uy7xmDlzJrfccgt33nknRx11FPvttx/Dhg3j61//Orfccku561x88cWsWbOG1157jUmTJvH73/8+148iqYgUffIhSZvDb4Jrhu/rl7N69Wr69u3L1KlTmTBhwgYzIS1fvhyAunXrliuvW7cu69atK92fMGECt912GyNHjmTvvffm+uuv5xe/+AUzZ86s+YeQVJSKPvlwtitJ2jwdO3Zk/Pjx+Q6jKCxbtowpU6YwZcqUcgOXZ8+ezZo1a/je977HK6+8wgMPPEBEsGDBAhYsWMCKFSsA+OpXv0qnTp0455xzeO2115g5cybXX38948aN44QTTgDg008/pV+/fgwaNIjDDjsMgP79+3PYYYfRr1+/ckmKJFWXok8+7HYlSaptJk2aRJcuXejSpQsrVqxg2LBhdOnShaFDhzJ37lwef/xx5s+fT7du3Wjbtm3p9pe//AXIzCQ2ZswYWrZsSe/evdl3333505/+xIgRI+jduzcAgwcPpkGDBlx11VXl7n333Xfz5ptvctNNN+X8uSUVvto21a4kbRVeOXy3Gr3+gRPt9lLMjjjiCL5oQpjNmSymc+fOG6xeXtbdd99daXn79u35+OOPNx2kJH0JJh+StJXr2LEjZ511Fvfddx8ffPAB3/3ud/nDH/7AihUrOO2003j11VdZs2YNhxxyCLfffjtf+cpXgMwH3MMOO4xnn32WqVOnctBBB3H//ffTokULAO677z4uvfRSli1bxpAhQ8rd87XXXmPQoEFMnz6d+vXrc9JJJ3HDDTew7bbbklJiyJAhjBo1ipUrV9KhQwceeOAB9tlnn5y/N9J68YuF+Q6hIKRrWuY7BG3lir7blWM+JBWCUaNG8fTTTzNz5kxmzJjBlVdeybp16+jXrx/vv/8+s2fPpn79+px33nnlzrv//vsZMWIEH374IZ9//jnXXXcdAP/61784++yzue+++5g/fz4fffQRc+fOLT2vbt26/O53v2PRokW8/PLLPPPMM9x2220AjB07lokTJzJjxgyWLFnCgw8+WG4mJklS8Sr65MMxH5IKwXnnncdOO+1Es2bNuOSSS3jggQdo3rw5J510Eg0aNGCHHXbgkksu4R//+Ee58/r168fuu+9O/fr1OeWUU5gyZQoADz/8MMcffzyHH3442223HVdccQV16vz3T0a3bt048MAD2WabbUpbXtZfu169enz66ae8/fbbpJTYc889adu2be7eDElSrVX0yYckFYKddtqp9HWHDh2YP38+y5cv56yzzqJDhw40btyYww8/nE8++YS1a9eW1i07RWuDBg1YtmwZAPPnzy93zYYNG5ZrvZgxYwbHH388bdq0oXHjxvzqV79i0aJFAPTo0YPzzjuPc889l1atWjFgwACWLl1aY88uSdp6OOZDkgrAnDlzSl/Pnj2bdu3acf311/POO+/w6quv0qZNG6ZMmUKXLl02a7By27ZtmT59eun+8uXL+eijj0r3zz77bLp06cIDDzzADjvswI033sjDDz9cevz888/n/PPP58MPP+SUU07ht7/9LVdccUU1PW1+OXagejh2QCpOtnxIUgG49dZbmTt3LosXL+aqq66ib9++fPrpp9SvX58dd9yRxYsXM3z48M2+3sknn8zf/vY3XnjhBT7//HOGDh1abt2HTz/9lMaNG9OoUSPefvtt/vCHP5Qe++c//8mrr77K6tWradiwIdtvv325LluSpOJV9H8NHHAuqRCceuqp9OrVi1133ZXddtuNSy+9lMGDB7NixQpatGjBgQceyLHHHrvZ19t777259dZbOfXUU2nbti1NmzYtnSUL4LrrruP+++9nhx12oH///vTt27f02NKlS+nfvz9NmzalQ4cONG/enIsuuqhan1eStHWKzWl+Lwbdu3dPkyZNyncYkmqh6dOns+eee+Y7jI3q2LEjd911Fz179sx3KF/Kxt7fiJicUuq+GZfI6R8yu11Vj1x3u/LfrXrYXU6bKTZ2oOhbPiRJkiTlhsmHJEmSpJxwtitJ2sq99957+Q5BkqTNYsuHJEmSpJwo+uTD2a4kSZKk3Cj65COlNDqlNKBJkyb5DkWSJEkqaEWffEiSJEnKDZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWE63xI0pcQv1hYo9dP17Ss0etLkpQPtnxI0lauY8eOXHfddey77740adKEvn37snLlSkaOHMmhhx5arm5E8O677wJw5plncs455/Ctb32LRo0accghh7BgwQIGDx5M06ZN+epXv8obb7xR7j6//vWv2WuvvWjatCn9+vVj5cqVAOyzzz6MHj26tO7q1atp0aJFufMlSSr65MN1PiQVggcffJCnnnqKWbNmMXXqVEaOHLnZ51155ZUsWrSI7bbbjoMOOoiuXbuyaNEiTj75ZIYMGVKu/qhRo3j66aeZOXMmM2bM4MorrwTg9NNP589//nNpvTFjxtC2bVu6dOlSbc8oSdr6FX3y4TofkgrB+eefT7t27WjWrBm9e/dmypQpm3XeCSecQLdu3dh+++054YQT2H777Tn99NOpW7cuffv23aDl4rzzzmOnnXaiWbNmXHLJJTzwwAMA/PCHP2TMmDEsXboUgPvuu4/TTjuteh9SkrTVK/rkQ5IKQZs2bUpfN2jQgGXLlm3Wea1bty59Xb9+/Q32K15np512Kn3doUMH5s+fD0C7du045JBDeOSRR/jkk0948skn+cEPfvClnkWSVLgccC5JBaphw4YsX768dH/BggVbfM05c+aUvp49ezbt2rUr3T/jjDO46667WLNmDQcddBDt27ff4vtJkgqLLR+SVKD2228/3nrrLaZMmcLKlSu57LLLtviat956K3PnzmXx4sVcddVV9O3bt/TYd7/7XV5//XVuuukmTj/99C2+lySp8Jh8SFKB2n333Rk6dCg9e/akc+fOG8x89WWceuqp9OrVi1133ZXddtuNSy+9tPRY/fr1Oemkk5g1axYnnnjiFt9LklR4IqWU7xhqhe7du6dJkyblOwxJtdD06dPZc8898x1G3nXs2JG77rqLnj17brTO5ZdfzowZM8rNfLUpG3t/I2JySqn7Zlwip3/IanqNl2KR67Vs/HerHq5BpM0UGztgy4ckqVosXryYu+++mwEDBuQ7FEnabBMnTqRPnz60b9+eiNhgqvJHH32UY445hpYtWxIRPPfccxtcY9WqVQwcOJAWLVrQsGFD+vTpw9y5c0uPjx07lnr16vHqq6+WO++uu+6iUaNGzJw5syYerVYy+ZAkbbE777yTnXbaiW9961scfvjh+Q5HkjbbsmXL2GeffbjpppuoX7/+Bsc/++wzDj74YG644YaNXmPw4ME88sgjPPDAAzz//PMsXbqU448/nrVr1wLQq1cvfvKTn3DGGWewYsUKAN577z2GDBnCddddx2677VYzD1cLFWy3q4j4K3AE8ExK6eRN1bfblaSNsdtVzbLbVXGy29XWqdC7XTVq1Ijf//73nHnmmRscW7RoES1btmTChAkcccQRpeVLliyhZcuWjBgxonSK8Tlz5tChQweefPJJjjnmGCCTxOy33358+9vf5sYbb+TII49k++2356mnnsrFo+XaRrtdFfJUuzcB9wBn5DsQSZIkFabJkyezevVqevXqVVq20047seeee/LSSy+VJh8NGzZk5MiRHHHEESxcuJD/+7//Y9q0afkKO28KtttVSuk54NN8xyGpMBRqK3G++b5K2totWLCAunXr0qJFi3LlrVu33mB9pUMPPZQf/vCHPPDAA1x//fVFuR5SzpOPiDg8Ip6IiHkRkSLizErqnBMRsyJiZURMjojDch2nJK1Xr1690j66ql4rVqygXr16+Q5DknKipKSEv//97zRo0ICJEyfmO5y8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f1tEtjoOOJek4jN58mT22GMPRo0axV133cXSpUsBGDduHJdcckmeo5OkwlWV5ONcMgsNtgROTiktzpZ3BR6o7sAkSaopF154IYMGDeKNN95gu+22Ky0/5phjePHFF/MYmSQVts0e85FSWgoMrKR8WLVGJElSDZs8eXKls1q1bduWkpKSPEQkScXhC1s+ImKHqlysqvUlScqH+vXr8/HHG66f+/bbb9OqVatKzpAkVYdNdbv6d0RcGhFf2ViFiKgTEd+KiHFkumZJklSrfec732H48OGsWrUKgIjgvffe4+KLL+akk07Kc3SSVLg21e3qMOAq4D/ZKXUnAfOBlUBTYC/gQGAFcDVwZ82FWjMiojfQu1OnTvkORZKUI9dddx3HHXccLVu2ZPny5Rx66KGUlJRwyCGHcOWVV+Y7PEkqWF+YfKSU/g2cEhE7kVlU8DDgG0B9YBHwBnAHMCaltK6GY60RKaXRwOju3bv3z3cskqTcaNy4MS+88ALPPvssr7/+OuvWraNr16707Nkz36FJUkHbrAHnKaU5ZFYxdyVzSVLB6NGjBz169Mh3GJJUNKoy1a4kSQXjtttuY++996ZBgwb85z//AeCaa67hwQcfzHNkklS4TD4kSUXnxhtv5Morr2TAgAGklErL27dvz+9///s8RiZJhc3kQ5JUdG6//XbuvPNOBg0axDbb/LcHcteuXXnrrbfyGJkkFTaTD0lS0Xn//ffZZ599NiivV68eK1asyENEklQcTD4kSUVn11135fXXX9+gfMyYMey11155iEiSisNmzXa1XkS0Bk4DdgP+N6W0KCIOAeanlGbVRIA1zXU+JKn4XHjhhZx33nksX76clBIvv/wy9913H9deey333HNPvsOTpIK12clHRHQDngFmAXsDvyWz1sfRwO7AqTURYE1znQ9JKj79+vVjzZo1/OpXv2L58uWcdtpptGvXjptvvpm+ffvmOzxJKlhVafm4DrgppTQsIj4tU/400K96w5IkqWb179+f/v37s2jRItatW0erVq3yHZIkFbyqJB/dgB9XUv4B0Lp6wpEkKXdmzpzJ9OnTAdhrr73Ydddd8xyRJBW2qiQfK4CmlZR/FfiwesKRJKnmffTRR/z4xz/miSeeoE6dzNwrKSWOP/547rnnHpo3b57nCCWpMFVltqvHgWERsV12P0VER+A3wCPVHJckSTXmJz/5Ce+++y7PP/88K1euZOXKlUycOJFZs2bRv79DACWpplSl5eNCYAywEGgAvECmu9WLwKXVH1rheuXw3fIdwmY5cOLMfIcgSTXi6aef5plnnuGggw4qLTvkkEP44x//SM+ePfMYmSQVts1OPlJKS4FDI6IH0JVMq8nrKaXxNRWcVJuYNEqFo2XLljRs2HCD8gYNGtjlSpJqUJUXGUwpPZtSui6ldK2JhyRpazR06FAGDx7MvHnzSsvmzZvHBRdcwNChQ/MYmSQVtqouMtgFOBJoRYXEJaX082qM60uLiB2B8WSebRsy0wPfmd+oJOXT1tBqZYtVbt1444289957dOzYkfbt2wOZ5GP77bfnww8/5Oabby6tO3Xq1HyFKUkFpyqLDP4cuAZ4HygBUpnDqdKT8uNT4PCU0vKIaAhMi4hHU0of5TswSVLtcPLJJ+c7BEkqSlVp+fgZcHZK6Y81FUx1SCmtBZZnd7cDIrtJkgTAsGHD8h2CJBWlqoz5qAM8syU3i4jDI+KJiJgXESkizqykzjkRMSsiVkbE5Ig47EvcZ8eI+D9gLvDblNKiLYlbklRYFi5cyMKFC0v333zzTS699FIeeOCBPEYlSYWvKsnHH4B+W3i/RsA0YBCZRQvLiYi+wE3A1UAX4CXgyYjYuUydKRExrZKt3fo6KaVPUkr7AbsAp0aEK7BLkkqdcsopjB49GoBFixZx+OGH89e//pWf/vSnXH/99XmOTpIKV1W6XQ0HxkTEG2QSiNVlD6aUfrSpC6SUxpBZK4SIGFlJlSHAyDIDxAdGxLHA2cAvs9fYf3MDTimVZFtADgMe3tzzJEmFberUqRx44IEAPPzww3Tq1Il//vOfPP7441x00UVccMEFeY5QkgpTVVo+rgJ6AWuApkDLCtsWiYhtgW7A2AqHxgIHV+E6rSNih+zrJsDhwDsbqTsgIiZFxKSyze+SpMK2YsUKGjVqBMD48ePp06cPAF27dmXOnDn5DE2SClpVko9zgFNTSl9PKR2fUupddquGWFoAdcnMpFVWCdCmCtfpADyfbfF4HrglpfRmZRVTSneklLqnlLq3bLnF+ZMkaSvRuXNnHn30UebMmcPYsWPp1asXACUlJey44455jk6SCldVko8VwBs1FUh1SSm9llLaP6W0X0pp303NzhURvSPijiVLluQqRElSng0bNoyLL76Yjh07cuCBB3LAAQcA8PTTT9OlS5c8RydJhasqycfvgMERUVPT1i4C1gIVB4e3BhbU0D1JKY1OKQ1o0qRJTd1CklTLnHjiicyePZtJkybx1FNPlZb37NmTG264IY+RSVJhq8qA88PIjJ/4dkT8iw0HnPfZkkBSSp9HxGTgaOChMoeOBh7ZkmtLklRR69atad26/Pdd61tAJEk1oyrJxyLg0S25WUQ0Ajpld+sAO0fE/sDilNJs4Abgvoh4DXgR+CnQDrh9S+67iZh6A707deq0ybqSJEmSvrzNTj5SSlu6xgdAd2BCmf3h2e1e4MyU0l8iojlwKdCWzJS+x6WU3q+Ge1cqpTQaGN29e/f+NXUPSZIkSVVr+dhiKaXngC8cM5JSug24LScBSZIkScqZL0w+ImIq8M2U0scR8SaQNlY3pbRvdQeXC3a7kiRJknJjUy0fjwCryrzeaPKxtbLblSQVp5KSEu677z5mzpzJFVdcQYsWLXjxxRdp164du+yyS77Dk6SC9IXJR0ppeJnXl9V4NJIk5cDkyZM56qij2GWXXXjrrbe46KKLaNGiBePGjWPGjBncf//9+Q5RkgrSZq/zERHPRsQGy75GROOIeLZ6w8odFxmUpOJz4YUXMmjQIN544w2222670vJjjjmGF198MY+RSVJhq8oig0cA21ZSvj2ZNUC2Si4yKEnFZ/LkyZxxxhkblLdt25aSkpI8RCRJxWGTs11FRNcyu/tGxOIy+3WBY4B51R2YJEk1pX79+nz88ccblL/99tu0atUqDxFJUnHYnKl2J5EZaJ6AsZUcXwEMrM6gJEmqSd/5zncYPnw4Dz30EAARwXvvvcfFF1/MSSedlOfoJKlwbU63q12A3cisz/GN7P76rT3QOKV0T41FWMMc8yFJxee6665j8eLFtGzZkuXLl3PooYfSqVMndtxxR6688sp8hydJBWuTLR9lVhevyviQrYZT7UpS8WncuDEvvPACzz77LK+//jrr1q2ja9eu9OzZM9+hSVJBq9IK5xHxFeBwoBUVkpGU0g3VGJckSTWuR48e9OjRI99hSFLR2OzkIyJ+ANwDrAEWUn7BwQSYfEiSthpvvPEGEyZM4MMPP2TdunXljl177bV5ikqSCltVWj4uB64H/jeltLaG4sm5iOgN9O7UqVO+Q5Ek5ci1117LL37xCzp06EDr1q2JiNJjZV9LkqpXVZKP1sBdhZR4gGM+JKkY/e53v+MPf/gDZ511Vr5DkaSiUpVB5GOAA2oqEEmScmXdunUcddRR+Q5DkopOVVo+xgG/iYi9gTeB1WUPppQerc7AJEmqKWeffTYjRozgqquuyncoklRUqpJ8/DH781eVHEtkVjuXJKnWGzZsGMcddxxdunRhn332oV69euWO33PPVrt8lSTVapudfKSUCnKdD0lS8bnkkksYO3YsXbt25eOPP3aQuSTlSJXW+ShEznYlScXntttu4/7776dv3775DkWSikpV1vkY8kXHt9ZFBp3tSpKKT/369enSpUu+w5CkolOVlo+BFfbrAW2BFcCHuMigJGkr8bOf/Ywbb7yRW2+91S5XkpRDVRnzsUvFsohoDYwA7qzOoCRJqknPP/88EydO5O9//zt77bXXBgPOn3jiiTxFJkmFbYvGfKSUSiLiEuBB4K/VE5IkSTWrRYsWnHjiifkOQ5KKTnUMOK9DZvVzSZK2CiNGjMh3CJJUlKoy4LziV0RBZszHucDz1RmUJEmSpMJTlZaPhyvsJ2Ah8CxwQbVFJElSDdh33335xz/+QdOmTfna1772hQPNp06dmsPIJKl4uMigJKkonHTSSWy33Xalr53lSpJyb7OSj4ioB7wAnJ5SeqdmQ8otFxmUpOIwbNiw0teXXXZZ/gKRpCK2Wa0ZKaXVwC5kuloVlJTS6JTSgCZNmuQ7FElSjvTo0YNPPvlkg/KlS5fSo0ePPEQkScWhKl2p7gVcBVyStNV77rnn+PzzzzcoX7lyJc8/7xwqklRTqjLgvCHwg4g4GpgMfFb2YErp/OoMTJKk6vb666+Xvp46dSrNmjUr3V+7di1PP/007du3z0doklQUqpJ87Ams/629a4VjBdcdS5JUeLp3705EEBH06tVrg+P169fnlltuyUNkklQcqjLb1ZE1GYgkSTVt1qxZpJTYddddee2112jZsmXpsW233ZZWrVpRt27dPEYoSYWtOlY4lyRpq9ChQwcA1q1bl+dIJKk4mXxIkorS3LlzmThxIh9++OEGyciQIUPyFJUkFTaTD0lS0Rk1ahQ/+tGP2GabbWjZsmW5BQcjwuRDkmpIwSYfEdEAmA48lFK6MN/xSJJqj6FDh3LBBRdwxRVXOMZDknKoKut8bG0uAV7JdxCSpNqnpKSEn/zkJyYekpRjBZl8RERn4KvAk/mORZJU+xx33HG8+uqr+Q5DkopOTrtdRcThwIVAN6Ad0C+lNLJCnXOAi4C2wFvA4JRSVZebvS57jYO3NGZJUuE5+uijufjii3nrrbf42te+Rr169codP/HEE/MUmSQVtlyP+WgETAP+lN3KiYi+wE3AOcAL2Z9PRsReKaXZ2TpTqDzuXiml+RHxHWBGSmlGRJh8SJI2cNZZZwFw9dVXb3AsIli7dm2uQ5KkopDT5COlNAYYAxARIyupMgQYmVK6M7s/MCKOBc4Gfpm9xv6buM2BwP9ExPfIJDv1ImJpSunyangESVIBcJ0PScqPWjPmIyK2JdMda2yFQ2OpQveplNIvU0o7pZQ6kunidefGEo+IGBARkyJi0sKFC79k5JIkSZI2R22aarcFUBcoqVBeAvSsiRumlO4A7gDo3r17qol7SJJqnxtuuOELj7vOhyTVjNqUfFS7ioPZKxMRvYHenTp1qvmAJEm1wi233FJuf/Xq1XzwwQfUr1+fVq1amXxIUg2pTcnHImAt0LpCeWtgQU3dNKU0GhjdvXv3/jV1D0lS7TJr1qwNykpKSujXrx/9+/vnQJJqSq0Z85FS+hyYDBxd4dDRwEs1dd+I6B0RdyxZsqSmbiFJ2gq0bt2aq666ip///Of5DkWSClZOk4+IaBQR+0fE/tl775zd3zlb5QbgzIj4SUTsGRE3kVkP5PaaiimlNDqlNKBJkyY1dQtJ0lZi3bp1lJRUHHooSaouue521R2YUGZ/eHa7FzgzpfSXiGgOXEpmkcFpwHEppfdzHKckqYA9+uij5fZTSnzwwQfceuutHHbYYXmKSpIKX67X+XgOiE3UuQ24LScB4YBzSSpGJ598crn9iKBly5b06NGD66+/Pk9RSVLhq00DzvPCAeeSVHxcZFCS8qPWDDiXJCkXVq9ezQEHHMA777yT71AkqegUffLhbFeSVFzq1avHrFmziPjCXsCSpBpQ9MmHs11JUvE544wzuPPOO/MdhiQVnaIf8yFJKj6fffYZo0aNYty4cXTr1o2GDRuWO37zzTfnKTJJKmwmH5KkojN9+nS6du0KwH/+859yx+yOJUk1p+iTD6falaTiM2HChE1XkiRVO8d8OOZDkiRJyomiTz4kSZIk5YbJhyRJkqScMPmQJEmSlBNFn3y4yKAkSZKUG0WffDjgXJIkScqNok8+JEmSJOWGyYckSZKknDD5kCRJkpQTJh+SJEmScqLokw9nu5IkSZJyo+iTD2e7kiRJknKj6JMPSZIkSblh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOFH3y4SKDkiRJUm4UffLhIoOSJElSbhR98iFJkiQpN0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScsLkQ5IkSVJObJPvAGpCRLwHLAXWAR+nlI7Mb0SSJEmSCjL5yDo4pbQs30FIkiRJyijk5EOSthrxi4X5DmGT0jUt8x2CJGkrl9PkIyIOBy4EugHtgH4ppZEV6pwDXAS0Bd4CBqeUnq/irRLwj4hYB9yYUhq1pbEXIz8MSZIkqTrluuWjETAN+FN2Kyci+gI3AecAL2R/PhkRe6WUZmfrTKHyuHullOZnXx+aUpoXEW2B8RHxZkppavU/jlT7mDRKkqTaKqfJR0ppDDAGICJGVlJlCDAypXRndn9gRBwLnA38MnuN/TfjPvOyPz+IiDFAV8DkQ5IkScqjWjPVbkRsS6Y71tgKh8YCB1fhOg0jYofs60ZADzLdtyqrOyAiJkXEpIULa/+3xZIkSdLWrNYkH0ALoC5QUqG8BGhTheu0Bl6IiP8DXgH+lFL6Z2UVU0p3pJS6p5S6t2xpNxBJkiSpJhXcbFcppf8A+21u/YjoDfTu1KlTzQUlSZIkqVa1fCwC1pJpuSirNbCgpm6aUhqdUhrQpEmTmrqFJEmSJGpR8pFS+hyYDBxd4dDRwEu5j0iSJElSdcr1Oh+NgPX9m+oAO0fE/sDi7FS6NwD3RcRrwIvAT8msB3J7DcZktytJkiQpB3Ld8tEdeCO71QeGZ19fDpBS+gswGLgUmAIcChyXUnq/pgKy25UkSZKUG7le5+M5IDZR5zbgtpwEJEmSJClnas2Yj3yJiN4RcceSJUvyHYokSZJU0Io++bDblSRJkpQbRZ98SJIkScqNok8+7HYlSZIk5UbRJx92u5IkSZJyo+iTD0mSJEm5YfIhSZIkKSeKPvlwzIckSZKUG0WffDjmQ5IkScqNok8+JEmSJOWGyYckSZKknDD5kCRJkpQTRZ98OOBckiRJyo2iTz4ccC5JkiTlRtEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKCZMPSZIkSTlR9MmHs11JkiRJuVH0yYezXUmSJEm5UfTJhyRJkqTcMPmQJEmSlBMmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlR9MmH63xIkiRJuVH0yYfrfEiSJEm5UfTJhyRJkqTcMPmQJEmSlBMmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJwoy+YiIXSJiQkT8KyLejIiG+Y5JkiRJKnbb5DuAGjISuDSl9HxENANW5TkeSZIkqegVXPIREXsDq1NKzwOklBbnOSRJkiRJ5LjbVUQcHhFPRMS8iEgRcWYldc6JiFkRsTIiJkfEYVW8TWdgWUSMjojXI+JX1RK8JEmSpC2S65aPRsA04E/ZrZyI6AvcBJwDvJD9+WRE7JVSmp2tM4XK4+6VUpqfPXYYsD/wIfBURPwzpTSuBp5HkiRJ0mbKafKRUhoDjAGIiJGVVBkCjEwp3ZndHxgRxwJnA7/MXmP/TdxmHjAppTQne58xZBIRkw9JkiQpjyKllJ8bRywDzkspjczubwssB76fUnqoTL1bgX1SSt/czOtuA/wT6AEsgf/f3v2H2l3XcRx/vmyWP1YmbW4GaZGlNqopWc6WLWqm/lFoQX8YsbBmLcREEYqiIiwhoyIRJhGTxRLCyDnSpuGPnENrhMv8kUIqtTZd05VrZc53f3y/y7Oze+/u3b33nHvufT7gyz3fH+dz3mfvu/eXz/fz/X4uNwErq2rdEMcuB5a3qycCjx70F5qe5gDb+x2Exsy8DSbztr/jq2puv4MYREmWV9V1/Y5DY2PeBpN5G5up9MD5HOAVwLau7duAD422kap6sX3O424gwPqhOh7tsdcB/rIMI8nvqupd/Y5DY2PeBpN50wRbjue3QWTeBpN5G4Op1PmYMFV1C3BLv+OQJEmS9LKp9EcGtwN7gHld2+cBW3sfjiRJkqSJNGU6H1X1ArAJWNq1aylwb+8jEg4hDirzNpjMmyaSv0+DybwNJvM2Bj194DzJbOCEdvVe4CpgLbCjqp5qp9pdTTPF7gbgc8CFwIKqerJngUqSJEmacL3ufCwB7hhi1/VVtaw9ZgVwBXAszd8EubSq7u5VjJIkSZImR9+m2pUkSZI0s0yZZz40NSQ5M8naJH9NUkmW9Tsm7etAOUrj60m2JNmd5M4kC/oU7ow1EXlKcnSS1Ul2tsvqJK/t6RfRwLB+DwZr+GCwhk8eOx/qNpvmdrdLgN19jkVDO1COrgAuAy4GTgOeBm5L8uqeRSiYmDytAU4Fzm6XU2mei5OGYv0eDNbwwWANnyTedqVhdf8Vek093TlKEmALcE1VXdluO5ymKF5eVSv7FetMdjB5SnIy8BCwuKo2tMcsBn4DnFRVj/b+m2hQWL8HgzV8MFjDJ5YjH9L08iZgPrB+74aq2g3cDZzRr6C0n9HkaRHwPPtONb4B2IW5lKYra/hgsIaPg50PaXqZ3/7c1rV9W8c+9d9o8jQfeKY6hqfb109jLqXpyho+GKzh42DnQ5IkSVJP2PmQppet7c95XdvndexT/40mT1uBue29xcD/7zM+BnMpTVfW8MFgDR8HOx/S9PJnmqK2dO+GJIcB72Pf+07VX6PJ00aa2VYWdbxvEXAk5lKarqzhg8EaPg6z+h2AppYks4ET2tVDgOOSLAR27oAM5AAABS1JREFUVNVT/YtMex0oR0m+D3w5ySPAn4Cv0Dz0tqYvAc9Q481TVT2c5FZgZZLlbTsrgXUzeZYUDc/6PRis4YPBGj55nGpX+0iyBLhjiF3XV9Wy3kajoRwoR+2w7teAi4CjgfuAL1TVg72LUhORpyRHAz8EPtJuWksz3eNzkxm7BpP1ezBYwweDNXzy2PmQJEmS1BM+8yFJkiSpJ+x8SJIkSeoJOx+SJEmSesLOhyRJkqSesPMhSZIkqSfsfEiSJEnqCTsfUh8lmZ9kfZJdSSZl3uskS5JUkjmT0b4kzVTWcGns7HxIo5BkbpIXkhyZ5ND2RHPcBDR9OfB6YCFw7AS0J0nqYg2Xpo5Z/Q5AGhCLgAeqaleS9wA7quqpCWj3BGBTVT02AW1JkoZmDZemCEc+pNE5A9jQvl7c8XpESS5K8nh7xe3xJJ/t2PcE8FHgU+2Q+qoR2jk3yX1Jdif5e5KbkxzW7js6yfVJnm33355kwQhtLUvyfNe2fYb19x6T5JwkjyT5V5K1SY5K8vEkjyXZmWR1ksM72rkzybVJvpVke5Knk1yd5JCOY85PsrmNdUeSu5LMG82/pyQdJGu4NVxThCMf0jDaIfnN7eoRwJ4ky4DDgUryHLCmqlYM8/7zgGuAS4H1wIeBa5NsraqbgdOANcAO4BJg9zDtnA2sBa4CPk3z//YsXr54sAo4keYk+CxwJXBrkrdW1ZBtjtKrgMuAC4BXAje2y27gY8DrgJ8DK4DvdrzvAuAHNCf7he133AT8NMl84AbgS21bs4HTxxGjJA3JGm4N1xRVVS4uLkMsNCeINwLvAF5of74Z+CdwZrtvzgjv3wD8uGvbKuCejvV1wKoDxLEBuGGYfW8BCjizY9tRwE7gM+36kvaYOe36MuD5rnaGOqaAEzuOuRrY0/md2++zrmP9TmBjV9u3AT9qX5/atnt8v/Pr4uIyvRdruDXcZWou3nYlDaOqXqyqJ4CTgN9W1WZgPrCtqu6uqieqavsITZzM/kP79wBvG2MopwC/HuEzXgI2dsS9E/jDQXxOt/9U1aMd69uArV3feRtwTNf7Nnetb+k45gHgduDBJDcm+XySueOMU5L2Yw23hmtq8rYraRhJ/ggcDxwKHNLeYzsLmNW+frKqhr0vdwSTMh3jGD7nJSBd2w4d4rgXh2jvv0Ns676IMewxVbUnyVk0w/RnARcC307y/qp6YJh4JWnMrOHWcE1NjnxIwzuX5n7XrcAn29cPAl9sX597gPc/DLy3a9ti4KExxvF74IMjfMYhNDO5AJDkNcDbR/icZ4Aj2uP2WjjGmA5aNTZW1Tdo7pneAnyiV58vacawhk8Ca7jGy5EPaRhV9WT7cN084Caaqz8LgBur6m+jaOI7wM+SbKJ5WPFsmgf5zh9jKFcCNyd5nObBv9BccVpZVY8luQlYmWQ58Fx7/D/aY4dyH7CL5mrV94B30jxwOOmSnA58CPgVzXD/KcAbGPvJXJJGZA2feNZwTQRHPqSRLaG5V/jfwLuBv4zypEVV/QK4mGamlIdoZkNZUc0sKaNWVb8EzgPOobmCdhfwAZqhd2hmT7mfZjaV+2lmdTm7hpklpap20JxAl9LcV7wc+OpYYhqHnTRXEtcBj9HMsPLNqvpJjz5f0syyBGv4RLKGa9xS1atbFyVJkiTNZI58SJIkSeoJOx+SJEmSesLOhyRJkqSesPMhSZIkqSfsfEiSJEnqCTsfkiRJknrCzockSZKknrDzIUmSJKkn7HxIkiRJ6on/Ae8nF06MLpYsAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation import PolynomialFeatures\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"X\", \"Y\"]\n", + "# sf_crime_df = sf_crime_df[columns]\n", + "objs = [PolynomialFeatures(columns=[\"X\", \"Y\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"PolynomialFeatures\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "1ad8ec3c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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eFZWVsG5X375xVNTU33s2LFFru3Ro4e3adPG8/Ly/O677/Z69er5xo0by/UZ4sXs2bOd0OprRV69evVyd/e1a9d67969vX79+l6tWjX/zW9+44888kjB95WVK1f6Oeec46mpqZ6QkOC/+tWv/LLLLvOlS5cW3OPKK6/0k046yXNzc4vce9WqVX7UUUf5yJEjA3tekf3Y5/fsitbzETgz6wp0bdKkSbRDEZEKav369aSlpZGUlBTtUGKGmZGUlERaWhpr1qxR78ch2LZtGy+++CJDhgwpOLdniE61atUKzu3Z52Xu3LlcddVVBedHjx7NySefzOWXX86rr77K66+/Tq1atYJ7gBhy5pln7nfi9zHHHMO4ceP2Wd6gQQNmzJix33s8++yzJZ5PS0vjxx9/LF2gIlEU9/1yrtWuROQA9myQJ+UvMTFRQ9kO0aRJk9i1axe9evUqOHfiiSfSsGFD7rrrroJNJv/xj3+watWqvYZs1apViwcffJDJkyfzl7/8hfPOOy/oRxCROBL3yYeISGmY7XO/JDkE+lwP3dixY7noootITU0tOJeQkMCrr77KsmXLqF27NklJScyePZtzzz13r/kA+fn5jBs3jqSkJD799FN27twZ9COISByJ++RDq12JiJRO48aNeeedd6IdhhSSlZVFZmYmffrsvWZKmzZtyMrK4qeffmLt2rW8+eabbNy4keOOO65IvUcffZTFixfz6aefsm3bNgYOHBhU+CISh+I++dCwKxEROVyNGTOGY489lk6dOu2zTs2aNUlNTeXrr78mMzOTiy66qKBs6dKlDBw4kMcff5ymTZvy7LPPMmrUKObNmxdE+CISh+J+wrmIyMH4uMOvI9r+qXO0Xn88O9CSrQA7duxg4sSJ3H777SUOX3v55ZdJSUmhUaNGLF68mH79+tGtWze6dOkCwO7du+nVqxfnn38+l19+OQBdunThqquuIiMjg6ysLC2yICLlTsmHiMhhrnHjxlx99dVMmDCBtWvX0q1bN5566ilyc3O54oor+OSTT9i9ezft2rXj6aef5le/+hUQWpmnffv2zJo1i0WLFtG2bVsmTZpESkoKABMmTGDQoEFs27aN/v37F7nn/Pnz6devH0uXLiUxMZHu3bszcuRIqlSpgrvTv39/Jk6cyM6dO2nUqBEvvPACzZo1C/yzOVxlZmZy1llnFRwPGTKEIUOG0KtXr4INB1966SW2b99ORkZGiW2sXbuW/v37k5OTQ7169ejZsyd33313QfmDDz7IihUreOONN4pcN3z4cJo3b86dd97JqFGjyv/hosTu+CHaIcQEfyj1wJVE9iPuh11pzoeIxIKJEyfy1ltvsWzZMrKzsxk2bBj5+flkZGSwYsUKVq5cSWJiIjfccEOR6yZNmsS4ceNYv349u3btYvjw4QB88cUXXHvttUyYMIE1a9awceNGVq1aVXBd5cqV+ec//8mGDRv46KOPePfddxk9ejQAM2fOZM6cOWRnZ7N582YmT55M7dq1g/swYsCeJVuLvwrvdJ6RkcHu3bupX79+iW3cdNNNfP/99+zatYsVK1Zw3333UaVKlYLyu+++m5ycnCIT1QGSk5P59ttvYyrxEJGKI+6TD835EJFYcMMNN9CgQQNq1arFwIEDeeGFF6hduzbdu3cnKSmJI488koEDB/L+++8XuS4jI4MTTjiBxMRELr30UrKysgB45ZVXuOCCC+jQoQNVq1blvvvuK7JKUps2bTj11FM54ogjCnpe9rSdkJDA1q1b+fLLL3F3TjrpJOrVqxfchyEiIhVW3CcfIiKxoEGDBgXvGzVqxJo1a9ixYwdXX301jRo1okaNGnTo0IGffvqJX375paDuMcccU/A+KSmJbdu2AbBmzZoibVavXr1I70V2djYXXHABxxxzDDVq1OCuu+5iw4YNAHTs2JEbbriB66+/njp16tC3b1+2bNkSsWcXEZHDh5IPEZEY8P333xe8X7lyJfXr12fEiBF89dVXfPLJJ2zZsoU5c+YA7HcH5j3q1atXpM0dO3awcePGguNrr72WE088ka+//potW7bwwAMPFGn3pptuYsGCBXzxxRdkZ2fzyCOPlMdjiojIYU7Jh4hIDHjyySdZtWoVmzZt4v7776dHjx5s3bqVxMREjjrqKDZt2sTQoUNL3d4ll1zC//t//4+5c+eya9cuBg8eTH5+fkH51q1bqVGjBsnJyXz55Zc89dRTBWWffvopn3zyCXl5eVSvXp1q1arttbGdiIjEp7j/aaAJ5yISCy677DK6dOnCcccdx69//WsGDRrEzTffTG5uLikpKZx66qmcc845pW7v5JNP5sknn+Syyy6jXr16HH300QWrZEFoRaRJkyZx5JFH0qdPH3r06FFQtmXLFvr06cPRRx9No0aNqF27Nrfddlu5Pq+IiByerDTd7/EgPT3dMzMzox2GiFRAS5cu5aSTTop2GPvUuHFjnnnmmf1uNFeR7evzNbMF7p5eiiYC/UGmJVvLR9BLturfrXxoqV0ppb03HwqL+54PEREREREJhpIPEREREREJhJIPEZHD3HfffXfYDrkSEYm2OXPmcOGFF5KWloaZFdnMc4/s7GwuvvhijjrqKJKSkmjdujVLly4tUmf+/Pl07tyZ5ORkjjzySE477bSCJciXLFlCtWrVmDJlSpFr3nnnHRISEpg3b17Enq+iUfIhIiIiInFr27ZtNGvWjFGjRpGYmLhX+fLly2nXrh3HHnsss2bNYsmSJQwbNozk5OSCOp988gldunThzDPP5OOPP2bBggXceuutJCQkANCsWTOGDh3KNddcQ05ODgCbN28mIyODW265hXbt2gXzsBVA3E84N7OuQNcmTZr0+frrr6MdjohUQBV9wvnhThPO45MmnB+eYn3CeXJyMk888QS9e/cuOHfZZZdhZkycOHGf15122mmcddZZ3H///fusk5+fT/v27UlJSeH111+nZ8+eZGVlkZmZSZUqVcrzMSoCTTjfF3ef5u59a9asGe1QRERERKQCyc/PZ9q0aTRt2pRzzjmH1NRUfvvb3/LSSy8V1Fm/fj0fffQR9erV4/TTT6dOnTq0b9+ed999t0hblSpV4t///jfvvPMOl19+OS+++CLPP/98LCYe+xX3yYeIiIiISEnWr1/Ptm3beOCBB+jSpQtvv/02f/nLX7j88st54403APj2228BGDJkCFdeeSVvvfUW7du35+yzz+a///1vkfaaNGnCbbfdxqRJk7jjjjto2bJl4M8UbUdEOwARERERkYooPz8fgIsuuoj+/fsD0LJlSzIzM3niiSc4//zzC+pcffXVXHnllQC0atWK2bNn8/TTT/PUU08VtJebm8sLL7xAUlISc+fOxd0x2+cIpZikng8RERERkRKkpKRwxBFH0LRp0yLnTzrpJFauXAlAvXr1APaq07Rp04I6ewwYMIDdu3czf/78ggQm3ij5EBEREREpQZUqVfjtb3/LV199VeR8dnY2jRo1AqBx48bUr19/v3UAZs+ezejRoxk/fjwnn3wyI0aM4I477mDZsmWRf5AKRMOuREQOQqRXzon1FWVERCqKbdu28c033wChYVYrV64kKyuLWrVq0bBhQ26//XYuvfRS2rdvT8eOHZk9ezYvvvgir732GgBmxm233caQIUNo3rw5rVq1YvLkyXz88ccFPRtbt24lIyODfv360b59ewD69OnDlClTyMjI4L333qNSpfjoE4iPpxQRiWGNGzdm+PDhNG/enJo1a9KjRw927tzJ+PHjOf3004vUNbOCH7K9e/fmuuuu49xzzyU5OZl27dqxbt06br75Zo4++mhOPPFEFi5cWOQ+Dz74IE2bNuXoo48mIyODnTt3AqE17KdNm1ZQNy8vj5SUlCLXi4hURJmZmbRq1YpWrVqRm5vLkCFDaNWqFYMHDwagW7dujBkzhuHDh3PKKafw+OOP8/zzz3P++ecXtHHzzTdz1113ccstt9CiRQtee+01ZsyYQYsWLQrKk5KS9lqK99lnn2Xx4sWMGjUquAeOsrhPPsysq5mN2bx5c7RDERE5aJMnT+bNN99k+fLlLFq0qMQdevd13bBhw9iwYQNVq1albdu2tG7dmg0bNnDJJZcUTLDcY+LEibz11lssW7aM7Oxshg0bBkDPnj35v//7v4J606dPp169erRq1arcnlFEJBLOPPNM3H2vV+Hvo7179yY7O5vc3FwWLVrEX/7yl73aGTBgACtXrmT79u3Mnz+fTp06FZQ9++yzfPHFF1SrVq3INWlpafz444/8/e9/j9jzVTRxn3xonw8RiQU33XQT9evXp1atWnTt2pWsrKxSXffHP/6RNm3aUK1aNf74xz9SrVo1evbsSeXKlenRo8dePRc33HADDRo0oFatWgwcOJAXXngBgL/+9a9Mnz6dLVu2ADBhwgSuuOKK8n1IERE57MV98iEiEguOOeaYgvdJSUls27atVNfVrVu34H1iYuJex8XbadCgQcH7Ro0asWbNGgDq169Pu3btmDJlCj/99BMzZszg8ssvP6hnERGR2KUJ5yIiMap69ers2LGj4HjdunWH3Ob3339f8H7lypXUr1+/4LhXr14888wz7N69m7Zt25KWlnbI9xMRkdiing8RkRjVokULPv/8c7Kysti5cyf33HPPIbf55JNPsmrVKjZt2sT9999Pjx49Csq6devGZ599xqhRo+jZs+ch30tERGKPej5ERGLUCSecwODBg+nUqROJiYk8+OCD/Otf/zqkNi+77DK6dOnCmjVruOiiixg0aFBBWWJi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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation import ClusterStatistics\n", + "\n", + "housing_df = pd.read_parquet(housing_file_location)\n", + "columns = [\"MSSubClass\", \"LotArea\"]\n", + "clusters_dict = {\n", + " \"cluster_name_a\": columns,\n", + "}\n", + "objs = [ClusterStatistics(clusters_dict=clusters_dict)]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"ClusterStatistics\")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "bf5908f6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2rVrR6dOnWjUKNNJvXjxYt5991123XVXSktLWbZsGRFBu3bt2HbbbcvqffbZZ7zyyivssMMOdOjQAYA5c+awbNky9tlnnwrtLly4kNWrM3nArrvuylZbbcWbb77J8uXLq4y1TZs29OjRg0WLFvHee++xyy670Lp167LyDz/8kDlz5tC9e3fatcuMkpo/fz6LFy9mzZrM4ll77703TZs2ZcaMGWyzzTZ061Zx5FRKifnz57Nw4cJ1ZJKi54FzyOwC/3hKafD6uhGx83e/+923H3nkEZYvX063bt045phjuPbaawFYuHAhp5xyCk8++STLly/n61//Oo8//viXeZvyplWrVvz2t79l8ODBG60zdOhQpkyZwptvZvKqmTNnsttuu1FSUsJXvvIVANatW8c222zDlVdeyamnli0mxne/+13efvttnnnmGS699FJuueUWXnnllbL3T5K+hNhYQb3q+diEDmS63KuaaHk4QEppbbb7+DEyQ8qu3ljika1/E3ATQJ8+fdL06ZucWylJeTNu3DiGDBnCv/71L3r06JHvcOpcRLyYUio/h2THynU2tXP7Nttsw8SJE2s7tHpl+fLl/OUvf2HUqFFl5z77LDParVmz/8zPb9SoEU2bNmXq1KkVko+xY8ey1157cfLJJ3P//ffzj3/8w8RDUp2pb3M+NltK6YGU0q4ppR7Z5OILRcSAiLhpyZIluQhPkqRadeedd7J69WoGDRpUdm733Xdn++2356c//SkfffQRq1ev5pe//CXvv/8+CxZUXGCsXbt2/OIXv+Duu+/mf/7nf+jfv3+ub0FSEWlIycdi4HOqXuWl8mTMakspTUgpDWvTps3mxCZJUl7cfPPNHHPMMXTs2LHsXJMmTbj//vuZNWsW7du3p0WLFjz22GN861vfKhuet966deu4/fbbadGiBc8//zyrVq3K9S1IKiINJvnITk6cARxRqegIMqteSVJBGzx4MCmlohhypeopKSlh+vTpDB06dIOy3r17U1JSwieffMKCBQt46KGH+PDDD9lpp50q1Lv++ut5+eWXef7551m+fDkjRozIVfiSilC9Sj4iolVE7BcR+5GJbfvs8fqldK8FBkfEqRGxR0TcQGZvj99vRpsOu5IkNUg33XQT3bt35/DDD99onTZt2tCxY0feeustpk+fzjHHHFNW9vrrrzNixAh+85vfsOeee3Lrrbdyww03MG3atFyEL6kI1avVriLiMDKTxSv74/rVTSJiOHAhmWUGXwF+nFKasrltO+Fc0hdZunQpixYtKluxSZuvSZMmdOrUqcJqWeVFxIxKE843pv78Iasly5cv5+233wbgwAMP5OKLL+boo4+mXbt2bL995vu4FStW0KVLFy688MIqeyvuueceOnTowA477MDLL7/M2WefTe/evbnvvvsAWLt2LQceeCDbb7899957b9nrTjvtNCZPnkxJSQktWrTIwd1KKkAbXe2KlJKPlOjdu3eSpKosWbIkzZw5M3366adp3bp1+Q6nIKxbty59+umnaebMmWnJkiVV1gGmp+p9hhecxx57LJFJqio8Bg0aVFbntttuS40bN07z5s2r8ho33HBD2nbbbVOTJk3S9ttvn0aOHJk+++yzsvJLL700derUKS1atKjC65YtW5a6d++ezjrrrDq5t0L2xBNPpAEDBqSuXbsmIN1+++0Vyqt6T4E0fPjwsjojR45Mu+22W2rRokXaeuutU9++fdO0adPKyhcsWJDat2+fxowZU+Har7zySmratGm666676vQepWra6Gd2ver5yIeIGAAM6NGjx9C33qrJ/lySisXbb79N165d/Ra4DqxYsYL58+dXOY+lmHs+1DBNnDiRqVOn0qtXL77//e8zduzYCvuzLFxYcX2c6dOnM2DAAB5//HG+/vWvA/DnP/+ZLl260L17d1auXMl1113H3XffzVtvvUXnzpk1d/76178yePBgZsyYwZ577smaNWvYf//92WWXXfjLX9wbUvXCRns+ij75WM9hV5I25vXXX2f33Xcns2m0alNKiTfeeIM99thjgzKTDzVkX2ZzyKosXbqUNm3a8NBDD3HkkUeWnXdzSNVzBbHJoCTljYlH3fD3qmJV1eaQla1evZqbbrqJ1q1bs99++1Uoc3NINVT1arWrfHC1K0mqnh133JFHH30032FIBaGqzSHX++c//0mrVq1o1qwZ1113HY888kjZkKv13BxSDVXRJx/JTQYlSVKOVbU55Hrf+MY3KCkp4amnnuKoo47ixBNP3GBnejeHVEPlsCtJ+hKeOXTnOr3+/lNm1en1JeXP+s0hr7zyyirLW7ZsSY8ePejRo0fZRPJbbrmFn/3sZ2V1ym8OeeSRRzJixAiuueaaXN2C9KWZfEhSA7fjjjvywx/+kPHjx7NgwQK+853v8Lvf/Y6VK1fyve99j2effZa1a9dy0EEH8fvf/55tt90WgMMOO4xDDjmEyZMn89JLL3HAAQdw55130qFDBwDGjx/PyJEjWb58Oeeee26FNp977jnOPvtsXn/9dZo3b87xxx/Ptddey5ZbbklKiXPPPZc77riDVatWscMOO3DXXXex99575/x3Uxfi4g/yHUJBSFdt+I1/sajO5pDlrVu3js8++6zseP3mkLfcckvZ5pD9+/fnuOOO46CDDqqrsKVaUfTDrpzzIakQ3HHHHTz88MPMmjWLmTNncvnll7Nu3TqGDBnCu+++y9y5c2nevDlnnHFGhdfdeeed3H777SxatIjVq1czZswYAF577TVOP/10xo8fz/z58/nwww95//33y17XuHFjrrvuOhYvXszTTz/Nv//9b8aOHQvApEmTmDJlCjNnzmTJkiXcfffdtG/fPne/DClPli9fTklJCSUlJaxbt465c+dSUlLC3Llzy+qsWLGCO+64gx/84AcbLLiwdOlSRo4cybPPPsvcuXOZMWMGp5xyCu+//z4nnngikNkcctCgQfzXf/0XJ598MgD9+vXj1FNPZciQIaxYsSJ3Nyx9CUWffDjnQ1IhOOOMM9huu+1o164dI0aM4K677qJ9+/Ycf/zxtGjRgq222ooRI0bwxBNPVHjdkCFD2HXXXWnevDknnngiJSUlANx77718+9vf5tBDD6Vp06ZcdtllNGr0nz8ZvXv3Zv/992eLLbYo63lZf+0mTZqwbNky3njjDVJK7LHHHnTp0iV3vwwpT6ZPn07Pnj3p2bMnK1euZNSoUfTs2ZNLLrmkrM5f//pXPv30U4YMGbLB67fYYgteffVVjj32WHbZZRcGDBjAhx9+yJQpU9h3330B+MUvfsG7777L7373uwqvHTNmDGvXruUnP/lJ3d6ktJkcdiVJBWC77bYre77DDjswf/58VqxYwY9//GMeeughPv74YwCWLVvG559/TuPGjQHYZpttyl7XokULli9fDsD8+fMrXLNly5YVei9mzpzJueeey/Tp01mxYgVr166ld+/eAPTt25czzjiDH/3oR7z77rscd9xxjBkzhtatW9fdL0CqBw477DA2tX/akCFDqkw8IPP/4N/+9rcvfP3PfvazCnM/1mvVqhXvvPNO9YOV8qToez4kqRC89957Zc/nzp1L165dueaaa3jzzTd59tlnWbp0KVOmTAHY5D+OALp06VLhmitWrODDDz8sOz799NPZfffdeeutt1i6dClXXnllheueddZZzJgxg9dee42ZM2fyq1/9qjZuU5LUwJl8SFIBuPHGG3n//ff56KOPuOKKKxg4cCDLli2jefPmbL311nz00UeMHj262tc74YQT+Oc//8nUqVNZvXo1l1xyCevWrSsrX7ZsGa1bt6ZVq1a88cYbFYaAPP/88zz77LOsWbOGli1b0qxZswpDtiRJxavo/xo44VxSITjppJPo168fO+20EzvvvDMjR47knHPOYeXKlXTo0IH999+fo446qtrX22uvvbjxxhs56aST6NKlC23bti1bJQsy48vvvPNOttpqK4YOHcrAgQPLypYuXcrQoUNp27YtO+ywA+3bt+eCCy6o1fuVJDVMUZ3u92LQp0+fNH369HyHIakeev3119ljjz3yHcZG7bjjjtxyyy3VXrazvtnY7zciZqSU+lTjEjn9Q+ZSu7WjmJfalYpAbKzACeeSJKngmTTWDpNGba6iH3YlSZIkKTfs+ZCkBm7OnDn5DkGSpGqx50OSJElSThR98uFqV5IkSVJuFH3ykVKakFIa1qZNm3yHIkmSJBW0ok8+JEmSVLymTJnC0UcfTbdu3YgIxo0bV6F88ODBRESFx/7771+hzqxZszj22GPp2LEjrVu35sQTT6S0tLSs/JVXXqFZs2bcd999FV736KOP0qRJE6ZNm1Zn91ffmHxIkiSpaC1fvpy9996bG264gebNm1dZ5/DDD2fBggVlj4kTJ5aVffrpp/Tr14+UEpMnT2batGmsXr2aAQMGsG7dOgD23ntvRo8ezWmnnVaWlCxZsoQhQ4Zw3nnncdBBB9X9jdYTrnYlSZKkotW/f3/69+8PZHo5qtK0aVO22WabKsumTZvG7NmzmT59Om3btgXgj3/8I23btmXy5MllG8BecMEFPPDAAwwbNox//OMfnHnmmbRt25ZLL7209m+qHrPnQ5IkSfoCU6dOpVOnTuy6664MHTqURYsWlZV99tlnRATNmjUrO9esWTMaNWrE1KlTy841atSIP/7xjzz66KOcfPLJ/OUvf+FPf/oTW265ZU7vJd/s+ZCkL6Gud0t2F2FJqh+OOuoojjvuOLp3786cOXMYOXIkffv2ZcaMGTRt2pT999+fVq1accEFF/DLX/4SgIsvvpjPP/+cBQsWVLhWjx49uOCCCxg9ejQ/+9nP2G+//fJxS3llz4ckNXA77rgjY8aMYd9996VNmzYMHDiQVatWMW7cOA4++OAKdSOCt99+G8gMLxg+fDjf+ta3aNWqFQcddBALFy7knHPOoW3btuy+++68+OKLFdr5xS9+wZ577knbtm0ZMmQIq1atAjLjmSdMmFBWd82aNXTo0KHC6yWpIfrud7/L0UcfzT777MOAAQN48MEHefPNN/nXv/4FQMeOHbnnnnt48MEH2WqrrWjTpg2ffPIJvXr1olGjiv/UXrlyJXfddRctWrRg6tSppJTycUt5VfTJh/t8SCoEd999Nw899BCzZ8/mpZde2mC1li963eWXX87ixYtp2rQpBxxwAL169WLx4sWccMIJnHvuuRXq33HHHTz88MPMmjWLmTNncvnllwPw/e9/nz//+c9l9SZOnEiXLl3o2bNnrd2jJNUHXbt2Zdttt+Wtt94qO9evXz9mzZrFokWLWLx4MePHj2fevHnstNNOFV570UUXsXbtWp577jmmT5/Ob3/721yHn3dFn3y4z4ekQnDWWWfRtWtX2rVrx4ABAygpKanW64499lh69+5Ns2bNOPbYY2nWrBnf//73ady4MQMHDtyg5+KMM85gu+22o127dowYMYK77roLgP/93/9l4sSJLF26FIDx48fzve99r3ZvUpLqgcWLFzNv3jy6dOmyQVmHDh3YeuutmTx5MosWLeLoo48uK3vssccYO3Ys48aNY6+99uKaa67h4osvZtasWbkMP++KPvmQpEJQfhWWFi1asHz58mq9rnPnzmXPmzdvvsFx5etst912Zc932GEH5s+fD2S+CTzooIO47777+OSTT3jwwQc5+eSTv9S9SFIuLV++nJKSEkpKSli3bh1z586lpKSEuXPnsnz5cs4//3yefvpp5syZw+OPP86AAQPo1KkTxx57bNk1br/9dp5++mlmzZrFn//8Z/77v/+bH//4x+y2224ALFu2jCFDhnD22WdzyCGHADB06FAOOeQQhgwZUrYkbzEw+ZCkAtWyZUtWrFhRdrxw4cLNvuZ7771X9nzu3Ll07dq17HjQoEH8+c9/5p577uGAAw6gW7dum92eJNW16dOn07NnT3r27MnKlSsZNWoUPXv25JJLLqFx48a8/PLLHHPMMey6664MGjSI3Xbbjaeffpqtttqq7Bpvvvkmxx57LHvssQeXXnopI0aMYMyYMWXl55xzDi1atOCKK66o0Patt97Kyy+/zA033JCz+803V7uSpAL1la98hVdffZWSkhJ23313fv7zn2/2NW+88Ua+/e1vl/0RHThwYFnZd77zHYYPH05paSkXXnjhZrclSblw2GGHfeHE74cffniT17jqqqu46qqrNlp+6623Vnm+W7dufPzxx5sOsoDY8yFJBWrXXXflkksu4fDDD2eXXXbZYOWrL+Okk06iX79+7LTTTuy8886MHDmyrKx58+Ycf/zxzJ49m+OOO26z25IkFZ4oxiW+qtKnT580ffr0fIchqR56/fXX2WOPPfIdRt7tuOOO3HLLLWW79Vbl0ksvZebMmRVWvtqUjf1+I2JGSqlPNS6R0z9kdb3HS7HI9V42vm+1wz2IVE2xsQKHXUmSasVHH33Erbfeyvjx4/MdiiSpnnLYlSRps918881st912fOtb3+LQQw/NdziSpHqqYHs+IuJvwGHAv1NKJ+Q5HElq8ObMmbPRsqFDhzJ06NDcBSNJapAKNvkAbgBuAwblOxBJkiTVnHN1akd9mqtTsMOuUkqPA8vyHYekwuDiHHXD36skFZecJx8RcWhEPBAR8yIiRcTgKuoMj4jZEbEqImZExCG5jlOS1mvSpAkrV67MdxgFaeXKlTRp0iTfYUiSciQfPR+tgFeAs4EN/ppHxEAyQ6auBHoCTwEPRsT25eqURMQrVTy6Vr6eJG2uTp06MW/ePFasWOE39bUkpcSKFSuYN28enTp1ync4kqQcyfmcj5TSRGAiQESMq6LKucC4lNLN2eMzI+Io4HTgJ9lr7JeDUCUJgNatWwMwf/581qxZk+doCkeTJk3o3Llz2e9XklT46tWE84jYEugNjKlUNAk4sA7aGwYMA9h+++03UVtSMWvdurX/SJYkaTPVtwnnHYDGQGml86XANjW5UEQ8CtwD9I+I9yPigMp1Uko3pZT6pJT6dOxYf1YBkCRJkgpRver5qE0ppcOrUy8iBgADevToUccRSZIkScWtvvV8LAY+BzpXOt8ZWFgXDaaUJqSUhrVp06YuLi9JkiQpq14lHyml1cAM4IhKRUeQWfVKkiRJUgOV82FXEdEKWD/GqRGwfUTsB3yUUpoLXAuMj4jngGnAaUBX4Pd1FI/DriRJkqQcyEfPRx/gxeyjOTA6+/xSgJTSX4FzgJFACXAw0D+l9G5dBOOwK0mSJCk38rHPx+NAbKLOWGBsLuKx50OSJEnKjXo15yMf7PmQJEmScqPokw9JkiRJuWHyIUmSJCknij75iIgBEXHTkiVL8h2KJEmSVNCKPvlwzockSZKUG0WffEiSJEnKjaJPPhx2JUmSJOVG0ScfDruSJEmScqPokw9JkiRJuWHyIUmSJCknTD4kSZIk5UTRJx9OOJckSZJyo+iTDyecS5IkSblR9MmHJEmSpNww+ZAkSZKUEyYfkiRJknLC5EOSJElSThR98uFqV5IkSVJuFH3y4WpXkiRJUm4UffIhSZIkKTdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkScqJok8+3GRQkiRJyo2iTz7cZFCSJEnKjS3yHYAkSfmycuVKZs2aBcDOO+9M8+bN8xyRJBW2ou/5kCQVn88++4xzzjmHdu3a8ZWvfIV9992Xdu3acfbZZ7Nq1ap8hydJBcueD0lS0Tn99NOZNGkSt9xyCwcccAAATz/9ND/5yU9YtmwZt912W54jlKTCZPIhSSo699xzD/fffz9HHHFE2bmddtqJTp06cfzxx5t8SFIdcdiVJKnotGzZkm7dum1wvlu3bs77kKQ6ZPIhSSo6Z555JqNHj2blypVl51auXMlll13GmWeemcfIJKmwOexKklR0nnnmGZ544gm6devGvvvuC8DLL7/M2rVr+fTTTzn66KPL6j7wwAP5ClOSCk5BJh8RsR0wHugErAUuSyndk9+oJEn1RYcOHTj++OMrnOvevXueopGk4lGQyQeZhOOclFJJRGwDzIiIiSmlT/MdmCQp/26//fZ8hyBJRakgk4+U0gJgQfb5wohYDLQDTD4kSZKkPMl58hERhwLnA72BrsCQlNK4SnWGAxcAXYBXyfRiPPkl2+sNNE4pvbc5cUuSCsc+++xDRGy0/KWXXsphNJJUPPLR89EKeAX4U/ZRQUQMBG4AhgNTsz8fjIg9U0pzs3VKqDr2fiml+eWu1S7bxtDavglJUsN1wgknVDhes2YNJSUlTJs2jR/96Ed5ikqSCl/Ok4+U0kRgIkBEjKuiyrnAuJTSzdnjMyPiKOB04CfZa+y3qXYioinwd+CqlNJTG6kzDBgGsP3229fsRiRJDdaoUaOqPP+rX/2Kd999N8fRSFLxqFf7fETElmSGY02qVDQJOLAG1wlgHDA5pTR+Y/VSSjellPqklPp07NjxS0QsSSokxx13HHfccUe+w5CkglWvkg+gA9AYKK10vhTYpgbXOQgYCHwnIkqyj31qKUZJUoGaMmUKLVq0yHcYklSwCnW1q6lUM7GKiAHAgB49etRtUJKkeqP8JoIAKSUWLFjAiy++uNEhWZKkzVffko/FwOdA50rnOwML66LBlNIEYEKfPn2clC5JRaJ9+/YVjhs1asRee+3FlVdeSb9+/fIUlSQVvkL01AQAACAASURBVHqVfKSUVkfEDOAIoPyO5EcA99VFm/Z8SFLxcZNBScqPnM/5iIhWEbFfROyXbX/77PH65aauBQZHxKkRsUdE3EBmP5Df10U8KaUJKaVhbdq0qYvLS5LquauuuopPPvkk32FIUlHIx4TzPsCL2UdzYHT2+aUAKaW/AucAI4ES4GCgf0rJtQ8lSbXuyiuv5KOPPsp3GJJUFPKxz8fjwMa3lc3UGQuMzUU8DruSpOKWUsp3CJJUNOrbUrs557ArSZIkKTfq1YRzSZJy7bXXXqNr1675DkOSikLR93xExICIuGnJkiX5DkWSlAfbbbcdjRs3zncYklQUqrsR3x4RcWlEPBER70bEooh4NSLGR8RJEdG0rgOtKw67kqTi0KhRIxo3blythySpbnzhsKuI6AVcTWbFqWnAU8C9wEqgHbA3cAXwm4i4Grg+pfRZnUYsSdKXcPfddxORWe+ktLSUSy65hGOPPZYDDjgAgKeffpq///3vjB49Op9hSlJB29Scj7+RST7+O6X08cYqRcQBwI+B88kkI5Ik1SsnnHBC2fOjjz6aX/ziFwwdOrTs3CmnnMJXv/pV/v73vzN8+PB8hChJBW9Tw652SSnd+EWJB0BK6emU0onAr2ovtNxwzockFZ/JkyfzjW98Y4Pz3/jGN3j88cdzH5AkFYkvTD5SSqu/qDwimtSkfn3knA9JKj4dOnTg3nvv3eD8vffeS8eOHfMQkSQVh2ovtRsRZwHzUkr3ZY9vBQZFxCzg6JTSm3UUoyRJterSSy9lyJAhPPbYY2VzPp555hkeffRRbr311jxHJ0mFqyZL7Z4FfAAQEYcCJwInASXANbUfmiRJdeP73/8+Tz31FB06dOCBBx7ggQceoH379kybNo1BgwblOzxJKlg12WSwGzA7+3wAcE9K6e6IeBl4stYjkySpDn3ta1/jjjvuyHcYklRUatLzsRTolH1+BPDv7PM1QLPaDCqXnHAuScWptLSUMWPGMHz4cBYvXgzAtGnTmD179iZeKUn6smqSfEwCbo6IW4AewIPZ83vxnx6RBscJ55JUfGbMmMFuu+3GHXfcwS233MLSpUsBeOSRRxgxYkSeo5OkwlWT5ONHZDYa7AickFL6KHu+F3BXbQcmSVJdOf/88zn77LN58cUXadq0adn5I488kmnTpuUxMkkqbNWe85FSWgqcWcX5UbUakSRJdWzGjBlVrmrVpUsXSktL8xCRJBWHL+z5iIitanKxmtaXJCkfmjdvzscfb7h/7htvvEGnTp2qeIUkqTZsatjVWxExMiK23ViFiGgUEd+KiEfIDM2SJKleO+aYYxg9ejSfffYZABHBnDlzuOiiizj++OPzHJ0kFa5NDbs6BLgCeCe7pO50YD6wCmgL7AnsD6wErgRurrtQ60ZEDAAG9OjRI9+hSJJyZMyYMfTv35+OHTuyYsUKDj74YEpLSznooIO4/PLL8x2eJBWsL0w+UkpvASdGxHZkNhU8BPgq0BxYDLwI3ARMTCmtq+NY60RKaQIwoU+fPkPzHYskKTdat27N1KlTmTx5Mi+88ALr1q2jV69eHH744fkOTZIKWrUmnKeU3iOzi7k7mUuSCkbfvn3p27dvvsOQpKJRk6V2JUkqGGPHjmWvvfaiRYsWvPPOOwBcddVV3H333XmOTJIKl8mHJKnoXH/99Vx++eUMGzaMlFLZ+W7duvHb3/42j5FJUmEz+ZAkFZ3f//733HzzzZx99tlsscV/RiD36tWLV199NY+RSVJhM/mQJBWdd999l7333nuD802aNGHlypV5iEiSioPJhySp6Oy000688MILG5yfOHEie+65Zx4ikqTiUK3VrtaLiM7A94CdgZ+llBZHxEHA/JTS7LoIsK65z4ckFZ/zzz+fM844gxUrVpBS4umnn2b8+PFcffXV3HbbbfkOT5IKVrWTj4joDfwbmA3sBfyKzF4fRwC7AifVRYB1zX0+JKn4DBkyhLVr1/LTn/6UFStW8L3vfY+uXbvy61//moEDB+Y7PEkqWDXp+RgD3JBSGhURy8qdfxgYUrthSZJUt4YOHcrQoUNZvHgx69ato1OnTvkOSZIKXk2Sj97AD6o4vwDoXDvhSJKUO7NmzeL1118HYM8992SnnXbKc0SSVNhqknysBNpWcX53YFHthCNJUt378MMP+cEPfsADDzxAo0aZtVdSSnz729/mtttuo3379nmOUJIKU01Wu/oHMCoimmaPU0TsCPwSuK+W45Ikqc6ceuqpvP322zz55JOsWrWKVatWMWXKFGbPns3QoU4BlKS6UpOej/OBicAHQAtgKpnhVtOAkbUfmiRJdePhhx/m3//+NwcccEDZuYMOOog//OEPHH744XmMTJIKW7WTj5TSUuDgiOgL9CLTa/JCSunRugpOkqS60LFjR1q2bLnB+RYtWjjkSpLqUI03GUwpTU4pjUkpXW3iIUlqiC655BLOOecc5s2bV3Zu3rx5nHfeeVxyySV5jEySCltNNxnsCXwD6ESlxCWldGEtxvWlRcTWwKNk7m0LMssD35zfqCRJ9cn111/PnDlz2HHHHenWrRuQST6aNWvGokWL+PWvf11W96WXXspXmJJUcGqyyeCFwFXAu0ApkMoVpypflB/LgENTSisioiXwSkTcn1L6MN+BSZLqhxNOOCHfIUhSUapJz8ePgdNTSn+oq2BqQ0rpc2BF9rApENmHJEkAjBo1Kt8hSFJRqsmcj0bAvzensYg4NCIeiIh5EZEiYnAVdYZHxOyIWBURMyLikC/RztYR8X/A+8CvUkqLNyduSVJh+eCDD/jggw/Kjl9++WVGjhzJXXfdlceoJKnw1ST5+B0wZDPbawW8ApxNZtPCCiJiIHADcCXQE3gKeDAiti9XpyQiXqni0XV9nZTSJymlrwDdgZMiwh3YJUllTjzxRCZMmADA4sWLOfTQQ/nb3/7GaaedxjXXXJPn6CSpcNVk2NVoYGJEvEgmgVhTvjCldMqmLpBSmkhmrxAiYlwVVc4FxpWbIH5mRBwFnA78JHuN/aobcEqpNNsDcghwb3VfJ0kqbC+99BL7778/APfeey89evTg+eef5x//+AcXXHAB5513Xp4jlKTCVJOejyuAfsBaoC3QsdJjs0TElkBvYFKloknAgTW4TueI2Cr7vA1wKPDmRuoOi4jpETG9fPe7JKmwrVy5klatWgHw6KOPcvTRRwPQq1cv3nvvvXyGJkkFrSbJx3DgpJTS/0spfTulNKD8oxZi6QA0JrOSVnmlwDY1uM4OwJPZHo8ngd+klF6uqmJK6aaUUp+UUp+OHTc7f5IkNRC77LIL999/P++99x6TJk2iX79+AJSWlrL11lvnOTpJKlw1ST5WAi/WVSC1JaX0XEppv5TSV1JK+25qda6IGBARNy1ZsiRXIUqS8mzUqFFcdNFF7Ljjjuy///587WtfA+Dhhx+mZ8+eeY5OkgpXTZKP64BzIqKulq1dDHwOVJ4c3hlYWEdtklKakFIa1qZNm7pqQpJUzxx33HHMnTuX6dOn89BDD5WdP/zww7n22mvzGJkkFbaaTDg/hMz8if+KiNfYcML50ZsTSEppdUTMAI4A7ilXdARw3+ZcW5Kkyjp37kznzhW/71rfAyJJqhs1ST4WA/dvTmMR0QrokT1sBGwfEfsBH6WU5gLXAuMj4jlgGnAa0BX4/ea0u4mYBgADevToscm6kiRJkr68aicfKaXN3eMDoA/wWLnj0dnHH4HBKaW/RkR7YCTQhcySvv1TSu/WQttVSilNACb06dNnaF21IUmSJKlmPR+bLaX0OPCFc0ZSSmOBsTkJSJIkSVLOfGHyEREvAV9PKX0cES8DaWN1U0r71nZwuZCPYVfPHLpzztraHPtPmZXvEKRa0RD+n/P/N0lSMdhUz8d9wGflnm80+WioHHal6moI/4AF/xErVVdpaSnjx49n1qxZXHbZZXTo0IFp06bRtWtXunfvnu/wJKkgfWHykVIaXe75z+s8GkmScmDGjBl885vfpHv37rz66qtccMEFdOjQgUceeYSZM2dy55135jtESSpI1d7nIyImR8QG275GROuImFy7YeWOmwxKUvE5//zzOfvss3nxxRdp2rRp2fkjjzySadOm5TEySSpsNdlk8DBgyyrONyOzB0iD5CaDklR8ZsyYwaBBgzY436VLF0pLS/MQkSQVh02udhURvcod7hsRH5U7bgwcCcyr7cAkSaorzZs35+OPP97g/BtvvEGnTp3yEJEkFYfqLLU7ncxE8wRMqqJ8JXBmbQYlSVJdOuaYYxg9ejT33HMPABHBnDlzuOiiizj++OPzHJ0kFa7qDLvqDuxMZn+Or2aP1z+6Aa1TSrfVWYR1zDkfklR8xowZw0cffUTHjh1ZsWIFBx98MD169GDrrbfm8ssvz3d4klSwNtnzUW538ZrMD2kwXGpXkopP69atmTp1KpMnT+aFF15g3bp19OrVi8MPPzzfoUlSQavRDucRsS1wKNCJSslISunaWoxLkqQ617dvX/r27ZvvMCSpaFQ7+YiIk4HbgLXAB1TccDABJh+SpAbjxRdf5LHHHmPRokWsW7euQtnVV1+dp6gkqbDVpOfjUuAa4Gcppc/rKJ6ci4gBwIAePXrkOxRJUo5cffXVXHzxxeywww507tyZiCgrK/9cklS7apJ8dAZuKaTEA5zzIUnF6LrrruN3v/sdP/zhD/MdiiQVlZpMIp8IfK2uApEkKVfWrVvHN7/5zXyHIUlFpyY9H48Av4yIvYCXgTXlC1NK99dmYJIk1ZXTTz+d22+/nSuuuCLfoUhSUalJ8vGH7M+fVlGWyOx2LklSvTdq1Cj69+9Pz5492XvvvWnSpEmF8ttua7DbV0lSvVbt5COlVJD7fEiSis+IESOYNGkSvXr14uOPP3aSuSTlSI32+ShErnYlScVn7Nix3HnnnQwcODDfoUhSUanJPh/nflF5Q91k0NWuJKn4NG/enJ49e+Y7DEkqOjXp+Tiz0nEToAuwEliEmwxKkhqIH//4x1x//fXceOONDrmSpByqyZyP7pXPRURn4Hbg5toMSpKkuvTkk08yZcoU/vWvf7HnnntuMOH8gQceyFNkklTYNmvOR0qpNCJGAHcDf6udkCRJqlsdOnTguOOOy3cYklR0amPCeSMyu59LktQg3H777fkOQZKKUk0mnFf+iijIzPn4EfBkbQYlSZIkqfDUpOfj3krHCfgAmAycV2sRSZJUB/bdd1+eeOIJ2rZtyz777POFE81feumlHEYmScXDTQYlSUXh+OOPp2nTpmXPXeVKknKvWslHRDQBpgLfTym9Wbch5ZabDEpScRg1alTZ85///Of5C0SSili1ejNSSmuA7mSGWhWUlNKElNKwNm3a5DsUSVKO9O3bl08++WSD80uXLqVv3755iEiSikNNhlL9EXAXcElSg/f444+zevXqDc6vWrWKJ590DRVJqis1mXDeEjg5Io4AZgCfli9MKZ1Vm4FJklTbXnjhhbLnL730Eu3atSs7/vzzz3n44Yfp1q1bPkKTpKJQk+RjD2D9p/ZOlcoKbjiWJKnw9OnTh4ggIujXr98G5c2bN+c3v/lNHiKTpOJQk9WuvlGXgUiSVNdmz55NSomddtqJ5557jo4dO5aVbbnllnTq1InGjRvnMUJJKmy1scO5JEkNwg477ADAunXr8hyJJBUnkw9JUlF6//33mTJlCosWLdogGTn33HPzFJUkFTaTD0lS0bnjjjs45ZRT2GKLLejYsWOFDQcjwuRDkupIwSYfEdECeB24J6V0fr7jkSTVH5dccgnnnXcel112mXM8JCmHarLPR0MzAngm30FIkuqf0tJSTj31VBMPScqxgkw+ImIXYHfgwXzHIkmqf/r378+zzz6b7zAkqejkdNhVRBwKnA/0BroCQ1JK4yrVGQ5cAHQBXgXOSSnVdLvZMdlrHLi5MUuSCs8RRxzBRRddxKuvvso+++xDkyZNKpQfd9xxeYpMkgpbrud8tAJeAf6UfVQQEQOBG4DhwNTszwcjYs+U0txsnRKqjrtfSml+RBwDzEwpzYwIkw9J0gZ++MMfAnDllVduUBYRfP7557kOSZKKQk6Tj5TSRGAiQESMq6LKucC4lNLN2eMzI+Io4HTgJ9lr7LeJZvYHvhsR/00m2WkSEUtTSpfWwi1IkgqA+3xIUn7UmzkfEbElmeFYkyoVTaIGw6dSSj9JKW2XUtqRzBCvmzeWeETEsIiYHhHTP/jggy8ZuSRJkqTqqE9L7XYAGgOllc6XAofXRYMppZuAmwD69OmT6qINSVL9c+21135huft8SFLdqE/JR62rPJm9KhExABjQo0ePug9IklQv/OY3v6lwvGbNGhYsWEDz5s3p1KmTyYck1ZH6lHwsBj4HOlc63xlYWFeNppQmABP69OkztK7akCTVL7Nnz97gXGlpKUOGDGHoUP8cSFJdqTdzPlJKq4EZwBGVio4AnqqrdiNiQETctGTJkrpqQpLUAHTu3JkrrriCCy+8MN+hSFLBymnyERGtImK/iNgv2/b22ePts1WuBQZHxKkRsUdE3EBmP5Df11VMKaUJKaVhbdq0qasmJEkNxLp16ygtrTz1UJJUW3I97KoP8Fi549HZxx+BwSmlv0ZEe2AkmU0GXwH6p5TezXGckqQCdv/991c4TimxYMECbrzxRg455JA8RSVJhS/X+3w8DsQm6owFxuYkIJxwLknF6IQTTqhwHBF07NiRvn37cs011+QpKkkqfPVpwnleOOFckoqPmwxKUn7UmwnnkiTlwpo1a/ja177Gm2++me9QJKnoFH3y4WpXklRcmjRpwuzZs4n4wlHAkqQ6UPTJh6tdSVLxGTRoEDfffHO+w5CkolP0cz4kScXn008/5Y477uCRRx6hd+/etGzZskL5r3/96zxFJkmFzeRDklR0Xn/9dXr16gXAO++8U6HM4ViSVHeKPvlwqV1JKj6PPfbYpitJkmqdcz6c8yFJkiTlRNEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKiaJPPtxkUJIkScqNok8+nHAuSZIk5UbRJx+SJEmScsPkQ5IkSVJOmHxIkiRJygmTD0mSJEk5UfTJh6tdSZIkSblR9MmHq11JkiRJuVH0yYckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSeKPvlwk0FJkiQpN4o++XCTQUmSJCk3ij75kCRJkpQbJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSe2yHcAdSEi5gBLgXXAxymlb+Q3IkmSJEkFmXxkHZhSWp7vICRJkiRlOOxKkiRJUk7kNPmIiEMj4oGImBcRKSIGV1FneETMjohVETEjIg75Ek0l4ImIeD4iTt7swCVJkiRttlwPu2oFvAL8KfuoICIGAjcAw4Gp2Z8PRsSeKaW52TolVB13v5TS/Ozzg1NK8yKiC/BoRLycUnqp9m9HkiRJUnXlNPlIKU0EJgJExLgqqpwLjEsp3Zw9PjMijgJOB36SvcZ+1WhnXvbngoiYCPQCTD4kSZKkPKo3cz4iYkugNzCpUtEk4MAaXKdlRGyVfd4K6Au8upG6wyJiekRM/+CDD75c4JIkSZKqpd4kH0AHoDFQWul8KbBNDa7TGZgaEf8HPAP8KaX0fFUVU0o3pZT6pJT6dOzY8cvELEmSJKmaCm6p3ZTSO8BXqls/IgYAA3r06FF3QUmSJEmqVz0fi4HPyfRclNcZWFhXjaaUJqSUhrVp06aumpAkSZJEPUo+UkqrgRnAEZWKjgCeyn1EkiRJkmpTToddZSeArx/f1AjYPiL2Az7KLqV7LTA+Ip4DpgGnAV2B39dhTA67kiRJknIg1z0ffYAXs4/mwOjs80sBUkp/Bc4BRgIlwMFA/5TSu3UVkMOuJEmSpNzI9T4fjwOxiTpjgbE5CUiSJElSztSbOR/5EhEDIuKmJUuW5DsUSZIkqaAVffLhsCtJkiQpN4o++ZAkSZKUG0WffDjsSpIkScqNok8+HHYlSZIk5UbRJx+SJEmScsPkQ5IkSVJOFH3y4ZwPSZIkKTeKPvlwzockSZKUG0WffEiSJEnKjS3yHYAkCeLiD/IdwialqzrmOwRJUgNnz4ckSZKknCj65MMJ55IkSVJuFP2wq5TSBGBCnz59huY7lvrGYSANk++bJEmqr4q+50OSJElSbph8SJIkScoJkw9JkiRJOWHyIUmSJCknij75cLUrSZIkKTeKPvlIKU1IKQ1r06ZNvkORJEmSClrRJx+SJEmScsPkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlRNEnH+7zIUmSJOVG0Scf7vMhSZIk5UbRJx+SJEmScsPkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJwoyOQjIrpHxGMR8VpEvBwRLfMdkyRJklTstsh3AHVkHDAypfRkRLQDPstzPJIkSVLRK7jkIyL2AtaklJ4ESCl9lOeQJEmSJJHjYVcRcWhEPBAR8yIiRcTgKuoMj4jZEbEqImZExCE1bGYXYHlETIiIFyLip7USvCRJkqTNkuuej1bAK8Cfso8KImIgcAMwHJia/flgROyZUpqbrVNC1XH3SynNz5YdAuwHLAIeiojnU0qP1MH9SJIkSaqmnCYfKaWJwESAiBhXRZVzgXEppZuzx2dGxFHA6cBPstfYbxPNzAOmp5Tey7YzkUwiYvIhSZIk5VGklPLTcMRy4IyU0rjs8ZbACuB/Ukr3lKt3I7B3Sunr1bzuFsDzQF9gCfAP4A8ppX9WUXcYMCx7uBvw5pe+ocLUAVic7yBUY75vDZPv24Z2SCl1zHcQDVFEDEsp3ZTvOFQzvm8Nk+9bzdSnCecdgMZAaaXzpcDh1b1ISmltdp7HFCCASVUlHtm6NwH+x7IRETE9pdQn33GoZnzfGibfN9WyYfj3rSHyfWuYfN9qoD4lH7UmpfQg8GC+45AkSZL0H/Vpk8HFwOdA50rnOwMLcx+OJEmSpNpUb5KPlNJqYAZwRKWiI4Cnch+RsAuxofJ9a5h831Sb/O+pYfJ9a5h832ogpxPOI6IV0CN7+BRwFfAA8FFKaW52qd3xZJbYnQacBvwA2Cul9G7OApUkSZJU63KdfBwGPFZF0R9TSoOzdYYDFwJdyOwJ8uOU0pRcxShJkiSpbuRtqV1JkiRJxaXezPlQ/RARh0bEAxExLyJSRAzOd0yqaFPvUWT8PCLmR8TKiHg8IvbKU7hFqzbep4hoGxHjI2JJ9jE+IrbO6Y2owfDzu2HwM7xh8DO87ph8qLJWZIa7nQ2szHMsqtqm3qMLgfOAM4H/BywCHomIrXIWoaB23qc7gV7AUdlHLzLz4qSq+PndMPgZ3jD4GV5HHHaljaq8C73qn8rvUUQEMB/4bUrpiuy55mQ+FM9PKf0hX7EWsy/zPkXEHsBrwMEppWnZOgcDTwK7p5TezP2dqKHw87th8DO8YfAzvHbZ8yEVlu7ANsCk9SdSSiuBKcCB+QpKG6jO+3QAsJyKS41PAz7F91IqVH6GNwx+hm8Gkw+psGyT/Vla6XxpuTLlX3Xep22AD1K57uns80X4XkqFys/whsHP8M1g8iFJkiQpJ0w+pMKyMPuzc6XzncuVKf+q8z4tBDpmxxYDZeOMO+F7KRUqP8MbBj/DN4PJh1RYZpP5UDti/YmIaAYcQsVxp8qv6rxPT5NZbeWAcq87AGiJ7+X/b+f+Q/2q6ziOP19jqzRJhjNXkAZZalLNoLISu1GtuT8KTfAPIxbWxEVU1D9FERFWkFFRCIOISbGEWOQ2wsxIxTFmjNiaP2r7Y4rYVnbdyrUy57s/zhl9/fr9fne/u/eee6/3+YAPOz8+53Pe3x3u+/A5n3M+0ouVOXxhMIdPw9K5DkDzS5KzgAvb1SXA+UlWAZNV9djcRaaTTnWNknwP+FKSR4A/A1+m+eht85wEvEhN9zpV1cNJ7gQ2JlnftrMR2L6YZ0nRcObvhcEcvjCYw2ePU+3qeZJMAL8bsOu2qlrXbTQa5FTXqB3W/SpwI7Ac2AV8qqr2dRelZuI6JVkO/AD4ULtpK810j0dmM3YtTObvhcEcvjCYw2ePnQ9JkiRJnfCbD0mSJEmdsPMhSZIkqRN2PiRJkiR1ws6HJEmSpE7Y+ZAkSZLUCTsfkiRJkjph50OaQ0lWJrkrybEkszLvdZKJJJVkxWy0L0mLlTlcGp+dD2kKkpyb5JkkL0+yrL3RnD8DTX8BeDWwCnjVDLQnSepjDpfmj6VzHYC0QLwT2FNVx5K8A5isqsdmoN0Lgd1VtX8G2pIkDWYOl+YJRz6kqXkXsKNdvqJneaQkNyY50D5xO5Dkkz37DgIfBj7WDqlvGtHO2iS7khxP8vck25K8rN23PMltSZ5q99+d5NIRba1L8nTftucN65+sk+SqJI8k+VeSrUnOTnJtkv1Jjib5SZIzetq5J8mtSb6R5Mkkf01yS5IlPXWuSbK3jXUyyb1JzpvK/6cknSZzuDlc84QjH9IQ7ZD83nb1TOBEknXAGUAlOQJsrqoNQ46/Gvgh8DngLuCDwK1JDlXVNuBtwGZgEvgMcHxIO2uArcC3gI/T/N2u5v8PDzYBF9HcBJ8CbgbuTPKGqhrY5hS9FPg8cD3wEmBLW44DHwHOAX4BbAC+03Pc9cD3aW72q9rfuBv4WZKVwO3AF9u2zgIun0aMkjSQOdwcrnmqqiwWy4BCc4N4LfBm4Jn239cB/wSubPetGHH8DuDHfds2Aff3rG8HNp0ijh3A7UP2vR4o4MqebWcDR4FPtOsTbZ0V7fo64Om+dgbVKeCinjq3ACd6f3P7e7b3rN8D7Oxr+zfAj9rlt7btXjDX19disby4izncHG6ZJN9I3gAAAlVJREFUn8XXrqQhqurZqjoIXAz8vqr2AiuBw1V1X1UdrKonRzRxCS8c2r8feOOYoVwG/HbEOZ4DdvbEfRT442mcp99/qupPPeuHgUN9v/kw8Mq+4/b2rT/RU2cPcDewL8mWJDclOXeacUrSC5jDzeGan3ztShoiyYPABcAyYEn7ju1SYGm7/GhVDX0vd4RZmY5xjPM8B6Rv27IB9Z4d0N5/B2zrf4gxtE5VnUiymmaYfjVwA/DNJO+pqj1D4pWksZnDzeGanxz5kIZbS/O+6yHgo+3yPuCz7fLaUxz/MPDuvm1XAA+NGccfgPeNOMcSmplcAEjyCuBNI87zN+DMtt5Jq8aM6bRVY2dVfY3mnekngOu6Or+kRcMcPgvM4ZouRz6kIarq0fbjuvOAO2ie/lwKbKmqv0yhiW8DP0+ym+ZjxTU0H/JdM2YoNwPbkhyg+fAvNE+cNlbV/iR3ABuTrAeOtPX/0dYdZBdwjOZp1XeBt9B8cDjrklwOvB/4Nc1w/2XAaxj/Zi5JI5nDZ545XDPBkQ9ptAmad4X/DbwdeHyKNy2q6pfAp2lmSnmIZjaUDdXMkjJlVfUr4GrgKponaPcC76UZeodm9pQHaGZTeYBmVpc1NWSWlKqapLmBfoDmveL1wFfGiWkajtI8SdwO7KeZYeXrVfXTjs4vaXGZwBw+k8zhmrZUdfXqoiRJkqTFzJEPSZIkSZ2w8yFJkiSpE3Y+JEmSJHXCzockSZKkTtj5kCRJktQJOx+SJEmSOmHnQ5IkSVIn7HxIkiRJ6oSdD0mSJEmd+B+dfPnSZR7P/gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import SplitExtract\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "objs = [SplitExtract([\"Name\"], [\", \"], [1], [\"Dummy\"])]\n", + "columns = [\"Name\"]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"SplitExtract\")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "9e2d3085", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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kopI0ScfkrQtHGqVHf5eVSiuueYaDjvsMJo0aULLli3p3bs3CxYsqFAnIqp8nH322VVe86yzziIiKqxitmzZMlq0aMH1119foe6rr77Krrvuyp/+9KeavzmpBhV98uFqV5K0bfbcc08ef/zxfIch1UozZ85kyJAhzJ07lxkzZlC/fn169erFihUryussXbq0wmPq1KkA/OhHP9rsevfddx/PPfcc7dq1q1Depk0bbrnlFkaMGMFrr70GlPXO9uvXjx/+8IeccsopWbxLaccV3A7n1ZVSmgpM7d69+8B8xyJJkuqmRx99tMLxpEmTaNq0KXPmzKF3795AWeKwqYceeoh99tmHb37zmxXKFy1axNChQ3n88cf53ve+t1lbffv25S9/+Qv9+vXj2Wef5YorrmDp0qU89thjNXxXUs0r+uRDkrbHs0fvndXrHz7rraxeX1J2rV69mtLSUpo1a1bl+TVr1vCnP/2JkSNHVijfuHEjP/7xjxkxYgT77bffFq8/btw4DjjgAE477TQeeOABHnroIZo3b16j9yBlg8mHJNVxe+65J2eddRaTJk1i6dKl/PCHP+R3v/sd69at4/TTT+dvf/sbGzdu5IgjjuDWW2/lK1/5ClC2V8RRRx3FjBkzePnll+nRowd33303LVq0AMq+uR0xYgRr1qxh2LBhFdp87rnnGDp0KK+//joNGzakT58+3HDDDey8886klBg2bBiTJ09m/fr1dOzYkSlTpnDggQfm/HeTDfFfH+Y7hIKQrm259Up12NChQ+natSs9evSo8vzdd9/Np59+yhlnnFGhfOTIkbRo0YLBgwd/4fWbN2/ONddcQ//+/Tn99NM5/vjjayx2KZuc8+GcD0kFYPLkyTz66KO89dZbvPnmm1x55ZWUlpbSv39/Fi1axLvvvkvDhg0555xzKrzu7rvvZsKECXzwwQd8+umn5RNbX3vtNQYPHsykSZNYsmQJH330Ee+//3756+rVq8dvf/tbli9fzjPPPMMTTzzBuHHjAJg+fTqzZs3izTffZOXKldxzzz3svvvuuftlSHk2bNgwZs+ezf3337/ZTvSfGz9+PD/4wQ8q7LEyc+ZMJk6cyB133LHVNkpLS5kwYQKNGjXi+eefZ/369TUWv5RNRZ98uNSupEJwzjnn0KFDB5o3b87w4cOZMmUKu+++O3369KFRo0Z86Utf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hx56iAULFtCvXz9OP/10Zs2aBZTNixs1ahQ///nPKSkpAWDlypX079+fCy64gCOOOCK7N1qLmHxIUoE6+OCDefXVV5k/fz7r16/nsssu2+Fr3nLLLbz//vusWLGCq666ir59+5af++EPf8iLL77ImDFj6Nev3w63JUnZ9uijj9K/f38OPPBADjroICZNmsSHH364WU/EokWLGDp0KHfffTcNGjTY7Dpz587l7LPP5utf/zqdOnXiggsuoEOHDjz33HPldS666CL22WcfBg0aBMC5555Ls2bNuPzyy7N7k7WMyYckFah99tmHSy+9lF69evHVr351s5Wvtsepp57KcccdR6dOndh7770ZMWJE+bmGDRvSp08fFi5cyEknnbTDbUlSrq1evZrS0lKaNWtWXrZx40Z+/OMfM2LECPbbb78qX3fkkUdyzz338NFHH1FaWspDDz3Ehx9+SK9evcrr7LTTTvzhD3/g8ccf57TTTuNPf/oTd911FzvvvHPW76s2cZ8PSdoOtWkfjnfeeafC8aY9HMOHD2f48OHlxz/5yU/Kn1deEWvAgAEMGDCg/Lhz585s3LixQp3DDjuMSy65ZIux7LHHHpx44ok0bty4GncgSbXD0KFD6dq1Kz169CgvGzlyJC1atGDw4MFbfN0999zDKaecQosWLahfvz677LILU6ZMoWvXrhXqde7cmYsuuohRo0bx61//erPzxcDkQ5JUI1asWMEdd9zBpEmT8h2KJFXbsGHDmD17NrNnz6ZevXpA2ZyQiRMnbnUFwREjRrB8+XIef/xxWrRowYMPPki/fv2YNWsWBx98cHm9devWMWXKFBo1asTs2bNJKRERWb2v2sZhV5KkHTZ+/Hg6dOjA9773PY4++uh8hyNJ1XL++eczZcoUZsyYQadOncrLZ86cydKlS2nbti3169enfv36LFq0iIsvvpivfOUrALz11luMHTuW8ePHc8wxx3DwwQczcuRIDjvsMMaOHVuhnYsvvpiNGzfy3HPP8cILL3DzzTfn9D5rg4Lt+YiIvwDfAp5IKZ2c53Akqc6rPLxrUwMHDmTgwIG5C0aSasjQoUP585//zJNPPsm+++5b4dyQIUM4+eSK/4z8zne+w49//OPyz7zPVxX8vLfkc/Xq1aO0tLT8+Mknn2TcuHE8+eSTHHDAAVx//fWcd955HH/88ey9997Z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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import Extract\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [Extract(columns=[\"Name\", \"Name\"], i_min_vec=[0, 2], i_max_vec=[1, 3])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"Extract\")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "6d1249d2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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xo177rLLLjX3hSRpE61evZq5c+fy8ccf88UXXxARNGrUiDZt2rDNNtuUt5sxYwZNmjRh6623Zu7cuaxcuZKGDRvyjW98g6ZN/zM3/N1332XJkiV06tSJDz74gOXLl1OvXj3atGlD69YV5m/zxRdfMGfOHJYsWcKXX35J3bp1KSkpoUWLFrRokZnyMWfOHObOnUuPHj3ILFJVUUqJRYsWsXDhQpYtW8aqVauoV68eTZo0oVWrVmy99dYAfP7557z//vt8+umn1KlTh+bNm9OsWTPeeustvvnNbzJz5swFZHqAziFTSLQmU8hMBs5PKa3pAUqvvfYaI0aM4NFHH2Xx4sW0atWKHj16cMIJJ3DooYdW1x+NtEEXXXQRd999Ny+//PLGGwNLliyhWbNmPPjggxx00EHl/7u99dZbOeqoowD44IMP6NChAw888AAHHXQQAJ999hl77LEH3/ve97j66qs54IADaNiwIQ8++GCNfTfpa1j3h0NWrer52IiWZLroK0+uLCPzr3eklL6MiDPIDFuoA1y+ocIj2/4G4AaA0tLSNHWqvfOSthwdO3Zkv/324y9/+ctXtjv22GOZOHEir7/+eo6SVY+IeC+l9DSZfwn+Srvuuit//etfN9ZMqlHvvPMO7dq1o0GDBuy1116MHDmSTp06rdPuiy++4IYbbqBp06Z0794dgGnTprFy5Ur69//POjnbb789u+66K0899VR58dG4cWNGjRrF/vvvz0cffcS///3vTS54pNpgSyo+NklK6T42fYMrImIAMKBz5841F0qSJBW0vfbai1GjRrHLLrswf/58Lr30Unr16sUrr7xS3mt4//338z//8z8sW7aMtm3b8vDDD9OmTWbdh3nz5lG3bl1atmxZ4b5t2rRh3rx5Fc7tt99+/OQnP+G2227j5ptvpn1719bRlqO2TTj/KgvIjJ2svLJLG2Deus03TUppXEppWLNmzTYnmyRJKmKHHHIIRxxxBN26daNfv37cf//9rF69mttuu628zQEHHMD06dN56qmnOPjggzniiCOYO7fyitUbV1ZWxr/+9S8aNWrEpEmTqvNrSDVuiyk+squoTCOzFvzaDiSz6pUkFZV33313o0OuAEaNGsXs2bNzkEjSGk2aNKFLly68+eab5ecaN25M586d2Xvvvbn55pupV68eN910EwDbbbcdq1atYsGCBRXuU1ZWxnbbbVfh3LBhw9h5552ZOHEif/nLXxg3blzNfyGpmtSq4iMimkRE94joTibbDtnjNUvpXgUcm11SbteIuIbMuvfXb8YzB0TEDYsXL978LyBJkgSsWLGC119/nbZt226wzerVq/n888wK1j179qRevXo8/PDD5ddnz57Na6+9Rq9e/1mRd9SoUUycOJHbbruNffbZh7PPPpvjjz+eRYsW1dyXkapRrVrtKiL2JzNZvLLbUkrHZtucBPwSaEtmmcVfpJQ2u8/RCeeSvsqSJUuYP38+K1dW3pZCX1e9evVo3bp1hZW51hYR01JKpZtwq9rzg0xF68wzz2TAgAHssMMOzJ8/n0suuYRJkyYxY8YMmjdvzuWXX86AAQNo27YtH330Eddeey1jxozh+eefp1u3bgCceOKJjBs3jlGjRtGiRQtOP/10Pv74Y6ZNm0bdunX54IMP6Nq1K5deeimnnnoqkJm8Xlpayu67786YMWPy+VsgrW3LWO0qpfQ4XxE22+Y64LqcBJIkMoVHWVkZ7du3p6SkZL3Ly6pqUkosX76cDz/M7G+4oQJE2lLMnj2bH//4xyxYsIBWrVqx995788wzz9ChQweWLVvGK6+8wi233MLChQtp0aIF3/72t5k0aVJ54QFw9dVXs9VWWzF48GCWL1/Od7/7XW6//Xbq1q1LSonjjjuO0tJSTjnllPLP1K9fn9tvv53vfOc7DBo0iB/96Ef5+PrSJqtVPR/5sNZqV0PXHpcpSWu89dZbtGvXjkaNGuU7SsFZtmwZc+bMYX0rDtrzIUlbrA3+K12tmvORD652JWljVq5cSUlJSb5jFKSSkhKHsklSESn64kOSNoVDrWqGv6+SVFyKvvhwtStJ2jQdO3Zk4sSJ+Y5R8C666CIiosJr7aVWU0pcdNFFtGvXjpKSEvbff39eeeWV8uuPP/74Op9f87rrrrsAePnll2nYsCH33HNPhWdPnDiRevXqMWXKlNx8WUlFp+iLD4ddSZJqm29961vMnTu3/DVjxozya5dffjlXXnklf/zjH3n++edp3bo1Bx54IEuXLgWgV69eFT47d+5czj33XJo0acIhhxwCQNeuXRkxYgQnnHACZWVlACxevJghQ4ZwxhlnsO++++b+S0sqCrVqtStJ2lI802enGr3/3pPertH7q3bbaqut1tlYDjK9HldffTXnnHMOAwcOBOC2226jdevWjB07luOPP5769euv89m7776bH//4xzRp0qT83FlnncV9993HsGHD+Oc//8mpp55K8+bNufjii2v2y0kqahYfkrSF69ixI8cffzyjR49m7ty5HHbYYfz5z39m+fLl/PSnP+XZZ5/lyy+/ZN999+X666/nG9/4BgD7778/vXv35tFHH+Wll15in332YezYsbRs2RKA0aNHc/755/Ppp59y+umnV3jmc889x2mnncZrr71GSUkJAwcO5KqrrqJ+/fqklDj99NMZM2YMK1asoEOHDtxxxx107do15783W6p33nmHdu3a0aBBA/baay9GjhxJp06dmDVrFvPmzaN///7lbUtKSujTpw9PPfUUxx9//Dr3evzxx3nzzTcZO3ZshfN16tThtttuY4899uCoo47irrvu4rnnnqN+/fo1/v3yIc75KN8RCkL6Tat8R9AWruiHXTnnQ1IhGDNmDA899BBvv/02M2fO5NJLL2X16tUMGTKE9957j/fff5+SkpIK+wMAjB07lltvvZX58+fzxRdfcMUVVwDw6quvcuKJJzJ69GjmzJnDwoULmT17dvnn6taty+9//3sWLFjA008/zSOPPMJ112W2YJowYQKTJk1i5syZLF68mDvvvJMWLVrk7jdjC7fXXnsxatQoHnzwQW688UbmzZtHr169WLhwIfPmzQOgTZs2FT7Tpk2b8muV3XDDDXTv3p3S0nVXLe7cuTNnnXUWY8eO5ZxzzqF79+7V/4UkaS1FX3w450NSITjllFPYfvvt2XbbbTnvvPO44447aNGiBQMHDqRRo0ZsvfXWnHfeeTzxxBMVPjdkyBC++c1vUlJSwhFHHMH06dOBzDCd73//+/Tp04cGDRpwySWXUKfOf35k9OzZk7333putttqqvOdlzb3r1avH0qVLef3110kpseuuu9K2bdvc/WZs4Q455BCOOOIIunXrRr9+/bj//vtZvXo1t912W5XvtXDhQu69916GDh263uvLly/njjvuoFGjRkyePJli3/tLUs0r+uJDkgrB9ttvX/6+Q4cOzJkzh2XLlnH88cfToUMHmjZtSp8+ffjkk09YtWpVedu15wY0atSITz/9FIA5c+ZUuGfjxo0r9F7MnDmT73//+2y33XY0bdqUX/3qVyxYsACAvn37csopp3DyySfTunVrhg0bxpIlS2rsuxe6Jk2a0KVLF958883yP681k8TXKCsrW+8ckTW7Yx911FHrvffZZ5/Nl19+yXPPPcfUqVP505/+VP1fQJLWYvEhSQXggw8+KH///vvv065dO6688kreeOMNnn32WZYsWcKkSZMANulft9u2bVvhnsuWLWPhwoXlxyeeeCK77LILb775JkuWLGHkyJEV7vvzn/+cadOm8eqrrzJz5kx+97vfVcfXLEorVqzg9ddfp23btuy4445st912PPzwwxWuP/nkk/Tq1Wudz950003893//N+vr3X/ssce47rrrGDVqFF26dOHKK6/knHPO4e23XexAUs2x+JCkAnDttdcye/ZsFi1axGWXXcbgwYNZunQpJSUlbLPNNixatIgRI0Zs8v0GDRrE/fffz+TJk/niiy+44IILWL16dfn1pUuX0rRpU5o0acLrr7/On//85/Jrzz//PM8++ywrV66kcePGNGzYsMKQLX21M888kyeeeIJZs2bx7LPPMmjQID777DOOOeYYIoLhw4fz29/+lnvvvZeXX36ZY489liZNmnDkkUdWuM/kyZN59dVX1zvkaunSpQwZMoTTTjuN3r17AzB06FB69+7NkCFDKvxZS1J1KvqfBk44l1QIjjzySPr370+nTp3YaaedOP/88xk+fDjLly+nZcuW7L333hx88MGbfL8uXbpw7bXXcuSRR9K2bVuaN29evkoWwBVXXMHYsWPZeuutGTp0KIMHDy6/tmTJEoYOHUrz5s3p0KEDLVq04KyzzqrW71vIZs+ezY9//GO+9a1vcfjhh9OgQQOeeeYZOnToAMAvf/lLfvGLX3DyySdTWlrK3LlzmTBhAltvvXWF+9x4443suuuu692zY/jw4TRq1IjLLruswvmbb76ZGTNmcM0119TcF5RU1MLJZRmlpaVp6tSp+Y4hqRZ67bXX2HXXXfMdY4M6duzITTfdRL9+/fId5WvZ0O9vRExLKa27RNO6/EGmjXKp3erhUrvaRLGhC0Xf8yFJkiQpNyw+JEmSJOWEO5xL0hbu3XffzXcESZI2iT0fkiRJknKi6IsPV7uSJEmScqPoh12llMYB40pLS9ddCF2SpEpcNal6uGqSVJyKvudDkiRJUm5YfEiSJEnKCYsPSZIkSTlh8SFJkiQpJ4p+wrkkfR01PenYybiSpEJkz4ckbeE6duzIFVdcQbdu3WjWrBmDBw9mxYoVjBo1iv32269C24jgrbfeAuDYY4/lpJNO4pBDDqFJkybsu+++zJs3j+HDh9O8eXN22WUXXnzxxQrP+fWvf81uu+1G8+bNGTJkCCtWrACga9eujBs3rrztypUradmyZYXPS5JU9MWH+3xIKgR33nknDz74ILNmzeKll15i1KhRm/y5Sy+9lAULFtCgQQP22WcfevTowYIFCxg0aBCnn356hfZjxozhoYce4u2332bmzJlceumlABx99NH85S9/KW83fvx42rZty5577llt31GStOUr+uIjpTQupTSsWbNm+Y4iSV/bz3/+c9q1a8e2227LgAEDmD59+iZ97kc/+hE9e/akYcOG/OhHP6Jhw4YcffTR1K1bl8GDB6/Tc3HKKaew/fbbs+2223Leeedxxx13APCTn/yE8ePHs2TJEgBGjx7NT3/60+r9kpKkLV7RFx+SVAi222678veNGjXi008/3aTPtWnTpvx9SUnJOseV77P99tuXv+/QoQNz5swBoF27duy7777cc889fPLJJzzwwAMcddRRX+u7SJIKlxPOJalANW7cmGXLlpUfz5s3b7Pv+cEHH5S/f//992nXrl358THHHMNNN93El19+yT777EP79u03+3mSpMJiz4ckFag99tiDV155henTp7NixQouuuiizb7ntddey+zZs1m0aBGXXXYZgwcPLr922GGH8cILL3DNNddw9NFHb/azJEmFx+JDkgrUN7/5TS644AL69evHzjvvvM7KV1/HkUceSf/+/enUqRM77bQT559/fvm1kpISBg4cyKxZszj88MM3+1mSpMITKaV8Z6gVSktL09SpU/MdQ1It9Nprr7HrrrvmO0bedezYkZtuuol+/fptsM3FF1/MzJkzK6x8tTEb+v2NiGkppdJNuEVOf5DV9B4vxSLXe9n451Y93INImyg2dME5H5KkarFo0SJuvvlmRo8ene8okqRaymFXkqTNduONN7L99ttzyCGH0KdPn3zHkSTVUgXb8xERfwf2Bx5JKQ3KcxxJ2uK9++67G7w2dOhQhg4dmrswkqQtUiH3fFwDuNyKJEmSVEsUbPGRUnocWJrvHJIKg4tz1Ax/XyWpuOS8+IiIPhFxX0R8GBEpIo5dT5uTImJWRKyIiGkR0TvXOSVpjXr16rF8+fJ8xyhIy5cvp169evmOIUnKkXz0fDQBXgZOA9b5aR4Rg8kMmRoJ7Ak8BTwQETus1WZ6RLy8nle7yveTpM3VunVrPvzwQ5YtW+a/1FeTlBLLli3jww8/pHXr1vmOI0nKkZxPOE8pjQfGA0TEqPU0OR0YlVK6MXt8akQcDJwInJu9R/ccRJUkAJo2bQrAnDlzWLlyZZ7TFI569erRpk2b8t9fSVLhq1WrXUVEfaAncEWlSxOAXjXwvGHAMIAddthhI60lFbOmTZv6l2RJkjZTbZtw3hKoC5RVOl8GbFeVG0XEROAu4NCImB0R+1Ruk1K6IaVUmlIqbdXKHTslSZKkmlSrej6qU0qp36a0i4gBwIDOnTvXcCJJkiSpuNW2no8FwCqgTaXzbYB5NfHAlNK4lNKwZs2a1cTtJUmSJGXVquIjpfQFMA04sNKlA8mseiVJkiRpC5XzYVcR0QRYM8apDrBDRHQHFqWU3geuAkZHxHPAFOAEoB1wfQ3lcdiVJEmSlAP56PkoBV7MvkqAEdn3FwOklP4GDAfOB6YD+wGHppTeq4kwDruSJEmSciMf+3w8DsRG2lwHXJeLPPZ8SJIkSblRq+Z85IM9H5IkSVJuFH3xIUmSJCk3LD4kSZIk5UTRFx8RMSAibli8eHG+o0iSJEkFreiLD+d8SJIkSblR9MWHJEmSpNwo+uLDYVeSJElSbhR98eGwK0mSJCk3ir74kCRJkpQbFh+SJEmScsLiQ5IkSVJOFH3x4YRzSZIkKTeKvvhwwrkkSVJxuvbaa+nWrRtNmzaladOm7LPPPvzrX/8qv15WVsaxxx5Lu3btaNSoEQcffDBvvvnmOvd57rnnOPDAA2nSpAlbb701vXr1YsGCBQC8/PLLNGzYkHvuuafCZyZOnEi9evWYMmVKzX7JWqboiw9JkiQVp2984xv89re/5YUXXmDq1Kn07duXww47jJdeeomUEocddhhvvvkm//jHP3jxxRfp0KED/fr147PPPiu/x7PPPkv//v3Zf//9eeaZZ5g2bRpnnnkm9erVA6Br166MGDGCE044gbKyMgAWL17MkCFDOOOMM9h3333z8t3zJVJK+c5QK5SWlqapU6fmO4YkKSsipqWUSjehaU5/kMU5H+XycQUr/aZVTp/nn1v1yPWfWz5su+22/PrXv+aAAw7gW9/6FtOnT2ePPfYAYPXq1Wy33XaMHDmSn/3sZwD06tWLAw44gMsuu2yD91y9ejW9e/emZcuW/POf/+Too49m+vTpTJ06lfr16+fke+VYbOiCPR+SJEkqeqtWreKvf/0rn376Kb169eLzzz8HoGHDhuVt6tSpQ4MGDZg8eTIA8+fP5+mnn6Zt27bst99+tG7dmt69e/PII49UuHedOnW47bbbmDhxIkcddRR//etfuf322wu18PhKFh+SJEkqWjNmzKBJkyY0aNCAE044gb///e/svvvu7LLLLuywww786le/YtGiRXzxxRf89re/Zfbs2cydOxeAd955B4ALL7yQ4447joceeojevXtz0EEH8e9//7vCczp37sxZZ53F2LFjOeecc+jevXvOv2ttUPTFh6tdSZIkFa81Q6ueffZZTjzxRI455hhefvll6tWrx7333svbb79NixYtaNSoEY899hiHHHIIdepk/gq9evVqAI4//niOO+449txzT0aOHMm3v/1trr/++grPWb58OXfccQeNGjVi8uTJFOvUh6IvPlztSpIkqXjVr1+fzp0707NnT37961/TvXt3fv/73wPQs2dPpk+fzieffMLcuXN58MEHWbhwIZ06dQKgbdu2AOy2224V7rnbbrvx/vvvVzh39tln8+WXX/Lcc88xdepU/vSnP+Xg29U+RV98SJIkSWusXr26fL7HGs2aNaNVq1a8+eabTJ06lR/+8IcAdOzYkXbt2vHGG29UaD9z5kw6dOhQfvzYY49x3XXXMWrUKLp06cKVV17JOeecw9tvv13zX6iW2SrfASRJkqR8OOecc/je977H9ttvz9KlSxk7diyPP/54+V4fd911Fy1btqRDhw7MmDGD0047jcMOO4z+/fsDEBGcddZZXHjhhXTr1o0999yTO++8k2eeeaa8Z2Pp0qUMGTKE0047jd69ewMwdOhQ7rnnHoYMGcLjjz9ePoyrGFh8SJIkqSjNmzePn/zkJ8ybN49mzZrRrVs3HnjgAQ466CAA5s6dy+mnn05ZWRlt27bl6KOP5n//938r3GP48OF8/vnnnHHGGSxcuJAuXbrwwAMPlC/PO3z4cBo1arTOUrw333wzXbt25ZprruEXv/hFbr5wLeA+H1nu8yFJtYv7fBQ29/nYMhXDPh+qFu7zIUmSJCm/LD4kSZIk5YTFhyRJkqScKPriw00GJUmSpNwo+uLDTQYlSZKk3HCpXUlS0Vq+fHn5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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import UpperCase\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [UpperCase(columns=[\"Name\"])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"UpperCase\")" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "81c62206", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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N8j8wF5MZsWVvVJKn67jHsPILBFJ06ZNd99hhx0qayZJObVw4ULef//9Ss81atSIHXfckfnz57No0SK+/vprGjRowFZbbUXHjh2pOBf7jTfeYNmyZfTo0YNGjTLTKD777DPeffddWrVqRdeuXcu1TymxYMECPv30U1asWEFE0LBhQ5o3b06HDh2oV68eX331FTNnzqRLly60bt260pzLly+npKSEJUuWsGrVKiKCJk2a0LJlS1q3bs1mm21GSol58+bx6aefsmrVKpo2bUrnzp1555132GKLLfj0008Xkum5+QOZ1ay6kCmG3gJuSCndsyb2ihUruPrqq7nvvvuYM2cOTZs2Zdttt+VHP/oRF110EZtvXqv+1vatLrnkEh588EFmzpy5Qe2XLFlCixYt+Oc//8lBBx0EwH777cfOO+/Mn/70p3W+b/Xq1fTr14/WrVvz8MMPc9xxxzFt2jSmTJlCgwYNquWzSCpaFRcGKVV3fhpDazJd8SUVjpcAAwBSSqsi4hwyf9XbDLhmXYVHtv2twK0Affr0SVOmTKmJ3JKkjRAR76eUviLTW/KtGjVqxCWXXMIll1xS88Fy4N1336Vjx440bNiQvn37cuWVV9KtW7e12n399dfceuutNG/enF69epU7d99993HffffRrl07fvjDHzJixAi22GKL0vObbbYZd999N7vuuivHHHMMDzzwAC+//LKFh6QaVZeKjw2SUhpHZlWUDZJdbWVg9+7day6UJEkbqG/fvowePZoddtiBBQsWcPnll7PXXnsxa9YsWrXKLNz1v//7v/z0pz9l2bJldOjQgccff5x27dqVXuPoo4+mS5cudOzYkVmzZnHhhRcyffp0JkyYUO5e3bt357zzzmPkyJH85je/WauAkaTqVlDDrjblfvZ8SFLtEhFTU0p9NqBp7fxFVk2WLl1Kt27duOCCCzj77LMB+PLLL5k/fz4LFy7ktttu48knn+SFF16gQ4cOlV7j5Zdfpm/fvkydOpXevXuXHl++fDm9evXio48+om/fvjz55JNrDd2TpI2wzh8ktW21q3VKKX1NZg7HARVOHUBmwqUkSQWnWbNm9OjRg3/961+lx5o2bUr37t3ZY489uOOOO6hfvz633377Oq/Rp08f6tWrV+4aAOeffz6rVq3i5ZdfZsqUKd86R0SSqkOtKj4iollE9IqIXmSybZ19vWYp3euBEyLixIjYMSJuJLO3xy2bcM+BEXHr4sWLN/0DSJJUzVasWMGbb765zl4NyEwe/+qrr9Z5fsaMGXzzzTflrvH0008zatQoRo8eTY8ePbjuuuu44IILeOedd9Z5HUnaVLVq2FVE7Ef5NefXuHvNJlTZTQZ/RWaTwZnAWSmlSZW8p0ocdiXp2yxZsoQFCxawcuXKfEcpGPXr16dt27Y0b9680vPFOuzq3HPPZeDAgWy99dYsWLCAyy67jEmTJjFjxgxatmzJNddcw8CBA+nQoQOffPIJN910E2PHjuWVV16hZ8+evPPOO4wdO5ZDDjmE1q1b8/rrr3POOefQuHFjXnnlFerVq8cXX3zBLrvswqBBg7juuutK733wwQezbNkyJk6cyGab1aq/T0qqW+rGalcppYl8S9hsm1HAqJwEkiQyhUdJSQmdOnWicePGjomvBiklli9fzty5cwHWWYAUo48++oif/exnLFy4kDZt2rDHHnvw4osv0qVLF5YtW8asWbO48847+fTTT2nVqhX/8R//waRJk+jZsycADRo04Mknn+TGG29k6dKldO7cmR/96EeMGDGCevUy+zeeeeaZNGnShCuuuKLcve+44w523nlnbrzxRs4666ycf3ZJha9W9XzkQ5nVroZWHAsrSQBvv/02HTt2pEmTJvmOUnCWLVvGvHnzqGzFwWLt+ZCkAlD3J5zXlJTSIymlYS1atMh3FEm11MqVK2ncuHG+YxSkxo0bO5RNBeGSSy4hIso92rdvX3r+oYce4qCDDqJNmzZEBBMnTqz0Oi+//DIHHHAAzZo1Y4sttmCvvfZi4cKFAMycOZNGjRrxt7/9rdx7nnjiCerXr8/kyW5Mr9qv6IsPSdoQDrWqGf67qpBsv/32zJ8/v/QxY8aM0nNffvkle+21F9dff/063//SSy9x4IEHst9++/Hiiy8ydepUzj33XOrXrw/AzjvvzMiRI/nFL35BSUlmz+XFixczZMgQzjnnHPbee++a/YBSNahVcz7ywU0GJWnDdO3aldtvv50BAwbkO4pUK22++eblejvKOvbYYwFKezEqc9ZZZ3HqqacyfPjw0mPbbbdduTbnnXce48aNY9iwYTz88MOcfvrptGzZkksvvbQaPoFU84q+58NhV5IkqTq8++67dOzYkW222Yaf/vSnvPvuuxv83gULFpRuFLnPPvvQtm1b+vXrx5NPPlmu3Wabbcbdd9/NE088wTHHHMN9993HX/7yFxo0aFDdH0eqEUXf8yFJG+PFfbet0evvMcm9FqS6pG/fvowePZoddtiBBQsWcPnll7PXXnsxa9YsWrVqtd73rylURowYwe9+9zt22203HnjgAQ466CCmTp3KrrvuWtq2e/funHfeeYwcOZLf/OY39OrVq8Y+l1TdLD4kqY7r2rUrJ510EmPGjGH+/Pkcfvjh3HzzzSxfvpxjjz2Wl156iVWrVrH33ntzyy238J3vfAeA/fbbj379+vHUU08xffp09txzT+655x5at24NwJgxY7joootYunQpZ599drl7vvzyy5xxxhm88cYbNG7cmEGDBnH99dfToEEDUkqcffbZjB07lhUrVtClSxfuvfdedt5555z/29SEuOCTfEcoCOnqNvmOUK1++MMflnu9xx570K1bN+6+++61/v9TmdWrVwNw0kkn8fOf/xyA3XbbjaeffppbbrmFm2++ubTt8uXLuffee2nSpAnPPfccKSXnT6nOKPphV+5wLqkQjB07lscee4x33nmH2bNnc/nll7N69WqGDBnC+++/zwcffEDjxo057bTTyr3vnnvu4a677mLBggV8/fXXXHvttQC8/vrrnHzyyYwZM4Z58+bx6aef8tFHH5W+r169etxwww0sXLiQF154gSeffJJRozJbME2YMIFJkyYxe/ZsFi9ezP33379Bf/mVCkmzZs3o0aMHG7qM/5rd53faaadyx3faaSc++OCDcsfOP/98Vq1axcsvv8yUKVP405/+VD2hpRwo+uLDOR+SCsFpp51G586d2WqrrRg+fDj33nsvrVq1YtCgQTRp0oQtttiC4cOH88wzz5R735AhQ9huu+1o3LgxRx11FNOmTQPgwQcf5NBDD2XfffelYcOGXHbZZeV2vN59993ZY4892HzzzUt7XtZcu379+nzxxRe8+eabpJTYcccdS//DSioWK1as4M0339zg/+137dqVjh078tZbb5U7Pnv2bLp06VL6+umnn2bUqFGMHj2aHj16cN1113HBBRfwzjsO1VTdUPTFhyQVgs6dO5c+79KlC/PmzWPZsmWcdNJJdOnShebNm7Pvvvvy+eef880335S2LbsyT5MmTVi6dCkA8+bNK3fNpk2bluu9mD17Noceeijt27enefPm/PrXvy5dxad///6cdtppnHrqqbRt25Zhw4axZMmSGvvsUm1w7rnn8swzzzBnzhxeeukljjzySL788kuOP/54ABYtWsS0adOYOXMmkNm8dNq0aXz88cdAZtnp8847jz/84Q888MADvP3221x55ZW8+OKLnHTSSQB88cUXDBkyhDPOOIN+/foBMHToUPr168eQIUNKh25JtZnFhyQVgA8//LD0+QcffEDHjh257rrreOutt3jppZdYsmQJkyZNAiCl9W8I3qFDh3LXXLZsGZ9++mnp65NPPpkddtiBf/3rXyxZsoQrr7yy3HV/+ctfMnXqVF5//XVmz57N7373u+r4mFKt9dFHH/Gzn/2M7bffniOOOIKGDRvy4osvlvZajBs3jt122439998fyBQNu+22G7fcckvpNc4880x+/etfc84557Drrrvyj3/8g0cffbR0svmZZ55JkyZNuOKKK8rd+4477mDGjBnceOONOfq00sZzwrkkFYCbbrqJQw89tPQ/TAYPHswXX3xB48aN2XLLLVm0aBEjR47c4OsdeeSR9O3bl+eee47vfe97XHzxxeX+qvrFF1/QvHlzmjVrxptvvsnNN99MmzaZCcSvvPIKq1evpnfv3jRt2pRGjRqVG7IlFaL77rvvW8+fcMIJnHDCCeu9zvnnn8/5559f6bk77rij0uOdOnXis88+W++1pdqg6H8bOOFcUiE4+uijOfDAA+nWrRvbbrstF110EWeeeSbLly+ndevW7LHHHhx88MEbfL0ePXpw0003cfTRR9OhQwdatmxZukoWwLXXXss999zDFltswdChQxk8eHDpuSVLljB06FBatmxJly5daNWqFeedd161fl5JUt0UG9L9Xgz69OmTpkyZku8YkmqhN954gx133DHfMdapru88vq5/34iYmlLqswGXyOkvMpfarR6FttSupHLWufZz0fd8SJIkScoNiw9JkiRJOeGEc0mq49577718R5BqPYfLVQ+Hy2lT2fMhSZIkKSeKvvhwtStJkiQpN4q++EgpPZJSGtaiRYt8R5EkSZIKWtEXH5IkSZJyw+JDkiRJUk5YfEiSJEnKCYsPSZIkSTnhPh+StBFqes8A19KXJBUiez4kqY7r2rUr1157LT179qRFixYMHjyYFStWMHr0aPbZZ59ybSOCt99+G4ATTjiBU045hR/+8Ic0a9aMvffem48//pgzzzyTli1bssMOO/Daa6+Vu89VV13FTjvtRMuWLRkyZAgrVqwAYOedd+aRRx4pbbty5Upat25d7v2SJBV98eE+H5IKwf33388///lP5syZw/Tp0xk9evQGv+/yyy9n4cKFNGzYkD333JPevXuzcOFCjjzySM4+++xy7ceOHctjjz3GO++8w+zZs7n88ssBOO644/if//mf0nbjx4+nQ4cO7LbbbtX2GSVJdV/RFx/u8yGpEPzyl7+kY8eObLXVVgwcOJBp06Zt0Pt+8pOfsPvuu9OoUSN+8pOf0KhRI4477jjq1avH4MGD1+q5OO200+jcuTNbbbUVw4cP59577wXgv/7rvxg/fjxLliwBYMyYMRx77LHV+yElSXVe0RcfklQI2rdvX/q8SZMmLF26dIPe165du9LnjRs3Xut1xet07ty59HmXLl2YN28eAB07dmTvvffmb3/7G59//jmPPvooxxxzzEZ9FklS4XLCuSQVqKZNm7Js2bLS1x9//PEmX/PDDz8sff7BBx/QsWPH0tfHH388t99+O6tWrWLPPfekU6dOm3w/SVJhsedDkgrUrrvuyqxZs5g2bRorVqzgkksu2eRr3nTTTXz00UcsWrSIK664gsGDB5eeO/zww3n11Ve58cYbOe644zb5XpKkwmPxIUkFarvttuPiiy9mwIABfPe7311r5auNcfTRR3PggQfSrVs3tt12Wy666KLSc40bN2bQoEHMmTOHI444YpPvJUkqPJFSyneGWqFPnz5pypQp+Y4hqRZ644032HHHHfMdI++6du3K7bffzoABA9bZ5tJLL2X27NnlVr5an3X9+0bE1JRSnw24RE5/kdX0Hi/FItd72fh9qx7uQaQNFOs64ZwPSVK1WLRoEXfccQdjxozJdxRJUi3lsCtJ0ia77bbb6Ny5Mz/84Q/Zd9998x1HklRLFWzPR0T8HdgPeDKldGSe40hSnffee++t89zQoUMZOnRo7sJIkuqkQu75uBFwuRVJkiSplijY4iOlNBH4It85JBUGF+eoGf67SlJxyXnxERH7RsS4iJgbESkiTqikzSkRMSciVkTE1Ijol+uckrRG/fr1Wb58eb5jFKTly5dTv379fMeQJOVIPno+mgEzgTOAtX6bR8RgMkOmrgR2A54HHo2Ircu0mRYRMyt5dKx4PUnaVG3btmXu3LksW7bMv9RXk5QSy5YtY+7cubRt2zbfcSRJOZLzCecppfHAeICIGF1Jk7OB0Sml27KvT4+Ig4GTgQuz1+iVg6iSBEDz5s0BmDdvHitXrsxzmsJRv3592rVrV/rvK0kqfLVqtauIaADsDlxb4dQEYK8auN8wYBjA1ltvvZ7WkopZ8+bN/Y9kSZI2UW2bcN4aqAeUVDheArSvyoUi4gngAeCQiPgoIvas2CaldGtKqU9KqU+bNu7YKUmSJNWkWtXzUZ1SSgM2pF1EDAQGdu/evYYTSZIkScWttvV8LAS+AdpVON4O+LgmbphSeiSlNKxFixY1cXlJkiRJWbWq+EgpfQ1MBQ6ocOoAMqteSZIkSaqjcj7sKiKaAWvGOG0GbB0RvYBFKaUPgOuBMRHxMjAZ+AXQEbilhvI47EqSJEnKgXz0fPQBXss+GgMjs88vBUgp/RU4E7gImAbsAxySUnq/JsI47EqSJEnKjXzs8zERiPW0GQWMykUeez4kSZKk3KhVcz7ywZ4PSZIkKTeKvviQJEmSlBsWH5IkSZJyouiLj4gYGBG3Ll68ON9RJEmSpIJW9MWHcz4kSZKk3Cj64kOSJElSbhR98eGwK0mSJCk3ir74cNiVJEmSlBtFX3xIkiRJyg2LD0mSJEk5YfEhSZIkKSeKvvhwwrkkSZKUG0VffDjhXJIkScqNoi8+JEmSJOWGxYckSZKknLD4kCRJkpQTFh+SJEmScqLoiw9Xu5IkSZJyo+iLD1e7kiRJknKj6IsPSZIkSblh8SFJkiQpJyw+JEmSJOWExYckSZKknLD4kCRJkpQTFh+SJEmScsLiQ5IkSVJOFH3x4SaDkiRJUm4UffHhJoOSJEnF6aabbqJnz540b96c5s2bs+eee/J///d/pecjotLHqaeeWtrmoYce4qCDDqJNmzZEBBMnTix3j48//pjWrVtz3XXXlTs+a9YsGjVqxH333Vejn7G2KfriQ5JUvJYvX87MmTOZOXMmy5cvz3ccSTn2ne98h9/+9re8+uqrTJkyhf79+3P44Yczffp0AObPn1/u8cgjjwBw1FFHlV7jyy+/ZK+99uL666+v9B7t27fnpptu4qKLLuL1118HYOXKlRx33HEcfvjh/PSnP63hT1m7bJ7vAJIk5dpXX33F+eefz5///Ge+/vprUko0bNiQYcOG8dvf/pZGjRrlO6KkHDjssMPKvb7iiiu4+eabeeGFF+jZsyft27cvd/7hhx9mu+224/vf/37psWOPPRaAhQsXrvM+gwcP5u9//zvHHXccL774Ipdddhnz58/n8ccfr8ZPUzdYfEiSis7JJ5/MhAkTuP3229lzzz0BeOGFF7jwwgv54osvuPPOO/OcUFKuffPNNzzwwAMsXbqUvfbaa63zS5cu5b777mPEiBEbdf1Ro0bRo0cPjjnmGB566CEefvhhttpqq02NXedYfEiSis4DDzzAQw89xAEHHFB6rFu3brRt25ZBgwZZfEhFZMaMGey5556sWLGCZs2a8fe//51ddtllrXb33HMPX3/9Nccff/xG3WerrbbiqquuYsiQIRx77LEccsghmxq9TnLOhySp6DRt2pROnTqtdbxTp040btw4D4kk5cv222/PtGnTeOmllzj55JM5/vjjmTlz5lrtbrvtNg477DDatGmzUfdZvXo1d911F02aNOGVV15hxYoVmxq9TrL4kCQVndNPP52RI0eWm2S+fPlyLrvsMk4//fQ8JpOUaw0aNKB79+7svvvuXHXVVfTq1YsbbrihXJtp06YxZcoUhg4dutH3+f3vf8+MGTN45ZVXWLp0KcOHD9/U6HWSw64kSUXnxRdf5JlnnqFTp0707NkTyAy9WLVqFV9++SU//vGPS9uOGzcuXzEl5cHq1av56quvyh279dZb2WabbRgwYMBGXfONN95g+PDh3H777ey0007ccccdHHLIIRxxxBHsvffe1RG7zijI4iMiOgNjgLbAKuCylNID+U0lSaotWrduzaBBg8od22abbfKURlK+XHDBBfzoRz+ic+fOfPHFF9xzzz1MnDix3F4fy5YtY+zYsfzqV78iIta6xqJFi/jggw/4/PPPAXj77bfZcsstad++Pe3bt2fVqlUcf/zx/OhHP+KYY44B4MADD+TEE09kyJAhTJs2jSZNmuTmA9cCBVl8kCk4zkwpTYuI9sDUiBifUvoy38EkSfl311135TuCpFrg448/5r/+67/4+OOPadGiBT179uTRRx/loIMOKm3z17/+lS+//JIhQ4ZUeo1x48aVO7dmaNaIESO45JJLuOqqq3j//ffLFTQA1157LT179uTCCy/kxhtvrIFPVztFSinfGWpcRPw/4NCU0ofratOnT580ZcqUHKaSJH2biJiaUuqzAU1z+ossLvgk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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import LowerCase\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [LowerCase(columns=[\"Name\"])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"LowerCase\")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "838dbdb7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeZyVZd348c8XRGURZBdcWMRyQUXAEhUfRUTzF5Vi0qO5oIGJIoKalibilo+hZT2SuUGSUi6lkpqIQAhugRCilEW4ADKKKGCAgly/P85hHmYAYWTOOcM5n/frdV5z7vu67vv63gdeM/Oda4uUEpIkSZKUa7UKHYAkSZKk0mDyIUmSJCkvTD4kSZIk5YXJhyRJkqS8MPmQJEmSlBcmH5IkSZLywuRDkqpZRHwrIqZExHsRsSoi3oqIRyPihA3qHB0R10TEVn8fjoizIyJFRNtcxF2prf0jYlQ29k8iYllEPBcRF0XEzjlqs1P2M2nyBa9vm/18zq7m0CRJ1cTkQ5KqUURcBPwR+CdwLvD/gOuzxT02qHo0MIyqfR9+AugGvLvNgX6OiPg2MBPoCFwH9AL+G3geGA6cl6OmO5H5TL5Q8kHmc+lG5nOSJNVA4SaDklR9IuJtYEZK6aRNlNVKKa3Lvr+GzC/adVJKa7dwzzrA2pSHb9gRsQ8wG/gz8O3KsUVEc+BLKaVpOWj7bGAUsE9K6V/VfX9JUuHZ8yFJ1asJsHhTBZtIPADWZIcKpWzZ+qFDAyPi5ohYBHwC7LqpYVcR8WZE/DYivhMRcyPiPxExPSKOrNx+RFycrb86Il6OiMOzx6M3qHYxsAMwcFNJUUrp/Q0Tj4j4ckT8MSI+yg4xe3HD4WXrnzcb9z4R8UREfJwdznX1+mFnGyQeAP9c/5msf9aIuDAiXoiIpdm2XoyI/1epnY2GXUXE6IhYEBGHZIeNrYyIf0bE9ytdu1tE/CYiFmWHmb0bEX+KiBaVPwNJ0hdn8iFJ1etl4KyIuCwivrSZOncD92TfH0lmqFC3SnWuBL4EDABOAlZ/TpvdgUuAHwN9gdrAnyJi1/UVIuJ7wM+ACcA3gdHAA8Cule51HPDXlNIWh3ZFRGtgKnAwcCFwKvAR8EREfG0Tl/wRmAh8C3iUzBCus7JlT/B/w9O+zf99JuvjaEvmc/t29hmnZ5+xQqKzGQ3JPOtvyTz7X4FfRcQxG9QZk23vMjKfwUXAAqDeVtxfkrSVdih0ANUtIr4O3EImsfqflNLdBQ5JUmn5PvAwcDNwc0R8ADwDjEopjQdIKS2IiAXZ+i9tZthVGXDShkOtImJzbTYEOqWUPszWW0zmF+wTgQeyvQvDgKdSSt/b4H6LgUcq3WtPYMZWPutQoDHQbf0wqYh4EngduAF4qlL9W1JK63s3JkREDzJzSUallN6PiHnZslmVh12llC7dIO5awLNkkrPzyQwR+zy7kOnJmZS9fgpwfLbtSdk63YAfpZTu3+C6h7ZwX0lSFRVVz0dE7ADcSmZS5yHAZRHRtLBRSSolKaU3yHz/+S8yv4DPItNz8XREXFWFWz1ahTkeL6xPPLJezX7dK/t1j+yr8i/TjwGfO99kC44CXtwwUUgpfQaMBTpFRMNK9StPBJ+zQYyfKyK6ZIdBlWVjXkOmh+LLW3H5yvWJRzbGT4A3KrX9VzI/MwZHxIHxOZmeJOmLK6rkA/gK8FpKaWFK6WMyf3XrVeCYJJWYlNJnKaUpKaWrUko9gfZkEoJhEdF4K29TlRWtllZq/5Ps2/VL4rbKfn2vcpzAkkr3egdos5XtNmHTcS4GgkyvyGbjJDOXZYvL9kbEnmR6OpoAg4DDgUPJ9HhszbK/H27iXOW2+wKPAz8gM+F+4YZzUiRJ1aNGfVONiKMi4vGIWLi5tdqzkzDnZydMzoiI7hsUtwYWbnC8ENg9x2FL0udKKS0iM19hB2Cfrb2sGkNYnyBUmDwdEbWBZpXqTgC6RsRuW3HfpcCm6u1GJv5N/dL/RZwANAJOTSk9mFJ6MaU0nWqcj5FSei+ldEFKaXdgXzJzYnK5rLAklaQalXwADch0ww8GVlUujIi+wG3AjWSGNTwPPBURW9VtL0m5FhGtNlO0b/br+pWw1vdO1M1tREBm4vQCMpO1N/QtNp779zPgM2BkNjmpICKaRcQR2cO/AIdVWn2rNplehJkppeVVjHNzn8n6JGPNBu18CTiCHEgp/SOl9CMyyVPHXLTxeSLihxHx14hYHhHvR8S4iOhYqc7oDVYEW/96sVKdARExKbs62EabU0ZEx+wf8vpUOt8zItZs8O8sSdWmRiUfKaUnU0o/Sik9DKzbRJWhwOiU0l0ppbkppUFk/qJ3frZ8ERV7OnbPnpOkfJkTEb+PiLOyvblfj4iRZCaiP5hSejtb7/Xs10si4qsR0TVXAWWX+B0OfC0i7o6I4yPifDJz5JaxwffblNI/gTPJbI74YkScm32Or0XEjcA/gPWx/ozM6lbPRMRp2QU/xpGZCH7lFwh1/WdyQUR0i4iuEbEjmd6YtcB9EdErIs4CxgNvb+5GVRERjbK/7F8cESdExLER8Qsyw8bGV0cbVXQ0MJLM8LIeZJ59Qmy88/sEMkPq1r9OrFRej0z812yqkZTSHDILEdwRES0h81mQWfL4llzs5SJJNXaTwYj4GLgwpTQ6e7wjsBL475TSQxvUux3omFL6r+yE87lkvnEvI7Niy+EppQ8208YAMstYUr9+/S777rvvpqpJ0lZ7//33WbZsGatWrWLNmjVEBDvttBNNmjShRYsW1KqV+ZtPSol33nmHDz/8kLVrM3O+u3TpwieffMKcOXNo06YNzZpVHBG1ZMkS3nrrLTp27MhOO+0EwKuvvkqDBg1o165dhbozZsygVatWtG7duvxcWVkZ7733HmvWrKFu3brssccezJs3j6ZNm7LnnntWuH7VqlWUlZWxfPly1q5dS0RQr149GjduTLNmzcqfY/Xq1SxYsIAVK1aQUqJevXq0atWKRo0ald9r0aJFvPvuu3Tu3LnCil1vvvkmK1as4MADD6xQd8mSJaxZU97J0S6l9GZEnApcS2bJ3Xlkdl4/ATg6pdRm/f3atWvHqFGjOPvsswE4++yzmTBhAgsWLGBDRx99NACTJ0/mk08+4aKLLmLq1Km89dZb1KpViy9/+csMGTKE0047bTP/0vnz8ccf06hRIx599FF69+4NZJ5ryZIl/OlPf9ri9dOnT+fQQw9l/vz5tG3btkLZunXr6N69O82aNeOxxx7jzDPPZNasWUyfPp0dd9wxF48jqTRsdtGO7Wmp3WZk1q4vq3S+DOgJkFJaGxGXkFk6sRZw8+YSj2z9O4E7Abp27ZqmT5+ei7glqUZa/0vpiBEjOOOMMwodzkYiYkZK6U2AlNKDwIOVqvwu+zUBtG3blsp/UBs9evQm7z158uTy9zvttBO//vWvqyHi3FixYgXr1q2jceOK8/enTp1KixYt2HXXXfmv//ovbrjhBlq0qNqeiLVq1eI3v/kNBx98MKeffjoPPfQQL7/8somHpJzZnpKPrZJSepzMiiVbJSJ6A707dOiQu6AkqcDmz5/P7bffTvfu3WnYsCFz587lxhtvpF27dvTp02fLN1DBDB48mE6dOtGt2//tQ3nCCSdw8skn065dO958802uuuoqevTowYwZM8p7xbZWhw4duOyyyxg+fDg//vGP6dSpU3U/giSV256SjyVkJkG2rHS+Jf83gbPKUkrjgHFdu3btvw2xSVKNVrduXebMmcN9993Hhx9+SOPGjenZsyc33XQT9eq5iXdNNXToUKZOncrUqVOpXfv/5v9/5zvfKX9/4IEH0qVLF9q0acMTTzzBySefXKU2Vq1axdixY6lXrx5Tp04lpfR5G1pK0jbZbpKPlNKnETGDzKZSG26UdRwb79ArSdrAbrvtxp//vKWNwFWTDBkyhN/97ndMmjSJ9u3bf27d1q1bs8cee/DPf/6zyu1cfvnlrF27lpdffplu3brxv//7vwwaNOiLhi1Jn6tGrXYVEQ0iolNEdCIT217Z4/VL6d4KnB0R34uI/SLiNjJ7e9yxDW32jog7ly1btu0PIElSNRg8eDBjx45l4sSJbM1iKEuWLGHhwoW0arW5lZ43bdKkSYwcOZLRo0dzwAEHcMstt3DFFVcwb968Lxq6JH2uGrXaVUQcTWayeGW/SSmdna0zkMwOtK3I7AkyJKU0ZVvbdsK5pM+zfPny8pWiVD3q1KlDixYtaNiw4SbLsxPOt2YJ4przg6waXHDBBYwZM4ZHH32U/fffv/x8gwYNaNCgAR9//DHXXHMNffr0oVWrVrz55pv88Ic/5J133mHu3LnssssuACxevJjFixfz+uuvc/rpp/PEE0/QunVr9tprL5o0aVK+0lifPn245ZZbyts54YQTWLlyJZMnTy5f1UySqmizYzdrVPJRSCYfkjZn+fLllJWVsfvuu1O3bl3Hw1eDlBKrVq1i4cKFtGzZcpMJSKkmH5v7/zVs2DCuueYaVq1axbe+9S1mzpzJRx99RKtWrTjmmGO47rrrKiyZfM011zB8+PCN7rN+KeJzzz2XF154gVdeeYWdd965vHzhwoV07NiRq6++miFDhlT/A0oqBSYfm7PBalf9v8hYWUnF71//+hetW7d2YnYOrFy5kkWLFrGpFQdLNfmQpCKw2eSj5PtTU0rjUkoDNtwQS5I2tH5TPlW/unXrOpRNkkpIyScfkrQ1HGqVG36uklRaSj75cLUrSdo6bdu2ZcKECYUOQ5K0HSv55MNhV5IkSVJ+bDebDEpSTfLiUXvn9P6HTXGfBUlS8TH5kKTtXNu2bTnvvPMYM2YM7777Lt/61rf41a9+xapVqzjjjDN46aWXWLt2LUcccQR33HEHe+yxBwBHH3003bt3Z+LEicyePZtu3brxwAMP0KxZMwDGjBnDVVddxccff8zQoUMrtPnyyy8zePBg5s6dS926denTpw+33norO+64Iyklhg4dyv3338/q1atp06YNY8eOpWPHjnn/bHIhrni/0CEUhXRT80KHIKkASn7YlXM+JBWD+++/n6effpp58+bxxhtvcP3117Nu3Tr69evHW2+9xdtvv03dunW58MILK1z3wAMPMGrUKN577z0+/fRTRowYAcDrr7/O+eefz5gxY1i0aBEffPABCxYsKL+udu3a/OxnP2PJkiW88MILPPvss4wcORKA8ePHM2XKFN544w2WLVvGgw8+SNOmTfP3YUgF8JOf/IRDDz2Uhg0b0rx5c3r37s2cOXMq1Pnxj3/MvvvuS/369WncuDHHHnsszz///Eb3evnllznuuONo0KABu+yyC4cffjhLliwBYM6cOey888488sgjFa6ZMGECderUYdq0abl7SKkalHzy4ZwPScXgwgsvZM8996RJkyZceeWVjB07lqZNm9KnTx/q1avHLrvswpVXXslf/vKXCtf169ePL33pS9StW5dTTz2VWbNmAfDwww/z9a9/naOOOoqddtqJ6667rsJu1126dOGwww5jhx12KO95WX/vOnXqsGLFCv7+97+TUmK//fajVatW+fswpAKYPHkyAwcO5Pnnn2fixInssMMO9OzZk6VLl5bX+fKXv8ztt9/Oq6++ytSpU2nXrh0nnHACZWVl5XVeeuklevXqxdFHH82LL77IjBkzuPTSS6lTpw4AHTt2ZPjw4Xz/+98vv27ZsmX069ePSy65hCOOOCK/Dy5VkcOuJKkIbLizdZs2bVi0aBErV65kyJAh/PnPf+bDDz8EYMWKFXz22WfUrl0bgN122638unr16vHxxx8DsGjRogr3rF+/foXeizfeeIOhQ4cyffp0Vq5cydq1a+nSpQsAPXr04MILL+SCCy7grbfe4uSTT2bEiBGb3MVcKhZPP/10heMxY8bQqFEjpk2bRu/evQH47ne/W6HOrbfeyj333MOsWbM4/vjjARgyZAgXXHABV155ZXm9L33pSxWuu+yyy3j88ccZMGAAjz32GIMGDaJx48Zce+21uXg0qVqVfM+HJBWDd955p/z922+/TevWrbnlllv4xz/+wUsvvcTy5cuZMmUKAClteUPwVq1aVbjnypUr+eCDD8qPzz//fPbdd1/++c9/snz5cm688cYK973ooouYMWMGr7/+Om+88QY//elPq+Mxpe3GihUrWLduHY0bN95k+aeffsqdd95Jw4YN6dSpEwDvvfceL7zwAq1ateLII4+kRYsWdO/enWeffbbCtbVq1eI3v/kNEyZM4PTTT+d3v/sd9913HzvuuGPOn0vaViYfklQEbr/9dhYsWMDSpUu54YYb6Nu3LytWrKBu3brsuuuuLF26lOHDh2/1/U455RT+9Kc/MXXqVD799FOuvvpq1q1bV16+YsUKGjZsSIMGDfj73//Or371q/Kyv/71r7z00kusWbOG+vXrs/POO1cYsiWVgsGDB9OpUye6detW4fyf/vQnGjRowM4778zPfvYznnnmGVq2bAnAv//9bwCGDRvGOeecw9NPP0337t05/vjj+dvf/lbhPh06dOCyyy7jgQce4IorrihPYKSaruR/GjjhXFIxOO200+jVqxft27dn77335qqrruLiiy9m1apVNGvWjMMOO4wTTjhhq+93wAEHcPvtt3PaaafRqlUrGjduXL5KFsCIESN44IEH2GWXXejfvz99+/YtL1u+fDn9+/encePGtGnThqZNm3LZZZdV6/NKNdnQoUOZOnUqjzzySPkQx/WOOeYYZs2axfPPP88JJ5zAqaeeyrvvvgtQnuCfd955nHPOORxyyCHceOONHHroodxxxx0V7rNq1SrGjh1LvXr1mDp16lb1aEo1QfifNaNr165p+vTphQ5DUg00d+5c9ttvv0KHsVlt27bl7rvvpmfPnoUO5QvZ3OcbETNSSl234hZ5/UHmUrvVo1iX2h0yZAi/+93vmDRpEvvuu+8W6++zzz6ceeaZ/PjHP2b+/Pm0b9+eMWPGVJgfcu6557J48WKeeOKJ8nMXXXQRTzzxBI8//jjdunXjhhtuYNCgQTl5JukLiM0VlHzPhyRJUnUYPHgwY8eOZeLEiVuVeECmt+OTTz4BMn9IaN26Nf/4xz8q1HnjjTdo06ZN+fGkSZMYOXIko0eP5oADDuCWW27hiiuuYN48NydVzWfyIUmStI0uuOACRo0axQMPPEDjxo1ZvHgxixcvLl9Bbvny5Vx11VW89NJLvP3228yYMYNzzjmHBQsWcOqppwIQEVx22WX84he/4KGHHuJf//oXN954Iy+++CLnnXcekJlv1a9fPwYPHkz37t0B6N+/P927d6dfv34V5mZJNZFL7UrSdu7NN98sdAhSyVu/yeaxxx5b4fywYcO45ppr2GGHHXjttde49957+eCDD2jatCmHHnooU6ZM4aCDDiqvf/HFF/PJJ59wySWX8MEHH3DAAQfw1FNPcfDBB5eX16tXjxtuuKFCO/fccw8dO3bktttuY8iQITl+WumLc85HlnM+JG1OTZ/zsb1zzkdpKtY5H5IA53xsnqtdSZIkSflR8slHSmlcSmlAo0aNCh2KJEmSVNRKPvmQJEmSlB8mH5IkSZLywuRDkiRJUl641K4kSSp6rlJWPVylTNvK5EOSvoBc/yLjD3hJUjFy2JUkbefatm3LiBEjOOigg2jUqBF9+/Zl9erVjB49miOPPLJC3YjgX//6FwBnn302AwcO5Gtf+xoNGjTgiCOOYPHixVx88cU0btyYfffdl5kzZ1Zo5yc/+Qn7778/jRs3pl+/fqxevRqAjh07Mm7cuPK6a9asoVmzZhWul6Sa5ic/+QmHHnooDRs2pHnz5vTu3Zs5c+aUl69Zs4bLL7+cgw46iPr169OqVStOO+003n777Qr3+eSTTxg0aBDNmjWjfv36fOMb32DBggXl5ePHj6dOnTq89NJLFa67++67adCgAfPmzcvtg9YgJZ98uM+HpGLw4IMP8uc//5n58+cze/ZsRo8evdXXXX/99SxZsoSddtqJbt260blzZ5YsWcIpp5zC0KFDK9S///77efrpp5k3bx5vvPEG119/PQBnnnkmv/3tb8vrPfnkk7Rq1YpDDjmk2p5Rkqrb5MmTGThwIM8//zwTJ05khx12oGfPnixduhSAlStX8sorr3DllVfyyiuv8Nhjj/HOO+9wwgknsHbt2vL7XHzxxTzyyCOMHTuW5557juXLl/P1r3+dzz77DIBevXrxve99j7POOotVq1YB8OabbzJ06FBGjBjB3nvvnf+HL5CSTz7c50NSMbjoooto3bo1TZo0oXfv3syaNWurrjvppJPo0qULO++8MyeddBI777wzZ555JrVr16Zv374b9VxceOGF7LnnnjRp0oQrr7ySsWPHAvDd736XJ598kuXLlwMwZswYzjjjjOp9SEmqZk8//TT9+vWjY8eOHHjggYwZM4b333+fadOmAdCoUSOeeeYZ+vbty5e//GW+8pWv8Otf/5q5c+cyd+5cAJYtW8Y999zDT3/6U4477jg6d+7MmDFjmD17NhMmTChva8SIEaxdu5YrrriClBJnn302hx9+ON///vcL8uyFUvLJhyQVg9122638fb169fj444+36rqWLVuWv69bt+5Gx5Xvs+eee5a/b9OmDYsWLQKgdevWHHHEETzyyCN89NFHPPXUU5x++ulf6FkkqVBWrFjBunXraNy48WbrrP8jy/o6M2bMYM2aNfTq1au8zp577sl+++3H888/X36ufv36jB49mttvv53TTz+dv/3tb9xzzz05epKaywnnklSk6tevz8qVK8uPFy9evM33fOedd8rfv/3227Ru3br8+KyzzuLuu+9m7dq1dOvWjd13332b25OkfBo8eDCdOnWiW7dumyz/9NNPueSSS+jduzd77LEHkPneWrt2bZo1a1ahbsuWLTf6vnvkkUfy3e9+l9/85jfcc889Jfl90p4PSSpSBx98MK+99hqzZs1i9erVXHPNNdt8z9tvv50FCxawdOlSbrjhBvr27Vte9q1vfYtXXnmF2267jTPPPHOb25KkfBo6dChTp07lkUceoXbt2huVr127lu9+97t89NFHjBo16gu1UVZWxhNPPEG9evWYMmXKtoa8XTL5kKQi9aUvfYmrr76anj17ss8++2y08tUXcdppp9GrVy/at2/P3nvvzVVXXVVeVrduXfr06cP8+fM5+eSTt7ktScqXIUOGMHbsWCZOnEj79u03Kl+7di3//d//zezZs3n22Wdp2rRpedluu+3GZ599xpIlSypcU1ZWVmFILMCAAQPYZ599mDBhAr/97W8rrBJYKiKlVOgYaoSuXbum6dOnFzoMSTXQ3Llz2W+//QodRsG1bduWu+++m549e262zrXXXssbb7xRYeWrLdnc5xsRM1JKXbfiFnn9QeZmddUj33vZ+O9WPYpxD6LBgwfz+9//nkmTJm3ye9GaNWv4zne+w5w5c5g8eTKtWrWqUL5s2TKaN2/O6NGjOe200wBYsGABe+21F0899RTHH388AKNHj+aCCy5g1qxZ7LPPPlx55ZWMGjWKOXPm0KRJk9w/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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import Contains\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [Contains(columns=[\"Name\", \"Name\"], contains_vec=[\"Mr\", \"Mrs\"])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"Contains\")" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "90b8beb1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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PNsume3PfvvdAJyZmQZwz4i4ifK1PW7Zimv2j4hbV6xYsfU3IElSHRg2bFhF4VF1MpTtttuOAw44gNdfrzxr8YIFC+jUqRNQPjlB48aNeeKJJyqOv/POO7z22mt861vfqtg3fvx4pk2bxt13302vXr248MILOeuss1i+vOp6jJJUN+rVbFcRcRjlg8WrujuldGamzRDgvylf9XY+cH5K6amtvbYDziV9npUrV1Y8FVDdaNy4Ma1bt6Z58+bVHo+IuSmlnjU4Vf35RVYHzj33XCZMmMAjjzxS6elGs2bNaNasGQCPPPIIJ598MjfffDN9+vRhxowZDBkyhEceeaSi29U555zDlClTGD9+PDvvvDMjRozggw8+YO7cuTRs2JC3336bbt26cdVVVzF06FAAPv30U3r27Mk+++yzxZm0JKkGtjjbVb0qPvLJ4kPSlqxcuZKysjI6dOhASUkJEVv8f6pqKKXEmjVrePfdd2nTpk21BUixFh9b+u/r8ssv56c//WnF9vjx47nmmmt4++232X333bn44os55ZRTKo5/8sknjBw5kkmTJrFmzRqOOOIIxo0bR8eOHUkp0a9fPzZu3Mi0adMqXXPevHl885vf5L777uP444/P2n1KKmgWH1uyyWxXg/7+97/nO46keugf//gH7du3rw8DrwvO6tWree+996huxsFiLT4kqQBssfioV2M+8iGlNCWlNLhFixb5jiKpnvps0T3VvZKSEruySVIRKfriQ5Jqwq5W2eH3VZKKS9EXH852JUk107lzZ6ZNm5bvGJKkbVjRFx92u5IkSZJyY1ta4VyS6o2/HLpbVs9/0FMLs3p+SZLyweJDkrZxnTt35qyzzmLChAm8//77fO973+M3v/kNa9as4fvf/z5//etfWb9+PQcffDC33HILX/3qVwE47LDD6N27N9OnT+ell16iV69eTJo0iVatWgEwYcIELr30Uj766CNGjBhR6ZrPPfccw4YN47XXXqOkpIQTTzyRG264ge22246UEiNGjGDixImsXbuWTp06ce+999KtW7ecf2+yIS5amu8IBSFdW5rvCJLyoOi7XTnmQ1IhmDhxIo899hgLFy5kwYIFXHXVVWzcuJGBAwfy5ptv8tZbb1FSUsJ5551X6XOTJk3irrvuYsmSJXz66aeMGTMGgFdffZVzzjmHCRMm8N577/Gvf/2Ld955p+JzDRs25Je//CXLli3j2Wef5cknn2TcuHEAPP744zz11FMsWLCAFStWcP/997Pzzjvn7pshSaq3ir74cMyHpEJw3nnn0bFjR3baaScuueQS7r33XnbeeWdOPPFEmjZtyle+8hUuueQS/vznP1f63MCBA/na175GSUkJJ598MvPmzQPgwQcf5Lvf/S6HHnoo22+/PVdeeSUNGvz7V8b+++/PQQcdRKNGjSqevHx27saNG7Nq1Sr+9re/kVJizz33pF27drn7Zkh58LOf/YwDDjiA5s2bU1paSv/+/Zk/f/4W25911llEREXBX1VKiW9/+9tEBA8++GDF/vnz59OkSRMeeuihSu2nTZtG48aNmT17dt3ckJQlRV98SFIh6NixY8X7Tp068d5777F69WrOOussOnXqRPPmzTn00EP58MMP2bBhQ0Xbtm3bVrxv2rQpH330EQDvvfdepXPusMMOlZ5eLFiwgO9+97u0bduW5s2b85Of/IRly5YB0KdPH8477zzOPfdcWrduzeDBg1m5cmXW7l2qD2bOnMmQIUN45plnmD59Oo0aNaJv374sX758s7YPPvggzz33HO3bt9/i+a6//vpKBf9nunXrxujRozn77LMpKysDYMWKFQwcOJALLriAgw8+uO5uSsoCiw9JKgBvv/12xfu33nqL9u3bc/311/P666/z17/+lZUrV/LUU08B5X9R/SLt2rWrdM7Vq1fzr3/9q2L7nHPOYY899uDvf/87K1eu5Jprrql03h//+MfMnTuXV199lQULFvCLX/yiLm5Tqrcee+wxBg4cSLdu3dhnn32YMGECS5cu3exJxJtvvsmwYcOYNGkSjRs3rvZczz//PDfddBN33XVXtcdHjRrF1772NQYPHgzA0KFDadmyJVdccUXd3pSUBRYfklQAxo4dyzvvvMPy5cu5+uqrGTBgAKtWraKkpIQdd9yR5cuXM3r06Bqf76STTuJ///d/mTVrFp9++imXXXYZGzdurDi+atUqmjdvTrNmzfjb3/7Gb37zm4pjzz//PH/9619Zt24dO+ywA02aNKn2L7hSIVu1ahUbN26kZcuWFfvWr1/PKaecwqWXXsqee+65xc+deuqp3HrrrbRu3braNg0aNODuu+9m2rRpnHbaafzud7/jnnvuYbvttsvKvUh1qeh/GzjgXFIhOPXUU+nXrx9dunRht91249JLL2X48OGsWbOGVq1acdBBB3H00UfX+Hx77703Y8eO5dRTT6Vdu3a0bNmyYpYsgDFjxjBp0iS+8pWvMGjQIAYMGFBxbOXKlQwaNIiWLVvSqVMndt55Z0aNGlWn9yvVd8OGDaN79+706tWrYt/ll19Oq1atOOecc7b4ubPPPpujjz6ab3/72597/q5duzJq1CgmTZrERRddRPfu3essu5RNUZPH78WgZ8+eac6cOfmOIakeeu2117b4V8r6oHPnztx+++307ds331G+lC19fyNibkqpZw1OkdNfZE61WzcKeardESNG8Lvf/Y5Zs2bRpUsXoHxMyGmnnca8efMoLS2/986dO3PeeecxcuRIoHx665///OfMmTOHJk2aABARPPDAA5x00kmVrrFmzRq6d+/OO++8w4EHHsiTTz5JROTwLqXPtcX/GIv+yYckSVJdOf/887n33nuZPn16ReEB5cXH+++/T7t27WjUqBGNGjXizTff5MILL6x4qvjkk0/y6quv0qxZs4o2AAMGDOCQQw6pdJ0LL7yQ9evX89xzzzFnzhxuvvnm3N2ktBVcZFCSJKkODBs2jPvuu48ZM2awxx57VDo2ZMiQzZ5eHHXUUZxyyikMGjQIgKuvvrriKchn9tlnH8aMGcNxxx1XsW/GjBmMGzeOGTNmsPfee3P99dczfPhwjjnmGHbbbbcs3Z1UNyw+JGkb98Ybb+Q7glT0zj33XCZMmMAjjzxCy5YtWbx4MQDNmjWjWbNmtG7derMB5I0bN6Zt27Z8/etfB6BDhw506NBhs3N37Nix4inKqlWrGDhwIMOGDaN3794ADBo0iIceeoiBAwcyc+ZMJ3hQveZ/nZIkSVtp3LhxrFq1iiOOOIJ27dpVvLa0iOCXNXz4cJo2bcrVV19daf8dd9zByy+/zE033VSn15PqWtE/+YiI/kD/rl275juKJEnaRn2ZCXxq8tSy6nnvuOOOatt16NCBDz74oNYZpFwr+icfKaUpKaXBLVq0yHcUSZIkqaAVffEhSZIkKTcsPiRJkiTlhMWHJEmSpJwo+gHnkiSp8Lkyfd0o5JXplRsWH5L0JWT7HzL+gpckFSK7XUnSNq5z586MGTOGfffdlxYtWjBgwADWrl3L+PHjOeSQQyq1jQj+8Y9/AHDmmWcyZMgQvv3tb9OsWTMOPvhgFi9ezPDhw2nZsiV77LEHL774YqXr/OxnP2OvvfaiZcuWDBw4kLVr1wLQrVs3pkyZUtF23bp1tGrVqtLnJUkq+uIjIvpHxK0rVqzIdxRJ+tLuv/9+/vSnP7Fo0SJeeuklxo8fX+PPXXXVVSxbtoztt9+eXr160aNHD5YtW8ZJJ53EiBEjKrWfOHEijz32GAsXLmTBggVcddVVAJx++un89re/rWg3depU2rVrx3777Vdn9yhJ2vYVffHhOh+SCsGPf/xj2rdvz0477UT//v2ZN29ejT53/PHHs//++9OkSROOP/54mjRpwumnn07Dhg0ZMGDAZk8uzjvvPDp27MhOO+3EJZdcwr333gvAf/3XfzF16lRWrlwJwIQJE/j+979ftzcpSdrmFX3xIUmFoG3bthXvmzZtykcffVSjz7Vp06bifUlJyWbbVc/TsWPHivedOnXivffeA6B9+/YcfPDBPPTQQ3z44Yc8+uijnHbaaV/qXiRJhcsB55JUoHbYYQdWr15dsb148eKtPufbb79d8f6tt96iffv2FdtnnHEGt99+O+vXr6dXr1506NBhq68nSSosPvmQpAL1jW98g1deeYV58+axdu1afvrTn271OceOHcs777zD8uXLufrqqxkwYEDFse9973u88MIL3HTTTZx++ulbfS1JUuGx+JCkAvW1r32Nyy67jL59+7L77rtvNvPVl3HqqafSr18/unTpwm677call15acaykpIQTTzyRRYsWccIJJ2z1tSRJhSdSSvnOUC/07NkzzZkzJ98xJNVDr732GnvuuWe+Y+Rd586duf322+nbt+8W21xxxRUsWLCg0sxXX2RL39+ImJtS6lmDU+T0F5mL1dWNXK9l48+tbrgGkWootnTAMR+SpDqxfPly7rjjDiZMmJDvKJKkespuV5KkrXbbbbfRsWNHvv3tb3PooYfmO44k1cjPfvYzDjjgAJo3b05paSn9+/dn/vz5ldo8/PDDHHXUUZSWlhIRzJw5c7PzLFy4kOOPP57S0lKaN2/OySefTFlZWcXx+fPn06RJEx566KFKn5s2bRqNGzdm9uzZWbm/+qhgi4+I+H1EfBARD+Y7iyQVgjfeeGOLXa4GDRrExx9/zC233JLjVJL05c2cOZMhQ4bwzDPPMH36dBo1akTfvn1Zvnx5RZuPP/6Yb33rW9xwww3VnuPjjz+mX79+pJSYPn06s2fP5tNPP6V///5s3LgRgG7dujF69GjOPvvsiqJkxYoVDBw4kAsuuICDDz44+zdbTxRyt6ubgDuBM/IdRJIkSfXPY489Vml7woQJtGjRgtmzZ9O/f3+AigVTly1bVu05Zs+ezaJFi5gzZw4tW7YE4O6776Zly5ZMnz694o82o0aNYvLkyQwePJg//OEPDB06lJYtW3LFFVdk6/bqpYJ98pFSmgmsyncOSYXByTmyw++rpPpk1apVbNy4saKIqIlPPvmEiKBJkyYV+5o0aUKDBg2YNWtWxb4GDRpw9913M23aNE477TR+97vfcc8997DddtvV6T3UdzkvPiLi0IiYHBHvRkSKiDOraTMkIhZFxNqImBsRvXOdU5I+07hxY9asWZPvGAVpzZo1NG7cON8xJAmAYcOG0b17d3r16lXjzxx00EE0a9aMUaNG8fHHH/Pxxx8zcuRINmzYwPvvv1+pbdeuXRk1ahSTJk3ioosuonv37nV9C/VePp58NAPmA8OAzX6bR8QAyrtMXQPsBzwDPBoRu2zSZl5EzK/m1b7q+SRpa7Vu3Zp3332X1atX+5f6OpJSYvXq1bz77ru0bt0633EkiREjRjBr1iweeughGjZsWOPPlZaW8sADD/Doo4/yla98hRYtWvDhhx/So0cPGjSo/E/tNWvWcO+999K0aVNmzZpVlL9Tcj7mI6U0FZgKEBHjq2kyAhifUrotsz00Io4GzgEuzpyj+MpESXnTvHlzAN577z3WrVuX5zSFo3HjxrRp06bi+ytJ+XL++efzu9/9jhkzZtClS5daf75fv34sXLiQZcuW0ahRI3bccUfatm272bkuvPBC1q9fz3PPPUevXr24+eabGTp0aF3dxjahXg04j4jtgP2BMVUOPQ58KwvXGwwMBthll12+oLWkYta8eXP/kSxJBWjYsGHcd999zJgxgz322GOrztWqVSsApk+fzpIlSzj22GMrjs2YMYNx48YxY8YM9t57b66//nqGDx/OMcccw2677bZV192W1LcB562AhkBZlf1lQNvanCgipgEPAMdExDsRsVnnvZTSrSmlnimlnqWlrtgpSZJUTM4991zuuusuJk2aRMuWLVm8eDGLFy/mo48+qmizfPly5s2bV7H+xz/+8Q/mzZvH4sWLK9rcddddPPvssyxcuJDf/va3/Od//ifnn38+X//6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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import Length\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [Length(columns=[\"Name\"])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"Length\")" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "fd8c55f5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zZo12+fb3/52RdUkKaeWLl3K/PnzKyxr3Lgxu+66K4sWLWLZsmV8/vnnNGzYkFatWtGhQwfKz8V+4403WLVqFbvvvjuNG2emUXz88ce88847bLfddnTp0qVM/ZQSS5Ys4aOPPmLNmjVEBI0aNaJFixa0b9+eevXq8dlnnzFnzhw6d+5M69atK4xz9erVFBcXs2LFCtatW0dE0LRpU7bddltat27NNttsQ0qJhQsX8tFHH7Fu3TqaNWvGDjvswNtvv83XvvY1Pvroo6Vkem5uIrOaVWcy/5B+C7ghpXTfl2GvWbOGq6++mgceeIB58+bRrFkzdt55Z374wx8yatQo6tevUd+1bdKll17Kww8/zJw5czZaZ/78+RxwwAE88cQT/OAHP2DYsGGcd17Zzo+XXnqJ448/nlmzZtGuXTseeughTjihpPOD9evX06tXL1q3bs0jjzzCgAEDKCoqYubMmTRs2LDa7k9SQSi/MEiJ2vPbGFqT6YovLne+GDgcIKW0LiLOJfOt3jbAtRtLPLL1xwHjAHr27JlmzpxZHXFLkr6CiJifUvqMTG/JJjVu3JhLL72USy+9tPoDy4F33nmHDh060KhRI/bdd1+uvPJKdtppJwDWrVvHSSedxKhRo9h1110rfP+nn37KySefzLhx42jbtm2FdbbZZhvuuece9txzT/r3789DDz3Eiy++aOIhqVrVtDkfWy2lNCml9K2UUtdscrFJEdEnIsYtX748F+FJkrRJ++67LxMmTOBvf/sb48ePZ/HixRxwwAF89FHmu7RLLrmE1q1bM2TIkI22ccYZZ3DUUUfxgx/8YJPX6tq1K+effz733XcfF154IXvttVeV3osklVebej6Wkhnz2q7c+Xb8Z4nJSkspTQYm9+zZc9BWxCZJUpUonzDst99+7LTTTtxzzz306NGDCRMmUFRUtJF3w8SJE/m///s/tqQ3f/Xq1dx///00bdqU6dOnk1LaYOieJFWlWtPzkVL6nMwcjiPKFR1BZsKlJEl1TvPmzdl999355z//ydSpU1m0aBHt27enfv361K9fn/nz53PBBRfwjW98A4B//OMfvP766zRv3rykDkC/fv046KCDyrR9wQUXsG7dOl588UVmzpzJLbfckvP7k1RYatSE84hoDnTNHj4LXE1mY6llKaX3skvtTgSGklkp5Qzgf4DdU0oVz87c/DX7AH26du066J///OfW3oIkqYpExKyUUs8tqFpz/pBVgzVr1rDjjjsyZMgQzjjjDJYsWVKm/Pvf/z4nnXQSgwYNYpdddmHBggV8/PHHZersscceXH/99Rx77LElc0eeeuopjjjiCJ566il69erF+PHjGT58OLNnz2bnnXfO2f1JqpM22oVa05KPQym75vyX7vlyE6rsJoO/JLPJ4Bzg7JTStAreUylOOJe0KStWrGDJkiWsXbs236HUGQ0aNKBt27a0aNGiwvJCTT7OO+88+vTpQ6dOnViyZAmXXXYZ06ZN49VXX6Vz5w03j+/SpUuFq12VFhFlVrv69NNP2WOPPejbty/XXXddSb2jjjqKVatWMXXqVLbZptYMjpBU89SO1a5SSlPZRLDZOmOBsTkJSJLIJB7FxcV07NiRJk2aOCa+CqSUWL16NQsWLADYaAJSiD744ANOOukkli5dSps2bdhvv/14/vnnK0w8vqrhw4fTtGlTrrjiijLn77zzTrp168aNN97I2WefXWXXk6Qv1aiej3xw2JWkzfnXv/5Fhw4daNq0ab5DqXNWrVrFwoUL6dq16wZlhdrzIUl1wEa/pSv4PtWU0uSU0uCWLVvmOxRJNdTatWtp0qRJvsOok5o0aeJQNkkqIAWffEjSlnCoVfXw5ypJhaXgkw83GZSkLdOlSxeeeOKJfIchSarFCj75cNiVJEmSlBs1arUrSaotnj+4evdB2G/a29XaviRJ+WDyIUm1XJcuXTj99NOZOHEiixYt4rjjjuO2225j9erVnHLKKbzwwgusW7eOAw88kNtvv71kJ+xDDz2UXr168eSTTzJ79mz2339/7rvvPlq3bg3AxIkTGTVqFCtXruScc84pc80XX3yRs846izfeeIMmTZrQt29frr/+eho2bEhKiXPOOYd7772XNWvW0LlzZ+6//366deuW859NdYgLP8x3CHVCurpNvkOQlAcFP+zKOR+S6oJ7772Xxx57jLfffpu5c+dy+eWXs379egYOHMj8+fN57733aNKkCcOGDSvzvvvuu4+7776bJUuW8PnnnzNmzBgAXn/9dYYMGcLEiRNZuHAhH330ER988EHJ++rVq8cNN9zA0qVLee655/jHP/7B2LGZLZgef/xxpk2bxty5c1m+fDkPPvgg2223Xe5+GJKkGqvgkw/nfEiqC4YNG8YOO+xAq1atGDlyJPfffz/bbbcdffv2pWnTpnzta19j5MiRPP3002XeN3DgQL71rW/RpEkTTjzxRIqKigB4+OGHOeaYYzj44INp1KgRl112WZkdr/fZZx/2228/6tevX9Lz8mXbDRo04NNPP+XNN98kpcSuu+5K+/btc/fDkCTVWAWffEhSXbDDDjuUvO7cuTMLFy5k1apVnH766XTu3JkWLVpw8MEH88knn/DFF1+U1N1+++1LXjdt2pSVK1cCsHDhwjJtNmvWrEzvxdy5cznmmGPYfvvtadGiBRdddBFLly4FoHfv3gwbNoyf//zntG3blsGDB7NixYpqu3dJUu1h8iFJdcD7779f8vq9996jQ4cOXHfddbz11lu88MILrFixgmnTpgGQ0uY3BG/fvn2ZNletWsVHH31UcjxkyBC+/e1v889//pMVK1Zw5ZVXlmn3F7/4BbNmzeL1119n7ty5/PrXv66K25Qk1XImH5JUB9x666188MEHLFu2jCuuuIJ+/frx6aef0qRJE77+9a+zbNkyRo8evcXtnXDCCfzv//4v06dP5/PPP+fiiy9m/fr1JeWffvopLVq0oHnz5rz55pvcdtttJWUvvfQSL7zwAmvXrqVZs2Y0bty4zJAtSVLhKvi/Bk44l1QXnHzyyRx55JHstNNO7LzzzowaNYrhw4ezevVqWrduzX777cdRRx21xe3tvvvu3HrrrZx88sm0b9+ebbfdtmSVLIAxY8Zw33338bWvfY1BgwbRr1+/krIVK1YwaNAgtt12Wzp37sx2223H+eefX6X3K0mqnWJLut8LQc+ePdPMmTPzHYakGuiNN95g1113zXcYG9WlSxfuuOMODj/88HyH8pVs7OcbEbNSSj23oImc/iFzqd2q4VK7Up0WGyso+J4PSZIkSblh8iFJkiQpJ9zhXJJquXfffTffIUiStEXs+ZAkSZKUEwWffLjalSRJkpQbBZ98pJQmp5QGt2zZMt+hSJIkSXVawScfkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOeE+H5L0FcSFH1Zr++nqNtXavqTqddVVV3HRRRfx85//nFtuuQWAiKiw7tChQ7n11lsBWLlyJSNGjODPf/4zH330EZ06deKMM87g7LPPBmDx4sV069aNESNGcO6555a08dprr7HPPvswYcIEfvKTn1Tz3UlfnT0fklTLdenShTFjxtC9e3datmxJv379WLNmDRMmTOCggw4qUzci+Ne//gXAaaedxtChQ/nBD35A8+bNOfDAA1m8eDHDhw9n22235dvf/javvPJKmetcddVV7Lbbbmy77bYMHDiQNWvWANCtWzcmT55cUnft2rW0bt26zPulQvH8888zbtw4unfvXub8okWLyjy+/H/mxBNPLKlzzjnn8Ne//pWJEyfyxhtvMHLkSC688EImTpwIwPbbb8+tt97KqFGjeP3114HM/28DBgzguOOOM/FQjVfwyYf7fEiqCx588EH+9re/MW/ePGbPns2ECRO2+H2XX345S5cupVGjRuy///706NGDpUuXcsIJJ3DOOeeUqX/vvffy2GOP8fbbbzN37lwuv/xyAAYMGMDvf//7knpTpkyhffv27L333lV2j1JtsHz5cvr3789dd93FtttuW6Zs++23L/N45JFH+Na3vsUhhxxSUufZZ5/llFNO4bDDDqNLly4MGDCA/fbbjxdeeKGkTr9+/Tj22GMZMGAA69at47LLLmPRokWMHTs2Z/cpfVUFn3y4z4ekuuAXv/gFHTp0oFWrVvTp04eioqItet+Pf/xj9tlnHxo3bsyPf/xjGjduzIABA6hXrx79+vXboOdi2LBh7LDDDrRq1YqRI0dy//33A/Df//3fTJkyhRUrVgAwceJETjnllKq9SakWGDx4MCeccAKHHXbYJuutXLmSBx54gEGDBpU5f9BBBzF58mTef/99IJOMFBUVcdRRR5WpN3bsWBYsWED//v256qqruOOOO2jVqlXV3oxUDQo++ZCkumD77bcved20aVNWrly5Re9r165dyesmTZpscFy+nR122KHkdefOnVm4cCEAHTp04MADD+SPf/wjn3zyCY8++ij9+/f/Svci1Vbjx4/nX//6V0mP4Kbcd999fP7555x66qllzt90003sueeedOrUiQYNGnDIIYdwzTXXcMwxx5Sp16pVK6666ioefPBBTjrpJI4++ugqvRepujjhXJLqqGbNmrFq1aqS48WLF291m19+Gwvw3nvv0aFDh5LjU089lTvuuIN169ax//7707Fjx62+nlRbvPXWW1x00UVMnz6dBg0abLb++PHjOfbYY2nTpuziEjfffDPPPvsskyZNonPnzkybNo3zzjuPLl26lOn9WL9+PXfffTdNmzblpZdeYs2a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v55evXrRunVrHnnkEQYMGEBRUREzZ86kYcOGubitXIuNFRR8z4ckqXCtXr2aOXPmMGfOHFavXp3vcCTl0RdffMEDDzzAypUrOeCAAwA46KCDmDx5Mu+//z4Azz77LEVFRRx11FGVanubbbbhnnvu4YknnqB///488MAD/O53v6uriccmmXxIkgrOZ599xvDhw2nVqhV77rkn3bt3p1WrVpx11lmsWbMm3+FJyqFXX32V5s2b06hRI8444wz+/Oc/s8ceewBw0003seeee9KpUycaNGjAIYccwjXXXMMxxxxT6et07dqV888/n/vuu48LL7yQvfbaq6pvpVaon+8AJEnKtSFDhvD4449zxx13sP/++wPw3HPPMWLECD799FPuuuuuPEcoKVd22WUXioqKWL58OQ8//DCnnnoqU6dOpVu3btx88808++yzTJo0ic6dOzNt2jTOO+88unTpUunej9WrV3P//ffTtGlTpk+fTkqJiI2OTqqzTD4kSQXnoYce4k9/+hNHHHFEybmddtqJtm3b0rdvX5MPqYA0bNiQrl27ArDPPvvw0ksvccMNN3DLLbcwYsQIHnroIfr06QNA9+7dKSoqYsyYMZVOPi644ALWrVvHiy++yP77788tt9zCmWeeWeX3U9M57EqSVHCaNWtGx44dNzjfsWNHmjRpkoeIJNUU69ev57PPPmPt2rWsXbuWevXqlSmvV68e69evr1SbTz31FGPHjmXChAnsvvvuXHfddVx44YW8/fbbVRl6rWDyIUkqOGeeeSajR48uM8l89erVXHbZZQX5TaRUqC688EKeeeYZ3n33XV599VVGjBjB1KlT6d+/Py1atOCQQw7hwgsvZOrUqcybN48JEybwu9/9jh//+MclbSxevJiioiLmzp0LwOuvv05RURHLli0D4NNPP2XgwIGcddZZ9OrVC4BBgwbRq1cvBg4cWOlEprZz2JUkqeA8//zzPP3003Ts2JHu3bsDmUmn69at49///jc/+tGPSupOmjQpX2FKqmaLFy/mv//7v1m8eDEtW7ake/fuPProo3z/+98H4IEHHmDEiBH079+fZcuW0blzZy677DKGDRtW0sbtt99eZineH/7whwDcfffdnHbaaQwfPpymTZtyxRVXlLn2nXfeSbdu3bjxxhs5++yzc3C3NUOd3OcjInYAJgJtgXXAZSmlhzb1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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import LowerCase\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [LowerCase(columns=[\"Name\"])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"LowerCase\")" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "facfc6ba", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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qXyNocBQgCZNmvTYZ599cveGJKmaNmzYwKJFi3j//fdZs2YNEUHjxo1p27Ytu+yyS3m72bNn07RpU3beeWcWLVrE2rVr2Wmnnfjc5z5Hs2b/mRs+f/58VqxYQefOnXnrrbdYtWoVDRs2pG3btrRpU2H+NmvWrGHhwoWsWLGCdevWUb9+fRo1akTLli1p2TIz5WPhwoUsWrSI7t27k7lJVUUpJZYtW8Z7773HypUrWb9+PQ0bNqRp06a0bt2anXfeGYBPPvmEN998k48++oh69erRokULmjdvzuuvv87nP/955syZs5RMD9BPyPzh1oZMIfMEcGFKaWMPUHrllVcYOXIkDz/8MMuXL6d169Z0796d008/nWOPPba2vjV5cckllzBy5MgK+9q2bcvixYtZu3YtF154Iffddx9z586lWbNm9OrVi6uuuoo99th8EEBKiWOPPZb777+fu+66i4EDBwLw4osvUlZWxvjx4xkw4D8fok+ZMoWvfvWrPProoxx+uB+i18Qll1zC3XffzYsvvrj1xsDLL79M165dmTVrFgcccAAATZs25YYbbmDw4MHl7Tp27MiwYcM499xzgczPhyOPPJJWrVpx7733cvLJJzNz5kymTZvGDjtUNVpTKojNfzlk1amej61oRaaLvvLkyiVkPr0jpbQuIs4hM2yhHnD1lgqPbPubgZsBysrK0rRp9s5L2n506tSJI444gj/96U+f2u6UU05hypQpvPrqq3lKVjsi4o2U0tNkPgX+VPvuuy9//vOft9Zsu/GFL3yBRx99tHy7fv3MvQZWrlzJjBkzuOCCCzjooINYvnw555xzDscccwyzZs2iQYOKv9avueYa6tXbfIT1/vvvz8iRIzn99NM54ogjaNu2LcuXL2fw4MGcc845Fh6f0b///W/at2/PjjvuyCGHHMKVV15J586dq2y7YkXmztEtWrQo33fEEUdw5513cvzxx9OiRQsmTpzIu+++S58+fcrb1KtXj9tuu40DDzyQk046ibvuuovnnnvOwkPbje2p+KiWlNIEqr/AFRHRD+jXpUuX3IWSJKkGGjRowG677bbZ/ubNm/Pggw9W2Pf73/+erl278sorr5R/gg7w/PPPc/311zN9+nTatt38vgTnnXceEyZMYOjQodx7770MGzaMFi1acOmll9b+GyoBhxxyCGPHjmWfffbhnXfe4fLLL+ewww7jpZdeKu813GjNmjWcc8459OvXj8997nPl+++8806++c1v0qpVKxo0aMCOO+7IHXfcwUEHHVTh9V26dOG8885j5MiR/PznP9/suFSXbU/Fx1IyYycr/wRtCyz+rCdNKU0EJpaVlQ3ZhmySJNWabf0E/cMPP+TEE0/k5ptv3mxo3UZ+gl67vvrVr1bYPvTQQ+ncuTO33XYbI0aMKN+/bt06vv3tb/PBBx8wYULFz0ovvPBCli5dypQpU2jVqhX33HMPJ598MlOnTuXAAw8sb7dq1SruuOMOGjduzBNPPEFKqcohkFJdVNfudrVF2buoTCdzL/hNHU3mrleSVFLmz5+/1SFXAGPHjmXBggV5SKTasPET9Pvvv5/Ro0ezePFiDjvsMN57b/NRxFv6BP3000/nmGOO2ewP4so2foJ+++2385Of/MRP0GtR06ZN6dq1K//617/K961bt45vfetbzJo1i4ceeqhCj8jcuXO54YYbGD16NF/+8pc58MADufjii/mv//ovbrjhhgrnPv/881m3bh3PPfcc06ZN4ze/+U3e3pe0repUz0dENAU2jn+qB+wREQcBy1JKb5JZvXxcRDwHPElmcar2wO+24ZoOu5Ik1Rnb+gn6uHHj+Oc//0l15jH6CXrurF69mldffZVevXoBsHbtWr75zW/y4osv8uijj242rG7lypXAf+b3bFS/fn02bPjPDe4eeeQRbrrpJh555BG6du3KNddcw/Dhwzn22GPZa6+9cvyupG1Xp+52FRFfIjNZvLLbUkqnZNucCfwYaEfmNos/SilN3dZrO+Fc0qdZsWIF77zzDmvXVl6WQp9Vw4YNadOmTYU7c20qIqanlMqqcaq684ssR3r16sU+++zDb3/7W+A/n6DPnj17sz9kTznlFP74xz9WmGi+fv166tWrR8+ePXniiSfK9//whz/kH//4BxMmTKBnz55cccUVDBs2LH9vrIice+659OvXjz322IN33nmHyy67jKlTpzJ79mw6dOjAwIEDef7555k4cSLt27cvf13z5s1p1KgRa9euZb/99qNdu3aMGjWKli1bcs8993Deeedx77330q9fPz788EMOOOAABgwYwDXXXFN+jmOOOYaVK1fy6KOPVnmDAakAtvwpRkrJR0r06NEjSVJVli9fnubMmZM+/vjjtGHDhkLHKQobNmxIH3/8cZozZ05avnx5lW2Aaal6P8OL2qpVq9Juu+2WRo4cmVJKac2aNal///7p85//fFq4cOFm7RcsWJBmz55d4QGka6+9Ns2dO7e83cMPP5zq16+fpk6dmlJK6eabb06NGzdOr7/+en7eWJEZNGhQateuXWrYsGFq37596t+/f3rppZdSSinNmzcvkSmSN3uMGTOm/Bxz5sxJ/fv3T23atEmNGzdO3bp1S2PHji0/fuqpp6Z99903rVq1qsK1FyxYkHbZZZd07bXX5uW9StWwxZ/ZdarnoxA2GXY1ZNNxmZK00euvv0779u1p3LhxoaMUnZUrV7Jw4UKqGvpaqj0f2/oJelUiosI6H36CLinHttjzUfI/WVJKE1NKQ5s3b17oKJLqqLVr127xjzptm43DTfQfCxYs4Fvf+hZf+MIX6N+/PzvuuCPPPPMMHTt2ZMGCBdx7770sXLiQHj160K5du/LHX/7yl2pfY/jw4TRu3Jgrrriiwv5bb72V2bNnc/3119f225IkoI5NOJekuspJuLnh13Vzn7ZYYqdOnfgsIxYqv+bWW2+tsl2HDh14//33a3x+Saquku/5iIh+EXHz8uXLCx1Fkuq0Tp06MWXKlELHkCRtx0q++HDYlSRJkpQfDruSpM/gmaNyez/9Q6fOzen5JUkqBIsPSdrOderUidNOO41x48axaNEivv71r/Pb3/6WVatW8Z3vfIdnn32WdevWcfjhh/O73/2ufCXsL33pSxx55JE8/PDDzJo1i549e3L77bfTqlUrILNY3YUXXshHH31UYXE7gOeee46zzz6bV155hUaNGjFgwACuvfZadthhB1JKjBgxgvHjx7N69Wo6duzIHXfcwf7775/3r420Ufzk3UJHKArpqtaFjqDtXMkPu3LOh6RiMH78eB544AHmzp3LnDlzuPzyy9mwYQODBw/mjTfe4M0336RRo0acddZZFV53++23M2bMGN555x3WrFnDqFGjAHj55Zc544wzGDduHAsXLuS9995jwYIF5a+rX78+v/rVr1i6dClPP/00Dz30EDfddBMAkydPZurUqcyZM4fly5dz55130rJly/x9MSRJdVbJ93yklCYCE8vKyoYUOoskfVZnnXUWu+++OwAXXHABw4YN4/LLL2fAgAHlbS644AJ69epV4XWDBw/m85//PADf+MY3mDBhAgB33303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AD2AUZUOTQYOy8H1hgJDAfbYY4+ttJZUypo1a+YfyZIkbaO6NuG8FVAfWFJp/xJgt5qcKCKmAHcBx0bEgojoWblNSunmlFJZSqmsdWtX7JQkSZJyqU71fNSmlFKf6rSLiH5Avy5duuQ4kSRJklTa6lrPx1JgPdC20v62wOJcXDClNDGlNLR58+a5OL0kSZKkrDpVfKSU1gDTgaMrHTqazF2vJEmSJG2n8j7sKiKaAhvHONUD9oiIg4BlKaU3gWuBcRHxHPAkcDrQHvhdjvI47EqSJEnKg0L0fJQBL2QfjYCR2eeXAqSU/gIMBy4EZgJHAMemlN7IRRiHXUmSJAngF7/4BRHBWWedBcDatWs5//zz6datG02aNKFdu3aceOKJvPnmmxVe98knnzBs2DBatWpFkyZNOP7441mwYEH58cmTJ9OwYUOeffbZCq+75ZZbaNq0KXPnzs39m6sj8l58pJQeTSlFFY9TNmlzU0qpU0ppx5RSj5TS1FzliYh+EXHz8uXLc3UJSZIk1XHPPPMMN998M926dSvft3LlSmbMmMEFF1zAjBkzuPfee3nrrbc45phjWLduXXm74cOH89e//pU77riDxx9/nBUrVnDcccexfv16APr27cv3v/99vvvd77JqVWaN7fnz5zNixAhGjRrFXnvtld83W0Dhar0ZZWVladq0aYWOIUnKiojpKaWyajTN6y+y+Mm7+bxc0UpX5fcW937fake+v2/5snz5crp3784tt9zCyJEj2X///fnNb35TZduXX36Zrl27MmvWLA444ACWL19O69atGTNmDCeddBIAb731Fh07duS+++7jK1/5CgAff/wxBx54IP/zP//DddddR69evdhpp524//778/Y+8yi2dKBOTTiXJEmS8m3o0KEMHDiQXr16bbXtihUrAGjRogUA06dPZ+3atfTt27e8ze67786+++7LU0/9535JTZo0YezYsdx4442cdNJJ/POf/+TWW2+t5XdS9xXtOh+SJEnS1owePZrXX3+dP/3pT1ttu2bNGs455xz69evH5z73OQAWL15M/fr1adWqVYW2bdu2ZfHiiitFHHHEEXz729/mtttu49Zbb6VDhw6190a2EyXf8+GcD0mSpNL02muv8bOf/Yzbb7+dhg0bfmrbdevW8e1vf5sPPviAMWPGfKbrLVmyhH/84x80btyYqVNz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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_str import UpperCase\n", + "\n", + "titanic_df = pd.read_parquet(titanic_file_location)\n", + "columns = [\"Name\"]\n", + "objs = [UpperCase(columns=[\"Name\"])]\n", + "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"UpperCase\")" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "ed8a15c3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/opensource/gators/benchmarks/benchmark.py:322: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " bench_dict[n] = generate_per_sample_benchmarking(\n" + ] + }, + { + "data": { + "image/png": "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e7No0SLKlSvH73//e+rWrZsrhpPdX0QiZ//+/VSuXJkZM2bQrl07AO644w7MjKlTp57wvIoVK/Lss8/Svft/Oqhr167N3Xffzf333w9ARkYG11xzDfHx8bzzzjt06dKFVatWsWzZMsqUyWvkarF2wiUVi1PycXw+x6+DS1Aeb/cI0NndfxU8voXA0IoSwBPu/kJ+7peSkuLLluWadygiIhFiZsvdPSUfTYvmDzIRKXbS0tJISkpi0aJFNG/enIyMDCpXrszAgQNZtGgRy5cvp06dOtx///2kpqZmnnfDDTdgZrz66qtUqVKFmTNn0qlTJz766CMaNWqU2e7rr7/msssuo3379rz++ut89tln2eqjyAmTj6I25+OMufu77n6RuyfnJ/Ews3Zm9sKePXtO1VREREREoli/fv1o1KhRZi/qjh072L9/PyNHjqRNmzbMnTuXTp060blzZ9577z/7nU6fPh0zIz4+nrJly9K5c2emTZuWK7FITk7mgQce4LXXXmPgwIHRmnicVJGa83EKuwjsbJtzNZnqnME4a3efCcxMSUnpeQaxiYiIiEgx1r9/fxYvXszixYspWbIkEBgqBXDrrbfSv39/ABo1asSyZct47rnnuOmmwHoSgwcPZteuXcybN4/4+HhmzJhBly5dWLhwIZdddlnmPQ4ePMi0adMoX748ixcvxt0pwKavUaHY9Hy4+2ECczha56hqTWDyn4iIiIhIgd13331MmzaN+fPnU7fuf9aIiI+Pp1SpUjRo0CBb+/r167N161YANm7cyLPPPsvEiRP5zW9+w2WXXcaQIUO44oorePbZZ7OdN2DAAI4ePcpnn32WmcDEmiKVfJhZRTNrZGaNCMR2XvD4+FK6Y4FuZtbDzOqb2dME9vY47VVcNOxKREREJHb169cvM/HIucBGmTJluOKKK/jqq6+yla9fv57atWsDcOBAYM/T470lx5UsWTKz5wTggw8+YPz48UyePJmLL76YMWPGMHDgQDZu3BiKxyqyitSEczO7Fvggj6p/uHu3YJs+wF+AmgT2BLkv6wT006UJ5yJyMnv37mXHjh2ZqzTJmStdujSJiYlUqlQpz3pNOBeRUPvTn/7ElClTmDFjRrbejYoVK1KxYkUAZsyYwe23385zzz1Hy5Yt+eCDD+jTpw8zZszgpptu4siRIzRo0ICaNWsyevRoqlWrxowZM3jggQd45513aNeuXeaqhB07dmTMmDGZ97nhhhs4cOAACxYsoESJItUncKaK32pX4abkQ0ROZO/evaSnp1OrVi3i4uJibnxuKLg7Bw8eZNu2bVSvXj3PBETJh4iE2on+PR8yZAiPPvpo5vHkyZMZOXIk3377LRdeeCEPPvggnTp1yqzfsGEDAwcOZPHixezfv5/k5GT69+9P165dAfjDH/7Axx9/zIoVKyhXrlzmedu2baNhw4Y88sgj3HfffaF5yMhQ8nEiZtYOaJecnNxzw4YNkQ5HRIqgr7/+mqSkJMqXLx/pUKLOgQMH2L59O8nJybnqlHyIiBRbsbPUbkG5+0x371W5cuVIhyIiRdSRI0eIi4uLdBhRKS4uTkPZRERiSMwnHyIi+aGhVqGhr6uISGyJ+eRDq12JiORPnTp1mDdvXqTDEBGRYizmkw8NuxIRERERCY/itMO5iEiR8UmLC0J6/asWxta67yIiEhuUfIiIFHN16tThrrvuYsqUKaSlpdG+fXsmTJjAwYMHufPOO/n00085evQozZo14/nnn+ecc84B4Nprr+Waa65h/vz5rF69mqZNm/Laa68RHx8PwJQpUxg8eDD79++nf//+2e752Wef0a9fP9atW0dcXBwdO3Zk7NixlClTBnenf//+TJ06lUOHDlG7dm2mTZtGw4YNw/61EZHizQbujHQIUcEfT4h0CJliftiV5nyISDSYOnUqs2fPZuPGjaxfv57hw4eTkZFB9+7d2bJlC1u3biUuLo6+fftmO++1117j5ZdfZseOHRw+fJjRo0cD8MUXX9C7d2+mTJnC9u3b+eGHH/juu+8yzytZsiR/+9vf2LVrFx9//DH//ve/GT9+PABz5sxh4cKFrF+/nj179jB9+nSqVasWvi+GiIgUWTGffGjOh4hEg759+3LuuedStWpVBg0axLRp06hWrRodO3akfPnynHXWWQwaNIgPP/ww23ndu3fnoosuIi4ujttvv51Vq1YB8MYbb3DzzTfTokULypYty7Bhw7LtvtukSROuuuoqSpUqldnzcvzapUuXZt++fXz55Ze4O/Xr16dmzZrh+2KIiEiRFfPJh4hINDj33HMzP9euXZvt27dz4MAB7rrrLmrXrk2lSpVo0aIFP/30E8eOHctsW6NGjczP5cuXZ//+/QBs37492zUrVKiQrfdi/fr13HzzzdSoUYNKlSrx0EMPsWvXLgBatmxJ3759+dOf/kRiYiK9evVi7969IXt2EREpPpR8iIhEgW+//Tbz89atW0lKSmLMmDF89dVXfPrpp+zdu5eFCxcC4H7qDcFr1qyZ7ZoHDhzghx9+yDzu3bs39erVY8OGDezdu5eRI0dmu+4999zD8uXL+eKLL1i/fj1PPvlkYTymiIgUc0o+RESiwLhx4/juu+/YvXs3I0aMIDU1lX379hEXF8fZZ5/N7t27GTp0aL6vd9ttt/H//t//Y/HixRw+fJhHHnmEjIyMzPp9+/ZRqVIlKlasyJdffsmECRMy65YuXcqnn37KkSNHqFChAuXKlcs2ZEtERGJXzP800IRzEYkGd9xxB23atKFu3bpccMEFDB48mHvvvZeDBw8SHx/PVVddxQ033JDv61188cWMGzeOO+64g5o1a1KlSpXMVbIARo8ezWuvvcZZZ51Fz549SU1Nzazbu3cvPXv2pEqVKtSuXZtq1arxwAMPFOrziohI8WT56X6PBSkpKb5s2bJIhyEiRdC6deuoX79+pMM4oTp16jBp0iRatWoV6VBOy4m+vma23N1T8nEJ/SATiVJaardwRGCpXTtRRcz3fIiIiIiISHgo+RARERERkbDQDuciIsXc5s2bIx2CiIhIvqjnQ0REREREwiLmkw+tdiUiIiIiEh4xn3y4+0x371W5cuVIhyIiIiIiEtViPvkQEREREZHwUPIhIiIiIiJhoeRDRERERETCQsmHiIiIiIiEhfb5EBE5DTZwZ0iv748nhPT6IiIikaCeDxGRYq5OnTqMHj2aSy+9lMqVK5OamsqhQ4eYPHkyzZs3z9bWzPj6668B6NatG3369OHGG2+kYsWKNGvWjO+//557772XKlWqUK9ePVauXJntPqNGjaJBgwZUqVKF7t27c+jQIQAaNmzIzJkzM9seOXKE+Pj4bOeLiIjEfPKhfT5EJBpMnz6df/3rX2zatInVq1czefLkfJ83fPhwdu3aRdmyZWnatCmNGzdm165d3HbbbfTv3z9b+6lTpzJ79mw2btzI+vXrGT58OABdunTh1VdfzWw3a9YsatasyeWXX15ozygiIsVfzCcf2udDRKLBPffcQ1JSElWrVqVdu3asWrUqX+f99re/pUmTJpQrV47f/va3lCtXji5dulCyZElSU1Nz9Vz07duXc889l6pVqzJo0CCmTZsGwP/8z/8wa9Ys9u7dC8CUKVO48847C/chRUSk2Iv55ENEJBrUqFEj83P58uXZv39/vs6rXr165ue4uLhcxzmvc+6552Z+rl27Ntu3bwcgKSmJZs2a8eabb/LTTz/x/vvv07lz59N6FhERiV6acC4iEqUqVKjAgQMHMo+///77M77mt99+m/l569atJCUlZR537dqVSZMmcfToUZo2bUqtWrXO+H4iIhJd1PMhIhKlLrvsMtauXcuqVas4dOgQjz766Blfc9y4cXz33Xfs3r2bESNGkJqamlnXvn17VqxYwdNPP02XLl3O+F4iIhJ9lHyIiESpiy66iEceeYRWrVpx4YUX5lr56nTccccdtGnThrp163LBBRcwePDgzLq4uDg6duzIpk2b6NChwxnfS0REoo+5e6RjKBJSUlJ82bJlkQ5DRIqgdevWUb9+/UiHEXF16tRh0qRJtGrV6oRtHnvsMdavX59t5atTOdHX18yWu3tKPi6hH2QiUSrUeyrFigjsHWUnqtCcDxERKRS7d+/mxRdfZMqUKZEORUREiigNuxIRkTM2ceJEzj33XG688UZatGgR6XBERKSIitqeDzN7G7gW+Le73xbhcEREir3NmzefsK5nz5707NkzfMGIiEixFM09H08DWm5FRERERKSIiNrkw90XAPsiHYeIRActzhEa+rqKiMSWsCcfZtbCzN41s21m5mbWLY82fcxsk5kdMrPlZnZNuOMUETmudOnSHDx4MNJhRKWDBw9SunTpSIchIiJhEomej4rA50A/INdPczNLJTBkaiRwOfAR8L6ZnZelzSoz+zyPV1LO64mInKnExES2bdvGgQMH9Jf6QuLuHDhwgG3btpGYmBjpcEREJEzCPuHc3WcBswDMbHIeTfoDk919YvD4bjO7AegNPBi8RqMwhCoiAkClSpUA2L59O0eOHIlwNNGjdOnSVK9ePfPrKyIi0a9IrXZlZmWAJsDoHFVzgKtDcL9eQC+A88477xStRSSWVapUSb8ki4iInKGiNuE8HigJpOcoTwdqFORCZjYPeB1oa2bfmVnTnG3c/QV3T3H3lISEsO/8KCIiIiISU4pUz0dhcvdW+WlnZu2AdsnJySGOSEREREQkthW1no9dwDGgeo7y6sD3obihu890916VK1cOxeVFRERERCSoSCUf7n4Y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1wEwMzZv3syAAQPo2LFjhKMTEYle+Rl2dT5wAYH9Of4reHz8VQuo5O4vhSzCENOcDxGR2DN69Gh2795NQkICBw4coHnz5iQnJ3P22WczfPjwSIcnIhK1TtnzkWV38YLMDyk2tNSuiEjsqVSpEosXL2b+/PmsWLGCjIwMGjduTKtWrSIdmohIVCvQDudmdg7QAkgkRzLi7mMLMa6ops3qRESKhpYtW9KyZctIhyEiEjPynXyYWWfgJeAosJPsGw46oORDRESKjZUrV/LBBx+wY8cOMjIystU98cQTEYpKRCS6FaTn4zFgDPCwux8LUTxhZ2btgHbJycmRDkVERMLkiSeeYODAgdSuXZvq1atjZpl1WT+LiEjhKkjyUR2YFE2JB2jOh4hILPrb3/7GhAkTuOuuuyIdiohITCnIJPJZwJWhCkRERCRcMjIy+M1vfhPpMEREYk5Bej7mAn81s4uBNcCRrJXu/lZhBiYiIhIqvXv35uWXX2bEiBGRDkVEJKYUJPn4e/D9oTzqnMBu5yIiIkXekCFDaNu2LZdffjkNGzakdOnS2epfeqnYbl8lIlKk5Tv5cPeo3OdDRERiz6BBg5gzZw6NGzfmxx9/1CRzEZEwKdA+H9FIq12JiMSe8ePH89prr5GamhrpUEREYkpB9vnof7L64rrJoFa7EhGJPXFxcVx++eWRDkNEJOYUZCjV3Tle/YEnCez/0bfwQxMREQmN++67j6eeegp3P3VjkdO0b98+7r33XmrXrk1cXBxXX301S5cuzaxPT0+nW7duJCUlUb58eW644QY2bNiQWf/9998THx/PmDFjsl137dq1lCtXjn/+859hexaRwlKQOR/n5ywzs+rAy8DEwgxKREQklBYtWsTChQt57733aNCgQa4J5++++26EIpNo0qNHD1avXs0//vEPzjnnHF599VVatWrFF198QVJSEu3bt6dEiRLMmDGDypUrM3bs2Mz6ChUqUKNGDcaNG0e3bt248cYbadCgAUeOHKFLly60b9+e3/3ud5F+RJECO6M5H+6ebmaDgOnA24UTkoiISGjFx8fToUOHSIchUezgwYO8+eabvPnmm1x77bUAPProo8ycOZMJEybQpUsXPvnkE1atWsVll10GwIQJE6hRowbTpk2jR48eAKSmpvL2229nth82bBhpaWnMnTs3Uo8mckYKY8J5CQK7n4uIiBQLL7/8cqRDkCh39OhRjh07Rrly5bKVx8XFsXjx4szFDrLWlyhRgrJly7J48eLM5AMCCyRcfPHFdO7cmbfeeot33nmHqlWrhudBRApZvud8mFmHHK+OZtYXeBVYFLoQRURERIqXs846i6ZNmzJ8+HC2bdvGsWPHePXVV/n4449JS0ujXr16nHfeeTz00EPs3r2bw4cP89e//pXvvvuOtLS0bNeqWrUqo0aNYvr06XTq1Im2bdtG6KlEzlxBej7eyHHswE5gPvDnQotIREQkBC699FI+/PBDqlSpwiWXXHLSvT1Wr14dxsgkWk2ZMoXf//73nHPOOZQsWZLGjRvTqVMnli9fTunSpXnrrbf4wx/+QLVq1ShZsiStWrXixhtvzLUQQkZGBi+//DLly5dn6dKlHDp0KFePikhxoU0GRUQkJnTs2JGyZctmftbGghJqF1xwAR9++CE///wze/fupWbNmqSmplK3bl0AmjRpwqpVq9izZw+HDx8mISGBK6+8kpSUlGzXeeqpp1izZg1Lly7l+uuvZ9CgQblWwBIpLvKVfJhZaWAx0MXdvwptSOGlTQZFRGLDkCFDMj8/+uijkQtEYk6FChWoUKECP/74I7Nnz+aJJ57IVl+5cmUANmzYwLJlyxg2bFhm3bp16xg0aBCTJk2iQYMGvPjii7Rt25YOHTrQrFmzsD6HSGHIV2+Gux8Bzicw1CqquPtMd+91/H98ERGJfi1btuSnn37KVb53715atmwZgYgkGs2ePZv333+fTZs2MXfuXK677jrq1atH9+7dAXj99df54IMP+Oabb3jnnXdo3bo17du3p02bNkBg0nrXrl256aab6Ny5MwBt2rShR48edO/enQMHDkTs2UROV0GGUv0D0C7gIiJS7C1YsIDDhw/nKj906BCLFmkNFSkce/bsoW/fvtSrV48uXbrQvHlzZs+enbmvTFpaGl26dKFevXrcc8893HnnnUybNi3z/FGjRrFlyxYmTJiQ7bqjR4/m6NGjPPjgg2F9HpHCUJAJ5xWAzmbWGlgO/Jy10t3vKczARERECtuKFSsyP69evTrbcqXHjh1j9uzZ1KpVKxKhSRS6/fbbuf32209Yf88993DPPSf+9enhhx/m4YcfzlVesWJFvvnmm0KJUSTcCpJ81AeO/6tdN0dd1A3HEhGR6JOSkoKZYWaZQ1uyiouL49lnn41AZCIisaEgq11dF8pAREREQm3Tpk24O3Xr1uWzzz4jISEhs65MmTIkJiZSsmTJCEYoIhLdCmOHcxERkWKhdu3aQGDfBBERCT8lHyIiEpO+++47Fi5cyI4dO3IlI/37949QVCIi0U3Jh4iIxJypU6fy+9//nlKlSpGQkJBtw0EzU/IhIhIiUZt8mFl5YB3wurvfH+l4RESk6HjkkUf485//zLBhwzTHI0bYwJ2RDiEq+OMJp24kchIF2eejuBkEfBLpIEREpOhJT0+nR48eSjxERMIsKpMPM7sQqAe8H+lYRESk6Gnbti2ffvpppMMQEYk5YR12ZWYtgPuBJkAS0N3dJ+do0wd4AKgJrAXudfeCbjc7OniNq880ZhERiT6tW7dmwIABrF27lksuuSRzx+njOnToEKHIRESiW7jnfFQEPgdeCb6yMbNU4GmgD7A4+P6+mTVw963BNqvIO+427r7dzG4F1rv7ejNT8iEiIrncddddAIwcOTJXnZlx7NixcIckIhITwpp8uPssYBaAmU3Oo0l/YLK7Twwe321mNwC9gQeD12h0ittcBfzOzP6bQLJT2sz2uvtjhfAIIiISBbTPh4hIZBSZOR9mVobAcKw5OarmUIDhU+7+oLuf6+51CAzxmniixMPMepnZMjNbtnOnVsEQEREREQmlorTUbjxQEkjPUZ4OtArFDd39BeAFgJSUFA/FPUREpOgZO3bsSeu1z4eISGgUpeSj0OWczJ4XM2sHtEtOTg59QCIiUiQ8++yz2Y6PHDlCWloacXFxJCYmKvkQEQmRopR87AKOAdVzlFcHvg/VTd19JjAzJSWlZ6juISIiRcumTZtylaWnp9O9e3d69tSPAxGRUCkycz7c/TCwHGido6o18FGo7mtm7czshT179oTqFiIiUgxUr16dESNG8Je//CXSoYiIRK2wJh9mVtHMGplZo+C9zwsenxdsMhboZmY9zKy+mT1NYD+Q50MVk7vPdPdelStXDtUtRESkmMjIyCA9PefUQxERKSzhHnaVAnyQ5Xho8PUPoJu7/6+ZVQMGE9hk8HOgrbtvCXOcIiISxd56661sx+5OWloa48aN45prrolQVCIi0S/c+3wsAOwUbcYD48MSEJpwLiISi2677bZsx2ZGQkICLVu2ZMyYMRGKSkQk+hWlCecRoQnnIiKxR5sMiohERpGZcC4iIhIOR44c4corr+Srr76KdCgiIjEn5pMPrXYlIhJbSpcuzaZNmzA76ShgEREJgZhPPrTalYhI7OnatSsTJ06MdBgiIjEn5ud8iIhI7Pn555+ZOnUqc+fOpUmTJlSoUCFb/TPPPBOhyEREopuSDxERiTnr1q2jcePGAHzzzTfZ6jQcS0QkdGJ+2JXmfIiIxJ4PPvjghK/58+dHOrxc0tLS6Nq1KwkJCZQrV44GDRrw4Ycf5tn2rrvuwswYPXp0Ztn3339PfHx8rmWE165dS7ly5fjnP/8Z0vhFRI6L+eRDcz5ERKQo++mnn2jWrBnuznvvvce6det49tlnSUxMzNX2jTfe4LPPPiMpKSlbeY0aNRg3bhyDBw/miy++AAKrfnXp0oX27dvzu9/9LizPIiKiYVciIiJF2BNPPEHNmjV55ZVXMsvOP//8XO22bNlCv379mDdvHjfeeGOu+tTUVN5++226dOnCJ598wrBhw0hLS2Pu3LkhjV9EJKuY7/kQEREpymbMmMGVV15JamoqiYmJNGrUiOeeew53z2xz9OhROnXqxODBg6lfv/4JrzV+/Hi2bdtG586dGTVqFJMmTaJq1arheAwREUDJh4iISJH2zTffMH78eOrWrcvs2bPp168fAwcOZNy4cZlthgwZQnx8PL179z7ptapWrcqoUaOYPn06nTp1om3btqEOX0Qkm5gfdmVm7YB2ycnJkQ5FREQkl4yMDFJSUhg1ahQAl19+ORs2bGDcuHH07duXBQsWMHnyZFatWpWva7388suUL1+epUuXcujQIcqVKxfqRxARyRTzPR+acC4iIkVZzZo1adCgQbay+vXrs3XrVgAWLFhAWloaNWvWpFSpUpQqVYotW7YwYMAAzjnnnGznPfXUU6xZs4alS5eyf/9+Bg0aFLbnEBEB9XyIiIgUac2aNeOrr77KVrZ+/Xpq164NQJ8+fbjtttuy1V9//fV06tSJnj17ZpatW7eOQYMGMWnSJBo0aMCLL75I27Zt6dChA82aNQv9g4iIoORDRESkSLvvvvu4+uqrGTFiBKmpqaxcuZJnnnmGkSNHApCYmJhr2d3SpUtTo0YNfvWrXwGBCeldu3blpptuonPnzgC0adOGHj160L17d1atWkX58uXD+2AiEpNiftiViIhIUXbFFVcwY8YMpk+fTsOGDRk0aBDDhg2jT58++b7GqFGj2LJlCxMmTMhWPnr0aI4ePcqDDz5Y2GGLiORJPR8iIiJF3E033cRNN92U7/abN2/Odvzwww/z8MMP52pXsWJFvvnmmzMNT0Qk32K+58PM2pnZC3v27Il0KCIiIiIiUS3mkw+tdiUiIiIiEh4xn3yIiIiIiEh4KPkQEREREZGwUPIhIiIiIiJhodWuRERECsAG7ox0CFHBH0+IdAgiEgHq+RARERERkbBQ8iEiIiIiImGh5ENERERERMIi5pMPbTIoIiIiIhIeMZ98aJNBEREREZHwiPnkQ0REREREwkPJh4iIiIiIhIWSDxERERERCQslHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFiUinQAoWBmm4G9QAbwo7tfF9mIREREREQkKpOPoKvdfX+kgxARERERkQANuxIRERERkbAIa/JhZi3M7F0z22Zmbmbd8mjTx8w2mdkhM1tuZtecxq0c+NDMlppZ5zMOXEREREREzli4h11VBD4HXgm+sjGzVOBpoA+wOPj+vpk1cPetwTaryDvuNu6+Pfi5ubtvM7OawDwzW+Puqwv/cUREREREJL/Cmny4+yxgFoCZTc6jSX9gsrtPDB7fbWY3AL2BB4PXaJSP+2wLvqeZ2SygMaDkQ0REREQkgorMnA8zKwM0AebkqJoDXF2A61Qws7OCnysCLYG1J2jby8yWmdmynTt3nl7gIiIiIiKSL0Um+QDigZJAeo7ydKBGAa5THVhsZv8HfAK84u5L82ro7i+4e4q7pyQkJJxOzCIiIiIikk9Rt9Suu38DXJbf9mbWDmiXnJwcuqBERERERKRI9XzsAo4R6LnIqjrwfahu6u4z3b1X5cqVQ3ULERERERGhCCUf7n4YWA60zlHVGvgo/BGJiIiIiEhhCuuwq+AE8OPjm0oA55lZI2B3cCndscAUM/sMWAL8EUgCng9hTBp2JSIiIiISBuHu+UgBVgZfccDQ4OfHANz9f4F7gcHAKqA50Nbdt4QqIA27EhEREREJj3Dv87EAsFO0GQ+MD0tAIiIiIiISNlG32lVBadjVidnAor/3iT+uJZJz0veteNL3TUREYkGRmXAeKRp2JSIiIiISHjGffIiIiIiISHjEfPJhZu3M7IU9e/ZEOhQRERERkagW88mHhl2JiIiIiIRHzCcfIiIiIiISHko+REREREQkLGI++dCcDxERERGR8Ij55ENzPkREREREwiPmkw8REREREQkPJR8iIiIiIhIWSj5ERERERCQsYj750IRzEREREZHwiPnkQxPORURERETCI+aTDxERERERCQ8lHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFjEfPKh1a5ERERERMIj5pMPrXYlIiIiIhIeMZ98iIiIiIhIeCj5EBERERGRsFDyISIiIiIiYaHkQ0REREREwkLJh4iIiIiIhIWSDxERERERCYuYTz60z4eIiIiISHjEfPKhfT5ERERERMIj5pMPEREREREJDyUfIiIiIiISFko+REREREQkLJR8iIiIiIhIWCj5EBERERGRsFDyISIiIiIiYaHkQ0REREREwiIqkw8zO9/MPjCzL8xsjZlViHRMIiIiIiKxrlSkAwiRycBgd19kZlWBXyIcj4iIiIhIzIu65MPMLgaOuPsiAHffHeGQRERERESEMA+7MrMWZvaumW0zMzezbnm06WNmm8zskJktN7NrCnibC4H9ZjbTzFaY2UOFErz8//buPsaOqozj+PeHRUXqC7HYYiJoRBHxpRJRQF6qAlb+0IAmxmhMDVq1SnyBmGA0agxKIkaJSFI0pohBE4OR0gAWDViphLcoiCBCIqDWFrFQBasIPP4xU7m93N3udnfn7t39fpLJ3pk598wzPdtncubMnJUkSZKmpOuRj4XArcD32mUnSd4FnAOsAq5pf16e5OVVdW9b5jcMjvuEqtrU7jsaWArcB1yR5IaqunIGzkeSJEnSBHXa+aiqy4DLAJKsGVDkU8Caqvp2u35qkuXAR4Az2jqW7uIwfwFurKo/tce5jKYjYudDkiRJGqJU1XAOnDwEfKyq1rTrTwX+Bby7qn7UU+5bwCuq6tgJ1rsAuAF4E7ANuARYXVXrBpRdCaxsVw8C7tjtE5qbFgH3DzsITZrtNppstyc7oKr2HXYQoyjJyqo6f9hxaHJst9Fku03ObHrhfBHwFGBL3/YtwHETraSqHm3f89gABFg/qOPRlj0f8JdlDElurKrXDjsOTY7tNppsN02zlXh9G0W222iy3SZhNnU+pk1VXQ5cPuw4JEmSJD1hNv2RwfuBx4DFfdsXA5u7D0eSJEnSdJo1nY+qegS4CTi+b9fxwK+6j0g4hDiqbLfRZLtpOvn7NJpst9Fku01Cpy+cJ1kIHNiu/go4C1gLbK2qe9updi+kmWJ3I/Bh4BTgkKq6p7NAJUmSJE27rjsfy4CrBuy6oKpWtGVWAZ8G9qP5myCfrKoNXcUoSZIkaWYMbapdSZIkSfPLrHnnQ7NDkmOSrE3ylySVZMWwY9LOdtVGaXwhyaYk25NcneSQIYU7b01HOyXZJ8mFSba1y4VJntPpiWhkmL9Hgzl8NJjDZ46dD/VbSPO428eB7UOORYPtqo0+DZwGnAocBtwHXJnkmZ1FKJiedroIOBRY3i6H0rwXJw1i/h4N5vDRYA6fIT52pTH1/xV6zT79bZQkwCbg3Ko6s922F01SPL2qVg8r1vlsd9opycHAbcBRVbWxLXMU8EvgZVV1R/dnolFh/h4N5vDRYA6fXo58SHPLi4AlwPodG6pqO7ABOHJYQelJJtJORwAPsfNU4xuBh7EtpbnKHD4azOFTYOdDmluWtD+39G3fPsoqRAAABb5JREFU0rNPwzeRdloC/K16hqfbz/dhW0pzlTl8NJjDp8DOhyRJkqRO2PmQ5pbN7c/FfdsX9+zT8E2knTYD+7bPFgP/f874ediW0lxlDh8N5vApsPMhzS1/pElqx+/YkOTpwNHs/Nyphmsi7XQtzWwrR/R87whgb2xLaa4yh48Gc/gULBh2AJpdkiwEDmxX9wD2T7IU2FpV9w4vMu2wqzZK8g3gM0l+D/wB+CzNS28XDSXgeWqq7VRVtye5AlidZGVbz2pg3XyeJUVjM3+PBnP4aDCHzxyn2tVOkiwDrhqw64KqWtFtNBpkV23UDut+HvgQsA9wHfDRqrq1uyg1He2UZB/gm8Db2k1raaZ7fHAmY9doMn+PBnP4aDCHzxw7H5IkSZI64TsfkiRJkjph50OSJElSJ+x8SJIkSeqEnQ9JkiRJnbDzIUmSJKkTdj4kSZIkdcLOhzRESZYkWZ/k4SQzMu91kmVJKsmimahfkuYrc7g0eXY+pAlIsm+SR5LsnWTP9kKz/zRUfTrwfGApsN801CdJ6mMOl2aPBcMOQBoRRwA3V9XDSV4PbK2qe6eh3gOBm6rqzmmoS5I0mDlcmiUc+ZAm5khgY/v5qJ7P40ryoSR3tXfc7krywZ59dwNvB97XDqmvGaeeE5Ncl2R7kr8nuTTJ09t9+yS5IMkD7f6fJTlknLpWJHmob9tOw/o7yiR5a5LfJ/lXkrVJnp3knUnuTLItyYVJ9uqp5+ok5yX5cpL7k9yX5Owke/SUOTnJLW2sW5P8Isniifx7StJuMoebwzVLOPIhjaEdkr+lXX0G8FiSFcBeQCV5ELioqlaN8f2TgHOBTwLrgbcA5yXZXFWXAocBFwFbgY8D28eoZzmwFjgLeD/N/9sTeOLmwRrgIJqL4APAmcAVSV5aVQPrnKCnAacB7wGeClzcLtuBdwDPBX4MrAK+1vO99wDn0Fzsl7bneBPwgyRLgB8CZ7R1LQQOn0KMkjSQOdwcrlmqqlxcXAYsNBeIFwKvAh5pf74Y+CdwTLtv0Tjf3wh8t2/bGuCanvV1wJpdxLER+OEY+14CFHBMz7ZnA9uAD7Try9oyi9r1FcBDffUMKlPAQT1lzgYe6z3n9nzW9axfDVzbV/eVwHfaz4e29R4w7PZ1cXGZ24s53BzuMjsXH7uSxlBVj1bV3cDLgBuq6hZgCbClqjZU1d1Vdf84VRzMk4f2rwFePslQXgP8fJxjPA5c2xP3NuC3u3Gcfv+pqjt61rcAm/vOeQvwvL7v3dK3vqmnzM3Az4Bbk1yc5CNJ9p1inJL0JOZwc7hmJx+7ksaQ5HfAAcCewB7tM7YLgAXt53uqaszncscxI9MxTuI4jwPp27bngHKPDqjvvwO29d/EGLNMVT2W5ASaYfoTgFOAryQ5tqpuHiNeSZo0c7g5XLOTIx/S2E6ked51M/De9vOtwCfazyfu4vu3A2/o23YUcNsk4/g18OZxjrEHzUwuACR5FvDKcY7zN+AZbbkdlk4ypt1WjWur6os0z0xvAt7V1fElzRvm8BlgDtdUOfIhjaGq7mlfrlsMXEJz9+cQ4OKq+usEqvgq8KMkN9G8rLic5kW+kycZypnApUnuonnxLzR3nFZX1Z1JLgFWJ1kJPNiW/0dbdpDrgIdp7lZ9HXg1zQuHMy7J4cBxwE9phvtfA7yAyV/MJWlc5vDpZw7XdHDkQxrfMppnhf8NvA748wQvWlTVT4BTaWZKuY1mNpRV1cySMmFVdRlwEvBWmjtovwDeSDP0Ds3sKdfTzKZyPc2sLstrjFlSqmorzQX0eJrnilcCn5tMTFOwjeZO4jrgTpoZVr5UVd/v6PiS5pdlmMOnkzlcU5aqrh5dlCRJkjSfOfIhSZIkqRN2PiRJkiR1ws6HJEmSpE7Y+ZAkSZLUCTsfkiRJkjph50OSJElSJ+x8SJIkSeqEnQ9JkiRJnbDzIUmSJKkT/wPvaXmwUW/5/wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import OrdinalMinuteOfHour\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [OrdinalMinuteOfHour(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OrdinalMinuteOfHour\")" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "cf7a0953", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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BJutM5zMesySlBOLFi1i7ty5tG/fnpKSkkrLtmrDpJRYunQps2bNAlhrAiJJ9Wn48MxXyh/84AeVyi+77DIuv/zyWrV1991307x5c/r167fGuWuvvZYZM2bw1FNPVSofNmwYe+21FxdddBE333xz7YLfRDWono98cNiVpPX54IMPaNeuXaH9KtUgLFmyhNmzZ1PdioP2fEjSJmutv9JtMhPO60tKaUxK6eTmzZvnOxRJDdTy5cspKSnJdxgFqaSkxKFsklREij75kKSacKhV/fB9laTiUvTJR0T0jYg7Fy5cmO9QJKlB69ixI88880y+w5AkbcKKPvlw2JUkSZKUGw1qtStJ2lS82mPnem1//4kf1mv7kiTlg8mHJG3iOnbsyCmnnMKoUaOYM2cORx11FLfffjtLly5lwIABvPbaa6xYsYLu3btzxx13lO/K+/3vf5+DDjqICRMm8Oabb9KtWzceeOABWrZsCcCoUaO45JJLWLx4Meecc06la/71r3/lzDPP5L333qOkpIR+/fpx4403ssUWW5BS4pxzzmH06NEsW7aMDh068OCDD7LHHnvk/L2RtGmLCz/PdwgFIV1Xmu8QyhX9sCvnfEgqBKNHj2bcuHF8+OGHTJs2jauvvppVq1YxcOBAZsyYwcyZMykpKeH000+v9LoHHniAe++9l3nz5vHNN98wbNgwAN59910GDx7MqFGjmD17Nv/85z/59NNPy1/XqFEjfvOb3zB//nxeeeUV/vKXv5Svlz9+/HgmTpzItGnTWLhwIQ899BDbb7997t4MSVKDVfTJh3M+JBWC008/nR122IEWLVowZMgQHnzwQbbffnv69etHkyZN2HrrrRkyZAjPP/98pdcNHDiQXXbZhZKSEn7yk58wdepUAB555BEOP/xwevTowZZbbslVV13FZpv9+yNj3333Zf/992fzzTcv73lZ3Xbjxo358ssvef/990kpsdtuu9G2bdvcvRmSpAar6JMPSSoEO+ywQ/nzDh06MHv2bJYsWcIpp5xChw4d2GabbejRowf/+te/WLlyZXndNm3alD9v0qQJixcvBmD27NmV2mzatGml3otp06Zx+OGH06ZNG7bZZhsuvvhi5s+fD0DPnj05/fTTOe2002jVqhUnn3wyixYtqrd7lyRtOkw+JKkAfPLJJ+XPZ86cSbt27bjhhhv4+9//zmuvvcaiRYuYOHEiACmtf0Pwtm3bVmpzyZIl/POf/yw/Hjx4MLvuuiv/+Mc/WLRoEddcc02ldn/5y18yZcoU3n33XaZNm8avf/3rurhNSdImzuRDkgrAbbfdxqeffsqCBQsYOnQo/fv358svv6SkpIRtt92WBQsWcMUVV9S4vWOOOYb/9//+Hy+++CLffPMNl156KatWrSo//+WXX7LNNtvQrFkz3n//fW6//fbyc5MmTeK1115j+fLlNG3alK222qrSkC1JUvEq+k8DJ5xLKgTHHnssvXv3plOnTuy8885ccsklnHXWWSxdupSWLVuy//77c9hhh9W4vd13353bbruNY489lrZt27LddtuVr5IFMGzYMB544AG23nprBg0aRP/+/cvPLVq0iEGDBrHddtvRoUMHtt9+e84///w6vV9J0qYpatL9XgzKysrS5MmT8x2GpAbovffeY7fddst3GGvVsWNHRowYQa9evfIdygZZ2/sbEVNSSmU1aMIPMqlAudRu3cjDUruxthNF3/MhSZIkKTdMPiRJkiTlhDucS9Im7uOPP853CJIk1Yg9H5IkSZJyouiTD1e7kiRJknKj6JOPlNKYlNLJzZs3z3cokiRJUkEr+uRDkiRJUm6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ9znQ5I2QFz4eb22n64rrdf2JUnKB3s+JGkT17FjR4YNG8Zee+1F8+bN6d+/P8uWLWPkyJEceOCBlepGBB988AEAJ554Iqeeeio//OEPadasGd27d+ezzz7jrLPOYrvttmPXXXfljTfeqHSda6+9li5durDddtsxcOBAli1bBsAee+zBmDFjyusuX76cli1bVnq9JElFn3y4z4ekQvDQQw/xpz/9ienTp/Pmm28ycuTIGr/u6quvZv78+Wy55ZZ069aNrl27Mn/+fI455hjOOeecSvVHjx7NuHHj+PDDD5k2bRpXX301AMcffzz/+7//W15v7NixtG3bln322afO7lGStOkr+uTDfT4kFYJf/vKXtGvXjhYtWtC3b1+mTp1ao9f9+Mc/Zt9992Wrrbbixz/+MVtttRXHH388jRo1on///mv0XJx++unssMMOtGjRgiFDhvDggw8C8F//9V+MHTuWRYsWATBq1CgGDBhQtzcpSdrkFX3yIUmFoE2bNuXPmzRpwuLFi2v0utatW5c/LykpWeO4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bbbZhhdffJEJEybw+uuvs2rVKrp27UqvXr3yHZokFbRa7XAeEd8CegCtqJKMpJRurMO4JEmqdz179qRnz575DkOSikaNk4+IOA64B1gBfE7lDQcTYPJRQ+4XIUn598Ybb/Dss88yb948Vq1aVenc9ddfn6eoJKmw1abn40rgBuD/ppRW1lM8ORcRfYG+nTt3zncokqQcuf7667nwwgvp0KEDrVu3JiLKz1V8LkmqW7WZx9EaGFFIiQe4z4ckFaPf/OY33H777UyfPp1XX32VV155pfzx8ssv5zs8FYgvv/ySs846iw4dOlBSUsIBBxzApEmTys8vXryYM844g29961uUlJTwne98h9/85jfl5z/77DNatmzJDTfcUKndd955h6222orf//73ObsXqa7UJvkYC+xXX4FIkpQrq1at4gc/+EG+w1CBO+mkkxg3bhz33Xcfb731Fr1796ZXr17MmpXZHu2cc87hqaeeYtSoUbz33nsMGTKECy+8kFGjRgHQpk0bbrvtNi655BLeffddAJYvX87xxx/PUUcdxU9/+tO83Zu0oWqTfPwZ+J+IuDoi+kfE0RUf9RWgJEl1bfDgwdx77735DkMFbOnSpTz66KNcd911fP/736dz585cfvnldO7cmdtvvx2Al19+mQEDBnDwwQfTsWNHjj/+ePbff39ee+218nb69+/PkUceyfHHH8+KFSu46qqrmDNnDsOHD8/XrUkbpTZzPn6X/XtxNecSmd3OJUlq8C677DL69OnDPvvswx577EHjxo0rnb/nnk12+yo1ECtWrGDlypVstdVWlcpLSkp48cUXATjwwAMZM2YMJ510EjvssAMvv/wyU6dO5fzzz6/0muHDh7P77rtz3HHH8dhjj/HEE0/QokWLnN2LVJdqnHyklApynw9JUvEZMmQI48ePp2vXrnzxxRdOMled23rrrenWrRtXX301e+yxB23atOHBBx/klVdeYfUiN7fccgunnHIKO+64I5tvnvlKduutt3L44YdXaqtFixZce+21DBw4kAEDBtCnT5+c349UV2q1z0chcrUrSSo+w4cP54EHHqB///75DkUFbNSoUfz85z/nW9/6Fo0aNaJr16787Gc/Y8qUKUAm0Xj55Zd58skn6dChAxMnTuS8886jY8eOHHbYYeXtrFq1invvvZcmTZowadIkli1btkaPirSpqM0+H+es6/ymusmgO5xLUvEpKSlhn332yXcYKnA777wzzz//PF999RWLFi2ibdu29O/fn06dOrF06VIuuugiHn74Yfr27QvAXnvtxdSpUxk2bFil5OOmm27irbfeYtKkSRx66KEMGTJkjRWwpE1FbXo+zqhy3BhoCywF5uEmg5KkTcTZZ5/NTTfdxG233eaQK9W7pk2b0rRpU7744gvGjRvH9ddfz/Lly1m+fDmNGlWeMtuoUaNKm16uXgVrxIgRdOnShbvvvps+ffpw9NFH071791zfirTRajPnY6eqZRHRGrgXuKsug5IkqT698MILTJw4kaeeeoouXbqsMeH8ySefzFNkKiTjxo1j1apV7LrrrnzwwQecf/757LrrrgwcOJDGjRvzve99jwsvvJBmzZrRoUMHnn/+ee6//36uv/56IDNp/YQTTuBHP/oRxx13HAC9e/fmpJNOYuDAgUydOpUmTZrk8xalWtuoOR8ppbkRMQR4CPhj3YQkSVL9atmyJUcf7Srxql8LFy7koosu4tNPP6VFixb069ePoUOHlie7v//977nooos47rjjWLBgAR06dOCqq67i9NNPB+Daa69lxowZPPXUU5XaHTZsGHvttRcXXXQRN998c87vS9oYkVLauAYi9gWeTSltUzch5UdZWVmaPHlyTq71ao+dc3KdjbX/xA/zHUKD4r/bpmtT+Lfz321NETElpVRWg6ob90EmqcGKCz/PdwgFIV1XmutLrnU8a20mnFf9iSjIzPk4DXhhw+KSJEmSVCxqM+zqkSrHCfgcmACcW2cRSZJUD/baay+ef/55tttuO/bcc891TjR/8803cxiZJBUPNxmUJBWFfv36seWWW5Y/d5UrScq9GiUfEdEYeBE4PqX09/oNKbfcZFCSisNll11W/vzyyy/PXyCSVMRqlHyklJZHxE4U4KQ+NxmUpOLTs2dPHnvsMbbddttK5YsWLeKoo45iwoQJeYpM9cWJy3UjDxOXVWBqM5TqPsAv6JKkTd5zzz3HN998s0b5smXLeOEF11CRpPpSmwnnTYHjIuIQYArwVcWTKaVf1mVgkiTVtddff738+ZtvvkmLFi3Kj1euXMm4ceNo3759PkKTpKJQm+RjN2D1/7U7VTlXcMOxJEmFp6ysjIggIujdu/ca50tKSrj11lvzEJkkFYfarHZ1cH0GIklSfZs+fTopJTp16sRf//pXSkv/PX59iy22oFWrVjRq1CiPEUpSYatNz4ckSZu0Dh06ALBq1ao8RyJJxcnkQ5JUlD799FMmTpzIvHnz1khGzjnnnDxFJUmFzeRDklR0Ro8ezc9//nM233xzSktLK204GBEmH5JUTwo2+YiIJsB7wMMppfPyHY8kqeG49NJLOffcc7nqqquc4yFJOVSbfT42NUOAV/MdhCSp4Zk7dy4nnXSSiYck5VhBJh8R8W1gV+DpfMciSWp4+vTpw2uvvZbvMCSp6OR02FVE9ADOA/YF2gEDU0ojq9Q5FTgfaAu8A5yVUqrtdrPDsm0csLExS5IKzyGHHMIFF1zAO++8w5577knjxo0rnT/66KPzFJkkFbZcz/loBrwN3J99VBIR/YGbgVOBF7N/n46ILimlmdk6U6k+7t4ppdkRcSQwLaU0LSJMPiRJazjllFMAuOaaa9Y4FxGsXLky1yFJUlHIafKRUhoLjAWIiJHVVDkHGJlSuit7fEZEHAYMBi7KtrH3ei6zP/DTiPg/ZJKdxhGxKKV0ZR3cgiSpALjPhyTlR4OZ8xERW5AZjjW+yqnx1GL4VErpopTSDimljmSGeN21tsQjIk6OiMkRMfnzzz/fwMglSZIk1URDWmq3JdAImFulfC7Qqz4umFK6E7gToKysLNXHNSRJDc+NN964zvPu8yFJ9aMhJR91rupk9upERF+gb+fOnes/IElSg3DrrbdWOl6+fDlz5syhpKSEVq1amXxIUj1pSMnHfGAl0LpKeWvgs/q6aEppDDCmrKxsUH1dQ5LUsEyfPn2Nsrlz5zJw4EAGDfLjQJLqS4OZ85FS+gaYAhxS5dQhwMv1dd2I6BsRdy5cuLC+LiFJ2gS0bt2aoUOH8qtf/SrfoUhSwcpp8hERzSJi74jYO3vtHbPHO2ar3AicGBEnRcRuEXEzmf1A7qivmFJKY1JKJzdv3ry+LiFJ2kSsWrWKuXOrTj2UJNWVXPd8lAFvZB8lwBXZ51cCpJT+AJwFXAJMBQ4E+qSUZuQ4TklSAXvssccqPR599FF++9vf8l//9V8cdNBB+Q5vDXPmzOGEE06gtLSUrbbaii5duvD888+Xn4+Iah+nnXYaAEuWLGGXXXbhjDPOqNTu3LlzKS0t5brrrsvp/UgqXrne5+M5INZTZzgwPCcB4YRzSSpGxxxzTKXjiKC0tJSePXtyww035Cmq6v3rX/+ie/fuHHjggTz11FOUlpby0Ucf0apVq/I6c+bMqfSayZMn07dvX37yk58A0KRJE+677z569OjBUUcdxQ9+8AMATjrpJHbZZReHmknKmYY04TwvnHAuScVnU9pk8Prrr6dt27bcf//95WU77bRTpTpt2rSpdPzEE0+wyy678L3vfa+8rFu3bpx77rkMHDiQt956i0cffZQJEybwt7/9jc02azBTQCUVOP9vI0kqKsuXL2e//fbj73//e75DqZHHH3+c/fbbj/79+9OqVSv23ntvfvvb35JS9dtTLV68mN///vfVrtp15ZVX0rx5cwYMGMDZZ5/Nr3/9a+z5l5RLRZ98uNqVJBWXxo0bM336dCLWOQq4wfjoo48YPnw4nTp1Yty4cZx55plceOGF3HbbbdXWf+CBB/jmm2844YQT1ji3xRZbcOuttzJmzBj23ntvBg8eXN/hS1IlRZ98uNqVJBWfE044gbvuuivfYdTIqlWr6Nq1K9deey377LMPAwcO5Je//OVak4+77rqLI488ktLS0mrP33333TRp0oT33nuP+fPn12fokrSGop/zIUkqPl999RWjR4/mz3/+M/vuuy9NmzatdP6WW27JU2Rratu2LV26dKlUtttuu3HzzTevUXfq1KlMnjyZa665ptq2/vjHP/LQQw/x0ksvccoppzB48GAeeeSReolbkqpj8iFJKjrvvfceXbt2BTLDmipqaMOxunfvvsb8lGnTptGhQ4c16t55553stNNO9OrVa41z8+bN45RTTuHSSy+lrKyM++67j3333ZcHH3yQn/3sZ/UWvyRVVPTJh0vtSlLxefbZZ/MdQo2dffbZHHDAAQwdOpT+/fvzxhtvcMstt6zRu7FkyRJGjx7Nr371q2oTqF/84hfstNNOXHjhhQDsscceXHHFFZxxxhn07NmT1q1b5+R+JBU353w450OS1ID9x3/8B48//jgPPfQQe+yxB0OGDOGqq67i1FNPrVTvD3/4A1999RUDBw5co41Ro0bx9NNPc99999GoUaPy8vPPP59vf/vbnHzyyfV+H5IE9nxIktTg/ehHP+JHP/rROusMHDiw2sQDYMCAAQwYMGCN8kaNGvHKK6/USYySVBNF3/MhSZIkKTdMPiRJkiTlRNEnH24yKEmSJOVG0ScfTjiXJEmScqPokw9J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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import OrdinalHourOfDay\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [OrdinalHourOfDay(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OrdinalHourOfDay\")" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "9cff444f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde5zWc/7/8cerdJgpHWc6bgcVSyXKWBKtUiGyVF9Z0WG/yrJRwqJsicQSy+6WQyGbWKdQX1GSdCA6/koi0oEOU4kOOjev3x/X1ZiZZjSjuT6fmet63m+36zbX5/N+fz7v12eGZl7X+2TujoiIiIiISKyVCDsAERERERFJDEo+REREREQkEEo+REREREQkEEo+REREREQkEEo+REREREQkEEo+REREREQkEEo+RERyYWYdzOwdM/vezPaa2Uoz+7uZVT7G+840s5lZjs83Mzez84815l9oc5yZrclxzrO8DpjZFjObbWZ/M7NqsYolRwxnmtnrZpZuZvvMbI2ZjTaz2rnULWdm481sczTmp6Jfh+RSd0W0rHGO802i5/vF4Fnuid77uMK+t4hIPFHyISKSg5kNAqYCe4HrgAuBJ4FewHwzq1OIzS0CWka/Bm1ctO3fA38CZgE3AcvN7JxYNmxm1wIfA1WB/kB74AEi3+vFZtYsxyV/Af4I3BaNeQTwNdA6x31TgZOB3TnLshzPKrQHERGRAtEnNCIiWZhZG2A48Ji735Kl6EMzewNYCPwHaJPH9SUBc/eD+WnP3XcA844t6l9tvbtnbXuymf0TmA1MNLMG7r67sBs1s5OBMcCbwJXunhEtmmVmrwGfAK+ZWRN3PxAtOwXY4O7/yXKfD4GrzKxUlnqtge3AG9H3T2ZpujXwA7CssJ9JRETyRz0fIiLZ/RXYBtyVs8DdVwMPAueb2VmQOXzpfjO708xWA/uBU6NlV5nZF9EhRcvN7Iqc98xt2FV0aNYcM2tnZovMbLeZfZbzejNrFB2KtNrM9pjZN2b2xLEMDXP3dOB2oDqRnobDbXUwsylmtjFLPLdGk63DdSab2eJcnvEEM8swsz9HT/UHSgI3ZUk8Drf/PTAIOBHoHL3eifQ61ckyVOx8Ij0Y5YAzstyiNfAR8CFwXo5QzgNmu7tH75tqZk+a2froz+gLM+ubR/wTokPT9pnZktx+lrlcd5GZ7TKzf5uZft+KiKDkQ0QkU3S8/u+B99x9bx7VJkW/ts1yrhdwCZEhQZcAG8ysHfAi8BWRP6IfBh4HfpvPcBpG6z8avX4j8KqZNcpSpxbwLTCAyHCle4ELgCn5bCMv04CDQKss5xoA7xMZnnUJ8DxwD3B/ljpPAKeb2e9y3K8v8BMwIXp8AbDA3Tfm0f7bQAY/f49bEhkGtyn6/vAwtcPDp7IOr2pNpOdmNvAbM2sAYGYNgdqHrzGzCsAcoGP0OS4BJgNPmNlNh28WHWL3CXAacAtwWbTt183ssjzix8x6EPlv5UF375czyRIRSVRxN+zKzC4FHiGSWP3d3ceGHJKIFB9VgSRgzS/UOVyWdd6HAR3cfU/mCbOJwBfAHw7/4WlmXxCZ5/BlPmJJAVq7+1fRaxcRSUCuJDLfAXefRZb5C2b2EZF5ELPNrLm7H9ELkR/uvsfMtgI1s5zLHL5kZkbkj/vSwG1mNij6jO8C3wDXA59G65YCegMT3H1n9BZ1iAxfy6v9n8xsS7Qe7j4vGs++HMPEdpjZOiIJx0NmVhFoRqRHZZWZbYyWfcOR8z36A/WAUw9/j4HpZlYJGGpmT0SHzt1D5Of7+2ivDMDUaFJyLz8no5nM7K9EkrIb9DtIRCS7uOr5iH5q+SiRT8uaA7ebWdVwoxKRBPBujsSjJHAm8FrWT7yjfzivyec9v8ryRzHuvhnYDNTN0k5pMxsUHS60BzhAJCmA/Pew5MUAz9JWTYusMLWWyNCyA0TmxlQCqkVjzACeIjIPo2L00suJDOF66hjjycssoFV0WNO50bjmR8vm8HPS0RrYyc8T+y8i0qOx2syOO/wi0sNSFWicpd4UYHsu9U6L9qBk9Q9gGNBViYeIyJHiKvkAfgcsd/f17r4LeAfoEHJMIlJ8fE9khav6v1DncNm3Wc7lHD6UApQC0nO5PrdzudmWy7l9QNksxw8Q+WT+BSLDhn5HdJ5EjnoFYmZJRJ5hY/S4BJFP+C8lknC0JZJcHR5ylbWtZ4jM57g2evxn4NMcvTDf8QvfYzMrB6SS/Xucl1lEEqBmRBKMT919X7RsNtmTj4/c/VD0uFr03IEcr1ej5VWz1OuRS72Hc9Q77I/AZ8D0fMQuIpJwilTyYWatzWxSdPKfm1mvXOrcGJ1cudfMFppZ1gmFtYD1WY7XExnjKyJyVNFhNh8C7c0srz/eD4/zn5H10hx1thL5A7V6Ltfndu7Xugr4j7sPd/cZ7j4f+LEQ7nshkQRiTvS4IZAG3OHuY9x9trsvAA7lvDA6NOkV4HozO5HIqmA5ez3eB9LMrGbO66MuIfL7aUYe5Vl9GP3amp/nexw2G2hoZmcSmbOSdYnd74lMTD8zj9eCLPVe+4V6G3LEcwGR3ql3zKx8PuIXEUkoRSr5AMoT+cSoP7AnZ6GZdSMyAXMEkWFVHxH5B75uzroiIr/SSCKfZo/IWWBmJwB3ALPc/ZO8bhD9dH0+0DXrKkcWWSGrfiHGmkwkycmq97Hc0CIbDD5EpNfjv1naIWtb0bkc3fO4zWigKTCWyLK3/81R/jiRCeX/yrkKlJlV4ec9PCYeLV53X0lkIvpFRFa9ypp8LAV2AHdHjz/MUvYukf1A1rn7glxeO7PUa0akVz23evvIbjlwPpHVupSAiBQDR/vw2yLuMbMN0ZUFZ5pZkxx11lj2zVvdzB7MUt7BIhu6npXjuuuiq+I1jOlDFiFFasK5u08hukqLmY3LpcpAYJy7j4ke32RmFwE3EFkWcwPZezpqE530KCKSH+4+3cyGAsPMrD6RPT1+AFoAdxL5Y/raPG/ws6FEVo1608yeIjKMaBiRP5QLy7tATzNbRuSP9c5AQTYHrG1mZxP5IKoKcDbQh8h8j05Z5rGsANYC95vZISJJyC253A/InCC+mEhPxL9y7hXi7ivM7Hoiycn7ZvYkkWTnZCJLHVcC2mfZu+NoZgNdifRAfZSlnYzoJPxORD7Qmp/lmn8A3YhMzv8HkUUAykVjOM/d/xCtN4TI75FZZvZvInN2KhNJrhq4+59yef4VFlkK+AMik9MvypLMiEjRc/jD7/9EXzn9FbiVyMqGXxL5d+E9M/ttjv+37yWy6t9huw6/cfdpZjYWeD66IMie6O+YR4Hb3H1V4T1O0WbR5c6LHDPbBfRz93HR49JEdqz9o7u/mqXeKKCpu/8+OglwBZFPnbYTWU3lnCwrlORsoy+RJSApV67cGSeffHLsHkhEipXt27ezefNmfvrpJzIyMihdujSVKlWiRo0aHHfcz5/bLFy4kBo1alC79pEjPLdt28aGDRvYv38/ZcqUoVatWmzevBmA3/42Mh98586drFy5kpNOOonjjz8egC+//BJ3J+e/ScuWLeP444+nfv36ABw8eJB169axY8cOACpWrEi1atX44osvqFevHikpKQCsWbOGnTt3cuqpp2aLO6uSJUtStmxZKlasSEpKCqVKlcpWvnv3btatW8fu3bs57rjjSElJoXTp0qxdu5amTZtSpkyZbPU3btzIhg0baNy4MUlJSbl+j3ft2kV6ejq7du3i0KFDlCpVigoVKlCzZk1Kly7NwoULt7p7KoCZvQCc6+71c95n1KhR3q9fP5o3b86iRdk3ih8xYgSDBw/m/PPP54MPPshW9sMPP3Dvvffy5ptvsn79eipVqsRvf/tbunTpwoABAzLrfffdd9xzzz288847bNmyhapVq9K0aVN69uzJNddcA8A999zDsGHDOHDgQOZ/H1999RVt2rShTp06TJ06lQoVcs5NF5Gipnz58vz73/+mV69eALg7tWrVol+/fgwePBiAPXv2UK1aNUaOHMn1118PQP369enXrx+33XZbnvf+6aefOO2007jkkkt47LHHaNOmDWXLluXdd9+N+XOFwPIsKEbJx+H5HL+PLi95uN4QoLu7/zZ6fBmRYRMlgIfc/en8tJeWluYLFiw4ekURETmqVq1aUaJECWbPnn30ynkws4XunpaPqkXzF5mIFDs5k49vvvmGhg0b8umnn3LmmWdm1rvkkktISUnh+eefByLJx969ezlw4AB16tThf/7nf7j99tspXbp0tvvPmTOH888/nyuvvJJ33nmHzz77LNcPr+JAnslHkRp2VRjcfRK5rLueFzPrBHRq1KjRUeuKiEje9u3bx6JFi5g+fTofffQRb731VtghiYgck02bIiNlq1fPvlZI9erVWb/+5zWObr75Zpo3b07VqlX59NNPufPOO1m9ejVjx2Zfcfvcc8/lmmuu4fnnn+eZZ56J18TjFxWn5GMrkZVVcq4UU51jGEPt7pOByWlpaX2OITYRkYS3ceNGzjnnHCpVqsSgQYO47LI8NwAXEYkrAwcOzHzfrFkzKlSoQLdu3fj73/9O1ao/r8idnp7O22+/TXJyMrNmzeJPfzpi2ljcK2qrXeXJ3fcTmcPRPkdRe7JMMBQRkXDUr18fd+eHH37g/vvvP/oFIiJFXI0aNYBI0pBVenp6ZlluzjorsqjV119/ne183759OfHEE5k+fTovvPACkydPLuSIi74ilXyYWXkzO93MTicSW93o8eGldB8FekWXJTvFzB4nsrfHk8fQZicze3r79u3H/gAiIiIiEjdOOOEEatSowXvvvZd5bu/evcyePZtzzsl7ccElS5YAULPmz9sZjRs3junTp/P888/TsmVL7rjjDq6//nq2bcttT9n4VdSGXaURWZrwsGHR1/NAL3d/2cyqElmzvSaRZdE6uvvaX9ughl2JSH7s2LGDzZs3c+BAfld/laMpVaoU1apV0ypQIhKqXbt2ZfZQZGRksG7dOpYsWUKVKlWoW7cuAwYMYMSIEZx88smcdNJJDB8+nPLly3P11VcD8PHHHzNv3jzatGlDxYoVmT9/PrfccguXXXYZdetGPj//9ttv6d+/Pw8++CAnnngiAEOHDmXy5MncdNNNTJgwIZyHD0GRXe0qaFrtSkTysmPHDtLT06lduzZJSUmY5bmIh+STu7Nnzx7Wr19P9erVc01AtNqViARh5syZtGnT5ojzPXv2ZNy4cbg7w4YN46mnnuKHH37grLPOYtSoUTRt2hSARYsWceONN/LFF1+wb98+6tWrx1VXXcVf//pXkpOTcXc6dOhARkYG06dPz/Y7ZMmSJfzud7/j5Zdf5oorrgjsmQNQ/JbaDUqW1a76fPXVV2GHIyJF0Ndff02tWrVITk4+emUpkN27d7NhwwZyW3FQyYeISLGVZ/JRpOZ8hMHdJ7t734oVK4YdiogUUQcOHMhzozw5NklJSRrKJiKSQBI++RARyQ8NtYoNfV9FRBJLwicfWu1KRCR/6tevz/Tp08MOQ0REirGETz407EpEREREJBhFbaldEZFiYV7rhjG9/9mzVsX0/iIiImFQ8iEiUszVr1+f66+/nvHjx7Nx40Yuv/xynnjiCfbs2cO1117LJ598wsGDB2nVqhVPPvkkv/nNbwA4//zzOe+885gxYwZLly6lZcuWvPjii6SkpAAwfvx47r77bnbt2sXAgQOztfnpp5/Sv39/VqxYQVJSEl26dOHRRx+ldOnSuDsDBw5kwoQJ7N27l3r16vHSSy9lLkspIpJfdueWsEOIC/5gatghZEr4YVea8yEi8WDChAlMnTqVVatWsXLlSoYPH05GRga9e/dm7dq1rFu3jqSkJPr165ftuhdffJHnnnuOzZs3s3//fkaOHAnA559/zg033MD48ePZsGED33//Pd99913mdSVLluQf//gHW7du5eOPP+b9999n9OjRAEybNo1Zs2axcuVKtm/fziuvvELVqlWD+2aIiEiRlfDJh+Z8iEg86NevH3Xq1KFKlSoMHjyYl156iapVq9KlSxeSk5M5/vjjGTx4MB9++GG263r37s1JJ51EUlISV155JUuWLAHgtdde49JLL6V169aUKVOG++67jxIlfv6VccYZZ3D22Wdz3HHHZfa8HL53qVKl2LlzJ1988QXuzimnnELNmjWD+2aIiEiRlfDJh4hIPKhTp07m+3r16rFhwwZ2797N9ddfT7169ahQoQKtW7fmxx9/5NChQ5l1a9Sokfk+OTmZXbt2AbBhw4Zs9yxXrly23ouVK1dy6aWXUqNGDSpUqMCgQYPYunUrAG3btqVfv3785S9/oVq1avTt25cdO3bE7NlFRKT4UPIhIhIHvv3228z369ato1atWjzyyCN8+eWXfPLJJ+zYsYNZs2YB4H70DcFr1qyZ7Z67d+/m+++/zzy+4YYbOPnkk/nqq6/YsWMHI0aMyHbfm2++mYULF/L555+zcuVKHn744cJ4TBERKeaUfIiIxIFRo0bx3XffsW3bNu6//366devGzp07SUpKolKlSmzbto1hw4bl+35du3bl//7v/5gzZw779+9nyJAhZGRkZJbv3LmTChUqUL58eb744gueeOKJzLL58+fzySefcODAAcqVK0fZsmWzDdkSEZHElfC/DTThXETiwdVXX02HDh1o0KABDRs25O6772bAgAHs2bOHlJQUzj77bC666KJ8369JkyaMGjWKq6++mpo1a1K5cuXMVbIARo4cyYsvvsjxxx9Pnz596NatW2bZjh076NOnD5UrV6ZevXpUrVqV22+/vVCfV0REiifLT/d7IkhLS/MFCxaEHYaIFEErVqzglFNOCTuMPNWvX5+xY8fSrl27sEP5VfL6/prZQndPy8ct9ItMJE5pqd3CEcJSu5ZXQcL3fIiIiIiISDCUfIiIiIiISCC0w7mISDG3Zs2asEMQERHJF/V8iIiIiIhIIBI++dBqVyIiIiIiwUj45MPdJ7t734oVK4YdioiIiIhIXEv45ENERERERIKh5ENERERERAKh5ENERERERAKh5ENERERERAKhfT5ERH4Fu3NLTO/vD6bG9P4iIiJhUM+HiEgxV79+fUaOHEmzZs2oWLEi3bp1Y+/evYwbN45zzz03W10z4+uvvwagV69e3HjjjVx88cWUL1+eVq1asWnTJgYMGEDlypU5+eSTWbx4cbZ2HnjgARo3bkzlypXp3bs3e/fuBaBp06ZMnjw5s+6BAwdISUnJdr2IiEjCJx/a50NE4sErr7zCu+++y+rVq1m6dCnjxo3L93XDhw9n69atlClThpYtW9KiRQu2bt1K165dGThwYLb6EyZMYOrUqaxatYqVK1cyfPhwAHr06MELL7yQWW/KlCnUrFmT5s2bF9oziohI8ZfwyYf2+RCReHDzzTdTq1YtqlSpQqdOnViyZEm+rrviiis444wzKFu2LFdccQVly5alR48elCxZkm7duh3Rc9GvXz/q1KlDlSpVGDx4MC+99BIA11xzDVOmTGHHjh0AjB8/nmuvvbZwH1JERIq9hE8+RETiQY0aNTLfJycns2vXrnxdV7169cz3SUlJRxznvE+dOnUy39erV48NGzYAUKtWLVq1asXrr7/Ojz/+yDvvvEP37t1/1bOIiEj80oRzEZE4Va5cOXbv3p15vGnTpmO+57fffpv5ft26ddSqVSvzuGfPnowdO5aDBw/SsmVLateufcztiYhIfFHPh4hInDrttNNYvnw5S5YsYe/evdxzzz3HfM9Ro0bx3XffsW3bNu6//366deuWWXb55ZezaNEiHn/8cXr06HHMbYmISPxR8iEiEqdOOukkhgwZQrt27TjxxBOPWPnq17j66qvp0KEDDRo0oGHDhtx9992ZZUlJSXTp0oXVq1fTuXPnY25LRETij7l72DEUCWlpab5gwYKwwxCRImjFihWccsopYYcRuvr16zN27FjatWuXZ517772XlStXZlv56mjy+v6a2UJ3T8vHLfSLTCROxXpPpUQRwt5RlleB5nyIiEih2LZtG8888wzjx48POxQRESmiNOxKRESO2ZgxY6hTpw4XX3wxrVu3DjscEREpouK258PM3gDOB953964hhyMiUuytWbMmz7I+ffrQp0+f4IIREZFiKZ57Ph4HtNyKiIiIiEgREbfJh7vPBHaGHYeIxActzhEb+r6KiCSWwJMPM2ttZpPMbL2ZuZn1yqXOjWa22sz2mtlCMzsv6DhFRA4rVaoUe/bsCTuMuLRnzx5KlSoVdhgiIhKQMHo+ygOfAf2BI36bm1k3IkOmRgDNgY+Ad8ysbpY6S8zss1xetXLeT0TkWFWrVo3169eze/dufVJfSNyd3bt3s379eqpVqxZ2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uJALLriAE044geXLl3P77beTkpLCe++9x8qVK3nxxRfDDlFEJC7le58PM5thZkds+2pmFcxsRuGGFRxtMigiknhuu+02+vfvz+LFiylTpkzm+QsvvJC5c+eGGJmISHwryCaD5wOlczlflsgeIMWSNhkUEUk8CxcupGfPnkecr1mzJunp6SFEJCKSGI662pWZtchy2MzMtmU5LglcCKwv7MBERERiJSkpiR9++OGI81988QXVqlULISIRkcSQn6V2FxCZaO7AtFzK9wA3FWZQIiIisfSHP/yBYcOG8eqrrwJgZqxZs4Y77riDLl26hBydiEj8ys+wqxOAhkT25/hd9PjwqzZQwd2fjVmEMaY5HyIiiWfkyJFs27aN1NRUdu/ezbnnnkujRo2oVKkSw4cPDzs8EZG4ddSejyy7ixdkfkixoaV2RUQST4UKFZgzZw4zZsxg0aJFZGRk0KJFC9q1axd2aCIica1AO5yb2W+A1kA1ciQj7v5oIcYlIiISc23btqVt27ZhhyEikjDynXyYWXfgWeAgsIXsGw46oORDRESKjcWLF/PBBx+wefNmMjIyspU99NBDIUUlIhLfCtLzcS/wCPA3dz8Uo3gCZ2adgE6NGjUKrE1tViciEq6HHnqIO++8k3r16lG9enXMLLMs63sRESlcBUk+qgNj4ynxAM35EBFJRP/4xz944oknuP7668MORUQkoRRkEvkU4KxYBSIiIhKUjIwMLrjggrDDEBFJOAVJPt4D/m5mw82sm5l1zvqKVYAiIiKF7YYbbuC5554LOwxJIA888ABmRr9+/TLPTZw4kQsvvJDU1FTMjJkzZ2a7ZtOmTaSkpPDII49kO798+XLKli3Lf//73yBCFylUBRl29VT066BcypzIbuciIiJF3tChQ+nYsSPNmzenadOmlCpVKlv5s88W2+2rpAiaN28eTz/9NM2aNct2/qeffuKcc87hmmuuoUePHkdcV6NGDUaNGkWvXr24+OKLady4MQcOHKBHjx5cfvnlXHXVVUE9gkihyXfy4e5xuc+HiIgknsGDBzNt2jRatGjBDz/8oEnmEjPbt2+ne/fuPPvsswwbNixb2bXXXgvA1q1b87y+W7duvPHGG/To0YN58+Zx3333sXHjRt57772Yxi0SKwXa5yMehbHalYiIhGv06NG8+OKLdOvWLexQJM717duXrl27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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import OrdinalDayOfWeek\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "\n", + "objs = [OrdinalDayOfWeek(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OrdinalDayOfWeek\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "59d4eac9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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xxxzDElJSVSsWJEffviB5s2bU6lSpTz1N27cyIYNGzjllFNISCi4Q2DXrl2kp6eza9cu9u/fT4UKFahRowZ169alYsWKeeouWrRoN7DJ3RsdOBf+g70K6J9rNcOD/pCZGcOGDWPUqFE55z755BOGDRvGxx9/jLvTtm1bHnroIX73u19XCe7bty+zZs1i3bp1ee7XqVMnAGbPng3A/v37ufHGG5k8eTJbt27F3XF3Vq9eTePGjRk3bhzXXHNNzvWzZ8+mc+fOfPDBBzn3EpHSqVatWjz00EMMGDCAevXqMWjQIIYNGwZAZmYmKSkpjBkzhoEDBwLQqFEjBg0axK233lroPX/55RdOP/10LrjgAp544gk6d+5M5cqVeeedd6LyTAE4aMnBnIIylHwcmM/xP+GlJg/UGw78yd1PDB/3JDSEohzwiLs/V5T20tLSfOFCfWglInKk2rdvT7ly5Zg7d+7hKxeBmS1y97QiVC2df8hEpEzZv38/kydP5qqrrmLRokVUrVqV448/nk8//ZTf/va3OfUuuOACkpKSeOmll4BQ8pGVlcXevXtp0KAB//u//8ttt9120Acq8+bNo1OnTlx66aVMnz6dL774osAPsWJEoclHqRp2VRLc/S1+3RDssMysB9CjadOmh60rIiJ57d69m88//5xZs2axYMEC/vOf/wQdkohIsSxbtox27dqRlZVFtWrVePPNNznttNNYsGABAKmpedcMSU1NZf36X9c3uvHGG2nVqhW1a9fm008/5c4772TVqlWMH593q7kOHTpwxRVX8NJLL/H888/HcuJxSGUp+dhKaJWV/KvGpHIU46ndfSowNS0trf9RxCYiEpc2btzImWeeybHHHsvdd99Nz549D3+RiEgpcuKJJ7JkyRK2b9/OlClT6NOnT84Qy6IYOnRozvsWLVpQo0YNevfuzcMPP0zt2r9uN5eens7bb79NlSpVmDNnDldffXVJPkaZUdpWuyqUu+8hNIejW76iboRWvRIRkShr1KgR7s5PP/3EAw88cPgLRERKmYoVK9K0aVPatGnDQw89RMuWLXn88cepUye0Ond6et6tmtLT03PKCnLGGaFFrVauXJnn/IABA2jWrBmzZs3in//8J1OnTi3hJykbSlXyYWbVzKylmbUkFNtx4eMDS+k+BvQNL012spk9SWhvj2ePos0eZvbc9u3bj/4BRERERKRMy87OZvfu3TRu3Jg6deowc+bMnLKsrCzmzp3LmWcWvsjgkiVLAKhb99dtjSZMmMCsWbN46aWXaNeuHXfccQcDBw5k27aC9paNbaVqwrmZdQI+KKDoJXfvG65zPaFlz+oS2hPk5twT0I+UJpyLyKHs2LGDzZs3s3dvsVeClUJUqFCBlJQUatSoUWC5JpyLSKTdeeedXHDBBTRo0ICdO3fyyiuv8PDDD/P2229z3nnn8fDDD/Pggw/y4osvcsIJJzBq1CjmzJnDN998Q/Xq1fnoo4/4+OOP6dy5M4mJiXz22WfcfPPNpKWl5cyBW7t2Lc2bN2fUqFEMHjwYgD179pCWlsZpp53GpEmTgvwWRErZmHDu7rM5RLDhOk8T2sxKRCQqduzYQXp6OvXr1ychIQGzQ/6akiJwdzIzM3MmbRaWgIiIRNKmTZu44oor2LRpE4mJibRo0YLp06dzzjnnAHD77beTmZnJDTfcwE8//cQZZ5zBjBkzcpZJr1SpEv/6178YOXIku3fvpmHDhvTv35/bb78dCP2uu/rqq0lLS2PQoEE57VasWJGXX36Z3/3ud1xyySVcdNFF0X/4gJSqno8g5Frtqv+3334bdDgiUgqtXLmSevXqUaVKlcNXlmLJyMhgw4YNFLTioHo+RETKrEI/pStVcz6C4O5T3X1AYmJi0KGISCm1d+/eQjfNk6OTkJCgoWwiInEk7pMPEZGi0FCryND3VUQkvsR98qHVrkREiqZRo0bMmjUr6DBERKQMi/vkQ8OuRERERESio1StdiUiUlZ83PH4iN6/7ZzvInp/ERGRICj5EBEp4xo1asTAgQOZOHEiGzdu5A9/+APPPPMMmZmZXHnllXzyySfs27eP9u3b8+yzz/Kb3/wGgE6dOnHWWWfx/vvvs3TpUtq1a8crr7xCUlISABMnTuSee+5h165dDB06NE+bn376KUOGDOGrr74iISGBXr168dhjj1GxYkXcnaFDhzJp0iSysrJo2LAhr776Ks2bN4/690ZEyja7c0vQIcQEH50cdAg54n7YleZ8iEgsmDRpEu+++y7fffcdK1asYNSoUWRnZ9OvXz9++OEH1qxZQ0JCQp515gFeeeUVXnzxRTZv3syePXsYM2YMAF9++SXXXXcdEydOZMOGDfz444+sW7cu57ry5cvz+OOPs3XrVj766CPee+89nn46tAXTjBkzmDNnDitWrGD79u289tpr1K5dO3rfDBERKbXiPvnQnA8RiQWDBg2iQYMG1KpVi2HDhvHqq69Su3ZtevXqRZUqVahevTrDhg3jww8/zHNdv379OOGEE0hISODSSy9lyZIlAEyZMoULL7yQjh07UqlSJe6//37Klfv1T0abNm1o27YtxxxzTE7Py4F7V6hQgZ07d/L111/j7px88snUrVs3et8MEREpteI++RARiQUNGjTIed+wYUM2bNhARkYGAwcOpGHDhtSoUYOOHTvy888/s3///py6derUyXlfpUoVdu3aBcCGDRvy3LNq1ap5ei9WrFjBhRdeSJ06dahRowZ33303W7duBaBLly4MGjSIG264gZSUFAYMGMCOHTsi9uwiIlJ2KPkQEYkBa9euzXm/Zs0a6tWrx6OPPso333zDJ598wo4dO5gzZw4A7offELxu3bp57pmRkcGPP/6Yc3zddddx0kkn8e2337Jjxw4efPDBPPe98cYbWbRoEV9++SUrVqzgr3/9a0k8poiIlHFKPkREYsDYsWNZt24d27Zt44EHHqB3797s3LmThIQEjj32WLZt28bIkSOLfL9LLrmE//73v8ybN489e/YwfPhwsrOzc8p37txJjRo1qFatGl9//TXPPPNMTtlnn33GJ598wt69e6latSqVK1fOM2RLRETiV9z/NdCEcxGJBZdffjndu3enSZMmHH/88dxzzz3cdNNNZGZmkpSURNu2bTn33HOLfL9TTz2VsWPHcvnll1O3bl1q1qyZs0oWwJgxY3jllVeoXr06/fv3p3fv3jllO3bsoH///tSsWZOGDRtSu3ZtbrvtthJ9XhERKZusKN3v8SAtLc0XLlwYdBgiUgp99dVXnHzyyUGHUahGjRoxfvx4unbtGnQoR6Sw76+ZLXL3tCLcQn/IRGKUltotGQEstWuFFcR9z4eIiIiIiESHkg8REREREYkK7XAuIlLGrV69OugQREREikQ9HyIiIiIiEhVxn3xotSsRERERkeiI++TD3ae6+4DExMSgQxERERERiWlxn3yIiIiIiEh0KPkQEREREZGoUPIhIiIiIiJRoeRDRERERESiQvt8iIgcAbtzS0Tv76OTI3p/ERGRIKjnQ0SkjGvUqBFjxoyhRYsWJCYm0rt3b7KyspgwYQIdOnTIU9fMWLlyJQB9+/bl+uuv57zzzqNatWq0b9+eTZs2cdNNN1GzZk1OOukkFi9enKedhx56iFNOOYWaNWvSr18/srKyAGjevDlTp07Nqbt3716SkpLyXC8iIhL3yYf2+RCRWPDaa6/xzjvvsGrVKpYuXcqECROKfN2oUaPYunUrlSpVol27drRu3ZqtW7dyySWXMHTo0Dz1J02axLvvvst3333HihUrGDVqFABXXXUV//znP3PqTZs2jbp169KqVasSe0YRESn74j750D4fIhILbrzxRurVq0etWrXo0aMHS5YsKdJ1F110EW3atKFy5cpcdNFFVK5cmauuuory5cvTu3fvg3ouBg0aRIMGDahVqxbDhg3j1VdfBeCKK65g2rRp7NixA4CJEydy5ZVXluxDiohImRf3yYeISCyoU6dOzvsqVaqwa9euIl2Xmpqa8z4hIeGg4/z3adCgQc77hg0bsmHDBgDq1atH+/btef311/n555+ZPn06f/rTn47oWUREJHZpwrmISIyqWrUqGRkZOcebNm066nuuXbs25/2aNWuoV69eznGfPn0YP348+/bto127dtSvX/+o2xMRkdiing8RkRh1+umns3z5cpYsWUJWVhb33nvvUd9z7NixrFu3jm3btvHAAw/Qu3fvnLI//OEPfP755zz55JNcddVVR92WiIjEHiUfIiIx6oQTTmD48OF07dqVZs2aHbTy1ZG4/PLL6d69O02aNOH444/nnnvuySlLSEigV69erFq1iosvvvio2xIRkdhj7h50DKVCWlqaL1y4MOgwRKQU+uqrrzj55JODDiNwjRo1Yvz48XTt2rXQOvfddx8rVqzIs/LV4RT2/TWzRe6eVoRb6A+ZSIyK9J5K8SKAvaOssALN+RARkRKxbds2nn/+eSZOnBh0KCIiUkpp2JWIiBy1cePG0aBBA8477zw6duwYdDgiIlJKxWzPh5m9CXQC3nP3SwIOR0SkzFu9enWhZf3796d///7RC0ZERMqkWO75eBLQcisiIiIiIqVEzCYf7j4b2Bl0HCISG7Q4R2To+yoiEl+innyYWUcze8vM1puZm1nfAupcb2arzCzLzBaZ2VnRjlNE5IAKFSqQmZkZdBgxKTMzkwoVKgQdhoiIREkQPR/VgC+AIcBBf83NrDehIVMPAq2ABcB0MzsuV50lZvZFAa96+e8nInK0UlJSWL9+PRkZGfqkvoS4OxkZGaxfv56UlJSgwxERkSiJ+oRzd58GTAMwswkFVBkKTHD3ceHjwWZ2LnAdcFf4Hi2jEKqICAA1atQAYMOGDezduzfgaGJHhQoVSE1Nzfn+iohI7CtVq12ZWUWgDTAmX9EM4MwItDcAGABw3HHHHaa2iMSzGjVq6B/JIiIiR6m0TThPAsoD6fnOpwN1inMjM5sFTAbON7N1ZtYufx13f87d09w9LTk56js/ioiIiIjElVLV81GS3L1rUeqZWQ+gR9OmTSMckYiIiIhIfCttPR9bgf1Aar7zqcCmSDTo7lPdfUBiYmIkbi8iIiIiImGlKvlw9z3AIqBbvqJuhFa9EhERERGRMirqw67MrBpwYIxTOeA4M2sJbHP3NcBjwEQz+xSYD1wL1AOejVA8GnYlIiIiIhIFQfR8pAGLw68EYGT4/X0A7v4v4CbgHmAJ0AE4391/iEQwGnYlIiIiIhIdQezzMRuww9R5Gng6GvGo50NEREREJDpK1ZyPIKjnQ0REREQkOuI++RARERERkehQ8iEiIiIiIlER98mHmfUws+e2b98edCgiIiIiIjEt7pMPzfkQEREREYmOuE8+REREREQkOuI++dCwKxERERGR6Ij75EPDrkREREREoiPukw8REREREYkOJR8iIiIiIhIVSj5ERERERCQq4j750IRzEREREZHoiPvkQxPORURERESiI+6TDxERERERiQ4lHyIiIiIiEhVKPkREREREJCqUfIiIiIiISFTEffKh1a5ERERERKIj7pMPrXYlIiIiIhIdcZ98iIiIiIhIdCj5EBERERGRqFDyISIiIiIiUaHkQ0REREREokLJh4iIiIiIRIWSDxERERERiQolHyIiIiIiEhVxn3xok0ERERERkeiI++RDmwyKiIiIiETHMUEHICIiEpTMzEy+++47AI4//ngSEhICjkhEJLbFfc+HiIjEn927d3PTTTdRq1YtTj/9dFq0aEGtWrUYMmQIWVlZQYcnIhKz1PMhIiJx57rrrmPGjBmMHz+edu3aAfDRRx9x1113sXPnTl544YWAIxQRiU1KPkREJO5MnjyZN954g27duuWca9KkCSkpKfTq1UvJh4hIhGjYlYiIxJ2qVatSv379g87Xr19f8z5ERCJIyYeIiMSdwYMHM3LkSDIzM3POZWZmcv/99zN48OAAIxMRiW0a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AaSlpXkk2hARkdLnscceO2S59vkQEYmM0pR8lLj8k9kLYmY9gB5NmzaNfEAiIlIqPPXUU3mO9+7dy8aNG0lISCAlJUXJh4hIhJSm5GMrsB9IzXc+FdgUqUbdfSowNS0trX+k2hARkdJl1apVB51LT0+nX79+9O+vPwciIpFSauZ8uPseYBHQLV9RN2BBpNo1sx5m9tz27dsj1YSIiJQBqampPPDAA9x+++1BhyIiErOimnyYWTUza2lmLcNtHxc+Pi5c5TGgr5ldY2Ynm9mThPYDeTZSMbn7VHcfkJiYGKkmRESkjMjOziY9Pf/UQxERKSnRHnaVBnyQ63hk+PUS0Nfd/2VmtYF7CG0y+AVwvrv/EOU4RUQkhr3xxht5jt2djRs3MnbsWM4666yAohIRiX3R3udjNmCHqfM08HRUAkITzkVE4tEll1yS59jMSE5OpkuXLjz66KMBRSUiEvtK04TzQGjCuYhI/NEmgyIiwSg1E85FRESiYe/evZxxxhl88803QYciIhJ34j750GpXIiLxpUKFCqxatQqzQ44CFhGRCIj75EOrXYmIxJ8+ffowbty4oMMokkaNGmFmB70uuOCCIpVnZ2fTsWNHevTokee+GRkZnHjiiVx77bVRfyYRiV9xP+dDRETizy+//MKkSZOYOXMmbdq0oWrVqnnK//a3vwUU2cE+++wz9u/fn3O8ceNG2rRpw6WXXlqk8nLlyjFhwgRatGjBCy+8wNVXXw3AHXfcwf79+zXBXkSiSsmHiIjEna+++orWrVsD8P333+cpK23DsZKTk/McP//889SoUSMnuThcOUCTJk0YM2YMN998M2effTYrV67kmWeeYfbs2QclXiIikRT3yYeW2hURiT8ffPDB4SuVQu7O888/zxVXXEFCQkKxyq+99lrefPNNrrzySlavXs3QoUPp0KFDtEIXEQE050NzPkREpMyYOXMmq1aton//gleHP1z5s88+y7x586hUqRL3339/JEMVESlQ3CcfIiIiZcW4ceP47W9/y+mnn35E5S+88AIJCQmsW7eOVatWRTJUEZECKfkQEREpAzZv3sx//vOfQns1Dlf+2WefMXr0aKZMmUK3bt3o06dPnonqIiLRoORDRESkDJgwYQKVKlXij3/8Y7HLs7KyuOqqq+jbty/nnXcezz33HCtXruSRRx6JdNgiInnEffKh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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import OrdinalDayOfMonth\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [OrdinalDayOfMonth(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OrdinalDayOfMonth\")" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "97bdb5fd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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kpKoXr16pEMRkRh1++23c/HFF9OwYUN27drF1KlTmTt3Lm+//TYQWMVww4YN/PRTYN/Q1atX56yEeHiFvsJWEWzYsCFNmzYFAhPS09LSGDx4MB07BvYuTU9P57XXXiMtLY25c+dSrlyZGYx0wkpV8hFcW/2Is+ODdcYD48MSkIgIgcQjMzOTBg0aEBcXl2c5WTk+7k52djYbNwa2xFACIiKRsGXLFv70pz+xZcsWatSowVlnncU777zDBRdcAMD06dNJS/t1L9f09MBv1Udbvju/IUOGEB8fz+jRo/Mcf+6552jRogWPPfYYN910U8lcUBlQapfaDZdcw67Sv/3220iHIyKl0OrVq6lfvz7x8fGRDiXq7Nmzh02bNlHY0FcttSsiUmYd8Ve62OnjOQKtdiUix7J//37i4uIiHUZUiouL01A2EZEYEvPJh4hIUWioVWjodRURiS0xn3yYWaqZPbtjx45IhyIiUqo1btyYDz74INJhiIhIGRbzyYeGXYmIiIiIhEepWu1KRKSs+LRTaNdlbztvTUjbFxERiQQlHyIiZVzjxo257rrrmDx5Mps3b+ayyy7j6aefJjs7m6uvvprPPvuMAwcO0L59e5555hl+85vfAHDeeefRsWNHZs+ezYoVK2jXrh1Tp04lISEBgMmTJzN8+HB2797NzTffnOecixYtYvDgwXz11VfExcXRq1cvxo0bR6VKlXB3br75ZqZMmcLevXtp1KgRL7/8Mi1atAj7ayMiZZvdvi3SIUQFvz8x0iHkiPlhV5rzISLRYMqUKbz33nusWbOGVatWce+993Lo0CHS0tJYv349GzZsIC4ujhtuuCHP86ZOncoLL7zA1q1b2bdvH2PHjgXgyy+/ZODAgUyePJlNmzbxww8/8P333+c8r3z58jzyyCNkZWWxcOFCPvzwQ8aPD2zBNGvWLObNm8eqVavYsWMHr7zyCrVr1w7fiyEiIqVWzCcfmvMhItHghhtuoGHDhtSqVYthw4bx8ssvU7t2bXr16kV8fDwnnXQSw4YN46OPPsrzvLS0NE477TTi4uK44oorWL58OQCvvvoql1xyCZ06daJy5crcc889eXbgbdOmDW3btqVChQo5PS+H265YsSK7du3i66+/xt0588wzqVevXvheDBERKbViPvkQEYkGDRs2zLnfqFEjNm3axJ49e7juuuto1KgR1atXp1OnTvz0008cPHgwp27dunVz7sfHx7N7924ANm3alKfNqlWr5um9WLVqFZdccgl169alevXq/O1vfyMrKwuAzp07c8MNN/DnP/+ZpKQkBgwYwM6dO0N27SIiUnYo+RARiQLfffddzv0NGzZQv359Hn74Yb755hs+++wzdu7cybx58wBwP/aG4PXq1cvT5p49e/jhhx9yHg8cOJAzzjiDb7/9lp07d3Lfffflafcvf/kLGRkZfPnll6xatYqHHnqoJC5TRETKOCUfIiJR4KmnnuL7779n+/btjB49mj59+rBr1y7i4uI4+eST2b59O6NGjSpye7179+Zf//oX8+fPZ9++fYwYMYJDhw7llO/atYvq1atTrVo1vv76a55++umcssWLF/PZZ5+xf/9+qlatSpUqVfIM2RIRkdgV858GmnAuItHgyiuvpFu3bjRt2pRTTz2V4cOHM2TIELKzs0lISKBt27ZceOGFRW6vefPmPPXUU1x55ZXUq1ePmjVr5qySBTB27FimTp3KSSedRHp6On369Mkp27lzJ+np6dSsWZNGjRpRu3Zthg4dWqLXKyIiZZMVpfs9FqSkpPiSJUsiHYaIlEJfffUVZ555ZqTDOKLGjRszceJEunTpEulQjsuRXl8zy3D3lCI0oQ8ykSilpXZLRgSW2rUjFcR8z4eIiIiIiISHkg8REREREQkL7XAuIlLGrVu3LtIhiIiIFIl6PkREREREJCxiPvnQalciIiIiIuER88mHu89w9wE1atSIdCgiIiIiIlEt5pMPEREREREJDyUfIiIiIiISFko+REREREQkLJR8iIiIiIhIWGifDxGR42C3bwtp+35/YkjbFxERiQT1fIiIlHGNGzdm7NixnHXWWdSoUYM+ffqwd+9eJk2aRIcOHfLUNTNWr14NQP/+/Rk0aBAXXXQR1apVo3379mzZsoUhQ4ZQs2ZNzjjjDJYtW5bnPGPGjKFZs2bUrFmTtLQ09u7dC0CLFi2YMWNGTt39+/eTkJCQ5/kiIiIxn3xonw8RiQavvPIK7777LmvXrmXFihVMmjSpyM+79957ycrKonLlyrRr147WrVuTlZVF7969ufnmm/PUnzJlCu+99x5r1qxh1apV3HvvvQD07duXf/zjHzn1Zs6cSb169TjnnHNK7BpFRKTsi/nkQ/t8iEg0+Mtf/kL9+vWpVasW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kRhx1OTD3fcdrdzMKhanfmmkOR8iIrEnISGBV199tcDxV199lcTEsP9CKCISM4q81K6Z/QXY6O6vBR8/B/QzszVAD3f/JkQxioiIlKi7776btLQ05syZkzPn49NPP+WDDz7gueeei3B0IiLRqzhL7f4F2AZgZp2AK4ArgeXAwyUfmoiISGj07duXTz75hISEBKZPn8706dOpXbs2CxYsoF+/fpEOT0QkahVnk8EGwNrg/VRgmru/YmYrgY9LPDIREZEQOvfcc5kyZUqkwxARiSnF6fnYCSQF73cFPgze3w9UKcmgwkkTzkVEYlNmZvT9xLsAACAASURBVCZjx45l0KBBZGVlAbBgwQLWrl17jGeKiMjxKk7yMQuYYGYTgWTgneDx5vzaI1LmaMK5iEjsycjI4PTTT2fKlClMnDiRnTt3AvD+++8zbNiwCEcnIhK9ipN8/JnARoOJQG933x483hp4uaQDExERCZVbb72VwYMHs2zZMipXrpxz/IILLmDBggURjExEJLoVec6Hu+8Ebizk+MgSjUhERCTEMjIyCl3Vql69emRmZkYgIhGR2HDUng8zO6k4jRW3voiISCTExcXx448F98/9+uuvSUpKKuQZIiJSEo417OpbMxtuZr85UgUzK2dmF5nZ+wSGZomIiJRql156KaNGjeKXX34BwMxYt24dt912G7169YpwdCIi0etYw646AqOB/wSX1F0CbAL2AjWBZkBbIBu4D5gQulBDw8xSgdTk5ORIhyIiImEyduxYunfvTmJiInv27KFDhw5kZmbSvn177r333kiHJyIStczdj13JrCGBTQU7Ao2AOCALWAa8B8x090MhjDPkUlJSfMmSJZEOQ0REgswsw91TilD12B9kRzB79myWLl3KoUOHaN26NV26dDnepkQkBOz2bZEOISr4/YnhPqUdqaBIE87d/TsCu5hrJ3MREYkanTt3pnPnzpEOQ0QkZhRnqV0REZGoMX78eJo3b058fDz/+c9/ALj//vt55ZVXIhyZiEj0UvIhIiIx59FHH+Xee+9lwIAB5B5+3KBBA5588skIRiYiEt2UfIiISMx55plnmDBhAoMHD6ZChV9HILdu3ZovvvgigpGJiEQ3JR8iIhJz1q9fT4sWLQocr1ixItnZ2RGISEQkNij5EBGRmNO0aVOWLl1a4PjMmTNp1qxZBCISEYkN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HzPLc2vbtm1O+ZYtW0hISODhhx/O0/YXX3xBlSpV+L//+7+wXY+IxLZw7/MxF7Bj1BkPjA9LQGjCuYhILOrdu3eex2ZGYmIinTt3LvAFPdIeeOABnnrqKV588UVatmzJihUr6NevH5UrV+bOO+/MqdelSxcmT56c87hSpUo59+vWrctTTz1F//79ueiii2jWrBn79++nb9++XHbZZfzxj38M6zWJSOwqTRPOI0ITzkVEYk9Z2mTwk08+ITU1ldTUVAAaN25Mjx49+Oyzz/LUq1y5MnXr1j1iO3369OGNN96gb9++fPrpp9xzzz1s3ryZ999/P6Txi4jkVmomnIuIiITD/v37Offcc/nmm28iHUqRdOjQgTlz5vD1118D8OWXXzJ79my6d++ep978+fNJSkritNNOIz09na1btxZoa/z48WzcuJGrrrqKMWPGMHHiRGrVqhWW6xARAfV8aNiViEiMqVixImvXrsXsqKOAS43bbruNXbt20axZM8qXL8+BAwcYNmwYgwYNyqlz4YUX0rNnT5o0acK6desYPnw4nTt3JiMjg8qVK+fUq1WrFmPGjCEtLY2rr766QAIjIhJqMd/zodWuRERiT79+/ZgwYUKkwyiSf/7zn7z00ktMnTqVpUuX8tJLLzF+/Hiee+65nDp//OMf6dGjBy1btiQ1NZV33nmHb775hrfffjtPW4cOHeKFF14gPj6exYsXs3fv3nBfjojEuJjv+RARkdjz888/M2XKFN5//33atGlD1apV85Q//vjjEYqsoKFDh3LrrbfmTApv2bIl69evZ8yYMVxzzTWFPqd+/fr85je/4dtvv81z/NFHH2XlypUsXryYCy64gGHDhpW6CfYiEt2UfIiISMz56quvaN26NQD/+c9/8pSVtuFYe/bsoXz58nmOlS9f/qiT5rOysti4cSP16tXLOfbVV18xbNgwJk6cSLNmzXjuuefo3r07PXv2pH379iGLX0Qkt5hPPjTnQ0Qk9syZMyfSIRRZamoq999/P02aNKF58+YsW7aMcePG0bdvXwB2797NXXfdRa9evahXrx7r1q3jjjvuICkpicsvvxyAAwcO0K9fPy6++GKuuuoqALp168a1115LWloay5cvJz4+PmLXKCKxQ3M+NOdDRERKsSeeeILevXszaNAgzjzzTG655RbS09MZPXo0EOgFWblyJZde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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import OrdinalMonthOfYear\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [OrdinalMonthOfYear(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"OrdinalMonthOfYear\")" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "e5a9f3ce", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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5t2HISIixVbYJx8iIqGgZs2aWe9r167N7t27SU9P595776V27dqUL1+edu3a8fPPP3PixImsslWrVs16Hx0dzZEjRwDYvXt3jjrLlSuXo/di8+bN3HjjjVStWpXy5cvzxBNPcODAAQDat2/Pgw8+yAMPPEDlypXp1asXhw8fDtizi4hIyaHkQ0QkBPzwww9Z73fs2EH16tUZPXo033zzDStXruTw4cMsXboUAOfOviF4tWrVctSZnp7Ojz/+mHXcu3dvGjRowLfffsvhw4d59tlnc9T70EMPkZKSwldffcXmzZv5y1/+UhSPKSIiJZySDxGREPDaa6+xc+dODh48yMiRI+natStpaWlERUVx0UUXcfDgQYYPH17g+m6//Xb+7//+j2XLlvHrr78ydOhQTp48mXU9LS2N8uXLExMTw9dff83rr7+ede3f//43K1euJDMzk3LlylG2bNkcQ7ZERCR8hf1PA004F5FQcMcdd9CpUyfq1q1LvXr1GDJkCP369SMjI4O4uDiuuOIKrr/++gLX16hRI1577TXuuOMOqlWrRoUKFbJWyQIYNWoU06ZN48ILL6Rnz5507do169rhw4fp2bMnFSpUoHbt2lSqVImBAwcW6fOKiEjJZAXpfg8HiYmJbvXq1cEOQ0SKoU2bNnHZZZcFO4x81alThwkTJtChQ4dgh3JO8vt8zSzFOZdYgCr0g0wkRGmp3aIRhKV2Lb8LYd/zISIiIiIi3lDyISIiIiIintAO5yIiJdy2bduCHYKIiEiBqOdDREREREQ8EfbJh1a7EhERERHxRtgnH865Oc65XrGxscEORUREREQkpIV98iEiIiIiIt5Q8iEiIiIiIp5Q8iEiIiIiIp5Q8iEiIiIiIp7QPh8iIufABu0PaP3u+fiA1i8iIhIM6vkQESnh6tSpw6hRo2jSpAmxsbF07dqVo0ePMnnyZK666qocZc2M7777DoC7776b+++/nxtuuIGYmBjatGnD3r176devHxUqVKBBgwasWbMmRzvPPfccDRs2pEKFCiQnJ3P06FEAGjduzJw5c7LKZmZmEhcXl+N+ERGRsE8+tM+HiISC9957j3/9619s3bqVdevWMXny5ALfN2LECA4cOECZMmVo3bo1LVq04MCBA9x+++30798/R/mpU6cyf/58tmzZwubNmxkxYgQAPXr04O9//3tWublz51KtWjWaN29eZM8oIiIlX9gnH9rnQ0RCwUMPPUT16tWpWLEiSUlJrF27tkD33XrrrbRs2ZKyZcty6623UrZsWXr06EFERARdu3Y9refiwQcfpGbNmlSsWJHBgwczffp0AO68807mzp3L4cOHAZgyZQrdu3cv2ocUEZESL+yTDxGRUFC1atWs99HR0Rw5cqRA91WpUiXrfVRU1GnHueupWbNm1vvatWuze/duAKpXr06bNm2YOXMmP//8M/PmzaNbt27n9CwiIhK6NOFcRCRElStXjvT09KzjvXv3nnedP/zwQ9b7HTt2UL169azju+66iwkTJnD8+HFat25NjRo1zrs9EREJLer5EBEJUU2bNmXjxo2sXbuWo0eP8tRTT513na+99ho7d+7k4MGDjBw5kq5du2Zdu+WWW/jyyy8ZO3YsPXr0OO+2REQk9Cj5EBEJUb/5zW8YOnQoHTp04NJLLz1t5atzcccdd9CpUyfq1q1LvXr1GDJkSNa1qKgounTpwtatW7ntttvOuy0REQk95pwLdgzFQmJiolu9enWwwxCRYmjTpk1cdtllwQ4j6OrUqcOECRPo0KFDvmWefvppNm/enGPlq7PJ7/M1sxTnXGIBqtAPMpEQFeg9lcJFEPaOsvwuaM6HiIgUiYMHDzJx4kSmTJkS7FBERKSY0rArERE5b+PHj6dmzZrccMMNtGvXLtjhiIhIMRWyPR9m9k/gauAT59ztQQ5HRKTE27ZtW77XevbsSc+ePb0LRkRESqRQ7vkYC2i5FRERERGRYiJkkw/n3BIgLdhxiEho0OIcgaHPVUQkvHiefJhZOzObbWa7zMyZ2d15lLnfzLaa2VEzSzGztl7HKSJySmRkJBkZGcEOIyRlZGQQGRkZ7DBERMQjwej5iAE2AH2B036am1lXfEOmngWaAyuAeWZWK1uZtWa2IY9X9dz1iYicr8qVK7Nr1y7S09P1TX0Rcc6Rnp7Orl27qFy5crDDERERj3g+4dw5NxeYC2Bmk/Mo0h+Y7Jwb7z/uY2bXA72Bx/11NPMgVBERAMqXLw/A7t27yczMDHI0oSMyMpIqVapkfb4iIhL6itVqV2ZWGmgJjMp1aQFwZQDa6wX0AqhVq9ZZSotIOCtfvrx+SRYRETlPxW3CeRwQAaTmOp8KVC1MRWa2EJgBdDaznWbWOncZ59xbzrlE51xifLznOz+KiIiIiISVYtXzUZSccx0KUs7MkoCkhISEAEckIiIiIhLeilvPxwHgBFAl1/kqwN5ANOicm+Oc6xUbGxuI6kVERERExK9YJR/OuV+BFKBjrksd8a16JSIiIiIiJZTnw67MLAY4NcapFFDLzJoBB51zO4AxwBQzWwUsB+4DqgNvBCgeDbsSEREREfFAMHo+EoE1/lcUMNz//mkA59w/gH7AEGAtcBXQ2Tm3PRDBaNiViIiIiIg3grHPxxLAzlJmHDDOi3jU8yEiIiIi4o1iNecjGNTzISIiIiLijbBPPkRERERExBtKPkRERERExBNhn3yYWZKZvXXo0KFghyIiIiIiEtLCPvnQnA8REREREW+EffIhIiIiIiLeCPvkQ8OuRERERES8EfbJh4ZdiYiIiIh4I+yTDxERERER8YaSDxERERER8YSSDxERERER8UTYJx+acC4iIiIi4o2wTz404VxERERExBthn3yIiIiIiIg3lHyIiIiIiIgnlHyIiIiIiIgnlHyIiIiIiIgnwj750GpXIiIiIiLeCPvkQ6tdiYiIiIh4I+yTDxERERER8YaSDxERERER8YSSDxERERER8YSSDxERERER8YSSDxERERER8YSSDxERERER8YSSDxERERER8UTYJx/aZFBERERExBthn3xok0EREREREW9cEOwAREREgiUjI4MtW7YAUK9ePaKiooIckYhIaAv7ng8REQk/x44do1+/flSsWJGmTZvSpEkTKlasSN++fTl69GiwwxMRCVnq+RARkbDTu3dvFixYwIQJE2jdujUAn3/+OY8//jhpaWm8/fbbQY5QRCQ0KfkQEZGwM2PGDGbNmkXHjh2zztWtW5fKlSvTpUsXJR8iIgGiYVciIhJ2ypUrR40aNU47X6NGDc37EBEJICUfIiISdvr06cPw4cPJyMjIOpeRkcEzzzxDnz59ghiZiEho07ArEREJO1988QWffvopNWrUoEmTJgCsX7+e48eP88svv3DTTTdllZ09e3awwhQRCTkhmXyYWU1gClAZOA4845ybEdyoRESkuIiLi6NLly45zl1yySVBikZEJHyEZPKBL+Ho55xba2ZVgRQzm+uc+yXYgYmISPBNmjQp2CGIiISlkEw+nHN7gD3+93vN7ABQEVDyISIiIiISJJ4nH2bWDhgAtASqA8nOucm5ytwPDASqARvx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jKBXr15kH35co0YN/vrXvwYxMimplixZwv3338+KFStYtGgRF1xwAR06dODgwYNZZX755ReuvPJKxowZc8a6kpOT2bNnT9brzTffzLrWuHFjhg8fzn333Ze1LPShQ4dITk7mkUceoU2bNoF5QJEiUuB9PkRESqov2tULdghndcXSLcEOIay88cYbjB8/nt///vcMGTIk63yLFi3YuHFjECOTkmr+/Pk5jqdMmUJsbCzLly8nKSkJgO7duwNw4MCBM9YVHR1N1apV870+cOBAZs+eTa9evfjwww/p06cPFSpU4Omnnz7PpxAJPPV8iIhI2Nm+fTuNGzc+7XxkZCQZGRlBiEhCTVpaGidPnqRChQqFvvfdd98lLi6ORo0aMWDAANLS0nJcL1WqFH/7299YuHAh3bp149133+Wdd96hdOnSRRW+SMCo50NERMJO3bp1+fLLL6ldu3aO83PnzqVhw4ZBikpCSd++fWnWrBmtW7cu1H133HEHtWvXpnr16mzcuJHHH3+cdevWsWDBghzlEhISGDhwIMOHD+fJJ5+kWbNmRRm+SMAUKvkwsypAd6Ae8KRz7oCZtQF2O+e2BiLAQNM+HyIi4WfAgAE8+OCDpKen45zj888/Z8qUKbz44ou8/fbbwQ5PSrj+/fuzbNkyli1bRkRERKHu7dWrV9b7yy+/nLp169KqVSu+/PJLWrRokXUtIyOD6dOnEx0dzbJly3DOYZbv6qYixUaBh12ZWUvgG6Ab8L9Aef+ljvg2IiyRnHNznHO9YmNjgx2KiIh4JDk5maeeeoonnniC9PR0unfvzvjx43nllVfo2rVrsMOTEuzhhx9m+vTpLFq0iLp16553fYmJiURERPDtt9/mOP/YY49x/PhxVq1axerVq7VQgpQYhZnzMQoY65xrDhzLdn4+oKUVRESkROnZsyfbt29n37597N27l507d/K///u/wQ5LSrC+fftmJR4NGjQokjrXr1/PiRMnqFatWta5xYsXM27cOCZPnkyjRo0YPXo0gwYNYssWLVwhxV9hhl21xNfjkdseoErRhCMiIuKdLVu2sGnTJgAaNmxYJN9US3h64IEHmDJlCh988AEVKlRg7969AMTExBATEwPAwYMH2bFjBz///DMA3333HRdddBFVq1alatWqbNmyhalTp9K5c2fi4uL46quveOSRR2jevHnWErppaWkkJyfTt29f2rZtC/gS6ZkzZ5KcnMySJUsoVUrrCUnxVZi/nRlAXks2NAD2FU04IiIigffjjz9yyy23cOmll3LLLbdkvb/55pv58ccfgx2elEDjxo0jLS2Na6+9lmrVqmW9Ro0alVVm9uzZNG/enGuuuQbwJQ3NmzfnjTfeAKB06dJ88sknXHfdddSvX5+HHnqITp06sXDhwqy5I/369SM6OpqRI3OOeJ84cSLr169n7NixHj2xyLmx7JsrnbGg2VtAVeAPwAGgCeCAD4FFzrmHAxWkFxITE93q1auDHYaIBID2+SiZzCzFOZdYgKIF+0GWza233sq3337Lm2++SatWrQBYuXIlvXv3JiEhgVmzZhW2ShEJABu0P9ghhAT3fLzXTea7+kFhhl0NAOYC+4FoYBm+4VbLgSFnuE9ERKRYmT9/Pp988kmOZVDbtGnDm2++SYcOHYIYmYhIaCtw8uGcOwxcZWbtgRb4hmx96ZxbGKjgREREAiE+Pp5y5cqddj46OppKlSoFISIRkfBQ6BlJzrlFzrlRzrkXlXiIiEhJNHToUPr168euXbuyzu3atYtHHnmEoUOHBjEyEZHQVthNBpsD1wCVyZW4OOceLcK4zpmZXQQsxPdsF+BbHnh8cKMSEZHi5OWXX2bbtm3UqVOHGjVqAL7ko2zZsuzbt49XXnklq+y6deuCFaaISMgpcPJhZo8CzwPbgVRyTvAr9GS/AEoD2jnn0s2sHLDBzGY557R8iYiIAHD77bcHOwQRkbBUmJ6Ph4Hezrk3AxVMUXDOnQDS/Ydl8M22z3fGvYiIhJ9hw4YFOwTxmFZNKhpBWDVJQkxhko9SwCfn05iZtcO3alZLoDqQ7JybnKvM/cBAoBqwEejnnPuskO1cBHwKXAoMdM4dOJ+4RaBkLNcKWrJVpCD27/f9Ihof7/tFav369fzjH/+gUaNG/PnPfw5maCIiIa0wE85fB5LPs70YYAPQF9+mhTmYWVdgLPAs0BxYAcwzs1rZyqw1sw15vKqfKuOc+9k51xS4BLjDzLQDu4iIZPnjH//InDlzADhw4ADt2rXjn//8J/fddx+jR48OcnQiIqGrMD0fw4G5ZrYGXwKRmf2ic+5/zlaBc24uvr1CMLPJeRTpD0zONkG8j5ldD/QGHvfX0aygATvnUs3sP0Bb4P2C3iciIqFt3bp1XHHFFQC8//77JCQk8O9//5sPP/yQgQMH8sgjjwQ5QhGR0FSY5GMk0An4EqhAEU8yN7PS+IZjjcp1aQFwZSHqqQKkO+fSzCwWaIev1yavsr2AXgC1atXKq0hAaPiOiEhwZWRkEBMTA8DChQu56aabAGjRogU//PBDMEMTEQlphRl2dT9wh3Put865G51zSdlfRRBLHBCBbyWt7FKBqoWopzbwmb/H4zPgVefc+rwKOufecs4lOucST437FRGR0HfppZcya9YsfvjhBxYsWECnTp0ASE1N5aKLLgpydCIioaswyUcGsCZQgRQV59wq51wz51xT51yTs63OZWZJZvbWoUOHvApRRESCbNiwYTz22GPUqVOHK664glatWgEwf/58mjdvHuToRERCV2GSj5eAfmYWqGVrDwAngNyTw6sAewPUJs65Oc65XrGxsYFqQkREipnbbruNHTt2sHr1av71r39lne/QoQNjxowJYmQ+S5cu5aabbqJGjRqYGZMnT85x/ciRI/Tp04eLL76YqKgo6tevz0svvZSjTM+ePalXrx5RUVHEx8dz8803s2nTpqzrGzZsoGzZssycOTPHfQsXLiQyMpLly5cH7PlEJHwVJvloC3QDtpnZPDObnf11voE4534FUoCOuS51xLfqlYiISJGpUqUKzZs3p1Sp//4obNWqFQ0aNAhiVD5HjhyhcePGjB07lqioqNOu9+/fn48++ogpU6awadMmBg8ezKBBg5gyZUpWmcTERCZPnsymTZuYP38+zjk6dOhAZqZvvZjGjRszfPhw7rvvPlJTfSOeDx06RHJyMo888ght2rTx5mFFJKwUZsL5AWDW+TRmZjFAgv+wFFDLzJoBB51zO4AxwBQzWwUsB+7Dtx/IG+fT7lliSgKSEhISzlpWRETEC507d6Zz584A3H333addX7FiBd27d+eaa64BoE6dOkycOJGVK1fSvXt3AO69996s8nXq1GHEiBE0bdqU77//nvr16wMwcOBAZs+eTa9evfjwww/p06cPFSpU4Omnnw7wE4pIuCpw8uGcO989PgASgcXZjof7X38D7nbO/cPMKgFD8G0yuAHo7JzbXgRt58k5NweYk5iY2DNQbYiIiBSlq666ijlz5nDPPfdQs2ZNVqxYwdq1axk4cGCe5X/55RcmTZpErVq1qFOnTtb5UqVK8be//Y2mTZvSrVs3ZsyYwapVqyhdurRHTyIi4aYww67Om3NuiXPO8njdna3MOOdcHedcGedcS+fcUi9jFBERKe5eeeUVmjZtSq1atYiMjOR3v/sdL7zwAjfeeGOOcuPGjSMmJoaYmBjmzZvHJ598QpkyZXKUSUhIYODAgUybNo1BgwbRrFmBt9MSESm0MyYfZrbOzCr436/3H+f58ibcoqfVrkREpKR59dVXWbFiBbNnzyYlJYWXXnqJAQMG5Jg8D9CtWzfWrFnDp59+ym9+8xv+8Ic/kJ6enqNMRkYG06dPJzo6mmXLluFckW7jJSKSw9mGXc0EjmV7H3L/ImnYlYhIeEpNTWXKlCls2bKFZ555hri4OJYvX0716tW55JJLgh1evjIyMnj88ceZMWMGSUm+bbaaNGnC2rVrGTVqFNdff31W2djYWGJjY7n00ku54oorqFChAjNnzsyaFwLw2GOPcfz4cVatWkXr1q3561//Sp8+fTx/LhEJD2dMPpxzw7O9fyrg0YiIiHggJSWFa6+9lksuuYSNGzcycOBA4uLi+Pjjj9m8eTPTpk0Ldoj5yszMJDMzk4iIiBznIyIiOHnyZL73OedwznHs2LGsc4sXL2bcuHEsXryYRo0aMXr0aPr160fnzp2pV69ewJ5BRMJXged8mNkiMztt21czK29mi4o2LO9o2JWISPgZMGAAffv2Zc2aNTnmQFx33XXFYn+LI0eOsHbtWtauXcvJkyfZsWMHa9euZceOHZQvX57f/e53DBo0iCVLlrB161YmT57MO++8w6233grAd999xwsvvEBKSgo7duxgxYoV/OEPf6BMmTJZ80LS0tJITk6mb9++tG3bFvDtDdK2bVuSk5PPmMiIiJyrwkw4vxrIa/mLsvj2ACmRtMmgiEj4SUlJ4a677jrtfLVq1bL2vAim1atX07x5c5o3b05GRgbDhg2jefPmDB06FIB3332X3/72t3Tr1o2GDRvy/PPP88wzz/Dggw8CUKZMGZYsWcINN9xAQkICXbt25cILL+Tzzz+natWqAPTr14/o6GhGjhyZo+2JEyeyfv16xo4d6+1Di0hYOOtSu2bWItthEzM7mO04ArgO2FXUgYmIiARKVFQUP/3002nnv/76aypXrhyEiHK6+uqrzzjxu2rVqkyaNCnf6zVr1mTevHlnbGPixIl5nq9Ro0aen42ISFEoyD4fq/FNNHfAgjyuZwCamSYiIiXGzTffzPDhw5kxYwYAZsa2bdt47LHH6NKlS5CjExEJXQUZdnUJUA8w4P/5j0+9agDlnXNvByzCANOcDxGR8DNq1CgOHjxIfHw86enpXHXVVSQkJHDRRRcxYsSIYIcnIhKyztrzkW13cU83JPSKltoVEQk/5cuXZ9myZSxatIgvv/ySkydP0qJFCzp06BDs0EREQlpBhl1lMbOLgXZAZXIlI865MUUYl4iISMC1b9+e9u3bBzsMEZGwUeDkw8y6AW8Dx4H95Nxw0AFKPkREpMRYs2YNixcvZt++factK/viiy/me58N2h/o0MKCez4+2CGISBAUpufjaWA08KRz7kSA4vGcmSUBSQkJCcEORUREPPLiiy8yaNAgateuTZUqVTCzrGvZ34uISNEqTPJRBZgQSokHaM6HiEg4eumll3j99de59957gx2KiEhYKcwk8rlAq0AFIiIi4pWTJ09y7bXXBjsMEZGwU5iej4+BF8ysEbAeyMx+0Tk3qygDExERCZTevXszadKk03b3FhGRwCpM8vGm/88n8rjm8O12LiIiUuwNGzaMzp0707x5cxo3bkxkZGSO62+/XWK3rxIRKdYKnHw450Jynw8REQk/gwcPZsGCBbRo0YKffvpJk8xFRDxSqH0+QpFWuxIRCT/jxo1j2rRpdO3aNdihiIiElcLs89H/TNdL6iaDWu1KRCT8REVF0bx582CHISISdgrT89En13EkUA3IAPahTQZFRKSEePjhh3n55Zd57bXXNORKRMRDhZnzcUnuc2ZWBZgEjC/KoERERALps88+Y+nSpXz00Uc0bNjwtAnns2fPDlJkIiKh7bzmfDjnUs1sMPAe8M+iCUlERCSw4uLiuO2224IdhohI2CmKCeel8O1+LiIiUiJMmjQp2CGIiISlwkw4z/0VkeGb8/EA8FlRBiUiIiIiIqGnMD0f7+c6dsB+YBHwSJFFJCIiEgBNmjTh008/pUKFClx++eVnnGi+bt06DyMTEQkf2mRQRETCQpcuXShTpkzWe61yJSLivQIlH2YWCSwDejjnvglsSN7SJoMiIuFh2LBhWe+feuqp4AUiIhLGCtSb4ZzLBC7BN9QqpDjn5jjnesXGxgY7FBER8Uj79u35+eefTzt/+PBh2rdvH4SIRETCQ2GGUv0N0C7gIiJS4i1ZsoRff/31tPNHjx7ls8+0hoqISKAUZsJ5OaCbmXUEUoBfsl90zj1UlIGJiIgUtS+//DLr/bp166hYsWLW8YkTJ5g/fz41atQIRmgiImGhMMnHZcCpf7Xr5roWcsOxREQk9CQmJmJmmBmdOnU67XpUVBSvvvpqECITEQkPhVnt6ppABiIiIhJoW7duxTlH3bp1WbVqFfHx8VnXSpcuTeXKlYmIiAhihCIioa0odjgXEREpEWrXrg3AyZMngxyJiEh4UvIhIiJhaefOnSxdupR9+/adloz0798/SFGJiIQ2JR8iIhJ2pk6dyv/8z/9wwQUXEB8fn2PDQTNT8iEiEiAhm3yYWTSwCZjhnBsQ7HhERKT4GDp0KI888gjPPPOM5niIiHioMPt8lDSDgS+CHYSIiBQ/qamp3HPPPUo8REQ8FpLJh5ldCjQA5gU7FhERKX46d+7MypUrgx2GiEjY8XTYlZm1AwYALYHqQLJzbnKuMvcDA4FqwEagn3OusNvNjvLXceX5xiwiIqGnY8eOPPbYY2zcuJHLL7+cyMjIHNdvu+22IEUmIhLavJ7zEQNsAN7xv3Iws67AWOB+YJn/z3lm1tA5t8NfZi15x93JObfbzG4GNjvnNpuZkg8RETnNvffeC8Czzz572jUz48SJE16HJCISFjxNPpxzc4G5AGY2OY8i/YHJzrnx/uM+ZnY90Bt43F9Hs7M0cwXwJzP7A75kJ9LMDjvnni6CRxARkRCgfT5ERIKj2Mz5MLPS+IZjLch1aQGFGD7lnHvcOVfTOVcH3xCv8fklHmbWy8xWm9nq/fv3n2PkIiIiIiJSEMVpqd04IAJIzXU+FegQiAadc28BbwEkJia6QLQhIiLFz5gxY854Xft8iIgERnFKPopc7snseTGzJCApISEh8AGJiEix8Oqrr+Y4zszMZM+ePURFRVG5cmUlHyIiAVKcko8DwAmgSq7zVYC9gWrUOTcHmJOYmNgzUG2IiEjxsnXr1tPOpaamkpycTM+e+nEgIhIoxWbOh3PuVyAF6JjrUkdgRaDaNbMkM3vr0KFDgWpCRERKgCpVqjBy5EgeffTRYIciIhKyPE0+zCzGzJqZWTN/27X8x7X8RcYAd5vZPWZ2mZmNxbcfyBuBisk5N8c51ys2NjZQTYiISAlx8uRJUlNzTz0UEZGi4vWwq0Rgcbbj4f7X34C7nXP/MLNKwBB8mwxuADo757Z7HKeIiISwWbNm5Th2zrFnzx5ee+012rZtG6SoRERCn9f7fCwB7CxlxgHjPAkITTgXEQlHt99+e45jMyM+Pp727dszevToIEUlIhL6itOE86DQhHMRkfCjTQZFRIKj2Ew4FxER8UJmZiatWrXim2++CXYoIiJhJ+yTD612JSISXiIjI9m6dStmZxwFLCIiARD2yYdWuxIRCT933XUX48ePD3YYIiJhJ+znfIiISPj55ZdfmDp1Kh9//DEtW7akXLlyOa6/8sorQYpMRCS0KfkQEZGws2nTJlq0aAHA999/n+OahmOJiARO2CcfWmpXRCT8LF68+OyFRESkyGnOh+Z8iIiIiIh4IuyTDxERERER8YaSDxERERER8YSSDxERERER8UTYJx/aZFBERERExBthn3xowrmIiIiIiDfCPvkQERERERFvKPkQERERERFPKPkQERERERFPKPkQERERERFPhH3yodWuRERERES8EfbJh1a7EhERERHxRtgnHyIiIiIi4g0lHyIiIiIi4gklHyIiIiIi4gklHyIiIiIi4gklHyIiIiIi4gklHyIiIiIi4gklHyIiIiIi4omwTz60yaCIiIiIiDfCPvnQJoMiIiIiIt4I++RDRERERES8oeRDREREREQ8oeRDREREREQ8oeRDREREREQ8oeRDREREREQ8oeRDREREREQ8cUGwAwgEM9sGHAZOAj85564JbkQiIiIiIhKSyYfflc65I8EOQkREREREfDTsSkREREREPOFp8mFm7cxstpntMjNnZnfnUeZ+M9tqZkfNLMXM2p5DUw741Mz+bWbdzjtwERERERE5b14Pu4oBNgDv+F85mFlXYCxwP7DM/+c8M2vonNvhL7OWvOPu5Jzb7X9/lXNul5lVAxaa2Xrn3LqifxwRERERESkoT5MP59xcYC6AmU3Oo0h/YLJzbrz/uI+ZXQ/0Bh7319GsAO3s8v+5x8zmAi0AJR8iIiIiIkFUbOZ8mFlpoCWwINelBcCVhainnJld6H8fA7QHNuZTtpeZrTaz1fv37z+3wEVEREREpECKTfIBxAERQGqu86lA1ULUUwVYZmb/Ab4A3nHO/Tuvgs65t5xzic65xPj4+HOJWURERERECijkltp1zn0PNC1oeTNLApISEhICF5SIiIiIiBSrno8DwAl8PRfZVQH2BqpR59wc51yv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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import CyclicMinuteOfHour\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [CyclicMinuteOfHour(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CyclicMinuteOfHour\")" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "5d98a2b5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2bZtG0eOHKF3797UrFmTsmXL0rp1a/bt28fJkyfT21atWjX9falSpTh06BAA27Zty9Rn6dKlM41erF+/nhtuuIGqVatStmxZ/va3v7Fr1y4Arr76avr168d9991H5cqV6dWrFwcOHAjYs4uISOGh5ENEJAT88ssv6e+3bNlCbGwsTz/9ND/++CNffPEFBw4cYNmyZQA4d/YNwatVq5apzyNHjrB79+704z59+lCvXj3+97//ceDAAcaOHZup3/vvv5/Vq1fz3XffsX79ep566qn8eEwRESnklHyIiISACRMm8Ouvv7Jnzx4ef/xxunTpwsGDB4mMjKR8+fLs2bOH0aNH57q/zp0789///pekpCSOHz/OyJEjSUtLS79+8OBBypYtS1RUFD/88AMvvfRS+rUvv/ySL774gtTUVEqXLk3JkiUzTdkSEZHwFfa/DbTgXERCwe2330779u2pXbs2derU4eGHH2bgwIGkpKQQHR1NixYt6NChQ677a9CgARMmTOD222+nWrVqVKhQIb1KFsD48eOZPXs2ZcqUoWfPnnTp0iX92oEDB+jZsycVKlSgZs2aVKpUiaFDh+br84qISOFkuRl+DwcJCQlu1apVwQ5DRAqg77//nksuuSTYYeQoPj6eyZMnc+211wY7lHOS08/XzFY75xJy0YV+kYmEKJXazR9BKLVrOV0I+5EPERERERHxhpIPERERERHxhHY4FxEp5DZt2hTsEERERHJFIx8iIiIiIuKJsE8+VO1KRERERMQbYZ98OOfmOed6lStXLtihiIiIiIiEtLBPPkRERERExBtKPkRERERExBNKPkRERERExBNKPkRERERExBPa50NE5BzYQzsD2r8bFxPQ/kVERIJBIx8iIoVcfHw848ePp3HjxpQrV44uXbpw9OhRpk2bRqtWrTK1NTN++uknALp3707fvn25/vrriYqK4sorr+S3335j4MCBVKhQgXr16vH1119nus8//vEP6tevT4UKFejRowdHjx4FoGHDhsybNy+9bWpqKtHR0Zk+LyIiEvbJh/b5EJFQ8NZbb/Hhhx+yceNG1q5dy7Rp03L9uTFjxrBr1y5KlChBy5YtadasGbt27aJz584MHjw4U/tZs2bx0UcfsWHDBtavX8+YMWMA6NatG6+99lp6u/nz51OtWjWaNm2ab88oIiKFX9gnH9rnQ0RCwf33309sbCwVK1YkMTGRNWvW5Opzt9xyC82bN6dkyZLccsstlCxZkm7dulG0aFG6dOly2shFv379qF69OhUrVmTEiBG8/vrrANxxxx3Mnz+fAwcOADBz5kzuvPPO/H1IEREp9MI++RARCQVVq1ZNf1+qVCkOHTqUq89VqVIl/X1kZORpx1n7qV69evr7mjVrsm3bNgBiY2O58soreffdd9m3bx8ffPABXbt2PadnERGR0KUF5yIiIap06dIcOXIk/fi333477z5/+eWX9PdbtmwhNjY2/fiuu+5i8uTJnDhxgpYtWxIXF3fe9xMRkdCikQ8RkRB16aWX8u2337JmzRqOHj3KI488ct59TpgwgV9//ZU9e/bw+OOP06VLl/RrN998M1999RXPP/883bp1O+97iYhI6FHyISISoi666CJGjhzJtddey4UXXnha5atzcfvtt9O+fXtq165NnTp1ePjhh9OvRUZG0qlTJzZu3Mitt9563vcSEZHQY865YMdQICQkJLhVq1YFOwwRKYC+//57LrnkkmCHEXTx8fFMnjyZa6+9Nsc2jz76KOvXr89U+epscvr5mtlq51xCLrrQLzKREBXoPZXCRRD2jrKcLmjNh4iI5Is9e/YwZcoUZs6cGexQRESkgNK0KxEROW+TJk2ievXqXH/99bRu3TrY4YiISAEVsiMfZvZvoA3wiXOuc5DDEREp9DZt2pTjtZ49e9KzZ0/vghERkUIplEc+ngdUbkVEREREpIAI2eTDObcEOBjsOEQkNKg4R2Do5yoiEl48Tz7MrLWZzTWzrWbmzKx7Nm36mtlGMztqZqvN7Cqv4xQROSUiIoKUlJRghxGSUlJSiIiICHYYIiLikWCMfEQB64ABwGm/zc2sC74pU2OBpsBnwAdmViNDmzVmti6bV2zW/kREzlflypXZunUrR44c0Tf1+cQ5x5EjR9i6dSuVK1cOdjgiIuIRzxecO+fmA/MBzGxaNk0GA9Occ5P8x/3NrAPQBxju76OJB6GKiABQtmxZALZt20ZqamqQowkdERERVKlSJf3nKyIioa9AVbsys+JAc2B8lksLgCsCcL9eQC+AGjVqnKW1iISzsmXL6o9kERGR81TQFpxHA0WB5Cznk4GqeenIzBYCbwMdzexXM2uZtY1z7hXnXIJzLiEmxvOdH0VEREREwkqBGvnIT865a3PTzswSgcS6desGOCIRERERkfBW0EY+dgEngSpZzlcBfgvEDZ1z85xzvcqVKxeI7kVERERExK9AJR/OuePAaqBdlkvt8FW9EhERERGRQsrzaVdmFgWcmuNUBKhhZk2APc65LcAzwEwzWwksB+4FYoGXAxSPpl2JiIiIiHggGCMfCcDX/lckMNr//lEA59ybwEDgYWAN0Aro6JzbHIhgNO1KRERERMQbwdjnYwlgZ2kzEZjoRTwa+RARERER8UaBWvMRDBr5EBERERHxRtgnHyIiIiIi4g0lHyIiIiIi4omwTz7MLNHMXtm/f3+wQxERERERCWlhn3xozYeIiIiIiDfCPvkQERERERFvhH3yoWlXIiIiIiLeCPvkQ9OuRERERES8EfbJh4iIiIiIeEPJh4iIiIiIeELJh4iIiIiIeCLskw8tOBcRERER8UbYJx9acC4iIiIi4o2wTz5ERERERMQbSj5ERERERMQTSj5ERERERMQTSj5ERERERMQTYZ98qNqViIiIiIg3wj75ULUrERERERFvhH3yISIiIiIi3lDyISIiIiIinlDyISIiIiIinlDyISIiIiIinlDyISIiIiIinlDyISIiIiIinlDyISIiIiIingj75EObDIqIiIiIeCPskw9tMigiIiIi4o1iwQ5AREQkWFJSUtiwYQMAderUITIyMsgRiYiEtrAf+RARkfBz7NgxBg4cSMWKFbn00ktp3LgxFStWZMCAARw9ejTY4YmIhCyNfIiISNjp06cPCxYsYPLkybRs2RKAFStWMHz4cA4ePMirr74a5AhFREKTkg8REQk7b7/9Nu+99x7t2rVLP1e7dm0qV65Mp06dlHyIiASIpl2JiEjYKV26NHFxcaedj4uL07oPEZEAUvIhIiJhp3///owePZqUlJT0cykpKTz22GP0798/iJGJiIQ2TbsSEZGw8/nnn7N06VLi4uJo3LgxAN988w0nTpzg8OHD3Hjjjelt586dG6wwRURCTkgmH2ZWHZgJVAZOAI85594OblQiIlJQREdH06lTp0znatWqFaRoRETCR0gmH/gSjoHOuTVmVhVYbWbznXOHgx2YiIgE39SpU4MdgohIWArJ5MM5tx3Y7n//m5ntAioCSj5ERERERILE8+TDzFoDQ4DmQCzQwzk3LUubvsBQoBrwLb5RjE/P8X7NgaLOuV/OJ24REQkd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7mtmiWb2yv79+wN1CxERKQSqVKnC448/zoMPPhjsUEREQpanyYeZRZlZEzNr4r93Df9xDX+TZ4DuZnaPmV1iZs/j2w/k5UDF5Jyb55zrVa5cuUDdQkRECom0tDSSk7MuPRQRkfzi9bSrBGBxhuPR/td0oLtz7k0zqwQ8jG+TwXVAR+fcZo/jFBGREPbee+9lOnbOsX37diZMmMBVV10VpKhEREKf1/t8LAHsLG0mAhM9CQgtOBcRCUedO3fOdGxmxMTEcPXVV/P0008HKSoRkdBXkBacB4UWnIuIhB9tMigiEhwFZsG5iIiIF1JTU7n88sv58ccfgx2KiEjYCfvkQ9WuRETCS0REBBs3bsTsjLOARUQkAMI++VC1KxGR8HPXXXcxadKkYIchIhJ2wn7Nh4iIhJ/Dhw8za9YsPv74Y5o3b07p0qUzXf/nP/8ZpMhEREKbkg8REQk733//Pc2aNQPg559/znRN07FERAIn7JMPldoVEQk/ixcvPnsjERHJd1rzoTUfIiIiIiKeCPvkQ0REREREvKHkQ0REREREPKHkQ0REREREPBH2yYc2GRQRERER8UbYJx9acC4iIiIi4o2wTz5ERERERMQbSj5ERERERMQTSj5ERERERMQTSj5ERERERMQTYZ98qNqViIiIiIg3wj75ULUrERERERFvhH3yISIiIiIi3lDyISIiIiIinlDyISIiIiIinlDyISIiIiIinlDyISIiIiIinlDyISIiIiIinlDyISIiIiIingj75EObDIqIiIiIeCPskw9tMigiIiIi4o2wTz5ERERERMQbSj5ERERERMQTSj5ERERERMQTSj5ERERERMQTSj5ERERERMQTSj5ERERERMQTxYIdQCCY2SbgAJAG7HXOtQ1uRCIiIiIiEpLJh98VzrlDwQ5CRERERER8NO1KREREREQ84WnyYWatzWyumW01M2dm3bNp09fMNprZUTNbbWZXncOtHLDUzL40s67nHbiIiIiIiJw3r6ddRQHrgBn+VyZm1gV4HugLJPn//cDM6jvntvjbrCH7uNs757b537dyzm01s2rAQjP7xjm3Nv8fR0REREREcsvT5MM5Nx+YD2Bm07JpMhiY5pyb5D/ub2YdgD7AcH8fTXJxn63+f7eb2XygGaDkQ0REREQkiArMmg8zKw40BxZkubQAuCIP/ZQ2szL+91HA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import CyclicMinuteOfHour\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [CyclicMinuteOfHour(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CyclicMinuteOfHour\")" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "31a5beb4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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HKdCwCVmVh/Y55zbCjwHTDWzFcBS4M9ABeC1AMWjaVciIiIiIh4IxshHArDG/4gCRvifPwngnHsL6AcMBRKBJkBb59xPgQhG065ERERERLwRjH0+FgF2lj5jgbFexKORDxERERERb+SrNR/BoJEPERERERFvhH3yISIiIiIi3lDyISIiIiIingj75MPM2pnZ6wcPHgx2KCIiIiIiIS3skw+t+RARERER8UbYJx8iIiIiIuKNsE8+NO1KRERERMQbYZ98aNqViIiIiIg3wj75EBERERERbyj5EBERERERTyj5EBERERERT4R98qEF5yIiIiIi3gj75EMLzkVEREREvBH2yYeIiIiIiHhDyYeIiIiIiHhCyYeIiIiIiHhCyYeIiIiIiHgi7JMPVbsSEREREfFG2CcfqnYlIiIiIuKNsE8+RERERETEG0o+RERERETEE0o+RERERETEE0o+RERERETEE0o+RERERETEE0o+RERERETEE0o+RERERETEE2GffGiTQRERERERb4R98qFNBkVEREREvHFBsAMQEREJluTkZDZt2gRA9erViYqKCnJEIiKhLexHPkREJPz89ttv9OvXj9KlS3PllVdSr149SpcuTd++fTl27FiwwxMRCVka+RARkbDz4IMPMnfuXMaPH0+jRo0AWL58OY8//jiHDx/mjTfeCHKEIiKhScmHiIiEnXfeeYf33nuP1q1bpx2rVq0aZcuWpX379ko+REQCRNOuREQk7BQrVoyKFSuedrxixYpa9yEiEkBKPkREJOz06dOHESNGkJycnHYsOTmZp556ij59+gQxMhGR0KZpVyIiEna++OILPvvsMypWrEi9evUAWLduHSdOnODXX3/l1ltvTes7a9asYIUpIhJyQjL5MLNKwFSgLHACeMo5905woxIRkfwiJiaG9u3bZzhWtWrVIEUjIhI+QjL5wJdw9HPOJZpZOWCVmc1xzv0a7MBERCT4Jk6cGOwQRETCUkgmH865ncBO//NdZrYXKA0o+RARERERCRLPkw8zawYMBK4CKgDdnHOTMvXpBQwCygMb8I1ifH6O17sKiHDObTufuEVEJHTUrVsXM8u2fe3atR5GIyISPoIx8lEcWA9M8T8yMLOOwItAL2CJ/+dHZnaFc26rv08iWcfexjm3I925Svuv0T2vb0JERAquDh06ZHidkpJCYmIiS5cu5aGHHgpSVCIioc/z5MM5NweYA2Bmk7Lo0h+Y5Jwb53/dx8xuBB4EHvefo/7ZrmNmRYD3gdHOuWXZ9OkB9AC45JJLcncjIiJSYA0fPjzL4//4xz/46aefPI5GRCR85Kt9PsysML7pWHMzNc0Frs3FeQyYBCxwzk3Nrp9z7nXnXIJzLiE2NvYcIhYRkVBy5513Mm3atGCHISISsvJV8gHEABFAUqbjSUC5XJynMdARuN3MEv2PunkUo4iIhKjFixcTHR0d7DBEREJWqFa7WkIOEyszawe0q1GjRmCDEhGRfCP9JoIAzjl27tzJmjVrsp2SJSIi5y+/JR97gZNAXKbjccCuQFzQOTcbmJ2QkKBF6SIiYaJMmTIZXhcqVIjatWszatQo2rRpE6SoRERCX75KPpxzx81sFdAaSL8jeWvg3UBcUyMfIiLhR5sMiogEh+drPsysuJnVN7P6/utf4n99qtzUc0BXM3vAzGqZ2Yv49gN5LRDxOOdmO+d6lCxZMhCnFxGRfG706NEcOHAg2GGIiISFYCw4TwDW+B9RwAj/8ycBnHNvAf2AoUAi0ARo65xT7UMREclzo0aNYt++fcEOQ0QkLARjn49FQPbbyvr6jAXGehGPpl2JiIQ351ywQxARCRv5rdSu5zTtSkRERETEG/lqwbmIiIjXvv76aypUqBDsMEREwkLYj3yYWTsze/3gwYPBDkVERIKgUqVKREREBDsMEZGwkNON+GqZ2ZNm9pmZ/WRmu81sg5lNNbPOZlYk0IEGiqZdiYiEh0KFChEREZGjh4iIBMYZp12ZWTzwDL6KU0uBZcBMIBkoDdQBngZeMrNngBecc78FNGIREZFz8Pbbb2Pmq3eSlJTEsGHDuOOOO2jUqBEAy5cv5/3332fEiBHBDFNEJKTZmap8mNlP+JKP6c65/Wfo1wh4BPifc+7pPI/SAwkJCW7lypXBDkNERPzMbJVzLiEHXXNdrurWW2+lXbt2dO/ePcPxcePG8f777/Phhx/m9pQiEgD22J5ghxAS3OhYry+ZbWXbs027utQ598qZEg8A59xy59xdwD/OJbpg0poPEZHws2DBAlq0aHHa8RYtWrBo0SLvAxIRCRNnTD6cc8fP1G5mkbnpnx9pzYeISPiJiYlh5syZpx2fOXMmsbGef0MoIhI2clxq18weBrY75971v54A3Gdmm4BbnXPfBShGERGRPPXkk0/SrVs3Fi5cmLbm44svvmD+/PlMmDAhyNGJiISu3JTafRjYA2BmzYC7gM5AIvBs3ocmIiISGF26dGHZsmXExMQwa9YsZs2aRZkyZVi6dCn33XdfsMMTEQlZudlksCKw2f+8HfCOc+5tM1sHfJ7nkYmIiARQw4YNmTZtWrDDEBEJK7kZ+TgElPU/bw186n+eAhTNy6C8pAXnIiLhKSkpiTFjxtCrVy/27t0LwNKlS9m8efNZ3ikiIucqN8nHXGCcmY0HagAf+Y/X5vcRkQJHC85FRMLPqlWruPzyy5k2bRrjx+2NxVkAACAASURBVI/n0KFDAMybN48hQ4YEOToRkdCVm+TjIXwbDcYCHZxz+/zH44EZeR2YiIhIoAwcOJC+ffuyZs0aihQpknb8hhtuYOnSpUGMTEQktOV4zYdz7hDQJ4vjw/M0IhERkQBbtWpVllWtypcvT1JSUhAiEhEJD2cc+TCzC3Nzstz2FxERCYaoqCj27z99/9xvv/2WsmXLZvEOERHJC2ebdvW9mQ01s4uz62BmhczsJjObh29qloiISL522223MWLECH777TcAzIwtW7YwePBg2rdvH+ToRERC19mSj6ZAPeBHM1tlZv8ys+FmNtjMRpvZLGAX8BowE3gmwPHmOVW7EhEJP2PGjGHfvn3ExsZy9OhRmjRpQo0aNbjooosYOXJksMOTAuhvf/sbV199NSVKlCA2NpZ27dqxfv36tPaUlBQGDx5MvXr1KFasGOXLl6dz585s3bo1w3maN2+OmWV4dOrUKa19/fr1FC1alHfffTfD++bPn09kZKTWLEm+Z865s3cyq4RvU8GmQGUgCtgLrAE+AeY451IDGGfAJSQkuJUrVwY7DBER8TOzVc65hBx0PfsvsmwsWLCA1atXk5qaSnx8PK1atTrXU0mYu+GGG+jUqRNXX301zjmGDRvG8uXL+frrryldujQHDx6kQ4cOPPDAA9SvX5+DBw8yYMAAfvnlF9auXcsFF/iW4TZv3pxq1aoxatSotHNHRUWRvirn3//+d8aMGcP69euJi4vj4MGD1KlTh7vvvpvRo0d7fu+BZI/tCXYIIcGNjvX6kpZtQ06Sj3Cg5ENEJH/xIvkQCZQjR45QsmRJ3n//fdq1a5dln6+//pratWuzdu1a6tatC/iSjzp16vDyyy9ne+7U1FSaNm1KTEwMH3zwAV26dCExMZGVK1dSuHDhgNxPsCj5yBv5KfnITaldERGRkDF27Fhq165NdHQ0P/74IwCjR4/m7bffDnJkEgoOHz5MamoqpUqVyrbPqf1lMvd58803iYmJoXbt2gwcOJDDhw9naC9UqBCTJ09m/vz53H333bz55ptMmTIl5BIPCU1KPkREJOy88MILjBw5kh49epB+BkDFihXP+I2zSE717duX+vXr06hRoyzbjx8/zoABA2jXrh0XX/x7XZ/OnTszbdo0Fi5cyF//+lfefffdLIsg1KhRg0GDBjF9+nQee+wx6tevH7B7EclLOd7nQ0REJFS89tprjBs3jptvvpmhQ4emHY+Pj2fDhg1BjExCQf/+/VmyZAlLliwhIiLitPYTJ05wzz33cODAAWbNmpWhrUePHmnP69atS7Vq1WjYsCGrV68mPj4+rS05OZkZM2YQHR3NkiVLcM5hlu1MF5F8QyMfIiISdn766Sfq1Klz2vHIyEiSk5ODEJGEikceeYQZM2awYMECqlWrdlr7iRMn+OMf/8jatWv59NNPKVOmzBnPl5CQQEREBN9//32G44MHD+bEiROsWLGClStXasROCgyNfIhIyPuiWfVgh3BW1yzeFOwQwkq1atVYvXo1lStXznB8zpw5XHHFFUGKSgq6vn378tZbb7Fw4UJq1qx5WntKSgqdOnVi/fr1LFq0iHLlyp31nOvWrePkyZOUL18+7djChQsZO3YsCxcupHbt2jz77LP069ePtm3bUr16/v//TsJbrpIPM4sD7gWqA391zu01s8bADufc5kAEGGhm1g5oV6NGjWCHIiIiHhk4cCC9e/fm6NGjOOdYvnw5U6dO5ZlnnuGNN94IdnhSAD300ENMnTqV999/n1KlSrFr1y4AihcvTvHixTlx4gR/+MMf+Oqrr5g9ezZmltanZMmSREVFsWnTJqZNm0bbtm2JiYnh66+/ZsCAATRo0IDGjRsDvoXs3bp1o2/fvjRt2hSA7t278+6779KtWzcWLVpEoUKa2CL5V45L7ZrZVcCnwGagNlDTOfejmT0BXOac6xywKD2gUrsioUsjHwVToEvtjhs3jpEjR7Jt2zYAKlSowIgRI/jTn/50LqeTMJfdeovhw4fzxBNPsGXLFqpWrZpln4kTJ9K1a1e2bdvGPffcw/r16zly5AiVKlXi5ptvZvjw4ZQuXRqAP/3pTyxfvpzVq1dTtGjRtHNs376dOnXqMGzYMB555JG8v8EgUandvJGfSu3mJvlYCCx2zg03s8PAlf7koxHwpnOu8llOka8p+RAJXUo+Ciav9vnYu3cvqamplC1b9nxOIyIBoOQjb+Sn5CM3066uArL6OmgnEJfbiERERIJt06ZNfPPNNwBcccUVWS4QFhGRvJOb5CMZyGqnnJrA7rwJR0REJPB++eUX/vSnPzFr1qy0+fHOOW655RbeeOONs1YgEhGRc5ObFUkfAMPNrIj/tTOzKsDfgXfzOC4REZGAeeCBB/jhhx/4/PPPOXbsGMeOHWPx4sVs3ryZ7t27Bzs8EZGQlZuRj4HAHGAPEA0swTfdaikw9AzvExERyVc++eQTPv300wy7Tzdu3Jh//etftGrVKoiRiYiEthwnH865Q0ATM2sJxOMbNVntnJsfqOBEREQCITY2lmLFip12PDo6WlOuREQCKNebDDrnFgALAhCLiIiIJ4YNG0a/fv2YOnUqFStWBHylSgcMGMCwYcOCHJ0Egqom5Y0gVE2SEJPbTQYbAC2AsmRaL+KcezQP4zpnZnYRMB/fvV0AvOicGxfcqEREJD954YUX2LJlC1WqVMmQfBQtWpTdu3fzz3/+M63v2rVrgxWmiEjIyXHyYWaPAqOBn4AkMtZVP68a63nsMNDMOXfUzIoB683sPefcL8EOTERE8ocOHToEOwQRkbCUm5GPR4AHnXP/ClQwecE5dxI46n9ZBN8mJ9ludCIiIuFn+PDhwQ5BRCQs5abUbiHg0/O5mJk1M7NZZrbdzJyZdc2iTy8z22xmx8xslZk1PYfrXGRm/wN+Bv7hnNt7PnGLiEho2bNnD3v2/L4GYN26dQwdOpQZM2YEMSoRkdCXm5GPV4FuwJDzuF5xYD0wxf/IwMw6Ai8CvfCV8u0FfGRmVzjntvr7JGYTdxvn3A4A59wB4EoziwPeM7OZzrmk84hbhC+aVQ92CDlyzeJNwQ5BJN+76667uPfee7n//vvZu3cvzZo1o0KFCrz00kvs2LGDAQMGBDtEEZGQlJvkYwQwx8zW4EsgUtI3OufuP9sJnHNz8O0VgplNyqJLf2BSugXifczsRuBB4HH/OernNGDnXJJ/BKQpMDOn7xMRkdC2du1arrnmGgBmzpxJjRo1+Oqrr/jggw8YNGiQkg8RkQDJzbSrp4E2wAmgFBCb6XFezKwwcBUwN1PTXODaXJwnzswu9D8vCTQDvsumbw8zW2lmK9MPv4uISGhLTk6mePHiAMyfP59bb70VgPj4eLZt2xbM0EREQlpuko9eQGfn3NXOuVucc+3SP/IglhggAl8lrfSSgHK5OE9l4HP/iMfnwEvOuXVZdXTOve6cS3DOJcTGqm61iEi4uPTSS3nvvffYtm0bc+fOpU2bNgAkJSVx0UUXBTk6EZHQlZtpV8nAmkAFkleccyuAHE/NMrN2QLsaNWoELqhMtHZARCS4hg8fzh//+EcGDBjA9ddfT8OGDQH45JNPaNCgQZCjExEJXbkZ+Xge6GdmgSpbuxc4CcRlOh4H7ArQNXHOzXbO9ShZsmSgLiEiIvnMnXfeydatW1m5ciUff/xx2vFWrVrx3HPPBTEyEZHQlpvkoylwN7DFzD7yl8xNe5xvIM6548AqoHWmptbAsvM9v4iISHpxcXE0aNCAQoV+/1XYsGFDatasGcSofBYvXsytt95KxYoVMTMmTZqUof3IkSP06dOHiy++mKioKC6//HKef/75DH2aN2+OmWV4dOrUKa19/fr1FC1alHfffTfD++bPn09kZCRLly4N2P2JSPjKzbSrvcB753MxMysOnJrfVAi4xMzqA/v8pXSfA6aa2QpgKfBnoALw2vlc9ywxeT7tSkRE5EyOHDlCnTp16NKlC126dDmtvX///syfP5+pU6dStWpVFi9eTPfu3YmJieHee+9N69etWzdGjRqV9joqKirteZ06dRgxYgR//vOfadKkCXFxcRw8eJBu3boxYMAAGjduHNibFJGwlOPkwznXLQ+ulwAsTPd6hP8xGejqnHvLzMoAQ4Hy+Er6tnXO/ZQH186Sc242MDshIaF7oK4hIiKSG23btqVt27YAdO3a9bT2ZcuWce+999KiRQsAqlSpwoQJE/jyyy8zJB/R0dGUK5d9zZZBgwYxa9YsevTowQcffECfPn0oVaoUTz75ZN7ekIiIX26mXZ0359wi55xl8eiars9Y51wV51wR59xVzrnFXsYoIiKS3zVp0oTZs2enlQVetmwZiYmJ3HjjjRn6vfnmm8TExFC7dm0GDhzI4cOHM7QXKlSIyZMnM3/+fO6++27efPNNpkyZQuHChT27FxEJL2cc+TCztcB1zrn9ZrYOcNn1dc7Vy+vgvKBpVyIiUtD885//pGfPnlxyySVccIHvV/lLL73ELbfcktanc+fOVK5cmQoVKrBhwwYef/xx1q5dy9y5GbfTqlGjBoMGDWLEiBH89a9/pX79HBeMFBHJtbNNu3oX+C3d82yTj4JK065ERMJTUlISU6dOZdOmTTz11FPExMSwdOlSKlSoQNWqVYMd3hm99NJLLFu2jFmzZlG5cmUWL17MwIEDqVKlStroR48ePdL6161bl2rVqtGwYUNWr15NfHx8WltycjIzZswgOjqaJUuW4JwjcIUtRSTcnTH5cM6NSPf8iYBHIyIi4oFVq1Zx/fXXU7VqVTZs2MCgQYOIiYlh3rx5bNy4kenTpwc7xGwlJyfz+OOP884779CunW+P33r16pGYmMiYMWNOm3p1SkJCAhEREXz//fcZko/Bgwdz4sQJVqxYQaNGjXj55Zfp06ePJ/ciIuEnx2s+zGyBmZ227auZlTCzBXkblnfMrJ2ZvX7w4MFghyIiIh4ZOHAgffv2Zc2aNRQpUiTt+A033JDvS8ympKSQkpJCREREhuMRERGkpqZm+75169Zx8uRJypcvn3Zs4cKFjB07lkmTJlG7dm2effZZHnvsMTZt0iazIhIYuVlw3hzIagVaUXx7gBRI2mRQRCT8rFq1ivvuu++04+XLlycpKSkIEWV05MgREhMTSUxMJDU1la1bt5KYmMjWrVspUaIE1113HY899hiLFi1i8+bNTJo0iSlTpnDHHXcAsGnTJp588klWrlzJli1bmDNnDp06daJBgwZpJXQPHz5Mt27d6Nu3L02b+n6Nd+/enaZNm9KtW7czJjIiIufqrMmHmcWb2anx2XqnXvsfVwM9gO0BjVJERCQPRUVFsX///tOOf/vtt5QtWzYIEWW0cuVKGjRoQIMGDUhOTmb48OE0aNCAYcOGAb4qVldffTV33303V1xxBaNHj+app56id+/eABQuXJhPP/2UG264gcsvv5yHH36YNm3aMH/+/LQRk379+hEdHc3TTz+d4doTJkxg3bp1vPjii97etIiEhZzs87ES30JzB8zNoj0Z0ORQEREpMG677TZGjBjBO++8A4CZsWXLFgYPHkz79u2DHJ1vd3Lnsq/xUq5cOSZOnJhte6VKlfjss8/OeI0JEyZkebxixYpZJmYiInkhJ9OuqgLVAQP+z//61KMiUMI590bAIgwwrfkQEQk/Y8aMYd++fcTGxnL06FGaNGlCjRo1uOiiixg5cmSwwxMRCVlnHflIt7u4pxsSekWldkVEwk+JEiVYsmQJCxYsYPXq1aSmphIfH0+rVq2CHZqISEjLybSrNGZ2MdAMKEumZMQ591wexiUiIhJwLVu2pGXLlsEOQ0QkbOQ4+TCzu4E3gBPAHjJuOOgAJR8iIlJgrFmzhoULF7J79+7TKjs988wzQYpKRCS05Wbk40ngWeCvzrmTAYrHc2bWDmhXo0aNYIciIiIeeeaZZ3jssceoXLkycXFxGXb01u7eIiKBk5vkIw4YH0qJB2jNh4hIOHr++ed59dVX6dmzZ67fa4/tCUBE4ceNjg12CCISBLlZRD4HaBioQERERLySmprK9ddfH+wwRETCTm5GPuYBfzez2sA6ICV9o3PuvbwMTEREJFAefPBBJk6ceNoGeyIiEli5ST7+5f/5lyzaHBBx/uGIiIgE3vDhw2nbti0NGjSgTp06REZGZmh/440Cu32ViEi+luPkwzkXkvt8iIhI+BkyZAhz584lPj6e/fv3a5G5iIhHcrXPRyhStSsRkfAzduxYpk+fTseOHYMdiohIWMnNPh/9z9ReUDcZVLUrEZHwExUVRYMGDYIdhohI2MnNyEefTK8jgfJAMrAbbTIoIiIFxCOPPMILL7zAK6+8oilXIiIeys2aj6qZj5lZHDARGJeXQYmIiATS559/zuLFi/nwww+54oorTltwPmvWrCBFJiIS2s5rzYdzLsnMhgBvA//Jm5BEREQCKyYmhjvvvDPYYYiIhJ28WHBeCN/u5yIiIgXCxIkTgx2CiEhYys2C88xfERm+NR8PAZ/nZVAiIiIiIhJ6cjPyMTPTawfsARYAA/IsIhERkQCoV68en332GaVKlaJu3bpnXGi+du1aDyMTEQkf2mRQRETCQvv27SlSpEjac1W5EhHxXo6SDzOLBJYAXZxz3wU2JG9pk0ERkfAwfPjwtOdPPPFE8AIREQljORrNcM6lAFXxTbUKKc652c65HiVLlgx2KCIi4pGWLVty4MCB044fOnSIli1bBiEiEZHwkJupVJMB7QIuIiIF3qJFizh+/Phpx48dO8bnn6uGiohIoORmwXkx4G4zaw2sAn5N3+icezgvAxMREclrq1evTnu+du1aSpcunfb65MmTfPLJJ1SsWDEYoYmIhIXcJB+1gFP/a1fL1BZy07FERCT0JCQkYGaYGW3atDmtPSoqipdeeikIkYmIhIfcVLtqEchAREREAm3z5s0456hWrRorVqwgNjY2ra1w4cKULVuWiIiIIEYoIhLa8mKHcxERkQKhcuXKAKSmpgY5EhGR8KTkQ0REwtLPP//M4sWL2b1792nJSP/+/YMUlYhIaFPyISIiYWfatGncf//9XHDBBcTGxmbYcNDMlHyIiARIyCYfZhYNfAO845wbGOx4REQk/xg2bBgDBgzgqaee0hoPEREP5Wafj4JmCPBFsIMQEZH8JykpiQceeECJh4iIx0Iy+TCzS4GawEfBjkVERPKftm3b8uWXXwY7DBGRsOPptCszawYMBK4CKgDdnHOTMvXpBQwCygMbgH7OudxuNzvGf45rzzdmEREJPa1bt2bw4MFs2LCBunXrEhkZmaH9zjvvDFJkIiKhzes1H8WB9cAU/yMDM+sIvAj0Apb4f35kZlc457b6+ySSddxtnHM7zOw2YKNzbqOZKfkQEZHT9OzZE4BRo0ad1mZmnDx50uuQRETCgqfJh3NuDjAHwMwmZdGlPzDJOTfO/7qPmd0IPAg87j9H/bNc5hqgk5n9AV+yE2lmh5xzT+bBLYiISAjQPh8iIsGRb9Z8mFlhfNOx5mZqmksupk855x53zlVyzlXBN8VrXHaJh5n1MLOVZrZyz5495xi5iIiIiIjkRH4qtRsDRABJmY4nAa0CcUHn3OvA6wAJCQkuENcQEZH857nnnjtju/b5EBEJjPyUfOS5zIvZs2Jm7YB2NWrUCHxAIiKSL7z00ksZXqekpLBz506ioqIoW7askg8RkQDJT8nHXuAkEJfpeBywK1AXdc7NBmYnJCR0D9Q1REQkf9m8efNpx5KSkujWrRvdu+vXgYhIoOSbNR/OuePAKqB1pqbWwLJAXdfM2pnZ6wcPHgzUJUREpACIi4vj6aef5tFHHw12KCIiIcvT5MPMiptZfTOr77/2Jf7Xl/i7PAd0NbMHzKyWmb2Ibz+Q1wIVk3NutnOuR8mSJQN1CRERKSBSU1NJSsq89FBERPKK19OuEoCF6V6P8D8mA12dc2+ZWRlgKL5NBtcDbZ1zP3kcp4iIhLD33nsvw2vnHDt37uSVV16hadOmQYpKRCT0eb3PxyLAztJnLDDWk4DQgnMRkXDUoUOHDK/NjNjYWFq2bMmzzz4bpKhEREJfflpwHhRacC4iEn60yaCISHDkmwXnIiIiXkhJSaFhw4Z89913wQ5FRCTshH3yoWpXIiLhJTIyks2bN2N2xlnAIiISAGGffKjalYhI+LnvvvsYN25csMMQEQk7Yb/mQ0REws+vv/7KtGnTmDdvHldddRXFihXL0P7Pf/4zSJGJiIQ2JR8iIhJ2vvnmG+Lj4wH48ccfM7RpOpaISOCEffKhUrsiIuFn4cKFZ+8kIiJ5Tms+tOZDRERERMQTYZ98iIiIiIiIN5R8iIiIiIiIJ5R8iIiIiIiIJ8I++dAmgyIiIiIi3gj75EMLzkVEREREvBH2yYeIiIiIiHhDyYeIiIiIiHhCyYeIiIiIiHhCyYeIiIiIiHgi7JMPVbsSEREREfFG2CcfqnYlIiIiIuKNsE8+RERERETEG0o+RERERETEE0o+RERERETEE0o+RERERETEE0o+RERERETEE0o+RERERETEE0o+RERERETEE2GffGiTQRERERERb4R98qFNBkVEREREvBH2yYeIiIiIiHhDyYeIiIiIiHhCyYeIiIiIiHhCyYeIiIiIiHhCyYeIiIiIiHhCyYeIiIiIiHjigmAHEAhmtgU4BKQC+51zLYIbkYiIiIiIhGTy4Xetc+5IsIMQEREREREfTbsSERERERFPeJp8mFkzM5tlZtvNzJlZ1yz69DKzzWZ2zMxWmVnTc7iUAz4zs6/M7O7zDlxERERERM6b19OuigPrgSn+RwZm1hF4EegFLPH//MjMrnDObfX3SSTruNs453b4nzdxzm03s/LAfDNb55xbm/e3IyIiIiIiOeVp8uGcmwPMATCzSVl06Q9Mcs6N87/uY2Y3Ag8Cj/vPUT8H19nu/7nTzOYA8YCSDxERERGRIMo3az7MrDBwFTA3U9Nc4NpcnKeYmV3of14caAlsyKZvDzNbaWYr9+zZc26Bi4iIiIhIjuSb5AOIASKApEzHk4ByuThPHLDEzP4HfAFMcc59lVVH59zrzrkE51xCbGzsucQsIiIiIiI5FHKldp1zPwJX5rS/mbUD2tWoUSNwQYmIiIiISL4a+dgLnMQ3cpFeHLArUBd1zs12zvUoWbJkoC4hIiIiIiLko+TDOXccWAW0ztTUGljmfUQiIiIiIpKXPJ125V8Afmp+UyHgEjOrD+zzl9J9DphqZiuApcCfgQrAawGMSdOuREREREQ84PXIRwKwxv+IAkb4nz8J4Jx7C+gHDAUSgSZAW+fcT4EKSNOuRERERES84fU+H4sAO0ufscBYTwISERERERHP5Js1H8FiZu3M7PWDBw8GOxQRERERkZAW9smHpl2JiIiIiHgj7JMPERERERHxRtgnH5p2JSIiIiLijbBPPjTtSkRERETEG55WuxIRkazZY3uCHcJZudGxwQ5BREQKuLAf+RAREREREW+E/ciHdjjPnr6JFREREZG8FPbJh3NuNjA7ISGhe7BjEckLShpFREQkv9K0KxERERER8YSSDxERERER8YSSDxERERER8UTYJx/aZFBERERExBthn3xok0EREREREW+EffIhIiIiIiLeUPIhIiIiIiKeUPIhIiIiIiKeUPIhIiIiIiKeCPvkQ9WuRERERES8EfbJh6pdiYiIiIh4I+yTDxERERER8YaSDxERERER8YSSDxERERER8YSSDxERERER8YSSDxERERER8YSSDxERERER8UTYJx/a50NERERExBthn3xonw8REREREW+EffIhIiIiIiLeUPIhIiIiIiKeUPIhIiIiIiKeUPIhIiIiIiKeUPIhIiIiIiKeUPIhIiIiIiKeUPIhIiIiIiKeCMnkw8yqmtlCM/vazNaZWbFgxyQiIiIiEu4uCHYAATIJ+P/27j3GjrKM4/j3h0VF6wUttpooGkHUeqnEGwpYFbDwh8ZLYozG1KhVqsRrSDQYNQY1UaNGJSkaU8QgCcFIaQBBIwKVIFYFEUVIuCi1RaxUC0UuPv4xUz09nN3uds/O2bP7/SSTPTPznnee6bt9Ju+8M++eUlWXJ3kC8O8RxyNJkiQtePOu85FkOXB/VV0OUFXbRxySJEmSJDp+7CrJ0Uk2JLk9SSVZPaDM2iQ3J7k3yeYkR03zMIcCO5Ocn+TXST45lOAlSZIkzUjXIx+LgeuA77XLHpK8Ffg6sBa4ov15YZLnVtVtbZnfMjju46pqS7vvKGAFcAdwUZKrq+qSWTgfSZIkSVPUaeejqi4ALgBIsn5AkY8C66vq2+36SUlWAScCn2jrWLGXw9wO/Kqq/twe5wKajoidD0mSJGmEUlWjOXCyE/hgVa1v1x8O3AO8rarO6Sn3LeB5VfWqKda7CLgaeA2wAzgPWFdVGweUXQOsaVcPA27Y5xOan5YAd446CE2b7TaebLeHOriqDhp1EOMoyZqqOn3UcWh6bLfxZLtNz1x64XwJ8DBgW9/2bcAxU62kqh5o3/O4DAhw8aCOR1v2dMBflgkk+VVVvXjUcWh6bLfxZLtpyNbg9W0c2W7jyXabhrnU+RiaqroQuHDUcUiSJEn6v7n0RwbvBB4ElvZtXwps7T4cSZIkScM0ZzofVXUfsBk4tm/XscAvuo9IOIQ4rmy38WS7aZj8fRpPttt4st2modMXzpMsBg5pV38BfBHYAGyvqtvaqXbPpJlidxPwfuDdwPKqurWzQCVJkiQNXdedj5XAzwbsOqOqVrdl1gInA0+m+ZsgH6mqy7qKUZIkSdLsGNlUu5IkSZIWljnzzofmhiRHJ9mQ5PYklWT1qGPSnvbWRml8JsmWJLuSXJpk+YjCXbCG0U5JDkxyZpId7XJmksd3eiIaG+bv8WAOHw/m8Nlj50P9zijNbgAABn1JREFUFtM87vYhYNeIY9Fge2ujk4GPAScBLwHuAC5J8pjOIhQMp53OAg4HVrXL4TTvxUmDmL/Hgzl8PJjDZ4mPXWlC/X+FXnNPfxslCbAF+GZVndpuO4AmKX68qtaNKtaFbF/aKclzgOuBI6tqU1vmSOBy4NlVdUP3Z6JxYf4eD+bw8WAOHy5HPqT55RnAMuDi3RuqahdwGfCKUQWlh5hKOx0B7GTPqcY3AXdjW0rzlTl8PJjDZ8DOhzS/LGt/buvbvq1nn0ZvKu20DPhb9QxPt5/vwLaU5itz+Hgwh8+AnQ9JkiRJnbDzIc0vW9ufS/u2L+3Zp9GbSjttBQ5qny0G/vec8ZOwLaX5yhw+HszhM2DnQ5pfbqZJasfu3pDkkcBR7PncqUZrKu10Jc1sK0f0fO8I4NHYltJ8ZQ4fD+bwGVg06gA0tyRZDBzSru4HPC3JCmB7Vd02usi0297aKMnXgE8m+SPwJ+AUmpfezhpJwAvUTNupqv6Q5CJgXZI1bT3rgI0LeZYUTcz8PR7M4ePBHD57nGpXe0iyEvjZgF1nVNXqbqPRIHtro3ZY99PA+4ADgauAD1TVdd1FqWG0U5IDgW8Ar283baCZ7vGu2Yxd48n8PR7M4ePBHD577HxIkiRJ6oTvfEiSJEnqhJ0PSZIkSZ2w8yFJkiSpE3Y+JEmSJHXCzockSZKkTtj5kCRJktQJOx/SCCVZluTiJHcnmZV5r5OsTFJJlsxG/ZK0UJnDpemz8yFNQZKDktyX5NFJ9m8vNE8bQtUfB54CrACePIT6JEl9zOHS3LFo1AFIY+II4JqqujvJy4DtVXXbEOo9BNhcVTcOoS5J0mDmcGmOcORDmppXAJvaz0f2fJ5Ukvcluam943ZTkvf27LsFeAPwznZIff0k9ZyQ5Koku5L8Pcn5SR7Z7jswyRlJ/tHu/0mS5ZPUtTrJzr5tewzr7y6T5Pgkf0xyT5INSR6X5C1JbkyyI8mZSQ7oqefSJKcl+XySO5PckeTLSfbrKfOmJNe2sW5P8vMkS6fy7ylJ+8gcbg7XHOHIhzSBdkj+2nb1UcCDSVYDBwCV5C7grKpaO8H33wh8E/gIcDHwOuC0JFur6nzgJcBZwHbgQ8CuCepZBWwAvgi8i+b/7XH8/+bBeuAwmovgP4BTgYuSPKuqBtY5RY8APga8HXg4cG677ALeDDwR+CGwFvhKz/feDnyd5mK/oj3HzcAPkiwDzgY+0da1GHj5DGKUpIHM4eZwzVFV5eLiMmChuUA8HXgBcF/785nAv4Cj231LJvn+JuC7fdvWA1f0rG8E1u8ljk3A2RPsOxQo4OiebY8DdgDvaddXtmWWtOurgZ199QwqU8BhPWW+DDzYe87t+WzsWb8UuLKv7kuA77SfD2/rPXjU7evi4jK/F3O4Odxlbi4+diVNoKoeqKpbgGcDV1fVtcAyYFtVXVZVt1TVnZNU8RweOrR/BfDcaYbyIuCnkxzjP8CVPXHvAH63D8fp9++quqFnfRuwte+ctwFP6vvetX3rW3rKXAP8BLguyblJTkxy0AzjlKSHMIebwzU3+diVNIEkvwcOBvYH9mufsV0ELGo/31pVEz6XO4lZmY5xGsf5D5C+bfsPKPfAgPruH7Ct/ybGhGWq6sEkx9EM0x8HvBv4QpJXVdU1E8QrSdNmDjeHa25y5EOa2Ak0z7tuBd7Rfr4O+HD7+YS9fP8PwCv7th0JXD/NOH4DvHaSY+xHM5MLAEkeCzx/kuP8DXhUW263FdOMaZ9V48qq+izNM9NbgLd2dXxJC4Y5fBaYwzVTjnxIE6iqW9uX65YC59Hc/VkOnFtVf51CFV8CzkmymeZlxVU0L/K9aZqhnAqcn+Qmmhf/QnPHaV1V3ZjkPGBdkjXAXW35f7ZlB7kKuJvmbtVXgRfSvHA465K8HDgG+DHNcP+LgKcy/Yu5JE3KHD585nANgyMf0uRW0jwrfC/wUuAvU7xoUVU/Ak6imSnleprZUNZWM0vKlFXVBcAbgeNp7qD9HHg1zdA7NLOn/JJmNpVf0szqsqommCWlqrbTXECPpXmueA3wqenENAM7aO4kbgRupJlh5XNV9f2Oji9pYVmJOXyYzOGasVR19eiiJEmSpIXMkQ9JkiRJnbDzIUmSJKkTdj4kSZIkdcLOhyRJkqRO2PmQJEmS1Ak7H5IkSZI6YedDkiRJUifsfEiSJEnqhJ0PSZIkSZ34L7UwkES9t6FmAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import CyclicHourOfDay\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [CyclicHourOfDay(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CyclicHourOfDay\")" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "00259717", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jbtTuXJlkpKSSElJ2e/6ixcvpkaNGmzZsmWzuxfafd3MXibUm1RwpTAH6NSpE++88w73338/9913X6E2ly1bxtChQ5k1axbbtm0jOTmZVq1a8ac//YnOnTvn15s3bx4PPfQQc+fOJScnh3r16nHOOedwyy230KZNaNXf3/zmN+zdu5c5c+bkv+7111+na9eu9OrVi6effvqAvwcRKd+qV6/O008/zY033njAOhkZGcyePZuvvvoqv6xFixZ06dKFoUOH5pddcMEFnHbaaTz99NP5Zddeey3ffPMNn3zyCQ888ADjx4/niy++ICkpKSL3E0UH/iPo7uXyQegbrBsLHNcn9AbTrki9IcBXBY4vB1YA3wC9S3q91q1bu4hIWZk5c6YD/u6770Y7lIjaunWrV69e3QcPHlzmbQMLvGR/w0VEykS1atV84sSJBzy/Y8cOr169uj/22GOFyvv06eNnnnmmr1271t3d586d6zVq1PDp06cXqrdlyxavV6+eX3PNNV6xYkV/8803y/weyokD/s0uV8OuyoKHlpws8bKT4bHS6U2bNo1cUCISN1auXMm3337LrbfeSqtWrbjwwgujHVJEbNq0ia+++opRo0aRm5tLv379oh2SiEjETZ06ld27d9OjR49C5U899RR9+vShYcOGVKwY+ng9evRoLrvsskL1kpKSeOSRR+jZsyfdunUr1PMaL8rbhPOD2UxoTHRKkfIU4IfDbdTdp7t775o1ax5JbCIiAAwbNozf/va3VK5cmRdfLG7ocGx48803Of/88/nss8944YUXSE0tOiRaRCT2jBs3jiuuuILk5EIjQhk9ejQff/wxb7zxBgsXLuSJJ57g9ttv59///neherm5uUycOJGqVasyf/58du3aFWT45cJRk3x4aN34hYQ2uiroIkKrXomIRN2kSZPYu3cvCxcupHnz5tEOJ2JuvPFG3J01a9Zw9dVXRzscEZGIy8zMZMGCBWRkZBQqz8nJ4Z577mH48OGkp6fTsmVL+vfvz7XXXsuIESMK1X3yySdZsmQJ8+fPZ+fOnQwaNCjIWygXylXyEV6m7AwzO4NQbA3Dx3lL6Y4EbjSzXmZ2qpmNIjQX5NkDtVmCa6ab2XPbtm078hsQERERkZj03HPP0aRJEzp27FiofM+ePfkLfhSUkJBAbu4vq6wvW7aMQYMGMXr0aJo1a8aECRMYNWoUc+fODST+8qK8zflIA94vcDw0/HiB0OTzv5tZbWAwoWXPvgA6u/uaw72gu08HpqelpWUcsrKIxK3t27ezceNG9uzZc+jKUiKVKlWibt261KhRI9qhiEgc27lzJ9988w0QGha1du1aMjMzSUpKomHD0Pff2dnZTJkyhTvvvHO/1exq1KjBBRdcwN1330316tVp1KgRH374IS+++CLDh4e2htq7dy89evTg0ksv5frrrwdCK/T16tWLnj17kpmZSdWqxe3lGnvK7VK7QUtLS/MFCxYcuqKIxJ3t27eTlZVFgwYNSExM1DKqZcDdycnJYd26daSkpBSbgJjZQndPK0lzZR+hiMSLDz74gPbt2+9X3qNHDyZNmgTAxIkTycjIYO3atdSvX3+/uj/88AP33HMPM2fOZOvWrTRq1IhevXpx2223YWYMGzaMp59+mi+++KLQfJGdO3fSsmVL0tPTGTVqVMTuMQoO+EYZ98lHgdWuMr7++utohyMi5dA333xD/fr14+ZbqSBlZ2ezfv16iltxUMmHiMhR64DJR7ma8xENWu1KRA5lz549JCYmRjuMmJSYmKihbCIicSTukw8RkZLQUKvI0O9VRCS+xH3yodWuRERKpnHjxrz77rvRDkNERI5icZ98aNiViIiIiEgwyttSuyIiR4VP2p0Y0fbPmb0you2LiIhEg5IPEZGjXOPGjenTpw+TJ09mw4YNXHnllTzzzDPk5OTQrVs3Pv30U/bu3Uvbtm159tln+dWvfgXAb37zG84//3xmzZrF4sWLadOmDVOnTqVOnToATJ48mcGDB7Nz504GDhxY6JqfffYZt9xyC8uWLSMxMZEuXbowcuRIjjnmGNydgQMHMmXKFHbt2kWjRo146aWXaNGiReC/GxE5utndm6IdQkzwR5MPXSkgcT/sSnM+RCQWTJkyhbfffpuVK1eyYsUKHnzwQXJzc+nZsydr1qxh7dq1JCYm0r9//0Kvmzp1KhMnTmTjxo3s3r2bESNGAPDll1/St29fJk+ezPr169myZQvff/99/usSEhJ44okn2Lx5M/PmzeO9995j7NixAMycOZPZs2ezYsUKtm3bxrRp06hdu3ZwvwwRESm34j750JwPEYkF/fv35/jjjycpKYlBgwbx0ksvUbt2bbp06ULVqlU59thjGTRoEB9++GGh1/Xs2ZOTTz6ZxMRErrnmGjIzMwF45ZVXuOyyy2jXrh2VK1dm2LBhVKjwy1tG69atOeecc6hYsWJ+z0te25UqVWLHjh0sX74cd+fUU08lNTU1uF+GiIiUW3GffIiIxILjjz8+/3mjRo1Yv3492dnZ9OnTh0aNGlGjRg3atWvHTz/9xL59+/Lr1qtXL/951apV2blzJwDr168v1Ga1atUK9V6sWLGCyy67jHr16lGjRg3+8pe/sHnzZgA6dOhA//79+fOf/0zdunXp3bs327dvj9i9i4jI0UPJh4hIDPjuu+/yn69du5b69evz+OOP89VXX/Hpp5+yfft2Zs+eDYD7oTcET01NLdRmdnY2W7ZsyT/u27cvp5xyCl9//TXbt2/n4YcfLtTuzTffzMKFC/nyyy9ZsWIFjz32WFncpoiIHOWUfIiIxIAxY8bw/fffs3XrVh566CG6du3Kjh07SExM5LjjjmPr1q0MHTq0xO1dffXV/Otf/2LOnDns3r2bIUOGkJubm39+x44d1KhRg+rVq7N8+XKeeeaZ/HPz58/n008/Zc+ePVSrVo0qVaoUGrIlIiLxK+7fDTThXERiwXXXXUenTp044YQTOPHEExk8eDADBgwgJyeHOnXqcM4553DJJZeUuL3mzZszZswYrrvuOlJTU6lVq1b+KlkAI0aMYOrUqRx77LFkZGTQtWvX/HPbt28nIyODWrVq0ahRI2rXrs0dd9xRpvcrIiJHJytJ93s8SEtL8wULFkQ7DBEph5YtW8app54a7TAOqHHjxowfP56OHTtGO5TDcqDfr5ktdPe0EjShNzKRGKWldstGFJbatQOdiPueDxERERERCYaSDxERERERCYR2OBcROcqtXr062iGIiIiUiHo+REREREQkEHGffGi1KxERERGRYMR98uHu0929d82aNaMdioiIiIhITIv75ENERERERIKh5ENERERERAKh5ENERERERAKh5ENERERERAKhfT5ERA6D3b0pou37o8kRbV9ERCQa1PMhInKUa9y4MSNGjKBly5bUrFmTrl27smvXLiZNmsR5551XqK6Z8c033wBw44030q9fP377299SvXp12rZtyw8//MCAAQOoVasWp5xyCosWLSp0nUceeYRmzZpRq1Ytevbsya5duwBo0aIF06dPz6+7Z88e6tSpU+j1IiIicZ98aJ8PEYkF06ZN49///jerVq1i8eLFTJo0qcSve/DBB9m8eTOVK1emTZs2tGrVis2bN3P11VczcODAQvWnTJnC22+/zcqVK1mxYgUPPvggAN27d+d///d/8+vNmDGD1NRUzjzzzDK7RxEROfrFffKhfT5EJBbcfPPN1K9fn6SkJNLT08nMzCzR6373u9/RunVrqlSpwu9+9zuqVKlC9+7dSUhIoGvXrvv1XPTv35/jjz+epKQkBg0axEsvvQTADTfcwIwZM9i+fTsAkydPplu3bmV7kyIictSL++RDRCQW1KtXL/951apV2blzZ4lel5KSkv88MTFxv+Oi7Rx//PH5zxs1asT69esBqF+/Pm3btuXVV1/lp59+4q233uL6668/rHsREZHYpQnnIiIxqlq1amRnZ+cf//DDD0fc5nfffZf/fO3atdSvXz//uEePHowfP569e/fSpk0bGjRocMTXExGR2KKeDxGRGHX66aezdOlSMjMz2bVrF/fff/8RtzlmzBi+//57tm7dykMPPUTXrl3zz1155ZV8/vnnjBo1iu7dux/xtUREJPYo+RARiVEnn3wyQ4YMoWPHjpx00kn7rXx1OK677jo6derECSecwIknnsjgwYPzzyUmJtKlSxdWrVrFVVdddcTXEhGR2GPuHu0YyoW0tDRfsGBBtMMQkXJo2bJlnHrqqdEOI+oaN27M+PHj6dix4wHrPPDAA6xYsaLQyleHcqDfr5ktdPe0EjShNzKRGBXpPZXiRRT2jrIDndCcDxERKRNbt25lwoQJTJ48OdqhiIhIOaVhVyIicsTGjRvH8ccfz29/+1vatWsX7XBERKScitmeDzP7B/Ab4D13vzrK4YiIHPVWr159wHMZGRlkZGQEF4yIiByVYrnnYxSg5VZERERERMqJmE0+3P0DYEe04xCR2KDFOSJDv1cRkfgSePJhZu3M7A0zW2dmbmY3FlOnn5mtMrNdZrbQzM4POk4RkTyVKlUiJycn2mHEpJycHCpVqhTtMEREJCDR6PmoDnwB3ALs925uZl0JDZl6GDgT+Bh4y8waFqiTaWZfFPOoX7Q9EZEjVbduXdatW0d2dra+qS8j7k52djbr1q2jbt260Q5HREQCEviEc3efAcwAMLNJxVQZCExy93Hh45vM7BKgL3BPuI0zAghVRASAGjVqALB+/Xr27NkT5WhiR6VKlUhJScn//YqISOwrV6tdmdkxQGtgRJFTM4FzI3C93kBvgIYNGx6itojEsxo1auhDsoiIyBEqbxPO6wAJQFaR8iygXmkaMrN3gZeBzmb2vZm1KVrH3Z9z9zR3T0tODnznRxERERGRuFKuej7Kkrt3LEk9M0sH0ps2bRrhiERERERE4lt56/nYDOwDUoqUpwA/ROKC7j7d3XvXrFkzEs2LiIiIiEhYuUo+3H03sBC4qMipiwiteiUiIiIiIkepwIddmVl1IG+MUwWgoZmdAWx197XASGCymX0GzAX+BNQHno1QPBp2JSIiIiISgGj0fKQBi8KPRGBo+PkDAO7+d2AAMBjIBM4DOrv7mkgEo2FXIiIiIiLBiMY+Hx8Adog6Y4GxQcSjng8RERERkWCUqzkf0aCeDxERERGRYMR98iEiIiIiIsFQ8iEiIiIiIoGI++TDzNLN7Llt27ZFOxQRERERkZgW98mH5nyIiIiIiAQj7pMPEREREREJRtwnHxp2JSIiIiISjLhPPjTsSkREREQkGHGffIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCDiPvnQhHMRERERkWDEffKhCeciIiIiIsGI++RDRERERESCoeRDREREREQCoeRDREREREQCoeRDREREREQCEffJh1a7EhEREREJRtwnH1rtSkREREQkGHGffIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCDiPvnQJoMiIiIiIsGI++RDmwyKiIiIiASjYrQDEBERiZacnBxWrlwJwIknnkhiYmKUIxIRiW1x3/MhIiLx5+eff2bAgAEkJSVx+umn07JlS5KSkrjlllvYtWtXtMMTEYlZ6vkQEZG407dvX2bOnMn48eNp06YNAPPmzeOee+5hx44dPP/881GOUEQkNin5EBGRuPPyyy/z2muvcdFFF+WXnXDCCdStW5cuXboo+RARiRANuxIRkbhTrVo1GjRosF95gwYNNO9DRCSClHyIiEjcuemmmxg6dCg5OTn5ZTk5OQwbNoybbropipGJiMQ2DbsSEZG488knn/Dhhx/SoEEDWrZsCcCSJUvYu3cv//3vf7n88svz677xxhvRClNEJObEZPJhZscDk4G6wF5gmLu/HN2oRESkvKhTpw5dunQpVNakSZMoRSMiEj9iMvkglHAM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diUiEl8qVarEqlWrMDvoKGAREYmAuE8+tNqViEj86dGjB+PGjYt2GCIicSfu53yIiEj8+e9//8uUKVN45513aN26NdWqVSt0/qmnnopSZCIisU3Jh4iIxJ1ly5bRqlUrAL799ttC5zQcS0QkcuI++dBSuyIi8ef9998/dCURESlzmvOhOR8iIiIiIoGI++RDRERERESCoeRDREREREQCoeRDREREREQCEffJhzYZFBEREREJRtwnH5pwLiIiIiISjLhPPkREREREJBhKPkREREREJBBKPkREREREJBBKPkREREREJBBxn3xotSsRERERkWDEffKh1a5ERERERIIR98mHiIiIiIgEQ8mHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEIu6TD20yKCIiIiISjLhPPrTJoIiIiIhIMOI++RARERERkWAo+RARERERkUAo+RARERERkUAo+RARERERkUAo+RARERERkUAo+RARERERkUBUjHYAkWBmq4HtQC7wo7u3j25EIsGxuzdFO4RD8keTox2CiIiIREFMJh9h57r7zmgHISJSEkoaRUQkHmjYlYiIiIiIBCLQng8zawfcDrQG6gM93X1SkTr9gDuAVGApMMDdPyrlpRz40MxygSfdfcqRxh6P9E2siIiIiJSloIddVQe+AF4MPwoxs67AKKAfMCf88y0za+bua8N1Mik+7k7uvj78/Dx3X2dmqcC7ZrbE3ReX/e2IiIiIiEhJBZp8uPsMYAaAmU0qpspAYJK7jwsf32RmlwB9gXvCbZxRguusC//cYGYzgFaAkg8RERERkSgqN3M+zOwYQsOxZhY5NRM4txTtVDOzY8PPqwMdCA3fKq5ubzNbYGYLNm0q/0OMRERERESOZuUm+QDqAAlAVpHyLKBeKdpJAeaY2X+AT4AX3X1+cRXd/Tl3T3P3tORkzR0QEREREYmkmFtq192/BU4vaX0zSwfSmzZtGrmgRERERESkXPV8bAb2Eeq5KCgF+CFSF3X36e7eu2bNmpG6hIiIiIiIUI6SD3ffDSwELipy6iLg4+AjEhERERGRshT0Ph/VgbzxTRWAhmZ2BrA1vJTuSGCymX0GzAX+RGg/kGcjGJOGXYmIiIiIBCDono80YFH4kQgMDT9/AMDd/w4MAAYDmcB5QGd3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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import CyclicDayOfWeek\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [CyclicDayOfWeek(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CyclicDayOfWeek\")" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "5e251f04", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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RRddBMDHH3/Mz372M5599lmWLl3Kd7/7XcaPH8/IkSMZMGAA7777Lp07dy57/0UXXcSwYcOoq79fJa1b48aN+cMf/kD//v3XKlu4cCEtW7bk6aef5sADD6xQduCBB9K1a1f+8Ic/rLPt1atXs//++9OiRQv+9re/cfzxxzN16lQmTZrEFltsUcNPkndV/2Jg00o+1szn+G5KaUK5ekOA41JKO2bPDwOGk/m07sqU0gatLFNaWpomTZpUsw8hqag8/vjj9OrViyeeeILvfe97+Q6n1nzyySd06NCBM844g4svvrjW7hMRk1NKpRtQtW7+IpO0ydmY5OP1118HoHXr1hxyyCEMHTqUb3zjGxXq/etf/2L33Xfn8MMP54EHHuDll19mjz32qK3Hyad1Jh91athVTcguP7nBS1Bmx033Kf+plSRVx4wZM3jvvfc488wz6d69e8EmHgsWLODtt9/muuuuY/Xq1ZxySuW99iSpOB177LF07NiRdu3aMX36dM4//3ymTZvGuHHjKtTr3Lkz55xzDsOGDeO3v/1toSYeX2lTSj4Wkhkf3brS9dZklk/8WlJKY4AxpaWlA9dbWZKqcPHFF3PPPfew++67c/fdXzUceNP297//nQEDBtChQwfuuuuuCkOYJKmYDRr037VEdt11V7bbbjv22msvpkyZQvfu3cvKli9fzn333UfDhg157rnnSCmtc+hqoaprq12tU3YN+clkNr0q72Ayk4AkKS9GjhzJqlWrmDx5Mrvssku+w6k1/fv3J6XEBx98wNFHH53vcCSpziotLaVevXq8++67Fa6fe+65rFq1ipdffplJkyZ95RyRQlWnko+IaBwRe0TEHmRi65A9X7OU7jVA/4g4MSJ2jojryOztccu62tyAe/aJiFs/++yzjX8ASZIkFb3XXnuNL7/8skIP8dNPP81NN93EyJEj2WWXXbj66qs577zzmDGj8mrlha2uDbsqBZ4udz4s+7oL6J9S+nNENAcuJLMU5OtA75TSB1/3hg67krQhFi9ezPz581m5cuX6K2uD1K9fn1atWtGkSZN8hyKpiC1dupR//SuzoN7q1auZNWsWU6dOpVmzZnTo0IFFixYxa9YsPv30UyAzaXyrrbaiTZs2tGnThhkzZjB69Gh69+5NixYteOONNzjrrLPo1q0b++6b2b5jyZIlDBgwgNNPP53998/sjz1w4EAeeughBgwYwPjx49daBbBQ1dnVrnLN1a4krcvixYuZN28e7du3p6SkpOjG59aGlBLLly9n9uzZtG7dusoExNWuJOXC+PHjOeigg9a6fsIJJzBy5MiyZbUrW7Mk94cffshPf/pTXn/9dZYuXco222zDD3/4Q4YOHUqzZs0A+PnPf84LL7zAlClT2HLLLcvamD17Nl27dmXIkCGceeaZtfeQubfpLbWbK+VWuxpYeVyeJEHmU6527drRsGHD9VdWtSxbtow5c+ZQ1YqDJh+StMlaZ/JRHP07XyGlNCalNKhp06b5DkVSHbVy5UpKSkryHUZBKikpcSibJBWRok8+JGlDONSqdvh9laTiUvTJh6tdSdKG6dSpE0888US+w5AkbcKKPvlw2JUkSZKUG3VtqV1J2iS8eMD2tdr+3hOKa913SVJxMPmQpE1cp06dOOmkkxg1ahRz587l8MMP5+abb2b58uX069ePl156iVWrVrHvvvtyyy238M1vfhOAAw88kP3335+nnnqKadOmsc8++3DvvffSokULAEaNGsWFF17I0qVLGTx4cIV7vvzyy5x++um8+eablJSUcNRRR3HNNdewxRZbkFJi8ODBjB49mhUrVtCxY0fuu+8+unbtmvPvjaRNW5y3IN8hFIR0Rct8h1Cm6IddOedDUiEYPXo0jz32GDNmzOCdd97hkksuYfXq1QwYMIAPPviAWbNmUVJSwqmnnlrhfffeey933nkn8+fP54svvmD48OEAvPHGG5x88smMGjWKOXPm8O9//5uPPvqo7H316tXj97//PQsXLuSFF17gySef5KabbgJg3LhxTJgwgXfeeYfPPvuM+++/n+bNm+fumyFJqrOKPvlwzoekQnDqqaeyzTbb0KxZMy644ALuu+8+mjdvzlFHHUXDhg35xje+wQUXXMAzzzxT4X0DBgxghx12oKSkhGOOOYapU6cC8OCDD3LooYdywAEH0KBBAy6++OIKu+/uueee7L333my++eZlPS9r2q5fvz5LlizhrbfeIqXEzjvvTNu2bXP3zZAk1VlFn3xIUiHYZpttyo47duzInDlzWLZsGSeddBIdO3akSZMmHHDAAXz66ad8+eWXZXXbtGlTdtywYUOWLl0KwJw5cyq02ahRowq9F++88w6HHnoobdq0oUmTJvzmN79h4cKFAPTo0YNTTz2VX/7yl7Rq1YpBgwaxePHiWnt2SdKmw+RDkgrAhx9+WHY8a9Ys2rVrx9VXX83bb7/NSy+9xOLFi5kwYQIAKa1/Q/C2bdtWaHPZsmX8+9//Ljs/+eST2WmnnXj33XdZvHgxl112WYV2f/WrXzF58mTeeOMN3nnnHa666qqaeExJ0ibO5EOSCsCNN97IRx99xKJFi7j00kvp27cvS5YsoaSkhK222opFixYxbNiwDW7v6KOP5v/+7/947rnn+OKLLxgyZAirV68uK1+yZAlNmjShcePGvPXWW9x8881lZa+88govvfQSK1eupFGjRmy55ZYVhmxJkopX0f82cMK5pEJw7LHH0qtXL7bbbju23357LrzwQs444wyWL19OixYt2HvvvfnBD36wwe3tsssu3HjjjRx77LG0bduWrbfeumyVLIDhw4dz77338o1vfIOBAwfSt2/fsrLFixczcOBAtt56azp27Ejz5s0555xzavR5JUmbptiQ7vdiUFpamiZNmpTvMCTVQW+++SY777xzvsNYp06dOnH77bfTs2fPfIfytazr+xsRk1NKpRvQhL/IpALlUrs1Iw9L7ca6Coq+50OSJElSbph8SJIkScoJdziXpE3c+++/n+8QJEnaIPZ8SJIkScqJok8+XO1KkiRJyo2iTz5SSmNSSoOaNm2a71AkSZKkglb0yYckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOuM+HJH0Ncd6CWm0/XdGyVtuXJCkf7PmQpE1cp06dGD58OLvtthtNmzalb9++rFixgpEjR7LffvtVqBsR/Otf/wKgf//+nHLKKRxyyCE0btyYfffdl48//pgzzjiDrbfemp122olXX321wn0uv/xyunTpwtZbb82AAQNYsWIFAF27dmXMmDFldVeuXEmLFi0qvF+SpKJPPtznQ1IhuP/++/nHP/7BzJkzmTZtGiNHjtzg911yySUsXLiQBg0asM8++9C9e3cWLlzI0UcfzeDBgyvUHz16NI899hgzZszgnXfe4ZJLLgHg+OOP55577imrN3bsWNq2bUu3bt1q7BklSZu+ok8+3OdDUiH41a9+Rbt27WjWrBl9+vRh6tSpG/S+I444gj333JMtt9ySI444gi233JLjjz+eevXq0bdv37V6Lk499VS22WYbmjVrxgUXXMB9990HwE9/+lPGjh3L4sWLARg1ahT9+vWr2YeUJG3yij75kKRC0KZNm7Ljhg0bsnTp0g16X+vWrcuOS0pK1jqv3M4222xTdtyxY0fmzJkDQLt27dh333156KGH+PTTT3n00Uc57rjjvtazSJIKlxPOJalANWrUiGXLlpWdf/zxxxvd5ocfflh2PGvWLNq1a1d2fsIJJ3D77bezatUq9tlnH9q3b7/R95MkFRZ7PiSpQO2+++5Mnz6dqVOnsmLFCi666KKNbvPGG2/ko48+YtGiRVx66aX07du3rOzwww9nypQpXHfddRx//PEbfS9JUuEx+ZCkArXDDjswZMgQevbsybe+9a21Vr76Oo499lh69erFdtttx/bbb8+FF15YVlZSUsJRRx3FzJkzOfLIIzf6XpKkwhMppXzHUCeUlpamSZMm5TsMSXXQm2++yc4775zvMPKuU6dO3H777fTs2XOddX73u9/xzjvvVFj5an3W9f2NiMkppdINaMJfZFKBqu09lYpFHvaOinUVOOdDklQjFi1axIgRIxg1alS+Q5Ek1VEOu5IkbbTbbruNbbbZhkMOOYQDDjgg3+FIkuqogu35iIi/AAcCT6aUjs5zOJK0yXv//ffXWTZw4EAGDhyYu2AkSZukQu75uA5wuRVJkiSpjijY5COlNB5Yku84JBUGF+eoHX5fJam45Dz5iIgDIuKRiJgdESki+ldR55SImBkRKyJickTsn+s4JWmN+vXrs3z58nyHUZCWL19O/fr18x2GJClH8tHz0Rh4HTgdWOu3eUT0JTNk6jKgG/A88GhEdChXZ2pEvF7Fq13l9iRpY7Vq1YrZs2ezbNkyP6mvISklli1bxuzZs2nVqlW+w5Ek5UjOJ5ynlMYCYwEiYmQVVQYDI1NKt2XPT4uIHwAnA+dn29gjB6FKEgBNmjQBYM6cOaxcuTLP0RSO+vXr07p167LvrySp8NWp1a4iYgtgT2B4paJxwHdq4X6DgEEAHTp0WE9tScWsSZMm/pEsSdJGqmsTzlsA9YB5la7PA9pUp6GIeAJ4AOgdER9FxD6V66SUbk0plaaUSlu2zPnOj5IkSVJRqVM9HzUppdRzQ+pFRB+gT+fOnWs5IkmSJKm41bWej4XAl0DrStdbAx/Xxg1TSmNSSoOaNm1aG81LkiRJyqpTyUdK6QtgMnBwpaKDyax6JUmSJGkTlfNhVxHRGFgzxmkzoENE7AEsSinNAq4BRkXEy8BE4BdAO+CWWorHYVeSJElSDuSj56MUeDX7KgGGZY9/B5BS+jNwBnAhMBXYD+idUvqgNoJx2JUkSZKUG/nY52M8EOupcxNwUy7isedDkiRJyo06NecjH+z5kCRJknKj6JMPSZIkSblh8iFJkiQpJ4o++YiIPhFx62effZbvUCRJkqSCVvTJh3M+JEmSpNwo+uRDkiRJUm4UffLhsCtJkiQpN4o++XDYlSRJkpQbRZ98SJIkScoNkw9JkiRJOWHyIUmSJCknij75cMK5JEmSlBtFn3w44VySJEnKjaJPPiRJkiTlhsmHJEmSpJww+ZAkSZKUEyYfkiRJknKi6JMPV7uSJEmScqPokw9Xu5IkSZJyo+iTD0mSJEm5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSThR98uEmg5IkSVJuFH3y4SaDkiRJUm5snu8AJEnKl+XLlzNjxgwAtt9+e0pKSvIckSQVtqLv+ZAkFZ/PP/+cM844g2bNmrH77ruz22670axZM04//XRWrFiR7/AkqWDZ8yFJKjonn3wy48aN4/bbb2efffYB4IUXXuD8889nyZIl3HHHHXmOUJIKk8mHJKnoPPDAAzz88MMcfPDBZde22247WrVqxVFHHWXyIUm1xGFXkqSi06hRI9q3b7/W9fbt2zvvQ5JqkcmHJKnonHbaaQwbNozly5eXXVu+fDkXX3wxp512Wh4jk6TC5rArSVLRefHFF3nmmWdo3749u+22GwCvvfYaq1at4j//+Q+HHXZYWd1HHnkkX2FKUsEpyOQjIrYBRgGtgFXAxSmlB/IblSSprmjRogVHHXVUhWvbbrttnqKRpOJRkMkHmYTjjJTS1IhoA0yOiLEppf/kOzBJUv7deeed+Q5BkopSQSYfKaW5wNzs8ccRsRBoBph8SJIkSXmS8+QjIg4Azgb2BNoBA1JKIyvVOQU4B2gLTCfTi/Hs17zfnkC9lNKHGxO3JKlw7LrrrkTEOsunTZuWw2gkqXjko+ejMfA6cHf2VUFE9AWuA04Bnst+fTQiuqSUZmXrTKXq2HullOaUa6tZ9h4Da/ohJEmbrqOPPrrC+cqVK5k6dSoTJ07kl7/8ZZ6ikqTCl/PkI6U0FhgLEBEjq6gyGBiZUrote35aRPwAOBk4P9vGHuu7T0Q0AP4KXJFSen4ddQYBgwA6dOhQvQeRJG2yhg4dWuX1q666ig8++CDH0UhS8ahT+3xExBZkhmONq1Q0DvhONdoJYCTwVEpp1LrqpZRuTSmVppRKW7Zs+TUiliQVkiOPPJLRo0fnOwxJKlh1KvkAWgD1gHmVrs8D2lSjnX2BvsDhETE1+9q1hmKUJBWoCRMm0LBhw3yHIUkFq1BXu3qODUysIqIP0Kdz5861G5Qkqc4ov4kgQEqJuXPn8uqrr65zSJYkaePVteRjIfAl0LrS9dbAx7Vxw5TSGGBMaWmpk9IlqUg0b968wvlmm23GLrvswmWXXUavXr3yFJUkFb46lXyklL6IiMnAwUD5HckPBh6qjXva8yFJxcdNBiUpP3I+5yMiGkfEHhGxR/b+HbLna5abugboHxEnRsTOEXEdmf1AbqmNeFJKY1JKg5o2bVobzUuS6rgrrriCTz/9NN9hSFJRyMeE81Lg1eyrBBiWPf4dQErpz8AZwIXAVGA/oHdKybUPJUk17rLLLmPRokX5DkMFqFOnTkTEWq8f/vCHQGaBg8MOO4z27dsTEYwcObLC+5ctW8YOO+zAaaedVuH6vHnzaNmyJVdccUWuHkWqMTlPPlJK41NKUcWrf7k6N6WUOqWUGqSU9kwpTaiteCKiT0Tc+tlnn9XWLSRJdVhKKd8hqEC98sorzJ07t+w1ZcoUIoJjjjkGgKVLl9K1a1euu+46SkpK1np/w4YNueuuu7jlllt48skny66feOKJ7LDDDvz617/O2bNINaVOzfnIByecS5Kk2lB5D7ERI0bQpEmTsuSjd+/e9O7dG4D+/ftX2cY+++zDWWedxYABA3jttdd46KGHeOqpp/jnP//JZpvVtR0TpPXzX60kqai98cYbdOzYMd9hqMCllBgxYgQ//elPq+zl+Cq/+93vaNq0Kf369ePMM8/kqquuwoVytKkq+uTDYVeSVNy22WYb6tWrl+8wVOAef/xxZs6cycCB1R9oscUWW3DDDTcwZswY9thjD04++eRaiFDKjQ3diG/niPhdRDwTER9ExPyImB4RoyLi2IhoUNuB1hZXu5Kk4rDZZptRr169DXpJNe22227j29/+NrvvvvvXev+IESNo2LAhb775JgsXLqzh6KTc+co5HxHRHbiSzIpTE4HngQeB5UAzoCtwKXBDRFwJXJtS+rxWI5Yk6Wu4//77iQggs1rQkCFDOOKII9hnn30AeOGFF/jrX//KsGHD8hmmCtD8+fP529/+xo033vi13v+Xv/yF+++/n4kTJ3LSSSdx8skn8+CDD9ZwlFJurG/C+V/IJB//m1L6ZF2VImIf4EzgbDLJiCRJdcrRRx9ddnzYYYdx+eWXVxgC87Of/Yz/+Z//4a9//SunnHJKPkJUgRo5ciQNGjTgJz/5SbXfO3/+fE466SSGDBlCaWkpd911F3vuuSf33Xff12pPyrf1Dbv6Vkrpxq9KPABSSi+klI4Brqq50HLDOR+SVHyeeuopDu/gAOYAACAASURBVDrooLWuH3TQQYwfPz73AalgpZS4/fbb+fGPf0zjxo0rlC1dupSpU6cydepUVq9ezaxZs5g6dSqzZs0qq/OLX/yCbbfdlvPOOw+Arl27MmzYME477TTmzZuX02eRasJXJh8ppS++qjwi6lenfl3knA9JKj4tWrSoctjKgw8+uNbyqNLGGD9+PO+++26VE80nTZpEt27d6NatG8uXL2fo0KF069aNIUOGADBq1CgeffRR7rrrrgpzkc455xy+9a1vMWjQoJw9h1RTYkM3V4qIXwGzU0oPZc9HACcAM4DDUkpv11qUOVBaWpomTZqU7zAkSVkRMTmlVLoBVau9S+Ddd9/NgAED6NmzZ9mcjxdffJEnnniCESNGcMIJJ1S3SUm1IM5bkO8QCkK6IucfqsS6Cqqz1O6vgAUAEXEAcAxwLDAVuHpjopMkKZeOP/54nn/+eVq0aMEjjzzCI488QvPmzZk4caKJhyTVourscN4emJk97gM8kFK6PyJeA56t8cgkSapFe+21F6NHj853GJJUVKrT87EYaJU9Phh4Mnu8EtiyJoPKJSecS1JxmjdvHsOHD+eUU04p2zdh4sSJzJw5cz3vlCR9XdVJPsYBt0XE7UBn4NHs9V34b4/IJscJ55JUfCZPnsyOO+7I6NGjuf3221m8eDGQ2YX6ggsuyHN0klS4qpN8/JLMRoMtgaNTSouy17sD99V0YJIk1Zazzz6b008/nVdffZUGDRqUXf/+97/PxIkT8xiZJBW2DZ7zkVJaDJxWxfWhNRqRJEm1bPLkyYwYMWKt623btnXvhALlqkk1Iw+rJqnAfGXPR0R8ozqNVbe+JEn5UFJSwiefrL1/7ltvvUWrVq2qeIckqSasb9jVuxFxYUR8c10VImKziDgkIh4nMzRLkqQ67Uc/+hHDhg3j888/ByAieP/99zn33HM56qij8hydJBWu9Q272h+4FHgvu6TuJGAOsALYGugC7A0sBy4Dbqu9UGtHRPQB+nTu3DnfoUiScmT48OH07t2bli1bsmzZMvbbbz/mzZvHvvvuyyWXXJLv8CSpYH1l8pFSehc4JiK2IbOp4P7A/wAlwELgVeBWYGxKaXUtx1orUkpjgDGlpaUD8x2LJCk3mjRpwnPPPcdTTz3FlClTWL16Nd27d6dnz575Dk2SCtoGTThPKX1IZhdzdzKXJBWMHj160KNHj3yHIUlFozpL7UqSVDBuuukmdtllFxo2bMh7770HwBVXXMH999+f58gkqXBt8FK7krSpevGA7fMdwnrtPWFGvkMoKtdeey1XXnkl5557Luedd17Z9fbt2/OHP/yBY445Jo/RSVLhsudDklR0brnlFm677TZOP/10Nt/8v5/Dde/enenTp+cxMkkqbCYfkqSi88EHH9C1a9e1rtevX5/ly5fnISJJKg4mH5KkorPddtsxZcqUta6PHTuWLl265CEiSSoO1ZrzERGtgX7A9sBvU0oLI2JfYE5KaWZtBFjb3OdDkorP2WefzamnnsqyZctIKfHCCy8watQorrzySu644458hydJBWuDk4+I2BN4EpgJ7AJcRWavj4OBHYBjayPA2uY+H5JUfAYMGMCqVav4zW9+w7Jly+jXrx/t2rXj+uuvp2/fvvkOT5IKVnV6PoYD16WUhkbEknLXHwMG1GxYkiTVroEDBzJw4EAWLlzI6tWradWqVb5DkqSCV53kY0/g51Vcnwu0rplwJEnKnRkzZvDmm28C0KVLF7bbbrs8RyRJha06ycdyYOsqru8EzK+ZcCRJqn3//ve/+fnPf84jjzzCZptl1l5JKXHooYdyxx130Lx58zxHKEmFqTqrXf0NGBoRDbLnKSI6Af8PeKiG45IkqdaceOKJ/Otf/+LZZ59lxYoVrFixggkTJjBz5kwGDqx7UwAvuugiIqLCq02bNmXlS5cu5bTTTuOb3/wmJSUl7Ljjjvz+978vK//4449p0aIFV199dYV2p0+fzpZbbsmf/vSnnD2LpOJWnZ6Ps4GxwAKgIfAcmeFWE4ELaz40qW7ZFHbJBnfKljbEY489xpNPPsk+++xTdm3fffflj3/8Iz179sxjZOu24447Mn78+LLzevXqlR0PHjyYJ554glGjRrHtttsyYcIEBg4cSIsWLejXrx9t2rThxhtvpH///hxyyCF06dKFlStXcvzxx3P44Yfz4x//OA9PJKkYbXDykVJaDOwXET2A7mR6TaaklJ6oreAkSaoNLVu2pFGjRmtdb9iwYZ0dcrX55ptX6O0o7/nnn6dfv34cdNBBAHTq1IkRI0bw0ksv0a9fPwD69u3LX/7yF44//nhefPFFLr74YubOncvjjz+es2eQpGpvMphSeiqlNDyldKWJhyRpUzRkyBDOOOMMZs+eXXZt9uzZnHXWWQwZMiSPka3be++9R7t27dh222358Y9/zHvvvVdWtt9++zFmzBg+/PBDIJOMTJ06lR/84AcV2rjpppuYPXs2xx13HJdffjm33347zZo1y+lzSCpu1d1ksBtwENCKSolLSunXNRjX1xYRWwFPkHm2zcksD3xbfqOSJNUl1157Le+//z6dOnWiffv2QCb52HLLLZk/fz7XX399Wd1p06blK8wye+21FyNHjmSnnXZi/vz5XHLJJXznO99h+vTpNG/enOuvv56TTjqJDh06sPnmmV/tN9xwA4ceemiFdpo1a8bll1/OgAED6NevH717987H40gqYtXZZPDXwBXAB8A8IJUrTlW+KT+WAAeklJZFRCPg9Yh4OKX073wHJkmqG44++uh8h1AthxxySIXzvffem+2224677rqLwYMHc8MNN/D888/zyCOP0LFjRyZMmMDZZ59Np06dKvR+rF69mjvvvJOGDRvyyiuvsGLFCrbccstcP46kIladno8zgZNTSn+srWBqQkrpS2BZ9rQBENlXneHEZUnKr6FDh+Y7hI3SuHFjdtllF959912WL1/O+eefzwMPPECfPn0A2G233Zg6dSrDhw+vkHxce+21vPbaa7zyyit8//vf54ILLlhrBSxJqk3VmfOxGfDkxtwsIg6IiEciYnZEpIjoX0WdUyJiZkSsiIjJEbH/17jPVhHxT+Aj4KqU0sKNiVuSVFgWLFjAggULys5fe+01LrzwQu677748RrXhVqxYwVtvvUXbtm1ZuXIlK1eurLD6FWRWw1q9enXZ+ZtvvskFF1zADTfcQJcuXRgxYgTXXXcdEydOzHX4kopYdZKPm4EBG3m/xsDrwOlkNi2sICL6AtcB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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import CyclicDayOfMonth\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [CyclicDayOfMonth(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CyclicDayOfMonth\")" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "658c9bb5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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W7NmzazniYmJ7N69G4D169fnqLN8+fI5ei9WrFjBlVdeSc2aNalQoQJ/+tOf2LJlCwDt27fnrrvu4s4776R69er06tWLnTt3RuzeRUSk+FDyISISA77//vus52vXrqV27do89thjLF++nM8++4ydO3cyZ84cANyPvyF4rVq1ctS5d+9efvzxx6zj3r1706RJE7755ht27tzJiBEjctT7xz/+kbS0NL788ktWrFjB3/72t8K4TRERKeaUfIiIxICnn36aH374ga1bt/LII4/QrVs3du3aRUJCApUqVWLr1q0MGzYs3/Vdf/31/Pe//2Xu3Lns37+fIUOGkJmZmXV9165dVKhQgaSkJL7++mueeeaZrGuff/45n332GQcOHKB8+fKUK1cux5AtERGJX3H/10ATzkUkFnTv3p1OnTrRsGFDGjVqxAMPPEC/fv3IyMggOTmZCy64gMsuuyzf9TVt2pSnn36a7t27U6tWLSpXrpy1ShbAqFGjmDhxIqeccgo9e/akW7duWdd27txJz549qVy5MvXr16dq1aoMHDiwUO9XRESKJ8tP93s8SElJ8dTU1GiHISJF0FdffcWZZ54Z7TCOqkGDBjz//PN06NAh2qGckKO9v2aW5u4p+ahCf8hEYpSW2i0cUVhq1452Ie57PkREREREJBhKPkREREREJBDa4VxEpJhbvXp1tEMQERHJF/V8iIiIiIhIIOI++dBqVyIiIiIiwYj75MPdp7h7r4oVK0Y7FBERERGRmBb3yYeIiIiIiARDyYeIiIiIiARCyYeIiIiIiARCyYeIiIiIiARC+3yIiJwAu29zROv3kdUiWr+IiEg0qOdDRKSYa9CgAaNGjeLss8+mYsWKdOvWjX379jFu3DguuuiiHGXNjG+//RaAW2+9lTvuuIPLL7+cpKQk2rRpw8aNG+nXrx+VK1emSZMmLFq0KEc7f/nLXzjrrLOoXLkyPXr0YN++fQA0a9aMKVOmZJU9cOAAycnJOV4vIiIS98mH9vkQkVjw2muv8f7777Nq1SqWLFnCuHHj8v264cOHs2XLFsqWLUvr1q1p1aoVW7Zs4frrr6d///45yk+YMIEPPviAlStXsmLFCoYPHw7AzTffzCuvvJJVburUqdSqVYuWLVsW2j2KiEjxF/fJh/b5EJFY8Mc//pHatWtTpUoVunTpwuLFi/P1umuvvZZzzz2XcuXKce2111KuXDluvvlmSpYsSbdu3Y7oubjrrruoW7cuVapUYfDgwUyaNAmA3/zmN0ydOpWdO3cCMH78eH77298W7k2KiEixF/fJh4hILKhZs2bW88TERHbv3p2v19WoUSPreUJCwhHHueupW7du1vP69euzfv16AGrXrk2bNm1444032L59O++99x433XTTCd2LiIjELk04FxGJUeXLl2fv3r1Zxxs3bjzpOr///vus52vXrqV27dpZx7fccgvPP/88Bw8epHXr1tSpU+ek2xMRkdiing8RkRh1zjnn8MUXX7B48WL27dvHgw8+eNJ1Pv300/zwww9s3bqVRx55hG7dumVdu+aaa1i4cCGjR4/m5ptvPum2REQk9ij5EBGJUaeffjpDhgyhQ4cOnHbaaUesfHUiunfvTqdOnWjYsCGNGjXigQceyLqWkJBA165dWbVqFdddd91JtyUiIrHH3D3aMRQJKSkpnpqaGu0wRKQI+uqrrzjzzDOjHUbUNWjQgOeff54OHToctcxDDz3EihUrcqx8dTxHe3/NLM3dU/JRhf6QicSoSO+pFC+isHeUHe2C5nyIiEih2Lp1Ky+88ALjx4+PdigiIlJEadiViIictLFjx1K3bl0uv/xy2rVrF+1wRESkiIrZng8z+w9wMfChu18f5XBERIq91atXH/Vaz5496dmzZ3DBiIhIsRTLPR+jAS23IiIiIiJSRMRs8uHus4Fd0Y5DRGKDFueIDL2vIiLxJfDkw8zamdk7ZrbOzNzMbs2jzB1mtsrM9plZmpm1DTpOEZHDSpcuTUZGRrTDiEkZGRmULl062mGIiEhAotHzkQQsA/oCR/w1N7NuhIZMjQBaAp8A75lZvWxlFpvZsjwetXPXJyJysqpXr866devYu3evvqkvJO7O3r17WbduHdWrV492OCIiEpDAJ5y7+1RgKoCZjcujSH9gnLuPDR/3MbPLgN7A/eE6WgQQqogIABUqVABg/fr1HDhwIMrRxI7SpUtTo0aNrPdXRERiX5Fa7crMygDnAqNyXZoGXBiB9noBvQDq1at3nNIiEs8qVKigD8kiIiInqahNOE8GSgLpuc6nAzULUpGZzQBeBzqb2Q9m1jp3GXd/zt1T3D2lWrXAd34UEREREYkrRarnozC5e4f8lDOzLkCXxo0bRzgiEREREZH4VtR6PrYAh4Aauc7XADZGokF3n+LuvSpWrBiJ6kVEREREJKxIJR/uvh9IAzrmutSR0KpXIiIiIiJSTAU+7MrMkoDDY5xKAPXMrAWw1d3XAo8D481sATAPuB2oDTwboXg07EpEREREJADR6PlIARaFHwnAsPDzhwDc/VWgH/AAsBi4COjs7msiEYyGXYmIiIiIBCMa+3zMBuw4ZcYAY4KIRz0fIiIiIiLBKFJzPqJBPR8iIiIiIsGI++RDRERERESCoeRDREREREQCEffJh5l1MbPnduzYEe1QRERERERiWtwnH5rzISIiIiISjLhPPkREREREJBhxn3xo2JWIiIiISDDiPvnQsCsRERERkWDEffIhIiIiIiLBUPIhIiIiIiKBUPIhIiIiIiKBiPvkQxPORURERESCEffJhyaci4iIiIgEI+6TDxERERERCYaSDxERERERCYSSDxERERERCYSSDxERERERCUTcJx9a7UpEREREJBhxn3xotSsRERERkWDEffIhIiIiIiLBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBiPvkQ5sMioiIiIgEI+6TD20yKCIiIiISjFLRDkBERCRaMjIyWLlyJQCNGjUiISEhyhGJiMS2uO/5EBGR+PPTTz/Rr18/qlSpwjnnnMPZZ59NlSpV6Nu3L/v27Yt2eCIiMUs9HyIiEnd69+7NtGnTeP7552ndujUA8+fP5/7772fXrl3861//inKEIiKxScmHiIjEnddff50333yTjh07Zp1r2LAh1atXp2vXrko+REQiRMOuREQk7pQvX546deoccb5OnTqa9yEiEkFKPkREJO706dOHYcOGkZGRkXUuIyODhx9+mD59+kQxMhGR2KZhVyIiEnc+/fRTPvroI+rUqcPZZ58NwNKlSzl48CB79uzhqquuyir7zjvvRCtMEZGYE5PJh5nVBcYD1YGDwMPu/np0oxIRkaIiOTmZrl275jh36qmnRikaEZH4EZPJB6GEo5+7LzazmkCamU119z3RDkxERKLvxRdfjHYIIiJxKSaTD3ffAGwIP99oZluAKoCSDxERERGRKAk8+TCzdsA9wLlAbaCHu4/LVeYOYCBQC/iCUC/GxyfY3rlASXf//mTiFhGR2NG8eXPM7KjXlyxZEmA0IiLxIxo9H0nAMuDl8CMHM+sGjAbuAOaG/33PzM5y97XhMovJO/ZO7r4+W11Vwm30LOybEBGR4uv666/PcXzgwAEWL17MvHnzuPPOO6MUlYhI7As8+XD3qcBUADMbl0eR/sA4dx8bPu5jZpcBvYH7w3W0OF47ZlYWeAsY6e6fHKVML6AXQL169Qp2IyIiUmwNHTo0z/N/+9vfWLNmTcDRiIjEjyK1z4eZlSE0HGtarkvTgAsLUI8B44CZ7j7+aOXc/Tl3T3H3lGrVqp1AxCIiEkuuu+46JkyYEO0wRERiVpFKPoBkoCSQnut8OlCzAPW0AboB15jZ4vCjeSHFKCIiMWrOnDkkJiZGOwwRkZgVq6tdzSWfiZWZdQG6NG7cOLJBiYhIkZF9E0EAd2fDhg0sWrToqEOyRETk5BW15GMLcAioket8DWBjJBp09ynAlJSUFE1KFxGJE1WrVs1xXKJECZo2bcqIESPo1KlTlKISEYl9RSr5cPf9ZpYGdASy70jeEXgjEm2q50NEJP5ok0ERkegIfM6HmSWZWQszaxFuv174+PByU48Dt5rZH8zsTDMbTWg/kGcjEY+7T3H3XhUrVoxE9SIiUsSNHDmS7du3RzsMEZG4EI0J5ynAovAjARgWfv4QgLu/CvQDHgAWAxcBnd1dax+KiEihGzFiBFu3bo12GCIicSEa+3zMBo6+rWyozBhgTBDxaNiViEh8c/dohyAiEjeK2lK7gdOwKxERERGRYBSpCeciIiJB+/LLL6ldu3a0wxARiQtx3/NhZl3M7LkdO3ZEOxQREYmCunXrUrJkyWiHISISF/K7Ed+ZZvaQmX1kZmvMbJOZfWFm482su5mVjXSgkaJhVyIi8aFEiRKULFkyXw8REYmMYw67MrNWwKOEVpyaB3wCTAYygCpAM+AR4EkzexR4wt1/imjEIiIiJ+C1117DLLTeSXp6OkOGDOHaa6+ldevWAMyfP5+33nqLYcOGRTNMEZGYZsda5cPM1hBKPia6+7ZjlGsN3A38n7s/UuhRBiAlJcVTU1OjHYaIiISZWZq7p+SjaIGXq7rqqqvo0qULPXv2zHF+7NixvPXWW7z77rsFrVJEIsDu2xztEGKCj6wWdJNHXdn2eMOuTnP3p4+VeAC4+3x3vwH424lEF02a8yEiEn9mzpzJJZdccsT5Sy65hNmzZwcfkIhInDhm8uHu+4913cxKF6R8UaQ5HyIi8Sc5OZnJkycfcX7y5MlUqxb4N4QiInEj30vtmtkfgXXu/kb4+AXgFjNbCVzl7ssjFKOIiEiheuihh+jRowezZs3KmvPx6aefMmPGDF544YUoRyciErsKstTuH4HNAGbWDrgB6A4sBh4r/NBEREQi4+abb+aTTz4hOTmZd955h3feeYeqVasyb948brnllmiHJyISswqyyWAdYFX4eRfgdXd/zcyWAh8XemQiIiIRdP755zNhwoRohyEiElcK0vOxE6geft4R+DD8/ABQrjCDCpImnIuIxKf09HRGjRrFHXfcwZYtWwCYN6Eo6IgAACAASURBVG8eq1atOs4rRUTkRBUk+ZgGjDWz54HGwHvh8035X49IsaMJ5yIi8SctLY0zzjiDCRMm8Pzzz7Nz504Apk+fzuDBg6McnYhI7CpI8nEnoY0GqwHXu/vW8PlWwKTCDkxERCRS7rnnHvr27cuiRYsoW7Zs1vlf/vKXzJs3L4qRiYjEtnzP+XD3nUCfPM4PLdSIREREIiwtLS3PVa1q1apFenp6FCISEYkPx+z5MLNTClJZQcuLiIhEQ0JCAtu2Hbl/7tdff0316tXzeIWIiBSG4w27+sbMHjCznx2tgJmVMLPLzWw6oaFZIiIiRdrVV1/NsGHD+OmnnwAwM1avXs2gQYPo2rVrlKOT4ugvf/kL5513HhUqVKBatWp06dKFZcuWZV0/cOAAgwYN4uyzz6Z8+fLUqlWL7t27s3bt2qwyW7dupU+fPjRp0oSEhATq1q1L7969+fHHH7PKLFu2jHLlyvHGG2/kaH/GjBmULl1awwalyDte8tEWOBv4zszSzOyfZjbUzAaZ2UgzewfYCDwLTAYejXC8hU6rXYmIxJ9Ro0axdetWqlWrxt69e7noooto3LgxlSpVYvjw4dEOT4qh2bNnc8cdd/DJJ58wc+ZMSpUqRYcOHdi6NTRFdu/evSxcuJDBgwezcOFC3n77bb7//nsuu+wyDh48CMD69etZt24djz76KEuXLuWVV15hzpw53HjjjVntNGvWjGHDhnH77bdnDRHcsWMHPXr0YMCAAbRp0yb4mxcpAHP34xcyq0toU8G2QH0gAdgCLAI+AKa6e2YE44y4lJQUT01NjXYYIiISZmZp7p6Sj6LH/0N2FDNnzmThwoVkZmbSqlUrOnTocKJVieSwe/duKlasyFtvvUWXLl3yLPPll1/StGlTlixZQvPmzfMsM3XqVK688kq2b99OhQoVAMjMzKRt27YkJyfz9ttvc/PNN7N48WJSU1MpU6ZMxO4pGuy+zdEOISb4yGpBN2lHu5CvCefu/j2hXcy1k7mIiMSM9u3b0759+2iHITFo165dZGZmUrly5aOWObzE8/HKlC1blsTExKxzJUqU4KWXXuKcc87hpptu4vXXX2fBggUxl3hIbCrIUrsiIiIxY8yYMTRt2pTExES+++47AEaOHMlrr70W5cgkFvTt25cWLVrQunXrPK/v37+fAQMG0KVLF372s7yn1m7fvp0///nP9OzZk1Klcn5f3LhxYwYOHMjEiRO57777aNGiRaHfg0gkKPkQEZG488QTTzB8+HB69epF9uHHderU4amnnopiZBIL+vfvz9y5c3njjTcoWbLkEdcPHjzIb37zG7Zv386LL76YZx27d++mS5cu1KlTh0cfPXJKbUZGBpMmTSIxMZG5c+eSn2H0IkWBkg8REYk7zz77LGPHjqVv3745vlFu1aoVX3zxRRQjk+Lu7rvvZtKkScycOZOGDRsecf3gwYPceOONLFmyhA8//JCqVaseUWb37t107twZgP/+97+UK1fuiDKDBg3i4MGDLFiwgNTUVCXNUmzke5NBEZHi6tN2jaIdwnFdMGdltEOIK2vWrKFZs2ZHnC9dujQZGRlRiEhiQd++fXn11VeZNWsWTZo0OeL6gQMH+PWvf82yZcuYPXs2NWvWPKLMrl27uPzyy3F33n//fZKSko4oM2vWLMaMGcOsWbNo2rQpjz32GP369aNz5840alT0f99JfFPPh4iIxJ2GDRuycOHCI85PnTqVs846KwoRSXF355138uKLLzJx4kQqV67Mxo0b2bhxI7t37wZCPR6/+tWv+PTTT5k0aRJmllXmcMK7a9cuOnXqxLZt2xg3bhx79uzJKrN///6sMj169KBv3760bdsWgJ49e9K2bVt69OhBZmaxXnxU4kCBkg8zq2Fm95jZM2aWHD7XxsxOjUx4kad9PkRE4s8999zDXXfdxYQJE3B35s+fz7Bhwxg8eDADBw6MdnhSDI0ZM4Zdu3Zx6aWXUqtWrazHqFGjAPjhhx94++23Wb9+Peeee26OMq+++ioAaWlpfPrpp3z55ZecfvrpOcp88sknAPTr14/ExEQeeeSRHO2/8MILLF26lNGjRwd74yIFlK99PgDM7FzgQ2AV0BRo4u7fmdmDwOnu3j1iUQZA+3yIxC4NuyqeIr3Px9ixYxk+fDjff/89ALVr12bYsGH8/ve/P5HqRCQCtM9H4Sh2+3yEjQJGu/tQM9uV7fwHQI8TjUxERCQaevbsSc+ePdmyZQuZmZlUr1492iGJiMS8giQf5wJ5fR20AahROOGIiIgEZ+XKlXz11VcAnHXWWXmuTiQiIoWnIMlHBpDXFpxNgE2FE46IiEjk/fjjj/z+97/nnXfeoUSJ0PRHd+fKK6/kX//6V57Ln4qIyMkryITzt4GhZlY2fOxm1gD4K/BGIcclIiISMX/4wx/49ttv+fjjj9m3bx/79u1jzpw5rFq1ip49e0Y7PBGRmFWQno97gKnAZiARmEtouNU84IHCD01ERCQyPvjgAz788ENat26dda5Nmzb885//pEOHDlGMTEQktuU7+XD3ncBFZtYeaEWo12Shu8+IVHAiIiKRUK1aNcqXL3/E+cTERA25ilFaNalwRGHVJIkxBd5k0N1nuvsod39UiYeIiBRHQ4YMoV+/fqxbty7r3Lp16xgwYABDhgyJYmQiIrGtIMOuMLOWwCVAdXIlLu5+byHGdcLMrBIwg9C9lSK0PPDY6EYlIiJFyRNPPMHq1atp0KABderUAULJR7ly5di0aRP/+Mc/ssouWbIkWmGKiMScfCcfZnYvMBJYA6STc1OnE9rgKUJ2Ae3cfa+ZlQeWmdmb7v5jtAMTEZGi4frrr492CCIicakgPR93A73d/Z+RCqYwuPshYG/4sCyhHRaPusuiiIjEn6FDh0Y7BBGRuFSQ5KME8OHJNGZm7QitmnUuUBvo4e7jcpW5AxgI1AK+APq5+8cFbKcS8BFwGjDQ3becTNwiAJ+2axTtEPLlgjkrox2CSJG3eXNo8nG1aqHJs0uXLuXVV1+ladOm3HjjjdEMTUQkphVkwvkzQI+TbC8JWAb0JbRpYQ5m1g0YDYwAWgKfAO+ZWb1sZRab2bI8HrUPl3H37e5+DnAq0N3MtAO7iIhkueGGG5gyZQoAW7ZsoV27dvznP//h9ttv57HHHotydCIisasgPR/DgKlmtohQAnEg+0V3/93xKnD3qYT2CsHMxuVRpD8wLtsE8T5mdhnQG7g/XEeL/Abs7ulm9n9AW2Byfl8nIiKxbcmSJVxwwQUATJ48mcaNG/P555/z9ttvM3DgQAYMGBDlCEVEYlNBej4eAToBB4HKQLVcj5NiZmUIDcealuvSNODCAtRTw8xOCT+vCLQDlh+lbC8zSzWz1MNd8CIiEvsyMjJISkoCYMaMGVx11VUAtGrViu+//z6aoYmIxLSC9HzcAXR391cjFEsyUJLQSlrZpQMF2W62PvCcmR2eaP6kuy/Nq6C7Pwc8B5CSkhLYil2aOyAiEl2nnXYab775Jl27dmXatGkMHDgQgPT0dCpVqhTl6EREYldBej4ygEWRCqSwuPsCd2/h7ue4+9nHW53LzLqY2XM7duwIKkQREYmyoUOHMmjQIBo0aMAFF1zA+eefD8AHH3xAy5YtoxydiEjsKkjy8XegX7hHIRK2AIeA3JPDawAbI9Qm7j7F3XtVrFgxUk2IiEgRc91117F27VpSU1N5//33s8536NCBxx9/PIqRiYjEtoIMu2pLaP7EFWb2JUdOOL/qZAJx9/1mlgZ0BF7Pdqkj8MbJ1C0iIpJbjRo1qFEj5/ddh3tAREQkMgqSfGwB3jyZxswsCWgcPiwB1DOzFsBWd18LPA6MN7MFwDzgdkL7gTx7Mu0eJ6YuQJfGjRsft6yIiIiIiJy4fCcf7n6ye3wApACzsh0PCz9eAm5191fNrCrwAKFNBpcBnd19TSG0nSd3nwJMSUlJ6RmpNkREREREpGA9HyfN3WcTWoHqWGXGAGMCCUhERERERAJzzOTDzJYAv3D3bWa2FDjqcrTufnZhBxcEDbsSEREREQnG8Xo+3gB+yvY8sL0wgqJhVyIi8Sk9PZ3x48ezcuVKHn74YZKTk5k3bx61a9fm1FNPjXZ4IiIx6ZjJh7sPy/b8wYhHIyIiEoC0tDQuvfRSTj31VL744gsGDhxIcnIy06dPZ8WKFUycODHaIYqIxKR87/NhZjPN7IhtX82sgpnNLNywgqNNBkVE4s8999xD3759WbRoEWXLls06/8tf/pJ58+ZFMTIRkdhWkE0GLwbK5HG+HKE9QIolbTIoIhJ/0tLSuOWWW444X6tWLdLT06MQkYhIfDhu8mFmrcysVfjw7MPH4cd5QC9gXUSjFBERKUQJCQls27btiPNff/011atXj0JEOc2ZM4errrqKOnXqYGaMGzfuiDIrVqzguuuuo1KlSiQmJtKqVSu++uqrrOsrV67k2muvpVq1alSoUIEbbrghR2K1bNkyypUrxxtv5NzHd8aMGZQuXVo9QCISEfnp+UgFPic02Xxa+Pjw4zPgfuChSAUoIiJS2K6++mqGDRvGTz+F1lQxM1avXs2gQYPo2rVrlKOD3bt306xZM0aPHk1CQsIR11etWkWbNm049dRTmTlzJsuWLWP48OEkJSUBsGfPHjp16oS7M3PmTObNm8f+/fvp0qULmZmZADRr1oxhw4Zx++23ZyUlO3bsoEePHgwYMIA2bdoEd8MiEjfM/dgLWJlZfUJ7c3wH/BzYnO3yfmCTux+KWIQRlm2p3Z7ffPNNIG1+2q5RIO2crAvmrIx2CEWKfm7FV3H42enndiQzS3P3lHwULfBKjDt37qRz584sWbKEPXv2ULNmTdLT02nTpg1Tp06lfPnyJxBxZCQlJfHUU09x6623Zp3r3r07ZsaECRPyfM20adO47LLL+PHHH6lcuTIQSiwqV67MtGnT6NChAwCZmZm0bduW5ORk3n77bW6++WYWL15MamoqZcrkNdK6+LL7Nh+/kByXj6wWaHv6uRWOoH9uHGNfv+NuMphtd/GCzA8pNrTUrohI/KlQoQJz585l5syZLFy4kMzMTFq1apX1obwoy8zMZMqUKdx3331cdtllpKWl0aBBA+655x66desGwE8//YSZUa5cuazXlStXjhIlSjB37tys+yxRogQvvfQS55xzDjfddBOvv/46CxYsiLnEQ0SKjgLtcG5mPwPaAdXJlYy4++OFGJeIiEjEtW/fnvbt20c7jALZtGkTu3fvZsSIETz88MOMHDmSmTNnctNNN5GUlMQVV1zBBRdcQFJSEgMHDuSvf/0rAPfddx+HDh1iw4YNOepr3LgxAwcOZNiwYfz5z3+mRYsW0bgtEYkT+U4+zOwm4F/AQUJDr7J3czug5ENERIqNRYsWMWvWLDZt2pQ1D+KwRx99NEpRHd/hWK+++mr69+8PQIsWLUhNTeWpp57iiiuuoFq1arz++uv07t2bMWPGUKJECW688UZatWpFiRI5BzJkZGQwadIkEhMTmTt3Lu6O2VFHTIiInJSC9Hw8BDwG/Lk4z/HILducj2iHIiIiAXn00Ue57777qF+/PjVq1MjxYbuof/BOTk6mVKlSnHXWWTnOn3nmmfz73//OOu7UqRMrV65ky5YtlCpVikqVKlGzZk0aNmyY43WDBg3i4MGDLFiwgNatW/PUU0/Rp0+fQO5FROJPQZKPGsDzsZR4gOZ8iIjEo7///e8888wz3HbbbdEOpcDKlCnDeeedx/Lly3OcX7FiBfXr1z+ifHJyMgAzZ85k06ZNXHXVVVnXZs2axZgxY5g1axZNmzblscceo1+/fnTu3JlGjYr+Qg0iUvwUJPmYCpxPaNUrERGRYiszM5NLL7002mEc1e7du/n222+BUKxr165l8eLFVKlShXr16nHvvfdyww030LZtW9q3b8+sWbP497//zVtvvZVVx4svvkiTJk2oXr068+fPp2/fvtx9992cccYZAOzatYsePXrQt29f2rYN7RXcs2dP3njjDXr06MHs2bOPGKIlInKyCvJbZTrwVzMbbmbdzOy67I9IBSgiIlLYevfuzYsvvhjtMI4qNTWVli1b0rJlSzIyMhg6dCgtW7ZkyJAhAFxzzTU899xzjBo1iubNm/Pkk0/y8ssvc8UVV2TVsXz5cq699lrOPPNMHnroIQYPHsyoUaOyrvfr14/ExEQeeeSRHG2/8MILLF26lNGjRwdzsyISV467z0dWQbPMY1x2dy9ZOCFFR0pKiqempgbSVnHYcwC070Bu+rkVX8XhZ6ef25Eiuc+Hu9O5c2c2btxIs2bNKF26dI7r//rXvwpapRRx2i+icGifj+KpWO3zcZi7q+9VRERiwuDBg5k2bRqtWrVi27ZtRX6SuYhIrCjQPh+xSKtdiYjEnzFjxjBx4sSsTflERCQYBdnno/+xrhfXTQa12pWISPxJSEigZcuW0Q5DRCTuFKTnI/ei36WBWkAGsAltMigiIsXE3XffzRNPPMHTTz+tIVciIgEqyJyPU3OfM7MawIvA2MIMSkREJJI+/vhj5syZw7vvvstZZ511xITzd955J0qRiYjEtpOa8+Hu6WY2GHgN+E/hhCQiIhJZycnJXHfdia0Sr9V3CkcUVt8RkSKgMCaclyC0+7mIiEixUJT3+BARiWUFmXCe+ysiIzTn407g48IMSkREREREYk9Bej4m5zp2YDMwExhQaBGJiIhEwNlnn81HH31E5cqVad68+TEnmi9ZsiTAyERE4oc2GRQRkbjQtWtXypYtm/Vcq1yJiAQvX8mHmZUG5gI3u/vyyIYULG0yKCISH4YOHZr1/MEHH4xeICIicSxfvRnufgA4ldBQq5ji7lPcvVfFihWjHYqIiASkffv2bN++/YjzO3fupH379lGISEQkPhRkKNVLgHYBFxGRYm/27Nns37//iPP79u3j44+1hoqISKQUZMJ5eeAmM+sIpAF7sl909z8WZmAiIiKFbeHChVnPlyxZQpUqVbKODx06xAcffECdOnWiEZqISFwoSPJxJnD4t3bDXNdibjiWiIjEnpSUFMwMM6NTp05HXE9ISODJJ5+MQmQiIvGhIKtdXRLJQERERCJt1apVuDsNGzZkwYIFVKv2v122y5QpQ/Xq1SlZsmQUIxQRiW2FscO5iIhIsVC/fn0AMjMzoxyJiEh8UvIhIiJx6YcffmDOnDls2rTpiGSkf//+UYpKRCS2KfkQEZG4M2HCBH73u99RqlQpqlWrlmPDQTNT8iEiEiExm3yYWSLwFfC6u98T7XhERKToGDJkCAMGDODhhx/WHA8RkQAVZJ+P4mYw8Gm0gxARkaInPT2dP/zhD0o8REQCFpPJh5mdBjQB3ot2LCIiUvR07tyZzz77LNphiIjEnUCHXZlZO+Ae4FygNtDD3cflKnMHMBCoBXwB9HP3gm43Oypcx4UnG7OIiMSejh07MmjQIL744guaN29O6dKlc1y/7rrrohSZiEhsC3rORxKwDHg5/MjBzLoBo4E7gLnhf98zs7PcfW24zGLyjruTu683s6uBFe6+wsyUfIiIyBFuu+02AEaMGHHENTPj0KFDQYckIhIXAk0+3H0qMBXAzMblUaQ/MM7dx4aP+5jZZUBv4P5wHS2O08wFwK/N7FeEkp3SZrbT3R8qhFsQEZEYoH0+RESio8jM+TCzMoSGY03LdWkaBRg+5e73u3tdd29AaIjX2KMlHmbWy8xSzSx18+bNJxi5iIiIiIjkR1FaajcZKAmk5zqfDnSIRIPu/hzwHEBKSopHog0RESl6Hn/88WNe1z4fIiKRUZSSj0KXezJ7XsysC9ClcePGkQ9IRESKhCeffDLH8YEDB9iwYQMJCQlUr15dyYeISIQUpeRjC3AIqJHrfA1gY6QadfcpwJSUlJSekWpDRESKllWrVh1xLj09nR49etCzp/4ciIhESpGZ8+Hu+4E0oGOuSx2BTyLVrpl1MbPnduzYEakmRESkGKhRowaPPPII9957b7RDERGJWYEmH2aWZGYtzKxFuO164eN64SKPA7ea2R/M7EwzG01oP5BnIxWTu09x914VK1aMVBMiIlJMZGZmkp6ee+qhiIgUlqCHXaUAs7IdDws/XgJudfdXzawq8AChTQaXAZ3dfU3AcYqISAx78803cxy7Oxs2bODpp5+mbdu2UYpKRCT2Bb3Px2zAjlNmDDAmkIDQhHMRkXh0/fXX5zg2M6pVq0b79u157LHHohSViEjsK0oTzqNCE85FROKPNhkUEYmOIjPhXEREJAgHDhzg/PPPZ/ny5dEORUQk7sR98qHVrkRE4kvp0qVZtWoVZsccBSwiIhEQ98mHVrsSEYk/t9xyC2PHjo12GCIicSfu53yIiEj82bNnDxMmTGD69Omce+65lC9fPsf1f/zjH1GKTEQktin5EBGRuPPVV1/RqlUrAL777rsc1zQcS0QkcuI++dBSuyIi8WfWrFnHLyQiIoVOcz4050NEREREJBBxn3yIiIiIiEgwlHyIiIiIiEgglHyIiIiIiEgg4j750CaDIiIiIiLBiPvkQxPORURERESCEffJh4iIiIiIBEPJh4iIiIiIBELJh4iIiIiIBELJh4iIiIiIBCLukw+tdiUiIiIiEoy4Tz602pWIiIiISDDiPvkQEREREZFgKPkQEREREZFAKPkQEREREZFAKPkQEREREZFAKPkQEREREZFAKPkQEREREZFAKPkQEREREZFAxH3yoU0GRURERESCEffJhzYZFBEREREJRtwnHyIiIiIiEgwlHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEohS0Q4gEsxsNbATyAS2ufsl0Y1IRERERERiMvkIu9Ddd0c7CBERERERCdGwKxERERERCUSgyYeZtTOzd8xsnZm5md2aR5k7zGyVme0zszQza3sCTTnwkZl9bmY3nXTgIiIiIiJy0oIedpUELANeDj9yMLNuwGjgDmBu+N/3zOwsd18bLrOYvOPu5O7rw88vcvd1ZlYLmGFmS919SeHfjoiIiIiI5FegyYe7TwWmApjZuDyK9AfGufvY8HEfM7sM6A3cH66jRT7aWRf+d4OZTQVaAUo+RERERESiqMjM+TCzMsC5wLRcl6YBFxagnvJmdkr4eRLQHvjiKGV7mVmqmaVu3rz5xAIXEREREZF8KTLJB5AMlATSc51PB2oWoJ4awFwz+z/gU+Bld/88r4Lu/py7p7h7SrVq1U4kZhERERERyaeYW2rX3b8DzslveTPrAnRp3Lhx5IISEREREZEi1fOxBThEqOciuxrAxkg16u5T3L1XxYoVI9WEiIiIiIhQhJIPd98PpAEdc13qCHwSfEQiIiIiIlKYAh12FZ4Afnh8Uwmgnpm1ALaGl9J9HBhvZguAecDtQG3g2QjGpGFXIiIiIiIBCLrnIwVYFH4kAMPCzx8CcPdXgX7AA8Bi4CKgs7uviVRAGnYlIiIiIhKMoPf5mA3YccqMAcYEEpCIiIiIiASmyMz5iBYz62Jmz+3YsSPaoYiIiIiIxLS4Tz407EpEREREJBhxn3yIiIiIiEgw4j750LArEREREZFgxNwO5wXl7lOAKSkpKT2jHUtRY/dtjnYIx+Ujq0U7BJFCof/fREQkHsR9z4eIiIiIiAQj7ns+RGKNvkEXERGRoiruez4050NEREREJBhxn3xoqV0RERERkWDEffIhIiIiIiLBUPIhIiIiIiKBUPIhIiIiIiKBiPvkQxPORURERESCEffJhyaci4iIiIgEI+6TDxERERERCYaSDxERERERCYSSDxERERERCYSSDxERERERCUTcJx9a7UpEREREJBhxn3xotSsRERERkWDEffIhIiIiIiLBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBiPvkQ/t8iIiIiIgEI+6TD+3zISIiIiISjLhPPv6/vXuPsaMs4zj+/WFRgXpBC60mikYUsV4K8YYC1gtY+EODmhCjMTVolSrxRkg0GjUGNVGjxktSNaaIQRODkdIAggYEKkGsykUUIRFQaotYqRarCD7+MVM9PZzd7nbPztmz+/0kkz0z8553ntN3+0yeMzPvSpIkSeqGxYckSZKkTlh8SJIkSeqExYckSZKkTlh8SJIkSeqExYckSZKkTlh8SJIkSerEvCw+kjw1yeVJbk5yY5KDRh2TJEmStNAtGnUAs2Q98OGquirJ44B/jTgeSZIkacGbd8VHkuXAv6vqKoCq2j7ikCRJkiTR8W1XSY5PsiHJXUkqyeoBbdYm+X2SfybZnOS4aR7m6cDOJBcm+UWSDw0leEmSJEkz0vWVj8XATcC32mUPSU4FvgisBa5uf16c5FlVdWfb5lcMjvvEqtrS7jsOWAHcDVyS5LqqumwWPo8kSZKkKeq0+Kiqi4CLAJKsH9Dk/cD6qvp6u35GklXA6cAH2z5W7OUwdwE/r6o/tMe5iKYQsfiQJEmSRihVNZoDJzuBd1fV+nb94cA/gDdW1fd62n0FeHZVvWyK/S4CrgNeAewALgDWVdXGAW3XAGva1SOAW/b5A81PS4B7Rh2Eps1xG0+O20MdVlWHjDqIcZRkTVV9bdRxaHoct/HkuE3PXHrgfAnwMGBb3/ZtwKum2klVPdA+53ElEODSQYVH2/ZrgL8sE0jy86p6/qjj0PQ4buPJcdOQrcHz2zhy3MaT4zYNc6n4GJqquhi4eNRxSJIkSfq/ufRHBu8BHgSW9m1fCmztPhxJkiRJwzRnio+quh/YDJzQt+sE4KfdRyS8hDiuHLfx5LhpmPx9Gk+O23hy3Kah0wfOkywGDm9Xfwp8GtgAbK+qO9upds+lmWJ3E/BO4DRgeVXd0VmgkiRJkoau6+JjJXD5gF3nVNXqts1aQn/leQAABuVJREFU4CzgCTR/E+R9VXVlVzFKkiRJmh0jm2pXkiRJ0sIyZ5750NyQ5PgkG5LclaSSrB51TNrT3sYojY8l2ZJkV5IrkiwfUbgL1jDGKcnBSc5NsqNdzk3y2E4/iMaG+Xs8mMPHgzl89lh8qN9imtvd3gPsGnEsGmxvY3QW8AHgDOAFwN3AZUke1VmEguGM03nA0cCqdjma5rk4aRDz93gwh48Hc/gs8bYrTaj/r9Br7ukfoyQBtgBfrqqz220H0CTFM6tq3ahiXcj2ZZySHAncDBxbVZvaNscCVwHPrKpbuv8kGhfm7/FgDh8P5vDh8sqHNL88FVgGXLp7Q1XtAq4EXjKqoPQQUxmnY4Cd7DnV+CbgPhxLab4yh48Hc/gMWHxI88uy9ue2vu3bevZp9KYyTsuAP1fP5en29d04ltJ8ZQ4fD+bwGbD4kCRJktQJiw9pftna/lzat31pzz6N3lTGaStwSHtvMfC/+4wPxbGU5itz+Hgwh8+AxYc0v/yeJqmdsHtDkkcCx7HnfacaramM0zU0s60c0/O+Y4CDcCyl+cocPh7M4TOwaNQBaG5Jshg4vF3dD3hykhXA9qq6c3SRabe9jVGSLwAfSvJb4HfAh2keejtvJAEvUDMdp6r6TZJLgHVJ1rT9rAM2LuRZUjQx8/d4MIePB3P47HGqXe0hyUrg8gG7zqmq1d1Go0H2NkbtZd2PAu8ADgauBd5VVTd1F6WGMU5JDga+BLym3bSBZrrHe2czdo0n8/d4MIePB3P47LH4kCRJktQJn/mQJEmS1AmLD0mSJEmdsPiQJEmS1AmLD0mSJEmdsPiQJEmS1AmLD0mSJEmdsPiQRijJsiSXJrkvyazMe51kZZJKsmQ2+pekhcocLk2fxYc0BUkOSXJ/koOS7N+eaJ48hK7PBJ4IrACeMIT+JEl9zOHS3LFo1AFIY+IY4Pqqui/Ji4DtVXXnEPo9HNhcVbcOoS9J0mDmcGmO8MqHNDUvATa1r4/teT2pJO9Iclv7jdttSd7es+924LXAW9pL6usn6efkJNcm2ZXkL0kuTPLIdt/BSc5J8td2/4+SLJ+kr9VJdvZt2+Oy/u42SU5K8tsk/0iyIcljkrwhya1JdiQ5N8kBPf1ckeSrST6Z5J4kdyf5bJL9etq8LskNbazbk/wkydKp/HtK0j4yh5vDNUd45UOaQHtJ/oZ29UDgwSSrgQOASnIvcF5VrZ3g/acAXwbeB1wKvBr4apKtVXUh8ALgPGA78B5g1wT9rAI2AJ8G3krz//ZE/v/lwXrgCJqT4F+Bs4FLkjyjqgb2OUWPAD4AvAl4OHB+u+wCXg88Hvg+sBb4XM/73gR8keZkv6L9jJuB7yRZBnwX+GDb12LgxTOIUZIGMoebwzVHVZWLi8uAheYE8RTgucD97c+nAX8Hjm/3LZnk/ZuAb/ZtWw9c3bO+EVi/lzg2Ad+dYN/TgQKO79n2GGAH8LZ2fWXbZkm7vhrY2dfPoDYFHNHT5rPAg72fuf08G3vWrwCu6ev7MuAb7euj234PG/X4uri4zO/FHG4Od5mbi7ddSROoqgeq6nbgmcB1VXUDsAzYVlVXVtXtVXXPJF0cyUMv7V8NPGuaoRwF/HiSY/wHuKYn7h3AjftwnH7/qqpbeta3AVv7PvM24NC+993Qt76lp831wI+Am5Kcn+T0JIfMME5JeghzuDlcc5O3XUkTSPJr4DBgf2C/9h7bRcCi9vUdVTXhfbmTmJXpGKdxnP8A6du2/4B2Dwzo798DtvV/iTFhm6p6MMmJNJfpTwROAz6V5GVVdf0E8UrStJnDzeGam7zyIU3sZJr7XbcCb25f3wS8t3198l7e/xvgpX3bjgVunmYcvwReOckx9qOZyQWAJI8GnjPJcf4MHNi2223FNGPaZ9W4pqo+TnPP9Bbg1K6OL2nBMIfPAnO4ZsorH9IEquqO9uG6pcAFNN/+LAfOr6o/TaGLzwDfS7KZ5mHFVTQP8r1umqGcDVyY5DaaB/9C843Tuqq6NckFwLoka4B72/Z/a9sOci1wH823VZ8HnkfzwOGsS/Ji4FXAD2ku9x8FPInpn8wlaVLm8OEzh2sYvPIhTW4lzb3C/wReCPxxiictquoHwBk0M6XcTDMbytpqZkmZsqq6CDgFOInmG7SfAC+nufQOzewpP6OZTeVnNLO6rKoJZkmpqu00J9ATaO4rXgN8ZDoxzcAOmm8SNwK30syw8omq+nZHx5e0sKzEHD5M5nDNWKq6unVRkiRJ0kLmlQ9JkiRJnbD4kCRJktQJiw9JkiRJnbD4kCRJktQJiw9JkiRJnbD4kCRJktQJiw9JkiRJnbD4kCRJktQJiw9JkiRJnfgvuErueLR2F6wAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import CyclicMonthOfYear\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [CyclicMonthOfYear(columns=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CyclicMonthOfYear\")" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "f70858b5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6667MmTIEAYOHFh2bsWKFQwZMoRmzZrRsWNHWrRowQUXXFCl9ytJqplie5rfi0FJSUmaNm1avsOQVA29+eab7LfffvkOY6s6derEXXfdxdFHH53vUHbI1v59I2J6SqlkO6rwF5lUoJxqt2rkYard2NqJom/5kCRJkpQbJh+SJEmScsIVziWphnv//ffzHYIkSdvFlg9JkiRJOVH0yYezXUmSJEm5UfTJR0ppQkppaNOmTfMdiiRJklTQij75kCRJkpQbJh+SJEmScsLkQ5IkSVJOmHxIkiRJygnX+ZCkHRAXf5zV+tM1rbJavyRJ+WDLhyTVcJ06deL666+nW7duNG3alIEDB7J27VrGjBnDEUccUa5sRPDOO+8AMGjQIM466yy+9a1v0bhxY3r16sWiRYsYPnw4zZo1Y9999+W1114rd51f//rX7L///jRr1ozBgwezdu1aAA444AAmTJhQVnbdunW0bNmy3PclSSr65MN1PiQVgvvvv5+///3vzJ07l5kzZzJmzJjt/t6VV17J0qVLqV+/Pj179uSQQw5h6dKlnHTSSZx77rnlyt9777089thjvPvuu8yZM4crr7wSgNNPP53//M//LCs3ceJE2rVrx8EHH1xl9yhJqvmKPvlwnQ9JheBnP/sZ7du3p3nz5gwYMIAZM2Zs1/e+973vceihh7LLLrvwve99j1122YXTTz+d2rVrM3DgwM1aLs4++2x23313mjdvzogRI7jvvvsA+P73v8/EiRNZsWIFAGPHjuUHP/hB1d6kJKnGK/rkQ5IKQdu2bcs+N2zYkFWrVm3X99q0aVP2uUGDBpvtV6xn9913L/vcsWNHFi5cCED79u3p1asXDz30EJ9++imPPvoop5122g7diySpcDngXJIKVKNGjVi9enXZ/qJFi3a6zg8++KDs8/z582nfvn3Z/hlnnMFdd93F+vXr6dmzJx06dNjp60mSCostH5JUoA466CBmz57NjBkzWLt2LZdddtlO13nrrbfy4YcfsmzZMq666ioGDhxYdu7444/n1Vdf5eabb+b000/f6WtJkgqPyYckFai9996bSy65hKOPPpqvf/3rm818tSNOPfVU+vfvT+fOndlrr70YOXJk2bkGDRpw4oknMnfuXE444YSdvpYkqfBESinfMVQLJSUladq0afkOQ1I19Oabb7LffvvlO4y869Sp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H/DAJqf6AQ/tTN2SJFXUpk0b2rQp//eujS0gkqTsqEzysRR4eGcuFhGNgS6Z3VrAHhHRHViWUpoP3AiMjYiXganAT4D2wO07c91txDQAGNClS5dtlpUkSZK047Y7+Ugp7ewaHwAlwORN9kdltnuAQSml/46IFsBIoB2lU/oem1KaVwXX3qKU0gRgQklJyZBsXUOSJElS5Vo+dlpKaQrwlWNGUkqjgdE5CUiqhBf77JXvELZLj2fezXcIkiRJW/SVyUdEzAT+JaX0SUS8DqStlU0pdavq4HLBbleSJElSbmyr5eMh4PNNPm81+aip7HYlScVp8eLFjB07lnfffZcrrriCli1bMnXqVNq3b8+ee+6Z7/AkqSB9ZfKRUhq1yefLsh6NJEk5MH36dP71X/+VPffck9mzZ3PBBRfQsmVLHn/8cebMmcO4cePyHaIkFaTtXucjIp6KiM2WfY2IJhHxVNWGlTsuMihJxef8889n2LBhvPbaa9SvX7/s+De/+U2mTp2ax8gkqbBVZpHBI4F6Wzi+C6VrgNRILjIoScVn+vTpnHHGGZsdb9euHYsXL85DRJJUHLY521VEHLLJbreIWLbJfm3gm8CCqg5MkqRsadCgAZ988slmx9966y1at26dh4gkqThsz1S70ygdaJ6ASVs4vwY4pyqDKnRO2SpJ+fXd736XUaNG8cADDwAQEbz//vtcdNFFnHjiiXmOTpIK1/Z0u9oT2IvS9Tn+X2Z/49YBaJJS+lPWIswyx3xIUvG5/vrrWbZsGa1atWL16tUcccQRdOnShd12240rr7wy3+FJUsHaZvKRUpqXUno/pVQrpTQts79x+yil9GUuAs0Wx3xIUvFp0qQJzz33HH/961+59tprGTZsGH//+995+umnadSoUb7DU4G47LLLiIhyW9u2bcvOp5S47LLLaN++PQ0aNODII49k9uzZZednzZrFLrvswkMPPVSu3ieeeIK6des6OYJqpEqtcB4RXwP6AK2pkLiklG6swrgkScq6vn370rdv33yHoQK2zz77MGXKlLL92rVrl32+7rrruOGGGxgzZgz77LMPl19+Of369ePtt99m11135YADDmDUqFH85Cc/4YgjjqBNmzYsX76cwYMHc95559GrV6883JG0c7Y7+YiI04A/AeuBjym/4GACTD4kSTXGa6+9xuTJk1myZAkbNmwod+66667LU1QqNHXq1CnX2rFRSombbrqJiy++uGyc0T333EPr1q0ZN24cP/7xjwG44IILGD9+PEOHDuWRRx7hnHPOoVmzZlx++eU5vQ+pqlSm5eNy4AbgVzW9q9WmImIAMKBLly75DkWSlCPXXXcdF198MR07dqRNmzZERNm5TT9LO+u9996jffv21K9fn8MOO4yrr76azp07M3fuXBYtWkT//v3LyjZo0IA+ffrw/PPPlyUftWrV4p577uGggw7itNNO44EHHuDll1+mXr0trX4gVX+VST7aAHcVUuIBpWM+gAklJSVD8h2LJCk3fvvb33LbbbeV/Q+elA2HHXYYY8aMYd9992XJkiVceeWVHH744cyePZtFixYB0KZNm3LfadOmDQsWlF/BoEuXLlxwwQWMGjWKX/3qV3Tv3j1n9yBVtcokHxOBw4D3shSLJEk5sWHDBv71X/8132GowH3rW98qt9+jRw86d+7MPffcQ48ePba7njVr1nDffffRsGFDnnvuOVJKttCpxqrMCuePA9dGxJURMTAiTth0y1aAkiRVtTPPPJO7774732GoyDRu3JiuXbvyj3/8o2wcyOLFi8uVWbx48WZjRC666CLWr1/Pyy+/zLRp07jllltyFrNU1SrT8vGHzM9fbuFconS1c0mSqr1LL72UY489loMPPpgDDjiAunXrljv/pz/V2OWrVI2tXbuWt956i6OOOoo999yTtm3b8vjjj/ONb3yj7Pyzzz7Lb37zm7LvTJ48mdGjRzN58mS6du3KDTfcwPDhwzn22GPZa6+asWixtKntbvnIrPOxtc3EQ5JUY4wYMYJJkyZRp04dPvnkEz7++ONym1QVzj//fJ5++mnmzp3LSy+9xEknncRnn33GGWecQUQwfPhwrr32Wh5++GFmzZrFoEGDaNy4MaeeeioAK1euZPDgwQwbNozevXsDMGTIEHr37s3gwYM3m6VNqgkqtc5HIXK2K0kqPqNHj2bcuHEMHDgw36GogH344YeccsopLF26lFatWtGjRw9efPFFOnbsCMCFF17ImjVr+OlPf8onn3zCYYcdxqRJk9h1110BGD58OA0bNuSqq64qV+8f//hHDjjgAG6++WZ+/vOf5/y+pJ0RKaVtlwIi4tyvOl/TFxksKSlJ06ZNy8m1XuxTM5pJezzzbr5DqFZ8bjVXTXh2PrfNRcT0lFLJdhTdvl9km2jXrh1PP/00e++99w5EJilX4mJbIqtCuqZVri+51RkRKtPycU6F/bpAO2ANsAQXGZQk1RA///nPuemmm7j11ludNUiScmi7k4+U0p4Vj0VEG+Bu4M6qDEqSpGx69tlneeaZZ/jb3/7G/vvvv9mA8/Hjx+cpMkkqbDs15iOltDgiRgD3A3+pmpAkScquli1bcsIJzhIvSblWFQPOa1G6+rkkSTWCa3xIUn5sd/KxhYUEg9IxHz8Fnq3KoCRJkqqSA5erRh4GLqvAVKbl48EK+wn4GHgKOK/KIpIkKQu6devG008/TbNmzTjwwAO/cqD5zJkzcxiZJBWPygw43+4FCSVJqm5OPPFE6tevX/bZWa4kKfe2K/mIiLrAc8DpKaW3sxtSbrnIoCQVh0svvbTs82WXXZa/QCSpiG1Xa0ZKaR2wJzuwkFN1l1KakFIa2rRp03yHIknKkb59+/Lpp59udnzFihX07ds3DxFJUnGoTFeqe4Ah2QpEkqRcmTJlCl988cVmx9euXcuzzzqHiiRlS2UGnDcCTouIfsB04LNNT6aUflaVgUmSVNVeffXVss8zZ86kefPmZftffvkljz32GB06dMhHaJJUFCqTfOwHbHxrd65wruC6Y0mSCk9JSQkRQUTQv3//zc43aNCA3//+93mITJKKQ2Vmuzoqm4FIkpRtc+fOJaVE586defnll2nV6v/WLKhXrx6tW7emdu3aeYxQkgpbVaxwLklSjdCxY0cANmzYkOdIJKk4mXxIkorShx9+yDPPPMOSJUs2S0bOPffcPEUlSYXN5EOSVHTuvfde/uM//oM6derQqlWrcgsORoTJhyRlScEmHxHREHgTeCCldH6+45EkVR+XXHIJ5513HldccYVjPCQphyqzzkdNMwJ4Md9BSJKqn8WLF/OjH/3IxEOScqwgk4+I+DqwL/BovmORJFU/xx57LC+99FK+w5CkopPTblcR0Qc4HzgUaA8MTimNqVDmLOACoB0wGxieUqrscrPXZ+o4fGdjliQVnn79+nHRRRcxe/ZsDjzwQOrWrVvu/AknnJCnyCSpsOV6zEdjYBbw58xWTkQMBG4GzgKey/x8NCL2TynNz5SZwZbj7p9SWhgR3wXmpJTmRITJhyRpMz/+8Y8BuPrqqzc7FxF8+eWXuQ5JkopCTrtdpZQmppR+mVJ6ENjSJOvnAmNSSnemlN5MKZ0DfAScuUkd3VNKB2xhW5gp0gP494h4n9IWkCERcUl270ySVJNs2LBhq1t1SzxuvfVWunXrRpMmTWjSpAk9e/bkb3/7W7kyc+bM4YQTTmC33XajYcOGHHLIIbz55psALFq0iJYtW3LDDTeU+87s2bPZZZdd+K//+q+c3YskVZsxHxFRj9LuWJMqnJpEJbpPpZR+kVLaPaXUidIuXnemlC7fyjWHRsS0iJj28ccf72DkkiRlz9e+9jWuvfZaXn31VaZNm0bfvn05/vjjmTlzJlC6anuvXr3Yc889eeqpp5g1axZXXnkljRs3BqBt27bceuutjBw5kjfeeAOAdevWcfrpp3P88cfz7//+73m7N0nFpzpNtdsSqA0srnB8MXB0Ni6YUroDuAOgpKQkZeMakqTq58Ybb/zK89VpnY/vfve75favuuoqbrvtNl544QW6devGiBEj6N+/f7mWjc6dO5f7zsCBA/nLX/7C6aefzosvvsgVV1zBRx99xOOPP56Te5CkjapT8lHlKg5m35KIGAAM6NKlS/YDkiRVC7///e/L7a9bt46PPvqIBg0a0Lp162qVfGzqyy+/5IEHHmDVqlUcfvjhbNiwgQkTJnDxxRdzzDHHMH36dDp16sT555/PwIEDy3139OjRdO3aldNOO42HH36YRx55hObNm+fpTiQVq2rT7QpYCnwJtKlwvA2wKFsXTSlNSCkNbdq0abYuIUmqZubOnVtu+/DDD1m4cCF9+vTZbGxEdfD666/TuHFj6tevz09+8hP+8pe/cOCBB7JkyRJWrVrF1VdfTf/+/Xn88cc55ZRTOO200zYbF9K8eXN+/etfc//993PKKadw7LHH5uluJBWzapN8pJS+AKYD/Sqc6gc8n63rRsSAiLhj+fLl2bqEJKkGaNOmDVdddRUXXnhhvkPZzD777MOMGTN46aWXOPPMMznjjDOYNWsWGzaUzt3y3e9+l3PPPZfu3btz7rnncvLJJ3PLLbeUq2PDhg3cfffdNGzYkFdeeYW1a9fm41YkFbmcJh8R0TgiukdE98y198js75EpciMwKCJ+FBH7RcTNlK4Hcnu2YrLlQ5K00YYNG1i8uOLQw/yrV68eXbp04dBDD+XXv/413bt357e//S0tW7akTp067L///uXK77fffsyfP7/csZtuuonXX3+dV155hVWrVjFixIhc3oIkAbkf81ECTN5kf1RmuwcYlFL674hoAYykdJHBWcCxKaV5OY5TklTAHn744XL7KSU++ugjbr31Vnr37p2nqLbfhg0b+Pzzz6lXrx7f+MY3ePvtt8udnzNnDh07dizbf/PNNxkxYgR33XUX+++/P3/84x859thjOeGEE+jVq1euw5dUxHKafKSUpgCxjTKjgdE5CQgHnEtSMTrppJPK7UcErVq1om/fvtVuzMfFF1/Mcccdx+67787KlSsZN24cU6ZMKRvTceGFF3LyySfTu3dv+vbty+TJk/mv//ov/vrXvwKwfv16zjjjDI477jhOO+00APr378+PfvQjBg8ezIwZM2jYsGHe7k9ScSno2a62R0ppAjChpKRkSL5jkSTlxsaxEjXBokWL+P73v8+iRYto2rQp3bp149FHH+Wb3/wmAMcffzx33HEHV199NcOGDePrX/86f/7znznuuOMA+PWvf828efM2G4B+/fXX061bN37xi19w88035/y+JBWnok8+JEnFZd26dRxxxBH8+c9/Zp999sl3ONs0ZsyYbZYZNGgQgwYN2uK5X/3qV/zqV7/a7Hjjxo157733djI6SaqcajPbVb4425UkFZe6desyd+5cIr6yF7AkKQuKPvlwtitJKj5nnHEGd955Z77DkKSiY7crSVLR+eyzz7j33nt5/PHHOfTQQ2nUqFG587/73e/yFJkkFTaTD0lS0XnzzTc55JBDADYb92B3LEnKnqJPPpxqV5KKz+TJk7ddSJJU5Yo++XCqXUlSZcTFH+c7hIKQrmmV7xAk5UHRDziXJEmSlBsmH5IkSZJywuRDkiRJUk4UffLhIoOSJElSbhR98uEig5IkSVJuFH3yIUmSJCk3TD4kSZIk5YTJhyRJkqScMPmQJEmSlBNFn3w425UkSZKUG0WffDjblSRJkpQbRZ98SJIkScoNkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQJEmSlBMmH5IkSZJyouiTDxcZlCRJknKj6JMPFxmUJEmScqPokw9JkiRJuWHyIUmSJCknTD4kSZIk5YTJhyRJkqScqJPvACRJEBd/nO8Qtild0yrfIUiSajiTD22V/zNUM/ncJElSdVWQyUdEvA+sADYAn6SUjspvRJIkSZIKMvnIODyltCrfQUiSJEkq5YBzSZIkSTmR0+QjIvpExPiIWBARKSIGbaHMWRExNyLWRsT0iOi9A5dKwNMR8UpEnLbTgUuSJEnaabnudtUYmAX8ObOVExEDgZuBs4DnMj8fjYj9U0rzM2VmsOW4+6eUFmY+H5FSWhAR7YAnIuL1lNLMqr8dSZIkSdsrp8lHSmkiMBEgIsZsoci5wJiU0p2Z/XMi4hjgTOAXmTq6b8d1FmR+fhQRE4FDAJMPSZIkKY+qzZiPiKgHHApMqnBqEnB4JeppFBG7Zj43BvoCs7dSdmhETIuIaR9/XP2nJ5UkSZJqsmqTfAAtgdrA4grHFwNtK1FPG+C5iPhf4EXgzymlV7ZUMKV0R0qpJKVU0qqV6w5IkiRJ2VRwU+2mlN4DDtre8hExABjQpUuX7AUlSZIkqVq1fCwFvqS05WJTbYBF2bpoSmlCSmlo06ZNs3UJSZIkSVSj5COl9AUwHehX4VQ/4PncRyRJkiSpKuW021VmAPjG/k21gD0iojuwLDOV7o3A2Ih4GZgK/ARoD9yexZjsdiVJkiTlQK5bPkqA1zJbA2BU5vPlACml/waGAyOBGcARwLEppXnZCshuV5IkSVJu5HqdjylAbKPMaGB0TgKSJEmSlDPVZsxHvkTEgIi4Y/ny5fkORZIkSSpoRZ982O1KkiRJyo2iTz4kSZIk5UbRJx92u5IkSZJyo+iTD7tdSZIkSblR9MmHJEmSpNww+ZAkSZKUE0WffDjmQ5IkScqNok8+HPMhSZIk5UbRJx+SJEmScsPkQ5IkSVJOmHxIkiRJyomiTz4ccC5JkiTlRtEnHw44lyRJknKj6JMPSZIkSblh8iFJkiQpJ0w+JEmSJOWEyYckSZKknCj65MPZriRJkqTcKPrkw9muJEmSpNwo+uRDkiRJUm6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknCj65MN1PiRJkqTcKPrkw3U+JEmSpNwo+uRDkiRJUm6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTBZl8RMSeETE5It6IiNcjolG+Y5IkSZKKXZ18B5AlY4CRKaVnI6I58Hme45EkSZKKXsElHxHRFViXUnoWIKW0LM8hSZIkSSLH3a4iok9EjI+IBRGRImLQFsqcFRFzI2JtREyPiN6VvMzXgVURMSEiXo2IX1ZJ8JIkSZJ2Sq5bPhoDs4A/Z7ZyImIgcDNwFvBc5uejEbF/Sml+pswMthx3/5TSwsy53kB3YAnw94h4JaX0eBbuR5IkSdJ2ymnykVKaCEwEiIgxWyhyLjAmpXRnZv+ciDgGOBP4RaaO7tu4zAJgWkrpg8x1JlKaiJh8SJIkSXkUKaX8XDhiFXB2SmlMZr8esBo4JaX0wCblbgUOSCn9y3bWWwd4BegLLAceAf6QUvqfLZQdCgzN7O4DvL3DN1SYWgJL8x2EKs3nVjP53DbXMaXUKt9B1EQRMTSldEe+41Dl+NxqJp9b5VSnAectgdrA4grHFwNHb28lKaX1mXEezwABTNpS4pEpewfgfyxbERHTUkol+Y5DleNzq5l8bqpiQ/H3W03kc6uZfG6VUJ2SjyqTUnoUeDTfcUiSJEn6P9VpkcGlwJdAmwrH2wCLch+OJEmSpKpUbZKPlNIXwHSgX4VT/YDncx+RsAmxpvK51Uw+N1Ul/3uqmXxuNZPPrRJyOuA8IhoDXTK7zwPXAOOBZSml+ZmpdsdSOsXuVOAnwA+BrimleTkLVJIkSVKVy3XycSQweQun7kkpDcqUOQu4EGhH6ZogP08pPZOrGCVJkiRlR96m2pUkSZJUXKrNmA9VDxHRJyLGR8SCiEgRMSjfMam8bT2jKHVZRCyMiDURMSUiuuYp3KJVFc8pIppFxNiIWJ7ZxkbEbjm9EdUYvr9rBt/hNYPv8Owx+VBFjSnt7jYMWJPnWLRl23pGFwLnAecA3wCWAI9HxK45i1BQNc9pHHAIcExmO4TScXHSlvj+rhl8h9cMvsOzxG5X2qqKq9Cr+qn4jCIigIXALSmlqzLHGlD6Ujw/pfSHfMVazHbkOUXEfsAbwBEppamZMkcAzwL7ppTezv2dqKbw/V0z+A6vGXyHVy1bPqTCsifQFpi08UBKaQ3wDHB4voLSZrbnOfUEVlF+qvGpwGf4LKVC5Tu8ZvAdvhNMPqTC0jbzc3GF44s3Oaf8257n1Bb4OG3SPJ35vASfpVSofIfXDL7Dd4LJhyRJkqScMPmQCsuizM82FY632eSc8m97ntMioFWmbzFQ1s+4NT5LqVD5Dq8ZfIfvBJMPqbDMpfSl1m/jgYjYBehN+X6nyq/teU4vUDrbSs9NvtcTaITPUipUvsNrBt/hO6FOvgNQ9RIRjYEumd1awB4R0R1YllKan7/ItNG2nlFE3AT8MiLeAuYAIykd9DYuLwEXqZ19TimlNyPi78AfImJopp4/AP9TzLOkaOt8f9cMvsNrBt/h2eNUuyonIo4EJm/h1D0ppUG5jUZbsq1nlGnWvRT4MdAMeAn4aUppVu6iVFU8p4hoBvwe+E7m0HhKp3v8NJuxq2by/V0z+A6vGXyHZ4/JhyRJkqSccMyHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkSfr/7dxdqFRVGMbx/yNaaZFEmhaUQR9WUmlQWYmdqEy9CS3owgijMhKiom666CLCCjIiCEGIOFGYEEZ+EGUGGopoSHgyK44XGmFadvSUZpn6drGWtBtnxhnPnO3UeX6wcH+s/e41iu9m7bX2KoU7H2ZmZmZmVgp3PsxOIUmjJa2UdEBSv6x7LalDUkga0R/xzcwGKudws+a582HWAEkjJR2SdKakIflBc1ELQj8DXACMB85vQTwzM6vgHG7WPgaf6gaY/UfcBGyOiAOSbgR6IuL7FsS9FNgUEd0tiGVmZtU5h5u1CY98mDXmZmBd3p5U2K5L0qOStuU3btskPVI4tx24G3ggD6l31okzXdIGSQcl/SJpuaQz8rlzJL0taW8+v0rSuDqxZkvaX3HsX8P6x+pImibpW0m/S1omabikeyV1S+qV9I6koYU4qyUtkPSipD2SfpI0X9KgQp2ZkrpyW3skrZE0qpG/TzOzk+Qc7hxubcIjH2Y15CH5rrw7DDgiaTYwFAhJ+4BFETG3xvUzgDeAp4CVwF3AAkm7ImI5cD2wCOgBngAO1ogzFVgGvAw8SPp/O4V/Xh50AmNJD8G9wDzgY0mXR0TVmA06HXgamAWcBizJ5SBwD3Au8AEwF3i1cN0s4HXSw358/o2bgPckjQYWA8/mWGcBE/vQRjOzqpzDncOtTUWEi4tLlUJ6QFwMXAMcyn9eAvwGTM7nRtS5fh3wVsWxTmBtYX8F0HmCdqwDFtc4dxkQwOTCseFAL/Bw3u/IdUbk/dnA/oo41eoEMLZQZz5wpPib8+9ZUdhfDayviP0p8Gbevi7HHXOq/31dXFz+38U53DncpT2Lp12Z1RARhyNiO3AF8EVEdAGjgd0R8XlEbI+IPXVCXMnxQ/trgauabMoE4LM69zgKrC+0uxf46iTuU+nPiPiusL8b2FXxm3cD51Vc11Wxv7NQZzOwCtgiaYmkxySN7GM7zcyO4xzuHG7tydOuzGqQ9DUwBhgCDMpzbAcDg/P2joioOS+3jn5ZjrGJ+xwFVHFsSJV6h6vE+6vKscqXGDXrRMQRSVNIw/RTgIeAlyTdGhGba7TXzKxpzuHO4daePPJhVtt00nzXXcD9eXsL8GTenn6C678Bbqk4NgnY2mQ7vgRur3OPQaSVXACQdDZwdZ37/AwMy/WOGd9km05aJOsj4nnSnOmdwH1l3d/MBgzn8H7gHG595ZEPsxoiYkf+uG4UsJT09mccsCQifmwgxCvA+5I2kT5WnEr6kG9mk02ZByyXtI304Z9Ib5wWRkS3pKXAQklzgH25/q+5bjUbgAOkt1WvAdeSPjjsd5ImAncAn5CG+ycAF9L8w9zMrC7n8NZzDrdW8MiHWX0dpLnCfwA3AD80+NAiIj4EHietlLKVtBrK3EirQfc9XgAAALRJREFUpDQsIj4CZgDTSG/Q1gC3kYbeIa2espG0mspG0qouU6PGKikR0UN6gN5Jmlc8B3iumTb1QS/pTeIKoJu0wsoLEfFuSfc3s4GlA+fwVnIOtz5TRFlTF83MzMzMbCDzyIeZmZmZmZXCnQ8zMzMzMyuFOx9mZmZmZlYKdz7MzMzMzKwU7nyYmZmZmVkp3PkwMzMzM7NSuPNhZmZmZmalcOfDzMzMzMxK4c6HmZmZmZmV4m9j4Rxhn1dCagAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.feature_generation_dt import DeltaTime\n", + "\n", + "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", + "columns = [\"Dates\"]\n", + "objs = [DeltaTime(columns_a=[\"Dates\"], columns_b=[\"Dates\"])]\n", + "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"DeltaTime\")" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "2c8f279f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Qj777DNOOOEEIoLhw4dzySWXsPvuu/PNb36Tiy66iMaNG3PssccC0KRJE04++WRGjhzJTjvtROfOnbn22mv5+OOPOe644wB49913GTZsGJdeeim77bYbACNHjmTy5MmcfvrpTJw4MWfvPx88/fTTjB07lh49epTtSylx9NFHU6tWLe69916aNm3KFVdcQb9+/XjllVdo1KhRuXNcfvnl1Kq16d+Iu3fvzqhRozj55JPp3bs3bdq0Yfny5QwePJgzzzyTAw88MOPvT9ouKSUfKdGrV68kSZuzfPnyNG/evPTZZ5+lDRs25DpOXtiwYUP67LPP0rx589Ly5cs32waYlbbtZ3heGTRoUGrXrl2qW7duat++fTrmmGPSyy+/XHZ8w4YNaeTIkalt27apXr16qU+fPmnu3LnlzrF27do0YsSI1KZNm/SNb3wjfec730mzZ88ue32/fv1S3759N/nv+fnnn09169ZN99xzT+bfaJ765JNPUpcuXdKjjz6avvOd76Rf/vKXKaWUXn/99QSkOXPmlLVdv359atWqVRo3bly5czz77LNpp512SsXFxQlId955Z7nj69evTwcccEA66qijUkopHXfccenb3/52+vzzzzP87qRttsWf2dV2nY9siYj+QP+uXbsO2dKtT0mF7c033yzrJqGqtWrVKhYtWkTXrl03ORYRs9O2TbVb2L/IVK0MGjSIzp07c9lll3HwwQfTvXt3rr32WubOnUuPHj147bXX+Na3vlXWvmPHjnz3u99l/PjxAKxcuZKePXty9dVXl3W7uvPOOxk4cGC567z55pvstddeHH300dx55508++yz7L333tl8q9JX2eI6H9VqzEcuJGe7krQV69ato0GDBrmOkZcaNGhgVzbljXHjxvHmm29y0UUXbXJs9913Z+edd+acc84pW+zzsssu47333is3BfLJJ5/M4YcfzhFHHPGV1+ratSsjRozgtttu47e//a2Fh2qM6jbmQ5KqpYgt/hFH28Hvq/LF66+/zjnnnMOMGTOoW7fuJsfr1q3LPffcw89//nNatGhB7dq16devH0cccQRf9kKZMGECL7zwAtuy6PHq1au5/fbbadiwITNmzCjpzuL/T6oBCv7Oh7NdSdK26dy5M1OnTs11DKlaeuqpp1i6dCndunWjTp061KlTh8cff5wxY8ZQp04dPv/8c3r16sWcOXP45JNPWLx4MQ888AAfffQRXbp0AeCRRx7hlVdeoXHjxmXngJKuXL179y53vbPPPpsvvviCZ599llmzZnHttddm/T1LX0fBFx92u5IkSdvr6KOPZu7cucyZM6fsUVRUxI9//GPmzJnDDjvsUNa2adOmtGrVijfeeINZs2bxgx/8AICLL76YF198sdw5AEaPHl1ugcjHHnuMMWPGMH78eLp168bll1/Ob3/7W+bPn5/dNy19DXa7kqSv4ek+u2b0/PtN9x8RUk3SrFkzmjVrVm5fo0aNaN68Od27dwfgzjvvpGXLlnTq1Im5c+cybNgwjj76aA477DAAOnToQIcOHTY5d8eOHcvujqxcuZLBgwczbNgwDjroIACGDBnC3XffzeDBg5k2bdpmp+iVqguLD0mq4Tp37sxJJ53EhAkTWLx4MUcffTR//etfWb16NccddxzPPPMMX3zxBQceeCDXX389O+20E1CyovlBBx3Eo48+yosvvsj+++/PbbfdRsuWLYGS/ufnnXcen376KWeccUa5az777LMMGzaMV199lQYNGjBgwACuuOIKdthhB1JKnHHGGUycOJE1a9bQqVMnbr/99rJ/gNV08dsPcx0hL6RLW+U6QtYtXryYM844g+LiYtq1a8fxxx/P73//+0qdY/jw4TRs2JCLL7643P4bb7yR7t27c9VVV/HrX/+6KmNLVargS2PHfEjKBxMnTuTBBx9k/vz5zJs3j4suuogNGzYwePBg3nnnHRYuXEiDBg3KrbYMcNttt3HzzTfzwQcfsHbtWkaPHg3AK6+8wimnnMKECRNYtGgRH330Ee+9917Z62rXrs1f/vIXli5dylNPPcUjjzzCmDFjAHjooYeYPn068+bNY/ny5dxxxx20aNEie98MqZqYNm1aubEYv/rVr3j33XdZu3Yt77zzDhdeeGG57libk1IqN83ujTfeyCuvvEL9+vXLtevQoQMff/yxhYeqvYIvPhzzISkfnHbaaXTs2JHmzZtz7rnncvvtt9OiRQsGDBhAw4YN+cY3vsG5557L448/Xu51gwcP5pvf/CYNGjTgRz/6UVkf87vuuovvf//79OnTh3r16nHhhReW68rRq1cv9ttvP+rUqVN25+XLc9etW5eVK1fy2muvkVJijz32oF27dtn7ZkiSqq2CLz4kKR907Nix7HmnTp1YtGgRq1at4qSTTqJTp040adKEPn368Mknn7B+/fqytm3bti173rBhQz799FMAFi1aVO6cjRo1Knf3Yt68eXz/+9+nbdu2NGnShHPOOYelS5cC0LdvX0477TR++ctf0rp1a4YOHcqKFSsy9t4lSTWHxYck5YF333237PnChQtp3749l19+Oa+//jrPPPMMK1asYPr06QBlawp8lXbt2pU756pVq/joo4/Ktk855RR233133njjDVasWMEll1xS7ry/+tWvmD17Nq+88grz5s3jz3/+c1W8TUlSDWfxIUl54LrrruO9995j2bJlXHzxxQwaNIiVK1fSoEEDmjVrxrJlyxg1atQ2n2/gwIH87//+LzNmzGDt2rWcf/75bNiwoez4ypUradKkCY0bN+a1117jr3/9a9mxf//73zzzzDOsW7eORo0aUb9+fWffkSQBFh8OOJeUF4499lgOO+wwunTpwq677sp5553H8OHDWb16NS1btmS//fbj8MMP3+bzdevWjeuuu45jjz2Wdu3aseOOO5bNkgUl6w7cdtttfOMb32DIkCEMGjSo7NiKFSsYMmQIO+64I506daJFixaMGDGiSt+vJKlmim25/V4IioqK0qxZs3IdQ1I19Oqrr7LHHnvkOsYWde7cmRtuuIF+/frlOsrXsqXvb0TMTikVbcMpsvqLzKl2q0a2p9r1c6sahThFsr6W2NKBgr/zIUmSJCk7LD4kSZIkZYUrnEtSDff222/nOoIkSdvEOx+SJEmSsqLgiw9nu5IkSZKyo+CLj5TS5JTS0KZNm+Y6iiRJkpTXCr74kCRJkpQdFh+SJEmSssLiQ5IkSVJWWHxIkiRJygrX+ZCkryF++2FGz58ubZXR80uSlAve+ZCkGq5z586MHj2aHj160LRpUwYNGsSaNWsYP348vXv3Ltc2InjzzTcBOPHEEzn11FM54ogjaNy4MQceeCBLlixh+PDh7Ljjjuy+++48//zz5a7zxz/+kT333JMdd9yRwYMHs2bNGgC6d+/O5MmTy9quW7eOli1blnu9JEkFX3y4zoekfHDHHXfwwAMPsGDBAl588UXGjx+/za+76KKLWLp0KfXq1WP//fenZ8+eLF26lIEDB3LGGWeUaz9x4kQefPBB5s+fz7x587jooosAOP744/n73/9e1m7KlCm0a9eOffbZp8reoySp5iv44sN1PiTlg1/96le0b9+e5s2b079/f+bMmbNNr/vhD39Ir169qF+/Pj/84Q+pX78+xx9/PLVr12bQoEGb3Lk47bTT6NixI82bN+fcc8/l9ttvB+CnP/0pU6ZMYcWKFQBMmDCB4447rmrfpCSpxiv44kOS8kHbtm3Lnjds2JBPP/10m17Xpk2bsucNGjTYZLvieTp27Fj2vFOnTixatAiA9u3bc+CBB3L33XfzySefcP/99/OTn/zka70XSVL+csC5JOWpRo0asWrVqrLtJUuWbPc533333bLnCxcupH379mXbJ5xwAjfccANffPEF+++/Px06dNju60mS8ot3PiQpT+211168/PLLzJkzhzVr1vCHP/xhu8953XXX8d5777Fs2TIuvvhiBg0aVHbs6KOP5rnnnuOqq67i+OOP3+5rSZLyj8WHJOWpb37zm5x//vn069eP3XbbbZOZr76OY489lsMOO4wuXbqw6667ct5555Uda9CgAQMGDGDBggUcc8wx230tSVL+iZRSrjNUC0VFRWnWrFm5jiGpGnr11VfZY489ch0j5zp37swNN9xAv379ttjmggsuYN68eeVmvtqaLX1/I2J2SqloG06R1V9kmV7jpVBkey0bP7eq4RpE2kaxpQOO+ZAkVYlly5Zx4403MmHChFxHkSRVU3a7kiRtt3HjxtGxY0eOOOII+vTpk+s4kqRqKm/vfETEP4GDgUdSSgNzHEeSary33357i8eGDBnCkCFDshdGklQj5fOdj6sAp1uRJEmSqom8LT5SStOAlbnOISk/ODlHZvh9laTCkvXiIyL6RMSkiHg/IlJEnLiZNqdGxIKIWBMRsyPioGznlKQv1a1bl9WrV+c6Rl5avXo1devWzXUMSVKW5OLOR2PgJWAYsMlv84gYREmXqUuAfYAngfsjYueN2syJiJc282hf8XyStL1at27N+++/z6pVq/xLfRVJKbFq1Sref/99Wrdunes4kgTAH//4RyKC0047rWzfPffcw/e+9z1atWpFRDBt2rRNXrdkyRKOO+442rZtS8OGDdlrr72YOHFi2fGXXnqJ+vXrc/fdd5d73dSpU6lbty4zZ87M2HuqbrI+4DylNAWYAhAR4zfT5AxgfEppXOn26RFxOHAK8LvSc+ydhaiSBECTJk0AWLRoEevWrctxmvxRt25d2rRpU/b9laRcevrppxk7diw9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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.data_cleaning import Replace\n", + "\n", + "housing_df = pd.read_parquet(housing_file_location)\n", + "columns = [\"RoofStyle\", \"HouseStyle\"]\n", + "to_replace_dict = {\n", + " \"RoofStyle\": {\"Gable\": \"Non-Gable\", \"Flat\": \"Apartment\"},\n", + " \"HouseStyle\": {\"2Story\": \"2Floors\"},\n", + "}\n", + "objs = [Replace(to_replace_dict=to_replace_dict)]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"Replace\")" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "588f6c24", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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3LlzWbZsGe3ateOFF14gNTUVgKlTpzJs2DCysrIYMmRIgT4//vhjBg0axIoVK0hKSqJ79+6MGTOGihUr4u4MGTKEadOmsWfPHho2bMiLL75Iy5YtA/9sIsHu+j7aIcQEfygt2iGUucWLF3PRRRflvR4xYgQjRoygd+/eTJkyhX/84x/cfffdXHfddWzfvp2GDRty3333ceuttxZo55lnniElJYXu3bsX6ePBBx/ku+++49///neB66NHj6ZVq1bcfffdjB07NjI3KFIG4n7aldZ8iEgsmDZtGm+99RarVq1i5cqV3H///eTm5tK3b1++++471q5dS1JSUpFfcl544QUmT57Mli1b2LdvX97c8y+++IKbb76ZqVOnsnHjRrZt28b69evz3peQkMBf/vIXtm7dygcffMA777zDhAkTAJg9ezYLFixg5cqV7Nixg5dffpkaNWoE92GIRMmFF15Y7LkGB086r127NpMnT2bDhg1kZ2fz5ZdfcttttxXZeGHkyJFs37692AXkf/rTn8jMzCQtrWDylpyczLfffqvEQ8q9uE8+tOZDRGLBrbfeSv369alevTpDhw7lxRdfpEaNGnTv3p0qVapw4oknMnToUN59990C7+vbty8/+9nPSEpK4le/+hUZGRkAvPLKK1x++eV06NCBSpUqcd999xU47bpt27acc845nHDCCXkjLwfbTkxMZNeuXXz55Ze4O82aNaNOnTrBfRgiIlJuxX3yISISC+rXr5/3vGHDhmzcuJHdu3dz00030bBhQ6pVq0aHDh348ccfOXDgQF7d2rVr5z2vUqUKWVlZAGzcuLFAm1WrVi0werFy5Uouv/xyateuTbVq1bjnnnvYunUrAB07duTWW2/llltuoWbNmvTv35+dO3dG7N5FROT4oeRDRCQGrFu3Lu/52rVrqVu3Lo899hhfffUVH330ETt37mTBggUAuB/5QPA6deoUaHP37t1s27Yt7/XNN9/MGWecwddff83OnTsZNWpUgXZ///vfs2TJEr744gtWrlzJo48+Wha3KSIixzklHyIiMWD8+PGsX7+e7du388ADD9CzZ0927dpFUlISJ510Etu3b2fkyJElbq9Hjx783//9HwsXLmTfvn0MHz68wHagu3btolq1aiQnJ/Pll1/y17/+Na/sk08+4aOPPiInJ4eqVatSuXLlAlO2REQkfsX9TwMtOBeRWHDttdfSpUsXmjRpwqmnnsqwYcMYPHgw2dnZpKamcs455xQ5QflwWrRowfjx47n22mupU6cOJ598ct4uWRDaWeeFF17gxBNPpF+/fvTs2TOvbOfOnfTr14+TTz6Zhg0bUqNGDW6//fYyvV8RETk+WUmG3+NBenq6L168ONphiEg5tGLFCpo1axbtMA6pUaNGTJo0iU6dOkU7lKNyqM/XzJa4e3oJmgj0B5m22i0bQW+1q+9b2YjFLZIlIuxQBXE/8iEiIiIiIsFQ8iEiIiIiIoHQCeciIse5NWvWRDsEERGREtHIh4iIiIiIBCLukw/tdiUiIiIiEoy4Tz7cfaa7909JSYl2KCIiIiIiMS3ukw8REREREQmGkg8REREREQmEkg8REREREQmEkg8REREREQmEzvkQETkKdtf3EW3fH0qLaPsiIiLRoJEPEZHjXKNGjRg9ejStWrUiJSWFnj17smfPHqZMmcJ5551XoK6Z8c033wDQp08fBgwYwKWXXkpycjLt27dn8+bNDB48mJNPPpkzzjiDpUuXFujnwQcfpHnz5px88sn07duXPXv2ANCyZUtmzpyZVzcnJ4fU1NQC7xcREYn75EPnfIhILHj55Zd58803Wb16NcuWLWPKlCklft/999/P1q1bqVSpEu3ataNNmzZs3bqVHj16MGTIkAL1p02bxltvvcWqVatYuXIl999/PwC9evXi73//e169WbNmUadOHVq3bl1m9ygiIse/uE8+dM6HiMSC3//+99StW5fq1avTrVs3MjIySvS+q6++mrZt21K5cmWuvvpqKleuTK9evUhISKBnz55FRi5uvfVW6tevT/Xq1Rk6dCgvvvgiAL/5zW+YNWsWO3fuBGDq1Klcf/31ZXuTIiJy3Iv75ENEJBbUrl0773mVKlXIysoq0ftq1aqV9zwpKanI68Lt1K9fP+95w4YN2bhxIwB169alffv2vPrqq/z444+88cYbXHfddUd1LyIiEru04FxEJEZVrVqV3bt3573evHnzMbe5bt26vOdr166lbt26ea979+7NpEmT2L9/P+3ataNevXrH3J+IiMQWjXyIiMSos846i88//5yMjAz27NnDn//852Nuc/z48axfv57t27fzwAMP0LNnz7yyq666ik8//ZSxY8fSq1evY+5LRERij5IPEZEY9bOf/Yzh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kEERERERkWDEffKhBeciIiIiIsGI++RDRERERESCoeRDREREREQCoeRDREREREQCoeRDREREREQCEffJh3a7EhEREREJRtwnH9rtSkREREQkGHGffIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCDiPvnQIYMiIiIiIsGI++RDhwyKiIiIiAQj7pMPEREREREJhpIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJxAnRDiASzGwNsBPIBX5w94uiG5GIiIiIiMRk8hF2rrtnRTsIEREREREJ0bQrEREREREJRKDJh5l1MLMZZrbBzNzM+hRTZ4CZrTazPWa2xMzOP4quHHjXzD4xs+uOOXARERERETlmQU+7SgY+A54PPwows57AWGAAsDD89Q0za+7ua8N1Mig+7i7uvjH8/Dx332BmdYA5Zrbc3ZeV/e2IiIiIiEhJBZp8uPssYBaAmU0ppsoQYIq7Twy/HmhmlwA3A3eH2zi7BP1sCH/dZGazgDaAkg8RERERkSgqN2s+zKwi0BaYXahoNnBuKdqpamYnhp8nAx2Bzw9Rt7+ZLTazxd9///3RBS4iIiIiIiVSbpIPIBVIADILXc8EapeinVrAQjP7D/Ah8Ly7f1JcRXd/2t3T3T09LS3taGIWEREREZESirmtdt39W+CsktY3s25At6ZNm0YuKBERERERKVcjH1uBA4RGLvKrBWyOVKfuPtPd+6ekpESqCxERERERoRwlH+6+D1gCdC5U1Bl4P/iIRERERESkLAU67Sq8APzg/KYKQAMzOxvYHt5Kdwww1cw+BhYBvwPqAk9FMCZNuxIRERERCUDQIx/pwNLwIwkYGX5+L4C7vwQMBoYBGcB5QFd3/y5SAWnalYiIiIhIMII+52M+YEeoMwGYEEhAIiIiIiISmJjb7aq0NO1KRMoDu6v8nzXkD2lLchEROTblZsF5tGjalYiIiIhIMOI++RARERERkWDEffJhZt3M7OkdO3ZEOxQRERERkZgW98mHpl2JiIiIiAQj7heci8QaLVwWERGR8krJhxySfokVERERkbIU99OutOZDRERERCQYcZ98aM2HiIiIiEgw4j75EBERERGRYCj5EBERERGRQCj5EBERERGR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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.binning import CustomBinning\n", + "\n", + "bins = {\"LotArea\": [1300, 13000, 216000]}\n", + "column = [\"LotArea\"]\n", + "objs = [CustomBinning(bins=bins)]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"CustomBinning\")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "6eb5ae1a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/opensource/gators/benchmarks/benchmark.py:322: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " XN[f\"{col}{i}\"] = X[col].copy()\n" + ] + }, + { + "data": { + "image/png": "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IvpExN2LFi3KRXiSJKlATZgwgRNOOIF27doREev9YVpaWsqZZ55J27ZtadiwIccccwwffvhhhTp33303Rx11FDvvvDMRUd4jt9Y777zDjjvuyGOPPVbh/Pjx46lfvz4TJxbN6J2c2HvvvenQoQM///nPWbBgAV9++SW/+tWv+PTTT5k7t+JidyNGjKBx48Y0btyYJ598kmeffbZC4gHQuXNnLr74Yh588EEuvfTSQk08NmlbSj7mA6tZf7WT1sBnW9poSmlsSmng2uEJkiRJW2Lp0qV06dKF2267jZKSiusZpJQ48cQT+fDDD3niiSeYMmUKHTt2pFevXixbVr59DcuXL6d3797lQwQr69KlC8OGDePss8+mtDSz+vSiRYvo378/F154IYcfXjTzlnOifv36PP7448yYMYPmzZvTsGFDnn/+eY499li2267in9GnnnoqU6ZM4cUXX2TPPffkP/7jP1i+fHmFOmVlZTz00EM0bNiQl19+mbo6AqlWpZTq5IPMxMwzK517Hbi70rnpwC+39noHH3xwkiTVHcCkVLWf4VKd06hRo3TfffeVH3/wwQcJSFOnTi0/t3r16tSyZcs0cuTI9V7/5ptvJiDNnDlzvbLVq1enb37zm+mEE05IKaV02mmnpf333z+tXLmyxu+j2FT+3Na1cOHCNG/evJRSSt/4xjfSueeeu9F2Vq5cmRo2bJjuv//+CucHDRqUdt999/TOO++knXbaKd1+++01Fnsds9Gf2XWq5yMiGkfEQRFxEJlemQ7Z47VL6d4MnBkRZ0XEPhFxG5m9Pe7aims67EqSJNWqlStXAlRYsGK77bajQYMGvPzyy9Vqa7vttuMPf/gD48eP59RTT+VPf/oT999/fyFOWq5TmjZtSsuWLfnwww+ZNGkS3/ve9zZad+0f2ms/d4Dnn3+eESNGMGrUKPbbbz9uuukmLr30UmbMmJGL8OuM7fMdQCXdgefXOR6WffyBTC/I/2Q3i7oCaENmWbTjUkofr9dSFaWUxgJju3fvPmDLw5ZU6BYvXsy8efNYtWpVvkMpGPXr16dVq1blK2JJhWzduQMjR46kcePG3HLLLRucO1AVa+cODBs2jF/84hdFOXegpixdupR//OMfQGZFqlmzZjF16lSaNWtGhw4deOSRR2jRogUdO3Zk2rRpXHDBBZx44on07t0byEwif+yxx+jVqxctW7bk008/5YYbbqBBgwYcf/zxQGYVwP79+3PBBRdw5JGZ/bEHDBjAY489Rv/+/XnhhRfWG8ZVqOpU8pFSeoFNzI7P1hlBZmMvScqJxYsXU1paSrt27SgpKamw/K22TEqJsrIyZs/ObE5uAqJCt3buwI9+9COaN29OvXr16NWrF8cee+wWjfvf0NwBfzZtmUmTJnHUUUeVHw8dOpShQ4dyxhlnMGrUKObOncuQIUMoLS2lTZs2nH766fziF78or9+gQQNeeOEFbrrpJhYuXEjr1q3p0aMHr776KrvuuisAgwcPpmHDhlx33XUVrn3vvfeWzxP66U9/mpsbzrM6lXzkQ0T0Afq4TrukjZk3bx7t2rWjYcOG+Q6lYEQEDRs2pF27dsyZM8fkQ0Xh4IMPZurUqSxatIgvv/ySli1bcsghh9C9e/dqt3XJJZfw1Vdf8cYbb3DYYYdxxx13MGjQoFqIuvB9+9vf3mQCeP7553P++edvtLx9+/Y8+eSTm7zGvffeu8Hz7dq144svvqhaoAWiOPp3NiG52pWkzVi1atV6K9eoZpSUlDiUTUWnOnMHNsS5A9qWFX3PhyRVhcMZaofvqwrJ1s4dAPjss8/47LPPmD59OgB///vfWbhwIR06dKBZs2bOHdA2r+j/d7ralSRVTadOnRg/fny+w5DqrEmTJtG1a1e6du1KWVkZQ4cOpWvXrlx55ZUAzJ07l9NPP529996b888/n9NOO42HHnqoQht33XUXXbt25dRTTwXg3//93+natStjxowBNj13YNq0adx22205uFNpy8WWTHIqRN27d0+TJk3KdxiS6qD33nuPffbZJ99h5F2nTp2455576NWrV422u7H3NyImp5SqMhjeX2SSVLdstFvbYVeStAVe6/H1Wm3/0AmO3ZYkFR6TD0naxnXq1Ikf//jHjB49mrlz53LiiSfy29/+lrKyMk477TRef/11vvrqKw4//HDuuusuvva1rwGZFV6OPPJInnvuOd5++20OO+wwHnzwQVq0aAHA6NGjueKKK1i6dClDhgypcM033niDCy64gPfee4+SkhL69u3LzTffzA477EBKiSFDhvDAAw+wYsUKOnbsyEMPPUSXLl1y/t5I2rbFpZ/nO4SCkG5ome8QyjnnwzkfkgrAAw88wNNPP82MGTOYPn061157LWvWrKF///58/PHHzJo1i5KSEs4777wKr3vwwQe57777mDdvHl9++SXDhw8HMpNczznnHEaPHs2cOXP417/+xaefflr+unr16nHLLbcwf/58Xn31VZ599llGjMhswfTMM88wYcIEpk+fzqJFi3j44Ydp3rx57t4MSVKdVfTJh0vtSioE5513Hu3bt6dZs2ZcfvnlPPTQQzRv3py+ffvSsGFDdtppJy6//HJefPHFCq/r378/e+65JyUlJfzgBz9g6tSpADz66KMcf/zx9OjRgwYNGnDNNddUWEHn4IMP5tBDD2X77bcv73lZ23b9+vVZsmQJ77//Pikl9tlnH9q0aZO7N6MATJgwgRNOOIF27doREYwaNapC+dKlSxk0aBBf+9rXKCkpYa+99uKWW24pL1+wYAGDBg1i7733pqSkhPbt23POOefwr3/9q7zOO++8w4477shjjz1Woe3x48dTv359Jk6cWKv3KKk4FX3yIUmFoH379uXPO3bsyJw5c1i+fDk//vGP6dixI02aNKFHjx4sXLiQ1atXl9ddu/suQMOGDVm6dCkAc+bMqdBmo0aNKvReTJ8+neOPP55dd92VJk2a8POf/5z58+cD0LNnT8477zx+8pOf0KpVKwYOHMjixYtr7d4L0dKlS8t3Pd7QHjNDhgzhf//3fxk9ejTvvfcel19+OZdeeimjR48GMp/f7NmzufHGG5k2bRp//OMfmTBhAv/1X/9V3kaXLl0YNmwYZ599NqWlpQAsWrSI/v37c+GFF3L44Yfn5mYlFRXnfEhSAfjkk0/Kn8+aNYu2bdty00038cEHH/D666+z6667MnXqVLp27brJnXzXatOmDe+991758fLlyyt8a37OOefQtWtXHnroIXbaaSduvfVWHn300fLytTsCz5s3jx/84Af8+te/5pprrqmhuy18xx13HMcddxwAZ5555nrlr7zyCqeddhpHHXUUkJn3c++99/L6669z2mmn0aVLFx5//PHy+p07d+bXv/41xx9/PIsXLy7fUf7iiy9mzJgxDBw4kL/85S8MGjSIXXbZhauvvrr2bzLHnDtQM+rS3AFtm+z5kKQCcOedd/Lpp5+yYMECrrvuOvr168eSJUsoKSlh5513ZsGCBQwbNqzK7Z188sn89a9/5eWXX+bLL7/kyiuvZM2aNeXlS5YsoUmTJjRu3Jj333+f3/72t+Vlb775Jq+//jqrVq2iUaNG7Ljjjm56VsOOOOIIxo4dW550vvLKK0ydOpVjjjlmo69ZvHgxDRo0oGHDhuXntttuO/7whz8wfvx4Tj31VP70pz9x//33s8MOO9T6PUgqTkX/28AJ55IKwSmnnELv3r3Zfffd+frXv84VV1zB4MGDKSsro0WLFhx66KGb/MO0sv32248777yTU045hTZt2rDLLruUr5IFMHz4cB588EF22mknBgwYQL9+/crLFi9ezIABA9hll13o2LEjzZs35+KLL67R+y12t99+OwceeCAdOnSgfv36fOtb3+JXv/oVxx9//AbrL1y4kF/84hcMGDCA7bevOOihc+fOXHzxxTz44INceumlHHTQQbm4BUlFyk0Gs9xkUNLG1PVNBmtr879ccZPBTWvcuDF33HFHheFXN910E3fffTfDhw+nY8eOTJgwgUsvvZRHH310vSRz6dKlHHvssdSrV4+nnnqKHXfcsUJ5WVkZBx10EJ9++imHHHIIzz77LBEb3R9sm+Wwq5qR62FXfm41Iw/D5Tb6Q6Toez4kSdqWlJWVcdlll3HjjTfSp08fDjjgAM477zz+8z//s3yp5LWWLl1aPnfkr3/963qJB8All1zCV199xRtvvMGkSZO44447cnIfkoqTyYckSduQVatWsWrVKurVq1fhfL169dabl3PMMcewevVqxo0bR+PGjddr6/nnn2fEiBGMGjWK/fbbj5tuuolLL72UGTNm1Pp9SCpOrnYlSdu4jz76KN8hqIYtXbqUf/zjHwCsWbOGWbNmMXXqVJo1a0aHDh341re+xaWXXkrjxo3p2LEjL774Ivfffz833ngjkEk8evfuzeLFi3niiSdYtmwZy5YtA6BZs2bssMMOLFmyhP79+3PBBRdw5JFHAjBgwAAee+wx+vfvzwsvvOBCAZJqnD9VJEmqYyZNmkTXrl3p2rUrZWVlDB06lK5du3LllVcC8Kc//Yl/+7d/49RTT2Xfffflhhtu4JprrinfwX7y5Mm89tpr/P3vf2fPPfekTZs25Y9XXnkFgMGDB9OwYUOuu+66Cte+9957mTZtGrfddltub1pSUSj6no+I6AP06dy5c75DkSQJgG9/+9ub3I9l11135b777tvi10MmydiQdu3a8cUXX1QtUEmqpqLv+UgpjU0pDWzatGm+Q5EkSZIKWtEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKiaKfcC5JUnW443LNyMOOy5LqAJMPSdoCtf0HqH+YSZIKkcOuJGkb16lTJ4YPH84BBxxA06ZN6devHytWrGDUqFEcccQRFepGRPnmdWeeeSbnnnsuxx57LI0bN+bwww/ns88+Y/Dgweyyyy7svffeTJkypcJ1fvnLX7Lvvvuyyy670L9/f1asWAFAly5dGDt2bHndVatW0aJFiwqvlySp6JOPiOgTEXcvWrQo36FI0hZ7+OGHeeqpp5g5cyZvv/02o0aNqvLrrr32WubPn0+DBg047LDD6NatG/Pnz+fkk09myJAhFeo/8MADPP3008yYMYPp06dz7bXXAnD66afzxz/+sbzeuHHjaNOmDV27dq2xe5QkbfuKPvlwnw9JheD888+nbdu2NGvWjD59+jB16tQqve773/8+Bx98MDvuuCPf//732XHHHTn99NOpV68e/fr1W6/n4rzzzqN9+/Y0a9aMyy+/nIceegiA//7v/2bcuHEsXrwYgNGjR3PaaafV7E1KkrZ5RZ98SFIh2HXXXcufN2zYkKVLl1bpda1bty5/XlJSst5x5Xbat29f/rxjx47MmTMHgLZt23L44Yfz2GOPsXDhQp588klOPfXULboXSVLhcsK5JBWoRo0asXz58vLjzz77bKvb/OSTT8qfz5o1i7Zt25Yfn3HGGdxzzz189dVXHHbYYbRr126rrydJKiz2fEhSgTrwwAN59913mTp1KitWrOCqq67a6jbvvPNOPv30UxYsWMB1111Hv379ystOPPFE3nrrLW677TZOP/30rb6WJKnwmHxIUoHac889ufLKK+nVqxd77LHHeitfbYlTTjmF3r17s/vuu/P1r3+dK664oryspKSEvn37MnPmTE466aStvpYkqfBESinfMdQJ3bt3T5MmTcp3GJLqoPfee4999tkn32HkXadOnbjnnnvo1avXRutcffXVTJ8+vcLKV5uzsfc3IianlLpXoYmc/iJzk8Gakeu9bPzcaoaf27YpD3tHxcYKnPMhSaoRCxYs4N5772X06NH5DkWSVEc57EqStNVGjhxJ+/btOfbYY+nRo0e+w5Ek1VEF2/MREX8Gvg08m1I6Oc/hSNI276OPPtpo2YABAxgwYEDugpEkbZMKuefjNsDlViRJkqQ6omCTj5TSC8CSfMchqTC4OEft8H2V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2rZty2677Zbv8CSpIG0y+UgpDVvn+VW1Ho0kSTkwefJkvvOd77Dbbrvx7rvvcvHFF9OiRQv+9re/MX36dB588MF8hyhJBanK+3xExHMRsd62rxHRJCKeq9mwcsdNBiWp+Fx00UVccMEFTJkyhQYNGpSf/+53v8vEiRPzGJkkFbbqbDL4bWCHDZzfkcweINskNxmUpOIzefJkzjjjjPXOt2nThtLS0jxEJEnFYbOrXUVEt3UOD4iIBesc1wO+C8yu6cAkSaotJSUlfPHFF+udf//992nVqlUeIpKk4lCVpXYnkZlonoBnNlBeBgyqyaAkqSa91uPr+Q5hsw6dMCPfIRSV733vewwbNoxHHnkEgIjgo48+4pJLLqFv3755jk6SCldVhl3tBnydzP4c38ger320A5qklH5faxHWMud8SFLxGT58OAsWLKBly5YsX76cI444gs6dO7Pzzjtz7bXX5js8SSpYm+35WGd38erMD9lmuNSuJBWfJk2a8PLLL/Pcc8/x1ltvsWbNGrp160avXr3yHZokFbRq7XAeEV8DegCtqJSMpJRursG4Ctq2MAQEHAZSmZ+bVHh69uxJz5498x2GJBWNKicfEXEq8HvgK+BzKm44mACTD0nSNmPKlCk8//zzzJs3jzVr1lQou/HGG/MUlSQVtur0fFwN3AT8IqW0upbiybmI6AP06dy5c75DkSTlyI033sill15Kx44dad26NRFRXrbuc0lSzapO8tEauKeQEg9wzockFaNbbrmF3/72t/z4xz/OdyiSVFSqM4l8HHBIbQUiSVKurFmzhu985zv5DkOSik51ej7+BvwqIvYDpgGr1i1MKT1ek4FJklRbzjnnHO677z6uu+66fIciSUWlOsnH77L//nwDZYnMbueSJNV5Q4cO5bjjjqNr16506dKF+vXrVyj//e+32e2rJKlOq3LykVIqyH0+JEnF5/LLL+eZZ56hW7dufPHFF04yl6QcqdY+H4XI1a4kqfiMGDGCBx98kH79+uU7FEkqKtXZ52PIpsq31U0GXe1KkopPSUkJXbt2zXcYklR0qtPzMajScX2gDVAGzMNNBiVJ24if/vSn3Hrrrdx5550OuZKkHKrOnI/dKp+LiNbAfcDImgxKkqTa9NJLLzFhwgT+93//l3333Xe9CedjxozJU2SSVNi2as5HSqk0Ii4HHgb+XDMhSZJUu1q0aMFJJ52U7zAkqejUxITz7cjsfi5J0jbhvvvuy3cIklSUqjPhvPJXREFmzsdPgJdqMihJkiRJhac6PR+PVjpOwOfAc8CFNRaRJEm14IADDuDFF19kl112Yf/999/kRPO33347h5FJUvFwk0FJUlHo27cvDRo0KH/uKleSlHtVSj4ioj7wMnB6SumD2g0pt9xkUJKKw9ChQ8ufX3XVVfkLRJKKWJV6M1JKq4DdyAy1KigppbEppYFNmzbNdyiSpBzp2bMnCxcuXO/84sWL6dmzZx4ikqTiUJ2hVH8A3AVckrTNe+GFF/jyyy/XO79ixQpeesk1VCSptlRnwnkj4NSIOBqYDCxbtzCldH5NBiZJUk176623yp+//fbbNGvWrPx49erVPP3007Rr1y4foUlSUahO8rEPsPan9u6VygpuOJYkqfB0796diCAi6N2793rlJSUl/OY3v8lDZJJUHKqz2tVRtRmIJEm1bebMmaSU2H333XnjjTdo2bJledkOO+xAq1atqFevXh4jlKTCVhM7nEuStE3o2LEjAGvWrMlzJJJUnEw+JElF6dNPP2XChAnMmzdvvWRkyJAheYpKkgqbyYckqeg88MAD/PCHP2T77benZcuWFTYcjAiTD0mqJQWbfEREQ+A94JGU0kX5jkeSVHdceeWVXHjhhVxzzTXO8ZCkHKrOPh/bmsuB1/IdhCSp7iktLeWss84y8ZCkHCvI5CMi9gD2Bp7MdyySpLrnuOOO4/XXX893GJJUdHI67CoiegAXAQcDbYH+KaVRleqcC1wMtAHeBQanlKq73ezwbBvf3NqYJUmF5+ijj+aSSy7h3XffZf/996d+/foVyk866aQ8RSZJhS3Xcz4aA+8A92cfFUREP+A24Fzg5ey/T0bEvimlWdk6U9lw3L1TSnMi4nvA9JTS9Igw+ZAkrefHP/4xANdff/16ZRHB6tWrcx2SJBWFnCYfKaVxwDiAiBi1gSpDgFEppZHZ40ERcQxwDnBZto2DNnOZQ4H/jIj/IJPs1I+IxSmlq2vgFiRJBcB9PiQpP+rMnI+I2IHMcKxnKhU9QzWGT6WULksptU8pdSIzxGvkxhKPiBgYEZMiYtLnn3++hZFLkiRJqoq6tNRuC6AeUFrpfCnQqzYumFK6G7gboHv37qk2riFJqntuvvnmTZa7z4ck1Y66lHzUuMqT2TckIvoAfTp37lz7AUmS6oTf/OY3FY5XrVrF3LlzKSkpoVWrViYfklRL6lLyMR9YDbSudL418FltXTSlNBYY27179wG1dQ1JUt0yc+bM9c6VlpbSv39/Bgzw14Ek1ZY6M+cjpfQlMBk4ulLR0cArtXXdiOgTEXcvWrSoti4hSdoGtG7dmuuuu46f/exn+Q5FkgpWTpOPiGgcEQdFxEHZa3fIHnfIVrkZODMizoqIfSLiNjL7gdxVWzGllMamlAY2bdq0ti4hSdpGrFmzhtLSylMPJUk1JdfDrroDz69zPCz7+ANwZkrpfyKiOXAFmU0G3wGOSyl9nOM4JUkF7PHHH69wnFJi7ty53HnnnRx55JF5ikqSCl+u9/l4AYjN1BkBjMhJQDjhXJKK0cknn1zhOCJo2bIlPXv25KabbspTVJJU+OrShPO8cMK5JBUfNxmUpPyoMxPOJUnKhVWrVnHIIYfwwQcf5DsUSSo6RZ98uNqVJBWX+vXrM3PmTCI2OQpYklQLij75cLUrSSo+Z5xxBiNHjsx3GJJUdIp+zockqfgsW7aMBx54gL/97W8cfPDBNGrUqEL57bffnqfIJKmwmXxIkorOe++9R7du3QD45z//WaHM4ViSVHuKPvlwqV1JKj7PP//85itJkmqccz6c8yFJkiTlRNEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKiaJPPtxkUJIkScqNok8+nHAuSZIk5UbRJx+SJEmScsPkQ5IkSVJOmHxIkiRJygmTD0mSJEk5UfTJh6tdSZIkSblR9MmHq11JkiRJuVH0yYckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSeKPvlwk0FJkiQpN4o++XCTQUmSJCk3ij75kCRJkpQbJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSe2z3cAtSEiPgIWA2uAL1JKR+U3IkmSJEkFmXxkfTOltDTfQUiSJEnKcNiVJEmSpJzIafIRET0iYkxEzI6IFBFnbqDOuRExMyJWRMTkiDhyCy6VgBcj4s2IOHWrA5ckSZK01XI97Kox8A5wf/ZRQUT0A24DzgVezv77ZETsm1Kala0zlQ3H3TulNCf7/IiU0uyIaAOMj4hpKaW3a/52JEmSJFVVTpOPlNI4YBxARIzaQJUhwKiU0sjs8aCIOAY4B7gs28ZBVbjO7Oy/cyNiHNANMPmQJEmS8qjOzPmIiB2Ag4FnKhU9A3yzGu00ioidss8bAz2BdzdSd2BETIqISZ9//vmWBS5JkiSpSupM8gG0AOoBpZXOlwK7VqOd1sDLEfH/gNeA+1NKb26oYkrp7pRS95RS95YtW25JzJIkSZKqqOCW2k0p/RM4sKr1I6IP0Kdz5861F5QkSZKkOtXzMR9YTabnYl2tgc9q66IppbEppYFNmzatrUtIkiRJog4lHymlL4HJwNGVio4GXsl9RJIkSZJqUk6HXWUngK8d37Qd0CEiDgIWZJfSvRkYHRFvABOBs4G2wF21GJPDriRJkqQcyHXPR3dgSvZRAgzLPr8aIKX0P8Bg4ApgKnAEcFxK6ePaCshhV5IkSVJu5HqfjxeA2EydEcCInAQkSZIkKWfqzJyPfImIPhFx96JFi/IdiiRJklTQij75cNiVJEmSlBtFn3xIkiRJyo2iTz4cdiVJkiTlRtEnHw67kiRJknKj6JMPSZIkSblh8iFJkiQpJ4o++XDOhyRJkpQbRZ98OOdDkiRJyo2iTz4kSZIk5YbJhyRJkqScMPmQJEmSlBNFn3w44VySJEnKjaJPPpxwLkmSJOVG0ScfkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOVH0yYerXUmSJEm5UfTJh6tdSZIkSblR9MmHJEmSpNzYPt8BSJIgLv083yFsVrqhZb5DkCRt40w+tFH+MSRJkqSaZPIhFRiTRkmSVFc550OSJElSTph8SJIkScqJok8+3OdDkiRJyo2iTz7c50OSJEnKjaJPPiRJkiTlhsmHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkScoJkw9JkiRJOVGQyUdE7BYRz0fE3yNiWkQ0yndMkiRJUrHbPt8B1JJRwBUppZciohmwMs/xSJIkSUWv4JKPiNgPWJVSegkgpbQgzyFJkiRJIsfDriKiR0SMiYjZEZEi4swN1Dk3ImZGxIqImBwRR1bzMnsASyNibES8FRE/r5HgJUmSJG2VXPd8NAbeAe7PPiqIiH7AbcC5wMvZf5+MiH1TSrOydaay4bh7p5TmZMuOBA4C5gFPRcSbKaW/1cL9SJIkSaqinCYfKaVxwDiAiBi1gSpDgFEppZHZ40ERcQxwDnBZto2DNnOZ2cCklNIn2euMI5OImHxIkiRJeRQppfxcOGIpcF5KaVT2eAdgOfBfKaVH1ql3J9AlpfStKra7PfAm0BNYBPwF+F1K6a8bqDsQGJg93Av4YItvqDC1AObnOwhVm5/btsnPbX0dU0ot8x3EtigiBqaU7s53HKoeP7dtk59b9dSlCectgHpAaaXzpUCvqjaSUvoqO89jAhDAMxtKPLJ17wb8z7IRETEppdQ933Goevzctk1+bqphA/H327bIz23b5OdWDXUp+agxKaUngSfzHYckSZKk/1OXNhmcD6wGWlc63xr4LPfhSJIkSapJdSb5SCl9CUwGjq5UdDTwSu4jEnYhbqv83LZNfm6qSf5/2jb5uW2b/NyqIacTziOiMdA5e/gKcAMwBliQUpqVXWp3NJkldicCZwM/gv/f3v2H+l3VcRx/vsYsf5WN1M0gLbLURjUFy9myRWnTPwot6A8jFpXSQkwUoSgqwgoyKhJhEDExlhCGbiNMDX/kGBoSLvNHE1KptalNV66Vqe/++HxW33393rt7d+/9fO/33ucDDt/Pj/M9n/PdYe8P53PO51yWVtUTnVVUkiRJ0rTruvOxErhjwKnrqmp1m2cNcCVwHM3fBLmsqu7uqo6SJEmSZsbQltqVJEmSNL/Mmnc+NDskOSvJhiR/SVJJVg+7Ttrfgdooja8n2Z5kb5I7kywdUnXnrelopySLklyfZHebrk/yuk5/iEaG8Xs0GMNHgzF85tj5UL8jaaa7XQrsHXJdNNiB2uhK4HLgEuB04CngtiSv6ayGgulpp/XAacCqNp1G816cNIjxezQYw0eDMXyGOO1KY+r/K/SaffrbKEmA7cA1VXVVe+wwmqB4RVWtHVZd57ODaackpwAPASuqanObZwXwG+Dkqnq0+1+iUWH8Hg3G8NFgDJ9ejnxIc8ubgSXArfsOVNVe4G7gzGFVSq8wkXZaDjzP/kuNbwb2YFtKc5UxfDQYw6fAzoc0tyxpP3f2Hd/Zc07DN5F2WgI8XT3D0+32U9iW0lxlDB8NxvApsPMhSZIkqRN2PqS5ZUf7ubjv+OKecxq+ibTTDuCYdm4x8L95xsdiW0pzlTF8NBjDp8DOhzS3/IkmqJ2970CSQ4H3sf+8Uw3XRNppC81qK8t7vrccOALbUpqrjOGjwRg+BQuHXQHNLkmOBE5sdxcAxydZBuyqqieHVzPtc6A2SvID4MtJHgH+CHyF5qW39UOp8Dw11XaqqoeT3AKsTXJRW85aYNN8XiVFYzN+jwZj+Ggwhs8cl9rVfpKsBO4YcOq6qlrdbW00yIHaqB3W/RpwMbAIuBf4QlU92F0tNR3tlGQR8CPgI+2hDTTLPT43k3XXaDJ+jwZj+Ggwhs8cOx+SJEmSOuE7H5IkSZI6YedDkiRJUifsfEiSJEnqhJ0PSZIkSZ2w8yFJkiSpE3Y+JEmSJHXCzoc0REmWJLk1yZ4kM7LudZKVSSrJ0TNRviTNV8ZwafLsfEgTkOSYJC8kOSLJIe2N5vhpKPoK4A3AMuC4aShPktTHGC7NHguHXQFpRCwHHqiqPUneA+yqqienodwTgfurats0lCVJGswYLs0SjnxIE3MmsLndXtGzPa4kFyd5rH3i9liSz/Wcexz4KPCpdkh93TjlnJfk3iR7i2KhDgAAA9BJREFUk/wtycYkh7bnFiW5Lsmz7fnbkywdp6zVSZ7vO7bfsP6+PEnOTfJIkn8m2ZDkqCQfT7Itye4k1yc5rKecO5Ncm+RbSZ5J8lSSq5Ms6MlzQZKtbV13JbkryeKJ/HtK0kEyhhvDNUs48iGNoR2S39ruHg68lGQ1cBhQSZ4D1lfVmjG+fz5wDXAZcCvwYeDaJDuqaiNwOrAe2AVcCuwdo5xVwAbgO8Cnaf7fnsP/Hx6sA06iuQk+C1wF3JLkbVU1sMwJejVwOXAh8CrgxjbtBT4GvB74BbAG+F7P9y4Efkhzs1/W/sb7gZ8lWQLcAHypLetI4Iwp1FGSBjKGG8M1S1WVyWQakGhuEG8C3gm80H6+BfgHcFZ77uhxvr8Z+EnfsXXAPT37m4B1B6jHZuCGMc69FSjgrJ5jRwG7gc+2+yvbPEe3+6uB5/vKGZSngJN68lwNvNT7m9vfs6ln/05gS1/ZtwE/brdPa8s9YdjtazKZ5nYyhhvDTbMzOe1KGkNVvVhVjwMnA7+tqq3AEmBnVd1dVY9X1TPjFHEKrxzavwd4+ySrcirw63Gu8TKwpafeu4HfH8R1+v27qh7t2d8J7Oj7zTuBY/u+t7Vvf3tPngeA24EHk9yY5PNJjpliPSXpFYzhxnDNTk67ksaQ5A/ACcAhwIJ2ju1CYGG7/URVjTkvdxwzshzjJK7zMpC+Y4cMyPfigPL+M+BY/0OMMfNU1UtJzqEZpj8H+Azw7STvr6oHxqivJE2aMdwYrtnJkQ9pbOfRzHfdAXyy3X4Q+GK7fd4Bvv8w8N6+YyuAhyZZj98BHxznGgtoVnIBIMlrgXeMc52ngcPbfPssm2SdDlo1tlTVN2jmTG8HPtHV9SXNG8bwGWAM11Q58iGNoaqeaF+uWwzcTPP0ZylwY1X9dQJFfBf4eZL7aV5WXEXzIt8Fk6zKVcDGJI/RvPgXmidOa6tqW5KbgbVJLgKea/P/vc07yL3AHpqnVd8H3kXzwuGMS3IG8CHgVzTD/acCb2TyN3NJGpcxfPoZwzUdHPmQxreSZq7wv4B3A3+e4E2LqroJuIRmpZSHaFZDWVPNKikTVlW/BM4HzqV5gnYX8AGaoXdoVk+5j2Y1lftoVnVZVWOsklJVu2huoGfTzCu+CPjqZOo0BbtpniRuArbRrLDyzar6aUfXlzS/rMQYPp2M4ZqyVHU1dVGSJEnSfObIhyRJkqRO2PmQJEmS1Ak7H5IkSZI6YedDkiRJUifsfEiSJEnqhJ0PSZIkSZ2w8yFJkiSpE3Y+JEmSJHXCzockSZKkTvwXPlashK0f/UUAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.imputers import NumericImputer\n", + "\n", + "housing_df = pd.read_parquet(housing_file_location)\n", + "columns = [\"MasVnrArea\", \"GarageYrBlt\", \"LotFrontage\"]\n", + "housing_df = housing_df[columns]\n", + "objs = [NumericImputer(strategy=\"median\")]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", + "plot_all(bench_scalers, name=\"IntImputer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "82282ed8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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H2bkyJEkJyczeLBne6RBgwbRuHFj6tSpw+OPP86UKVOIjIzkpZdeYvv27eza5VnnolWrVkRGRjJ8+HD+/nfPOhYjR47M6tUtqHbt2nHXXXcxffp03njjDWrVCu61korahPNzSQNOceZqLtXwjE++IM65JOfcgIoVK15MbCIiflW+fHk+/PBD/vKXv/CnP/2JxMREHnrooRxDjUREJKfMzExiY2N59tlnadGiBX379uWhhx5i0qRJAISFhTF79mxSUlKoWrUq5cqVY/Hixdx0002UKOH52hwdHc2sWbOYN28e5cuXp2LFiuzbt4/Y2NisOgWRmprKRx99RLly5Vi6dGmh3m9RVGx6Ppxzx81sDdCJnBtrdcKzqZSISMi49tprWbXqbJuRi4hIXmrUqMFll12Wo6xJkya8/PLLWcctW7YkOTmZ/fv3c/z4caKjo7n66quJi/vvKNDOnTuTkpJCWloapUqVolKlSlSvXp369esXOKYBAwbQqFEjXnjhBa655hp69OhB167nWhCweCtSyYeZReJZrQQ8vTJ1zOxKIN05txXP7P9EM/sSz0oF9+PZ2+O1i7imhl2JiIiIhIC2bdvy448/5ijbuHEjdevWPaPu6VExP/30E6tXr+bpp58+o05UlGcRwEWLFrFnzx66detWoHgSEhJYuHAhycnJNGrUiBEjRnDffffRtm1bqlQ529ZPxVuRWu3KzK7DM1k8t+mnN+PybjL4NzybDG4AHnbOXXQflSaci8i5HDhwgD179nDixIlAhxI0wsLCiImJoUKFCnmeN7M155tw7lV0PshEpEj76quvaNOmDWPGjKFXr16sXbuWfv36MX78eB588EEAZs2aRVRUFHXr1mX9+vUMGTKEli1b8v77/x1oM23aNBo3bkxMTAwrV65kyJAh9OnThxdeeCGrztatW0lPT2fhwoUMHz6ctWvXAtCwYUMiIyPZtm0bTZs2Zdy4cVnzTo4fP05cXBxXXHEFM2bM8OM7U+jOutpVkUo+AknJh4iczYEDB0hNTaVWrVqEh4fjWQZeLoZzjoyMDHbs2EG1atXyTECUfIiIL3z00Uc8/vjj/Pjjj9SpU4dBgwYxePDgrN/tr7zyCs8//zypqanUqFGDe+65h//93/+ldOnSWW2MHDmShIQE0tPTqVevHvfffz8PP/xwjs+HPn36MH369DOuv3jxYq699lo6d+5MZmYmCxcuzPG65ORkrrrqKt555x26d+/uw3fCp5R8nE22YVf9f/rpp0CHIyJF0KZNm6hZsyblypULdChB58iRI+zcuZO8hr4q+RARKbbOmnwUp9WufEKrXYnI+Zw4cYLw8PBAhxGUwsPDNZRNRCSEhHzyISKSHxpq5Rt6X0VEQkvIJx9m1tXMXt+/f3+gQxERKdLq1avHwoULAx2GiIgUYyGffGjYlYiIiIiIfxSpfT5ERIqLVe0b+LT9VktTfNq+iIhIICj5EBEp5urVq8d9991HYmIiu3bt4tZbb+XVV18lIyODu+++my+++IKTJ0/Stm1bXnvtNX73u98BcN1113HNNdewaNEi1q1bR+vWrXn77bezNs1KTEzkySef5NChQwwbNizHNb/88kuGDBnC999/T3h4OD169ODFF1+kdOnSOOcYNmwYM2bM4OjRo9StW5eZM2fStGlTv783IlK82ci9gQ4hKLgJ0YEOIUvID7vSnA8RCQYzZsxg/vz5pKSksHHjRsaNG0dmZiZ9+/bll19+YevWrYSHhzNo0KAcr3v77beZNm0ae/bs4fjx48THxwPw3Xff8cADD5CYmMjOnTv59ddf2b59e9brSpYsyUsvvURaWhorV67k008/ZfLkyQAsWLCApUuXsnHjRvbv38+7775L1apV/fdmiIhIkRXyyYfmfIhIMBg0aBC1a9emSpUqPPHEE8ycOZOqVavSo0cPypUrR/ny5XniiSf47LPPcryub9++/P73vyc8PJzbb7+d5ORkAN577z26dOlC+/btKVOmDE8//TQlSvz3I6Nly5a0atWKUqVKZfW8nG47LCyMgwcP8sMPP+Cco0mTJtSoUcN/b4aIiBRZIZ98iIgEg9q1a2c9r1u3Ljt37uTIkSPcd9991K1blwoVKtC+fXv27dvHqVOnsupWr14963m5cuU4dOgQADt37szRZkRERI7ei40bN9KlSxeqV69OhQoVePzxx0lLSwOgQ4cODBo0iAcffJCYmBgGDBjAgQMHfHbvIiJSfCj5EBEJAtu2bct6vnXrVmrWrMkLL7zAjz/+yBdffMGBAwdYunQpAM6df0PwGjVq5GjzyJEj/Prrr1nHDzzwAI0bN+ann37iwIEDjB8/Pke7Dz30EGvWrOG7775j48aNPP/884VxmyIiUswp+RARCQKTJk1i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7nXnXJxzLi46OvpCYhYRERERkXwKuqV2nXM/A83zW9/MugJdGzZs6LugRERERESkSPV8pAGn8PRcZFcN2O2rizrnkpxzAypWrOirS4iIiIiICEUo+XDOHQfWAJ1yneoEfO7/iEREREREpDD5ddiVdwL46fFNJYA6ZnYlkO5dSvdFINHMvgRWAPcDNYHXfBiThl2JiIiIiPiBv+d8xAGLsx2P9T6mA32cc++YWVXgSaAGnj1BbnbO/eKrgJxzSUBSXFxcf19dQ0TkfGxk0V9xz03QwhwiInJx/L3PxxLAzlNnMjDZLwGJiIiIiIjfFJk5H4FiZl3N7PX9+/cHOhQRERERkaAW8smHVrsSEREREfGPkE8+RERERETEP0I++dCwKxERERER/wj55EPDrkRERERE/CPkkw8REREREfEPJR8iIiIiIuIXIZ98aM6HiIiIiIh/hHzyoTkfIiIiIiL+EfLJh4iISFH27LPPYmYMGjQoq2z27NnccMMNREdHY2YsWbLkjNcdO3aMwYMHExUVRUREBN26dWP79u1Z5xcsWEBYWBhffPFFjtdNnTqVyMhIUlJSfHZPIhK6lHyIiIgUUatWreL111+nWbNmOcoPHz5MmzZtePHFF8/62qFDh/L+++8zc+ZMli1bxoEDB+jSpQunTp0CoHPnzvTr14/evXuTkZEBwJYtWxg2bBjx8fE0aNDAdzcmIiFLyYeIiEgRtH//fu68807efPNNKleunOPc3XffzejRo7npppvO+to33niD559/nk6dOhEbG0tiYiLr1q1j4cKFWfXi4+M5efIkI0eOxDlHnz59aNOmDffff79P701EQlfIJx+acC4iIkXRgAED6NmzJ9dff32BX7tmzRpOnDhB586ds8pq165NkyZN+Pzzz7PKIiIiSEhIYNKkSdx555188803vPHGG4USv4hIXkI++dCEcxERKWqmTJnCpk2bGDdu3AW9fvfu3ZQsWZKoqKgc5dWqVWP37t05ytq1a8ddd93FzJkzeeGFF6hVq9YFxy0icj4hn3yIiIgUJT/++COPP/44b7/9NmFhYT6/XmpqKh999BHlypVj6dKlPr+eiIQ2JR8iIiJFyMqVK0lLS+Pyyy+nVKlSlCpVis8++4zJkydTqlQpjh07dt42qlevzqlTp0hLS8tRnpqaSvXq1XOUDRgwgEaNGrFw4UL+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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from gators.encoders import TargetEncoder\n", + "\n", + "housing_df = pd.read_parquet(housing_file_location)\n", + "y = pd.Series(list(np.random.randint(0, high=2, size=1460)), name=\"TARGET\")\n", + "columns = [\"RoofStyle\"]\n", + "housing_df = housing_df[columns]\n", + "objs = [TargetEncoder()]\n", + "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec, y=y)\n", + "plot_all(bench_scalers, name=\"TargetEncoder\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71bba239", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5263c9aa", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gators38", + "language": "python", + "name": "gators38" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/benchmarks/figs/BinRareCategories_fit_transform.jpg b/benchmarks/figs/BinRareCategories_fit_transform.jpg new file mode 100644 index 00000000..712899f0 Binary files /dev/null and b/benchmarks/figs/BinRareCategories_fit_transform.jpg differ diff --git a/benchmarks/figs/BinRareCategories_transform_numpy.jpg b/benchmarks/figs/BinRareCategories_transform_numpy.jpg new file mode 100644 index 00000000..401be009 Binary files /dev/null and b/benchmarks/figs/BinRareCategories_transform_numpy.jpg differ diff --git a/benchmarks/figs/Binning_fit_transform.jpg b/benchmarks/figs/Binning_fit_transform.jpg new file mode 100644 index 00000000..6a4ffc2a Binary files /dev/null and b/benchmarks/figs/Binning_fit_transform.jpg differ diff --git a/benchmarks/figs/Binning_transform_numpy.jpg b/benchmarks/figs/Binning_transform_numpy.jpg new file mode 100644 index 00000000..a827aaff Binary files /dev/null and b/benchmarks/figs/Binning_transform_numpy.jpg differ diff --git a/benchmarks/figs/Clipping_fit_transform.jpg b/benchmarks/figs/Clipping_fit_transform.jpg new file mode 100644 index 00000000..f3cdcc9f Binary files /dev/null and b/benchmarks/figs/Clipping_fit_transform.jpg differ diff --git a/benchmarks/figs/Clipping_transform_numpy.jpg b/benchmarks/figs/Clipping_transform_numpy.jpg new file mode 100644 index 00000000..9e24d249 Binary files /dev/null and b/benchmarks/figs/Clipping_transform_numpy.jpg differ diff --git a/benchmarks/figs/ClusterStatistics_fit_transform.jpg b/benchmarks/figs/ClusterStatistics_fit_transform.jpg new file mode 100644 index 00000000..fd15f648 Binary files /dev/null and b/benchmarks/figs/ClusterStatistics_fit_transform.jpg differ diff --git a/benchmarks/figs/ClusterStatistics_transform_numpy.jpg b/benchmarks/figs/ClusterStatistics_transform_numpy.jpg new file mode 100644 index 00000000..5825f04a Binary files /dev/null and b/benchmarks/figs/ClusterStatistics_transform_numpy.jpg differ diff --git a/benchmarks/figs/CustomBinning_transform_numpy.jpg b/benchmarks/figs/CustomBinning_transform_numpy.jpg new file mode 100644 index 00000000..9b0a78e1 Binary files /dev/null and b/benchmarks/figs/CustomBinning_transform_numpy.jpg differ diff --git a/benchmarks/figs/CyclicDayOfMonth_fit_transform.jpg b/benchmarks/figs/CyclicDayOfMonth_fit_transform.jpg new file mode 100644 index 00000000..aa25bae2 Binary files /dev/null and b/benchmarks/figs/CyclicDayOfMonth_fit_transform.jpg differ diff --git a/benchmarks/figs/CyclicDayOfMonth_transform_numpy.jpg b/benchmarks/figs/CyclicDayOfMonth_transform_numpy.jpg new file mode 100644 index 00000000..3c41a28b Binary files /dev/null and b/benchmarks/figs/CyclicDayOfMonth_transform_numpy.jpg differ diff --git a/benchmarks/figs/CyclicDayOfWeek_fit_transform.jpg b/benchmarks/figs/CyclicDayOfWeek_fit_transform.jpg new file mode 100644 index 00000000..727cc3ad Binary files /dev/null and b/benchmarks/figs/CyclicDayOfWeek_fit_transform.jpg differ diff --git a/benchmarks/figs/CyclicDayOfWeek_transform_numpy.jpg b/benchmarks/figs/CyclicDayOfWeek_transform_numpy.jpg new file mode 100644 index 00000000..526804fd Binary files /dev/null and b/benchmarks/figs/CyclicDayOfWeek_transform_numpy.jpg differ diff --git a/benchmarks/figs/CyclicHourOfDay_fit_transform.jpg b/benchmarks/figs/CyclicHourOfDay_fit_transform.jpg new file mode 100644 index 00000000..dc3b7746 Binary files /dev/null and b/benchmarks/figs/CyclicHourOfDay_fit_transform.jpg differ diff --git a/benchmarks/figs/CyclicHourOfDay_transform_numpy.jpg b/benchmarks/figs/CyclicHourOfDay_transform_numpy.jpg new file mode 100644 index 00000000..4953291e Binary files /dev/null and b/benchmarks/figs/CyclicHourOfDay_transform_numpy.jpg differ diff --git a/benchmarks/figs/CyclicMinuteOfHour_fit_transform.jpg b/benchmarks/figs/CyclicMinuteOfHour_fit_transform.jpg new file mode 100644 index 00000000..1caed8f6 Binary files /dev/null and b/benchmarks/figs/CyclicMinuteOfHour_fit_transform.jpg differ diff --git a/benchmarks/figs/CyclicMinuteOfHour_transform_numpy.jpg b/benchmarks/figs/CyclicMinuteOfHour_transform_numpy.jpg new file mode 100644 index 00000000..dff5b837 Binary files /dev/null and b/benchmarks/figs/CyclicMinuteOfHour_transform_numpy.jpg differ diff --git a/benchmarks/figs/CyclicMonthOfYear_fit_transform.jpg b/benchmarks/figs/CyclicMonthOfYear_fit_transform.jpg new file mode 100644 index 00000000..a57f8b66 Binary files /dev/null and b/benchmarks/figs/CyclicMonthOfYear_fit_transform.jpg differ diff --git a/benchmarks/figs/CyclicMonthOfYear_transform_numpy.jpg b/benchmarks/figs/CyclicMonthOfYear_transform_numpy.jpg new file mode 100644 index 00000000..8e30e8be Binary files /dev/null and b/benchmarks/figs/CyclicMonthOfYear_transform_numpy.jpg differ diff --git a/benchmarks/figs/DeltaTime_fit_transform.jpg b/benchmarks/figs/DeltaTime_fit_transform.jpg new file mode 100644 index 00000000..956db174 Binary files /dev/null and b/benchmarks/figs/DeltaTime_fit_transform.jpg differ diff --git a/benchmarks/figs/DeltaTime_transform_numpy.jpg b/benchmarks/figs/DeltaTime_transform_numpy.jpg new file mode 100644 index 00000000..6477bbbb Binary files /dev/null and b/benchmarks/figs/DeltaTime_transform_numpy.jpg differ diff --git a/benchmarks/figs/DropColumns_fit_transform.jpg b/benchmarks/figs/DropColumns_fit_transform.jpg new file mode 100644 index 00000000..395b9e4e Binary files /dev/null and b/benchmarks/figs/DropColumns_fit_transform.jpg differ diff --git a/benchmarks/figs/DropColumns_transform_numpy.jpg b/benchmarks/figs/DropColumns_transform_numpy.jpg new file mode 100644 index 00000000..ef8b91e9 Binary files /dev/null and b/benchmarks/figs/DropColumns_transform_numpy.jpg differ diff --git a/benchmarks/figs/DropDatatypeColumns_fit_transform.jpg b/benchmarks/figs/DropDatatypeColumns_fit_transform.jpg new file mode 100644 index 00000000..0479eb8f Binary files /dev/null and b/benchmarks/figs/DropDatatypeColumns_fit_transform.jpg differ diff --git a/benchmarks/figs/DropDatatypeColumns_transform_numpy.jpg b/benchmarks/figs/DropDatatypeColumns_transform_numpy.jpg new file mode 100644 index 00000000..29a1a7e3 Binary files /dev/null and b/benchmarks/figs/DropDatatypeColumns_transform_numpy.jpg differ diff --git a/benchmarks/figs/DropHighCardinality_fit_transform.jpg b/benchmarks/figs/DropHighCardinality_fit_transform.jpg new file mode 100644 index 00000000..db3c8446 Binary files /dev/null and b/benchmarks/figs/DropHighCardinality_fit_transform.jpg differ diff --git a/benchmarks/figs/DropHighCardinality_transform_numpy.jpg b/benchmarks/figs/DropHighCardinality_transform_numpy.jpg new file mode 100644 index 00000000..dccdb44a Binary files /dev/null and b/benchmarks/figs/DropHighCardinality_transform_numpy.jpg differ diff --git a/benchmarks/figs/DropHighNaNRatio_fit_transform.jpg b/benchmarks/figs/DropHighNaNRatio_fit_transform.jpg new file mode 100644 index 00000000..55d603a7 Binary files /dev/null and b/benchmarks/figs/DropHighNaNRatio_fit_transform.jpg differ diff --git a/benchmarks/figs/DropHighNaNRatio_transform_numpy.jpg b/benchmarks/figs/DropHighNaNRatio_transform_numpy.jpg new file mode 100644 index 00000000..5baeb360 Binary files /dev/null and b/benchmarks/figs/DropHighNaNRatio_transform_numpy.jpg differ diff --git a/benchmarks/figs/DropLowCardinality_fit_transform.jpg b/benchmarks/figs/DropLowCardinality_fit_transform.jpg new file mode 100644 index 00000000..823f98bd Binary files /dev/null and b/benchmarks/figs/DropLowCardinality_fit_transform.jpg differ diff --git a/benchmarks/figs/DropLowCardinality_transform_numpy.jpg b/benchmarks/figs/DropLowCardinality_transform_numpy.jpg new file mode 100644 index 00000000..8ea9b82e Binary files /dev/null and b/benchmarks/figs/DropLowCardinality_transform_numpy.jpg differ diff --git a/benchmarks/figs/ElementaryArithmetics_fit_transform.jpg b/benchmarks/figs/ElementaryArithmetics_fit_transform.jpg new file mode 100644 index 00000000..66e42c9d Binary files /dev/null and b/benchmarks/figs/ElementaryArithmetics_fit_transform.jpg differ diff --git a/benchmarks/figs/ElementaryArithmetics_transform_numpy.jpg b/benchmarks/figs/ElementaryArithmetics_transform_numpy.jpg new file mode 100644 index 00000000..a97a2eb2 Binary files /dev/null and b/benchmarks/figs/ElementaryArithmetics_transform_numpy.jpg differ diff --git a/benchmarks/figs/Extract_fit_transform.jpg b/benchmarks/figs/Extract_fit_transform.jpg new file mode 100644 index 00000000..a263e2ed Binary files /dev/null and b/benchmarks/figs/Extract_fit_transform.jpg differ diff --git a/benchmarks/figs/Extract_transform_numpy.jpg b/benchmarks/figs/Extract_transform_numpy.jpg new file mode 100644 index 00000000..45758953 Binary files /dev/null and b/benchmarks/figs/Extract_transform_numpy.jpg differ diff --git a/benchmarks/figs/FloatImputer_transform_numpy.jpg b/benchmarks/figs/FloatImputer_transform_numpy.jpg new file mode 100644 index 00000000..d692ec0b Binary files /dev/null and b/benchmarks/figs/FloatImputer_transform_numpy.jpg differ diff --git a/benchmarks/figs/IntImputer_transform_numpy.jpg b/benchmarks/figs/IntImputer_transform_numpy.jpg new file mode 100644 index 00000000..94dce21a Binary files /dev/null and b/benchmarks/figs/IntImputer_transform_numpy.jpg differ diff --git a/benchmarks/figs/IsEqual_fit_transform.jpg b/benchmarks/figs/IsEqual_fit_transform.jpg new file mode 100644 index 00000000..d4628352 Binary files /dev/null and b/benchmarks/figs/IsEqual_fit_transform.jpg differ diff --git a/benchmarks/figs/IsEqual_transform_numpy.jpg b/benchmarks/figs/IsEqual_transform_numpy.jpg new file mode 100644 index 00000000..e6c9aaee Binary files /dev/null and b/benchmarks/figs/IsEqual_transform_numpy.jpg differ diff --git a/benchmarks/figs/IsNull_fit_transform.jpg b/benchmarks/figs/IsNull_fit_transform.jpg new file mode 100644 index 00000000..5344c093 Binary files /dev/null and b/benchmarks/figs/IsNull_fit_transform.jpg differ diff --git a/benchmarks/figs/IsNull_transform_numpy.jpg b/benchmarks/figs/IsNull_transform_numpy.jpg new file mode 100644 index 00000000..1b48f58c Binary files /dev/null and b/benchmarks/figs/IsNull_transform_numpy.jpg differ diff --git a/benchmarks/figs/KeepColumns_fit_transform.jpg b/benchmarks/figs/KeepColumns_fit_transform.jpg new file mode 100644 index 00000000..6f1c5615 Binary files /dev/null and b/benchmarks/figs/KeepColumns_fit_transform.jpg differ diff --git a/benchmarks/figs/KeepColumns_transform_numpy.jpg b/benchmarks/figs/KeepColumns_transform_numpy.jpg new file mode 100644 index 00000000..3750cd1a Binary files /dev/null and b/benchmarks/figs/KeepColumns_transform_numpy.jpg differ diff --git a/benchmarks/figs/LowerCase_fit_transform.jpg b/benchmarks/figs/LowerCase_fit_transform.jpg new file mode 100644 index 00000000..5cb7b7c8 Binary files /dev/null and b/benchmarks/figs/LowerCase_fit_transform.jpg differ diff --git a/benchmarks/figs/LowerCase_transform_numpy.jpg b/benchmarks/figs/LowerCase_transform_numpy.jpg new file mode 100644 index 00000000..a0b485f1 Binary files /dev/null and b/benchmarks/figs/LowerCase_transform_numpy.jpg differ diff --git a/benchmarks/figs/MinMaxScaler_fit_transform.jpg b/benchmarks/figs/MinMaxScaler_fit_transform.jpg new file mode 100644 index 00000000..4545a9e5 Binary files /dev/null and b/benchmarks/figs/MinMaxScaler_fit_transform.jpg differ diff --git a/benchmarks/figs/MinMaxScaler_transform_numpy.jpg b/benchmarks/figs/MinMaxScaler_transform_numpy.jpg new file mode 100644 index 00000000..ea6392f3 Binary files /dev/null and b/benchmarks/figs/MinMaxScaler_transform_numpy.jpg differ diff --git a/benchmarks/figs/NumericsImputer_fit_transform.jpg b/benchmarks/figs/NumericsImputer_fit_transform.jpg new file mode 100644 index 00000000..24dad674 Binary files /dev/null and b/benchmarks/figs/NumericsImputer_fit_transform.jpg differ diff --git a/benchmarks/figs/NumericsImputer_transform_numpy.jpg b/benchmarks/figs/NumericsImputer_transform_numpy.jpg new file mode 100644 index 00000000..f7e385fe Binary files /dev/null and b/benchmarks/figs/NumericsImputer_transform_numpy.jpg differ diff --git a/benchmarks/figs/ObjectImputer_fit_transform.jpg b/benchmarks/figs/ObjectImputer_fit_transform.jpg new file mode 100644 index 00000000..ff9d8d57 Binary files /dev/null and b/benchmarks/figs/ObjectImputer_fit_transform.jpg differ diff --git a/benchmarks/figs/ObjectImputer_transform_numpy.jpg b/benchmarks/figs/ObjectImputer_transform_numpy.jpg new file mode 100644 index 00000000..5fbf1f97 Binary files /dev/null and b/benchmarks/figs/ObjectImputer_transform_numpy.jpg differ diff --git a/benchmarks/figs/OneHotEncoder_fit_transform.jpg b/benchmarks/figs/OneHotEncoder_fit_transform.jpg new file mode 100644 index 00000000..80a7c4ca Binary files /dev/null and b/benchmarks/figs/OneHotEncoder_fit_transform.jpg differ diff --git a/benchmarks/figs/OneHotEncoder_transform_numpy.jpg b/benchmarks/figs/OneHotEncoder_transform_numpy.jpg new file mode 100644 index 00000000..487f259b Binary files /dev/null and b/benchmarks/figs/OneHotEncoder_transform_numpy.jpg differ diff --git a/benchmarks/figs/OneHot_fit_transform.jpg b/benchmarks/figs/OneHot_fit_transform.jpg new file mode 100644 index 00000000..a379cbd6 Binary files /dev/null and b/benchmarks/figs/OneHot_fit_transform.jpg differ diff --git a/benchmarks/figs/OneHot_transform_numpy.jpg b/benchmarks/figs/OneHot_transform_numpy.jpg new file mode 100644 index 00000000..8ce2559c Binary files /dev/null and b/benchmarks/figs/OneHot_transform_numpy.jpg differ diff --git a/benchmarks/figs/OrdinalDayOfMonth_fit_transform.jpg b/benchmarks/figs/OrdinalDayOfMonth_fit_transform.jpg new file mode 100644 index 00000000..98747044 Binary files /dev/null and b/benchmarks/figs/OrdinalDayOfMonth_fit_transform.jpg differ diff --git a/benchmarks/figs/OrdinalDayOfMonth_transform_numpy.jpg b/benchmarks/figs/OrdinalDayOfMonth_transform_numpy.jpg new file mode 100644 index 00000000..fd60e947 Binary files /dev/null and b/benchmarks/figs/OrdinalDayOfMonth_transform_numpy.jpg differ diff --git a/benchmarks/figs/OrdinalDayOfWeek_fit_transform.jpg b/benchmarks/figs/OrdinalDayOfWeek_fit_transform.jpg new file mode 100644 index 00000000..104432d9 Binary files /dev/null and b/benchmarks/figs/OrdinalDayOfWeek_fit_transform.jpg differ diff --git a/benchmarks/figs/OrdinalDayOfWeek_transform_numpy.jpg b/benchmarks/figs/OrdinalDayOfWeek_transform_numpy.jpg new file mode 100644 index 00000000..ea7b01e1 Binary files /dev/null and b/benchmarks/figs/OrdinalDayOfWeek_transform_numpy.jpg differ diff --git a/benchmarks/figs/OrdinalEncoder_fit_transform.jpg b/benchmarks/figs/OrdinalEncoder_fit_transform.jpg new file mode 100644 index 00000000..f9d5afc7 Binary files /dev/null and b/benchmarks/figs/OrdinalEncoder_fit_transform.jpg differ diff --git a/benchmarks/figs/OrdinalEncoder_transform_numpy.jpg b/benchmarks/figs/OrdinalEncoder_transform_numpy.jpg new file mode 100644 index 00000000..79067d7d Binary files /dev/null and b/benchmarks/figs/OrdinalEncoder_transform_numpy.jpg differ diff --git a/benchmarks/figs/OrdinalHourOfDay_fit_transform.jpg b/benchmarks/figs/OrdinalHourOfDay_fit_transform.jpg new file mode 100644 index 00000000..0907e11e Binary files /dev/null and b/benchmarks/figs/OrdinalHourOfDay_fit_transform.jpg differ diff --git a/benchmarks/figs/OrdinalHourOfDay_transform_numpy.jpg b/benchmarks/figs/OrdinalHourOfDay_transform_numpy.jpg new file mode 100644 index 00000000..0605b3a2 Binary files /dev/null and b/benchmarks/figs/OrdinalHourOfDay_transform_numpy.jpg differ diff --git a/benchmarks/figs/OrdinalMinuteOfHour_fit_transform.jpg b/benchmarks/figs/OrdinalMinuteOfHour_fit_transform.jpg new file mode 100644 index 00000000..c02061c9 Binary files /dev/null and b/benchmarks/figs/OrdinalMinuteOfHour_fit_transform.jpg differ diff --git a/benchmarks/figs/OrdinalMinuteOfHour_transform_numpy.jpg b/benchmarks/figs/OrdinalMinuteOfHour_transform_numpy.jpg new file mode 100644 index 00000000..92a09c92 Binary files /dev/null and b/benchmarks/figs/OrdinalMinuteOfHour_transform_numpy.jpg differ diff --git a/benchmarks/figs/OrdinalMonthOfYear_fit_transform.jpg b/benchmarks/figs/OrdinalMonthOfYear_fit_transform.jpg new file mode 100644 index 00000000..2f2caadb Binary files /dev/null and b/benchmarks/figs/OrdinalMonthOfYear_fit_transform.jpg differ diff --git a/benchmarks/figs/OrdinalMonthOfYear_transform_numpy.jpg b/benchmarks/figs/OrdinalMonthOfYear_transform_numpy.jpg new file mode 100644 index 00000000..7fcaf0ac Binary files /dev/null and b/benchmarks/figs/OrdinalMonthOfYear_transform_numpy.jpg differ diff --git a/benchmarks/figs/PlaneRotation_fit_transform.jpg b/benchmarks/figs/PlaneRotation_fit_transform.jpg new file mode 100644 index 00000000..483f2534 Binary files /dev/null and b/benchmarks/figs/PlaneRotation_fit_transform.jpg differ diff --git a/benchmarks/figs/PlaneRotation_transform_numpy.jpg b/benchmarks/figs/PlaneRotation_transform_numpy.jpg new file mode 100644 index 00000000..97ae5ff9 Binary files /dev/null and b/benchmarks/figs/PlaneRotation_transform_numpy.jpg differ diff --git a/benchmarks/figs/PolynomialFeatures_fit_transform.jpg b/benchmarks/figs/PolynomialFeatures_fit_transform.jpg new file mode 100644 index 00000000..7d53ce69 Binary files /dev/null and b/benchmarks/figs/PolynomialFeatures_fit_transform.jpg differ diff --git a/benchmarks/figs/PolynomialFeatures_transform_numpy.jpg b/benchmarks/figs/PolynomialFeatures_transform_numpy.jpg new file mode 100644 index 00000000..7a559840 Binary files /dev/null and b/benchmarks/figs/PolynomialFeatures_transform_numpy.jpg differ diff --git a/benchmarks/figs/QuantileBinning_fit_transform.jpg b/benchmarks/figs/QuantileBinning_fit_transform.jpg new file mode 100644 index 00000000..8af62cf3 Binary files /dev/null and b/benchmarks/figs/QuantileBinning_fit_transform.jpg differ diff --git a/benchmarks/figs/QuantileBinning_transform_numpy.jpg b/benchmarks/figs/QuantileBinning_transform_numpy.jpg new file mode 100644 index 00000000..de20c1e2 Binary files /dev/null and b/benchmarks/figs/QuantileBinning_transform_numpy.jpg differ diff --git a/benchmarks/figs/Replace_transform_numpy.jpg b/benchmarks/figs/Replace_transform_numpy.jpg new file mode 100644 index 00000000..e1163c9c Binary files /dev/null and b/benchmarks/figs/Replace_transform_numpy.jpg differ diff --git a/benchmarks/figs/SplitExtract_fit_transform.jpg b/benchmarks/figs/SplitExtract_fit_transform.jpg new file mode 100644 index 00000000..43be65d0 Binary files /dev/null and b/benchmarks/figs/SplitExtract_fit_transform.jpg differ diff --git a/benchmarks/figs/SplitExtract_transform_numpy.jpg b/benchmarks/figs/SplitExtract_transform_numpy.jpg new file mode 100644 index 00000000..a6e901c0 Binary files /dev/null and b/benchmarks/figs/SplitExtract_transform_numpy.jpg differ diff --git a/benchmarks/figs/StandardScaler_fit_transform.jpg b/benchmarks/figs/StandardScaler_fit_transform.jpg new file mode 100644 index 00000000..6fc54868 Binary files /dev/null and b/benchmarks/figs/StandardScaler_fit_transform.jpg differ diff --git a/benchmarks/figs/StandardScaler_transform_numpy.jpg b/benchmarks/figs/StandardScaler_transform_numpy.jpg new file mode 100644 index 00000000..237d6e14 Binary files /dev/null and b/benchmarks/figs/StandardScaler_transform_numpy.jpg differ diff --git a/benchmarks/figs/StringContains_fit_transform.jpg b/benchmarks/figs/StringContains_fit_transform.jpg new file mode 100644 index 00000000..03f4cfc5 Binary files /dev/null and b/benchmarks/figs/StringContains_fit_transform.jpg differ diff --git a/benchmarks/figs/StringContains_transform_numpy.jpg b/benchmarks/figs/StringContains_transform_numpy.jpg new file mode 100644 index 00000000..b64d992c Binary files /dev/null and b/benchmarks/figs/StringContains_transform_numpy.jpg differ diff --git a/benchmarks/figs/StringLength_fit_transform.jpg b/benchmarks/figs/StringLength_fit_transform.jpg new file mode 100644 index 00000000..cc76d2ef Binary files /dev/null and b/benchmarks/figs/StringLength_fit_transform.jpg differ diff --git a/benchmarks/figs/StringLength_transform_numpy.jpg b/benchmarks/figs/StringLength_transform_numpy.jpg new file mode 100644 index 00000000..57ff9133 Binary files /dev/null and b/benchmarks/figs/StringLength_transform_numpy.jpg differ diff --git a/benchmarks/figs/SupervisedSampling_fit_transform.jpg b/benchmarks/figs/SupervisedSampling_fit_transform.jpg new file mode 100644 index 00000000..da153144 Binary files /dev/null and b/benchmarks/figs/SupervisedSampling_fit_transform.jpg differ diff --git a/benchmarks/figs/TargetEncoder_fit_transform.jpg b/benchmarks/figs/TargetEncoder_fit_transform.jpg new file mode 100644 index 00000000..5d1a168d Binary files /dev/null and b/benchmarks/figs/TargetEncoder_fit_transform.jpg differ diff --git a/benchmarks/figs/TargetEncoder_transform_numpy.jpg b/benchmarks/figs/TargetEncoder_transform_numpy.jpg new file mode 100644 index 00000000..3e054588 Binary files /dev/null and b/benchmarks/figs/TargetEncoder_transform_numpy.jpg differ diff --git a/benchmarks/figs/TreeBinning_fit_transform.jpg b/benchmarks/figs/TreeBinning_fit_transform.jpg new file mode 100644 index 00000000..042d52a2 Binary files /dev/null and b/benchmarks/figs/TreeBinning_fit_transform.jpg differ diff --git a/benchmarks/figs/UnsupervisedSampling_fit_transform.jpg b/benchmarks/figs/UnsupervisedSampling_fit_transform.jpg new file mode 100644 index 00000000..6e3f9db7 Binary files /dev/null and b/benchmarks/figs/UnsupervisedSampling_fit_transform.jpg differ diff --git a/benchmarks/figs/UpperCase_fit_transform.jpg b/benchmarks/figs/UpperCase_fit_transform.jpg new file mode 100644 index 00000000..686c468b Binary files /dev/null and b/benchmarks/figs/UpperCase_fit_transform.jpg differ diff --git a/benchmarks/figs/UpperCase_transform_numpy.jpg b/benchmarks/figs/UpperCase_transform_numpy.jpg new file mode 100644 index 00000000..8f8d7483 Binary files /dev/null and b/benchmarks/figs/UpperCase_transform_numpy.jpg differ diff --git a/benchmarks/figs/WOEEncoder_fit_transform.jpg b/benchmarks/figs/WOEEncoder_fit_transform.jpg new file mode 100644 index 00000000..ce6b3439 Binary files /dev/null and b/benchmarks/figs/WOEEncoder_fit_transform.jpg differ diff --git a/benchmarks/figs/WOEEncoder_transform_numpy.jpg b/benchmarks/figs/WOEEncoder_transform_numpy.jpg new file mode 100644 index 00000000..317cbb83 Binary files /dev/null and b/benchmarks/figs/WOEEncoder_transform_numpy.jpg differ diff --git a/binning.cpython-38-darwin.so b/binning.cpython-38-darwin.so deleted file mode 100755 index 54a5d857..00000000 Binary files a/binning.cpython-38-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/binning.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/binning.cpython-39-darwin.so deleted file mode 100755 index db053ed4..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/binning.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/clipping.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/clipping.cpython-39-darwin.so deleted file mode 100755 index ad36885e..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/clipping.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/data_cleaning.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/data_cleaning.cpython-39-darwin.so deleted file mode 100755 index df1431cb..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/data_cleaning.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/encoder.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/encoder.cpython-39-darwin.so deleted file mode 100755 index bbd0112b..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/encoder.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/feature_gen.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/feature_gen.cpython-39-darwin.so deleted file mode 100755 index 542990cb..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/feature_gen.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/feature_gen_dt.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/feature_gen_dt.cpython-39-darwin.so deleted file mode 100755 index b48424a2..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/feature_gen_dt.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/feature_gen_str.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/feature_gen_str.cpython-39-darwin.so deleted file mode 100755 index 5ccdece2..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/feature_gen_str.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/__init__.py deleted file mode 100644 index 2a942093..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -import os -__version__ = '0.1.0' -os.environ['PYARROW_IGNORE_TIMEZONE'] = '1' diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/__init__.py deleted file mode 100644 index 5c09437b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .bin_rare_events import BinRareEvents -from ._base_discretizer import _BaseDiscretizer -from .discretizer import Discretizer -from .custom_discretizer import CustomDiscretizer -from .quantile_discretizer import QuantileDiscretizer -__all__ = [ - '_BaseDiscretizer', - 'Discretizer', - 'CustomDiscretizer', - 'QuantileDiscretizer', - 'BinRareEvents', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/_base_discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/_base_discretizer.py deleted file mode 100644 index db7ebf3e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/_base_discretizer.py +++ /dev/null @@ -1,267 +0,0 @@ -# License: Apache-2.0 -from binning import discretizer, discretizer_inplace -from ..util import util -from ..transformers.transformer import Transformer -from pyspark.ml.feature import Bucketizer -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -EPSILON = 1e-10 - - -class _BaseDiscretizer(Transformer): - """Base discretizer transformer class. - - Parameters - ---------- - n_bins : int - Number of bins to use. - inplace : bool - If False, return the dataframe with the new discretized columns - with the names '`column_name`__bin'). Otherwise, - return the dataframe with the existing binned columns. - - """ - def __init__(self, n_bins: int, inplace: bool): - if not isinstance(n_bins, int): - raise TypeError('`n_bins` should be an int.') - if not isinstance(inplace, bool): - raise TypeError('`inplace` should be a bool.') - Transformer.__init__(self) - self.n_bins = n_bins - self.inplace = inplace - self.columns = [] - self.output_columns = [] - self.idx_columns: np.ndarray = np.array([]) - self.bins = {} - self.bins_np = np.array([]) - self.bins_ks: List[List[float]] = [[]] - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> '_BaseDiscretizer': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - 'Discretizer' - Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.get_numerical_columns(X) - self.output_columns = [f'{c}__bin' for c in self.columns] - self.idx_columns = util.get_idx_columns( - X.columns, self.columns - ) - if self.idx_columns.size == 0: - return self - - self.bins, self.bins_np = self.compute_bins( - X[self.columns], self.n_bins) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if self.idx_columns.size == 0: - return X - if isinstance(X, pd.DataFrame): - if self.inplace: - return self.bin_pd_inplace( - X, self.columns, self.output_columns, - self.bins) - return self.bin_pd( - X, self.columns, self.output_columns, - self.bins) - if self.inplace: - return self.bin_ks_inplace( - X, self.columns, self.output_columns, - self.bins)[X.columns] - - return self.bin_ks( - X, self.columns, self.output_columns, - self.bins) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array. - - Parameters - ---------- - X : np.ndarray - NumPy array. - - Returns - ------- - np.ndarray - Transformed NumPy array. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if self.inplace: - if X.dtype == object: - return discretizer_inplace( - X, - self.bins_np, - self.idx_columns - ) - return discretizer_inplace( - X.astype(object), - self.bins_np, - self.idx_columns - ) - if X.dtype == object: - return discretizer( - X, - self.bins_np, - self.idx_columns - ) - return discretizer( - X.astype(object), - self.bins_np, - self.idx_columns - ) - - @staticmethod - def bin_pd_inplace(X: pd.DataFrame, columns: List[str], - output_columns: List[str], bins): - """Perform the binning inplace for pandas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - pd.DataFrame - Dataframe. - """ - def f(x, bins, columns): - name = x.name - if name not in columns: - return x - return pd.cut( - x, - bins[name], - labels=np.arange(len(bins[name]) - 1), - duplicates='drop').fillna(0).astype(float).astype(str) - return X.apply(f, args=(bins, columns)) - - @staticmethod - def bin_pd(X, columns, output_columns, bins): - """Perform the binning not inplace for pandas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - pd.DataFrame - Dataframe. - """ - def f(x, bins, columns): - name = x.name - return pd.cut( - x, - bins[name], - labels=np.arange(len(bins[name]) - 1), - duplicates='drop').fillna(0).astype(float).astype(str) - return X.join( - X[columns].apply( - f, args=(bins, columns)).astype(object).rename( - columns=dict(zip(columns, output_columns)))) - - @staticmethod - def bin_ks_inplace(X, columns, output_columns, bins): - """Perform the binning not inplace for kolas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - ks.DataFrame - Dataframe. - """ - X = Bucketizer( - splitsArray=bins, - inputCols=columns, - outputCols=output_columns - ).transform(X.to_spark()).to_koalas( - ).drop(columns, axis=1).rename( - columns=dict(zip(output_columns, columns))) - X[columns] = X[columns].astype(str) - return X - - @staticmethod - def bin_ks(X, columns, output_columns, bins): - """Perform the binning inplace for kolas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - ks.DataFrame - Dataframe. - """ - X = Bucketizer( - splitsArray=bins, - inputCols=columns, - outputCols=output_columns - ).transform(X.to_spark()).to_koalas() - X[output_columns] = X[output_columns].astype(str) - return X diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/bin_rare_events.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/bin_rare_events.py deleted file mode 100644 index d9aa9c58..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/bin_rare_events.py +++ /dev/null @@ -1,230 +0,0 @@ -# License: Apache-2.0 -from binning import bin_rare_events -from ..util import util -from ..transformers.transformer import Transformer -from typing import List, Union, Dict -import numpy as np -import pandas as pd -import databricks.koalas as ks -import warnings - - -class BinRareEvents(Transformer): - """Replace low occurence categories by the value "OTHERS". - - Use `BinRareEvents` to reduce the cardinality - of high cardinal columns. This transformer is also useful - to replace unseen categories by a value which is already - taken it account by the encoders. - - Parameters - ---------- - min_ratio : float - Min occurence ratio per category. - - Examples - --------- - - >>> import pandas as pd - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> obj.fit_transform(X) - A B - 0 a OTHERS - 1 a OTHERS - 2 OTHERS OTHERS - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> obj.fit_transform(X) - A B - 0 a OTHERS - 1 a OTHERS - 2 OTHERS OTHERS - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'OTHERS'], - ['a', 'OTHERS'], - ['OTHERS', 'OTHERS']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'OTHERS'], - ['a', 'OTHERS'], - ['OTHERS', 'OTHERS']], dtype=object) - - """ - - def __init__(self, min_ratio: float): - if not isinstance(min_ratio, float): - raise TypeError( - '''`min_ratio` should be a float.''') - Transformer.__init__(self) - self.min_ratio = min_ratio - self.columns = [] - self.idx_columns: np.ndarray = np.array([]) - self.categories_to_keep_np: np.ndarray = None - self.n_categories_to_keep_np: np.ndarray = None - self.categories_to_keep_dict: Dict[str, np.ndarray] = {} - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'BinRareEvents': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - BinRareEvents - Instance of itself. - """ - self.check_dataframe(X) - if object not in X.dtypes.to_numpy(): - warnings.warn( - '''`X` does not contain object columns: - `BinRareEvents` is not needed''') - return self - self.columns = util.get_datatype_columns( - X, datatype=object) - self.categories_to_keep_dict = self.compute_categories_to_keep_dict( - X=X[self.columns], - min_ratio=self.min_ratio, - ) - self.categories_to_keep_np = self.get_categories_to_keep_np( - categories_to_keep_dict=self.categories_to_keep_dict, - ) - self.n_categories_to_keep_np = self.categories_to_keep_np.shape[0] \ - - (self.categories_to_keep_np == None).sum(0) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - - def f(x): - name = x.name - if name not in self.categories_to_keep_dict: - return x - return x.mask(~ x.isin(self.categories_to_keep_dict[name]), - 'OTHERS') - return X.apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array. - - Parameters - ---------- - X : np.ndarray - NumPy array. - - Returns - ------- - np.ndarray - Transformed NumPy array. - - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if self.categories_to_keep_np.shape[0] == 0: - X[:, self.idx_columns] = 'OTHERS' - return X - return bin_rare_events( - X, - self.categories_to_keep_np, - self.n_categories_to_keep_np, - self.idx_columns, - ) - - @ staticmethod - def compute_categories_to_keep_dict( - X: Union[pd.DataFrame, ks.DataFrame], - min_ratio: float) -> Dict[str, List[str]]: - """Compute the category frequency. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - min_ratio : float - Min occurence per category. - - Returns - ------- - Dict[str, List[str]]: Categories to keep. - """ - def f(x): - freq = x.astype('object').value_counts( - normalize=True).sort_values() - freq = freq[freq >= min_ratio] - return list(freq.index) - - mapping = X.apply(f).to_dict() - mapping = { - key: val if isinstance(val, list) else list(val.values()) - for key, val in mapping.items() - } - return mapping - - @ staticmethod - def get_categories_to_keep_np( - categories_to_keep_dict: Dict[str, np.ndarray]) -> np.ndarray: - """Get the categories to keep. - - Parameters - ---------- - categories_to_keep_dict : Dict[str, np.ndarray]) - Categories to keep. - - Returns - ------- - np.ndarray - Categories to keep. - """ - max_category = max( - [len(val) for val in categories_to_keep_dict.values()]) - n_columns = len(categories_to_keep_dict) - categories_to_keep_np = np.empty( - (max_category, n_columns), dtype='object') - for i, val in enumerate(categories_to_keep_dict.values()): - categories_to_keep_np[:len(val), i] = val - return categories_to_keep_np diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/binning.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/binning.pyx deleted file mode 100644 index c9398adc..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/binning.pyx +++ /dev/null @@ -1,118 +0,0 @@ -# License: Apache-2.0 -cimport cython -cimport numpy as np -import numpy as np - - -ctypedef fused num_t: - np.int16_t - np.int32_t - np.int64_t - np.float32_t - np.float64_t - - -@cython.boundscheck(False) -@cython.wraparound(False) -def bin_rare_events( - np.ndarray[object, ndim=2] X, - np.ndarray[object, ndim=2] categories_to_keep_np, - np.ndarray[np.int_t, ndim=1] n_categories_to_keep, - np.ndarray[np.int_t, ndim=1] idx_columns): - cdef np.int_t l - cdef np.int_t j_col - cdef np.int_t l_max - cdef np.int_t n_rows = X.shape[0] - cdef np.int_t n_cols = idx_columns.shape[0] - cdef object val = 'OTHERS' - cdef np.int_t is_rare = 1 - for j in range(n_cols): - j_col = idx_columns[j] - l_max = n_categories_to_keep[j] - if l_max == 0: - for k in range(n_rows): - X[k, j_col] = val - else: - for k in range(n_rows): - is_rare = 1 - for l in range(l_max): - if X[k, j_col] == categories_to_keep_np[l, j]: - is_rare = 0 - break - if is_rare: - X[k, j_col] = val - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_t, ndim = 2] bin_numerics( - np.ndarray[num_t, ndim=2] X, - np.ndarray[num_t, ndim=2] bin_limits, - np.ndarray[num_t, ndim=2] bins, - np.ndarray[np.int_t, ndim=1] idx_columns): - cdef int i - cdef int j - cdef int k - cdef int j_col - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef int n_bins = bin_limits.shape[0] - cdef num_t val - cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) - for i in range(n_rows): - for j in range(n_cols): - j_col = idx_columns[j] - val = X[i, j_col] - for k in range(1, n_bins): - if val <= bin_limits[k, j]: - X_bin[i, j] = bins[k-1, j] - break - return np.concatenate((X, X_bin), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] discretizer_inplace( - np.ndarray[object, ndim=2] X, - np.ndarray[num_t, ndim=2] bins_np, - np.ndarray[np.int64_t, ndim=1] idx_columns): - cdef int i - cdef int j - cdef int k - cdef int j_col - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef int n_bins = bins_np.shape[0] - for i in range(n_rows): - for j in range(n_cols): - j_col = idx_columns[j] - for k in range(1, n_bins): - if X[i, j_col] <= bins_np[k, j]: - X[i, j_col] = str(float(k - 1)) - break - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] discretizer( - np.ndarray[object, ndim=2] X, - np.ndarray[num_t, ndim=2] bins_np, - np.ndarray[np.int64_t, ndim=1] idx_columns): - cdef int i - cdef int j - cdef int k - cdef int j_col - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef int n_bins = bins_np.shape[0] - cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - j_col = idx_columns[j] - for k in range(1, n_bins): - if float(X[i, j_col]) <= bins_np[k, j]: - X_bin[i, j] = str(float(k - 1)) - break - return np.concatenate((X, X_bin), axis=1) \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/custom_discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/custom_discretizer.py deleted file mode 100644 index 811a2d19..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/custom_discretizer.py +++ /dev/null @@ -1,150 +0,0 @@ -# License: Apache-2.0 -from ._base_discretizer import _BaseDiscretizer -from ..util import util -from typing import List, Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -EPSILON = 1e-10 - - -class CustomDiscretizer(_BaseDiscretizer): - """Discretize the columns using the splits given by the user. - - The discretization can be done inplace or by adding the discretized - columns to the existing data. - - Parameters - ---------- - bins : Dict[str, List[float]] - Bin splits definition. The dictionary keys are the column names to - discretize, its values are the split arrays. - inplace : bool, default False - If False, return the dataframe with the new discretized columns - with the names "`column_name`__bin"). Otherwise, return - the dataframe with the existing binned columns. - - Examples - -------- - * fit & transform with `pandas` - - - inplace discretization - >>> import pandas as pd - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins, inplace=True) - >>> obj.fit_transform(X) - A B - 0 0.0 0.0 - 1 0.0 1.0 - 2 1.0 1.0 - - - add discretization - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins, inplace=False) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 0.0 1.0 - 2 1 3 1.0 1.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 0.0 1.0 - 2 1 3 1.0 1.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '0.0', '1.0'], - [1, 3, '1.0', '1.0']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '0.0', '1.0'], - [1, 3, '1.0', '1.0']], dtype=object) - - See Also - -------- - gators.binning.Discretizer - Discretize using equal splits. - gators.binning.QuantileDiscretizer - Discretize using splits based on quantiles. - - """ - - def __init__(self, bins: Dict[str, List[float]], inplace=False): - if not isinstance(bins, dict): - raise TypeError('`bins` should be a dict.') - _BaseDiscretizer.__init__(self, n_bins=0, inplace=inplace) - self.bins = {key: np.array(val) for key, val in bins.items()} - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'CustomDiscretizer': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - 'CustomDiscretizer' - Instance of itself. - """ - self.check_dataframe(X) - self.columns = list(self.bins.keys()) - self.output_columns = [f'{c}__bin' for c in self.columns] - self.idx_columns = util.get_idx_columns( - X.columns, self.columns - ) - n_cols = len(self.idx_columns) - if n_cols == 0: - return self - max_bins = max([len(v) for v in self.bins.values()]) - self.labels = np.arange(max_bins-1) - self.bins_np = np.inf * np.ones((max_bins, n_cols)) - for i, b in enumerate(self.bins.values()): - self.bins_np[:len(b), i] = b - if isinstance(X, ks.DataFrame): - self.bins = self.bins_np.T.tolist() - self.bins = [np.unique(b)+EPSILON for b in self.bins] - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/discretizer.py deleted file mode 100644 index 62f69a2c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/discretizer.py +++ /dev/null @@ -1,149 +0,0 @@ -# License: Apache-2.0 -from ._base_discretizer import _BaseDiscretizer -from typing import List, Tuple, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..util import util - -EPSILON = 1e-10 - - -class Discretizer(_BaseDiscretizer): - """Discretize the columns using equal distance splits. - - The discretization can be done inplace or by adding the discretized - columns to the existing data. - - Parameters - ---------- - n_bins : int - Number of bins to use. - inplace : bool, default False - If False, return the dataframe with the new discretized columns - with the names "`column_name`__bin"). Otherwise, return - the dataframe with the existing binned columns. - - Examples - --------- - * fit & transform with `pandas` - - - inplace discretization - - >>> import pandas as pd - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3, inplace=True) - >>> obj.fit_transform(X) - A B - 0 0.0 0.0 - 1 1.0 1.0 - 2 2.0 2.0 - - - add discretization - - >>> import pandas as pd - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3, inplace=False) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) - >>> obj = Discretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1.0, 1.0, '0.0', '0.0'], - [0.0, 2.0, '1.0', '1.0'], - [1.0, 3.0, '2.0', '2.0']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '1.0', '1.0'], - [1, 3, '2.0', '2.0']], dtype=object) - - See Also - -------- - gators.binning.CustomDiscretizer - Discretize using the splits given by the user. - gators.binning.QuantileDiscretizer - Discretize using splits based on quantiles. - - """ - - def __init__(self, n_bins: int, inplace=False): - _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) - - @staticmethod - def compute_bins(X: Union[pd.DataFrame, ks.DataFrame], n_bins: int - ) -> Tuple[List[List[float]], np.ndarray]: - """Compute the bins list and the bins array. - The bin list is used for dataframes and - the bins array is used for arrays. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - n_bins : int - Number of bins to use. - - Returns - ------- - bins : List[List[float]] - Bin splits definition. - The dictionary keys are the column names to discretize, - its values are the split arrays. - bins_np : np.ndarray - Bin splits definition for NumPy. - """ - n_cols = X.shape[1] - X_dtype = X.dtypes.to_numpy()[0] - if isinstance(X, pd.DataFrame): - deltas = X.max() - X.min() - bins_np = np.empty((n_bins+1, n_cols)) - bins_np[0, :] = util.get_bounds(X_dtype)[0] - bins_np[-1, :] = util.get_bounds(X_dtype)[1] - for i in range(1, n_bins): - bins_np[i, :] = X.min() + i * deltas / n_bins - - bins = pd.DataFrame( - bins_np, columns=X.columns).to_dict( - orient='list') - return bins, bins_np - x_min = X.min().to_pandas() - x_max = X.max().to_pandas() - deltas = x_max - x_min - bins_np = np.empty((n_bins+1, n_cols)) - bins_np[0, :] = util.get_bounds(X_dtype)[0] - bins_np[-1, :] = util.get_bounds(X_dtype)[1] - for i in range(1, n_bins): - bins_np[i, :] = x_min + i * deltas / n_bins - bins = (bins_np.T + EPSILON).tolist() - return bins, bins_np diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/quantile_discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/quantile_discretizer.py deleted file mode 100644 index 2e8ebb37..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/quantile_discretizer.py +++ /dev/null @@ -1,148 +0,0 @@ -# License: Apache-2.0 -from ._base_discretizer import _BaseDiscretizer -from typing import Tuple, List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..util import util - -EPSILON = 1e-10 - - -class QuantileDiscretizer(_BaseDiscretizer): - """Discretize the columns using quantile-based splits. - - The discretization can be done inplace or by adding the discretized - columns to the existing data. - - Parameters - ---------- - n_bins : int - Number of bins to use. - inplace : bool, default to False - If False, return the dataframe with the new discretized columns - with the names '`column_name`__bin'). Otherwise, return - the dataframe with the existing binned columns. - - Examples - --------- - * fit & transform with `pandas` - - - inplace discretization - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3, inplace=True) - >>> obj.fit_transform(X) - A B - 0 0.0 0.0 - 1 1.0 1.0 - 2 2.0 2.0 - - - add discretization - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3, inplace=False) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) - >>> obj = QuantileDiscretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1.0, 1.0, '0.0', '0.0'], - [0.0, 2.0, '1.0', '1.0'], - [1.0, 3.0, '2.0', '2.0']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '1.0', '1.0'], - [1, 3, '2.0', '2.0']], dtype=object) - - See Also - -------- - gators.binning.Discretizer - Discretize using equal splits. - gators.binning.CustomDiscretizer - Discretize using the variable quantiles. - - """ - - def __init__(self, n_bins: int, inplace=False): - _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) - - @staticmethod - def compute_bins(X: Union[pd.DataFrame, ks.DataFrame], n_bins: int - ) -> Tuple[List[List[float]], np.ndarray]: - """Compute the bins list and the bins array. - The bin list is used for dataframes and - the bins array is used for arrays. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - n_bins : int - Number of bins to use. - - Returns - ------- - bins : List[List[float]] - Bin splits definition. - The dictionary keys are the column names to discretize, - its values are the split arrays. - bins_np : np.ndarray - Bin splits definition for NumPy. - """ - q = np.linspace(0, 1, n_bins+1)[1:-1].tolist() - X_dtype = X.dtypes.to_numpy()[0] - - def f(x): - return x.quantile(q=q) - - bins = X.apply(f) - if isinstance(bins, ks.DataFrame): - bins = bins.to_pandas() - bins.loc[-np.inf, :] = util.get_bounds(X_dtype)[0] - bins.loc[np.inf, :] = util.get_bounds(X_dtype)[1] - bins = bins.sort_index() - for c in X.columns: - unique_bins = bins[c].iloc[1:-1].unique() - n_unique = unique_bins.shape[0] - bins[c].iloc[1:1+n_unique] = unique_bins - bins[c].iloc[1+n_unique:] = util.get_bounds(X_dtype)[1] - bins_np = bins.to_numpy() - if isinstance(X, pd.DataFrame): - return bins.to_dict(orient='list'), bins_np - else: - bins = bins_np.T.tolist() - return [np.unique(b)+EPSILON for b in bins], bins_np diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_bin_rare_events.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_bin_rare_events.py deleted file mode 100644 index ebc5f239..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_bin_rare_events.py +++ /dev/null @@ -1,285 +0,0 @@ -# License: Apache-2.0 -from gators.binning.bin_rare_events import BinRareEvents -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'e', 'd', 'd', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame({ - 'A': ['OTHERS', 'OTHERS', 'q', 'q', 'q', 'OTHERS'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'OTHERS', 'OTHERS', 'OTHERS', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_1object(): - X = pd.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'D': [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame({ - 'A': ['OTHERS', 'OTHERS', 'q', 'q', 'q', 'OTHERS'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_all_others(): - X = pd.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'e', 'd', 'd', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame({ - 'A': ['OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS'], - 'B': ['OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS'], - 'C': ['OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=1.).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_other(): - X = pd.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'e', 'd', 'd', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=0.).fit(X) - obj = BinRareEvents(min_ratio=0.).fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_num(): - X = pd.DataFrame({ - 'A': [1, 2, 3, 4, 5, 6], - 'B': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=1.).fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'e', 'd', 'd', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame({ - 'A': ['OTHERS', 'OTHERS', 'q', 'q', 'q', 'OTHERS'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'OTHERS', 'OTHERS', 'OTHERS', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_1object_ks(): - X = ks.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'D': [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame({ - 'A': ['OTHERS', 'OTHERS', 'q', 'q', 'q', 'OTHERS'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_all_others_ks(): - X = ks.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'e', 'd', 'd', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame({ - 'A': ['OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS'], - 'B': ['OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS'], - 'C': ['OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS', 'OTHERS'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=1.).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_other_ks(): - X = ks.DataFrame({ - 'A': ['w', 'z', 'q', 'q', 'q', 'z'], - 'B': ['x', 'x', 'w', 'w', 'w', 'x'], - 'C': ['c', 'c', 'e', 'd', 'd', 'c'], - 'D': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=0.).fit(X) - obj = BinRareEvents(min_ratio=0.).fit(X) - return obj, X, X.to_pandas().copy() - - -@pytest.fixture -def data_num_ks(): - X = ks.DataFrame({ - 'A': [1, 2, 3, 4, 5, 6], - 'B': [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=1.).fit(X) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns) - X_expected.index = X_new.index - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - X_expected.index = X_new.index - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_other_pd(data_no_other): - obj, X, X_expected = data_no_other - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_other_ks(data_no_other_ks): - obj, X, X_expected = data_no_other_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_other_pd_np(data_no_other): - obj, X, X_expected = data_no_other - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_other_ks_np(data_no_other_ks): - obj, X, X_expected = data_no_other_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_1object_pd(data_1object): - obj, X, X_expected = data_1object - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_1object_ks(data_1object_ks): - obj, X, X_expected = data_1object_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_1object_pd_np(data_1object): - obj, X, X_expected = data_1object - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_1object_ks_np(data_1object_ks): - obj, X, X_expected = data_1object_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_all_others_pd(data_all_others): - obj, X, X_expected = data_all_others - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_all_others_ks(data_all_others_ks): - obj, X, X_expected = data_all_others_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_all_others_pd_np(data_all_others): - obj, X, X_expected = data_all_others - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_all_others_ks_np(data_all_others_ks): - obj, X, X_expected = data_all_others_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = BinRareEvents(min_ratio=1) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_custom_discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_custom_discretizer.py deleted file mode 100644 index 66e6ec84..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_custom_discretizer.py +++ /dev/null @@ -1,493 +0,0 @@ -# License: Apache-2.0 -from gators.binning import CustomDiscretizer -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'D__bin': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F__bin': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X[list('ABDF')] = X[list('ABDF')].astype(np.int16) - X_expected = pd.DataFrame({ - 'A': {0: 7, 1: 71, 2: 7, 3: 53, 4: 8, 5: 8}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22, 1: 38, 2: 26, 3: 35, 4: 35, 5: 31}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F__bin': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'}} - ) - X_expected[list('ABDF')] = X_expected[list('ABDF')].astype(np.int16) - bins = { - 'A': [-1000, 8, 40, 1000], - 'D': [-1000, 30, 1000], - 'F': [-1000, 1., 1000] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num(): - X = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - X_expected = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace(): - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num(): - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'D__bin': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F__bin': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace(): - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'D__bin': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F__bin': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X[list('ABDF')] = X[list('ABDF')].astype(np.int16) - X_expected = pd.DataFrame({ - 'A': {0: 7, 1: 71, 2: 7, 3: 53, 4: 8, 5: 8}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22, 1: 38, 2: 26, 3: 35, 4: 35, 5: 31}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F__bin': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'}} - ) - X_expected[list('ABDF')] = X_expected[list('ABDF')].astype(np.int16) - bins = { - 'A': [-1000, 8, 40, 1000], - 'D': [-1000, 30, 1000], - 'F': [-1000, 1., 1000] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num_ks(): - X = ks.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - X_expected = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace_ks(): - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'D__bin': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F__bin': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace_ks(): - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '1.0', 5: '1.0'}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: '0.0', 1: '1.0', 2: '0.0', 3: '1.0', 4: '1.0', 5: '1.0'}, - 'F': {0: '1.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '1.0'} - }) - bins = { - 'A': [-np.inf, 8., 40., np.inf], - 'D': [-np.inf, 30, np.inf], - 'F': [-np.inf, 1., np.inf] - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_num_pd(data_no_num): - obj, X, X_expected = data_no_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_num_ks(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_no_num_pd_np(data_no_num): - obj, X, X_expected = data_no_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_num_ks_np(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - -# # inplace - - -def test_inplace_pd(data_inplace): - obj, X, X_expected = data_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_ks(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_pd_np(data_inplace): - obj, X, X_expected = data_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_ks_np(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_inplace_num_pd(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_num_ks(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_num_pd_np(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_num_ks_np(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = CustomDiscretizer(bins='a') - with pytest.raises(TypeError): - _ = CustomDiscretizer(bins={'A': [-np.inf, np.inf]}, inplace='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_discretizer.py deleted file mode 100644 index 35fec3cd..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_discretizer.py +++ /dev/null @@ -1,453 +0,0 @@ -# License: Apache-2.0 -from gators.binning import Discretizer -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B__bin': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X[list('ABDF')] = X[list('ABDF')].astype(np.int16) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B__bin': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - X_expected[list('ABDF')] = X_expected[list('ABDF')].astype(np.int16) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num(): - X = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - X_expected = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - n_bins = 3 - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B__bin': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - -### - - -@pytest.fixture -def data_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B__bin': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X[list('ABDF')] = X[list('ABDF')].astype(np.int16) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B__bin': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - X_expected[list('ABDF')] = X_expected[list('ABDF')].astype(np.int16) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num_ks(): - X = ks.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - X_expected = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - n_bins = 3 - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B__bin': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'B': {0: '3.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '0.0', 5: '0.0'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '3.0', 5: '2.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_num_pd(data_no_num): - obj, X, X_expected = data_no_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_num_ks(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_no_num_pd_np(data_no_num): - obj, X, X_expected = data_no_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_num_ks_np(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - -# # inplace - - -def test_inplace_pd(data_inplace): - obj, X, X_expected = data_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_ks(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_pd_np(data_inplace): - obj, X, X_expected = data_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_ks_np(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_inplace_num_pd(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_num_ks(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_num_pd_np(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_num_ks_np(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = Discretizer(n_bins='a') - with pytest.raises(TypeError): - _ = Discretizer(n_bins=2, inplace='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_quantile_discretizer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_quantile_discretizer.py deleted file mode 100644 index fb966523..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/binning/tests/test_quantile_discretizer.py +++ /dev/null @@ -1,422 +0,0 @@ -# License: Apache-2.0 -from gators.binning import QuantileDiscretizer -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B__bin': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X[list('ABDF')] = X[list('ABDF')].astype(np.int16) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B__bin': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - X_expected[list('ABDF')] = X_expected[list('ABDF')].astype(np.int16) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num(): - X = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - X_expected = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - n_bins = 3 - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B__bin': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace(): - n_bins = 4 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - -### - - -@pytest.fixture -def data_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B__bin': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X[list('ABDF')] = X[list('ABDF')].astype(np.int16) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B__bin': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - X_expected[list('ABDF')] = X_expected[list('ABDF')].astype(np.int16) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'c', 'd', 'e', 'f'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'C': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num_ks(): - n_bins = 3 - X = ks.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - X_expected = pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f']}) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - 'B': {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - 'D': {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - 'F': {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - 'A__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B__bin': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D__bin': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F__bin': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace_ks(): - n_bins = 4 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3]} - ) - X_expected = pd.DataFrame({ - 'A': {0: '0.0', 1: '3.0', 2: '0.0', 3: '3.0', 4: '1.0', 5: '2.0'}, - 'B': {0: '2.0', 1: '2.0', 2: '0.0', 3: '2.0', 4: '0.0', 5: '0.0'}, - 'D': {0: '0.0', 1: '3.0', 2: '0.0', 3: '2.0', 4: '2.0', 5: '1.0'}, - 'F': {0: '3.0', 1: '0.0', 2: '1.0', 3: '0.0', 4: '1.0', 5: '3.0'} - }) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_num_pd(data_no_num): - obj, X, X_expected = data_no_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_num_ks(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_no_num_pd_np(data_no_num): - obj, X, X_expected = data_no_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_num_ks_np(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - -# # inplace - - -def test_inplace_pd(data_inplace): - obj, X, X_expected = data_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_ks(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_pd_np(data_inplace): - obj, X, X_expected = data_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_ks_np(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_inplace_num_pd(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_num_ks(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_num_pd_np(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_num_ks_np(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = QuantileDiscretizer(n_bins='a') - with pytest.raises(TypeError): - _ = QuantileDiscretizer(n_bins=2, inplace='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/__init__.py deleted file mode 100644 index 50a07f95..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .clipping import Clipping - -__all__ = [ - 'Clipping', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/clipping.py b/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/clipping.py deleted file mode 100644 index 60005b0f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/clipping.py +++ /dev/null @@ -1,173 +0,0 @@ -# License: Apache-2.0 -from typing import List, Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..util import util -from ..transformers.transformer import Transformer -from clipping import clipping - - -class Clipping(Transformer): - """Trim values using the limits given by the user. - - The data should be only composed of numerical columns. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `Clipping`. - - Parameters - ---------- - clip_dict : Dict[str, List[float]] - The keys are the columns to clip, the values are lists of two elements: - - * the first element is the lower limit - * the second element is the upper limit - - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.clipping import Clipping - >>> X = pd.DataFrame( - ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], - ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], - ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> obj.fit_transform(X) - A B C - 0 0.5 0.4 1.0 - 1 0.5 0.5 -0.0 - 2 0.5 -0.2 -0.0 - 3 0.4 0.1 1.0 - 4 0.5 0.1 0.4 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.clipping import Clipping - >>> X = ks.DataFrame( - ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], - ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], - ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> obj.fit_transform(X) - A B C - 0 0.5 0.4 1.0 - 1 0.5 0.5 -0.0 - 2 0.5 -0.2 -0.0 - 3 0.4 0.1 1.0 - 4 0.5 0.1 0.4 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.clipping import Clipping - >>> X = pd.DataFrame( - ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], - ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], - ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0.5, 0.4, 1. ], - [ 0.5, 0.5, -0. ], - [ 0.5, -0.2, -0. ], - [ 0.4, 0.1, 1. ], - [ 0.5, 0.1, 0.4]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.clipping import Clipping - >>> X = ks.DataFrame( - ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], - ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], - ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0.5, 0.4, 1. ], - [ 0.5, 0.5, -0. ], - [ 0.5, -0.2, -0. ], - [ 0.4, 0.1, 1. ], - [ 0.5, 0.1, 0.4]]) - - """ - - def __init__(self, clip_dict: Dict[str, List[float]], - dtype: type = np.float64): - if not isinstance(clip_dict, dict): - raise TypeError('`clip_dict` should be a dictionary.') - if len(clip_dict) == 0: - raise ValueError('Length of `clip_dict` should be not zero.') - self.clip_dict = clip_dict - self.dtype = dtype - self.clip_np = np.array(list(clip_dict.values())) - self.columns = list(clip_dict.keys()) - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'Clipping': - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - 'Clipping': Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.idx_columns = util.get_idx_columns(X, self.clip_dict.keys()) - self.clip_np = self.clip_np.astype(self.dtype) - return self - - def transform(self, X): - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - - def clipping(x: ks.Series[self.dtype]) -> ks.Series[self.dtype]: - c = x.name - if c not in self.columns: - return x - return x.clip(self.clip_dict[c][0], self.clip_dict[c][1]) - - return X.apply(clipping) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - return clipping(X, self.idx_columns, self.clip_np) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/clipping.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/clipping.pyx deleted file mode 100644 index ed9bd79e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/clipping.pyx +++ /dev/null @@ -1,38 +0,0 @@ -import cython -import numpy as np -cimport numpy as np - -ctypedef fused num_t: - np.int8_t - np.int16_t - np.int32_t - np.int64_t - np.float32_t - np.float64_t - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_t, ndim=2] clipping( - np.ndarray[num_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[num_t, ndim=2] clip_np, -): - cdef int i - cdef int j - cdef int k - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef num_t val - - with nogil: - for j in range(n_cols): - for i in range(n_rows): - val = X[i, j] - if val < clip_np[j, 0]: - X[i, j] = clip_np[j, 0] - continue - if val > clip_np[j, 1]: - X[i, j] = clip_np[j, 1] - continue - return X \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/tests/test_clipping.py b/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/tests/test_clipping.py deleted file mode 100644 index 6a0649ca..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/clipping/tests/test_clipping.py +++ /dev/null @@ -1,199 +0,0 @@ -# License: Apache-2.0 -from gators.clipping.clipping import Clipping -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -from pandas.testing import assert_frame_equal -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - np.random.seed(0) - X = pd.DataFrame( - np.random.randn(5, 3), - columns=list('ABC') - ) - clip_dict = {'A': [-0.5, 0.5], 'B': [-0.5, 0.5], 'C': [-100., 1.]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame({ - 'A': [0.5, 0.5, 0.5, 0.4105985019, 0.5], - 'B': [0.400157208, 0.5, -0.1513572082976979, 0.144043571160878, 0.12167501649282841], - 'C': [0.9787379841057392, -0.977277879876411, -0.10321885179355784, 1.0, 0.4438632327]}) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - np.random.seed(0) - X = pd.DataFrame( - 5 * np.random.randn(5, 3), - columns=list('ABC') - ).astype(np.int16) - clip_dict = {'A': [-5, 2], 'B': [-1, 3], 'C': [-2, 5]} - obj = Clipping(clip_dict=clip_dict, dtype=np.int16).fit(X) - X_expected = pd.DataFrame({ - 'A': [2, 2, 2, 2, 2], - 'B': [2, 3, 0, 0, 0], - 'C': [4, -2, 0, 5, 2]} - ).astype(np.int16) - return obj, X, X_expected - - -@pytest.fixture -def data_partial(): - np.random.seed(0) - X = pd.DataFrame( - np.random.randn(5, 3), - columns=list('ABC') - ) - clip_dict = {'A': [-0.5, 0.5], 'B': [-0.5, 0.5]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame({ - 'A': [0.5, 0.5, 0.5, 0.4105985019, 0.5], - 'B': [0.400157208, 0.5, -0.1513572082976979, 0.144043571160878, 0.12167501649282841], - 'C': [0.9787379841057392, -0.977277879876411, -0.10321885179355784, 1.454274, 0.4438632327] - }) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - np.random.seed(0) - X = ks.DataFrame( - np.random.randn(5, 3), - columns=list('ABC') - ) - clip_dict = {'A': [-0.5, 0.5], 'B': [-0.5, 0.5], 'C': [-100., 1.]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame({ - 'A': [0.5, 0.5, 0.5, 0.4105985019, 0.5], - 'B': [0.400157208, 0.5, -0.1513572082976979, 0.144043571160878, 0.12167501649282841], - 'C': [0.9787379841057392, -0.977277879876411, -0.10321885179355784, 1.0, 0.4438632327]}) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - np.random.seed(0) - X = ks.DataFrame( - 5 * np.random.randn(5, 3), - columns=list('ABC') - ).astype(np.int16) - clip_dict = {'A': [-5, 2], 'B': [-1, 3], 'C': [-2, 5]} - obj = Clipping(clip_dict=clip_dict, dtype=np.int16).fit(X) - X_expected = pd.DataFrame({ - 'A': [2, 2, 2, 2, 2], - 'B': [2, 3, 0, 0, 0], - 'C': [4, -2, 0, 5, 2]} - ).astype(np.int16) - return obj, X, X_expected - - -@pytest.fixture -def data_partial_ks(): - np.random.seed(0) - X = ks.DataFrame( - np.random.randn(5, 3), - columns=list('ABC') - ) - clip_dict = {'A': [-0.5, 0.5], 'B': [-0.5, 0.5]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame({ - 'A': [0.5, 0.5, 0.5, 0.4105985019, 0.5], - 'B': [0.400157208, 0.5, -0.1513572082976979, 0.144043571160878, 0.12167501649282841], - 'C': [0.9787379841057392, -0.977277879876411, -0.10321885179355784, 1.454274, 0.4438632327] - }) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -def test_partial_pd(data_partial): - obj, X, X_expected = data_partial - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_partial_ks(data_partial_ks): - obj, X, X_expected = data_partial_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_partial_pd_np(data_partial): - obj, X, X_expected = data_partial - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -@pytest.mark.koalas -def test_partial_ks_np(data_partial_ks): - obj, X, X_expected = data_partial_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -def test_init(data): - with pytest.raises(TypeError): - _ = Clipping(clip_dict=0) - with pytest.raises(ValueError): - _ = Clipping(clip_dict={}) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/__init__.py deleted file mode 100644 index 55c8ce3e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from .to_numpy import ToNumpy -from .koalas_to_pandas import KoalasToPandas -from .convert_column_datatype import ConvertColumnDatatype - -__all__ = [ - 'ToNumpy', - 'KoalasToPandas', - 'ConvertColumnDatatype', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/convert_column_datatype.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/convert_column_datatype.py deleted file mode 100644 index b715b39c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/convert_column_datatype.py +++ /dev/null @@ -1,151 +0,0 @@ -# License: Apache-2.0 -from ..transformers import Transformer -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - -LIST_NUMPY_NUM_DTYPES = [ - bool, - int, - 'np.int8', - 'np.int16', - 'np.int32', - 'np.int64', - 'np.uint8', - 'np.uint16', - 'np.uint32', - 'np.uint64', - float, - 'np.float16', - 'np.float32', - 'np.float64', -] - - -class ConvertColumnDatatype(Transformer): - """Set the datatype of the selected columns to a given datatype. - - Parameters - ---------- - columns : List[str] - List of columns. - datatype: type - Datatype to use. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.converter import ConvertColumnDatatype - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> obj.fit_transform(X) - A B - 0 1.0 1 - 1 2.0 1 - 2 3.0 1 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.converter import ConvertColumnDatatype - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> obj.fit_transform(X) - A B - 0 1.0 1 - 1 2.0 1 - 2 3.0 1 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.converter import ConvertColumnDatatype - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [2., 1.], - [3., 1.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.converter import ConvertColumnDatatype - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [2., 1.], - [3., 1.]]) - - """ - - def __init__(self, columns: List[str], datatype: type): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - if type(datatype) != type and not str(datatype).startswith('datetime'): - raise TypeError('`datatype` should be a type.') - self.columns = columns - self.datatype = datatype - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'ConvertColumnDatatype': - """Fit the transformer on the dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - SetDatatype: Instance of itself. - """ - self.check_dataframe(X) - return self - - def transform(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - X[self.columns] = X[self.columns].astype(self.datatype) - return X - - def transform_numpy(self, X: np.ndarray, - y=None) -> np.ndarray: - """Transform the array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - if self.datatype in LIST_NUMPY_NUM_DTYPES: - return X.astype(self.datatype) - return X.astype(object) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/koalas_to_pandas.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/koalas_to_pandas.py deleted file mode 100644 index 0aa40903..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/koalas_to_pandas.py +++ /dev/null @@ -1,63 +0,0 @@ -from ..transformers.transformer_xy import TransformerXY -from typing import Tuple, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class KoalasToPandas(TransformerXY): - """Convert koalas dataframe and series to a pandas dataframe and series. - - Examples - --------- - * transform with pandas - - >>> import databricks.koalas as ks - >>> from gators.converter import KoalasToPandas - >>> X = ks.DataFrame({ - ... 'q': {0: 0.0, 1: 3.0, 2: 6.0}, - ... 'w': {0: 1.0, 1: 4.0, 2: 7.0}, - ... 'e': {0: 2.0, 1: 5.0, 2: 8.0}}) - >>> y = ks.Series([0, 0, 1], name='TARGET') - >>> obj = KoalasToPandas() - >>> X, y = obj.transform(X, y) - >>> X - q w e - 0 0.0 1.0 2.0 - 1 3.0 4.0 5.0 - 2 6.0 7.0 8.0 - >>> y - 0 0 - 1 0 - 2 1 - Name: TARGET, dtype: int64 - """ - - def __init__(self): - TransformerXY.__init__(self) - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[np.ndarray, np.ndarray]: - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : [pd.Series, ks.Series]: - Target values. - - Returns - ------- - X : pd.DataFrame - Dataframe. - y : np.ndarray - Target values. - """ - if not isinstance(X, ks.DataFrame): - raise TypeError('`X` should be a koalas dataframe') - self.check_dataframe(X) - self.check_y(X, y) - return X.to_pandas(), y.to_pandas() diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_convert_column_datatype.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_convert_column_datatype.py deleted file mode 100644 index aed064eb..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_convert_column_datatype.py +++ /dev/null @@ -1,148 +0,0 @@ -# License: Apache-2.0 -from gators.converter.convert_column_datatype import ConvertColumnDatatype -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': [True, False, True, False], - 'B': [True, True, True, False], - 'C': [True, True, True, True], - 'D': [1, 2, 3, 4]}) - X_expected = pd.DataFrame({ - 'A': [1., 0., 1., 0.], - 'B': [1., 1., 1., 0.], - 'C': [1., 1., 1., 1.], - 'D': [1, 2, 3, 4]}) - obj = ConvertColumnDatatype( - columns=['A', 'B', 'C'], datatype=float).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj(): - X = pd.DataFrame({ - 'A': ['2020-01-01 00:00:00', '2020-04-08 06:00:00'], - 'B': [True, False], - 'C': [True, True], - 'D': [1, 2]}) - X_expected = pd.DataFrame({ - 'A': ['2020-01-01 00:00:00', '2020-04-08 06:00:00'], - 'B': [True, False], - 'C': [True, True], - 'D': [1, 2]}) - X_expected['A'] = X_expected['A'].astype('datetime64[ns]') - obj = ConvertColumnDatatype( - columns=['A'], datatype='datetime64[ns]').fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': [True, False, True, False], - 'B': [True, True, True, False], - 'C': [True, True, True, True], - 'D': [1, 2, 3, 4]}) - X_expected = pd.DataFrame({ - 'A': [1., 0., 1., 0.], - 'B': [1., 1., 1., 0.], - 'C': [1., 1., 1., 1.], - 'D': [1, 2, 3, 4]}) - obj = ConvertColumnDatatype( - columns=['A', 'B', 'C'], datatype=float).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj_ks(): - X = ks.DataFrame({ - 'A': ['2020-01-01 00:00:00', '2020-04-08 06:00:00'], - 'B': [True, False], - 'C': [True, True], - 'D': [1, 2]}) - X_expected = pd.DataFrame({ - 'A': ['2020-01-01 00:00:00', '2020-04-08 06:00:00'], - 'B': [True, False], - 'C': [True, True], - 'D': [1, 2]}) - X_expected['A'] = X_expected['A'].astype('datetime64[ns]') - obj = ConvertColumnDatatype( - columns=['A'], datatype='datetime64[ns]').fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, dtype=X_numpy_new.dtype) - X_expected = pd.DataFrame( - X_expected, columns=X_expected.columns, dtype=float) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - assert X_numpy_new.tolist() == X_expected.to_numpy().tolist() - - -def test_obj(data_obj): - obj, X, X_expected = data_obj - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_obj_ks(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_obj_pd_np(data_obj): - obj, X, X_expected = data_obj - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - assert X_numpy_new.tolist() == X.to_numpy().tolist() - - - -@pytest.mark.koalas -def test_obj_ks_np(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - assert X_numpy_new.tolist() == X.to_numpy().tolist() - - -def test_input(): - with pytest.raises(TypeError): - _ = ConvertColumnDatatype(columns=0, datatype=float) - with pytest.raises(ValueError): - _ = ConvertColumnDatatype(columns=[], datatype=float) - with pytest.raises(TypeError): - _ = ConvertColumnDatatype(columns=['A'], datatype=0) - with pytest.raises(TypeError): - _ = ConvertColumnDatatype(columns=['A'], datatype='x') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_koalas_to_pandas.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_koalas_to_pandas.py deleted file mode 100644 index 3973967c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_koalas_to_pandas.py +++ /dev/null @@ -1,32 +0,0 @@ -from gators.converter.koalas_to_pandas import KoalasToPandas -from pandas.testing import assert_series_equal -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'q': {0: 0.0, 1: 3.0, 2: 6.0}, - 'w': {0: 1.0, 1: 4.0, 2: 7.0}, - 'e': {0: 2.0, 1: 5.0, 2: 8.0} - } - ) - y = ks.Series([0, 0, 1], name='TARGET') - return X, y, X.to_pandas(), y.to_pandas() - - -@pytest.mark.koalas -def test_ks(data_ks): - X_ks, y_ks, X_expected, y_expected = data_ks - X_new, y_new = KoalasToPandas().transform(X_ks, y_ks) - assert_frame_equal(X_new, X_expected) - assert_series_equal(y_new, y_expected) - - -def test_input(): - with pytest.raises(TypeError): - _ = KoalasToPandas().transform(pd.DataFrame(), pd.DataFrame()) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_to_numpy.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_to_numpy.py deleted file mode 100644 index 291eb74c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/tests/test_to_numpy.py +++ /dev/null @@ -1,45 +0,0 @@ -from gators.converter.to_numpy import ToNumpy -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'q': {0: 0.0, 1: 3.0, 2: 6.0}, - 'w': {0: 1.0, 1: 4.0, 2: 7.0}, - 'e': {0: 2.0, 1: 5.0, 2: 8.0} - } - ) - y = pd.Series([0, 0, 1], name='TARGET') - return X, y, X.to_numpy(), y.to_numpy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'q': {0: 0.0, 1: 3.0, 2: 6.0}, - 'w': {0: 1.0, 1: 4.0, 2: 7.0}, - 'e': {0: 2.0, 1: 5.0, 2: 8.0} - } - ) - y = ks.Series([0, 0, 1], name='TARGET') - return X, y, X.to_numpy(), y.to_numpy() - - -def test_pd(data): - X, y, X_expected, y_expected = data - X_new, y_new = ToNumpy().transform(X, y) - assert np.allclose(X_new, X_expected) - assert np.allclose(y_new, y_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - X, y, X_expected, y_expected = data_ks - X_new, y_new = ToNumpy().transform(X, y) - assert np.allclose(X_new, X_expected) - assert np.allclose(y_new, y_expected) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/to_numpy.py b/build/lib.macosx-10.9-x86_64-3.9/gators/converter/to_numpy.py deleted file mode 100644 index 179a916d..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/converter/to_numpy.py +++ /dev/null @@ -1,76 +0,0 @@ -from ..transformers.transformer_xy import TransformerXY -from typing import Tuple, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class ToNumpy(TransformerXY): - """Convert dataframe and series to NumPy arrays. - - Examples - --------- - * transform with pandas - - >>> import pandas as pd - >>> from gators.converter import ToNumpy - >>> X = pd.DataFrame({ - ... 'q': [0.0, 3.0, 6.0], - ... 'w': [1.0, 4.0, 7.0], - ... 'e': [2.0, 5.0, 8.0]}) - >>> y = pd.Series([0, 0, 1], name='TARGET') - >>> obj = ToNumpy() - >>> X, y = obj.transform(X, y) - >>> X - array([[0., 1., 2.], - [3., 4., 5.], - [6., 7., 8.]]) - >>> y - array([0, 0, 1]) - - * transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.converter.to_numpy import ToNumpy - >>> X = ks.DataFrame({ - ... 'q': [0.0, 3.0, 6.0], - ... 'w': [1.0, 4.0, 7.0], - ... 'e': [2.0, 5.0, 8.0]}) - >>> y = ks.Series([0, 0, 1], name='TARGET') - >>> obj = ToNumpy() - >>> X, y = obj.transform(X, y) - >>> X - array([[0., 1., 2.], - [3., 4., 5.], - [6., 7., 8.]]) - >>> y - array([0, 0, 1]) - - """ - - def __init__(self): - TransformerXY.__init__(self) - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[np.ndarray, np.ndarray]: - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Dataframe. - y : [pd.Series, ks.Series]: - Target values. - - Returns - ------- - X : np.ndarray - Array. - y : np.ndarray - Target values. - """ - self.check_dataframe(X) - self.check_y(X, y) - return X.to_numpy(), y.to_numpy() diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/__init__.py deleted file mode 100644 index 6fabfe16..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from ._base_data_cleaning import _BaseDataCleaning -from .drop_columns import DropColumns -from .keep_columns import KeepColumns -from .replace import Replace -from .drop_datatype_columns import DropDatatypeColumns -from .drop_high_cardinality import DropHighCardinality -from .drop_high_nan_ratio import DropHighNaNRatio -from .drop_low_cardinality import DropLowCardinality - - -__all__ = [ - '_BaseDataCleaning', - 'DropColumns', - 'DropDatatypeColumns', - 'DropHighCardinality', - 'DropHighNaNRatio', - 'DropLowCardinality', - 'KeepColumns', - 'Replace', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/_base_data_cleaning.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/_base_data_cleaning.py deleted file mode 100644 index 4e232ef7..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/_base_data_cleaning.py +++ /dev/null @@ -1,76 +0,0 @@ -# License: Apache-2.0 -from ..transformers.transformer import Transformer -from ..util import util -from typing import List, Union -from abc import ABC -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class _BaseDataCleaning(Transformer, ABC): - """Base data cleaning transformer.""" - - def __init__(self): - Transformer.__init__(self) - self.columns_to_drop: List[str] = [] - self.columns_to_keep: List[str] = [] - self.idx_columns_to_keep = np.array([]) - - def transform(self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataset. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataset without datetime columns. - """ - self.check_dataframe(X) - if len(self.columns): - return X.drop(self.columns, axis=1) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return X[:, self.idx_columns_to_keep] - - @ staticmethod - def get_idx_columns_to_keep( - columns: List[str], columns_to_drop: List[str]) -> np.array: - """Get the column indices to keep. - - Parameters - ---------- - columns : List[str] - List of columns of a dataset. - columns_to_drop : List[str] - List of columns to drop. - - Returns - ------- - np.array: - Column indices to keep. - """ - idx_columns_to_keep = util.exclude_idx_columns( - columns=columns, - excluded_columns=columns_to_drop, - ) - return idx_columns_to_keep diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/data_cleaning.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/data_cleaning.pyx deleted file mode 100644 index 141b84be..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/data_cleaning.pyx +++ /dev/null @@ -1,27 +0,0 @@ - -# License: Apache-2.0 -cimport cython -cimport numpy as np -import numpy as np - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] replace( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[object, ndim=2] to_replace_np_keys, - np.ndarray[object, ndim=2] to_replace_np_vals, - np.ndarray[np.int64_t, ndim=1] n_elements_vec, -): - cdef int i - cdef int j - cdef int k - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - for i in range(n_rows): - for j in range(n_cols): - for k in range(n_elements_vec[j]): - if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: - X[i, idx_columns[j]] = to_replace_np_vals[j, k] - break - return X \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_columns.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_columns.py deleted file mode 100644 index c219bb84..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_columns.py +++ /dev/null @@ -1,102 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from ._base_data_cleaning import _BaseDataCleaning -from typing import Union -import pandas as pd -import databricks.koalas as ks - - -class DropColumns(_BaseDataCleaning): - """Drop the columns given by the user. - - Parameters - ---------- - columns : List[str] - List of columns to drop. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropColumns - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropColumns - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]]) - - """ - - def __init__(self, columns): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - - _BaseDataCleaning.__init__(self) - self.columns = columns - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'DropColumns': - """Fit the transformer on the dataframe X. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - DropColumns: Instance of itself. - """ - self.check_dataframe(X) - self.columns_to_keep = util.exclude_columns( - columns=X.columns, - excluded_columns=self.columns) - self.idx_columns_to_keep = util.exclude_idx_columns( - columns=X.columns, - excluded_columns=self.columns - ) - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_datatype_columns.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_datatype_columns.py deleted file mode 100644 index 37844608..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_datatype_columns.py +++ /dev/null @@ -1,100 +0,0 @@ -# License: Apache-2.0 -from ._base_data_cleaning import _BaseDataCleaning -from ..util import util -from typing import Union -import pandas as pd -import databricks.koalas as ks - - -class DropDatatypeColumns(_BaseDataCleaning): - """Drop the columns belonging to a given datatype. - - Parameters - ---------- - dtype : type - Colum datatype to drop. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropDatatypeColumns - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropDatatypeColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropDatatypeColumns - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.], - [2.], - [3.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropDatatypeColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.], - [2.], - [3.]]) - - """ - - def __init__(self, dtype: type): - if not isinstance(dtype, type): - raise TypeError('`dtype` should be a type.') - _BaseDataCleaning.__init__(self) - self.dtype = dtype - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'DropDatatypeColumns': - """Fit the transformer on the dataframe X. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : None - None - Returns - ------- - DropDatatypeColumns: Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.get_datatype_columns(X, self.dtype) - self.columns_to_keep = util.exclude_columns( - columns=X.columns, - excluded_columns=self.columns) - self.idx_columns_to_keep = util.exclude_idx_columns( - columns=X.columns, - excluded_columns=self.columns) - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_high_cardinality.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_high_cardinality.py deleted file mode 100644 index 0defd414..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_high_cardinality.py +++ /dev/null @@ -1,137 +0,0 @@ -# License: Apache-2.0 -from ._base_data_cleaning import _BaseDataCleaning -from ..util import util -from typing import List, Union -import pandas as pd -import databricks.koalas as ks - - -class DropHighCardinality(_BaseDataCleaning): - """Drop the categorical columns having a large cardinality. - - Parameters - ---------- - max_categories : int - Maximum number of categories allowed. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropHighCardinality - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) - >>> obj.fit_transform(X) - B - 0 d - 1 d - 2 e - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) - >>> obj.fit_transform(X) - B - 0 d - 1 d - 2 e - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropHighCardinality - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['d'], - ['d'], - ['e']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['d'], - ['d'], - ['e']], dtype=object) - - """ - - def __init__(self, max_categories: int): - if not isinstance(max_categories, int): - raise TypeError('`max_categories` should be an int.') - _BaseDataCleaning.__init__(self) - self.max_categories = max_categories - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'DropHighCardinality': - """Fit the transformer on the dataframe `X`. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : None - None - - Returns - ------- - DropHighCardinality: Instance of itself. - """ - self.check_dataframe(X) - object_columns = util.get_datatype_columns(X, object) - self.columns = self.get_columns_to_drop( - X=X[object_columns], - max_categories=self.max_categories - ) - self.columns_to_keep = util.exclude_columns( - columns=X.columns, - excluded_columns=self.columns, - ) - self.idx_columns_to_keep = self.get_idx_columns_to_keep( - columns=X.columns, - columns_to_drop=self.columns, - ) - return self - - @ staticmethod - def get_columns_to_drop( - X: Union[pd.DataFrame, ks.DataFrame], - max_categories: int) -> List[str]: - """Get the column names to drop. - - Parameters - ---------- - X_nunique : pd.DataFrame - Input dataframe. - max_categories : int - Maximum number of categories allowed. - - Returns - ------- - List[str] - List of column names to drop. - """ - object_columns = util.get_datatype_columns(X, object) - if not object_columns: - return [] - if isinstance(X, pd.DataFrame): - X_nunique = X[object_columns].nunique() - else: - X_nunique = X[object_columns].nunique(approx=True) - mask_columns = X_nunique > max_categories - columns_to_drop = X_nunique[mask_columns].index - return list(columns_to_drop.to_numpy()) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_high_nan_ratio.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_high_nan_ratio.py deleted file mode 100644 index 77d888d5..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_high_nan_ratio.py +++ /dev/null @@ -1,136 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union -import pandas as pd -import databricks.koalas as ks -from ..util import util -from ._base_data_cleaning import _BaseDataCleaning - - -class DropHighNaNRatio(_BaseDataCleaning): - """Drop the columns having a large NaN values ratio. - - Parameters - ---------- - max_ratio : float - Max nan ratio allowed. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import numpy as np - >>> import pandas as pd - >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = pd.DataFrame( - ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit & transform with `koalas` - - >>> import numpy as np - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = ks.DataFrame( - ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit with `pandas` & transform with `NumPy` - - >>> import numpy as np - >>> import pandas as pd - >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = pd.DataFrame( - ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import numpy as np - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = ks.DataFrame( - ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]], dtype=object) - - """ - - def __init__(self, max_ratio: float): - if not isinstance(max_ratio, float): - raise TypeError('`max_ratio` should be a float.') - _BaseDataCleaning.__init__(self) - self.max_ratio = max_ratio - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'DropHighNaNRatio': - """Fit the transformer on the dataframe X. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : None - None - - Returns - ------- - DropHighNaNRatio: Instance of itself. - """ - self.check_dataframe(X) - self.columns = self.get_columns_to_drop( - X=X, - max_ratio=self.max_ratio) - self.columns_to_keep = util.exclude_columns( - columns=list(X.columns), - excluded_columns=self.columns) - self.idx_columns_to_keep = self.get_idx_columns_to_keep( - columns=X.columns, - columns_to_drop=self.columns) - return self - - @staticmethod - def get_columns_to_drop( - X: Union[pd.DataFrame, ks.DataFrame], - max_ratio: float) -> List[str]: - """Get the list of column names to drop. - - Parameters - ---------- - X : pd.DataFrame - Input dataset. - max_ratio : float - Max nan ratio allowed. - - Returns - ------- - List[str] - List of column names to drop. - """ - mask_columns = X.isnull().mean() > max_ratio - columns_to_drop = mask_columns[mask_columns].index - if isinstance(columns_to_drop, ks.indexes.Index): - columns_to_drop = columns_to_drop.to_pandas() - return columns_to_drop diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_low_cardinality.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_low_cardinality.py deleted file mode 100644 index cd8f27df..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/drop_low_cardinality.py +++ /dev/null @@ -1,135 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from ._base_data_cleaning import _BaseDataCleaning -from typing import List, Union -import pandas as pd -import databricks.koalas as ks - - -class DropLowCardinality(_BaseDataCleaning): - """Drop the catgorical columns having a low cardinality. - - Parameters - ---------- - min_categories : int - Min categories allowed. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropLowCardinality - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) - >>> obj.fit_transform(X) - A - 0 a - 1 b - 2 c - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropLowCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) - >>> obj.fit_transform(X) - A - 0 a - 1 b - 2 c - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropLowCardinality - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a'], - ['b'], - ['c']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropLowCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a'], - ['b'], - ['c']], dtype=object) - - """ - - def __init__(self, min_categories: int): - if not isinstance(min_categories, int): - raise TypeError('`min_categories` should be an int.') - _BaseDataCleaning.__init__(self) - self.min_categories: int = min_categories - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'DropLowCardinality': - """Fit the transformer on the dataframe X. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : None - None - Returns - ------- - DropLowCardinality: Instance of itself. - """ - self.check_dataframe(X) - self.columns = self.get_columns_to_drop( - X=X, - min_categories=self.min_categories - ) - self.columns_to_keep = util.exclude_columns( - columns=X.columns, - excluded_columns=self.columns, - ) - self.idx_columns_to_keep = self.get_idx_columns_to_keep( - columns=X.columns, - columns_to_drop=self.columns) - return self - - @staticmethod - def get_columns_to_drop( - X: Union[pd.DataFrame, ks.DataFrame], - min_categories: float) -> List[str]: - """Get the list of column names to remove. - - Parameters - ---------- - X : pd.DataFrame - Input dataset. - min_categories : int - Min categories allowed. - - Returns - ------- - List[str] - List of column names to drop. - """ - object_columns = util.get_datatype_columns(X, 'object') - if not object_columns: - return [] - if isinstance(X, pd.DataFrame): - X_nunique = X[object_columns].nunique() - else: - X_nunique = X[object_columns].nunique().to_pandas() - X_nunique = X[object_columns].nunique(approx=True).to_pandas() - mask_columns = X_nunique < min_categories - columns_to_drop = mask_columns[mask_columns].index - return list(columns_to_drop.to_numpy()) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/keep_columns.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/keep_columns.py deleted file mode 100644 index 25d79860..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/keep_columns.py +++ /dev/null @@ -1,102 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from ._base_data_cleaning import _BaseDataCleaning -from typing import Union -import pandas as pd -import databricks.koalas as ks - - -class KeepColumns(_BaseDataCleaning): - """Drop the columns which are not given by the user. - - Parameters - ---------- - columns_to_keep : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.data_cleaning import KeepColumns - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import KeepColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import KeepColumns - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import KeepColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]]) - - """ - - def __init__(self, columns_to_keep): - if not isinstance(columns_to_keep, list): - raise TypeError('`columns_to_keep` should be a list.') - _BaseDataCleaning.__init__(self) - self.columns_to_keep = columns_to_keep - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'KeepColumns': - """Fit the transformer on the dataframe X. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - KeepColumns: Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.exclude_columns( - columns=X.columns, - excluded_columns=self.columns_to_keep) - self.idx_columns_to_keep = util.exclude_idx_columns( - columns=X.columns, - excluded_columns=self.columns - ) - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/replace.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/replace.py deleted file mode 100644 index 70da546c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/replace.py +++ /dev/null @@ -1,160 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from ..transformers.transformer import Transformer -from typing import Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from data_cleaning import replace - - -class Replace(Transformer): - """Replace the categorical values by the ones given by the user. - - The transformer only accepts categorical columns. - - Parameters - ---------- - to_replace_dict: Dict[str, Dict[str, str]] - The dictionary keys are the columns and the dictionary values - are the `to_replace` dictionary. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.data_cleaning import Replace - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) - >>> obj.fit_transform(X) - A B C - 0 X Y 1 - 1 Z e 2 - 2 c f 3 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import Replace - >>> X = ks.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) - >>> obj.fit_transform(X) - A B C - 0 X Y 1 - 1 Z e 2 - 2 c f 3 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import Replace - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['X', 'Y', 1], - ['Z', 'e', 2], - ['c', 'f', 3]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import Replace - >>> X = ks.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['X', 'Y', 1], - ['Z', 'e', 2], - ['c', 'f', 3]], dtype=object) - - - """ - - def __init__(self, to_replace_dict: Dict[str, Dict[str, str]]): - if not isinstance(to_replace_dict, dict): - raise TypeError('`to_replace_dict` should be a dict.') - Transformer.__init__(self) - self.to_replace_dict = to_replace_dict - self.columns = list(to_replace_dict.keys()) - n_cols = len(self.columns) - n_rows = max([len(v) for v in self.to_replace_dict.values()]) - self.to_replace_np_keys = np.empty((n_cols, n_rows), object) - self.to_replace_np_vals = np.empty((n_cols, n_rows), object) - self.n_elements_vec = np.empty(n_cols, int) - for i, col in enumerate(self.to_replace_dict): - n_elements = len(self.to_replace_dict[col]) - self.n_elements_vec[i] = n_elements - self.to_replace_np_keys[i, :n_elements] = list( - self.to_replace_dict[col].keys())[:n_elements] - self.to_replace_np_vals[i, :n_elements] = list( - self.to_replace_dict[col].values())[:n_elements] - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y=None) -> 'Replace': - """Fit the transformer on the dataframe X. - - Get the list of column names to remove and the array of - indices to be kept. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - Replace: Instance of itself. - """ - self.check_dataframe(X) - self.check_nans(X, self.columns) - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - return self - - def transform(self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return X.replace(self.to_replace_dict) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return replace( - X, self.idx_columns, - self.to_replace_np_keys, - self.to_replace_np_vals, - self.n_elements_vec) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_columns.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_columns.py deleted file mode 100644 index 82d12413..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_columns.py +++ /dev/null @@ -1,54 +0,0 @@ -from gators.data_cleaning.drop_columns import DropColumns -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame({'A': [1, 2], 'B': [1., 2.], 'C': ['q', 'w']}) - obj = DropColumns(['A']).fit(X) - X_expected = pd.DataFrame({'B': [1., 2.], 'C': ['q', 'w']}) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({'A': [1, 2], 'B': [1., 2.], 'C': ['q', 'w']}) - obj = DropColumns(['A']).fit(X) - X_expected = pd.DataFrame({'B': [1., 2.], 'C': ['q', 'w']}) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(data): - with pytest.raises(TypeError): - _ = DropColumns(columns='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_datatype_columns.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_datatype_columns.py deleted file mode 100644 index 1bc41153..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_datatype_columns.py +++ /dev/null @@ -1,54 +0,0 @@ -from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns -import pytest -import pandas as pd -from pandas.testing import assert_frame_equal -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame({'A': [1, 2], 'B': [1., 2.], 'C': ['q', 'w']}) - obj = DropDatatypeColumns(dtype=float).fit(X) - X_expected = pd.DataFrame({'A': [1, 2], 'C': ['q', 'w']}) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({'A': [1, 2], 'B': [1., 2.], 'C': ['q', 'w']}) - obj = DropDatatypeColumns(dtype=float).fit(X) - X_expected = pd.DataFrame({'A': [1, 2], 'C': ['q', 'w']}) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(): - with pytest.raises(TypeError): - _ = DropDatatypeColumns(dtype='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_cardinality.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_cardinality.py deleted file mode 100644 index 5d75df5a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_cardinality.py +++ /dev/null @@ -1,162 +0,0 @@ -from gators.data_cleaning.drop_high_cardinality import DropHighCardinality -import pytest -import pandas as pd -from pandas.testing import assert_frame_equal -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': list('qwe'), 'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - X_expected = pd.DataFrame( - {'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': list('qwe'), 'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - X_expected = pd.DataFrame( - {'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop(): - X = pd.DataFrame( - {'A': list('qww'), 'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - X_expected = X.copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop_ks(): - X = ks.DataFrame( - {'A': list('qww'), 'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - X_expected = X.to_pandas().copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object(): - X = pd.DataFrame({ - 'A': [0, 1, 2], - 'B': [3, 4, 5], - 'C': [6, 7, 8] - }) - X_expected = X.copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object_ks(): - X = ks.DataFrame({ - 'A': [0, 1, 2], - 'B': [3, 4, 5], - 'C': [6, 7, 8] - }) - X_expected = X.to_pandas().copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_drop_pd(data_no_drop): - obj, X, X_expected = data_no_drop - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_drop_ks(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_drop_pd_np(data_no_drop): - obj, X, X_expected = data_no_drop - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_drop_ks_np(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_object_pd(data_no_object): - obj, X, X_expected = data_no_object - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_object_pd_np(data_no_object): - obj, X, X_expected = data_no_object - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks_np(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_object_columns_empty(data_no_drop): - X = pd.DataFrame({'A': [1, 2, 3]}) - X_new = DropHighCardinality(max_categories=2).fit_transform(X.copy()) - assert_frame_equal(X_new, X) - - -def test_init(): - with pytest.raises(TypeError): - _ = DropHighCardinality(max_categories='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_nan_ratio.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_nan_ratio.py deleted file mode 100644 index a1871b50..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_high_nan_ratio.py +++ /dev/null @@ -1,107 +0,0 @@ -from gators.data_cleaning.drop_high_nan_ratio import DropHighNaNRatio -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': [np.nan, np.nan, np.nan], 'B': [ - np.nan, 0., 1.], 'C': ['a', 'a', 'b']},) - X_expected = pd.DataFrame( - {'B': [np.nan, 0., 1.], 'C': ['a', 'a', 'b']},) - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -@pytest.fixture -def data_no_drop(): - X = pd.DataFrame( - {'A': list('qww'), 'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - X_expected = X.copy() - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': [np.nan, np.nan, np.nan], 'B': [ - np.nan, 0., 1.], 'C': ['a', 'a', 'b']},) - X_expected = pd.DataFrame( - {'B': [np.nan, 0., 1.], 'C': ['a', 'a', 'b']},) - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -@pytest.fixture -def data_no_drop_ks(): - X = ks.DataFrame( - {'A': list('qww'), 'B': list('ass'), 'C': list('zxx'), 'D': [0, 1, 2]}) - X_expected = X.to_pandas().copy() - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -def test_pd(data): - obj, obj, X, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, obj, X, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, obj, X, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, obj, X, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_drop_pd(data_no_drop): - obj, obj, X, X, X_expected = data_no_drop - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_drop_ks(data_no_drop_ks): - obj, obj, X, X, X_expected = data_no_drop_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_drop_pd_np(data_no_drop): - obj, obj, X, X, X_expected = data_no_drop - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_drop_ks_np(data_no_drop_ks): - obj, obj, X, X, X_expected = data_no_drop_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = DropHighNaNRatio(max_ratio='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_low_cardinality.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_low_cardinality.py deleted file mode 100644 index bbc1a100..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_drop_low_cardinality.py +++ /dev/null @@ -1,177 +0,0 @@ -from gators.data_cleaning.drop_low_cardinality import DropLowCardinality -import pytest -import pandas as pd -from pandas.testing import assert_frame_equal -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': list('abc'), - 'B': list('abb'), - 'C': list('ccc')}) - X_expected = pd.DataFrame({ - 'A': list('abc'), - 'B': list('abb')}) - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop(): - X = pd.DataFrame({ - 'A': list('abc'), - 'B': list('abb'), - 'C': list('ccd')}) - X_expected = X.copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object(): - X = pd.DataFrame({ - 'A': [0., 1., 2.], - 'B': [3., 4., 5.], - 'C': [6., 7., 8.] - }, dtype=float) - X_expected = X.copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': list('abc'), - 'B': list('abb'), - 'C': list('ccc')}) - X_expected = pd.DataFrame({ - 'A': list('abc'), - 'B': list('abb')}) - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop_ks(): - X = ks.DataFrame({ - 'A': list('abc'), - 'B': list('abb'), - 'C': list('ccd')}) - X_expected = X.to_pandas().copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object_ks(): - X = ks.DataFrame({ - 'A': [0., 1., 2.], - 'B': [3., 4., 5.], - 'C': [6., 7., 8.] - }, dtype=float) - X_expected = X.to_pandas().copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_drop_pd(data_no_drop): - obj, X, X_expected = data_no_drop - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_drop_ks(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_drop_pd_np(data_no_drop): - obj, X, X_expected = data_no_drop - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_drop_ks_np(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_object_pd(data_no_object): - obj, X, X_expected = data_no_object - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_object_pd_np(data_no_object): - obj, X, X_expected = data_no_object - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks_np(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_drop_high_cardinality_init(): - with pytest.raises(TypeError): - _ = DropLowCardinality(min_categories='q') - - -def test_no_obj(): - X = pd.DataFrame({ - 'A': [0, 1, 2], - 'B': [3, 4, 5], - 'C': [6, 7, 8]}) - assert_frame_equal( - X, - DropLowCardinality(min_categories=2).fit_transform(X) - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_keep_columns.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_keep_columns.py deleted file mode 100644 index 62a3629b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_keep_columns.py +++ /dev/null @@ -1,54 +0,0 @@ -from gators.data_cleaning.keep_columns import KeepColumns -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame({'A': [1, 2], 'B': [1., 2.], 'C': ['q', 'w']}) - obj = KeepColumns(['B', 'C']).fit(X) - X_expected = pd.DataFrame({'B': [1., 2.], 'C': ['q', 'w']}) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({'A': [1, 2], 'B': [1., 2.], 'C': ['q', 'w']}) - obj = KeepColumns(['B', 'C']).fit(X) - X_expected = pd.DataFrame({'B': [1., 2.], 'C': ['q', 'w']}) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(data): - with pytest.raises(TypeError): - _ = KeepColumns(columns_to_keep='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_replace.py b/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_replace.py deleted file mode 100644 index 64136838..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/data_cleaning/tests/test_replace.py +++ /dev/null @@ -1,72 +0,0 @@ -from gators.data_cleaning.replace import Replace -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': list('abcd'), - 'B': list('abcd'), - 'C': [0, 1, 2, 3], - }) - X_expected = pd.DataFrame({ - 'A': {0: 'W', 1: 'X', 2: 'c', 3: 'd'}, - 'B': {0: 'a', 1: 'b', 2: 'Y', 3: 'Z'}, - 'C': {0: 0, 1: 1, 2: 2, 3: 3} - }) - to_replace_dict = {'A': {'a': 'W', 'b': 'X'}, 'B': {'c': 'Y', 'd': 'Z'}} - obj = Replace(to_replace_dict=to_replace_dict).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': list('abcd'), - 'B': list('abcd'), - 'C': [0, 1, 2, 3], - }) - X_expected = pd.DataFrame({ - 'A': {0: 'W', 1: 'X', 2: 'c', 3: 'd'}, - 'B': {0: 'a', 1: 'b', 2: 'Y', 3: 'Z'}, - 'C': {0: 0, 1: 1, 2: 2, 3: 3} - }) - to_replace_dict = {'A': {'a': 'W', 'b': 'X'}, 'B': {'c': 'Y', 'd': 'Z'}} - obj = Replace(to_replace_dict=to_replace_dict).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(data): - with pytest.raises(TypeError): - _ = Replace(to_replace_dict='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/__init__.py deleted file mode 100644 index aed936bd..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from ._base_encoder import _BaseEncoder -from .ordinal_encoder import OrdinalEncoder -from .onehot_encoder import OneHotEncoder -from .woe_encoder import WOEEncoder -from .target_encoder import TargetEncoder -from .multiclass_encoder import MultiClassEncoder -from.regression_encoder import RegressionEncoder - -__all__ = [ - '_BaseEncoder', - 'OrdinalEncoder', - 'OneHotEncoder', - 'WOEEncoder', - 'TargetEncoder', - 'MultiClassEncoder', - 'RegressionEncoder' -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/_base_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/_base_encoder.py deleted file mode 100644 index 8c3efe0f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/_base_encoder.py +++ /dev/null @@ -1,102 +0,0 @@ -# License: Apache-2.0 -from encoder import encoder -from ..transformers.transformer import Transformer -from typing import List, Tuple, Union, Dict, Collection, Any -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..transformers.transformer import NUMERICS_DTYPES -from ..transformers.transformer import PRINT_NUMERICS_DTYPES - - -class _BaseEncoder(Transformer): - """Base encoder transformer class. - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - """ - - def __init__(self, dtype=np.float64): - if dtype not in NUMERICS_DTYPES: - raise TypeError( - f'`dtype` should be a dtype from {PRINT_NUMERICS_DTYPES}.') - Transformer.__init__(self) - self.dtype = dtype - self.columns = [] - self.idx_columns: np.ndarray = np.array([]) - self.num_categories_vec = np.array([]) - self.values_vec = np.array([]) - self.encoded_values_vec = np.array([]) - self.mapping: Dict[str, Dict[str, float]] = {} - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return X.replace(self.mapping).astype(self.dtype) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the input array. - - Parameters - ---------- - X : np.ndarray - Input array. - Returns - ------- - np.ndarray: Encoded array. - """ - self.check_array(X) - if len(self.idx_columns) == 0: - return X.astype(self.dtype) - return encoder( - X, - self.num_categories_vec, - self.values_vec, - self.encoded_values_vec, - self.idx_columns, - ).astype(self.dtype) - - @ staticmethod - def decompose_mapping( - mapping: List[Dict[str, Collection[Any]]], - ) -> Tuple[List[str], np.ndarray, np.ndarray]: - """Decompose the mapping. - - Parameters - ---------- - mapping List[Dict[str, Collection[Any]]]: - Mapping obtained from the categorical encoder package. - Returns - ------- - Tuple[List[str], np.ndarray, np.ndarray] - Decomposed mapping. - """ - columns = list(mapping.keys()) - n_columns = len(columns) - max_categories = max([len(m) for m in mapping.values()]) - encoded_values_vec = np.zeros((n_columns, max_categories)) - values_vec = np.zeros( - (n_columns, max_categories), dtype=object - ) - for i, c in enumerate(columns): - mapping_col = mapping[c] - n_values = len(mapping_col) - encoded_values_vec[i, :n_values] = np.array( - list(mapping_col.values())) - values_vec[i, :n_values] = np.array( - list(mapping_col.keys())) - return columns, values_vec, encoded_values_vec diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/encoder.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/encoder.pyx deleted file mode 100644 index d0090f8a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/encoder.pyx +++ /dev/null @@ -1,49 +0,0 @@ -# License: Apache-2.0 -cimport cython -cimport numpy as np -import numpy as np - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] encoder( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] num_categories_vec, - np.ndarray[object, ndim=2] values_vec, - np.ndarray[np.float64_t, ndim=2] encoded_values_vec, - np.ndarray[np.int64_t, ndim=1] idx_columns): - cdef np.int64_t i - cdef np.int64_t j - cdef np.int64_t k - cdef np.int64_t j_max - cdef object value - cdef np.int64_t n_rows = X.shape[0] - cdef np.int64_t n_object_columns = idx_columns.shape[0] - for k in range(n_rows): - for i in range(n_object_columns): - value = X[k, idx_columns[i]] - j_max = num_categories_vec[i] - for j in range(j_max): - if value == values_vec[i, j]: - X[k, idx_columns[i]] = encoded_values_vec[i, j] - break - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] onehot_encoder( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[object, ndim=1] cats, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray X_new = np.empty( - (n_rows, n_cols), dtype=object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns[j]] == cats[j] - return np.concatenate((X, X_new.astype(np.float64)), axis=1) \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/multiclass_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/multiclass_encoder.py deleted file mode 100644 index dfcf7f3e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/multiclass_encoder.py +++ /dev/null @@ -1,239 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import warnings -import copy -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ._base_encoder import _BaseEncoder -from ..util import util -from ..data_cleaning.drop_columns import DropColumns -from ..transformers.transformer import Transformer - - -class MultiClassEncoder(_BaseEncoder): - """Encode the categorical columns with a binary encoder passed by the user. - *N* categorical columns are mapped into *N * (n - 1)* numerical columns - where *n* is the number of classes. - - Parameters - ---------- - encoder : Transformer - Binary Encoder. - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - """ - - def __init__(self, encoder: Transformer, dtype: type = np.float64): - if not isinstance(encoder, Transformer): - raise TypeError('`encoder` should be a transformer.') - _BaseEncoder.__init__(self, dtype=dtype) - self.encoder = encoder - self.drop_columns = None - self.label_names = [] - self.encoder_dict = {} - self.columns = [] - self.idx_columns = np.ndarray([]) - self.column_names = [] - self.column_mapping = {} - self.name = type(encoder).__name__ - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]) -> 'MultiClassEncoder': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - MultiClassEncoder - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_multiclass_target(y) - self.columns = util.get_datatype_columns(X, object) - self.check_nans(X, self.columns) - self.drop_columns = DropColumns(self.columns).fit(X) - if not self.columns: - warnings.warn( - f'''`X` does not contain object columns: - `{self.__class__.__name__}` is not needed''') - return self - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns, - ) - y_name = y.name - if isinstance(X, pd.DataFrame): - y_one_hot = pd.get_dummies(y, prefix=y_name) - else: - y_one_hot = ks.get_dummies(y, prefix=y_name) - y_one_hot = y_one_hot.drop(y_one_hot.columns[0], axis=1) - self.label_names = y_one_hot.columns - for label_name in self.label_names: - self.encoder_dict[label_name] = copy.copy(self.encoder) - self.encoder_dict[label_name].fit( - X[self.columns], y_one_hot[label_name]) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if not self.columns: - self.idx_columns = np.array([]) - return X - for i, label_name in enumerate(self.label_names): - dummy = self.encoder_dict[label_name].transform( - X[self.columns].copy())[self.encoder_dict[label_name].columns] - column_names = [ - f'{col}__{label_name}_{self.name}' for col in dummy.columns] - dummy.columns = column_names - self.column_names.extend(column_names) - for name, col in zip(column_names, self.columns): - self.column_mapping[name] = col - X = X.join(dummy, how='inner').sort_index() - return self.drop_columns.transform(X).astype(self.dtype) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - if not self.columns: - return X - X_encoded_list = [] - for i, label_name in enumerate(self.label_names): - dummy = self.encoder_dict[label_name].transform_numpy( - X[:, self.idx_columns].copy()) - X_encoded_list.append(dummy) - X_new = np.concatenate( - [self.drop_columns.transform_numpy(X)] + X_encoded_list, axis=1) - return X_new.astype(self.dtype) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/onehot_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/onehot_encoder.py deleted file mode 100644 index e7bd7c42..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/onehot_encoder.py +++ /dev/null @@ -1,204 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import warnings -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..util import util -from ._base_encoder import _BaseEncoder -from . import OrdinalEncoder -from encoder import onehot_encoder - - -class OneHotEncoder(_BaseEncoder): - """Encode the categorical columns as one-hot numeric columns. - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.encoders import OneHotEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> obj.fit_transform(X) - A__b A__a B__d B__c - 0 0.0 1.0 0.0 1.0 - 1 0.0 1.0 1.0 0.0 - 2 1.0 0.0 1.0 0.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.encoders import OneHotEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> obj.fit_transform(X) - A__b A__a B__d B__c - 0 0.0 1.0 0.0 1.0 - 1 0.0 1.0 1.0 0.0 - 2 1.0 0.0 1.0 0.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import OneHotEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0., 1., 0., 1.], - [0., 1., 1., 0.], - [1., 0., 1., 0.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.encoders import OneHotEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0., 1., 0., 1.], - [0., 1., 1., 0.], - [1., 0., 1., 0.]]) - """ - - def __init__(self, dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) - self.ordinal_encoder = OrdinalEncoder( - dtype=dtype, add_other_columns=False) - self.idx_numerical_columns = np.array([]) - self.onehot_columns = [] - self.numerical_columns = [] - self.column_mapping = {} - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'OneHotEncoder': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - OneHotEncoder: Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - f'''`X` does not contain object columns: - `{self.__class__.__name__}` is not needed''') - return self - self.check_nans(X, self.columns) - self.numerical_columns = util.exclude_columns( - X.columns, self.columns) - _ = self.ordinal_encoder.fit(X) - self.onehot_columns = [] - for key, val in self.ordinal_encoder.mapping.items(): - self.onehot_columns.extend( - [f'{key}__{self.dtype(c)}' - for c in sorted(val.values(), key=int)]) - for key, val in self.ordinal_encoder.mapping.items(): - for k, v in val.items(): - self.column_mapping[f'{key}__{self.dtype(v)}'] = \ - f'{key}__{k}' - self.all_columns = self.numerical_columns + self.onehot_columns - self.idx_numerical_columns = util.get_idx_columns( - X.columns, self.numerical_columns) - self.idx_columns = np.arange( - len(self.numerical_columns), - len(self.numerical_columns)+len(self.onehot_columns), - dtype=int) - self.idx_columns = np.arange( - len(self.numerical_columns), - len(self.onehot_columns), - dtype=int) - self.n_categories_vec = np.empty( - len(self.ordinal_encoder.columns), int) - for i, c in enumerate(self.columns): - self.n_categories_vec[i] = \ - len(self.ordinal_encoder.mapping[c]) - - self.columns_flatten = np.array([ - col - for col, mapping in self.ordinal_encoder.mapping.items() - for v in range(len(mapping))]) - self.idx_columns = util.get_idx_columns(X, self.columns_flatten) - self.idx_columns_to_keep = [ - i for i in range(X.shape[1] + self.idx_columns.shape[0]) - if i not in util.get_idx_columns(X, self.columns)] - self.cats = np.array([ - v - for col, mapping in self.ordinal_encoder.mapping.items() - for v in dict( - sorted(mapping.items(), key=lambda item: item[1])).keys() - ]).astype(object) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame], - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if not self.columns: - return X - dummy = X[self.columns].copy() - X_new = self.ordinal_encoder.transform(X) - X[self.columns] = dummy - if isinstance(X, pd.DataFrame): - X_new = pd.get_dummies( - X_new, - prefix_sep='__', - columns=self.columns) - else: - X_new = ks.get_dummies( - X_new, - prefix_sep='__', - columns=self.columns) - X_new = X_new.reindex(columns=self.all_columns, fill_value=0.) - return X_new.rename(columns=self.column_mapping).astype(self.dtype) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the input array. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: Encoded array. - """ - self.check_array(X) - if len(self.idx_columns) == 0: - return X - return onehot_encoder( - X, - self.idx_columns, - self.cats - )[:, self.idx_columns_to_keep].astype(self.dtype) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/ordinal_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/ordinal_encoder.py deleted file mode 100644 index 423c5497..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/ordinal_encoder.py +++ /dev/null @@ -1,159 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union, Dict -import warnings -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..util import util -from ._base_encoder import _BaseEncoder - - -class OrdinalEncoder(_BaseEncoder): - """Encode the categorical columns as integer columns. - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - add_other_columns: bool, default to True. - If True, add the columns 'OTHERS' and 'MISSING' - to the mapping even if the categories are not - present in the data. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.encoders import OrdinalEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> obj.fit_transform(X) - A B - 0 1.0 1.0 - 1 1.0 0.0 - 2 0.0 0.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.encoders import OrdinalEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> obj.fit_transform(X) - A B - 0 1.0 1.0 - 1 1.0 0.0 - 2 0.0 0.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import OrdinalEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [1., 0.], - [0., 0.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.encoders import OrdinalEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [1., 0.], - [0., 0.]]) - """ - - def __init__(self, dtype: type = np.float64, - add_other_columns: bool = True): - _BaseEncoder.__init__(self, dtype=dtype) - if not isinstance(add_other_columns, bool): - raise TypeError('`add_other_columns` shouldbe a bool.') - self.add_other_columns = add_other_columns - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'OrdinalEncoder': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - OrdinalEncoder: Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.get_datatype_columns(X, object) - self.check_nans(X, self.columns) - if not self.columns: - warnings.warn( - f'''`X` does not contain object columns: - `{self.__class__.__name__}` is not needed''') - return self - self.mapping = self.generate_mapping( - X, self.columns, self.add_other_columns) - self.num_categories_vec = np.array( - [len(m) for m in self.mapping.values()] - ) - columns, self.values_vec, self.encoded_values_vec = \ - self.decompose_mapping( - mapping=self.mapping, - ) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=columns - ) - return self - - @staticmethod - def generate_mapping( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - add_other_columns: bool) -> Dict[str, Dict[str, float]]: - """Generate the mapping to perform the encoding. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - self.columns : List[str] - List of columns. - add_other_columns: bool - If True, add the columns 'OTHERS' and 'MISSING' - to the mapping even if the categories are not - present in the data. - - Returns - ------- - Dict[str, Dict[str, float]] - Mapping. - """ - mapping = {} - for c in columns: - categories = X[c].value_counts().to_dict() - n_categories = len(categories) - category_names = list(categories.keys()) - category_names = sorted(category_names) - category_mapping = dict(zip( - category_names, - np.arange(n_categories-1, -1, -1).astype(str) - )) - if add_other_columns and 'MISSING' not in category_mapping: - category_mapping['MISSING'] = str(len(category_mapping)) - if add_other_columns and 'OTHERS' not in category_mapping: - category_mapping['OTHERS'] = str(len(category_mapping)) - mapping[c] = category_mapping - - return mapping diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/regression_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/regression_encoder.py deleted file mode 100644 index 15533b21..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/regression_encoder.py +++ /dev/null @@ -1,207 +0,0 @@ -# License: Apache-2.0 -import numpy as np -from typing import Union -import pandas as pd -import databricks.koalas as ks -from .multiclass_encoder import MultiClassEncoder -from ._base_encoder import _BaseEncoder -from ..transformers import Transformer - - -class RegressionEncoder(_BaseEncoder): - """Encode the categorical columns with a binary encoder given by the user. - - The encoding is composed in 2 steps: - - * bin the target values using the discretizer passed as argument. - * apply the `MultiClassEncoder` on the discretized target values. - - Parameters - ---------- - encoder : Transformer. - Encoder. - discretizer: Transformer. - Discretizer. - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - """ - - def __init__(self, encoder: Transformer, discretizer: Transformer, - dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) - if not isinstance(discretizer, Transformer): - raise TypeError( - '`discretizer` should inherit from _BaseDiscretizer.') - if not isinstance(encoder, Transformer): - raise TypeError('`encoder` should be a transformer.') - - self.discretizer = discretizer - self.multiclass_encoder = MultiClassEncoder( - encoder=encoder, dtype=dtype) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]) -> 'RegressionEncoder': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - RegressionEncoder - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_regression_target(y) - y_binned = self.discretizer.fit_transform(y.to_frame()) - self.multiclass_encoder.fit( - X, y_binned[y.name].astype(float).astype(int)) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - return self.multiclass_encoder.transform(X) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - return self.multiclass_encoder.transform_numpy(X) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/target_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/target_encoder.py deleted file mode 100644 index 4234a8b1..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/target_encoder.py +++ /dev/null @@ -1,167 +0,0 @@ -# License: Apache-2. -from typing import List, Union, Dict -import warnings -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ._base_encoder import _BaseEncoder -from ..util import util - - -def clean_mapping(mapping: Dict[str, Dict[str, List[float]]] - ) -> Dict[str, Dict[str, List[float]]]: - mapping = { - col: {k: v for k, v in mapping[col].items() if v == v} - for col in mapping.keys() - } - for m in mapping.values(): - if 'OTHERS' not in m: - m['OTHERS'] = 0. - if 'MISSING' not in m: - m['MISSING'] = 0. - return mapping - - -class TargetEncoder(_BaseEncoder): - """Encode the categorical variable using the target encoding technique. - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.encoders import TargetEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> obj.fit_transform(X, y) - A B - 0 1.0 1.0 - 1 1.0 0.5 - 2 0.0 0.5 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.encoders import TargetEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> obj.fit_transform(X, y) - A B - 0 1.0 1.0 - 1 1.0 0.5 - 2 0.0 0.5 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import TargetEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. ], - [1. , 0.5], - [0. , 0.5]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.encoders import TargetEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. ], - [1. , 0.5], - [0. , 0.5]]) - """ - - def __init__(self, dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]) -> 'TargetEncoder': - """Fit the encoder. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]: - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - TargetEncoder: - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_binary_target(y) - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - f'''`X` does not contain object columns: - `{self.__class__.__name__}` is not needed''') - return self - self.check_nans(X, self.columns) - self.mapping = self.generate_mapping( - X[self.columns], y) - self.num_categories_vec = np.array( - [len(m) for m in self.mapping.values()] - ) - columns, self.values_vec, self.encoded_values_vec = \ - self.decompose_mapping(mapping=self.mapping) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=columns - ) - return self - - @staticmethod - def generate_mapping( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - - ) -> Dict[str, Dict[str, float]]: - """Generate the mapping to perform the encoding. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series]: - Labels. - - Returns - ------- - Dict[str, Dict[str, float]] - Mapping. - """ - y_name = y.name - if isinstance(X, pd.DataFrame): - def f(x) -> ks.Series[np.float64]: - return pd.DataFrame(x).join(y).groupby(x.name).mean()[y_name] - - mapping = X.apply(f).to_dict() - return clean_mapping(mapping) - - mapping_list = [] - for name in X.columns: - dummy = ks.DataFrame(X[name]).join(y).groupby( - name).mean()[y_name].to_pandas() - dummy.name = name - mapping_list.append(dummy) - - mapping = pd.concat(mapping_list, axis=1).to_dict() - return clean_mapping(mapping) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_base_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_base_encoder.py deleted file mode 100644 index 66e6890d..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_base_encoder.py +++ /dev/null @@ -1,8 +0,0 @@ -# License: Apache-2.0 -from gators.encoders import WOEEncoder -import pytest - - -def test_init(): - with pytest.raises(TypeError): - WOEEncoder(dtype=str) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_muticlass_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_muticlass_encoder.py deleted file mode 100644 index 341ff278..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_muticlass_encoder.py +++ /dev/null @@ -1,346 +0,0 @@ -# License: Apache-2.0 -from gators.encoders import WOEEncoder -from gators.encoders import MultiClassEncoder -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') - obj = MultiClassEncoder( - WOEEncoder()).fit(X, y) - X_expected = pd.DataFrame( - {'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') - obj = MultiClassEncoder( - WOEEncoder(), dtype=np.float32).fit(X, y) - X_expected = pd.DataFrame( - {'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((3, 6)), - columns=list('qweasd'), - ) - y = pd.Series([1, 2, 0], name='TARGET') - obj = MultiClassEncoder( - WOEEncoder()).fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') - obj = MultiClassEncoder( - WOEEncoder()).fit(X, y) - X_expected = pd.DataFrame( - {'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') - obj = MultiClassEncoder( - WOEEncoder(), dtype=np.float32).fit(X, y) - X_expected = pd.DataFrame( - {'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': - {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': - {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': - {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((3, 6)), - columns=list('qweasd'), - ) - y = ks.Series([1, 2, 0], name='TARGET') - obj = MultiClassEncoder( - WOEEncoder()).fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_without_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_without_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = MultiClassEncoder(encoder='q') - with pytest.raises(TypeError): - _ = MultiClassEncoder(encoder='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_onehot_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_onehot_encoder.py deleted file mode 100644 index d5916d9b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_onehot_encoder.py +++ /dev/null @@ -1,194 +0,0 @@ -# License: Apache-2.0 -from gators.encoders.onehot_encoder import OneHotEncoder -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - {'D': {0: 1.0, 1: 2.0, 2: 3.0}, - 'A__W': {0: 0.0, 1: 0.0, 2: 1.0}, - 'A__Q': {0: 1.0, 1: 1.0, 2: 0.0}, - 'B__W': {0: 0.0, 1: 1.0, 2: 1.0}, - 'B__Q': {0: 1.0, 1: 0.0, 2: 0.0}, - 'C__W': {0: 1.0, 1: 0.0, 2: 1.0}, - 'C__Q': {0: 0.0, 1: 1.0, 2: 0.0}}) - obj = OneHotEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - {'D': {0: 1, 1: 2, 2: 3}, - 'A__W': {0: 0, 1: 0, 2: 1}, - 'A__Q': {0: 1, 1: 1, 2: 0}, - 'B__W': {0: 0, 1: 1, 2: 1}, - 'B__Q': {0: 1, 1: 0, 2: 0}, - 'C__W': {0: 1, 1: 0, 2: 1}, - 'C__Q': {0: 0, 1: 1, 2: 0}}).astype(np.int16) - obj = OneHotEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.arange(12).reshape(3, 4), - columns=list('ABCD'), dtype=float, - ) - obj = OneHotEncoder().fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - {'D': {0: 1.0, 1: 2.0, 2: 3.0}, - 'A__W': {0: 0.0, 1: 0.0, 2: 1.0}, - 'A__Q': {0: 1.0, 1: 1.0, 2: 0.0}, - 'B__W': {0: 0.0, 1: 1.0, 2: 1.0}, - 'B__Q': {0: 1.0, 1: 0.0, 2: 0.0}, - 'C__W': {0: 1.0, 1: 0.0, 2: 1.0}, - 'C__Q': {0: 0.0, 1: 1.0, 2: 0.0}}) - obj = OneHotEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - {'D': {0: 1, 1: 2, 2: 3}, - 'A__W': {0: 0, 1: 0, 2: 1}, - 'A__Q': {0: 1, 1: 1, 2: 0}, - 'B__W': {0: 0, 1: 1, 2: 1}, - 'B__Q': {0: 1, 1: 0, 2: 0}, - 'C__W': {0: 1, 1: 0, 2: 1}, - 'C__Q': {0: 0, 1: 1, 2: 0}}).astype(np.int16) - obj = OneHotEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.arange(12).reshape(3, 4), - columns=list('ABCD'), dtype=float, - ) - obj = OneHotEncoder().fit(X) - return obj, X, X.copy().to_pandas() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_without_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_without_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_ordinal_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_ordinal_encoder.py deleted file mode 100644 index 9f94fcde..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_ordinal_encoder.py +++ /dev/null @@ -1,203 +0,0 @@ -# License: Apache-2.0 -from gators.encoders import OrdinalEncoder -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], - [1.0, 0.0, 1.0, 2.0], - [0.0, 0.0, 0.0, 3.0]], - columns=list('ABCD'), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], - [1.0, 0.0, 1.0, 2.0], - [0.0, 0.0, 0.0, 3.0]], - columns=list('ABCD'), - ).astype(np.int16) - obj = OrdinalEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@ pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((3, 3)), - columns=list('ABC'), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], - [1.0, 0.0, 1.0, 2.0], - [0.0, 0.0, 0.0, 3.0]], - columns=list('ABCD'), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], - [1.0, 0.0, 1.0, 2.0], - [0.0, 0.0, 0.0, 3.0]], - columns=list('ABCD'), - ).astype(np.int16) - obj = OrdinalEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@ pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((3, 3)), - columns=list('ABC'), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X.copy().to_pandas() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@ pytest.fixture -def test_check_nans(): - X = pd.DataFrame({ - 'A': [None, 'Q', 'W'], - 'B': ['Q', 'W', 'W'], - 'C': ['W', 'Q', 'W'], - 'D': [1, 2, 3]}) - - with pytest.raises(ValueError): - _ = OrdinalEncoder().fit(X) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalEncoder(add_other_columns='yes') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_regression_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_regression_encoder.py deleted file mode 100644 index 017f9169..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_regression_encoder.py +++ /dev/null @@ -1,344 +0,0 @@ -# License: Apache-2.0 -from gators.encoders import WOEEncoder -from gators.binning import QuantileDiscretizer -from gators.encoders import RegressionEncoder -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - n_bins = 3 - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - X_expected = pd.DataFrame({ - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - n_bins = 3 - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True), - dtype=np.float32 - ).fit(X, y) - X_expected = pd.DataFrame({ - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - n_bins = 3 - X = pd.DataFrame( - np.zeros((3, 6)), - columns=list('qweasd'), - ) - y = pd.Series([1., 2., 0.], name='TARGET') - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - n_bins = 3 - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - X_expected = pd.DataFrame({ - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - n_bins = 3 - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6] - }) - y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True), - dtype=np.float32 - ).fit(X, y) - X_expected = pd.DataFrame({ - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - 'A__TARGET_1_WOEEncoder': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - 'B__TARGET_1_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_1_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'A__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906}, - 'B__TARGET_2_WOEEncoder': {0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453}, - 'C__TARGET_2_WOEEncoder': {0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453}} - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - n_bins = 3 - X = ks.DataFrame( - np.zeros((3, 6)), - columns=list('qweasd'), - ) - y = ks.Series([1., 2., 0.], name='TARGET') - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_without_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_without_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - discretizer = QuantileDiscretizer(n_bins=2) - with pytest.raises(TypeError): - _ = RegressionEncoder(encoder='q', discretizer=discretizer) - with pytest.raises(TypeError): - _ = RegressionEncoder(encoder=WOEEncoder(), discretizer='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_target_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_target_encoder.py deleted file mode 100644 index 4a362d7c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_target_encoder.py +++ /dev/null @@ -1,208 +0,0 @@ -# License: Apache-2.0 -from gators.encoders.target_encoder import TargetEncoder -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = pd.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666}, - 'B': {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - 'C': {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}}) - obj = TargetEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = pd.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666}, - 'B': {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - 'C': {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}}).astype(np.float32) - obj = TargetEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((6, 3)), - columns=list('ABC'), - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name='TARGET') - obj = TargetEncoder().fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = ks.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666}, - 'B': {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - 'C': {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}}) - obj = TargetEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = ks.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': {0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666}, - 'B': {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - 'C': {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - 'D': {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}}).astype(np.float32) - obj = TargetEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((6, 3)), - columns=list('ABC'), - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name='TARGET') - obj = TargetEncoder().fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_woe_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_woe_encoder.py deleted file mode 100644 index 2df74073..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/tests/test_woe_encoder.py +++ /dev/null @@ -1,188 +0,0 @@ -# License: Apache-2.0 -from gators.encoders.woe_encoder import WOEEncoder -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = pd.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - 'B': [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - 'C': [-0.40546511, -0.40546511, -0.40546511, -0.40546511, 0.69314718, 0.69314718], - 'D': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}) - obj = WOEEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = pd.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - 'B': [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - 'C': [-0.40546511, -0.40546511, -0.40546511, -0.40546511, 0.69314718, 0.69314718], - 'D': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}).astype(np.float32) - obj = WOEEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((6, 3)), - columns=list('ABC'), - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name='TARGET') - obj = WOEEncoder().fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = ks.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - 'B': [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - 'C': [-0.40546511, -0.40546511, -0.40546511, -0.40546511, 0.69314718, 0.69314718], - 'D': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}) - obj = WOEEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame({ - 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - 'D': [1, 2, 3, 4, 5, 6]}) - y = ks.Series([0, 0, 0, 1, 1, 0], name='TARGET') - X_expected = pd.DataFrame({ - 'A': [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - 'B': [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - 'C': [-0.40546511, -0.40546511, -0.40546511, -0.40546511, 0.69314718, 0.69314718], - 'D': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}).astype(np.float32) - obj = WOEEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((6, 3)), - columns=list('ABC'), - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name='TARGET') - obj = WOEEncoder().fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/woe_encoder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/woe_encoder.py deleted file mode 100644 index 3c7e7086..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/encoders/woe_encoder.py +++ /dev/null @@ -1,172 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union, Dict -import warnings -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ._base_encoder import _BaseEncoder -from ..util import util - - -def clean_mapping(mapping: Dict[str, Dict[str, List[float]]] - ) -> Dict[str, Dict[str, List[float]]]: - mapping = { - col: {k: v for k, v in mapping[col].items() if v == v} - for col in mapping.keys() - } - for m in mapping.values(): - if 'OTHERS' not in m: - m['OTHERS'] = 0. - if 'MISSING' not in m: - m['MISSING'] = 0. - return mapping - - -class WOEEncoder(_BaseEncoder): - """Encode all categorical variable using the weight of evidence technique. - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> obj.fit_transform(X, y) - A B - 0 0.0 0.000000 - 1 0.0 -0.693147 - 2 0.0 -0.693147 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> obj.fit_transform(X, y) - A B - 0 0.0 0.000000 - 1 0.0 -0.693147 - 2 0.0 -0.693147 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0. , 0. ], - [ 0. , -0.69314718], - [ 0. , -0.69314718]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0. , 0. ], - [ 0. , -0.69314718], - [ 0. , -0.69314718]]) - """ - - def __init__(self, dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]) -> 'WOEEncoder': - """Fit the encoder. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]: - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - WOEEncoder: - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_binary_target(y) - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - f'''`X` does not contain object columns: - `{self.__class__.__name__}` is not needed''') - return self - self.check_binary_target(y) - self.check_nans(X, self.columns) - self.mapping = self.generate_mapping( - X[self.columns], y) - self.num_categories_vec = np.array( - [len(m) for m in self.mapping.values()] - ) - columns, self.values_vec, self.encoded_values_vec = \ - self.decompose_mapping(mapping=self.mapping) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=columns - ) - return self - - @staticmethod - def generate_mapping( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - - ) -> Dict[str, Dict[str, float]]: - """Generate the mapping to perform the encoding. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series]: - Labels. - - Returns - ------- - Dict[str, Dict[str, float]] - Mapping. - """ - mapping_list = [] - y_name = y.name - X = X.join(y) - for col in X.columns: - if isinstance(X, pd.DataFrame): - tab = X.groupby( - [col, y_name])[y_name].count().unstack( - ).fillna(0) - else: - tab = X.groupby( - [col, y_name])[y_name].count().unstack( - ).to_pandas().fillna(0) - tab /= tab.sum() - tab.columns = [int(c) for c in tab.columns] - with np.errstate(divide='ignore'): - woe = pd.Series(np.log(tab[1] / tab[0])) - woe[(woe == np.inf) | (woe == -np.inf)] = 0. - mapping_list.append(pd.Series(woe, name=col)) - mapping = pd.concat(mapping_list, axis=1).to_dict() - X = X.drop(y_name, axis=1) - return clean_mapping(mapping) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/__init__.py deleted file mode 100644 index 600118e0..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from ._base_feature_generation import _BaseFeatureGeneration -from .is_equal import IsEqual -from .is_null import IsNull -from .one_hot import OneHot -from .elementary_arithmethics import ElementaryArithmetics -from .cluster_statistics import ClusterStatistics -from .plane_rotation import PlaneRotation -from .polynomial_features import PolynomialFeatures - -__all__ = [ - '_BaseFeatureGeneration', - 'IsEqual', - 'IsNull', - 'OneHot', - 'ElementaryArithmetics', - 'ClusterStatistics', - 'PlaneRotation' - 'PolynomialFeatures' -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/_base_feature_generation.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/_base_feature_generation.py deleted file mode 100644 index 3620c947..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/_base_feature_generation.py +++ /dev/null @@ -1,34 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from ..transformers.transformer import Transformer -import numpy as np -from typing import List, Union -import pandas as pd -import databricks.koalas as ks - - -class _BaseFeatureGeneration(Transformer): - """Base feature generation transformer class. - - Parameters - ---------- - columns : List[str] - List of columns. - column_names : List[str], default to None. - List of generated columns. - patterns : List[str] - List of patterns. - column_mapping: Dict[str, List[str]] - Mapping between generated features and base features. - - """ - - def __init__(self, columns: List[str], - column_names: List[str], column_mapping: List[str], - dtype: type = None): - Transformer.__init__(self) - self.column_names = column_names - self.columns = columns - self.column_mapping = column_mapping - self.idx_columns: np.ndarray = np.array([]) - self.dtype = dtype diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/cluster_statistics.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/cluster_statistics.py deleted file mode 100644 index 92f2d88a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/cluster_statistics.py +++ /dev/null @@ -1,245 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union, Dict -import numpy as np -import pandas as pd -import databricks.koalas as ks -from feature_gen import cluster_statistics -from ._base_feature_generation import _BaseFeatureGeneration - - -class ClusterStatistics(_BaseFeatureGeneration): - """Create new columns based on statistics done at the row level. - - The data should be composed of numerical columns only. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `ClusterStatistics`. - - Parameters - ---------- - clusters_dict :Dict[str, List[str]] - Dictionary of clusters of features. - column_names : List[str], default to None. - List of new column names - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation import ClusterStatistics - >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) - >>> obj.fit_transform(X) - A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std - 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 - 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 - 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ClusterStatistics - >>> X = ks.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) - >>> obj.fit_transform(X) - A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std - 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 - 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 - 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import ClusterStatistics - >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[9. , 3. , 6. , 6. , 4.24264069, - 7.5 , 2.12132034], - [9. , 4. , 7. , 6.5 , 3.53553391, - 8. , 1.41421356], - [7. , 5. , 8. , 6. , 1.41421356, - 7.5 , 0.70710678]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ClusterStatistics - >>> X = ks.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[9. , 3. , 6. , 6. , 4.24264069, - 7.5 , 2.12132034], - [9. , 4. , 7. , 6.5 , 3.53553391, - 8. , 1.41421356], - [7. , 5. , 8. , 6. , 1.41421356, - 7.5 , 0.70710678]]) - """ - - def __init__(self, clusters_dict: Dict[str, List[str]], - column_names: List[str] = None, - dtype: type = np.float64): - if not isinstance(clusters_dict, dict): - raise TypeError('`clusters_dict` should be a dict.') - for key, val in clusters_dict.items(): - if not isinstance(val, list): - raise TypeError('`clusters_dict` values should be a list.') - if len(val) == 0: - raise ValueError( - '`clusters_dict` values should be a not empty list.') - cluster_length = [len(v) for v in clusters_dict.values()] - if min(cluster_length) != max(cluster_length): - raise ValueError( - '`clusters_dict` values should be lists with same length.') - if cluster_length[0] == 1: - raise ValueError( - '''`clusters_dict` values should be - lists with a length larger than 1.''') - if column_names is not None and not isinstance(column_names, list): - raise TypeError('`column_names` should be None or a list.') - if not column_names: - column_names = self.get_column_names(clusters_dict) - column_mapping = { - **{f'{key}__mean': val for ( - key, val) in clusters_dict.items()}, - **{f'{key}__std': val for (key, val) - in clusters_dict.items()} - } - else: - column_mapping = dict(zip(column_names, clusters_dict.values())) - columns = list( - set( - [c for s in list(clusters_dict.values()) for c in s] - ) - ) - if column_names and 2 * len(clusters_dict) != len(column_names): - raise ValueError( - '''Length of `column_names` should be - two times the length of `clusters_dict`.''') - self.check_datatype(dtype, [np.float32, np.float64]) - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=dtype) - self.clusters_dict = clusters_dict - self.n_clusters = len(self.clusters_dict) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'ClusterStatistics': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - ClusterStatistics - Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.idx_columns = self.get_idx_columns( - X, self.clusters_dict) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame], - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe with statistics cluster features. - """ - for i, cols in enumerate(self.clusters_dict.values()): - X = X.join(X[cols].mean(axis=1).rename( - self.column_names[2*i])) - X = X.join(X[cols].std(axis=1).rename( - self.column_names[2*i+1])) - if isinstance(X, ks.DataFrame): - return X.astype(self.dtype).sort_index() - return X.astype(self.dtype) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return cluster_statistics( - X.astype(self.dtype), self.idx_columns, self.dtype) - - @ staticmethod - def get_idx_columns( - X: Union[pd.DataFrame, ks.DataFrame], - clusters_dict: Dict[str, List[str]]) -> np.ndarray: - """Get the column indices of the clusters. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input data. - clusters_dict : Dict[str, List[str]] - Clusters. - - Returns - ------- - Dict[str, List[str]] - Column indices of the clusters. - """ - columns = list(X.columns) - n_columns = len(columns) - idx_columns = np.array([ - [i for i in range(n_columns) - if columns[i] in cluster_columns - ] - for cluster_columns in list(clusters_dict.values()) - ]) - return idx_columns - - @ staticmethod - def get_column_names( - clusters_dict: Dict[str, List[str]]) -> List[str]: - """Get statistics cluster column names. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - List[str] - List of columns. - """ - column_names = [] - for name in clusters_dict.keys(): - column_names.append(name + '__mean') - column_names.append(name + '__std') - return column_names diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/elementary_arithmethics.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/elementary_arithmethics.py deleted file mode 100644 index e1d1b0c1..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/elementary_arithmethics.py +++ /dev/null @@ -1,284 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from gators.feature_generation._base_feature_generation import ( - _BaseFeatureGeneration) -from feature_gen import elementary_arithmetics - -EPSILON = 1e-10 - - -class ElementaryArithmetics(_BaseFeatureGeneration): - """Create new columns based on elementary arithmetics. - - The data should be composed of numerical columns only. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `ElementaryArithmetics`. - - Parameters - ---------- - columns_a : List[str] - List of columns. - columns_b : List[str] - List of columns. - operator : str - Arithmetic perator. The possible values are: - - * '+' for addition - * '*' for multiplication - * '/' for division - - column_names : List[str], default to None. - List of new column names. - coef : float, default to 1. - Coefficient value for the addition. - - X[new] = X[column_a] + coef * X[column_b] - - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - --------- - * fit & transform with `pandas` - - - addition - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='+', coef=0.1) - >>> obj.fit_transform(X) - A B A__+__B - 0 1.0 1.0 1.1 - 1 1.0 2.0 1.2 - 2 1.0 3.0 1.3 - - - division - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> obj.fit_transform(X) - A B A__/__B - 0 1.0 1.0 1.000000 - 1 1.0 2.0 0.500000 - 2 1.0 3.0 0.333333 - - - multiplication & setting new column name - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1., 2., 3.], 'B': [1., 4., 9.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], - ... operator='*', column_names=['mult']) - >>> obj.fit_transform(X) - A B mult - 0 1.0 1.0 1.0 - 1 2.0 4.0 8.0 - 2 3.0 9.0 27.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> obj.fit_transform(X) - A B A__/__B - 0 1.0 1.0 1.000000 - 1 1.0 2.0 0.500000 - 2 1.0 3.0 0.333333 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. , 1. ], - [1. , 2. , 0.5 ], - [1. , 3. , 0.33333333]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. , 1. ], - [1. , 2. , 0.5 ], - [1. , 3. , 0.33333333]]) - - """ - - def __init__(self, columns_a: List[str], columns_b: List[str], - operator: str, column_names: List[str] = None, - coef: float = 1., dtype: type = np.float64): - if not isinstance(columns_a, list): - raise TypeError('`columns_a` should be a list.') - if not isinstance(columns_b, list): - raise TypeError('`columns_b` should be a list.') - if len(columns_a) == 0: - raise ValueError('`columns_a` should not be empty.') - if not isinstance(operator, str): - raise TypeError('`operator` should be a str.') - if not isinstance(coef, float): - raise TypeError('`coef` should be a float.') - if column_names and not isinstance(column_names, list): - raise TypeError('`column_names` should be a list.') - if len(columns_a) != len(columns_b): - raise ValueError( - 'Length of `columns_a` and `columns_a` should match.') - if operator not in ['+', '*', '/']: - raise ValueError( - '`operator` should be "+", "*", or "/".') - if not column_names: - str_operator = operator - if coef < 0: - str_operator = '-' - column_names = [ - f'{c_a}__{str_operator}__{c_b}' - for c_a, c_b in zip(columns_a, columns_b) - ] - column_mapping = { - f'{c_a}__{str_operator}__{c_b}': [c_a, c_b] - for c_a, c_b in zip(columns_a, columns_b) - } - else: - column_mapping = { - c: [c_a, c_b] - for c, c_a, c_b - in zip(column_names, columns_a, columns_b) - } - if len(column_names) != len(columns_a): - raise ValueError( - '''Length of `columns_a`, `columns_b`, - and `column_names` should match.''') - self.check_datatype(dtype, [np.float32, np.float64]) - columns = list(set(columns_a + columns_b)) - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=dtype) - self.columns = list(set(columns_a+columns_b)) - self.columns_a = columns_a - self.columns_b = columns_b - self.idx_columns_a: np.ndarray = np.array([]) - self.idx_columns_b: np.ndarray = np.array([]) - self.operator = operator - self.coef = coef - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'ElementaryArithmetics': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - ElementaryArithmetics - Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.idx_columns_a = self.get_idx_columns( - columns=X.columns, - selected_columns=self.columns_a - ) - self.idx_columns_b = self.get_idx_columns( - columns=X.columns, - selected_columns=self.columns_b - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - for c_a, c_b, c in zip( - self.columns_a, self.columns_b, self.column_names): - if self.operator == '+': - X[c] = X[c_a] + self.coef * X[c_b] - elif self.operator == '*': - X[c] = X[c_a] * X[c_b] - else: - X[c] = X[c_a] / (X[c_b] + EPSILON) - X[c] = X[c] - X = X.astype(self.dtype) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return elementary_arithmetics( - X.astype(self.dtype), self.idx_columns_a, self.idx_columns_b, - self.operator, self.coef, EPSILON, self.dtype - ) - - @staticmethod - def get_idx_columns( - columns: List[str], - selected_columns: List[str]) -> np.ndarray: - """Get the indices of the columns used for the combination. - - Parameters - ---------- - columns : List[str] - List of columns. - selected_columns : List[str] - List of columns. - - Returns: - np.ndarray - Array of indices. - """ - idx = [] - for selected_column in selected_columns: - for i, column in enumerate(columns): - if column == selected_column: - idx.append(i) - break - return np.array(idx) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/feature_gen.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/feature_gen.pyx deleted file mode 100644 index 3cf6fc78..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/feature_gen.pyx +++ /dev/null @@ -1,302 +0,0 @@ -import cython -import numpy as np -cimport numpy as np -from libc.math cimport pi -from libc.math cimport cos -from libc.math cimport sin -from libc.math cimport isnan -from libc.math cimport sqrt - - -ctypedef fused num_t: - np.int16_t - np.int32_t - np.int64_t - np.float32_t - np.float64_t - -ctypedef fused num_float_t: - np.float32_t - np.float64_t - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] one_hot( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[object, ndim=1] cats, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim = 2] X_new = np.empty( - (n_rows, n_cols), dtype=object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns[j]] == cats[j] - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_t, ndim = 2] is_null( - np.ndarray[num_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - object dtype -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), dtype) - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] - return np.concatenate((X, X_new), axis=1) - - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] is_null_object( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros( - (n_rows, n_cols)) - - for i in range(n_rows): - for j in range(n_cols): - if (X[i, idx_columns[j]] is None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): - X_new[i, j] = 1. - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_t, ndim = 2] is_equal( - np.ndarray[num_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_a, - np.ndarray[np.int64_t, ndim=1] idx_columns_b, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[num_t, ndim = 2] X_new = np.empty( - (n_rows, n_cols), dtype=X.dtype) - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] - return np.concatenate((X, X_new), axis=1) - - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] is_equal_object( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_a, - np.ndarray[np.int64_t, ndim=1] idx_columns_b, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( - (n_rows, n_cols)) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] - return np.concatenate((X, X_new), axis=1) - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] cluster_statistics( - np.ndarray[num_float_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=2] idx_columns, - object dtype -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef int n_elements = idx_columns.shape[1] - cdef np.ndarray[num_float_t, ndim = 2] X_new = np.zeros( - (n_rows, 2 * n_cols), dtype=dtype) - cdef num_float_t mean - cdef num_float_t std - cdef num_float_t denumerator = (n_elements - 1) - with nogil: - for i in range(n_rows): - for j in range(n_cols): - mean = 0 - std = 0 - for k in range(n_elements): - mean = mean + X[i, idx_columns[j, k]] - mean /= n_elements - for k in range(n_elements): - std += (X[i, idx_columns[j, k]] - mean) * \ - (X[i, idx_columns[j, k]] - mean) - X_new[i, 2 * j] = mean - X_new[i, 2 * j + 1] = sqrt(std) / denumerator - return np.concatenate((X, X_new), axis=1) - - - - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] cluster_statistics_object( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=2] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef int n_elements = idx_columns.shape[1] - cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) - cdef double mean - cdef double std - for i in range(n_rows): - for j in range(n_cols): - mean = 0. - std = 0. - for k in range(n_elements): - mean += X[i, idx_columns[j, k]] - mean /= n_elements - for k in range(n_elements): - std += (X[i, idx_columns[j, k]] - mean) * \ - (X[i, idx_columns[j, k]] - mean) - X_new[i, 2 * j] = mean - X_new[i, 2 * j + 1] = sqrt(std) / (n_elements - 1) - return np.concatenate((X, X_new), axis=1) - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] elementary_arithmetics( - np.ndarray[num_float_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_a, - np.ndarray[np.int64_t, ndim=1] idx_columns_b, - object operator, - float coef, - float EPSILON, - object dtype -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[num_float_t, ndim = 2] X_new = np.empty((n_rows, n_cols), dtype) - if operator == '+': - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] - elif operator == '*': - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] - else: - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) - return np.concatenate((X, X_new), axis=1) - - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] elementary_arithmetics_object( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_a, - np.ndarray[np.int64_t, ndim=1] idx_columns_b, - object operator, - float coef, - float EPSILON, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[np.float_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) - if operator == '+': - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] - elif operator == '*': - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] - else: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] / \ - (X[i, idx_columns_b[j]] + EPSILON) - return np.concatenate((X, X_new), axis=1) - - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_t, ndim = 2] plan_rotation( - np.ndarray[num_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_x, - np.ndarray[np.int64_t, ndim=1] idx_columns_y, - np.ndarray[np.float64_t, ndim=1] cos_vec, - np.ndarray[np.float64_t, ndim=1] sin_vec, -): - cdef int i - cdef int j - cdef int k - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_x.shape[0] - cdef int n_elements = cos_vec.shape[0] - cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( - (n_rows, 2 * n_cols * n_elements), np.float64) - with nogil: - for i in range(n_rows): - for j in range(n_cols): - for k in range(n_elements): - X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] - X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_t, ndim = 2] polynomial( - np.ndarray[num_t, ndim=2] X, - np.ndarray[np.int64_t, ndim=2] combinations_np, - int degree, - object dtype -): - cdef int n_rows = X.shape[0] - cdef int n_cols = combinations_np.shape[0] - cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols), dtype) - cdef int i = 0 - cdef int j = 0 - cdef int k = 0 - with nogil: - for i in range(n_rows): - for j in range(n_cols): - for k in range(degree): - if combinations_np[j, k] >= 0: - X_new[i, j] *= X[i, combinations_np[j, k]] - return np.concatenate((X, X_new), axis=1) - - - diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/is_equal.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/is_equal.py deleted file mode 100644 index de25dd91..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/is_equal.py +++ /dev/null @@ -1,192 +0,0 @@ -# License: Apache-2.0 -from feature_gen import is_equal_object -from feature_gen import is_equal -from ._base_feature_generation import _BaseFeatureGeneration -from ..util import util -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class IsEqual(_BaseFeatureGeneration): - """Create new columns based on value matching. - - Parameters - ---------- - columns_a : List[str] - List of columns. - columns_b : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation import IsEqual - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> obj.fit_transform(X) - A B A__is__B - 0 1 1 1 - 1 2 1 0 - 2 3 1 0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsEqual - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> obj.fit_transform(X) - A B A__is__B - 0 1 1 1 - 1 2 1 0 - 2 3 1 0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import IsEqual - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1, 1, 1], - [2, 1, 0], - [3, 1, 0]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsEqual - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1, 1, 1], - [2, 1, 0], - [3, 1, 0]]) - - """ - - def __init__(self, columns_a: List[str], columns_b: List[str], - column_names: List[str] = None): - if not isinstance(columns_a, list): - raise TypeError('`columns_a` should be a list.') - if not isinstance(columns_b, list): - raise TypeError('`columns_b` should be a list.') - if column_names is not None and not isinstance(column_names, list): - raise TypeError('`columns_a` should be a list.') - if len(columns_a) != len(columns_b): - raise ValueError( - 'Length of `columns_a` and `columns_b` should match.') - if len(columns_a) == 0: - raise ValueError( - '`columns_a` and `columns_b` should not be empty.') - if not column_names: - column_names = [ - f'{c_a}__is__{c_b}' - for c_a, c_b in zip(columns_a, columns_b) - ] - if len(columns_a) != len(column_names): - raise ValueError( - '''Length of `columns_a`, `columns_b` and `column_names` - should match.''') - column_mapping = { - name: [c_a, c_b] - for name, c_a, c_b - in zip(column_names, columns_a, columns_b) - } - columns = list(set(columns_a + columns_b)) - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=None) - self.columns_a = columns_a - self.columns_b = columns_b - self.idx_columns_a: List[int] = [] - self.idx_columns_b: List[int] = [] - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None): - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - IsEqual - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns_a = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns_a - ) - self.idx_columns_b = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns_b - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for a, b, name in zip( - self.columns_a, self.columns_b, self.column_names): - x_dtype = X[a].dtype - x_dtype = x_dtype if (x_dtype != object) and ( - x_dtype != bool) else np.float64 - X.loc[:, name] = (X[a] == X[b]).astype(x_dtype) - return X - - for a, b, name in zip( - self.columns_a, self.columns_b, self.column_names): - x_dtype = X[a].dtype - x_dtype = x_dtype if (x_dtype != object) and ( - x_dtype != bool) else np.float64 - X = X.assign( - dummy=(X[a] == X[b]).astype(x_dtype) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - if X.dtype == object: - return is_equal_object( - X, self.idx_columns_a, self.idx_columns_b) - return is_equal( - X, self.idx_columns_a, self.idx_columns_b) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/is_null.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/is_null.py deleted file mode 100644 index 3da08f66..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/is_null.py +++ /dev/null @@ -1,158 +0,0 @@ -# License: Apache-2.0 -from feature_gen import is_null_object -from feature_gen import is_null -from ._base_feature_generation import _BaseFeatureGeneration -from ..util import util -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class IsNull(_BaseFeatureGeneration): - """Create new columns based on missing values. - - Parameters - ---------- - columns : List[str] - List of columns. - dtype : type, default to np.float64 - Numpy dtype of the output columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation import IsNull - >>> X = pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) - >>> obj.fit_transform(X) - A B A__is_null B__is_null - 0 None NaN 1.0 1.0 - 1 a 1.0 0.0 0.0 - 2 b 1.0 0.0 0.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsNull - >>> X = ks.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) - >>> obj.fit_transform(X) - A B A__is_null B__is_null - 0 None NaN 1.0 1.0 - 1 a 1.0 0.0 0.0 - 2 b 1.0 0.0 0.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import IsNull - >>> X = pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[None, nan, 1.0, 1.0], - ['a', 1.0, 0.0, 0.0], - ['b', 1.0, 0.0, 0.0]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsNull - >>> X = ks.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[None, nan, 1.0, 1.0], - ['a', 1.0, 0.0, 0.0], - ['b', 1.0, 0.0, 0.0]], dtype=object) - - """ - - def __init__(self, columns: List[str], - column_names: List[str] = None, dtype: type = np.float64): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - if column_names is not None and not isinstance(column_names, list): - raise TypeError('`column_names` should be a list.') - if not column_names: - column_names = [f'{c}__is_null' for c in columns] - if len(column_names) != len(columns): - raise ValueError( - 'Length of `columns` and `column_names` should match.') - column_mapping = dict(zip(column_names, columns)) - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=dtype) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None): - """ - Fit the dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y (np.ndarray, optional): labels. Defaults to None. - - Returns - ------- - IsNull: - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - X[self.column_names] = X[self.columns].isnull().astype(self.dtype) - return X - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].isnull().astype(self.dtype) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - if X.dtype == object: - return is_null_object(X, self.idx_columns) - return is_null(X, self.idx_columns, self.dtype) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/one_hot.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/one_hot.py deleted file mode 100644 index cd20a474..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/one_hot.py +++ /dev/null @@ -1,182 +0,0 @@ -# License: Apache-2.0 -from feature_gen import one_hot -from ._base_feature_generation import _BaseFeatureGeneration -from ..util import util -from typing import List, Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class OneHot(_BaseFeatureGeneration): - """Create new columns based on the one-hot technique. - - Parameters - ---------- - categories_dict : Dict[str: List[str]]. - keys: columns, values: list of category name. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation import OneHot - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) - >>> obj.fit_transform(X) - A B A__onehot__b A__onehot__c B__onehot__z - 0 a z False False True - 1 b a True False False - 2 c a False True False - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import OneHot - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) - >>> obj.fit_transform(X) - A B A__onehot__b A__onehot__c B__onehot__z - 0 a z False False True - 1 b a True False False - 2 c a False True False - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import OneHot - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'z', False, False, True], - ['b', 'a', True, False, False], - ['c', 'a', False, True, False]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import OneHot - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'z', False, False, True], - ['b', 'a', True, False, False], - ['c', 'a', False, True, False]], dtype=object) - - """ - - def __init__(self, categories_dict: Dict[str, List[str]], - column_names: List[str] = None): - if not isinstance(categories_dict, dict): - raise TypeError('`categories_dict` should be a dict.') - if column_names is not None and not isinstance(column_names, list): - raise TypeError('`column_names` should be None or a list.') - self.categories_dict = categories_dict - columns = list(set(categories_dict.keys())) - if not column_names: - column_names = [ - f'{col}__onehot__{cat}' - for col, cats in categories_dict.items() - for cat in cats - ] - column_mapping = { - f'{col}__onehot__{cat}': col - for col, cats in categories_dict.items() - for cat in cats - } - else: - column_mapping = { - name: col - for name, col in zip(column_names, categories_dict.keys()) - } - columns = [ - col - for col, cats in categories_dict.items() - for cat in cats - ] - n_cats = sum([len(cat) for cat in categories_dict.values()]) - if column_names and n_cats != len(column_names): - raise ValueError( - 'Length of `clusters_dict` and `column_names` should match.') - - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=None) - self.mapping = dict(zip(self.column_names, self.columns)) - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None): - """ - Fit the dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y (np.ndarray, optional): labels. Defaults to None. - - Returns - ------- - OneHot: Instance of itself. - """ - self.check_dataframe(X) - self.cats = np.array( - [cat - for cats in self.categories_dict.values() - for cat in cats] - ).astype(object) - cols_flatten = np.array( - [col - for col, cats in self.categories_dict.items() - for cat in cats] - ) - self.idx_columns = util.get_idx_columns(X, cols_flatten) - return self - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for name, col, cat in zip( - self.column_names, self.columns, self.cats): - X.loc[:, name] = (X[col] == cat) - return X - - for name, col, cat in zip( - self.column_names, self.columns, self.cats): - X = X.assign( - dummy=(X[col] == cat) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return one_hot(X, self.idx_columns, self.cats) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/plane_rotation.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/plane_rotation.py deleted file mode 100644 index 58541925..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/plane_rotation.py +++ /dev/null @@ -1,188 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union -from math import cos, sin -from math import pi as PI -import numpy as np -import pandas as pd -import databricks.koalas as ks -from gators.util import util -from gators.transformers import Transformer -from feature_gen import plan_rotation -from ._base_feature_generation import _BaseFeatureGeneration - - -class PlaneRotation(Transformer): - """Create new columns based on the plane rotation mapping. - - The data should be composed of numerical columns only. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `PlaneRotation`. - - Parameters - ---------- - columns : List[List[str]] - List of pair-wise columns. - theta_vec: List[float] - List of rotation angles. - dtype : type, default to np.float64 - Numpy dtype of the output data. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.feature_generation import PlaneRotation - >>> X = pd.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0, 60.0]) - >>> obj.fit_transform(X) - X Y Z ... XZ_y_45.0deg XZ_x_60.0deg XZ_y_60.0deg - 0 200.0 140.0 100.0 ... 212.132034 13.397460 223.205081 - 1 210.0 160.0 125.0 ... 236.880772 -3.253175 244.365335 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PlaneRotation - >>> X = ks.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0]) - >>> obj.fit_transform(X) - X Y Z XY_x_45.0deg XY_y_45.0deg XZ_x_45.0deg XZ_y_45.0deg - 0 200.0 140.0 125.0 42.426407 240.416306 53.033009 229.809704 - 1 210.0 160.0 175.0 35.355339 261.629509 24.748737 272.236111 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import PlaneRotation - >>> X = pd.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45.0]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[200. , 140. , 125. , 42.42640687, - 240.4163056 , 53.03300859, 229.80970389], - [210. , 160. , 175. , 35.35533906, - 261.62950904, 24.74873734, 272.23611076]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PlaneRotation - >>> X = ks.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45.0]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[200. , 140. , 125. , 42.42640687, - 240.4163056 , 53.03300859, 229.80970389], - [210. , 160. , 175. , 35.35533906, - 261.62950904, 24.74873734, 272.23611076]]) - """ - - def __init__(self, columns: List[List[str]], theta_vec: List[float], - dtype: type = np.float64): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not isinstance(theta_vec, list): - raise TypeError('`theta_vec` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - if not any(isinstance(cols, list) for cols in columns): - raise TypeError('`columns` should be a list of lists.') - if not all(isinstance(theta, (float, int)) for theta in theta_vec): - raise TypeError( - '`theta_vec` should be a list of ints or floats.') - self.check_datatype(dtype, [np.float32, np.float64]) - - column_names = [ - [f'{x}{y}_x_{t}deg', f'{x}{y}_y_{t}deg'] - for (x, y) in columns for t in theta_vec] - column_names = [c for cols in column_names for c in cols] - column_mapping = { - **{f'{x}{y}_x_{t}deg': [x, y] - for (x, y) in columns for t in theta_vec}, - **{f'{x}{y}_y_{t}deg': [x, y] - for (x, y) in columns for t in theta_vec} - } - columns = [c for cols in columns for c in cols] - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=dtype) - self.theta_vec = np.array(theta_vec) - self.cos_theta_vec = np.cos(self.theta_vec * np.pi / 180) - self.sin_theta_vec = np.sin(self.theta_vec * np.pi / 180) - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'PlaneRotation': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - PlaneRotation - Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.idx_columns_x = util.get_idx_columns(X, self.columns[::2]) - self.idx_columns_y = util.get_idx_columns(X, self.columns[1::2]) - return self - - def transform(self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for x, y in zip(self.columns[::2], self.columns[1::2]): - for theta in self.theta_vec: - cos_theta = cos(theta * PI / 180) - sin_theta = sin(theta * PI / 180) - X.loc[:, f'{x}{y}_x_{theta}deg'] = X[x] * \ - cos_theta - X[y] * sin_theta - X.loc[:, f'{x}{y}_y_{theta}deg'] = X[x] * \ - sin_theta + X[y] * cos_theta - X[self.column_names] = X[self.column_names].astype(self.dtype) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return plan_rotation( - X.astype(self.dtype), self.idx_columns_x, self.idx_columns_y, - self.cos_theta_vec, self.sin_theta_vec) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/polynomial_features.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/polynomial_features.py deleted file mode 100644 index b07c9646..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/polynomial_features.py +++ /dev/null @@ -1,205 +0,0 @@ -import numpy as np -import pandas as pd -from typing import List, Union -import databricks.koalas as ks -from ..util import util -from gators.transformers import Transformer -from itertools import combinations, combinations_with_replacement, chain -from feature_gen import polynomial -from ._base_feature_generation import _BaseFeatureGeneration - - -class PolynomialFeatures(Transformer): - """Create new columns based on columns multiplication. - - The data should be composed of numerical columns only. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `PolynomialFeatures`. - - Parameters - ---------- - columns : List[str] - List of columns. - degree : int, default = 2 - The degree of polynomial. The default of degree of 2 - will produce A * A, B * B, and A * B from features A and B. - interaction_only : bool, default = False - Allows to keep only interaction terms. - If true, only A * B will be produced from features A and B. - dtype : type, default to np.float64 - Numpy dtype of the output data. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation import PolynomialFeatures - >>> X = pd.DataFrame( - ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures(columns=['A', 'B']) - >>> obj.fit_transform(X) - A B C A__x__A A__x__B B__x__B - 0 0.0 1.0 2.0 0.0 0.0 1.0 - 1 3.0 4.0 5.0 9.0 12.0 16.0 - 2 6.0 7.0 8.0 36.0 42.0 49.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PolynomialFeatures - >>> X = ks.DataFrame( - ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures( - ... columns=['A', 'B', 'C'], degree=3, interaction_only=True) - >>> obj.fit_transform(X) - A B C A__x__B A__x__C B__x__C A__x__B__x__C - 0 0.0 1.0 2.0 0.0 0.0 2.0 0.0 - 1 3.0 4.0 5.0 12.0 15.0 20.0 60.0 - 2 6.0 7.0 8.0 42.0 48.0 56.0 336.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import PolynomialFeatures - >>> X = pd.DataFrame( - ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures( - ... columns=['A', 'B', 'C'], degree=2, interaction_only=True) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0., 1., 2., 0., 0., 2.], - [ 3., 4., 5., 12., 15., 20.], - [ 6., 7., 8., 42., 48., 56.]]) - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PolynomialFeatures - >>> X = ks.DataFrame( - ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures( - ... columns=['A', 'B', 'C'], degree=2, interaction_only=True) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0., 1., 2., 0., 0., 2.], - [ 3., 4., 5., 12., 15., 20.], - [ 6., 7., 8., 42., 48., 56.]]) - - """ - - def __init__(self, columns: List[str], degree=2, interaction_only=False, - dtype: type = np.float64): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - if not isinstance(degree, int): - raise TypeError('`degree` should be an int.') - if degree < 2: - raise ValueError('`degree` should be at least 2.') - if not isinstance(interaction_only, bool): - raise TypeError('`interaction_only` should be a bool.') - if interaction_only == True and len(columns) == 1: - raise ValueError( - 'Cannot create interaction only terms from single feature.') - self.check_datatype(dtype, [np.float32, np.float64]) - - self.degree = degree - self.method = ( - combinations if interaction_only else combinations_with_replacement - ) - self.combinations = list( - map(list, chain.from_iterable( - self.method(columns, self.degree) - for self.degree in range(self.degree + 1))) - ) - self.combinations = [c for c in self.combinations if len(c) >= 2] - column_names = ['__x__'.join(map(str, combination)) - for combination in self.combinations] - column_mapping = dict( - zip(column_names, map(list, self.combinations))) - _BaseFeatureGeneration.__init__( - self, columns=columns, column_names=column_names, - column_mapping=column_mapping, dtype=dtype) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'PolynomialFeatures': - """ - Fit the dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y (np.ndarray, optional): labels. Defaults to None. - - Returns - ------- - PolynomialFeatures: Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.dtype = X[self.columns].dtypes.unique()[0] - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns - ) - self.n_rows = X[self.columns].shape[0] - self.n_cols = X[self.columns].shape[1] - self.combinations_np = list( - map(list, chain.from_iterable( - self.method(self.idx_columns, self.degree) - for self.degree in range(self.degree + 1))) - ) - self.combinations_np = [c for c in self.combinations_np if len(c) >= 2] - for combo in self.combinations_np: - combo.extend([-1 for _ in range(self.degree - len(combo))]) - self.combinations_np = np.array(self.combinations_np) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for combi, name in zip(self.combinations, self.column_names): - X[name] = X[combi].prod(axis=1) - X[self.column_names] = X[self.column_names].astype(self.dtype) - return X - for combi, name in zip(self.combinations, self.column_names): - dummy = X[combi[0]] * X["__x__".join(combi[1:])] - X = X.assign( - dummy=dummy - ).rename(columns={'dummy': name}) - X[self.column_names] = X[self.column_names].astype(self.dtype) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return polynomial( - X, self.combinations_np, self.degree, self.dtype) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_cluster_statistics.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_cluster_statistics.py deleted file mode 100644 index 52e2c66b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_cluster_statistics.py +++ /dev/null @@ -1,244 +0,0 @@ -# License: Apache-2.0 -from pandas.testing import assert_frame_equal -from gators.feature_generation.cluster_statistics import ClusterStatistics -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - np.arange(9, dtype=float).reshape(3, 3), columns=list('ABC')) - clusters_dict = { - 'cluster_name_a': list('AB'), - 'cluster_name_b': list('AC'), - 'cluster_name_c': list('BC'), } - obj = ClusterStatistics( - clusters_dict=clusters_dict).fit(X) - X_expected = pd.DataFrame( - [[0.0, 1.0, 2.0, 0.5, 0.7071067811865476, 1.0, 1.4142135623730951, 1.5, 0.7071067811865476], - [3.0, 4.0, 5.0, 3.5, 0.7071067811865476, 4.0, - 1.4142135623730951, 4.5, 0.7071067811865476], - [6.0, 7.0, 8.0, 6.5, 0.7071067811865476, 7.0, 1.4142135623730951, 7.5, 0.7071067811865476]], - columns=['A', 'B', 'C', 'cluster_name_a__mean', 'cluster_name_a__std', - 'cluster_name_b__mean', 'cluster_name_b__std', 'cluster_name_c__mean', 'cluster_name_c__std']) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - np.arange(9, dtype=np.int16).reshape(3, 3), columns=list('ABC')) - - clusters_dict = { - 'cluster_name_a': list('AB'), - 'cluster_name_b': list('AC'), - 'cluster_name_c': list('BC'), } - obj = ClusterStatistics( - clusters_dict=clusters_dict, dtype=np.float32).fit(X) - X_expected = pd.DataFrame( - [[0.0, 1.0, 2.0, 0.5, 0.7071067811865476, 1.0, 1.4142135623730951, 1.5, 0.7071067811865476], - [3.0, 4.0, 5.0, 3.5, 0.7071067811865476, 4.0, - 1.4142135623730951, 4.5, 0.7071067811865476], - [6.0, 7.0, 8.0, 6.5, 0.7071067811865476, 7.0, 1.4142135623730951, 7.5, 0.7071067811865476]], - columns=['A', 'B', 'C', 'cluster_name_a__mean', 'cluster_name_a__std', - 'cluster_name_b__mean', 'cluster_name_b__std', 'cluster_name_c__mean', 'cluster_name_c__std'] - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame( - np.arange(9, dtype=float).reshape(3, 3), columns=list('ABC')) - - clusters_dict = { - 'cluster_name_a': list('AB'), - 'cluster_name_b': list('AC'), - 'cluster_name_c': list('BC'), } - obj = ClusterStatistics( - clusters_dict=clusters_dict, - column_names=['a_mean', 'a_std', 'bb_mean', 'bb_std', 'ccc_mean', 'ccc_std']).fit(X) - X_expected = pd.DataFrame( - [[0.0, 1.0, 2.0, 0.5, 0.7071067811865476, 1.0, 1.4142135623730951, 1.5, 0.7071067811865476], - [3.0, 4.0, 5.0, 3.5, 0.7071067811865476, 4.0, - 1.4142135623730951, 4.5, 0.7071067811865476], - [6.0, 7.0, 8.0, 6.5, 0.7071067811865476, 7.0, 1.4142135623730951, 7.5, 0.7071067811865476]], - columns=['A', 'B', 'C', 'a_mean', 'a_std', 'bb_mean', 'bb_std', 'ccc_mean', 'ccc_std']) - return obj, X, X_expected - - - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - np.arange(9, dtype=float).reshape(3, 3), columns=list('ABC')) - clusters_dict = { - 'cluster_name_a': list('AB'), - 'cluster_name_b': list('AC'), - 'cluster_name_c': list('BC'), } - obj = ClusterStatistics( - clusters_dict=clusters_dict).fit(X) - X_expected = pd.DataFrame( - [[0.0, 1.0, 2.0, 0.5, 0.7071067811865476, 1.0, 1.4142135623730951, 1.5, 0.7071067811865476], - [3.0, 4.0, 5.0, 3.5, 0.7071067811865476, 4.0, - 1.4142135623730951, 4.5, 0.7071067811865476], - [6.0, 7.0, 8.0, 6.5, 0.7071067811865476, 7.0, 1.4142135623730951, 7.5, 0.7071067811865476]], - columns=['A', 'B', 'C', 'cluster_name_a__mean', 'cluster_name_a__std', - 'cluster_name_b__mean', 'cluster_name_b__std', 'cluster_name_c__mean', 'cluster_name_c__std']) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame( - np.arange(9, dtype=np.int16).reshape(3, 3), columns=list('ABC')) - clusters_dict = { - 'cluster_name_a': list('AB'), - 'cluster_name_b': list('AC'), - 'cluster_name_c': list('BC'), } - obj = ClusterStatistics( - clusters_dict=clusters_dict, dtype=np.float32).fit(X) - X_expected = pd.DataFrame( - [[0.0, 1.0, 2.0, 0.5, 0.7071067811865476, 1.0, 1.4142135623730951, 1.5, 0.7071067811865476], - [3.0, 4.0, 5.0, 3.5, 0.7071067811865476, 4.0, - 1.4142135623730951, 4.5, 0.7071067811865476], - [6.0, 7.0, 8.0, 6.5, 0.7071067811865476, 7.0, 1.4142135623730951, 7.5, 0.7071067811865476]], - columns=['A', 'B', 'C', 'cluster_name_a__mean', 'cluster_name_a__std', - 'cluster_name_b__mean', 'cluster_name_b__std', 'cluster_name_c__mean', 'cluster_name_c__std'] - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame( - np.arange(9, dtype=float).reshape(3, 3), columns=list('ABC')) - clusters_dict = { - 'cluster_name_a': list('AB'), - 'cluster_name_b': list('AC'), - 'cluster_name_c': list('BC'), } - obj = ClusterStatistics( - clusters_dict=clusters_dict, - column_names=['a_mean', 'a_std', 'bb_mean', 'bb_std', 'ccc_mean', 'ccc_std']).fit(X) - X_expected = pd.DataFrame( - [[0.0, 1.0, 2.0, 0.5, 0.7071067811865476, 1.0, 1.4142135623730951, 1.5, 0.7071067811865476], - [3.0, 4.0, 5.0, 3.5, 0.7071067811865476, 4.0, - 1.4142135623730951, 4.5, 0.7071067811865476], - [6.0, 7.0, 8.0, 6.5, 0.7071067811865476, 7.0, 1.4142135623730951, 7.5, 0.7071067811865476]], - columns=['A', 'B', 'C', 'a_mean', 'a_std', 'bb_mean', 'bb_std', 'ccc_mean', 'ccc_std']) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_names_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_names_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = ClusterStatistics(clusters_dict=0) - with pytest.raises(ValueError): - _ = ClusterStatistics(clusters_dict={'a': []}) - with pytest.raises(TypeError): - _ = ClusterStatistics(clusters_dict={'a': 'x'}) - with pytest.raises(TypeError): - _ = ClusterStatistics(clusters_dict={'a': ['x', 'y']}, column_names=0) - with pytest.raises(ValueError): - _ = ClusterStatistics( - clusters_dict={'a': ['x', 'y']}, column_names=['aa']) - with pytest.raises(ValueError): - _ = ClusterStatistics( - clusters_dict={'a': ['x', 'y'], 'b': ['x', 'y', 'z']}) - with pytest.raises(ValueError): - _ = ClusterStatistics( - clusters_dict={'a': ['x'], 'b': ['y']}) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_elementary_arithmetics.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_elementary_arithmetics.py deleted file mode 100644 index 4e39a26f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_elementary_arithmetics.py +++ /dev/null @@ -1,370 +0,0 @@ -# License: Apache-2.0 -import pytest -from gators.feature_generation.elementary_arithmethics import ( - ElementaryArithmetics -) -from pandas.testing import assert_frame_equal -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -@pytest.fixture -def data_add(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC')) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., -2., -4.], - [3., 4., 5., -5., -7.], - [6., 7., 8., -8., -10.]]), - columns=['A', 'B', 'C', 'A__-__B', 'A__-__C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), coef=-2., operator='+' - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_add(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC')) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., -2., -4.], - [3., 4., 5., -5., -7.], - [6., 7., 8., -8., -10.]]), - columns=['A', 'B', 'C', 'A__-__B', 'A__-__C'] - ).astype(np.float32) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), coef=-2., operator='+', - dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_name_add(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., -2., -4.], - [3., 4., 5., -5., -7.], - [6., 7., 8., -8., -10.]]), - columns=['A', 'B', 'C', 'A+B', 'A+C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), coef=-2., operator='+', - column_names=['A+B', 'A+C'] - - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_mult(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), - columns=list('ABC'), dtype=np.float64) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0.], - [3., 4., 5., 12., 15.], - [6., 7., 8., 42., 48.]]), - columns=['A', 'B', 'C', 'A__*__B', 'A__*__C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), operator='*' - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_div(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0], - [3., 4., 5., 0.75, 0.59999988], - [6., 7., 8., 0.85714286, 0.7499999]]), - columns=['A', 'B', 'C', 'A__/__B', 'A__/__C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), operator='/' - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_add_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC')) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., -2., -4.], - [3., 4., 5., -5., -7.], - [6., 7., 8., -8., -10.]]), - columns=['A', 'B', 'C', 'A__-__B', 'A__-__C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), coef=-2., operator='+' - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_add_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC')) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., -2., -4.], - [3., 4., 5., -5., -7.], - [6., 7., 8., -8., -10.]]), - columns=['A', 'B', 'C', 'A__-__B', 'A__-__C'] - ).astype(np.float32) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), coef=-2., operator='+', - dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_name_add_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., -2., -4.], - [3., 4., 5., -5., -7.], - [6., 7., 8., -8., -10.]]), - columns=['A', 'B', 'C', 'A+B', 'A+C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), coef=-2., operator='+', - column_names=['A+B', 'A+C'] - - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_mult_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), - columns=list('ABC'), dtype=np.float64) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0.], - [3., 4., 5., 12., 15.], - [6., 7., 8., 42., 48.]]), - columns=['A', 'B', 'C', 'A__*__B', 'A__*__C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), operator='*' - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_div_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0], - [3., 4., 5., 0.75, 0.59999988], - [6., 7., 8., 0.85714286, 0.7499999]]), - columns=['A', 'B', 'C', 'A__/__B', 'A__/__C'] - ) - obj = ElementaryArithmetics( - columns_a=list('AA'), columns_b=list('BC'), operator='/' - ).fit(X) - return obj, X, X_expected - - -def test_add_pd(data_add): - obj, X, X_expected = data_add - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_add_ks(data_add_ks): - obj, X, X_expected = data_add_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_add_pd_np(data_add): - obj, X, X_expected = data_add - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_add_ks_np(data_add_ks): - obj, X, X_expected = data_add_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_float32_add_pd(data_float32_add): - obj, X, X_expected = data_float32_add - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_add_ks_ks(data_float32_add_ks): - obj, X, X_expected = data_float32_add_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_add_pd_np(data_float32_add): - obj, X, X_expected = data_float32_add - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_add_ks_np_ks(data_float32_add_ks): - obj, X, X_expected = data_float32_add_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_mult_pd(data_mult): - obj, X, X_expected = data_mult - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_mult_ks(data_mult_ks): - obj, X, X_expected = data_mult_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_mult_pd_np(data_mult): - obj, X, X_expected = data_mult - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_mult_ks_np(data_mult_ks): - obj, X, X_expected = data_mult_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_div_pd(data_div): - obj, X, X_expected = data_div - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_div_ks(data_div_ks): - obj, X, X_expected = data_div_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_div_pd_np(data_div): - obj, X, X_expected = data_div - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_div_ks_np(data_div_ks): - obj, X, X_expected = data_div_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_name_add_pd(data_name_add): - obj, X, X_expected = data_name_add - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_name_add_ks_ks(data_name_add_ks): - obj, X, X_expected = data_name_add_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_name_add_pd_np(data_name_add): - obj, X, X_expected = data_name_add - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_name_add_ks_np_ks(data_name_add_ks): - obj, X, X_expected = data_name_add_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a='A', columns_b=['A'], - operator='+', column_names=['2A']) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=['A'], columns_b='A', - operator='+', column_names=['2A']) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=['A'], columns_b=['A'], - operator=0, column_names=['2A']) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=['A'], columns_b=['A'], - operator='z', column_names=['2A']) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=['A', 'B'], columns_b=['A'], - operator='+', column_names=['2A']) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=[], columns_b=['A'], - operator='+', column_names=['2A']) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=['A'], columns_b=['A'], - operator='+', column_names=['2A', '2A']) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=['A'], columns_b=['A'], - operator='+', coef='x') - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=['A'], columns_b=['A'], - operator='+', column_names='x') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_is_equal.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_is_equal.py deleted file mode 100644 index 514c6fc5..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_is_equal.py +++ /dev/null @@ -1,283 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation.is_equal import IsEqual -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.]}) - - X_expected = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.], - 'A__is__B': [1., 0., 0.], - 'A__is__C': [1., 0., 0.]}) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.]}).astype(np.int16) - - X_expected = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.], - 'A__is__B': [1., 0., 0.], - 'A__is__C': [1., 0., 0.]}).astype(np.int16) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj(): - X = pd.DataFrame( - {'A': ['a', 'b', 'c'], - 'B': ['a', 'f', 'e'], - 'C': ['a', 'p', 'd'], - 'D': [1, 2, 3]}) - - X_expected = pd.DataFrame( - {'A': ['a', 'b', 'c'], - 'B': ['a', 'f', 'e'], - 'C': ['a', 'p', 'd'], - 'D': [1, 2, 3], - 'A__is__B': [1., 0., 0.], - 'A__is__C': [1., 0., 0.]}) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.]}) - - X_expected = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.], - 'A==B': [1., 0., 0.], - 'A==C': [1., 0., 0.]}) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC'), - column_names=['A==B', 'A==C']).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.]}) - X_expected = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.], - 'A__is__B': [1., 0., 0.], - 'A__is__C': [1., 0., 0.]}) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.]}).astype(np.int16) - X_expected = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.], - 'A__is__B': [1., 0., 0.], - 'A__is__C': [1., 0., 0.]}).astype(np.int16) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj_ks(): - X = ks.DataFrame( - {'A': ['a', 'b', 'c'], - 'B': ['a', 'f', 'e'], - 'C': ['a', 'p', 'd'], - 'D': [1, 2, 3]}) - X_expected = pd.DataFrame( - {'A': ['a', 'b', 'c'], - 'B': ['a', 'f', 'e'], - 'C': ['a', 'p', 'd'], - 'D': [1, 2, 3], - 'A__is__B': [1., 0., 0.], - 'A__is__C': [1., 0., 0.]}) - obj = IsEqual(columns_a=list('AA'), columns_b=list('BC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.]}) - - X_expected = pd.DataFrame( - {'A': [99., 1., 2.], - 'B': [99., 4., 5.], - 'C': [99., 7., 8.], - 'A==B': [1., 0., 0.], - 'A==C': [1., 0., 0.]}) - obj = IsEqual( - columns_a=list('AA'), columns_b=list('BC'), - column_names=['A==B', 'A==C']).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_obj(data_obj): - obj, X, X_expected = data_obj - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_obj_ks(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_obj_np(data_obj): - obj, X, X_expected = data_obj - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_obj_ks_np(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_names_pd_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -def test_input(): - with pytest.raises(TypeError): - _ = IsEqual(columns_a=0, columns_b=['B']) - with pytest.raises(TypeError): - _ = IsEqual(columns_a=['A'], columns_b=0) - with pytest.raises(TypeError): - _ = IsEqual(columns_a=['A'], columns_b=['B'], column_names=0) - with pytest.raises(ValueError): - _ = IsEqual(columns_a=['A'], columns_b=['B', 'C']) - with pytest.raises(ValueError): - _ = IsEqual(columns_a=['A'], columns_b=['B'], column_names=['x', 'y']) - with pytest.raises(ValueError): - _ = IsEqual(columns_a=[], columns_b=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_is_null.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_is_null.py deleted file mode 100644 index dd0e64d1..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_is_null.py +++ /dev/null @@ -1,281 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation.is_null import IsNull -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data_num(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list('ABC')) - X.iloc[0, :] = np.nan - - X_expected = pd.DataFrame( - [[np.nan, np.nan, np.nan, 1., 1., 1.0], - [3.0, 4.0, 5.0, 0., 0., 0.0], - [6.0, 7.0, 8.0, 0., 0., 0.0]], - columns=['A', 'B', 'C', 'A__is_null', 'B__is_null', 'C__is_null'] - ) - obj = IsNull(columns=list('ABC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_num(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC')).astype(np.float32) - X.iloc[0, :] = np.nan - - X_expected = pd.DataFrame( - [[np.nan, np.nan, np.nan, 1., 1., 1.0], - [3.0, 4.0, 5.0, 0., 0., 0.0], - [6.0, 7.0, 8.0, 0., 0., 0.0]], - columns=['A', 'B', 'C', 'A__is_null', 'B__is_null', 'C__is_null'] - ).astype(np.float32) - obj = IsNull(columns=list('ABC'), dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list('ABC')) - X.iloc[0, :] = np.nan - - X_expected = pd.DataFrame( - [[np.nan, np.nan, np.nan, 1., 1., 1.0], - [3.0, 4.0, 5.0, 0., 0., 0.0], - [6.0, 7.0, 8.0, 0., 0., 0.0]], - columns=['A', 'B', 'C', 'AIsNull', 'BIsNull', 'CIsNull'] - ) - obj = IsNull(columns=list('ABC'), - column_names=['AIsNull', 'BIsNull', 'CIsNull']).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj(): - X = pd.DataFrame({ - 'A': [None, 'a', 'b'], - 'B': [None, 'c', 'd'], - 'C': [None, 'e', 'f'], - 'D': [0, 1, np.nan], - - }) - X_expected = pd.DataFrame({ - 'A': [None, 'a', 'b'], - 'B': [None, 'c', 'd'], - 'C': [None, 'e', 'f'], - 'D': [0, 1, np.nan], - 'A__is_null': [1., 0., 0.], - 'B__is_null': [1., 0., 0.], - 'C__is_null': [1., 0., 0.], - 'D__is_null': [0., 0., 1.], - }) - obj = IsNull(columns=list('ABCD')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list('ABC')) - X.iloc[0, :] = np.nan - X_expected = pd.DataFrame( - [[np.nan, np.nan, np.nan, 1., 1., 1.0], - [3.0, 4.0, 5.0, 0., 0., 0.0], - [6.0, 7.0, 8.0, 0., 0., 0.0]], - columns=['A', 'B', 'C', 'A__is_null', 'B__is_null', 'C__is_null'] - ) - obj = IsNull(columns=list('ABC')).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_num_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC')) - X.iloc[0, :] = np.nan - X = X.astype(np.float32) - X_expected = pd.DataFrame( - [[np.nan, np.nan, np.nan, 1., 1., 1.0], - [3.0, 4.0, 5.0, 0., 0., 0.0], - [6.0, 7.0, 8.0, 0., 0., 0.0]], - columns=['A', 'B', 'C', 'A__is_null', 'B__is_null', 'C__is_null'] - ).astype(np.float32) - obj = IsNull(columns=list('ABC'), dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list('ABC')) - X.iloc[0, :] = np.nan - X_expected = pd.DataFrame( - [[np.nan, np.nan, np.nan, 1., 1., 1.0], - [3.0, 4.0, 5.0, 0., 0., 0.0], - [6.0, 7.0, 8.0, 0., 0., 0.0]], - columns=['A', 'B', 'C', 'AIsNull', 'BIsNull', 'CIsNull'] - ) - obj = IsNull(columns=list('ABC'), - column_names=['AIsNull', 'BIsNull', 'CIsNull']).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj_ks(): - X = ks.DataFrame({ - 'A': [None, 'a', 'b'], - 'B': [None, 'c', 'd'], - 'C': [None, 'e', 'f'], - 'D': [0, 1, np.nan], - - }) - X_expected = pd.DataFrame({ - 'A': [None, 'a', 'b'], - 'B': [None, 'c', 'd'], - 'C': [None, 'e', 'f'], - 'D': [0, 1, np.nan], - 'A__is_null': [1., 0., 0.], - 'B__is_null': [1., 0., 0.], - 'C__is_null': [1., 0., 0.], - 'D__is_null': [0., 0., 1.], - }) - obj = IsNull(columns=list('ABCD')).fit(X) - return obj, X, X_expected - - -def test_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32_num): - obj, X, X_expected = data_float32_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_num_ks): - obj, X, X_expected = data_float32_num_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32_num): - obj, X, X_expected = data_float32_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_num_ks): - obj, X, X_expected = data_float32_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_names_pd_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_obj(data_obj): - obj, X, X_expected = data_obj - X_new = obj.transform(X) - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float)) - - -@pytest.mark.koalas -def test_obj_ks(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_new = obj.transform(X).to_pandas() - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float)) - - -def test_obj_np(data_obj): - obj, X, X_expected = data_obj - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float)) - - -@pytest.mark.koalas -def test_obj_ks_np(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float)) - - -def test_init(): - with pytest.raises(TypeError): - _ = IsNull(columns=0) - with pytest.raises(ValueError): - _ = IsNull(columns=[], column_names=['AIsNull']) - with pytest.raises(TypeError): - _ = IsNull(columns=list('ABC'), column_names=0) - with pytest.raises(ValueError): - _ = IsNull(columns=list('ABC'), column_names=['a', 'b']) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_one_hot.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_one_hot.py deleted file mode 100644 index 9df3611d..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_one_hot.py +++ /dev/null @@ -1,160 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation.one_hot import OneHot -from pandas.testing import assert_frame_equal -import numpy as np -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.array(list('qweqwrasd')).reshape( - 3, 3), columns=list('ABC')) - X_expected = pd.DataFrame({ - 'A': {0: 'q', 1: 'q', 2: 'a'}, - 'B': {0: 'w', 1: 'w', 2: 's'}, - 'C': {0: 'e', 1: 'r', 2: 'd'}, - 'A__onehot__q': {0: True, 1: True, 2: False}, - 'A__onehot__a': {0: False, 1: False, 2: True}, - 'B__onehot__w': {0: True, 1: True, 2: False}, - 'B__onehot__s': {0: False, 1: False, 2: True}, - 'C__onehot__e': {0: True, 1: False, 2: False}, - 'C__onehot__d': {0: False, 1: False, 2: True}} - ) - categories_dict = {'A': ['q', 'a'], 'B': ['w', 's'], 'C': ['e', 'd']} - obj = OneHot(categories_dict=categories_dict).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame(np.array(list('qweqwrasd')).reshape( - 3, 3), columns=list('ABC')) - X_expected = pd.DataFrame( - {'A': {0: 'q', 1: 'q', 2: 'a'}, - 'B': {0: 'w', 1: 'w', 2: 's'}, - 'C': {0: 'e', 1: 'r', 2: 'd'}, - 'Aq': {0: True, 1: True, 2: False}, - 'Aa': {0: False, 1: False, 2: True}, - 'Bw': {0: True, 1: True, 2: False}, - 'Bs': {0: False, 1: False, 2: True}, - 'Ce': {0: True, 1: False, 2: False}, - 'Cd': {0: False, 1: False, 2: True}}) - column_names = ['Aq', 'Aa', 'Bw', 'Bs', 'Ce', 'Cd'] - categories_dict = {'A': ['q', 'a'], 'B': ['w', 's'], 'C': ['e', 'd']} - obj = OneHot( - categories_dict=categories_dict, column_names=column_names).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.array(list('qweqwrasd')).reshape( - 3, 3), columns=list('ABC')) - X_expected = pd.DataFrame({ - 'A': {0: 'q', 1: 'q', 2: 'a'}, - 'B': {0: 'w', 1: 'w', 2: 's'}, - 'C': {0: 'e', 1: 'r', 2: 'd'}, - 'A__onehot__q': {0: True, 1: True, 2: False}, - 'A__onehot__a': {0: False, 1: False, 2: True}, - 'B__onehot__w': {0: True, 1: True, 2: False}, - 'B__onehot__s': {0: False, 1: False, 2: True}, - 'C__onehot__e': {0: True, 1: False, 2: False}, - 'C__onehot__d': {0: False, 1: False, 2: True}} - ) - categories_dict = {'A': ['q', 'a'], 'B': ['w', 's'], 'C': ['e', 'd']} - obj = OneHot(categories_dict=categories_dict).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame(np.array(list('qweqwrasd')).reshape( - 3, 3), columns=list('ABC')) - X_expected = pd.DataFrame( - {'A': {0: 'q', 1: 'q', 2: 'a'}, - 'B': {0: 'w', 1: 'w', 2: 's'}, - 'C': {0: 'e', 1: 'r', 2: 'd'}, - 'Aq': {0: True, 1: True, 2: False}, - 'Aa': {0: False, 1: False, 2: True}, - 'Bw': {0: True, 1: True, 2: False}, - 'Bs': {0: False, 1: False, 2: True}, - 'Ce': {0: True, 1: False, 2: False}, - 'Cd': {0: False, 1: False, 2: True}}) - column_names = ['Aq', 'Aa', 'Bw', 'Bs', 'Ce', 'Cd'] - categories_dict = {'A': ['q', 'a'], 'B': ['w', 's'], 'C': ['e', 'd']} - obj = OneHot( - categories_dict=categories_dict, column_names=column_names).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new.iloc[:, -3:], X_expected.iloc[:, -3:]) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas().iloc[:, -3:], X_expected.iloc[:, -3:]) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_names_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_names_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OneHot(categories_dict=0) - with pytest.raises(TypeError): - _ = OneHot(categories_dict={'a': ['x']}, column_names=0) - with pytest.raises(ValueError): - _ = OneHot( - categories_dict={'a': ['x']}, column_names=['aa', 'bb']) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_plane_rotation.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_plane_rotation.py deleted file mode 100644 index 178a7bc1..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_plane_rotation.py +++ /dev/null @@ -1,174 +0,0 @@ -# License: Apache-2.0 -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -from pandas.testing import assert_frame_equal -from gators.feature_generation.plane_rotation import PlaneRotation -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - [[200.0, 140.0, 100.0], [210.0, 160.0, 125.0]], - columns=list('XYZ')) - X_expected = pd.DataFrame({ - 'X': {0: 200.0, 1: 210.0}, - 'Y': {0: 140.0, 1: 160.0}, - 'Z': {0: 100.0, 1: 125.0}, - 'XY_x_45deg': {0: 42.42640687119287, 1: 35.35533905932739}, - 'XY_y_45deg': {0: 240.41630560342614, 1: 261.62950903902254}, - 'XY_x_60deg': {0: -21.243556529821376, 1: -33.56406460551014}, - 'XY_y_60deg': {0: 243.20508075688775, 1: 261.8653347947321}, - 'XZ_x_45deg': {0: 70.71067811865477, 1: 60.104076400856556}, - 'XZ_y_45deg': {0: 212.13203435596424, 1: 236.8807716974934}, - 'XZ_x_60deg': {0: 13.397459621556166, 1: -3.253175473054796}, - 'XZ_y_60deg': {0: 223.20508075688775, 1: 244.36533479473212}} - ) - obj = PlaneRotation( - columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45, 60]).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - [[200, 140, 100], [210, 160, 125]], - columns=list('XYZ')).astype(np.float32) - - X_expected = pd.DataFrame({ - 'X': {0: 200.0, 1: 210.0}, - 'Y': {0: 140.0, 1: 160.0}, - 'Z': {0: 100.0, 1: 125.0}, - 'XY_x_45deg': {0: 42.42640687119287, 1: 35.35533905932739}, - 'XY_y_45deg': {0: 240.41630560342614, 1: 261.62950903902254}, - 'XY_x_60deg': {0: -21.243556529821376, 1: -33.56406460551014}, - 'XY_y_60deg': {0: 243.20508075688775, 1: 261.8653347947321}, - 'XZ_x_45deg': {0: 70.71067811865477, 1: 60.104076400856556}, - 'XZ_y_45deg': {0: 212.13203435596424, 1: 236.8807716974934}, - 'XZ_x_60deg': {0: 13.397459621556166, 1: -3.253175473054796}, - 'XZ_y_60deg': {0: 223.20508075688775, 1: 244.36533479473212}} - ).astype(np.float32) - obj = PlaneRotation( - columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45, 60], - dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - [[200.0, 140.0, 100.0], [210.0, 160.0, 125.0]], - columns=list('XYZ')) - X_expected = pd.DataFrame({ - 'X': {0: 200.0, 1: 210.0}, - 'Y': {0: 140.0, 1: 160.0}, - 'Z': {0: 100.0, 1: 125.0}, - 'XY_x_45deg': {0: 42.42640687119287, 1: 35.35533905932739}, - 'XY_y_45deg': {0: 240.41630560342614, 1: 261.62950903902254}, - 'XY_x_60deg': {0: -21.243556529821376, 1: -33.56406460551014}, - 'XY_y_60deg': {0: 243.20508075688775, 1: 261.8653347947321}, - 'XZ_x_45deg': {0: 70.71067811865477, 1: 60.104076400856556}, - 'XZ_y_45deg': {0: 212.13203435596424, 1: 236.8807716974934}, - 'XZ_x_60deg': {0: 13.397459621556166, 1: -3.253175473054796}, - 'XZ_y_60deg': {0: 223.20508075688775, 1: 244.36533479473212}} - ) - obj = PlaneRotation( - columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45, 60]).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame( - [[200, 140, 100], [210, 160, 125]], - columns=list('XYZ')).astype(np.float32) - X_expected = pd.DataFrame({ - 'X': {0: 200.0, 1: 210.0}, - 'Y': {0: 140.0, 1: 160.0}, - 'Z': {0: 100.0, 1: 125.0}, - 'XY_x_45deg': {0: 42.42640687119287, 1: 35.35533905932739}, - 'XY_y_45deg': {0: 240.41630560342614, 1: 261.62950903902254}, - 'XY_x_60deg': {0: -21.243556529821376, 1: -33.56406460551014}, - 'XY_y_60deg': {0: 243.20508075688775, 1: 261.8653347947321}, - 'XZ_x_45deg': {0: 70.71067811865477, 1: 60.104076400856556}, - 'XZ_y_45deg': {0: 212.13203435596424, 1: 236.8807716974934}, - 'XZ_x_60deg': {0: 13.397459621556166, 1: -3.253175473054796}, - 'XZ_y_60deg': {0: 223.20508075688775, 1: 244.36533479473212}} - ).astype(np.float32) - obj = PlaneRotation( - columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45, 60], - dtype=np.float32).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -def test_input(): - with pytest.raises(TypeError): - _ = PlaneRotation(columns=0, theta_vec=[45, 60]) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=[['X', 'Y']], theta_vec=0) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=[['X', 'Y'], ['X', 'Z']], theta_vec=0) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=['X', 'Y', 'X', 'Z'], theta_vec=[45, 60]) - with pytest.raises(ValueError): - _ = PlaneRotation(columns=[], theta_vec=[0]) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=[['X', 'Y']], theta_vec=[45, '60']) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_polynomial_features.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_polynomial_features.py deleted file mode 100644 index cae4e392..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation/tests/test_polynomial_features.py +++ /dev/null @@ -1,400 +0,0 @@ -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -from pandas.testing import assert_frame_equal -from gators.feature_generation.polynomial_features import PolynomialFeatures -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data_inter(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - obj = PolynomialFeatures( - interaction_only=True, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 2.], - [3., 4., 5., 12., 15., 20.], - [6., 7., 8., 42., 48., 56.]]), - columns=['A', 'B', 'C', 'A__x__B', 'A__x__C', 'B__x__C'] - ) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_inter(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.int16) - obj = PolynomialFeatures( - interaction_only=True, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 2.], - [3., 4., 5., 12., 15., 20.], - [6., 7., 8., 42., 48., 56.]]), - columns=['A', 'B', 'C', 'A__x__B', 'A__x__C', 'B__x__C'] - ).astype(np.int16) - return obj, X, X_expected - - -@ pytest.fixture -def data_all(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float32) - obj = PolynomialFeatures( - interaction_only=False, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 0., 1., 2., 4.], - [3., 4., 5., 9., 12., 15., 16., 20., 25.], - [6., 7., 8., 36., 42., 48., 49., 56., 64.]]), - columns=['A', 'B', 'C', 'A__x__A', 'A__x__B', - 'A__x__C', 'B__x__B', 'B__x__C', 'C__x__C'] - ).astype(np.float32) - return obj, X, X_expected - - -@ pytest.fixture -def data_degree(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=False, degree=3, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 0., 1., 2., 4., 0., 0., - 0., 0., 0., 0., 1., 2., 4., 8.], - [3., 4., 5., 9., 12., 15., 16., 20., 25., 27., 36., - 45., 48., 60., 75., 64., 80., 100., 125.], - [6., 7., 8., 36., 42., 48., 49., 56., 64., 216., 252., - 288., 294., 336., 384., 343., 392., 448., 512.]]), - columns=['A', 'B', 'C', 'A__x__A', 'A__x__B', 'A__x__C', 'B__x__B', 'B__x__C', 'C__x__C', - 'A__x__A__x__A', 'A__x__A__x__B', 'A__x__A__x__C', 'A__x__B__x__B', 'A__x__B__x__C', - 'A__x__C__x__C', 'B__x__B__x__B', 'B__x__B__x__C', 'B__x__C__x__C', 'C__x__C__x__C'] - ) - return obj, X, X_expected - - -@ pytest.fixture -def data_inter_degree(): - X = pd.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=True, degree=3, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 2., 0.], - [3., 4., 5., 12., 15., 20., 60.], - [6., 7., 8., 42., 48., 56., 336.]]), - columns=['A', 'B', 'C', 'A__x__B', - 'A__x__C', 'B__x__C', 'A__x__B__x__C'] - ) - return obj, X, X_expected - - -@ pytest.fixture -def data_subset(): - X = pd.DataFrame(np.arange(12).reshape( - 3, 4), columns=list('ABCD'), dtype=np.float64) - - obj = PolynomialFeatures( - columns=['A', 'B', 'C'], interaction_only=True, degree=2).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 3., 0., 0., 2.], - [4., 5., 6., 7., 20., 24., 30.], - [8., 9., 10., 11., 72., 80., 90.]]), - columns=['A', 'B', 'C', 'D', 'A__x__B', 'A__x__C', 'B__x__C'] - ) - return obj, X, X_expected - - -@pytest.fixture -def data_inter_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - obj = PolynomialFeatures( - interaction_only=True, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 2.], - [3., 4., 5., 12., 15., 20.], - [6., 7., 8., 42., 48., 56.]]), - columns=['A', 'B', 'C', 'A__x__B', 'A__x__C', 'B__x__C'] - ) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_inter_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.int16) - obj = PolynomialFeatures( - interaction_only=True, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 2.], - [3., 4., 5., 12., 15., 20.], - [6., 7., 8., 42., 48., 56.]]), - columns=['A', 'B', 'C', 'A__x__B', 'A__x__C', 'B__x__C'] - ).astype(np.int16) - return obj, X, X_expected - - -@ pytest.fixture -def data_all_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float32) - obj = PolynomialFeatures( - interaction_only=False, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 0., 1., 2., 4.], - [3., 4., 5., 9., 12., 15., 16., 20., 25.], - [6., 7., 8., 36., 42., 48., 49., 56., 64.]]), - columns=['A', 'B', 'C', 'A__x__A', 'A__x__B', - 'A__x__C', 'B__x__B', 'B__x__C', 'C__x__C'] - ).astype(np.float32) - return obj, X, X_expected - - -@ pytest.fixture -def data_degree_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=False, degree=3, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 0., 1., 2., 4., 0., 0., - 0., 0., 0., 0., 1., 2., 4., 8.], - [3., 4., 5., 9., 12., 15., 16., 20., 25., 27., 36., - 45., 48., 60., 75., 64., 80., 100., 125.], - [6., 7., 8., 36., 42., 48., 49., 56., 64., 216., 252., - 288., 294., 336., 384., 343., 392., 448., 512.]]), - columns=['A', 'B', 'C', 'A__x__A', 'A__x__B', 'A__x__C', 'B__x__B', 'B__x__C', 'C__x__C', - 'A__x__A__x__A', 'A__x__A__x__B', 'A__x__A__x__C', 'A__x__B__x__B', 'A__x__B__x__C', - 'A__x__C__x__C', 'B__x__B__x__B', 'B__x__B__x__C', 'B__x__C__x__C', 'C__x__C__x__C'] - ) - return obj, X, X_expected - - -@ pytest.fixture -def data_inter_degree_ks(): - X = ks.DataFrame(np.arange(9).reshape( - 3, 3), columns=list('ABC'), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=True, degree=3, columns=['A', 'B', 'C']).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 0., 0., 2., 0.], - [3., 4., 5., 12., 15., 20., 60.], - [6., 7., 8., 42., 48., 56., 336.]]), - columns=['A', 'B', 'C', 'A__x__B', - 'A__x__C', 'B__x__C', 'A__x__B__x__C'] - ) - return obj, X, X_expected - - -@ pytest.fixture -def data_subset_ks(): - X = ks.DataFrame(np.arange(12).reshape( - 3, 4), columns=list('ABCD'), dtype=np.float64) - - obj = PolynomialFeatures( - columns=['A', 'B', 'C'], interaction_only=True, degree=2).fit(X) - X_expected = pd.DataFrame(np.array( - [[0., 1., 2., 3., 0., 0., 2.], - [4., 5., 6., 7., 20., 24., 30.], - [8., 9., 10., 11., 72., 80., 90.]]), - columns=['A', 'B', 'C', 'D', 'A__x__B', 'A__x__C', 'B__x__C'] - ) - return obj, X, X_expected - - -def test_inter_pd(data_inter): - obj, X, X_expected = data_inter - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_ks(data_inter_ks): - obj, X, X_expected = data_inter_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_inter_pd_np(data_inter): - obj, X, X_expected = data_inter - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_ks_np(data_inter_ks): - obj, X, X_expected = data_inter_ks - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -def test_int16_inter_pd(data_int16_inter): - obj, X, X_expected = data_int16_inter - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_inter_ks(data_int16_inter_ks): - obj, X, X_expected = data_int16_inter_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_inter_pd_np(data_int16_inter): - obj, X, X_expected = data_int16_inter - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_inter_ks_np(data_int16_inter_ks): - obj, X, X_expected = data_int16_inter_ks - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -def test_all_pd(data_all): - obj, X, X_expected = data_all - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_all_ks(data_all_ks): - obj, X, X_expected = data_all_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_all_pd_np(data_all): - obj, X, X_expected = data_all - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_all_ks_np(data_all_ks): - obj, X, X_expected = data_all_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_degree_pd(data_degree): - obj, X, X_expected = data_degree - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_degree_ks(data_degree_ks): - obj, X, X_expected = data_degree_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_degree_pd_np(data_degree): - obj, X, X_expected = data_degree - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_degree_ks_np(data_degree_ks): - obj, X, X_expected = data_degree_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_inter_degree_pd(data_inter_degree): - obj, X, X_expected = data_inter_degree - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_degree_ks(data_inter_degree_ks): - obj, X, X_expected = data_inter_degree_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_inter_degree_pd_np(data_inter_degree): - obj, X, X_expected = data_inter_degree - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_degree_ks_np(data_inter_degree_ks): - obj, X, X_expected = data_inter_degree_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_subset_pd(data_subset): - obj, X, X_expected = data_subset - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_subset_ks(data_subset_ks): - obj, X, X_expected = data_subset_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_subset_pd_np(data_subset): - obj, X, X_expected = data_subset - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_subset_ks_np(data_subset): - obj, X, X_expected = data_subset - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = PolynomialFeatures( - columns='A', degree=2, interaction_only=True) - with pytest.raises(ValueError): - _ = PolynomialFeatures( - columns=['A'], degree=2, interaction_only=True) - with pytest.raises(ValueError): - _ = PolynomialFeatures( - columns=['A'], degree=1, interaction_only=False) - with pytest.raises(TypeError): - _ = PolynomialFeatures( - columns=['A', 'B'], degree=1.1, interaction_only=True) - with pytest.raises(TypeError): - _ = PolynomialFeatures( - columns=['A', 'B'], degree=2, interaction_only='x') - with pytest.raises(ValueError): - _ = PolynomialFeatures( - columns=[], degree=2) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/__init__.py deleted file mode 100644 index 359e47d4..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -from ._base_datetime_feature import _BaseDatetimeFeature -from .cyclic_minute_of_hour import CyclicMinuteOfHour -from .cyclic_day_of_month import CyclicDayOfMonth -from .cyclic_day_of_week import CyclicDayOfWeek -from .cyclic_hour_of_day import CyclicHourOfDay -from .cyclic_month_of_year import CyclicMonthOfYear -from .ordinal_minute_of_hour import OrdinalMinuteOfHour -from .ordinal_day_of_month import OrdinalDayOfMonth -from .ordinal_day_of_week import OrdinalDayOfWeek -from .ordinal_hour_of_day import OrdinalHourOfDay -from .ordinal_month_of_year import OrdinalMonthOfYear -from .delta_time import DeltaTime - -__all__ = [ - '_BaseDatetimeFeature', - 'CyclicMinuteOfHour', - 'CyclicDayOfMonth', - 'CyclicDayOfWeek', - 'CyclicHourOfDay', - 'CyclicMonthOfYear', - 'OrdinalMinuteOfHour', - 'OrdinalDayOfMonth', - 'OrdinalDayOfWeek', - 'OrdinalHourOfDay', - 'OrdinalMonthOfYear', - 'DeltaTime', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/_base_datetime_feature.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/_base_datetime_feature.py deleted file mode 100644 index 9a573738..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/_base_datetime_feature.py +++ /dev/null @@ -1,80 +0,0 @@ -# Licence Apache-2.0 -from ..transformers.transformer import Transformer -from ..util import util -from typing import List, Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class _BaseDatetimeFeature(Transformer): - """Base datetime transformer class. - - Parameters - ---------- - columns : List[str] - List of columns. - column_names : List[str], default to None. - List of column names. - column_mapping: Dict[str, List[str]] - Mapping between generated features and base features. - - """ - - def __init__(self, columns: List[str], column_names: List[str], - column_mapping: Dict[str, str]): - Transformer.__init__(self) - self.columns = columns - self.column_names = column_names - self.column_mapping = column_mapping - self.idx_columns: np.ndarray = np.array([]) - self.n_columns = len(self.columns) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> '_BaseDatetimeFeature': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : pd.DataFrame - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Target values. - - Returns - ------- - _BaseDatetimeFeature - Instance of itself. - """ - self.check_dataframe(X) - X_datetime_dtype = X.iloc[:100][self.columns].dtypes - for column in self.columns: - if not np.issubdtype(X_datetime_dtype[column], np.datetime64): - raise TypeError( - """ - Datetime columns should be of subtype np.datetime64. - Use `ConvertColumnDatatype` to convert the dtype. - """) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns, - ) - return self - - @staticmethod - def get_cyclic_column_names(columns: List[str], pattern: str): - """Get the column names. - - Parameters - ---------- - columns : List[str] - List of datetime features. - pattern: str - Pattern. - """ - column_names = [] - for c in columns: - column_names.append(f'{c}__{pattern}_cos') - column_names.append(f'{c}__{pattern}_sin') - return column_names diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_month.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_month.py deleted file mode 100644 index 7c4f39a5..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_month.py +++ /dev/null @@ -1,175 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -from math import pi -import numpy as np -import pandas as pd -import databricks.koalas as ks - -TWO_PI = 2 * pi - - -class CyclicDayOfMonth(_BaseDatetimeFeature): - """Create new columns based on the cyclic mapping of the day of the month. - - Parameters - ---------- - columns: List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month_cos A__day_of_month_sin - 0 2020-01-01 23:00:00 0 1.000000 0.000000 - 1 2020-12-15 18:00:00 1 -0.978148 0.207912 - 2 NaT 0 NaN NaN - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month_cos A__day_of_month_sin - 0 2020-01-01 23:00:00 0 1.000000 0.000000 - 1 2020-12-15 18:00:00 1 -0.978148 0.207912 - 2 NaT 0 NaN NaN - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338057, - 0.2079116908177593], - [NaT, 0, nan, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338057, - 0.2079116908177593], - [NaT, 0, nan, nan]], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = self.get_cyclic_column_names(columns, 'day_of_month') - column_mapping = { - name: col for name, col in zip(column_names, columns + columns)} - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame]) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return self.compute_cyclic_day_of_month( - X, self.columns, self.column_names) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - - self.check_array(X) - return feature_gen_dt.cyclic_day_of_month( - X, self.idx_columns) - - @ staticmethod - def compute_cyclic_day_of_month( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Compute the cyclic day of the month features. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe of cyclic day of the month features. - """ - - def f_cos(x): - day_of_month = x.dt.day - 1 - n_days_in_month = x.dt.daysinmonth - 1 - prefactors = 2 * np.pi / n_days_in_month - return np.cos(prefactors * day_of_month) - - def f_sin(x): - day_of_month = x.dt.day - 1 - n_days_in_month = x.dt.daysinmonth - 1 - prefactors = 2 * np.pi / n_days_in_month - return np.sin(prefactors * day_of_month) - - if isinstance(X, pd.DataFrame): - for i, col in enumerate(columns): - X_cos = X[[col]].apply(f_cos) - X_cos.columns = [column_names[2*i]] - X_sin = X[[col]].apply(f_sin) - X_sin.columns = [column_names[2*i+1]] - X = X.join(X_cos.join(X_sin)) - return X - - for i, col in enumerate(columns): - n_days_in_month = X[col].dt.daysinmonth - 1 - prefactors = 2 * np.pi / n_days_in_month - X = X.assign( - dummy_cos=np.cos(prefactors * (X[col].dt.day - 1.)), - dummy_sin=np.sin(prefactors * (X[col].dt.day - 1.)) - ).rename( - columns={ - 'dummy_cos': column_names[2*i], - 'dummy_sin': column_names[2*i+1]} - ) - return X diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_week.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_week.py deleted file mode 100644 index f8fea727..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_day_of_week.py +++ /dev/null @@ -1,162 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -import numpy as np -from typing import List, Union -from math import pi -import pandas as pd -import databricks.koalas as ks - - -PREFACTOR = 2 * pi / 6. - - -class CyclicDayOfWeek(_BaseDatetimeFeature): - """Create new columns based on the cyclic mapping of the day of the week. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week_cos A__day_of_week_sin - 0 2020-01-01 23:00:00 0 -0.5 0.866025 - 1 2020-12-15 18:00:00 1 0.5 0.866025 - 2 NaT 0 NaN NaN - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week_cos A__day_of_week_sin - 0 2020-01-01 23:00:00 0 -0.5 0.866025 - 1 2020-12-15 18:00:00 1 0.5 0.866025 - 2 NaT 0 NaN NaN - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, - 0.8660254037844388], - [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, - 0.8660254037844386], - [NaT, 0, nan, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, - 0.8660254037844388], - [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, - 0.8660254037844386], - [NaT, 0, nan, nan]], dtype=object) - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = self.get_cyclic_column_names(columns, 'day_of_week') - column_mapping = { - name: col for name, col in zip(column_names, columns + columns)} - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return self.compute_cyclic_day_of_week( - X, self.columns, self.column_names) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return feature_gen_dt.cyclic_day_of_week( - X, self.idx_columns, PREFACTOR) - - @ staticmethod - def compute_cyclic_day_of_week( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str]) -> Union[pd.DataFrame, ks.DataFrame]: - """Compute the cyclic day of the week features. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. - columns: str - List of datetime columns. - column_names: str - List of datetime column names. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe of cyclic day of the week features. - """ - if isinstance(X, pd.DataFrame): - dummy = X[columns].apply( - lambda x: PREFACTOR * x.dt.dayofweek) - X_cyclic = dummy.agg(['cos', 'sin']) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * X[col].dt.dayofweek), - dummy_sin=np.sin(PREFACTOR * X[col].dt.dayofweek) - ).rename( - columns={ - 'dummy_cos': column_names[2*i], - 'dummy_sin': column_names[2*i+1]} - ) - return X diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_hour_of_day.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_hour_of_day.py deleted file mode 100644 index 6465eef3..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_hour_of_day.py +++ /dev/null @@ -1,161 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -from math import pi -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -PREFACTOR = 2 * pi / 23. - - -class CyclicHourOfDay(_BaseDatetimeFeature): - """Create new columns based on the cyclic mapping of the hour of the day. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day_cos A__hour_of_day_sin - 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 - 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 - 2 NaT 0 NaN NaN - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day_cos A__hour_of_day_sin - 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 - 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 - 2 NaT 0 NaN NaN - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, - -2.4492935982947064e-16], - [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, - -0.979084087682323], - [NaT, 0, nan, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, - -2.4492935982947064e-16], - [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, - -0.979084087682323], - [NaT, 0, nan, nan]], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = self.get_cyclic_column_names(columns, 'hour_of_day') - column_mapping = { - name: col for name, col in zip(column_names, columns + columns)} - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return self.compute_cyclic_hour_of_day( - X, self.columns, self.column_names) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return feature_gen_dt.cyclic_hour_of_day( - X, self.idx_columns, PREFACTOR) - - @ staticmethod - def compute_cyclic_hour_of_day( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Compute the cyclic hours of the day features. - - Parameters - ---------- - X_datetime : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe of cyclic hours of the day features. - """ - if isinstance(X, pd.DataFrame): - X_cyclic = X[columns].apply( - lambda x: PREFACTOR * x.dt.hour - ).agg(['cos', 'sin']) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * X[col].dt.hour), - dummy_sin=np.sin(PREFACTOR * X[col].dt.hour) - ).rename( - columns={ - 'dummy_cos': column_names[2*i], - 'dummy_sin': column_names[2*i+1]} - ) - return X diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_minute_of_hour.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_minute_of_hour.py deleted file mode 100644 index a20b0f0f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_minute_of_hour.py +++ /dev/null @@ -1,162 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -from math import pi -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -PREFACTOR = 2 * pi / 59. - - -class CyclicMinuteOfHour(_BaseDatetimeFeature): - """Create new columns based on the cyclic mapping of the minute of the hour. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = pd.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour_cos A__minute_of_hour_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour_cos A__minute_of_hour_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = pd.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:59:00'), 1, 1.0, - -2.4492935982947064e-16], - [NaT, 0, nan, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:59:00'), 1, 1.0, - -2.4492935982947064e-16], - [NaT, 0, nan, nan]], dtype=object) - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = self.get_cyclic_column_names(columns, 'minute_of_hour') - column_mapping = { - name: col for name, col in zip(column_names, columns + columns)} - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return self.compute_cyclic_minute_of_hour( - X, self.columns, self.column_names) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return feature_gen_dt.cyclic_minute_of_hour( - X, self.idx_columns, PREFACTOR) - - @ staticmethod - def compute_cyclic_minute_of_hour( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Compute the cyclic hours of the day features. - - Parameters - ---------- - X_datetime : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe of cyclic hours of the day features. - """ - if isinstance(X, pd.DataFrame): - X_cyclic = X[columns].apply( - lambda x: PREFACTOR * x.dt.minute - ).agg(['cos', 'sin']) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * X[col].dt.minute), - dummy_sin=np.sin(PREFACTOR * X[col].dt.minute) - ).rename( - columns={ - 'dummy_cos': column_names[2*i], - 'dummy_sin': column_names[2*i+1]} - ) - return X diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_month_of_year.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_month_of_year.py deleted file mode 100644 index ddf8237f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/cyclic_month_of_year.py +++ /dev/null @@ -1,161 +0,0 @@ -# Licence Apache-2.0 -from ._base_datetime_feature import _BaseDatetimeFeature -import feature_gen_dt -from typing import List, Union -from math import pi -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -PREFACTOR = 2 * pi / 11. - - -class CyclicMonthOfYear(_BaseDatetimeFeature): - """Create new columns based on the cyclic mapping of the month of the year. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year_cos A__month_of_year_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year_cos A__month_of_year_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, 1.0, - -2.4492935982947064e-16], - [NaT, 0, nan, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, 1.0, - -2.4492935982947064e-16], - [NaT, 0, nan, nan]], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = self.get_cyclic_column_names(columns, 'month_of_year') - column_mapping = { - name: col for name, col in zip(column_names, columns + columns)} - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - return self.compute_cyclic_month_of_year( - X, self.columns, self.column_names) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return feature_gen_dt.cyclic_month_of_year( - X, self.idx_columns, PREFACTOR) - - @ staticmethod - def compute_cyclic_month_of_year( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Compute the cyclic hours of the day features. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. - - column_names : List[str], default to None. - List of column names. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe of cyclic hours of the day features. - """ - if isinstance(X, pd.DataFrame): - dummy = X[columns].apply(lambda x: PREFACTOR * (x.dt.month - 1.)) - X_cyclic = dummy.agg(['cos', 'sin']) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * (X[col].dt.month - 1.)), - dummy_sin=np.sin(PREFACTOR * (X[col].dt.month - 1.)) - ).rename( - columns={ - 'dummy_cos': column_names[2*i], - 'dummy_sin': column_names[2*i+1]} - ) - return X diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/delta_time.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/delta_time.py deleted file mode 100644 index 44d32f93..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/delta_time.py +++ /dev/null @@ -1,193 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ..util import util -from ..transformers import Transformer -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class DeltaTime(Transformer): - """Create new columns based on the time difference in sec. between two columns. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import DeltaTime - >>> X = pd.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], - ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> obj.fit_transform(X) - A B C C__A__Deltatime[s] - 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 - 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 - 2 NaT 0 NaT NaN - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import DeltaTime - >>> X = ks.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], - ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> obj.fit_transform(X) - A B C C__A__Deltatime[s] - 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 - 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 - 2 NaT 0 NaT NaN - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import DeltaTime - >>> X = pd.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], - ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, - Timestamp('2020-01-02 05:00:00'), 21600.0], - [Timestamp('2020-01-15 18:00:00'), 1, - Timestamp('2020-01-15 23:00:00'), 18000.0], - [NaT, 0, NaT, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import DeltaTime - >>> X = ks.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], - ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, - Timestamp('2020-01-02 05:00:00'), 21600.0], - [Timestamp('2020-01-15 18:00:00'), 1, - Timestamp('2020-01-15 23:00:00'), 18000.0], - [NaT, 0, NaT, nan]], dtype=object) - - - - """ - - def __init__(self, columns_a: List[str], columns_b: List[str]): - Transformer.__init__(self) - if not isinstance(columns_a, list): - raise TypeError('`columns_a` should be a list.') - if not columns_a: - raise ValueError('`columns_a` should not be empty.') - if not isinstance(columns_b, list): - raise TypeError('`columns_b` should be a list.') - if not columns_b: - raise ValueError('`columns_b` should not be empty.') - if len(columns_b) != len(columns_a): - raise ValueError( - '`columns_a` and `columns_b` should have the same length.') - self.unit = 's' - self.columns_a = columns_a - self.columns_b = columns_b - self.deltatime_dtype = f'timedelta64[{self.unit}]' - self.column_names = [ - f'{c_a}__{c_b}__Deltatime[{self.unit}]' - for c_a, c_b in zip(columns_a, columns_b) - ] - self.column_mapping = { - name: [c_a, c_b] for name, c_a, c_b - in zip(self.column_names, columns_a, columns_b) - } - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'DeltaTime': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : pd.DataFrame - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Target values. - - Returns - ------- - DeltaTime - Instance of itself. - """ - self.check_dataframe(X) - columns = list(set(self.columns_a+self.columns_b)) - X_datetime_dtype = X.iloc[:5000][columns].dtypes - for column in columns: - if not np.issubdtype(X_datetime_dtype[column], np.datetime64): - raise TypeError( - """ - Datetime columns should be of subtype np.datetime64. - Use `ConvertColumnDatatype` to convert the dtype. - """) - self.idx_columns_a = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns_a, - ) - self.idx_columns_b = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns_b, - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): - X.loc[:, name] = (X[c_a] - X[c_b]).astype(self.deltatime_dtype) - return X - for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): - X = X.assign( - dummy=(X[c_a].astype(float) - X[c_b].astype(float))).rename( - columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: - Array with the datetime features added. - """ - self.check_array(X) - return feature_gen_dt.deltatime( - X, self.idx_columns_a, self.idx_columns_b) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.pyx deleted file mode 100644 index 46855dd0..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.pyx +++ /dev/null @@ -1,219 +0,0 @@ -import cython -import numpy as np -cimport numpy as np -from libc.math cimport pi -from libc.math cimport cos -from libc.math cimport sin -from libc.math cimport isnan - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_minute_of_hour( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].minute)) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_hour_of_day( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].hour)) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_day_of_week( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].dayofweek)) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_day_of_month( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols),object) - cdef object val - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].day)) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_month_of_year( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].month)) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_minute_of_hour( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - double PREFACTOR, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) - cdef double val - for i in range(n_rows): - for j in range(n_cols): - val = PREFACTOR * X[i, idx_columns[j]].minute - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_hour_of_day( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - double PREFACTOR, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) - cdef double val - for i in range(n_rows): - for j in range(n_cols): - val = PREFACTOR * X[i, idx_columns[j]].hour - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_day_of_week( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - double PREFACTOR, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) - cdef double val - for i in range(n_rows): - for j in range(n_cols): - val = PREFACTOR * X[i, idx_columns[j]].dayofweek - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_month_of_year( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - double PREFACTOR, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) - cdef double val - for i in range(n_rows): - for j in range(n_cols): - val = PREFACTOR * (X[i, idx_columns[j]].month - 1.) - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_day_of_month( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) - cdef double val - for i in range(n_rows): - for j in range(n_cols): - val = 2 * pi *( X[i, idx_columns[j]].day - 1.) / (X[i, idx_columns[j]].daysinmonth - 1.) - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] deltatime( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_a, - np.ndarray[np.int64_t, ndim=1] idx_columns_b, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) - cdef object val_a - cdef object val_b - for i in range(n_rows): - for j in range(n_cols): - val_a = X[i, idx_columns_a[j]] - val_b = X[i, idx_columns_b[j]] - X_new[i, j] = (val_a - val_b).total_seconds() - return np.concatenate((X, X_new), axis=1) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_month.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_month.py deleted file mode 100644 index a00211cc..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_month.py +++ /dev/null @@ -1,123 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class OrdinalDayOfMonth(_BaseDatetimeFeature): - """Create new columns based on the day of the month. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 15.0 - 2 NaT 0 nan - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 15.0 - 2 NaT 0 nan - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], - [NaT, 0, 'nan']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], - [NaT, 0, 'nan']], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = [f'{c}__day_of_month' for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.day.astype(np.float64).astype(str)) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].dt.day.astype(np.float64).astype(str) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: Dataset with the Tree features. - """ - self.check_array(X) - return feature_gen_dt.ordinal_day_of_month( - X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_week.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_week.py deleted file mode 100644 index 19ee25ab..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_day_of_week.py +++ /dev/null @@ -1,125 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class OrdinalDayOfWeek(_BaseDatetimeFeature): - """Create new columns based on the day of the week. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week - 0 2020-01-01 23:00:00 0 2.0 - 1 2020-12-15 18:00:00 1 1.0 - 2 NaT 0 nan - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week - 0 2020-01-01 23:00:00 0 2.0 - 1 2020-12-15 18:00:00 1 1.0 - 2 NaT 0 nan - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], - [NaT, 0, 'nan']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], - [NaT, 0, 'nan']], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = [f'{c}__day_of_week' for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.dayofweek.astype(np.float64).astype(str)) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].dt.dayofweek.astype(np.float64).astype(str) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: - Transformed array. - """ - self.check_array(X) - return feature_gen_dt.ordinal_day_of_week( - X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_hour_of_day.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_hour_of_day.py deleted file mode 100644 index 43665df1..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_hour_of_day.py +++ /dev/null @@ -1,124 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class OrdinalHourOfDay(_BaseDatetimeFeature): - """Create new columns based on the hour of the day. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day - 0 2020-01-01 23:00:00 0 23.0 - 1 2020-12-15 18:00:00 1 18.0 - 2 NaT 0 nan - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day - 0 2020-01-01 23:00:00 0 23.0 - 1 2020-12-15 18:00:00 1 18.0 - 2 NaT 0 nan - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], - [NaT, 0, 'nan']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], - [NaT, 0, 'nan']], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = [f'{c}__hour_of_day' for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.hour.astype(np.float64).astype(str)) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].dt.hour.astype(np.float64).astype(str) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: - Array with the datetime features added. - """ - self.check_array(X) - return feature_gen_dt.ordinal_hour_of_day( - X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_minute_of_hour.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_minute_of_hour.py deleted file mode 100644 index f58946a2..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_minute_of_hour.py +++ /dev/null @@ -1,128 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class OrdinalMinuteOfHour(_BaseDatetimeFeature): - """Create new columns based on the minute of the hour. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour - 0 2020-01-01 23:00:00 0 0.0 - 1 2020-12-15 18:59:00 1 59.0 - 2 NaT 0 nan - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour - 0 2020-01-01 23:00:00 0 0.0 - 1 2020-12-15 18:59:00 1 59.0 - 2 NaT 0 nan - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], - [Timestamp('2020-12-15 18:59:00'), 1, '59.0'], - [NaT, 0, 'nan']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], - [Timestamp('2020-12-15 18:59:00'), 1, '59.0'], - [NaT, 0, 'nan']], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = [f'{c}__minute_of_hour' for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.minute.astype(np.float64).astype(str)) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].dt.minute.astype(np.float64).astype(str) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: - Array with the datetime features added. - """ - self.check_array(X) - return feature_gen_dt.ordinal_minute_of_hour( - X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_month_of_year.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_month_of_year.py deleted file mode 100644 index fd8cc06e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/ordinal_month_of_year.py +++ /dev/null @@ -1,123 +0,0 @@ -# Licence Apache-2.0 -import feature_gen_dt -from ._base_datetime_feature import _BaseDatetimeFeature -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class OrdinalMonthOfYear(_BaseDatetimeFeature): - """Create new columns based on the month of the year. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 12.0 - 2 NaT 0 nan - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 12.0 - 2 NaT 0 nan - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], - [NaT, 0, 'nan']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], - [NaT, 0, 'nan']], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - column_names = [f'{c}__month_of_year' for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__( - self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.month.astype(np.float64).astype(str)) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].dt.month.astype(np.float64).astype(str) - ).rename(columns={'dummy': name}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray: Dataset with the Tree features. - """ - self.check_array(X) - return feature_gen_dt.ordinal_month_of_year( - X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py deleted file mode 100644 index 7ab7520a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py +++ /dev/null @@ -1,21 +0,0 @@ -# Licence Apache-2.0 -from gators.feature_generation_dt.ordinal_day_of_month import OrdinalDayOfMonth -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -def test_init_pd(): - X = pd.DataFrame({'A': [0], 'B': [0]}) - obj = OrdinalDayOfMonth(columns=['A', 'B']) - with pytest.raises(TypeError): - _ = obj.fit(X) - - -@pytest.mark.koalas -def test_init_ks(): - X = ks.DataFrame({'A': [0], 'B': [0]}) - obj = OrdinalDayOfMonth(columns=['A', 'B']) - with pytest.raises(TypeError): - _ = obj.fit(X) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py deleted file mode 100644 index 4fd23b59..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py +++ /dev/null @@ -1,103 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import CyclicDayOfMonth -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2021-02-28T06', None, np.nan], - 'B': ['2020-02-29T06', None, np.nan], - 'C': ['2020-03-01T12', None, np.nan], - 'D': ['2020-04-01T18', None, np.nan], - 'E': ['2020-05-31T23', None, np.nan], - 'X': ['x', 'x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - X_expected = pd.DataFrame({ - 'A__day_of_month_cos': [1.0, np.nan, np.nan], - 'A__day_of_month_sin': [0.0, np.nan, np.nan], - 'B__day_of_month_cos': [1.0, np.nan, np.nan], - 'B__day_of_month_sin': [0.0, np.nan, np.nan], - 'C__day_of_month_cos': [1.0, np.nan, np.nan], - 'C__day_of_month_sin': [0.0, np.nan, np.nan], - 'D__day_of_month_cos': [1.0, np.nan, np.nan], - 'D__day_of_month_sin': [0.0, np.nan, np.nan], - 'E__day_of_month_cos': [1.0, np.nan, np.nan], - 'E__day_of_month_sin': [0.0, np.nan, np.nan]}) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2021-02-28T06', None, np.nan], - 'B': ['2020-02-29T06', None, np.nan], - 'C': ['2020-03-01T12', None, np.nan], - 'D': ['2020-04-01T18', None, np.nan], - 'E': ['2020-05-31T23', None, np.nan], - 'X': ['x', 'x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame({ - 'A__day_of_month_cos': [1.0, np.nan, np.nan], - 'A__day_of_month_sin': [0.0, np.nan, np.nan], - 'B__day_of_month_cos': [1.0, np.nan, np.nan], - 'B__day_of_month_sin': [0.0, np.nan, np.nan], - 'C__day_of_month_cos': [1.0, np.nan, np.nan], - 'C__day_of_month_sin': [0.0, np.nan, np.nan], - 'D__day_of_month_cos': [1.0, np.nan, np.nan], - 'D__day_of_month_sin': [0.0, np.nan, np.nan], - 'E__day_of_month_cos': [1.0, np.nan, np.nan], - 'E__day_of_month_sin': [0.0, np.nan, np.nan]}) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicDayOfMonth(columns=0) - with pytest.raises(ValueError): - _ = CyclicDayOfMonth(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py deleted file mode 100644 index a52f57a2..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py +++ /dev/null @@ -1,105 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import CyclicDayOfWeek -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-05-04T00', None, np.nan], - 'B': ['2020-05-06T06', None, np.nan], - 'C': ['2020-05-08T23', None, np.nan], - 'D': ['2020-05-09T06', None, np.nan], - 'E': ['2020-05-10T06', None, np.nan], - 'X': ['x', None, np.nan], }) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - X_expected = pd.DataFrame( - {'A__day_of_week_cos': [1.0, np.nan, np.nan], - 'A__day_of_week_sin': [0.0, np.nan, np.nan], - 'B__day_of_week_cos': [-0.4999999999999998, np.nan, np.nan], - 'B__day_of_week_sin': [0.8660254037844388, np.nan, np.nan], - 'C__day_of_week_cos': [-0.5000000000000004, np.nan, np.nan], - 'C__day_of_week_sin': [-0.8660254037844384, np.nan, np.nan], - 'D__day_of_week_cos': [0.4999999999999993, np.nan, np.nan], - 'D__day_of_week_sin': [-0.866025403784439, np.nan, np.nan], - 'E__day_of_week_cos': [1.0, None, np.nan], - 'E__day_of_week_sin': [-2.4492935982947064e-16, None, np.nan], } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-05-04T00', None, np.nan], - 'B': ['2020-05-06T06', None, np.nan], - 'C': ['2020-05-08T23', None, np.nan], - 'D': ['2020-05-09T06', None, np.nan], - 'E': ['2020-05-10T06', None, np.nan], - 'X': ['x', None, np.nan], }) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame( - {'A__day_of_week_cos': [1.0, np.nan, np.nan], - 'A__day_of_week_sin': [0.0, np.nan, np.nan], - 'B__day_of_week_cos': [-0.4999999999999998, np.nan, np.nan], - 'B__day_of_week_sin': [0.8660254037844388, np.nan, np.nan], - 'C__day_of_week_cos': [-0.5000000000000004, np.nan, np.nan], - 'C__day_of_week_sin': [-0.8660254037844384, np.nan, np.nan], - 'D__day_of_week_cos': [0.4999999999999993, np.nan, np.nan], - 'D__day_of_week_sin': [-0.866025403784439, np.nan, np.nan], - 'E__day_of_week_cos': [1.0, None, np.nan], - 'E__day_of_week_sin': [-2.4492935982947064e-16, None, np.nan], } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicDayOfWeek(columns=0) - with pytest.raises(ValueError): - _ = CyclicDayOfWeek(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py deleted file mode 100644 index 0c75ee61..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py +++ /dev/null @@ -1,111 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import CyclicHourOfDay -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-01-01T00', None, np.nan], - 'B': ['2020-04-08T06', None, np.nan], - 'C': ['2020-07-16T12', None, np.nan], - 'D': ['2020-10-24T18', None, np.nan], - 'E': ['2020-12-31T23', None, np.nan], - 'X': ['x', 'x', 'x'], - } - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - X_expected = pd.DataFrame({ - 'A__hour_of_day_cos': [1.0, None, np.nan], - 'A__hour_of_day_sin': [0.0, None, np.nan], - 'B__hour_of_day_cos': [-0.06824241336467089, None, np.nan], - 'B__hour_of_day_sin': [0.9976687691905392, None, np.nan], - 'C__hour_of_day_cos': [-0.9906859460363308, None, np.nan], - 'C__hour_of_day_sin': [-0.13616664909624643, None, np.nan], - 'D__hour_of_day_cos': [0.20345601305263328, None, np.nan], - 'D__hour_of_day_sin': [-0.979084087682323, None, np.nan], - 'E__hour_of_day_cos': [1.0, None, np.nan], - 'E__hour_of_day_sin': [-2.4492935982947064e-16, None, np.nan], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-01-01T00', None, np.nan], - 'B': ['2020-04-08T06', None, np.nan], - 'C': ['2020-07-16T12', None, np.nan], - 'D': ['2020-10-24T18', None, np.nan], - 'E': ['2020-12-31T23', None, np.nan], - 'X': ['x', 'x', 'x'], - } - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame({ - 'A__hour_of_day_cos': [1.0, None, np.nan], - 'A__hour_of_day_sin': [0.0, None, np.nan], - 'B__hour_of_day_cos': [-0.06824241336467089, None, np.nan], - 'B__hour_of_day_sin': [0.9976687691905392, None, np.nan], - 'C__hour_of_day_cos': [-0.9906859460363308, None, np.nan], - 'C__hour_of_day_sin': [-0.13616664909624643, None, np.nan], - 'D__hour_of_day_cos': [0.20345601305263328, None, np.nan], - 'D__hour_of_day_sin': [-0.979084087682323, None, np.nan], - 'E__hour_of_day_cos': [1.0, None, np.nan], - 'E__hour_of_day_sin': [-2.4492935982947064e-16, None, np.nan], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicHourOfDay(columns=0) - with pytest.raises(ValueError): - _ = CyclicHourOfDay(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py deleted file mode 100644 index f13a753d..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py +++ /dev/null @@ -1,105 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import CyclicMinuteOfHour -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-05-04 00:00:00', pd.NaT], - 'B': ['2020-05-06 00:10:00', pd.NaT], - 'C': ['2020-05-08 00:20:00', pd.NaT], - 'D': ['2020-05-09 00:40:00', pd.NaT], - 'E': ['2020-05-09 00:59:00', pd.NaT], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[m]') - X_expected = pd.DataFrame({ - 'A__minute_of_hour_cos': [1.0, np.nan], - 'A__minute_of_hour_sin': [0.0, np.nan], - 'B__minute_of_hour_cos': [0.48455087033265026, np.nan], - 'B__minute_of_hour_sin': [0.8747630845319612, np.nan], - 'C__minute_of_hour_cos': [-0.5304209081197424, np.nan], - 'C__minute_of_hour_sin': [0.847734427889671, np.nan], - 'D__minute_of_hour_cos': [-0.43730732045885556, np.nan], - 'D__minute_of_hour_sin': [-0.8993121301712191, np.nan], - 'E__minute_of_hour_cos': [1.0, np.nan], - 'E__minute_of_hour_sin': [-2.4492935982947064e-16, np.nan]}) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-05-04 00:00:00', None], - 'B': ['2020-05-06 00:10:00', None], - 'C': ['2020-05-08 00:20:00', None], - 'D': ['2020-05-09 00:40:00', None], - 'E': ['2020-05-09 00:59:00', None], - 'X': ['x', 'x']} - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame({ - 'A__minute_of_hour_cos': [1.0, np.nan], - 'A__minute_of_hour_sin': [0.0, np.nan], - 'B__minute_of_hour_cos': [0.48455087033265026, np.nan], - 'B__minute_of_hour_sin': [0.8747630845319612, np.nan], - 'C__minute_of_hour_cos': [-0.5304209081197424, np.nan], - 'C__minute_of_hour_sin': [0.847734427889671, np.nan], - 'D__minute_of_hour_cos': [-0.43730732045885556, np.nan], - 'D__minute_of_hour_sin': [-0.8993121301712191, np.nan], - 'E__minute_of_hour_cos': [1.0, np.nan], - 'E__minute_of_hour_sin': [-2.4492935982947064e-16, np.nan]} - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicMinuteOfHour(columns=0) - with pytest.raises(ValueError): - _ = CyclicMinuteOfHour(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py deleted file mode 100644 index 1b786a4b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py +++ /dev/null @@ -1,103 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import CyclicMonthOfYear -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-01-01T00', pd.NaT, None], - 'B': ['2020-04-08T06', pd.NaT, None], - 'C': ['2020-07-16T12', pd.NaT, None], - 'D': ['2020-10-24T18', pd.NaT, None], - 'E': ['2020-12-31T23', pd.NaT, None], - 'X': ['x', 'x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - X_expected = pd.DataFrame({ - 'A__month_of_year_cos': [1.0, np.nan, np.nan], - 'A__month_of_year_sin': [0.0, np.nan, np.nan], - 'B__month_of_year_cos': [-0.142314838273285, np.nan, np.nan], - 'B__month_of_year_sin': [0.9898214418809328, np.nan, np.nan], - 'C__month_of_year_cos': [-0.9594929736144975, np.nan, np.nan], - 'C__month_of_year_sin': [-0.28173255684142945, np.nan, np.nan], - 'D__month_of_year_cos': [0.41541501300188605, np.nan, np.nan], - 'D__month_of_year_sin': [-0.9096319953545186, np.nan, np.nan], - 'E__month_of_year_cos': [1.0, np.nan, np.nan], - 'E__month_of_year_sin': [-1.133107779529596e-16, np.nan, np.nan]}) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-01-01T00', pd.NaT, None], - 'B': ['2020-04-08T06', pd.NaT, None], - 'C': ['2020-07-16T12', pd.NaT, None], - 'D': ['2020-10-24T18', pd.NaT, None], - 'E': ['2020-12-31T23', pd.NaT, None], - 'X': ['x', 'x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame({ - 'A__month_of_year_cos': [1.0, np.nan, np.nan], - 'A__month_of_year_sin': [0.0, np.nan, np.nan], - 'B__month_of_year_cos': [-0.142314838273285, np.nan, np.nan], - 'B__month_of_year_sin': [0.9898214418809328, np.nan, np.nan], - 'C__month_of_year_cos': [-0.9594929736144975, np.nan, np.nan], - 'C__month_of_year_sin': [-0.28173255684142945, np.nan, np.nan], - 'D__month_of_year_cos': [0.41541501300188605, np.nan, np.nan], - 'D__month_of_year_sin': [-0.9096319953545186, np.nan, np.nan], - 'E__month_of_year_cos': [1.0, np.nan, np.nan], - 'E__month_of_year_sin': [-1.133107779529596e-16, np.nan, np.nan]}) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.fit_transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicMonthOfYear(columns=0) - with pytest.raises(ValueError): - _ = CyclicMonthOfYear(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_delta_time.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_delta_time.py deleted file mode 100644 index abdd5308..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_delta_time.py +++ /dev/null @@ -1,123 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt.delta_time import DeltaTime -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': {0: '2020-05-04 00:00:00', 1: pd.NaT}, - 'B': {0: '2020-05-04 06:00:00', 1: pd.NaT}, - 'C': {0: '2020-05-04 12:00:00', 1: pd.NaT}, - 'D': {0: '2020-05-04 18:00:00', 1: pd.NaT}, - 'E': {0: '2020-05-04 23:00:00', 1: pd.NaT}, - 'X': {0: 'x', 1: 'x'}}) - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - - X_expected = pd.DataFrame({ - 'B__A__Deltatime[s]': {0: 21600.0, 1: np.nan}, - 'C__A__Deltatime[s]': {0: 43200.0, 1: np.nan}, - 'D__A__Deltatime[s]': {0: 64800.0, 1: np.nan}, - 'E__A__Deltatime[s]': {0: 82800.0, 1: np.nan}, - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = DeltaTime( - columns_a=['B', 'C', 'D', 'E'], - columns_b=['A', 'A', 'A', 'A']).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': {0: '2020-05-04 00:00:00', 1: pd.NaT}, - 'B': {0: '2020-05-04 06:00:00', 1: pd.NaT}, - 'C': {0: '2020-05-04 12:00:00', 1: pd.NaT}, - 'D': {0: '2020-05-04 18:00:00', 1: pd.NaT}, - 'E': {0: '2020-05-04 23:00:00', 1: pd.NaT}, - 'X': {0: 'x', 1: 'x'}}) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame({ - 'B__A__Deltatime[s]': {0: 21600.0, 1: np.nan}, - 'C__A__Deltatime[s]': {0: 43200.0, 1: np.nan}, - 'D__A__Deltatime[s]': {0: 64800.0, 1: np.nan}, - 'E__A__Deltatime[s]': {0: 82800.0, 1: np.nan}, - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = DeltaTime( - columns_a=['B', 'C', 'D', 'E'], - columns_b=['A', 'A', 'A', 'A']).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = DeltaTime( - columns_a=0, - columns_b=['A', 'A', 'A', 'A']) - with pytest.raises(TypeError): - _ = DeltaTime( - columns_a=['B', 'C', 'D', 'E'], - columns_b=0) - with pytest.raises(ValueError): - _ = DeltaTime( - columns_a=[], - columns_b=['A', 'A', 'A', 'A']) - with pytest.raises(ValueError): - _ = DeltaTime( - columns_a=['B', 'C', 'D', 'E'], - columns_b=[]) - with pytest.raises(ValueError): - _ = DeltaTime( - columns_a=['B'], - columns_b=['A', 'A', 'A', 'A']) - - -def test_init_fit(data): - _, _, X = data - with pytest.raises(TypeError): - _ = DeltaTime( - columns_a=['B', 'C', 'D', 'X'], - columns_b=['A', 'A', 'A', 'A']).fit(X) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py deleted file mode 100644 index 7b2fdc85..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py +++ /dev/null @@ -1,95 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import OrdinalDayOfMonth -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-05-01 00:00:00', np.nan], - 'B': ['2020-05-08 06:00:00', np.nan], - 'C': ['2020-05-16 12:00:00', np.nan], - 'D': ['2020-05-24 18:00:00', None], - 'E': ['2020-05-30 23:00:00', None], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - - X_expected = pd.DataFrame({ - 'A__day_of_month': ['1.0', 'nan'], - 'B__day_of_month': ['8.0', 'nan'], - 'C__day_of_month': ['16.0', 'nan'], - 'D__day_of_month': ['24.0', 'nan'], - 'E__day_of_month': ['30.0', 'nan']}) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-05-01 00:00:00', np.nan], - 'B': ['2020-05-08 06:00:00', np.nan], - 'C': ['2020-05-16 12:00:00', np.nan], - 'D': ['2020-05-24 18:00:00', None], - 'E': ['2020-05-30 23:00:00', None], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - - X_expected = pd.DataFrame({ - 'A__day_of_month': ['1.0', 'nan'], - 'B__day_of_month': ['8.0', 'nan'], - 'C__day_of_month': ['16.0', 'nan'], - 'D__day_of_month': ['24.0', 'nan'], - 'E__day_of_month': ['30.0', 'nan']}) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalDayOfMonth(columns=0) - with pytest.raises(ValueError): - _ = OrdinalDayOfMonth(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py deleted file mode 100644 index e79b9892..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py +++ /dev/null @@ -1,102 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import OrdinalDayOfWeek -from pandas.testing import assert_series_equal -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': {0: '2020-05-04 00:00:00', 1: np.nan}, - 'B': {0: '2020-05-06 06:00:00', 1: np.nan}, - 'C': {0: '2020-05-08 23:00:00', 1: pd.NaT}, - 'D': {0: '2020-05-09 06:00:00', 1: None}, - 'E': {0: '2020-05-10 06:00:00', 1: None}, - 'X': {0: 'x', 1: 'x'}} - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - - X_expected = pd.DataFrame( - {'A__day_of_week': {0: '0.0', 1: 'nan'}, - 'B__day_of_week': {0: '2.0', 1: 'nan'}, - 'C__day_of_week': {0: '4.0', 1: 'nan'}, - 'D__day_of_week': {0: '5.0', 1: 'nan'}, - 'E__day_of_week': {0: '6.0', 1: 'nan'}} - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': {0: '2020-05-04 00:00:00', 1: np.nan}, - 'B': {0: '2020-05-06 06:00:00', 1: np.nan}, - 'C': {0: '2020-05-08 23:00:00', 1: pd.NaT}, - 'D': {0: '2020-05-09 06:00:00', 1: None}, - 'E': {0: '2020-05-10 06:00:00', 1: None}, - 'X': {0: 'x', 1: 'x'}} - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - - X_expected = pd.DataFrame( - {'A__day_of_week': {0: '0.0', 1: 'nan'}, - 'B__day_of_week': {0: '2.0', 1: 'nan'}, - 'C__day_of_week': {0: '4.0', 1: 'nan'}, - 'D__day_of_week': {0: '5.0', 1: 'nan'}, - 'E__day_of_week': {0: '6.0', 1: 'nan'}} - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_series_equal(X_new.dtypes, X_expected.dtypes) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_series_equal(X_new.dtypes, X_expected.dtypes) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalDayOfWeek(columns=0) - with pytest.raises(ValueError): - _ = OrdinalDayOfWeek(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py deleted file mode 100644 index 39f5bfa1..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py +++ /dev/null @@ -1,94 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import OrdinalHourOfDay -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-05-04 00:00:00', pd.NaT], - 'B': ['2020-05-06 06:00:00', pd.NaT], - 'C': ['2020-05-08 12:00:00', pd.NaT], - 'D': ['2020-05-09 18:00:00', pd.NaT], - 'E': ['2020-05-10 23:00:00', pd.NaT], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - - X_expected = pd.DataFrame({ - 'A__hour_of_day': ['0.0', 'nan'], - 'B__hour_of_day': ['6.0', 'nan'], - 'C__hour_of_day': ['12.0', 'nan'], - 'D__hour_of_day': ['18.0', 'nan'], - 'E__hour_of_day': ['23.0', 'nan']}) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-05-04 00:00:00', pd.NaT], - 'B': ['2020-05-06 06:00:00', pd.NaT], - 'C': ['2020-05-08 12:00:00', pd.NaT], - 'D': ['2020-05-09 18:00:00', pd.NaT], - 'E': ['2020-05-10 23:00:00', pd.NaT], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - - X_expected = pd.DataFrame({ - 'A__hour_of_day': ['0.0', 'nan'], - 'B__hour_of_day': ['6.0', 'nan'], - 'C__hour_of_day': ['12.0', 'nan'], - 'D__hour_of_day': ['18.0', 'nan'], - 'E__hour_of_day': ['23.0', 'nan']}) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalHourOfDay(columns=0) - with pytest.raises(ValueError): - _ = OrdinalHourOfDay(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py deleted file mode 100644 index f8a32de0..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py +++ /dev/null @@ -1,98 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import OrdinalMinuteOfHour -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame({ - 'A': ['2020-05-04-T00:00:00', pd.NaT], - 'B': ['2020-05-06-T00:10:00', pd.NaT], - 'C': ['2020-05-08-T00:20:00', pd.NaT], - 'D': ['2020-05-09-T00:40:00', pd.NaT], - 'E': ['2020-05-09-T00:59:00', pd.NaT], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[m]') - - X_expected = pd.DataFrame({ - 'A__minute_of_hour': ['0.0', 'nan'], - 'B__minute_of_hour': ['10.0', 'nan'], - 'C__minute_of_hour': ['20.0', 'nan'], - 'D__minute_of_hour': ['40.0', 'nan'], - 'E__minute_of_hour': ['59.0', 'nan'], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({ - 'A': ['2020-05-04 00:00:00', pd.NaT], - 'B': ['2020-05-06 00:10:00', pd.NaT], - 'C': ['2020-05-08 00:20:00', pd.NaT], - 'D': ['2020-05-09 00:40:00', pd.NaT], - 'E': ['2020-05-09 00:59:00', pd.NaT], - 'X': ['x', 'x']}) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - - X_expected = pd.DataFrame({ - 'A__minute_of_hour': ['0.0', 'nan'], - 'B__minute_of_hour': ['10.0', 'nan'], - 'C__minute_of_hour': ['20.0', 'nan'], - 'D__minute_of_hour': ['40.0', 'nan'], - 'E__minute_of_hour': ['59.0', 'nan'], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalMinuteOfHour(columns=0) - with pytest.raises(ValueError): - _ = OrdinalMinuteOfHour(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py deleted file mode 100644 index 9b52085a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py +++ /dev/null @@ -1,101 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_dt import OrdinalMonthOfYear -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': ['2020-01-01T00', None], - 'B': ['2020-04-08T06', None], - 'C': ['2020-07-16T12', None], - 'D': ['2020-10-24T18', None], - 'E': ['2020-12-31T23', None], - 'X': ['x', 'x'], - } - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X['A'] = X['A'].astype('datetime64[ns]') - X['B'] = X['B'].astype('datetime64[ms]') - X['C'] = X['C'].astype('datetime64[s]') - X['D'] = X['D'].astype('datetime64[m]') - X['E'] = X['E'].astype('datetime64[h]') - - X_expected = pd.DataFrame( - {'A__month_of_year': ['1.0', 'nan'], - 'B__month_of_year': ['4.0', 'nan'], - 'C__month_of_year': ['7.0', 'nan'], - 'D__month_of_year': ['10.0', 'nan'], - 'E__month_of_year': ['12.0', 'nan'], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': ['2020-01-01T00', None], - 'B': ['2020-04-08T06', None], - 'C': ['2020-07-16T12', None], - 'D': ['2020-10-24T18', None], - 'E': ['2020-12-31T23', None], - 'X': ['x', 'x'], - } - ) - columns = ['A', 'B', 'C', 'D', 'E'] - X[columns] = X[columns].astype('datetime64[ns]') - X_expected = pd.DataFrame( - {'A__month_of_year': ['1.0', 'nan'], - 'B__month_of_year': ['4.0', 'nan'], - 'C__month_of_year': ['7.0', 'nan'], - 'D__month_of_year': ['10.0', 'nan'], - 'E__month_of_year': ['12.0', 'nan'], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalMonthOfYear(columns=0) - with pytest.raises(ValueError): - _ = OrdinalMonthOfYear(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/__init__.py deleted file mode 100644 index 1e8d6c19..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -from ._base_string_feature import _BaseStringFeature -from .split_extract import SplitExtract -from .extract import Extract -from .string_contains import StringContains -from .string_length import StringLength -from .lower_case import LowerCase -from .upper_case import UpperCase - -__all__ = [ - 'SplitExtract', - 'Extract', - 'StringContains', - 'StringLength', - 'LowerCase', - 'UpperCase', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/_base_string_feature.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/_base_string_feature.py deleted file mode 100644 index 98a523db..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/_base_string_feature.py +++ /dev/null @@ -1,60 +0,0 @@ -# Licence Apache-2.0 -from ..transformers.transformer import Transformer -from ..util import util -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class _BaseStringFeature(Transformer): - """Base string feature transformer class. - - Parameters - ---------- - columns : List[str] - List of columns. - column_names : List[str], default to None. - List of column names. - - """ - - def __init__(self, columns: List[str], column_names: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - if column_names and not isinstance(column_names, list): - raise TypeError('`column_names` should be a list.') - if column_names and len(column_names) != len(columns): - raise ValueError( - 'Length of `columns` and `column_names` should match.') - Transformer.__init__(self) - self.columns = columns - self.column_names: List[str] = column_names - self.column_mapping = dict(zip(column_names, columns)) - self.idx_columns: np.ndarray = np.array([]) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> '_BaseStringFeature': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : pd.DataFrame - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Target values. - - Returns - ------- - _BaseStringFeature - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns, - ) - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/extract.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/extract.py deleted file mode 100644 index dc480a8b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/extract.py +++ /dev/null @@ -1,165 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from feature_gen_str import extract_str -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from._base_string_feature import _BaseStringFeature - - -class Extract(_BaseStringFeature): - """Create new object columns based on substrings. - - Parameters - ---------- - columns : List[str] - List of columns. - i_min_vec : List[int] - List of indices. - i_max_vec : List[int] - List of indices. - column_names : List[int] - List of column names. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import Extract - >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) - >>> obj.fit_transform(X) - A B A__substring_0_to_1 A__substring_2_to_3 - 0 qwe 1 q e - 1 asd 2 a d - 2 zxc 3 z c - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import Extract - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) - >>> obj.fit_transform(X) - A B A__substring_0_to_1 A__substring_2_to_3 - 0 qwe 1 q e - 1 asd 2 a d - 2 zxc 3 z c - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import Extract - >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 'q', 'e'], - ['asd', 2, 'a', 'd'], - ['zxc', 3, 'z', 'c']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import Extract - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 'q', 'e'], - ['asd', 2, 'a', 'd'], - ['zxc', 3, 'z', 'c']], dtype=object) - - - """ - - def __init__(self, columns: List[str], i_min_vec: List[int], i_max_vec: List[int], - column_names: List[int] = None): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not isinstance(i_min_vec, list): - raise TypeError('`i_min_vec` should be a list.') - if len(columns) != len(i_min_vec): - raise ValueError( - 'Length of `columns` and `i_min_vec` should match.') - if not isinstance(i_max_vec, list): - raise TypeError('`i_max_vec` should be a list.') - if len(columns) != len(i_max_vec): - raise ValueError( - 'Length of `columns` and `i_max_vec` should match.') - if not column_names: - column_names = [ - f'{c}__substring_{i_min}_to_{i_max}' - for c, i_min, i_max in zip(columns, i_min_vec, i_max_vec) - ] - _BaseStringFeature.__init__(self, columns, column_names) - self.i_min_vec = np.array(i_min_vec, int) - self.i_max_vec = np.array(i_max_vec, int) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'Extract': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Extract - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - - for col, i_min, i_max, name in zip( - self.columns, self.i_min_vec, - self.i_max_vec, self.column_names): - X.loc[:, name] = X[col].str.slice( - start=i_min, stop=i_max).replace({'': 'MISSING'}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return extract_str( - X, self.idx_columns, self.i_min_vec, self.i_max_vec - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/feature_gen_str.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/feature_gen_str.pyx deleted file mode 100644 index 0ef84e48..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/feature_gen_str.pyx +++ /dev/null @@ -1,161 +0,0 @@ -# License: Apache-2.0 -cimport cython -cimport numpy as np -import numpy as np - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] extract_str( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[np.int64_t, ndim=1] i_min_vec, - np.ndarray[np.int64_t, ndim=1] i_max_vec, - ): - cdef np.int64_t i - cdef np.int64_t j - cdef np.int64_t k - cdef object value - cdef np.int64_t n_rows = X.shape[0] - cdef np.int64_t n_columns = idx_columns.shape[0] - cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) - for k in range(n_rows): - for i in range(n_columns): - value = X[k, idx_columns[i]] - if value is None or isinstance(value, float) or (i_max_vec[i] > len(value)): - X_new[k, i] = 'MISSING' - continue - X_new[k, i] = X[k, idx_columns[i]][i_min_vec[i]: i_max_vec[i]] - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] split_and_extract_str( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[object, ndim=1] str_split_vec, - np.ndarray[np.int64_t, ndim=1] idx_split_vec): - cdef np.int64_t i - cdef np.int64_t j - cdef np.int64_t k - cdef object value - cdef list value_split - cdef np.int64_t n_rows = X.shape[0] - cdef np.int64_t n_columns = idx_columns.shape[0] - cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) - for k in range(n_rows): - for i in range(n_columns): - value = X[k, idx_columns[i]] - if value is None or isinstance(value, float): - X_new[k, i] = 'MISSING' - continue - value_split = value.split(str_split_vec[i]) - if len(value_split) <= idx_split_vec[i]: - X_new[k, i] = 'MISSING' - continue - X_new[k, i] = value_split[idx_split_vec[i]] - return np.concatenate((X, X_new), axis=1) - - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] string_length( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) - cdef object val - for j in range(n_cols): - for i in range(n_rows): - val = X[i, idx_columns[j]] - if val is None or val == 'nan': - X_new[i, j] = 0 - continue - X_new[i, j] = len(str(val)) - return np.concatenate((X, X_new),axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] contains( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int_t, ndim=1] idx_columns, - np.ndarray[object, ndim=1] contains_vec, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) - cdef object val - for j in range(n_cols): - for i in range(n_rows): - val = contains_vec[j] - if val in X[i, idx_columns[j]]: - X_new[i, j] = 1. - return np.concatenate((X, X_new),axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] upper_case( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - for j in range(n_cols): - for i in range(n_rows): - if X[i, idx_columns[j]] is None or X[i, idx_columns[j]] == 'nan': - continue - X[i, idx_columns[j]] = X[i, idx_columns[j]].upper() - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] lower_case( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - for j in range(n_cols): - for i in range(n_rows): - if X[i, idx_columns[j]] is None or X[i, idx_columns[j]] == 'nan': - continue - X[i, idx_columns[j]] = X[i, idx_columns[j]].lower() - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] isin( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, - np.ndarray[object, ndim=2] values_vec_np, - np.ndarray[np.int64_t, ndim=1] n_values_vec - -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) - for i in range(n_rows): - for j in range(n_cols): - for k in range(n_values_vec[j]): - if X[i, idx_columns[j]] == values_vec_np[j, k]: - X_new[i, j] = 1. - break - return np.concatenate((X, X_new), axis=1) \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/lower_case.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/lower_case.py deleted file mode 100644 index 2ecef8f0..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/lower_case.py +++ /dev/null @@ -1,139 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from feature_gen_str import lower_case -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from._base_string_feature import _BaseStringFeature - - -class LowerCase(_BaseStringFeature): - """Convert the selected columns to lower case. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import LowerCase - >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) - >>> obj.fit_transform(X) - A B - 0 abc abc - 1 ab ab - 2 None - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import LowerCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) - >>> obj.fit_transform(X) - A B - 0 abc abc - 1 ab ab - 2 None - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import LowerCase - >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['abc', 'abc'], - ['ab', 'ab'], - ['', None]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import LowerCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['abc', 'abc'], - ['ab', 'ab'], - ['', None]], dtype=object) - - - """ - - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - self.columns = columns - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'LowerCase': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - LowerCase - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - def f(x): - if x.name in self.columns: - return x.astype(str).str.lower().replace( - {'none': None}) - return x - return X.apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return lower_case(X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/split_extract.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/split_extract.py deleted file mode 100644 index a46b587d..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/split_extract.py +++ /dev/null @@ -1,153 +0,0 @@ -# License: Apache-2.0 -from feature_gen_str import split_and_extract_str -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from._base_string_feature import _BaseStringFeature - - -class SplitExtract(_BaseStringFeature): - """Create new columns based on split strings. - - The transformer applies two steps: - - * split each string element using the given value. - * extract the string of the given split list element. - - Parameters - ---------- - columns : List[str] - List of columns. - - str_split_vec : List[int] - List of separators. - - idx_split_vec : List[int] - List of split indices. - - column_names : List[int] - List of new column names. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import SplitExtract - >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) - >>> obj.fit_transform(X) - A B A__split_by_*_idx_0 A__split_by_*_idx_1 - 0 qw*e 1 qw e - 1 a*qd 2 a qd - 2 zxq* 3 zxq - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import SplitExtract - >>> X = ks.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) - >>> obj.fit_transform(X) - A B A__split_by_*_idx_0 A__split_by_*_idx_1 - 0 qw*e 1 qw e - 1 a*qd 2 a qd - 2 zxq* 3 zxq - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import SplitExtract - >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qw*e', 1, 'qw', 'e'], - ['a*qd', 2, 'a', 'qd'], - ['zxq*', 3, 'zxq', '']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import SplitExtract - >>> X = ks.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qw*e', 1, 'qw', 'e'], - ['a*qd', 2, 'a', 'qd'], - ['zxq*', 3, 'zxq', '']], dtype=object) - - """ - - def __init__(self, columns: List[str], - str_split_vec: List[int], idx_split_vec: List[int], - column_names: List[str] = None): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not isinstance(str_split_vec, list): - raise TypeError('`str_split_vec` should be a list.') - if len(columns) != len(str_split_vec): - raise ValueError( - 'Length of `columns` and `str_split_vec` should match.') - if not isinstance(idx_split_vec, list): - raise TypeError('`idx_split_vec` should be a list.') - if len(columns) != len(idx_split_vec): - raise ValueError( - 'Length of `columns` and `idx_split_vec` should match.') - if not column_names: - column_names = [ - f'{col}__split_by_{split}_idx_{idx}' for - col, split, idx in zip(columns, str_split_vec, idx_split_vec) - ] - _BaseStringFeature.__init__(self, columns, column_names) - self.str_split_vec = np.array(str_split_vec, object) - self.idx_split_vec = np.array(idx_split_vec, int) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for col, idx, str_split, name in zip( - self.columns, self.idx_split_vec, - self.str_split_vec, self.column_names): - n = idx if idx > 0 else 1 - X.loc[:, name] = X[col].str.split(str_split, n=n, expand=True)[ - idx].fillna('MISSING') - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return split_and_extract_str( - X, self.idx_columns, self.str_split_vec, self.idx_split_vec - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/string_contains.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/string_contains.py deleted file mode 100644 index dea8b833..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/string_contains.py +++ /dev/null @@ -1,130 +0,0 @@ -# License: Apache-2.0 -from feature_gen_str import contains -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from._base_string_feature import _BaseStringFeature - - -class StringContains(_BaseStringFeature): - """Create new binary columns. - - The value is 1 if the element contains the given substring and 0 otherwise. - - Parameters - ---------- - columns : List[str] - List of columns. - contains_vec : List[int] - List of substrings. - column_names : List[int], default to None. - List new column names. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringContains - >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> obj.fit_transform(X) - A B A__contains_qw A__contains_we - 0 qwe 1 1.0 1.0 - 1 qwd 2 1.0 0.0 - 2 zwe 3 0.0 1.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> obj.fit_transform(X) - A B A__contains_qw A__contains_we - 0 qwe 1 1.0 1.0 - 1 asd 2 0.0 0.0 - 2 zxc 3 0.0 0.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 1.0, 1.0], - ['asd', 2, 0.0, 0.0], - ['zxc', 3, 0.0, 0.0]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 1.0, 1.0], - ['asd', 2, 0.0, 0.0], - ['zxc', 3, 0.0, 0.0]], dtype=object) - - """ - - def __init__(self, columns: List[str], contains_vec: List[str], - column_names: List[str] = None): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not isinstance(contains_vec, list): - raise TypeError('`contains_vec` should be a list.') - if len(columns) != len(contains_vec): - raise ValueError( - 'Length of `columns` and `contains_vec` should match.') - if not column_names: - column_names = [ - f'{col}__contains_{val}' - for col, val in zip(columns, contains_vec) - ] - _BaseStringFeature.__init__( - self, columns, column_names) - self.contains_vec = np.array(contains_vec, str).astype(object) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for col, val, name in zip( - self.columns, self.contains_vec, self.column_names): - X.loc[:, name] = X[col].str.contains( - val, regex=False).astype(np.float64) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return contains(X, self.idx_columns, self.contains_vec) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/string_length.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/string_length.py deleted file mode 100644 index c700bcd8..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/string_length.py +++ /dev/null @@ -1,139 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from feature_gen_str import string_length -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from._base_string_feature import _BaseStringFeature -pd.options.mode.chained_assignment = None - - -class StringLength(_BaseStringFeature): - """Create new columns based on the length of its elements. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringLength - >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> obj.fit_transform(X) - A B A__length B__length - 0 qwe 1 3.0 1.0 - 1 as 22 2.0 2.0 - 2 333 0.0 3.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> obj.fit_transform(X) - A B A__length B__length - 0 qwe 1 3.0 1.0 - 1 as 22 2.0 2.0 - 2 333 0.0 3.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringLength - >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 3.0, 1.0], - ['as', 22, 2.0, 2.0], - ['', 333, 0.0, 3.0]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 3.0, 1.0], - ['as', 22, 2.0, 2.0], - ['', 333, 0.0, 3.0]], dtype=object) - - - """ - - def __init__(self, columns: List[str], column_names: List[str] = None): - if not column_names: - column_names = [f'{col}__length' for col in columns] - _BaseStringFeature.__init__( - self, columns, column_names) - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'StringLength': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - StringLength - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for col, name in zip(self.columns, self.column_names): - X.loc[:, name] = X.loc[:, col].fillna('').astype(str).replace( - {'nan': ''}).str.len().astype(np.float64) - pass - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return string_length(X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_extract.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_extract.py deleted file mode 100644 index bebca0eb..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_extract.py +++ /dev/null @@ -1,97 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_str import Extract -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1Q', '1QQ'] - X['s'] = ['0', 'W2', 'W2W'] - X['d'] = ['0', 'Q', ''] - obj = Extract( - columns=list('asd'), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a__substring_0_to_1', - 's__substring_1_to_2', 'd__substring_2_to_3'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', '0', 'MISSING', 'MISSING'], - [0.0, 0.0, 0.0, '1Q', 'W2', 'Q', '1', '2', 'MISSING'], - [0.0, 0.0, 0.0, '1QQ', 'W2W', '', '1', '2', 'MISSING']], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1Q', '1QQ'] - X['s'] = ['0', 'W2', 'W2W'] - X['d'] = ['0', 'Q', ''] - obj = Extract( - columns=list('asd'), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a__substring_0_to_1', - 's__substring_1_to_2', 'd__substring_2_to_3'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', '0', 'MISSING', 'MISSING'], - [0.0, 0.0, 0.0, '1Q', 'W2', 'Q', '1', '2', 'MISSING'], - [0.0, 0.0, 0.0, '1QQ', 'W2W', '', '1', '2', 'MISSING']], - columns=columns_expected) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_low_cardinality_init(data): - with pytest.raises(TypeError): - _ = Extract( - columns='x', i_min_vec=[0, 1], i_max_vec=[1, 2] - ) - with pytest.raises(TypeError): - _ = Extract( - columns=['a', 's'], i_min_vec=0, i_max_vec=[1, 2] - ) - with pytest.raises(TypeError): - _ = Extract( - columns=['a', 's'], i_min_vec=[0, 1], i_max_vec=0 - ) - with pytest.raises(ValueError): - _ = Extract( - columns=['a', 's'], i_min_vec=[0], i_max_vec=[1, 2] - ) - with pytest.raises(ValueError): - _ = Extract( - columns=['a', 's'], i_min_vec=[0, 1], i_max_vec=[1] - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_lower_case.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_lower_case.py deleted file mode 100644 index a356cc17..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_lower_case.py +++ /dev/null @@ -1,79 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_str import LowerCase -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['q', 'qq', 'QQq'] - X['s'] = ['w', 'WW', 'WWw'] - X['d'] = ['nan', None, ''] - - obj = LowerCase(columns=list('asd')).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, 'q', 'w', 'nan', ], - [0.0, 0.0, 0.0, 'qq', 'ww', None, ], - [0.0, 0.0, 0.0, 'qqq', 'www', '']], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['q', 'qq', 'QQq'] - X['s'] = ['w', 'WW', 'WWw'] - X['d'] = ['nan', None, ''] - - obj = LowerCase(columns=list('asd')).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, 'q', 'w', 'nan', ], - [0.0, 0.0, 0.0, 'qq', 'ww', None, ], - [0.0, 0.0, 0.0, 'qqq', 'www', '']], - columns=columns_expected) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = LowerCase(columns='x') - with pytest.raises(ValueError): - _ = LowerCase(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_split_extract.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_split_extract.py deleted file mode 100644 index afae698c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_split_extract.py +++ /dev/null @@ -1,99 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_str import SplitExtract -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1*Q', '1Q*QQ'] - X['s'] = ['0', 'W*2', 'W2*WW'] - X['d'] = ['0', 'Q*', 'qwert*'] - - obj = SplitExtract( - list('asd'), list('***'), [1, 1, 0]).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a__split_by_*_idx_1', - 's__split_by_*_idx_1', 'd__split_by_*_idx_0'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', 'MISSING', 'MISSING', '0'], - [0.0, 0.0, 0.0, '1*Q', 'W*2', 'Q*', 'Q', '2', 'Q'], - [0.0, 0.0, 0.0, '1Q*QQ', 'W2*WW', 'qwert*', 'QQ', 'WW', 'qwert']], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1*Q', '1Q*QQ'] - X['s'] = ['0', 'W*2', 'W2*WW'] - X['d'] = ['0', 'Q*', 'qwert*'] - - obj = SplitExtract( - list('asd'), list('***'), [1, 1, 0]).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a__split_by_*_idx_1', - 's__split_by_*_idx_1', 'd__split_by_*_idx_0'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', 'MISSING', 'MISSING', '0'], - [0.0, 0.0, 0.0, '1*Q', 'W*2', 'Q*', 'Q', '2', 'Q'], - [0.0, 0.0, 0.0, '1Q*QQ', 'W2*WW', 'qwert*', 'QQ', 'WW', 'qwert']], - columns=columns_expected) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = SplitExtract( - columns='x', str_split_vec=['+', '-'], idx_split_vec=[1, 2] - ) - with pytest.raises(TypeError): - _ = SplitExtract( - columns=['a', 's'], str_split_vec='+', idx_split_vec=[1, 2] - ) - with pytest.raises(TypeError): - _ = SplitExtract( - columns=['a', 's'], str_split_vec=['+', '-'], idx_split_vec=0 - ) - with pytest.raises(ValueError): - _ = SplitExtract( - columns=['a', 's'], str_split_vec=['+'], idx_split_vec=[1, 2] - ) - with pytest.raises(ValueError): - _ = SplitExtract( - columns=['a', 's'], str_split_vec=['+', '-'], idx_split_vec=[1] - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_string_contains.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_string_contains.py deleted file mode 100644 index 8645222b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_string_contains.py +++ /dev/null @@ -1,171 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_str import StringContains -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1Q', '1QQ'] - X['s'] = ['0', 'W2', 'W2W'] - X['d'] = ['0', 'Q', ''] - - obj = StringContains( - columns=list('asd'), contains_vec=['1', '2', '0']).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', - 'a__contains_1', 's__contains_2', 'd__contains_0'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, '1Q', 'W2', 'Q', 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, '1QQ', 'W2W', '', 1.0, 1.0, 0.0]], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1Q', '1QQ'] - X['s'] = ['0', 'W2', 'W2W'] - X['d'] = ['0', 'Q', ''] - - obj = StringContains( - columns=list('asd'), contains_vec=['1', '2', '0']).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', - 'a__contains_1', 's__contains_2', 'd__contains_0'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, '1Q', 'W2', 'Q', 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, '1QQ', 'W2W', '', 1.0, 1.0, 0.0]], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_with_names(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1Q', '1QQ'] - X['s'] = ['0', 'W2', 'W2W'] - X['d'] = ['0', 'Q', ''] - - obj = StringContains( - columns=list('asd'), - contains_vec=['1', '2', '0'], - column_names=['a_with_1', 's_with_2', 'd_with_0']).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a_with_1', - 's_with_2', 'd_with_0'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, '1Q', 'W2', 'Q', 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, '1QQ', 'W2W', '', 1.0, 1.0, 0.0]], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_with_names_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['0', '1Q', '1QQ'] - X['s'] = ['0', 'W2', 'W2W'] - X['d'] = ['0', 'Q', ''] - - obj = StringContains( - columns=list('asd'), - contains_vec=['1', '2', '0'], - column_names=['a_with_1', 's_with_2', 'd_with_0']).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a_with_1', - 's_with_2', 'd_with_0'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, '0', '0', '0', 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, '1Q', 'W2', 'Q', 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, '1QQ', 'W2W', '', 1.0, 1.0, 0.0]], - columns=columns_expected) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_names_pd(data_with_names): - obj, X, X_expected = data_with_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_with_names_ks): - obj, X, X_expected = data_with_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_names_pd_np(data_with_names): - obj, X, X_expected = data_with_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_names_ks_np(data_with_names_ks): - obj, X, X_expected = data_with_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = StringContains( - columns='x', contains_vec=['z', 'x'], column_names=['aa', 'ss'] - ) - with pytest.raises(TypeError): - _ = StringContains( - columns=['a', 's'], contains_vec='x', column_names=['aa', 'ss'] - ) - with pytest.raises(TypeError): - _ = StringContains( - columns=['a', 's'], contains_vec=['z', 'x'], column_names='x' - ) - with pytest.raises(ValueError): - _ = StringContains( - columns=['a', 's'], contains_vec=['z'], column_names=['aa', 'ss'] - ) - with pytest.raises(ValueError): - _ = StringContains( - columns=['a', 's'], contains_vec=['z', 'x'], column_names=['aa'] - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_string_length.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_string_length.py deleted file mode 100644 index 12d595ce..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_string_length.py +++ /dev/null @@ -1,79 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_str import StringLength -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['Q', 'QQ', 'QQQ'] - X['s'] = ['W', 'WW', 'WWW'] - X['d'] = ['nan', None, ''] - - obj = StringLength(columns=list('asd')).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a__length', 's__length', 'd__length'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, 'Q', 'W', 'nan', 1., 1., 0.], - [0.0, 0.0, 0.0, 'QQ', 'WW', None, 2., 2., 0.], - [0.0, 0.0, 0.0, 'QQQ', 'WWW', '', 3., 3., 0.]], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['Q', 'QQ', 'QQQ'] - X['s'] = ['W', 'WW', 'WWW'] - X['d'] = ['nan', None, ''] - - obj = StringLength(columns=list('asd')).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd', 'a__length', 's__length', 'd__length'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, 'Q', 'W', 'nan', 1., 1., 0.], - [0.0, 0.0, 0.0, 'QQ', 'WW', None, 2., 2., 0.], - [0.0, 0.0, 0.0, 'QQQ', 'WWW', '', 3., 3., 0.]], - columns=columns_expected) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = StringLength(columns='x') - with pytest.raises(ValueError): - _ = StringLength(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_upper_case.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_upper_case.py deleted file mode 100644 index c3587989..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/tests/test_upper_case.py +++ /dev/null @@ -1,79 +0,0 @@ -# License: Apache-2.0 -from gators.feature_generation_str import UpperCase -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['q', 'qq', 'QQq'] - X['s'] = ['w', 'WW', 'WWw'] - X['d'] = ['nan', None, ''] - - obj = UpperCase(columns=list('asd')).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, 'Q', 'W', 'nan', ], - [0.0, 0.0, 0.0, 'QQ', 'WW', None, ], - [0.0, 0.0, 0.0, 'QQQ', 'WWW', '']], - columns=columns_expected) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list('qwe')) - X['a'] = ['q', 'qq', 'QQq'] - X['s'] = ['w', 'WW', 'WWw'] - X['d'] = ['nan', None, ''] - - obj = UpperCase(columns=list('asd')).fit(X) - columns_expected = [ - 'q', 'w', 'e', 'a', 's', 'd'] - X_expected = pd.DataFrame( - [[0.0, 0.0, 0.0, 'Q', 'W', 'nan', ], - [0.0, 0.0, 0.0, 'QQ', 'WW', None, ], - [0.0, 0.0, 0.0, 'QQQ', 'WWW', '']], - columns=columns_expected) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = UpperCase(columns='x') - with pytest.raises(ValueError): - _ = UpperCase(columns=[]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/upper_case.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/upper_case.py deleted file mode 100644 index 42fd1062..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_generation_str/upper_case.py +++ /dev/null @@ -1,142 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from feature_gen_str import upper_case -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from._base_string_feature import _BaseStringFeature - - -class UpperCase(_BaseStringFeature): - """Convert the selected columns to upper case. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import UpperCase - >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) - >>> obj.fit_transform(X) - A B - 0 ABC ABC - 1 AB AB - 2 None - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import UpperCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) - >>> obj.fit_transform(X) - A B - 0 ABC ABC - 1 AB AB - 2 None - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import UpperCase - >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['ABC', 'ABC'], - ['AB', 'AB'], - ['', None]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import UpperCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['ABC', 'ABC'], - ['AB', 'AB'], - ['', None]], dtype=object) - - - """ - - def __init__(self, columns: List[str], column_names: List[str] = None): - if not isinstance(columns, list): - raise TypeError('`columns` should be a list.') - if not columns: - raise ValueError('`columns` should not be empty.') - self.columns = columns - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'StringLength': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - StringLength - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - - def f(x): # -> ks.Series[str]: - if x.name in self.columns: - return x.astype(str).str.upper().replace( - {'NAN': 'nan', 'NONE': None}) - return x - # X[self.columns] = X[self.columns] - return X.apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X: np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return upper_case(X, self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/__init__.py deleted file mode 100644 index 3b9cf443..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from ._base_feature_selection import _BaseFeatureSelection -from .variance_filter import VarianceFilter -from .correlation_filter import CorrelationFilter -from .information_value import InformationValue -from .multiclass_information_value import MultiClassInformationValue -from .regression_information_value import RegressionInformationValue -from .select_from_model import SelectFromModel -from .select_from_models import SelectFromModels - - -__all__ = [ - '_BaseFeatureSelection', - 'SelectFromModel', - 'SelectFromModels', - 'VarianceFilter', - 'CorrelationFilter', - 'InformationValue', - 'MultiClassInformationValue', - 'RegressionInformationValue', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/_base_feature_selection.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/_base_feature_selection.py deleted file mode 100644 index 79a32d79..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/_base_feature_selection.py +++ /dev/null @@ -1,68 +0,0 @@ -# License: Apache-2.0 -from ..transformers.transformer import Transformer -from ..util import util -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class _BaseFeatureSelection(Transformer): - """Base feature selection transformer class. - - Parameters - ---------- - columns: List[str] - List of columns to drop. - selected_columns : List[str] - List of selected columns. - feature_importances_ : pd.Series - Feature importance. - - """ - - def __init__(self): - self.feature_importances_ = pd.Series([], dtype=np.float64) - self.selected_columns: List[str] = [] - self.idx_selected_columns: List[str] = [] - self.columns_to_drop: List[str] = [] - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : np.ndarray - Labels. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if len(self.columns_to_drop): - return X.drop(self.columns_to_drop, axis=1) - else: - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - self.idx_selected_columns.sort() - return X[:, self.idx_selected_columns] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/correlation_filter.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/correlation_filter.py deleted file mode 100644 index 87e7ff4c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/correlation_filter.py +++ /dev/null @@ -1,116 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ._base_feature_selection import _BaseFeatureSelection -from ..util import util - - -class CorrelationFilter(_BaseFeatureSelection): - """Remove highly correlated columns. - - Parameters - ---------- - max_corr : float - Max correlation value tolerated between two columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import CorrelationFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) - >>> obj.fit_transform(X) - B C - 0 1.0 0.00 - 1 2.0 0.00 - 2 3.0 0.15 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import CorrelationFilter - >>> X = ks.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) - >>> obj.fit_transform(X) - B C - 0 1.0 0.00 - 1 2.0 0.00 - 2 3.0 0.15 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import CorrelationFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 0. ], - [2. , 0. ], - [3. , 0.15]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import CorrelationFilter - >>> X = ks.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 0. ], - [2. , 0. ], - [3. , 0.15]]) - - """ - - def __init__(self, max_corr: float): - if not isinstance(max_corr, float): - raise TypeError('`max_corr` should be a float.') - _BaseFeatureSelection.__init__(self) - self.max_corr = max_corr - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'CorrelationFilter': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - CorrelationFilter: Instance of itself. - """ - self.check_dataframe(X) - columns = X.columns - corr = X.corr().abs() - if isinstance(X, ks.DataFrame): - corr = corr.to_pandas() - stacked_corr = (corr.where(np.tril(np.ones(corr.shape), k=-1).astype(np.bool)) - .stack() - .sort_values(ascending=False)) - stacked_corr = stacked_corr.sort_values(ascending=False) - mask = (stacked_corr >= self.max_corr) - self.columns_to_drop = stacked_corr[mask].sort_index( - ).index.get_level_values(1) - self.columns_to_drop = list(set(self.columns_to_drop)) - self.selected_columns = [ - c for c in columns if c not in self.columns_to_drop] - self.feature_importances_ = pd.Series( - 1., index=self.selected_columns, dtype=float) - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/information_value.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/information_value.py deleted file mode 100644 index 437466b6..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/information_value.py +++ /dev/null @@ -1,217 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import numpy as np -import databricks.koalas as ks -import pandas as pd -from ._base_feature_selection import _BaseFeatureSelection -from ..util import util -from ..binning._base_discretizer import _BaseDiscretizer - - -class InformationValue(_BaseFeatureSelection): - """Feature selection based on the information value. - - `InformationValue` accepts only binary variable targets. - - Parameters - ---------- - k : int - Number of features to keep. - discretizer : _BaseDiscretizer - Discretizer transformer. - - See Also - -------- - gators.feature_selection.MultiClassInformationValue - Information value for muti-class classification problems. - gators.feature_selection.RegressionInformationValue - Information value for regression problems. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> from gators.feature_selection import InformationValue - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - """ - - def __init__(self, k: int, discretizer: _BaseDiscretizer): - if not isinstance(k, int): - raise TypeError('`k` should be an int.') - if not isinstance(discretizer, _BaseDiscretizer): - raise TypeError( - '`discretizer` should derive from _BaseDiscretizer.') - _BaseFeatureSelection.__init__(self) - self.k = k - self.discretizer = discretizer - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'InformationValue': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X: Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y: Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - InformationValue: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_binary_target(y) - columns = X.columns - self.feature_importances_ = self.compute_information_value( - X, y, self.discretizer - ) - self.feature_importances_.sort_values(ascending=False, inplace=True) - self.selected_columns = list(self.feature_importances_.index[:self.k]) - self.columns_to_drop = [ - c for c in columns if c not in self.selected_columns - ] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self - - @staticmethod - def compute_information_value( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - discretizer: _BaseDiscretizer) -> pd.Series: - """Compute information value. - - Parameters - ---------- - X: Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y: np.ndarray - Target values. - discretizer: _BaseDiscretizer - Discretizer. - - Returns - ------- - pd.Series - Information value. - """ - discretizer.inplace = False - object_columns = util.get_datatype_columns(X, object) - numerical_columns = util.get_numerical_columns(X) - binned_columns = [ - f'{c}__bin' for c in numerical_columns] - iv_columns = object_columns.copy() + binned_columns.copy() - X = discretizer.fit_transform(X) - iv = pd.Series(0, index=iv_columns) - X = X.join(y) - y_name = y.name - for col in iv_columns: - if isinstance(X, pd.DataFrame): - tab = X.groupby( - [col, y_name])[y_name].count().unstack( - ).fillna(0) - else: - tab = X[[col, y_name]].groupby( - [col, y_name])[y_name].count().to_pandas().unstack( - ).fillna(0) - tab /= tab.sum() - tab = tab.to_numpy() - with np.errstate(divide='ignore'): - woe = pd.Series(np.log(tab[:, 1] / tab[:, 0])) - woe[(woe == np.inf) | (woe == -np.inf)] = 0. - iv.loc[col] = np.sum(woe * (tab[:, 1] - tab[:, 0])) - - X = X.drop(binned_columns + [y_name], axis=1) - iv.index = [ - c.split('__bin')[0] for c in iv.index] - return iv.sort_values(ascending=False).fillna(0) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/multiclass_information_value.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/multiclass_information_value.py deleted file mode 100644 index f9c9f6cf..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/multiclass_information_value.py +++ /dev/null @@ -1,204 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import pandas as pd -import databricks.koalas as ks -from ._base_feature_selection import _BaseFeatureSelection -from .information_value import InformationValue -from ..util import util -from ..binning._base_discretizer import _BaseDiscretizer - - -class MultiClassInformationValue(_BaseFeatureSelection): - """Feature selection based on the information value. - - `MultiClassInformationValue` accepts only for muti-class variable targets. - - Parameters - ---------- - k : int - Number of features to keep. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - See Also - -------- - gators.feature_selection.InformationValue - Information value for binary classification problems. - gators.feature_selection.RegressionInformationValue - Information value for regression problems. - - Examples - -------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import MultiClassInformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - """ - - def __init__(self, k: int, discretizer: _BaseDiscretizer): - if not isinstance(k, int): - raise TypeError('`k` should be an int.') - if not isinstance(discretizer, _BaseDiscretizer): - raise TypeError( - '`discretizer` should inherite from _BaseDiscretizer.') - _BaseFeatureSelection.__init__(self) - self.k = k - self.discretizer = discretizer - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None - ) -> 'MultiClassInformationValue': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - InformationValue: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_multiclass_target(y) - columns = X.columns - self.feature_importances_ = self.compute_information_value( - X, y, self.discretizer - ) - self.feature_importances_.sort_values(ascending=False, inplace=True) - self.selected_columns = list(self.feature_importances_.index[:self.k]) - self.columns_to_drop = [ - c for c in columns if c not in self.selected_columns - ] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self - - @staticmethod - def compute_information_value( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - discretizer: _BaseDiscretizer) -> pd.Series: - """Compute information value. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - Returns - ------- - pd.Series - Information value. - """ - discretizer.inplace = False - if isinstance(X, pd.DataFrame): - y_onehot = pd.get_dummies(y, prefix=y.name) - else: - y_onehot = ks.get_dummies(y, prefix=y.name) - y_onehot = y_onehot.drop(y_onehot.columns[0], axis=1) - information_values = pd.DataFrame( - index=X.columns, columns=y_onehot.columns[1:]) - iv = InformationValue(discretizer=discretizer, k=X.shape[1]) - object_columns = util.get_datatype_columns(X, object) - columns = object_columns + discretizer.output_columns - for col in y_onehot.columns[1:]: - _ = iv.fit(X[columns], y_onehot.loc[:, col]) - information_values.loc[:, col] = iv.feature_importances_ - return information_values.fillna(0).max(1).sort_values( - ascending=False) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/regression_information_value.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/regression_information_value.py deleted file mode 100644 index 3ac41eee..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/regression_information_value.py +++ /dev/null @@ -1,200 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import pandas as pd -import databricks.koalas as ks -from ._base_feature_selection import _BaseFeatureSelection -from .multiclass_information_value import MultiClassInformationValue -from ..util import util -from ..binning._base_discretizer import _BaseDiscretizer - - -class RegressionInformationValue(_BaseFeatureSelection): - """Regression Information Value Transformer. - - `RegressionInformationValue` accepts only continuous variable targets. - - Parameters - ---------- - k : int - Number of features to keep. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - See Also - -------- - gators.feature_selection.InformationValue - Information value for binary classification problems. - gators.feature_selection.MultiClassInformationValue - Information value for multi-class classification problems. - - Examples - -------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import RegressionInformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> from gators.feature_selection import InformationValue - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import RegressionInformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - - """ - - def __init__(self, k: int, discretizer: _BaseDiscretizer): - if not isinstance(k, int): - raise TypeError('`k` should be an int.') - if not isinstance(discretizer, _BaseDiscretizer): - raise TypeError( - '`discretizer` should inherite from _BaseDiscretizer.') - _BaseFeatureSelection.__init__(self) - self.k = k - self.discretizer = discretizer - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None - ) -> 'RegressionInformationValue': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - InformationValue: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_regression_target(y) - columns = X.columns - self.feature_importances_ = self.compute_information_value( - X, y, self.discretizer - ) - self.feature_importances_.sort_values(ascending=False, inplace=True) - self.selected_columns = list(self.feature_importances_.index[:self.k]) - self.columns_to_drop = [ - c for c in columns if c not in self.selected_columns - ] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self - - @staticmethod - def compute_information_value( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - discretizer: _BaseDiscretizer) -> pd.Series: - """Compute information value. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - Returns - ------- - pd.Series - Information value. - """ - discretizer.inplace = True - y_binned = discretizer.fit_transform(y.to_frame())[y.name] - discretizer.inplace = False - discretizer.output_columns = [] - return MultiClassInformationValue.compute_information_value( - X, - y_binned.astype(float).astype(int), - discretizer=discretizer) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/select_from_model.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/select_from_model.py deleted file mode 100644 index f4390774..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/select_from_model.py +++ /dev/null @@ -1,157 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import pandas as pd -import databricks.koalas as ks -from ._base_feature_selection import _BaseFeatureSelection -from ..converter import KoalasToPandas -from ..util import util - - -class SelectFromModel(_BaseFeatureSelection): - """Select From Model Transformer. - - Select the top *k* features based on the feature importance - of the given machine learning model. - - Parameters - ---------- - model : model - Machine learning model. - k : int - Number of features to keep. - - Examples - --------- - * fit & transform with `pandas` - - - >>> import pandas as pd - >>> from sklearn.ensemble import RandomForestClassifier as RFC - >>> from gators.feature_selection import SelectFromModel - >>> X = pd.DataFrame( - ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> model = RFC(n_estimators=1, max_depth=2, random_state=0) - >>> obj = SelectFromModel(model=model, k=2) - >>> obj.fit_transform(X, y) - A C - 0 22.00 3.0 - 1 38.00 1.0 - 2 26.00 3.0 - 3 35.00 1.0 - 4 35.00 3.0 - 5 28.11 3.0 - 6 54.00 1.0 - 7 2.00 3.0 - 8 27.00 3.0 - 9 14.00 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark - >>> from gators.feature_selection import SelectFromModel - >>> X = ks.DataFrame( - ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> model = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) - >>> obj = SelectFromModel(model=model, k=2) - >>> obj.fit_transform(X, y) - A B - 0 22.00 7.25 - 1 38.00 71.28 - 2 26.00 7.92 - 3 35.00 53.10 - 4 35.00 8.05 - 5 28.11 8.46 - 6 54.00 51.86 - 7 2.00 21.08 - 8 27.00 11.13 - 9 14.00 30.07 - - See Also - -------- - gators.feature_selection.SelectFromModels - Similar method using multiple models. - - """ - - def __init__(self, model, k: int): - if not isinstance(k, int): - raise TypeError('`k` should be an int.') - if not hasattr(model, 'fit'): - raise TypeError( - '`model` should have the attribute `fit`.' - ) - _BaseFeatureSelection.__init__(self) - self.model = model - self.k = k - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'SelectFromModel': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - SelectFromModel: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - columns = list(X.columns) - if isinstance(X, pd.DataFrame): - self.feature_importances_ = self.calculate_feature_importances_pd( - model=self.model, X=X, y=y, columns=columns) - else: - if hasattr(self.model, 'labelCol'): - self.feature_importances_ = \ - self.calculate_feature_importances_ks( - model=self.model, X=X, y=y, columns=columns) - else: - X_, y_ = KoalasToPandas().transform(X, y) - self.feature_importances_ = \ - self.calculate_feature_importances_pd( - model=self.model, X=X_, y=y_, columns=columns) - mask = self.feature_importances_ != 0 - self.feature_importances_ = self.feature_importances_[mask] - self.feature_importances_.sort_values(ascending=False, inplace=True) - self.selected_columns = list(self.feature_importances_.index[:self.k]) - self.columns_to_drop = [ - c for c in columns if c not in self.selected_columns] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self - - @staticmethod - def calculate_feature_importances_pd( - model: object, X: pd.DataFrame, - y: Union[pd.Series, ks.Series], columns: list) -> pd.Series: - model.fit(X.to_numpy(), y) - feature_importances_ = pd.Series( - model.feature_importances_, - index=columns, - ) - return feature_importances_ - - @staticmethod - def calculate_feature_importances_ks( - model: object, X: ks.DataFrame, - y: ks.Series, columns: list) -> pd.Series: - spark_df = util.generate_spark_dataframe(X=X, y=y) - trained_model = model.fit(spark_df) - feature_importances_ = pd.Series( - trained_model.featureImportances.toArray(), - index=columns - ) - return feature_importances_ diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/select_from_models.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/select_from_models.py deleted file mode 100644 index d0ff94da..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/select_from_models.py +++ /dev/null @@ -1,179 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -import pyspark.sql.dataframe as ps -from ._base_feature_selection import _BaseFeatureSelection -from ..scalers.minmax_scaler import MinMaxScaler -from ..util import util - - -class SelectFromModels(_BaseFeatureSelection): - """Select From Models By Vote Transformer. - - Select the top *k* features based on the feature importance - of the given machine learning models. - - Parameters - ---------- - models : List[model] - List of machine learning models. - k : int - Number of features to keep. - - Examples - --------- - * fit & transform with `koalas` - - >>> import pandas as pd - >>> from sklearn.ensemble import RandomForestClassifier as RFC - >>> from gators.feature_selection import SelectFromModels - >>> X = pd.DataFrame({ - ... 'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> models = [RFC(n_estimators=1, max_depth=1, random_state=0), - ... RFC(n_estimators=1, max_depth=2, random_state=1)] - >>> obj = SelectFromModels(models=models, k=2) - >>> obj.fit_transform(X, y) - B C - 0 7.25 3.0 - 1 71.28 1.0 - 2 7.92 3.0 - 3 53.10 1.0 - 4 8.05 3.0 - 5 8.46 3.0 - 6 51.86 1.0 - 7 21.08 3.0 - 8 11.13 3.0 - 9 30.07 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark - >>> from gators.feature_selection import SelectFromModels - >>> X = ks.DataFrame({ - ... 'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> models = [RFCSpark(numTrees=1, maxDepth=1, labelCol=y.name, seed=0), - ... RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=1)] - >>> obj = SelectFromModels(models=models, k=2) - >>> obj.fit_transform(X, y) - A B - 0 22.00 7.25 - 1 38.00 71.28 - 2 26.00 7.92 - 3 35.00 53.10 - 4 35.00 8.05 - 5 28.11 8.46 - 6 54.00 51.86 - 7 2.00 21.08 - 8 27.00 11.13 - 9 14.00 30.07 - - See Also - -------- - gators.feature_selection.SelectFromMode - Similar method using one model. - - """ - - def __init__(self, models: List[object], k: int): - if not isinstance(models, list): - raise TypeError('`models` should be a list.') - if not isinstance(k, int): - raise TypeError('`k` should be an int.') - for model in models: - if not hasattr(model, 'fit'): - raise TypeError( - 'All the elements of `models` should have the attribute `fit`.' - ) - _BaseFeatureSelection.__init__(self) - self.models = models - self.k = k - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'SelectFromModels': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - SelectFromModels: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.feature_importances_ = self.get_feature_importances_frame( - X, self.models) - if isinstance(X, pd.DataFrame): - for col, model in zip( - self.feature_importances_.columns, self.models): - model_feature_importances_ = self.get_feature_importances_pd( - model=model, X=X, y=y) - self.feature_importances_[col] = model_feature_importances_ - else: - spark_df = util.generate_spark_dataframe(X=X, y=y) - for col, model in zip( - self.feature_importances_.columns, self.models): - model_feature_importances_ = self.get_feature_importances_sk( - model=model, spark_df=spark_df) - self.feature_importances_[col] = model_feature_importances_ - self.feature_importances_ = self.clean_feature_importances_frame( - self.feature_importances_) - self.selected_columns = list( - self.feature_importances_['count'].iloc[:self.k].index) - self.columns_to_drop = [ - c for c in self.feature_importances_.index - if c not in self.selected_columns - ] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self - - @staticmethod - def get_feature_importances_pd( - model: object, X: pd.DataFrame, y: Union[pd.Series, ks.Series]): - model.fit(X, y) - feature_importances_ = model.feature_importances_ - return feature_importances_ - - @staticmethod - def get_feature_importances_sk( - model: object, spark_df: ps.DataFrame): - trained_model = model.fit(spark_df) - feature_importances_ = trained_model.featureImportances.toArray() - return feature_importances_ - - @staticmethod - def get_feature_importances_frame(X, models): - index = np.array(list(X.columns)) - columns = [] - for i, model in enumerate(models): - col = str(model).split('(')[0] - columns.append(col + '_' + str(i)) - return pd.DataFrame( - columns=columns, index=index, dtype=np.float64) - - @staticmethod - def clean_feature_importances_frame(feature_importances): - feature_importances = MinMaxScaler( - ).fit_transform(feature_importances) - feature_importances_sum = feature_importances.sum(1) - feature_importances_count = (feature_importances != 0).sum(1) - feature_importances['sum'] = feature_importances_sum - feature_importances['count'] = feature_importances_count - feature_importances.sort_values( - by=['count', 'sum'], ascending=False, inplace=True) - return feature_importances diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_correlation_filter.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_correlation_filter.py deleted file mode 100644 index 08a83c90..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_correlation_filter.py +++ /dev/null @@ -1,72 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.correlation_filter import CorrelationFilter -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - max_corr = 0.8 - X = pd.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3], - }) - - X_expected = X[['B', 'D', 'F']].copy() - obj = CorrelationFilter(max_corr=max_corr).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - max_corr = 0.8 - X = ks.DataFrame({ - 'A': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - 'B': [1, 1, 0, 1, 0, 0], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [3, 1, 2, 1, 2, 3], - }) - - X_expected = X[['B', 'D', 'F']].to_pandas().copy() - obj = CorrelationFilter(max_corr=max_corr).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(np.float64)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(np.float64)) - - -def test_init(): - with pytest.raises(TypeError): - _ = CorrelationFilter(max_corr='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_information_value.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_information_value.py deleted file mode 100644 index 575ad649..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_information_value.py +++ /dev/null @@ -1,80 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.information_value import InformationValue -from gators.binning.discretizer import Discretizer -from pandas.testing import assert_frame_equal -import pytest -import databricks.koalas as ks -import pandas as pd -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - k = 3 - n_bins = 4 - X = pd.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'B', 'C']].copy() - y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') - discretizer = Discretizer(n_bins=n_bins) - obj = InformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - k = 3 - n_bins = 4 - X = ks.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'B', 'C']].to_pandas().copy() - y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') - discretizer = Discretizer(n_bins=n_bins) - obj = InformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = InformationValue(k='a', discretizer=Discretizer(n_bins=3)) - with pytest.raises(TypeError): - _ = InformationValue(k=2, discretizer='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_multiclass_information_value.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_multiclass_information_value.py deleted file mode 100644 index 210d7599..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_multiclass_information_value.py +++ /dev/null @@ -1,83 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.multiclass_information_value import ( - MultiClassInformationValue) -from gators.binning.discretizer import Discretizer -from pandas.testing import assert_frame_equal -import pytest -import databricks.koalas as ks -import pandas as pd -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - k = 3 - n_bins = 4 - X = pd.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'B', 'C']].copy() - y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') - discretizer = Discretizer(n_bins=n_bins) - obj = MultiClassInformationValue( - k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - k = 3 - n_bins = 4 - X = ks.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'B', 'C']].to_pandas().copy() - y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') - discretizer = Discretizer(n_bins=n_bins) - obj = MultiClassInformationValue( - k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = MultiClassInformationValue(k='a', discretizer=3) - with pytest.raises(TypeError): - _ = MultiClassInformationValue(k=2, discretizer='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_regression_information_value.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_regression_information_value.py deleted file mode 100644 index c89d9b1a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_regression_information_value.py +++ /dev/null @@ -1,83 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.regression_information_value import ( - RegressionInformationValue) -from gators.binning.discretizer import Discretizer -from pandas.testing import assert_frame_equal -import pytest -import databricks.koalas as ks -import pandas as pd -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - k = 3 - n_bins = 4 - X = pd.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'B', 'C']].copy() - y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - discretizer = Discretizer(n_bins=n_bins) - obj = RegressionInformationValue( - k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - k = 3 - n_bins = 4 - X = ks.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'B', 'C']].to_pandas().copy() - y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - discretizer = Discretizer(n_bins=n_bins) - obj = RegressionInformationValue( - k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = RegressionInformationValue(k='a', discretizer=3) - with pytest.raises(TypeError): - _ = RegressionInformationValue(k=2, discretizer='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_select_from_model.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_select_from_model.py deleted file mode 100644 index 7a89931d..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_select_from_model.py +++ /dev/null @@ -1,111 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.select_from_model import SelectFromModel -from pyspark.ml.classification import RandomForestClassifier as RFCSpark -from xgboost import XGBClassifier -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - 'C': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}) - y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - X_expected = X[['A', 'B']].copy() - model = XGBClassifier( - random_state=0, - subsample=1., - n_estimators=2, - max_depth=2, - eval_metric='logloss', - use_label_encoder=False - ) - obj = SelectFromModel(model=model, k=2).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - 'B': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - 'C': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}) - y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - X_expected = X[['A']].to_pandas().copy() - model = RFCSpark( - numTrees=2, maxDepth=1, labelCol=y.name, seed=0) - obj = SelectFromModel(model=model, k=2).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_combined(): - X = ks.DataFrame( - {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - 'B': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - 'C': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}) - y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - X_expected = X[['A']].to_pandas().copy() - model = XGBClassifier( - random_state=0, - subsample=1., - n_estimators=2, - max_depth=2, - eval_metric='logloss', - use_label_encoder=False - ) - obj = SelectFromModel(model=model, k=2).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert X_expected.shape == X_new.shape - - -@pytest.mark.koalas -def test_ks_pd(data_combined): - obj, X, X_expected = data_combined - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert X_expected.shape == X_new.shape - - -def test_init(): - with pytest.raises(TypeError): - _ = SelectFromModel(model=XGBClassifier(), k='a') - - class Model(): - pass - with pytest.raises(TypeError): - _ = SelectFromModel(model=Model(), k=2) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_select_from_models.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_select_from_models.py deleted file mode 100644 index e75b1b62..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_select_from_models.py +++ /dev/null @@ -1,97 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.select_from_models import SelectFromModels -from pyspark.ml.classification import RandomForestClassifier as RFCSpark -from xgboost import XGBClassifier, XGBRFClassifier -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - 'C': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}) - y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - X_expected = X[['A', 'B']].copy() - model1 = XGBClassifier( - random_state=0, - subsample=1., - n_estimators=2, - max_depth=2, - eval_metric='logloss', - use_label_encoder=False - ) - model2 = XGBRFClassifier( - random_state=0, - subsample=1., - n_estimators=2, - max_depth=2, - eval_metric='logloss', - use_label_encoder=False - ) - obj = SelectFromModels(models=[model1, model2], k=2).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - 'C': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}) - y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - X_expected = X[['A', 'B']].to_pandas().copy() - model1_ks = RFCSpark( - numTrees=2, maxDepth=2, labelCol=y.name, seed=0) - mode2_ks = RFCSpark( - numTrees=1, maxDepth=2, labelCol=y.name, seed=0) - obj = SelectFromModels( - models=[model1_ks, mode2_ks], k=2).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(np.float64)) - - -def test_init(): - with pytest.raises(TypeError): - _ = SelectFromModels(models=0, k='a') - - with pytest.raises(TypeError): - _ = SelectFromModels(models=[XGBClassifier()], k='a') - - class Model(): - pass - with pytest.raises(TypeError): - _ = SelectFromModels(models=[Model()], k=2) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_variance_filter.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_variance_filter.py deleted file mode 100644 index 3b2ff1ce..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/tests/test_variance_filter.py +++ /dev/null @@ -1,80 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.variance_filter import VarianceFilter -from pandas.testing import assert_frame_equal -import pytest -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - min_var = 2. - X = pd.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'C', 'D']].copy() - - y = pd.Series([1, 1, 1, 0, 0, 0]) - obj = VarianceFilter(min_var=min_var).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - min_var = 2. - X = ks.DataFrame({ - 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - 'B': [1, 1, 0, 1, 0, 0], - 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - 'D': [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - 'F': [1, 2, 3, 1, 2, 4], - }) - X_expected = X[['A', 'C', 'D']].to_pandas().copy() - y = ks.Series([1, 1, 1, 0, 0, 0]) - obj = VarianceFilter(min_var=min_var).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_empty_drop_columns(data): - obj, X, X_expected = data - obj.columns_to_drop = [] - assert_frame_equal(obj.transform(X), X) - - -def test_init(): - with pytest.raises(TypeError): - _ = VarianceFilter(min_var='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/variance_filter.py b/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/variance_filter.py deleted file mode 100644 index 26285b16..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/feature_selection/variance_filter.py +++ /dev/null @@ -1,107 +0,0 @@ -# License: Apache-2.0 -from ..util import util -from ._base_feature_selection import _BaseFeatureSelection -from typing import Union -import pandas as pd -import databricks.koalas as ks - - -class VarianceFilter(_BaseFeatureSelection): - """Remove low variance columns. - - Parameters - ---------- - min_var : float - Variance threshold. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import VarianceFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) - >>> obj.fit_transform(X) - B - 0 1.0 - 1 2.0 - 2 3.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import VarianceFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) - >>> obj.fit_transform(X) - B - 0 1.0 - 1 2.0 - 2 3.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import VarianceFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.], - [2.], - [3.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import VarianceFilter - >>> X = ks.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.], - [2.], - [3.]]) - - """ - - def __init__(self, min_var: float): - if not isinstance(min_var, float): - raise TypeError('`min_var` should be a float.') - _BaseFeatureSelection.__init__(self) - self.min_var = min_var - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'VarianceFilter': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - VarianceFilter: Instance of itself. - """ - self.check_dataframe(X) - numerical_columns = util.get_numerical_columns(X) - self.feature_importances_ = X[numerical_columns].var() - if isinstance(self.feature_importances_, ks.Series): - self.feature_importances_ = self.feature_importances_.to_pandas() - mask = self.feature_importances_ < self.min_var - self.columns_to_drop = list(self.feature_importances_.index[mask]) - self.selected_columns = util.exclude_columns( - X.columns, self.columns_to_drop - ) - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns) - return self diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/__init__.py deleted file mode 100644 index 03dd96f9..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from ._base_imputer import _BaseImputer -from .float_imputer import FloatImputer -from .int_imputer import IntImputer -from .numerics_imputer import NumericsImputer -from .object_imputer import ObjectImputer - -__all__ = [ - '_BaseImputer', - 'FloatImputer', - 'IntImputer', - 'NumericsImputer', - 'ObjectImputer', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/_base_imputer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/_base_imputer.py deleted file mode 100644 index 027d6a6e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/_base_imputer.py +++ /dev/null @@ -1,117 +0,0 @@ -# License: Apache-2.0 -from ..transformers.transformer import Transformer -from typing import List, Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class _BaseImputer(Transformer): - """Base imputer transformer class. - - Parameters - ---------- - strategy : str - Imputation strategy. The possible values are: - - * constant - * most_frequent (only for the FloatImputer class) - * mean (only for the FloatImputer class) - * median (only for the FloatImputer class) - - value (Union[float, str, None]): Imputation value, default to None. - used for `strategy=constant`. - columns: List[str], default to None. - List of columns. - - """ - - def __init__(self, strategy: str, - value: Union[float, str, None], - columns: List[str]): - if not isinstance(strategy, str): - raise TypeError('`strategy` should be a string.') - if strategy == 'constant' and value is None: - raise ValueError( - 'if `strategy` is "constant", `value` should not be None.') - if strategy not in ['constant', 'mean', 'median', 'most_frequent']: - raise ValueError('Imputation `strategy` not implemented.') - if not isinstance(columns, list) and columns is not None: - raise TypeError('`columns` should be a list or None.') - - Transformer.__init__(self) - self.strategy = strategy - self.value = value - self.columns = columns - self.statistics: Dict = {} - self.statistics_values: np.ndarray = None - self.idx_columns: np.ndarray = None - self.X_dtypes: Union[pd.Series, ks.Series] = None - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - return X.fillna(self.statistics) - for col, val in self.statistics.items(): - X[col] = X[col].fillna(val) - return X - - @staticmethod - def compute_statistics( - X: Union[pd.DataFrame, ks.DataFrame], columns: List[str], - strategy: str, - value: Union[float, int, str, None] - ) -> Dict[str, Union[float, int, str]]: - """Compute the imputation values. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe used to compute the imputation values. - columns : List[str] - Columns to consider. - strategy : str - Imputation strategy. - value : Union[float, int, str, None] - Value used for imputation. - - Returns - ------- - Dict[str, Union[float, int, str]] - Imputation value mapping. - """ - if strategy == 'mean': - statistics = X[columns].astype(np.float64).mean().to_dict() - elif strategy == 'median': - statistics = X[columns].astype(np.float64).median().to_dict() - elif strategy == 'most_frequent': - values = [ - X[c].value_counts().index.to_numpy()[0] - for c in columns - ] - statistics = dict(zip(columns, values)) - else: # strategy == 'constant' - values = len(columns) * [value] - statistics = dict(zip(columns, values)) - if pd.Series(statistics).isnull().sum(): - raise ValueError( - '''Some columns contains only NaN values and the - imputation values cannot be calculated. - Remove these columns - before performing the imputation - (e.g. with `gators.data_cleaning.drop_high_nan_ratio()`).''') - return statistics diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/float_imputer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/float_imputer.py deleted file mode 100644 index 17c7e7c8..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/float_imputer.py +++ /dev/null @@ -1,194 +0,0 @@ -# License: Apache-2.0 -from ._base_imputer import _BaseImputer -from imputer import float_imputer_object -from imputer import float_imputer -from ..util import util -import numpy as np -from typing import List, Union -import pandas as pd -import databricks.koalas as ks -import warnings - - -class FloatImputer(_BaseImputer): - """Impute the numerical columns satisfying the condition X != X.round() - using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'mean' - - 'median' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - columns: List[str], default to None. - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> obj.fit_transform(X) - A B - 0 0.10 z - 1 0.20 a - 2 0.15 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> obj.fit_transform(X) - A B - 0 0.1 z - 1 0.2 a - 2 0.1 a - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.15000000000000002, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.1, 'a']], dtype=object) - - See Also - -------- - gators.imputers.IntImputer - Impute integer columns. - gators.imputers.NumericsImputer - Impute numerical columns. - gators.imputers.ObjectImputer - Impute categorical columns. - - """ - - def __init__(self, strategy: str, - value: float = None, - columns: List[str] = None): - _BaseImputer.__init__(self, strategy, value, columns) - if strategy not in ['constant', 'mean', 'median']: - raise ValueError( - '''`strategy` should be "constant", ,"mean" - or "median" for FloatImputer Transformer.''') - if strategy == 'constant' and not isinstance(value, float): - raise TypeError( - '''`value` should be a float - for the FloatImputer class''') - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'FloatImputer': - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - 'FloatImputer': Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_float_only_columns(X=X) - if not self.columns: - warnings.warn( - '''`X` does not contain columns satisfying: - X[column] != X[column].round(), - `FloatImputer` is not needed''') - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array( - list(self.statistics.values())) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - return X.fillna(self.statistics) - for col, val in self.statistics.items(): - X[col] = X[col].replace({np.nan: val}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: - Transformed NumPy array. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if X.dtype == object: - return float_imputer_object( - X, - self.statistics_values.astype(object), - self.idx_columns) - return float_imputer( - X, - self.statistics_values, - self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/imputer.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/imputer.pyx deleted file mode 100644 index 8de9a25b..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/imputer.pyx +++ /dev/null @@ -1,97 +0,0 @@ -# License: Apache-2.0 -cimport cython -cimport numpy as np -from libc.math cimport isnan - - -ctypedef fused num_float_t: - np.float32_t - np.float64_t - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] object_imputer( - np.ndarray[object, ndim=2] X, - np.ndarray[object, ndim=1] statistics, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - """Object imputer. - - Args: - X (np.ndarray): Input array. - statistics(np.ndarray): Imputation values. - idx_columns (np.ndarray): Array of column indices. - - Returns: - np.ndarray: Imputed array. - """ - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_idx_columns = idx_columns.shape[0] - for j in range(n_rows): - for i in range(n_idx_columns): - if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] is None): - X[j, idx_columns[i]] = statistics[i] - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( - np.ndarray[num_float_t, ndim=2] X, - np.ndarray[np.float64_t, ndim=1] statistics, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - """Float imputer. - - Args: - X (np.ndarray): Input array. - statistics (np.ndarray): Imputation values. - idx_columns (np.ndarray): Array of column indices. - - Returns: - np.ndarray: Imputed array. - """ - - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_idx_columns = idx_columns.shape[0] - with nogil: - for j in range(n_rows): - for i in range(n_idx_columns): - if isnan(X[j, idx_columns[i]]): - X[j, idx_columns[i]] = statistics[i] - return X - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] float_imputer_object( - np.ndarray[object, ndim=2] X, - np.ndarray[object, ndim=1] statistics, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - """Float imputer. - - Args: - X (np.ndarray): Input array. - statistics(np.ndarray): Imputation values. - idx_columns (np.ndarray): Array of column indices. - - Returns: - np.ndarray: Imputed array. - """ - - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_idx_columns = idx_columns.shape[0] - for j in range(n_rows): - for i in range(n_idx_columns): - if isnan(X[j, idx_columns[i]]): - X[j, idx_columns[i]] = statistics[i] - return X - diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/int_imputer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/int_imputer.py deleted file mode 100644 index 564571c5..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/int_imputer.py +++ /dev/null @@ -1,174 +0,0 @@ -# License: Apache-2.0 -from ._base_imputer import _BaseImputer -from imputer import float_imputer_object -from imputer import float_imputer -from ..util import util -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -import warnings - - -class IntImputer(_BaseImputer): - """Impute the numerical columns satisfying the condition X == X.round() - using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'most_frequent' - - 'mean' - - 'median' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - columns: List[str], default to None. - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> obj.fit_transform(X) - A B - 0 1.0 z - 1 2.0 a - 2 -999.0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> obj.fit_transform(X) - A B - 0 1.0 z - 1 2.0 a - 2 -999.0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.0, 'z'], - [2.0, 'a'], - [-999.0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.0, 'z'], - [2.0, 'a'], - [-999.0, 'a']], dtype=object) - - See Also - -------- - gators.imputers.FloatImputer - Impute float columns. - gators.imputers.NumericsImputer - Impute numerical columns. - gators.imputers.ObjectImputer - Impute categorical columns. - - """ - - def __init__(self, strategy: str, - value: float = None, - columns: List[str] = None): - _BaseImputer.__init__(self, strategy, value, columns) - if strategy == 'constant' and not isinstance(value, int): - raise TypeError( - '''`value` should be a integer - for the IntImputer class''') - self.columns = columns - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'IntImputer': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Imputer: Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_int_only_columns(X=X) - if not self.columns: - warnings.warn( - '''`X` does not contain columns satisfying: - X[column] == X[column].round(), - `IntImputer` is not needed''') - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array( - list(self.statistics.values())).astype(np.float64) - return self - - def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - X_dtype = X.dtype - if 'int' in str(X_dtype): - return X - elif X_dtype == object: - return float_imputer_object( - X, - self.statistics_values.astype(object), - self.idx_columns) - else: - return float_imputer( - X, - self.statistics_values, - self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/numerics_imputer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/numerics_imputer.py deleted file mode 100644 index da624b39..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/numerics_imputer.py +++ /dev/null @@ -1,206 +0,0 @@ -# License: Apache-2.0 -from ._base_imputer import _BaseImputer -from imputer import float_imputer_object -from imputer import float_imputer -from ..util import util -import numpy as np -from typing import List, Union -import pandas as pd -import databricks.koalas as ks -import warnings - - -class NumericsImputer(_BaseImputer): - """Impute the numerical columns using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'mean' - - 'median' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - Examples - --------- - - * fit & transform with `pandas` - - - impute all the numerical columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = pd.DataFrame( - ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> obj.fit_transform(X) - A B C - 0 0.10 1.0 z - 1 0.20 2.0 a - 2 0.15 1.5 a - - - impute selected numerical columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = pd.DataFrame( - ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean', columns=['A']) - >>> obj.fit_transform(X) - A B C - 0 0.10 1.0 z - 1 0.20 2.0 a - 2 0.15 NaN a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> obj.fit_transform(X) - A B - 0 0.10 z - 1 0.20 a - 2 0.15 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.15000000000000002, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.15000000000000002, 'a']], dtype=object) - - See Also - -------- - gators.imputers.IntImputer - Impute integer columns. - gators.imputers.FloatImputer - Impute float columns. - gators.imputers.ObjectImputer - Impute categorical columns. - - """ - - def __init__(self, strategy: str, - value: float = None, - columns: List[str] = None): - _BaseImputer.__init__(self, strategy, value, columns) - if strategy not in ['constant', 'mean', 'median']: - raise ValueError( - '''`strategy` should be "constant", ,"mean" - or "median" for NumericsImputer Transformer.''') - if strategy == 'constant' and not isinstance(value, float): - raise TypeError( - '''`value` should be a float - for the NumericsImputer class''') - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'NumericsImputer': - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - 'NumericsImputer': Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_datatype_columns(X, float) - if not self.columns: - warnings.warn( - '''`X` does not contain numerical columns, - `NumericsImputer` is not needed''') - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array( - list(self.statistics.values())) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - return X.fillna(self.statistics) - for col, val in self.statistics.items(): - X[col] = X[col].replace({np.nan: val}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: - Transformed NumPy array. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if X.dtype == object: - return float_imputer_object( - X, - self.statistics_values.astype(object), - self.idx_columns) - return float_imputer( - X, - self.statistics_values, - self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/object_imputer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/object_imputer.py deleted file mode 100644 index 169d6c8f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/object_imputer.py +++ /dev/null @@ -1,187 +0,0 @@ -# License: Apache-2.0 -from ._base_imputer import _BaseImputer -from imputer import object_imputer -from ..util import util -from typing import Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -import warnings - - -class ObjectImputer(_BaseImputer): - """Impute the categorical columns using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'most_frequent' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - Examples - --------- - - * fit & transform with `pandas` - - - impute all the object columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'a', None], - ... 'B': ['c', 'c', 'd', None], - ... 'C': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent') - >>> obj.fit_transform(X) - A B C - 0 a c 0.0 - 1 b c 1.0 - 2 a d 2.0 - 3 a c NaN - - - impute selected object columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'a', None], - ... 'B': ['c', 'c', 'd', None], - ... 'C': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent', columns=['A']) - >>> obj.fit_transform(X) - A B C - 0 a c 0.0 - 1 b c 1.0 - 2 a d 2.0 - 3 a None NaN - - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent') - >>> obj.fit_transform(X) - A B - 0 a 0.0 - 1 b 1.0 - 2 a 2.0 - 3 a NaN - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 0.0], - ['b', 1.0], - ['a', 2.0], - ['a', nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 0.0], - ['b', 1.0], - ['a', 2.0], - ['a', nan]], dtype=object) - - See Also - -------- - gators.imputers.IntImputer - Impute integer columns. - gators.imputers.FloatImputer - Impute float columns. - gators.imputers.NumericsImputer - Impute numerical columns. - - """ - - def __init__(self, strategy: str, value: str = None, columns=None): - _BaseImputer.__init__(self, strategy, value, columns=columns) - if strategy not in ['constant', 'most_frequent']: - raise ValueError( - '''`strategy` should be "constant" or "most_frequent" - for the ObjectImputer Transformer.''') - if strategy == 'constant' and not isinstance(value, str): - raise TypeError( - '''`value` should be a string - for the ObjectImputer class''') - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'ObjectImputer': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - ObjectImputer: Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - '''`X` does not contain object columns: - `ObjectImputer` is not needed''') - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.idx_columns = np.array( - util.get_idx_columns(X, self.columns)) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array( - list(self.statistics.values())).astype(object) - return self - - def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - return object_imputer( - X, - self.statistics_values, - self.idx_columns) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/tests/test_imputers.py b/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/tests/test_imputers.py deleted file mode 100644 index 57f8ca96..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/imputers/tests/test_imputers.py +++ /dev/null @@ -1,930 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import numpy as np -import pytest -from pandas.testing import assert_frame_equal -from gators.imputers.numerics_imputer import NumericsImputer -from gators.imputers.int_imputer import IntImputer -from gators.imputers.float_imputer import FloatImputer -from gators.imputers.object_imputer import ObjectImputer -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture() -def data(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', None], 'F': ['a', 'a', 's', np.nan]}) - X_int_expected = pd.DataFrame( - {'A': [0., 1., 1., -9.], 'B': [3., 4., 4., -9.]}) - X_float_expected = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, 1.1], 'D': [2.1, 3.1, 4.1, 3.1]}) - X_object_expected = pd.DataFrame( - {'E': ['q', 'w', 'w', 'MISSING'], 'F': ['a', 'a', 's', 'MISSING']}) - obj_int = IntImputer(strategy='constant', value=-9).fit(X_int) - obj_float = FloatImputer(strategy='mean').fit(X_float) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X_object) - X_dict = { - 'int': X_int, - 'float': X_float, - 'object': X_object, - } - X_expected_dict = { - 'int': X_int_expected, - 'float': X_float_expected, - 'object': X_object_expected, - } - objs_dict = { - 'int': obj_int, - 'float': obj_float, - 'object': obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_num(): - X_int = pd.DataFrame( - {'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}, - dtype=np.float32) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}, - dtype=np.float32) - X_int_expected = pd.DataFrame( - {'A': [0., 1., 1., -9.], 'B': [3., 4., 4., -9.]}, - dtype=np.float32) - X_float_expected = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, 1.1], 'D': [2.1, 3.1, 4.1, 3.1]}, - dtype=np.float32) - obj_int = IntImputer(strategy='constant', value=-9).fit(X_int) - obj_float = FloatImputer(strategy='mean').fit(X_float) - X_dict = { - 'int': X_int, - 'float': X_float, - } - X_expected_dict = { - 'int': X_int_expected, - 'float': X_float_expected, - } - objs_dict = { - 'int': obj_int, - 'float': obj_float, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_no_missing(): - X_int = pd.DataFrame({'A': [0, 1, 1, 8], 'B': [3, 4, 4, 8]}, dtype=int) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, 9.], 'D': [2.1, 3.1, 4.1, 9.]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', 'x'], 'F': ['a', 'a', 's', 'x']}) - obj_int = IntImputer(strategy='constant', value=-9).fit(X_int) - obj_float = FloatImputer(strategy='mean').fit(X_float) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X_object) - X_dict = { - 'int': X_int, - 'float': X_float, - 'object': X_object, - } - X_expected_dict = { - 'int': X_int.copy(), - 'float': X_float.copy(), - 'object': X_object.copy(), - } - objs_dict = { - 'int': obj_int, - 'float': obj_float, - 'object': obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture -def data_full(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -9.0, 1.1, 3.1, 'w', 'a']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_int = IntImputer(strategy='constant', value=-9).fit(X) - obj_float = FloatImputer(strategy='median').fit(X) - obj_object = ObjectImputer(strategy='most_frequent').fit(X) - objs_dict = { - 'int': obj_int, - 'float': obj_float, - 'object': obj_object, - } - return objs_dict, X, X_expected - - -@pytest.fixture() -def data_ks(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', None], 'F': ['a', 'a', 's', np.nan]}) - X_int_expected = pd.DataFrame( - {'A': [0., 1., 1., -9.], 'B': [3., 4., 4., -9.]}) - X_float_expected = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, 1.1], 'D': [2.1, 3.1, 4.1, 3.1]}) - X_object_expected = pd.DataFrame( - {'E': ['q', 'w', 'w', 'MISSING'], 'F': ['a', 'a', 's', 'MISSING']}) - X_int_ks = ks.from_pandas(X_int) - X_float_ks = ks.from_pandas(X_float) - X_object_ks = ks.from_pandas(X_object) - obj_int = IntImputer(strategy='constant', value=-9).fit(X_int) - obj_float = FloatImputer(strategy='mean').fit(X_float) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X_object) - X_dict = { - 'int': X_int, - 'float': X_float, - 'object': X_object, - } - - X_dict = { - 'int': X_int_ks, - 'float': X_float_ks, - 'object': X_object_ks, - } - - X_expected_dict = { - 'int': X_int_expected, - 'float': X_float_expected, - 'object': X_object_expected, - } - - objs_dict = { - 'int': obj_int, - 'float': obj_float, - 'object': obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_num_ks(): - X_int = ks.DataFrame( - {'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}, - dtype=np.float32) - X_float = ks.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}, - dtype=np.float32) - X_int_expected = pd.DataFrame( - {'A': [0., 1., 1., -9.], 'B': [3., 4., 4., -9.]}, - dtype=np.float32) - X_float_expected = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, 1.1], 'D': [2.1, 3.1, 4.1, 3.1]}, - dtype=np.float32) - obj_int = IntImputer(strategy='constant', value=-9).fit(X_int) - obj_float = FloatImputer(strategy='mean').fit(X_float) - X_dict = { - 'int': X_int, - 'float': X_float, - } - X_expected_dict = { - 'int': X_int_expected, - 'float': X_float_expected, - } - objs_dict = { - 'int': obj_int, - 'float': obj_float, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_no_missing_ks(): - X_int = ks.DataFrame({'A': [0, 1, 1, 8], 'B': [3, 4, 4, 8]}, dtype=int) - X_float = ks.DataFrame( - {'C': [0.1, 1.1, 2.1, 9.], 'D': [2.1, 3.1, 4.1, 9.]}) - X_object = ks.DataFrame( - {'E': ['q', 'w', 'w', 'x'], 'F': ['a', 'a', 's', 'x']}) - obj_int = IntImputer(strategy='constant', value=-9).fit(X_int) - obj_float = FloatImputer(strategy='mean').fit(X_float) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X_object) - X_dict = { - 'int': X_int, - 'float': X_float, - 'object': X_object, - } - X_expected_dict = { - 'int': X_int.to_pandas().copy(), - 'float': X_float.to_pandas().copy(), - 'object': X_object.to_pandas().copy(), - } - objs_dict = { - 'int': obj_int, - 'float': obj_float, - 'object': obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture -def data_full_ks(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = ks.from_pandas(pd.concat([X_int, X_float, X_object], axis=1)) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -9.0, 1.1, 3.1, 'w', 'a']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_int = IntImputer(strategy='constant', value=-9).fit(X) - obj_float = FloatImputer(strategy='median').fit(X) - obj_object = ObjectImputer(strategy='most_frequent').fit(X) - objs_dict = { - 'int': obj_int, - 'float': obj_float, - 'object': obj_object, - } - return objs_dict, X, X_expected - - -def test_int_pd(data): - objs_dict, X_dict, X_expected_dict = data - assert_frame_equal( - objs_dict['int'].transform(X_dict['int']), X_expected_dict['int'], - ) - - -def test_float_pd(data): - objs_dict, X_dict, X_expected_dict = data - assert_frame_equal( - objs_dict['float'].transform( - X_dict['float']), X_expected_dict['float'], - ) - - -def test_object_pd(data): - objs_dict, X_dict, X_expected_dict = data - assert_frame_equal( - objs_dict['object'].transform( - X_dict['object']), X_expected_dict['object'], - ) - - -@pytest.mark.koalas -def test_int_ks(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - assert_frame_equal( - objs_dict['int'].transform(X_dict['int']).to_pandas(), - X_expected_dict['int'],) - - -@pytest.mark.koalas -def test_float_ks(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - assert_frame_equal( - objs_dict['float'].transform(X_dict['float']).to_pandas(), - X_expected_dict['float']) - - -@pytest.mark.koalas -def test_object_ks(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - assert_frame_equal( - objs_dict['object'].transform(X_dict['object']).to_pandas(), - X_expected_dict['object'], - ) - - -def test_int_pd_np(data): - objs_dict, X_dict, X_expected_dict = data - X_new_np = objs_dict['int'].transform_numpy(X_dict['int'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['int'].columns) - assert_frame_equal(X_new, X_expected_dict['int']) - - -def test_float_pd_np(data): - objs_dict, X_dict, X_expected_dict = data - X_new_np = objs_dict['float'].transform_numpy(X_dict['float'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['float'].columns) - assert_frame_equal(X_new, X_expected_dict['float']) - - -def test_object_pd_np(data): - objs_dict, X_dict, X_expected_dict = data - X_new_np = objs_dict['object'].transform_numpy(X_dict['object'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['object'].columns) - assert_frame_equal(X_new, X_expected_dict['object']) - - -@pytest.mark.koalas -def test_int_ks_np(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - X_new_np = objs_dict['int'].transform_numpy(X_dict['int'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['int'].columns) - assert_frame_equal(X_new, X_expected_dict['int']) - - -@pytest.mark.koalas -def test_float_ks_np(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - X_new_np = objs_dict['float'].transform_numpy( - X_dict['float'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['float'].columns) - assert_frame_equal(X_new, X_expected_dict['float']) - - -@pytest.mark.koalas -def test_object_ks_np(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - X_new_np = objs_dict['object'].transform_numpy( - X_dict['object'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['object'].columns) - assert_frame_equal(X_new, X_expected_dict['object']) - - -def test_num_int_pd(data_num): - objs_dict, X_dict, X_expected_dict = data_num - assert_frame_equal( - objs_dict['int'].transform(X_dict['int']), X_expected_dict['int'], - ) - - -def test_num_float_pd(data_num): - objs_dict, X_dict, X_expected_dict = data_num - assert_frame_equal( - objs_dict['float'].transform( - X_dict['float']), X_expected_dict['float'], - ) - - -@pytest.mark.koalas -def test_num_int_ks(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - assert_frame_equal(objs_dict['int'].transform( - X_dict['int'].to_pandas()), X_expected_dict['int'], - ) - - -@pytest.mark.koalas -def test_num_float_ks(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - assert_frame_equal(objs_dict['float'].transform( - X_dict['float'].to_pandas()), X_expected_dict['float'], - ) - - -def test_num_int_pd_np(data_num): - objs_dict, X_dict, X_expected_dict = data_num - X_new_np = objs_dict['int'].transform_numpy(X_dict['int'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['int'].columns) - assert_frame_equal(X_new, X_expected_dict['int']) - - -def test_num_float_pd_np(data_num): - objs_dict, X_dict, X_expected_dict = data_num - X_new_np = objs_dict['float'].transform_numpy(X_dict['float'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['float'].columns) - assert_frame_equal(X_new, X_expected_dict['float']) - - -@pytest.mark.koalas -def test_num_int_ks_np(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - X_new_np = objs_dict['int'].transform_numpy(X_dict['int'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['int'].columns) - assert_frame_equal(X_new, X_expected_dict['int']) - - -@pytest.mark.koalas -def test_num_float_ks_np(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - X_new_np = objs_dict['float'].transform_numpy( - X_dict['float'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['float'].columns) - assert_frame_equal(X_new, X_expected_dict['float']) - - -def test_no_missing_int_pd(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - assert_frame_equal( - objs_dict['int'].transform(X_dict['int']), X_expected_dict['int'], - ) - - -def test_no_missing_float_pd(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - assert_frame_equal( - objs_dict['float'].transform( - X_dict['float']), X_expected_dict['float'], - ) - - -def test_no_missing_object_pd(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - assert_frame_equal( - objs_dict['object'].transform( - X_dict['object']), X_expected_dict['object'], - ) - - -@pytest.mark.koalas -def test_no_missing_int_ks(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - assert_frame_equal(objs_dict['int'].transform( - X_dict['int'].to_pandas()), X_expected_dict['int'], - ) - - -@pytest.mark.koalas -def test_no_missing_float_ks(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - assert_frame_equal(objs_dict['float'].transform( - X_dict['float'].to_pandas()), X_expected_dict['float'], - ) - - -@pytest.mark.koalas -def test_no_missing_object_ks(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - assert_frame_equal(objs_dict['object'].transform( - X_dict['object'].to_pandas()), X_expected_dict['object'], - ) - - -def test_no_missing_int_pd_np(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - X_new_np = objs_dict['int'].transform_numpy(X_dict['int'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['int'].columns) - assert_frame_equal(X_new, X_expected_dict['int']) - - -def test_no_missing_float_pd_np(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - X_new_np = objs_dict['float'].transform_numpy(X_dict['float'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['float'].columns) - assert_frame_equal(X_new, X_expected_dict['float']) - - -def test_no_missing_object_pd_np(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - X_new_np = objs_dict['object'].transform_numpy(X_dict['object'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['object'].columns) - assert_frame_equal(X_new, X_expected_dict['object']) - - -@pytest.mark.koalas -def test_no_missing_int_ks_np(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - X_new_np = objs_dict['int'].transform_numpy(X_dict['int'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['int'].columns) - assert_frame_equal(X_new, X_expected_dict['int']) - - -@pytest.mark.koalas -def test_no_missing_float_ks_np(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - X_new_np = objs_dict['float'].transform_numpy( - X_dict['float'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['float'].columns) - assert_frame_equal(X_new, X_expected_dict['float']) - - -@pytest.mark.koalas -def test_no_missing_object_ks_np(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - X_new_np = objs_dict['object'].transform_numpy( - X_dict['object'].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict['object'].columns) - assert_frame_equal(X_new, X_expected_dict['object']) - - -def test_full_pd(data_full): - objs_dict, X, X_expected = data_full - X_new = objs_dict['object'].transform(X) - X_new = objs_dict['int'].transform(X_new) - X_new = objs_dict['float'].transform(X_new) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_full_ks(data_full_ks): - objs_dict, X, X_expected = data_full_ks - X_new = objs_dict['object'].transform(X) - X_new = objs_dict['int'].transform(X_new) - X_new = objs_dict['float'].transform(X_new) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_full_pd_np(data_full): - objs_dict, X, X_expected = data_full - X_new = objs_dict['object'].transform_numpy(X.to_numpy()) - X_new = objs_dict['int'].transform_numpy(X_new) - X_new = objs_dict['float'].transform_numpy(X_new) - X_new = pd.DataFrame(X_new, columns=['A', 'B', 'C', 'D', 'E', 'F']) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_full_ks_np(data_full_ks): - objs_dict, X, X_expected = data_full_ks - X_new = objs_dict['object'].transform_numpy(X.to_numpy()) - X_new = objs_dict['int'].transform_numpy(X_new) - X_new = objs_dict['float'].transform_numpy(X_new) - X_new = pd.DataFrame(X_new, columns=['A', 'B', 'C', 'D', 'E', 'F']) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_imputers_columns_pd(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -99.0, -999.0, -9999.0, 'missing', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_int_A = IntImputer( - strategy='constant', value=-9, columns=['A']).fit(X) - obj_int_B = IntImputer( - strategy='constant', value=-99, columns=['B']).fit(X) - obj_float_C = FloatImputer( - strategy='constant', value=-999., columns=['C']).fit(X) - obj_float_D = FloatImputer( - strategy='constant', value=-9999., columns=['D']).fit(X) - obj_object_E = ObjectImputer( - strategy='constant', value='missing', columns=['E']).fit(X) - obj_object_F = ObjectImputer( - strategy='constant', value='MISSING', columns=['F']).fit(X) - X_new = obj_int_A.transform(X) - X_new = obj_int_B.transform(X_new) - X_new = obj_float_C.transform(X_new) - X_new = obj_float_D.transform(X_new) - X_new = obj_object_E.transform(X_new) - X_new = obj_object_F.transform(X_new) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_imputers_columns_ks(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -99.0, -999.0, -9999.0, 'missing', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_int_A = IntImputer( - strategy='constant', value=-9, columns=['A']).fit(X) - obj_int_B = IntImputer( - strategy='constant', value=-99, columns=['B']).fit(X) - obj_float_C = FloatImputer( - strategy='constant', value=-999., columns=['C']).fit(X) - obj_float_D = FloatImputer( - strategy='constant', value=-9999., columns=['D']).fit(X) - obj_object_E = ObjectImputer( - strategy='constant', value='missing', columns=['E']).fit(X) - obj_object_F = ObjectImputer( - strategy='constant', value='MISSING', columns=['F']).fit(X) - X_new = obj_int_A.transform(X) - X_new = obj_int_B.transform(X_new) - X_new = obj_float_C.transform(X_new) - X_new = obj_float_D.transform(X_new) - X_new = obj_object_E.transform(X_new) - X_new = obj_object_F.transform(X_new) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_imputers_columns_pd_np(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -99.0, -999.0, -9999.0, 'missing', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_int_A = IntImputer( - strategy='constant', value=-9, columns=['A']).fit(X) - obj_int_B = IntImputer( - strategy='constant', value=-99, columns=['B']).fit(X) - obj_float_C = FloatImputer( - strategy='constant', value=-999., columns=['C']).fit(X) - obj_float_D = FloatImputer( - strategy='constant', value=-9999., columns=['D']).fit(X) - obj_object_E = ObjectImputer( - strategy='constant', value='missing', columns=['E']).fit(X) - obj_object_F = ObjectImputer( - strategy='constant', value='MISSING', columns=['F']).fit(X) - X_new = obj_int_A.transform_numpy(X.to_numpy()) - X_new = obj_int_B.transform_numpy(X_new) - X_new = obj_float_C.transform_numpy(X_new) - X_new = obj_float_D.transform_numpy(X_new) - X_new = obj_object_E.transform_numpy(X_new) - X_new = obj_object_F.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list('ABCDEF')), - X_expected.astype(object)) - - -@pytest.mark.koalas -def test_imputers_columns_ks_np(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -99.0, -999.0, -9999.0, 'missing', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_int_A = IntImputer( - strategy='constant', value=-9, columns=['A']).fit(X) - obj_int_B = IntImputer( - strategy='constant', value=-99, columns=['B']).fit(X) - obj_float_C = FloatImputer( - strategy='constant', value=-999., columns=['C']).fit(X) - obj_float_D = FloatImputer( - strategy='constant', value=-9999., columns=['D']).fit(X) - obj_object_E = ObjectImputer( - strategy='constant', value='missing', columns=['E']).fit(X) - obj_object_F = ObjectImputer( - strategy='constant', value='MISSING', columns=['F']).fit(X) - X_new = obj_int_A.transform_numpy(X.to_numpy()) - X_new = obj_int_B.transform_numpy(X_new) - X_new = obj_float_C.transform_numpy(X_new) - X_new = obj_float_D.transform_numpy(X_new) - X_new = obj_object_E.transform_numpy(X_new) - X_new = obj_object_F.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list('ABCDEF')), - X_expected.astype(object)) - - -def test_imputers_num_pd(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -9.0, -9.0, -9.0, 'MISSING', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_num = NumericsImputer( - strategy='constant', value=-9.).fit(X) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X) - X_new = obj_num.transform(X) - X_new = obj_object.transform(X_new) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_imputers_num_ks(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -9.0, -9.0, -9.0, 'MISSING', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_num = NumericsImputer( - strategy='constant', value=-9.).fit(X) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X) - X_new = obj_num.transform(X) - X_new = obj_object.transform(X_new) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_imputers_num_pd_np(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -9.0, -9.0, -9.0, 'MISSING', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_num = NumericsImputer( - strategy='constant', value=-9.).fit(X) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X) - X_new = obj_num.transform_numpy(X.to_numpy()) - X_new = obj_object.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list('ABCDEF')), - X_expected.astype(object)) - - -@pytest.mark.koalas -def test_imputers_num_ks_np(): - X_int = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - X_float = pd.DataFrame( - {'C': [0.1, 1.1, 2.1, np.nan], 'D': [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame( - {'E': ['q', 'w', 'w', np.nan], 'F': ['a', 'a', 's', None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [[0.0, 3.0, 0.1, 2.1, 'q', 'a'], - [1.0, 4.0, 1.1, 3.1, 'w', 'a'], - [1.0, 4.0, 2.1, 4.1, 'w', 's'], - [-9.0, -9.0, -9.0, -9.0, 'MISSING', 'MISSING']], - columns=['A', 'B', 'C', 'D', 'E', 'F'], - ) - obj_num = NumericsImputer( - strategy='constant', value=-9.).fit(X) - obj_object = ObjectImputer( - strategy='constant', value='MISSING').fit(X) - X_new = obj_num.transform_numpy(X.to_numpy()) - X_new = obj_object.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list('ABCDEF')), - X_expected.astype(object)) - - -def test_num_np(): - X = pd.DataFrame({'A': [0, 1, np.nan]}) - obj = NumericsImputer(strategy='mean').fit(X) - assert obj.transform_numpy(X.to_numpy()).tolist() == [[0.0], [1.0], [0.5]] - - -def test_imputers_stategy(): - X = pd.DataFrame([]) - with pytest.raises(TypeError): - _ = FloatImputer(strategy=0) - with pytest.raises(TypeError): - _ = NumericsImputer(strategy=0) - with pytest.raises(TypeError): - _ = IntImputer(strategy='constant', value='a').fit(X) - with pytest.raises(TypeError): - _ = FloatImputer(strategy='constant', value='a').fit(X) - with pytest.raises(TypeError): - _ = NumericsImputer(strategy='constant', value='a').fit(X) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy='constant', value=1).fit(X) - with pytest.raises(ValueError): - _ = IntImputer(strategy='').fit(X) - with pytest.raises(ValueError): - _ = FloatImputer(strategy='').fit(X) - with pytest.raises(ValueError): - _ = NumericsImputer(strategy='').fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy='').fit(X) - with pytest.raises(ValueError): - _ = FloatImputer(strategy='most_frequent').fit(X) - with pytest.raises(ValueError): - _ = NumericsImputer(strategy='most_frequent').fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy='mean').fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy='median').fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy='constant').fit(X) - with pytest.raises(ValueError): - _ = FloatImputer(strategy='constant').fit(X) - with pytest.raises(ValueError): - _ = NumericsImputer(strategy='constant').fit(X) - with pytest.raises(ValueError): - _ = IntImputer(strategy='constant').fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy='abc').fit(X) - - -def test_compute_stategy(): - with pytest.raises(ValueError): - X = pd.DataFrame( - np.arange(9).reshape(3, 3) + .1, columns=list('qwe')) - X.iloc[:, 0] = np.nan - _ = FloatImputer(strategy='mean').fit(X) - - -def test_imputers_input_data(): - with pytest.raises(TypeError): - _ = FloatImputer(strategy='mean').fit(np.array([[]])) - with pytest.raises(TypeError): - _ = IntImputer(strategy='most_frequent').fit(np.array([[]])) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy='most_frequent').fit(np.array([[]])) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy='most_frequent', columns='a') - - -def test_imputers_transform_input_data(): - with pytest.raises(TypeError): - _ = FloatImputer(strategy='mean').fit_transform(np.array([])) - with pytest.raises(TypeError): - _ = IntImputer(strategy='most_frequent').fit( - np.array([])).transform(np.array([])) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy='most_frequent').transform(np.array([])) - - -def test_warnings_empty_columns(data): - objs_dict, X_dict, X_expected_dict = data - with pytest.warns(Warning): - obj = FloatImputer(strategy='mean') - obj.fit(X_dict['int']) - with pytest.warns(Warning): - obj = IntImputer(strategy='mean') - obj.fit(X_dict['float']) - with pytest.warns(Warning): - obj = ObjectImputer(strategy='most_frequent') - obj.fit(X_dict['int']) - with pytest.warns(Warning): - obj = NumericsImputer(strategy='mean') - obj.fit(X_dict['object']) - - -def test_empty_columns_float(): - X = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - obj = FloatImputer(strategy='mean') - _ = obj.fit(X) - assert_frame_equal(obj.transform(X.copy()), X) - assert np.allclose(obj.transform_numpy(X.to_numpy()), - X.to_numpy(), equal_nan=True) - - -def test_empty_columns_int(): - X = pd.DataFrame({'A': [0.1, 1, 1, np.nan], 'B': [3.1, 4, 4, np.nan]}) - obj = IntImputer(strategy='mean') - _ = obj.fit(X) - assert_frame_equal(obj.transform(X.copy()), X) - assert np.allclose(obj.transform_numpy(X.to_numpy()), - X.to_numpy(), equal_nan=True) - - -def test_empty_columns_object(): - X = pd.DataFrame({'A': [0, 1, 1, np.nan], 'B': [3, 4, 4, np.nan]}) - obj = ObjectImputer(strategy='most_frequent') - _ = obj.fit(X) - assert_frame_equal(obj.fit_transform(X.copy()), X) - assert_frame_equal( - pd.DataFrame(obj.transform_numpy(X.to_numpy())), - pd.DataFrame(X.to_numpy())) - - -def test_num_idx_columns_empty(): - X = pd.DataFrame({'A': ['a', 'b', 'b', 'c']}) - obj = NumericsImputer(strategy='mean').fit(X) - _ = obj.fit(X) - assert_frame_equal(obj.transform(X.copy()), X) - assert_frame_equal( - pd.DataFrame(obj.transform_numpy(X.to_numpy())), - pd.DataFrame(X.to_numpy())) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/__init__.py deleted file mode 100644 index 246abf28..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .train_test_split import TrainTestSplit -from .hyperopt import HyperOpt -from .xgb_booster_builder import XGBBoosterBuilder -from .xgb_treelite_dumper import XGBTreeliteDumper -from .lgbm_treelite_dumper import LGBMTreeliteDumper - -__all__ = [ - 'TrainTestSplit', - 'HyperOpt', - 'XGBBoosterBuilder', - 'XGBTreeliteDumper', - 'LGBMTreeliteDumper', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/hyperopt.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/hyperopt.py deleted file mode 100644 index 68429dfc..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/hyperopt.py +++ /dev/null @@ -1,209 +0,0 @@ -# License: Apache-2.0 -from hyperopt.pyll.base import Apply -from hyperopt import Trials -from hyperopt import fmin -from sklearn.model_selection import cross_val_score -from sklearn.model_selection import KFold, StratifiedKFold -from sklearn.metrics._scorer import _PredictScorer -from typing import List, Union, Dict, Callable -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class HyperOpt(): - """Hyper parameter optimization using the Hyperopt package. - - Parameters - ---------- - model : object - Machine learning model. - algo: Callable - `algo` can be: - - * hp.rand.suggest for random search. - * hp.tpe.suggest for tree of parzen estimators. - * hp.atpe.suggest for adaptative tree of parzen estimators. - - scoring : _PredictScorer - Score (or loss) function with signature score_func(y, y_pred). - space : Dict[str, Apply] - Hyperopt search space. - kfold : Union[KFold, StratifiedKFold] - sklearn K-Folds cross-validator. - max_evals : int - Number of evaluations. - features: List[str] - List of feature names. - - Examples - -------- - - >>> import numpy as np - >>> import sklearn - >>> from hyperopt import hp, tpe - >>> from lightgbm import LGBMClassifier - >>> from gators.model_building import HyperOpt - >>> from sklearn.model_selection import StratifiedKFold - >>> X_np = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_np = np.array([0, 1, 1, 0]) - >>> hyper = HyperOpt( - ... model=LGBMClassifier(random_state=0), - ... algo=tpe.suggest, - ... scoring=sklearn.metrics.make_scorer(sklearn.metrics.f1_score), - ... space={'max_depth': hp.quniform('max_depth',1, 3, 1)}, - ... max_evals=3, - ... kfold=StratifiedKFold(n_splits=2), - ... features=['x', 'y'], - ... ) - >>> _ = hyper.fit(X_np, y_np) - 100%|##########| 3/3 [00:03<00:00, 1.03s/trial, best loss: -0.0] - >>> hyper.model - LGBMClassifier(max_depth=2, random_state=0) - - """ - - def __init__(self, model: object, scoring: _PredictScorer, - algo: Callable, - space: Dict[str, Apply], - kfold: Union[KFold, StratifiedKFold], - max_evals: int, - features: List[str]) -> 'HyperOpt': - - if not hasattr(model, 'fit') or not hasattr(model, 'predict'): - raise TypeError( - '`model` should have the methods `fit` and `predict`') - if not callable(algo): - raise TypeError( - ''' - `algo` should be: - hyperopt.rand, hyperopt.tpe, or hyperopt.atpe''') - if not isinstance(scoring, (str, _PredictScorer)): - raise TypeError( - '''`scoring` should be a str or - a sklearn.metrics._scorer._PredictScorer''') - if not isinstance(space, dict): - raise TypeError( - '`space` should be a dict') - if not isinstance(kfold, (KFold, StratifiedKFold)): - raise TypeError( - '`scoring` should be a sklearn.metrics._scorer._PredictScorer') - if not isinstance(max_evals, int): - raise TypeError( - '`max_evals` should be an int') - if not isinstance(features, list): - raise TypeError( - '`features` should be a list') - self.model = model - self.algo = algo - self.scoring = scoring - self.space = space - self.kfold = kfold - self.max_evals = max_evals - self.history = pd.DataFrame() - self.int_parameters: List[str] = self.get_int_parameters(space) - self.features = features - - def fit(self, X: np.ndarray, y: np.ndarray) -> 'HyperOpt': - """Fit model on X with y. - - Parameters - ---------- - X : np.ndarray - NumPy array. - y : np.ndarray - Target values. - - Returns - ------- - HyperOpt - Instance of itself. - """ - if not isinstance(X, np.ndarray): - raise TypeError( - '''`X` must be a NumPy array.''') - if not isinstance(y, np.ndarray): - raise TypeError( - '''`y` must be a NumPy array.''') - - def fn(params, cv=self.kfold, X=X, y=y): - for int_parameter in self.int_parameters: - params[int_parameter] = int(params[int_parameter]) - self.model.set_params(**params) - self.model.fit(X, y) - score = cross_val_score( - self.model, X, y, cv=cv, - scoring=self.scoring, n_jobs=-1).mean() - return - score - - trials = Trials() - best = fmin( - fn=fn, - space=self.space, - algo=self.algo, - max_evals=self.max_evals, - trials=trials, - rstate=np.random.RandomState(0) - ) - for int_parameter in self.int_parameters: - best[int_parameter] = int(best[int_parameter]) - self.history = self.generate_history(trials) - self.model.set_params(**best) - self.model.fit(X, y) - return self - - def get_feature_importances(self) -> pd.Series: - """Generate the feature importances from the selected model. - - Returns - ------- - pd.Series - Feature importances. - """ - feature_importances_ = pd.Series( - self.model.feature_importances_, self.features) - return feature_importances_.sort_values(ascending=False) - - @staticmethod - def generate_history(trials: object) -> pd.DataFrame: - """Generate hyperparameter tuning history. - - Parameters - ---------- - trials : object - Hyperopt trial funnction. - - Returns - ------- - pd.DataFrame - Hyperparameter tuning history. - """ - def f(x) -> ks.Series[np.float32]: - return pd.Series({key: val[0] for key, val in x.items()}) - - loss = pd.DataFrame(trials.results) - params = pd.DataFrame(trials.miscs)['vals'].apply(f) - history = pd.concat([params, loss], axis=1) - history['id'] = history.index - history.sort_values('loss', ascending=False) - return history - - @staticmethod - def get_int_parameters(space) -> List[str]: - """Get the list of int parameters based on the hyperopt search space. - - Parameters - ---------- - space : object - Hyperopt search space. - - Returns - ------- - List[str] - List of int parameters. - """ - int_parameters = [] - for key in space.keys(): - if 'qlog' in str(space[key]) or 'quni' in str(space[key]): - int_parameters.append(key) - return int_parameters diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/lgbm_treelite_dumper.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/lgbm_treelite_dumper.py deleted file mode 100644 index 4e5bd79e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/lgbm_treelite_dumper.py +++ /dev/null @@ -1,94 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import os -import treelite -from lightgbm.sklearn import LGBMClassifier, LGBMRegressor - - -class LGBMTreeliteDumper: - """LightGBM Treelite Dumper class. - - Examples - -------- - >>> import numpy as np - >>> from lightgbm import LGBMClassifier - >>> from gators.model_building import LGBMTreeliteDumper - >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_train = np.array([0, 1, 1, 0]) - >>> model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) - >>> LGBMTreeliteDumper.dump( - ... model=model, - ... toolchain='gcc', - ... parallel_comp=1, - ... model_path='.', - ... model_name='dummy') - [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler - [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... - """ - - @staticmethod - def dump(model: Union[LGBMClassifier, LGBMRegressor], - toolchain: str, - parallel_comp: int, - model_path: str, model_name: str): - """Dump the XGBoost treelite as a .so and a - .dylib file. - - Parameters - ---------- - model: Union[LGBMClassifier, LGBMRegressor]. - LightGBM trained model. - toolchain: str - Compiler. List of available treelite compiler. - * gcc - * clang - * msvc - parallel_comp: int - Treelite parallel compilation. - model_path : str - Model path. - model_name : str - Model name. - """ - if not isinstance(model, (LGBMClassifier, LGBMRegressor)): - raise TypeError( - '`model` should be a LGBMClassifier or LGBMRegressor.') - if not isinstance(toolchain, str): - raise TypeError('`toolchain` should be a str.') - if toolchain not in ['gcc', 'clang', 'msvc']: - raise ValueError( - '`toolchain` should be `gcc`, `clang`, or `msvc`.') - if not isinstance(parallel_comp, int): - raise TypeError('`parallel_comp` should be an int.') - if not isinstance(model_path, str): - raise TypeError('`model_path` should be a str.') - if not isinstance(model_name, str): - raise TypeError('`model_name` should be a str.') - file_name = 'dummy_lgbm_model.txt' - model.booster_.save_model(file_name) - model_ = treelite.Model.load(file_name, model_format='lightgbm') - platform_dict = {'gcc': 'unix', 'clang': 'osx', 'msvc': 'windows'} - format_dict = {'gcc': '.so', 'clang': '.dylib', 'msvc': '.dll'} - model_.export_lib( - toolchain=toolchain, - libpath=os.path.join( - model_path, model_name + format_dict[toolchain]), - verbose=False, - params={'parallel_comp': parallel_comp}, - nthread=1, - ) - model_.export_srcpkg( - platform=platform_dict[toolchain], - toolchain=toolchain, - params={'parallel_comp': parallel_comp}, - pkgpath=os.path.join(model_path, model_name + '.zip'), - libname=os.path.join( - model_path, model_name + format_dict[toolchain]), - verbose=True, - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_hyperopt.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_hyperopt.py deleted file mode 100644 index 7f8c51fc..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_hyperopt.py +++ /dev/null @@ -1,149 +0,0 @@ -# License: Apache-2.0 -import pytest -import pandas as pd -from pandas.testing import assert_series_equal -import numpy as np -from hyperopt import hp -from hyperopt import tpe -from sklearn.datasets import make_classification -from sklearn.model_selection import StratifiedKFold -from sklearn.metrics import make_scorer -from xgboost import XGBClassifier -from gators.model_building.hyperopt import HyperOpt - - -@pytest.fixture -def data(): - X, y = make_classification( - random_state=0, n_samples=10, n_features=5, n_informative=3) - model = XGBClassifier(random_state=0, eval_metric='logloss', max_depth=2) - n_splits = 2 - max_evals = 10 - kfold = StratifiedKFold(n_splits=n_splits) - space = {'n_estimators': hp.quniform('n_estimators', 5, 25, 5)} - model = XGBClassifier( - random_state=0, - eval_metric='logloss', - use_label_encoder=False) - - def f1_score(y_true, y_pred): - p = y_true[y_pred == 1].mean() - r = y_pred[y_true == 1].mean() - if (p == 0) | (r == 0): - return 0 - return 2 * p * r / (p + r) - f1_scoring = make_scorer(f1_score) - y_pred_expected = np.array([0, 1, 1, 0, 1, 0, 1, 0, 1, 1]) - return model, f1_scoring, space, max_evals, kfold, X, y, y_pred_expected - - -def test_hyperopt(data): - model, f1_scoring, space, max_evals, kfold, X, y, y_pred_expected = data - hyper = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ).fit(X, y) - y_pred = hyper.model.predict(X) - feature_importances = hyper.get_feature_importances() - assert feature_importances[-3:].sum() == 0 - assert np.allclose(y_pred, y_pred_expected) - - -def test_input(data): - model, f1_scoring, space, max_evals, kfold, X, y, y_pred_expected = data - with pytest.raises(TypeError): - _ = HyperOpt( - model=0, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=0, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=0, - space=space, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=0, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals='a', - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=0, - features=['A', 'B', 'C', 'D', 'E'] - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=0 - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ).fit(0, 0) - - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=['A', 'B', 'C', 'D', 'E'] - ).fit(X, 0) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_lgbm_treelite_dumper.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_lgbm_treelite_dumper.py deleted file mode 100644 index 0c1c40d8..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_lgbm_treelite_dumper.py +++ /dev/null @@ -1,84 +0,0 @@ -# License: Apache-2.0 -import pytest -import os -import numpy as np -from lightgbm import LGBMClassifier -from gators.model_building.lgbm_treelite_dumper import LGBMTreeliteDumper - - -def test(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) - LGBMTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - LGBMTreeliteDumper.dump( - model=model, - toolchain='clang', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - os.remove('dummy.zip') - os.remove('dummy.so') - os.remove('dummy.dylib') - os.remove('dummy_lgbm_model.txt') - - -def test_input(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=0, - toolchain='gcc', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain=0, - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp='a', - model_path='.', - model_name='dummy' - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp=1, - model_path=0, - model_name='dummy' - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp=1, - model_path='.', - model_name=0 - ) - with pytest.raises(ValueError): - LGBMTreeliteDumper.dump( - model=model, - toolchain='a', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_train_test_split.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_train_test_split.py deleted file mode 100644 index 081b751c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_train_test_split.py +++ /dev/null @@ -1,174 +0,0 @@ -# License: Apache-2.0 -from gators.model_building.train_test_split import TrainTestSplit -from pandas.testing import assert_series_equal -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -@pytest.fixture() -def data_ordered(): - X = pd.DataFrame(np.arange(40).reshape(8, 5), columns=list('ABCDE')) - y_name = 'TARGET' - y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') - X_train_expected = pd.DataFrame( - {'A': {0: 0, 1: 5, 2: 10, 3: 15}, 'B': {0: 1, 1: 6, 2: 11, 3: 16}, 'C': { - 0: 2, 1: 7, 2: 12, 3: 17}, 'D': {0: 3, 1: 8, 2: 13, 3: 18}, 'E': {0: 4, 1: 9, 2: 14, 3: 19}}) - X_test_expected = pd.DataFrame( - {'A': {4: 20, 5: 25, 6: 30, 7: 35}, 'B': {4: 21, 5: 26, 6: 31, 7: 36}, 'C': { - 4: 22, 5: 27, 6: 32, 7: 37}, 'D': {4: 23, 5: 28, 6: 33, 7: 38}, 'E': {4: 24, 5: 29, 6: 34, 7: 39}}) - y_train_expected = pd.Series( - {0: 0, 1: 1, 2: 2, 3: 0}, name=y_name) - y_test_expected = pd.Series( - {4: 1, 5: 2, 6: 0, 7: 1}, name=y_name) - return obj, X, y, X_train_expected, X_test_expected, y_train_expected, y_test_expected - - -@pytest.fixture() -def data_random(): - X = pd.DataFrame(np.arange(40).reshape(8, 5), columns=list('ABCDE')) - y_name = 'TARGET' - y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit( - test_ratio=test_ratio, strategy='random', random_state=0) - X_train_expected = pd.DataFrame( - {'A': {0: 0, 3: 15, 4: 20, 5: 25}, 'B': {0: 1, 3: 16, 4: 21, 5: 26}, 'C': { - 0: 2, 3: 17, 4: 22, 5: 27}, 'D': {0: 3, 3: 18, 4: 23, 5: 28}, 'E': {0: 4, 3: 19, 4: 24, 5: 29}}) - X_test_expected = pd.DataFrame( - {'A': {6: 30, 2: 10, 1: 5, 7: 35}, 'B': {6: 31, 2: 11, 1: 6, 7: 36}, 'C': { - 6: 32, 2: 12, 1: 7, 7: 37}, 'D': {6: 33, 2: 13, 1: 8, 7: 38}, 'E': {6: 34, 2: 14, 1: 9, 7: 39}}) - y_train_expected = pd.Series( - {0: 0, 3: 0, 4: 1, 5: 2}, name=y_name) - y_test_expected = pd.Series( - {6: 0, 2: 2, 1: 1, 7: 1}, name=y_name) - return obj, X, y, X_train_expected, X_test_expected, y_train_expected, y_test_expected - - -@pytest.fixture() -def data_stratified(): - X = pd.DataFrame(np.arange(40).reshape(8, 5), columns=list('ABCDE')) - y_name = 'TARGET' - y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit( - test_ratio=test_ratio, strategy='stratified', random_state=0) - - X_train_expected = pd.DataFrame( - {'A': {0: 0, 1: 5, 2: 10}, 'B': {0: 1, 1: 6, 2: 11}, - 'C': {0: 2, 1: 7, 2: 12}, 'D': {0: 3, 1: 8, 2: 13}, 'E': {0: 4, 1: 9, 2: 14}}) - X_test_expected = pd.DataFrame( - {'A': {6: 30, 3: 15, 7: 35, 4: 20, 5: 25}, 'B': {6: 31, 3: 16, 7: 36, 4: 21, 5: 26}, - 'C': {6: 32, 3: 17, 7: 37, 4: 22, 5: 27}, 'D': {6: 33, 3: 18, 7: 38, 4: 23, 5: 28}, - 'E': {6: 34, 3: 19, 7: 39, 4: 24, 5: 29}}) - y_train_expected = pd.Series( - {0: 0, 1: 1, 2: 2}, name=y_name) - y_test_expected = pd.Series( - {6: 0, 3: 0, 7: 1, 4: 1, 5: 2}, name=y_name) - return obj, X, y, X_train_expected, X_test_expected, y_train_expected, y_test_expected - - -@pytest.fixture() -def data_ordered_ks(): - X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list('ABCDE')) - y_name = 'TARGET' - y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') - return obj, X, y - - -@pytest.fixture() -def data_random_ks(): - X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list('ABCDE')) - y_name = 'TARGET' - y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit( - test_ratio=test_ratio, strategy='random', random_state=0) - return obj, X, y - - -@pytest.fixture() -def data_stratified_ks(): - X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list('ABCDE')) - y_name = 'TARGET' - y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit( - test_ratio=test_ratio, strategy='stratified', random_state=0) - return obj, X, y - - -def test_ordered(data_ordered): - obj, X, y, X_train_expected, X_test_expected, y_train_expected, y_test_expected = data_ordered - X_train, X_test, y_train, y_test = obj.transform(X, y) - assert_frame_equal(X_train, X_train_expected) - assert_frame_equal(X_test, X_test_expected) - assert_series_equal(y_train, y_train_expected) - assert_series_equal(y_test, y_test_expected) - - -@pytest.mark.koalas -def test_ordered_ks(data_ordered_ks): - obj, X, y = data_ordered_ks - X_train, X_test, y_train, y_test = obj.transform(X, y) - X_new = pd.concat([X_train.to_pandas(), X_test.to_pandas()]) - y_new = pd.concat([y_train.to_pandas(), y_test.to_pandas()]) - assert_frame_equal(X.to_pandas(), X_new.sort_index()) - assert_series_equal(y.to_pandas(), y_new.sort_index()) - - -def test_random(data_random): - obj, X, y, X_train_expected, X_test_expected, y_train_expected, y_test_expected = data_random - X_train, X_test, y_train, y_test = obj.transform(X, y) - assert_frame_equal(X_train, X_train_expected) - assert_frame_equal(X_test, X_test_expected) - assert_series_equal(y_train, y_train_expected) - assert_series_equal(y_test, y_test_expected) - - -@pytest.mark.koalas -def test_random_ks(data_random_ks): - obj, X, y = data_random_ks - X_train, X_test, y_train, y_test = obj.transform(X, y) - X_new = pd.concat([X_train.to_pandas(), X_test.to_pandas()]) - y_new = pd.concat([y_train.to_pandas(), y_test.to_pandas()]) - assert_frame_equal(X.to_pandas().drop('index', axis=1), X_new.sort_index()) - assert_series_equal(y.to_pandas(), y_new.sort_index()) - - -def test_stratified(data_stratified): - obj, X, y, X_train_expected, X_test_expected, y_train_expected, y_test_expected = data_stratified - X_train, X_test, y_train, y_test = obj.transform(X, y) - assert_frame_equal(X_train.sort_index(), X_train_expected.sort_index()) - assert_frame_equal(X_test.sort_index(), X_test_expected.sort_index()) - assert_series_equal(y_train.sort_index(), y_train_expected.sort_index()) - assert_series_equal(y_test.sort_index(), y_test_expected.sort_index()) - - -@pytest.mark.koalas -def test_stratified_ks(data_stratified_ks): - obj, X, y = data_stratified_ks - X_train, X_test, y_train, y_test = obj.transform(X, y) - X_new = pd.concat([X_train.to_pandas(), X_test.to_pandas()]) - y_new = pd.concat([y_train.to_pandas(), y_test.to_pandas()]) - assert_frame_equal(X.to_pandas().drop('index', axis=1), X_new.sort_index()) - assert_series_equal(y.to_pandas(), y_new.sort_index()) - - -def test_input(): - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio='q', random_state='q', strategy='q') - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio='q', random_state='q', strategy='q') - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio=0.1, random_state='q', strategy='q') - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio=0.1, random_state=0, strategy=0) - with pytest.raises(ValueError): - _ = TrainTestSplit(test_ratio=0.1, random_state=0, strategy='q') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_xgb_booster_builder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_xgb_booster_builder.py deleted file mode 100644 index 8dd17a52..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_xgb_booster_builder.py +++ /dev/null @@ -1,46 +0,0 @@ -# License: Apache-2.0 -import pytest -import numpy as np -import xgboost -from xgboost import XGBClassifier -from gators.model_building.xgb_booster_builder import XGBBoosterBuilder - - -def test(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - xgb = XGBClassifier(n_estimators=2, max_depth=2, use_label_encoder=False) - xgb.fit(X_train, y_train) - xgb_booster = XGBBoosterBuilder.train(xgb, X_train, y_train) - assert np.allclose( - xgb.predict_proba(X_train)[:, 1], - xgb_booster.predict(xgboost.DMatrix(X_train)) - ) - - -def test_num_class(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 2, 0]) - xgb = XGBClassifier(n_estimators=2, max_depth=2) - xgb.fit(X_train, y_train) - xgb_booster = XGBBoosterBuilder.train(xgb, X_train, y_train, num_class=3) - assert np.allclose( - xgb.predict_proba(X_train), - xgb_booster.predict(xgboost.DMatrix(X_train)) - ) - - -def test_input(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - xgb = XGBClassifier(n_estimators=2, max_depth=2) - xgb.fit(X_train, y_train) - num_class = 2 - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(0, X_train, y_train, num_class) - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(xgb, 0, y_train, num_class) - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(xgb, X_train, 0, num_class) - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(xgb, X_train, y_train, 'a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_xgb_treelite_dumper.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_xgb_treelite_dumper.py deleted file mode 100644 index 04d1f6f9..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/tests/test_xgb_treelite_dumper.py +++ /dev/null @@ -1,86 +0,0 @@ -# License: Apache-2.0 -import pytest -import os -import numpy as np -import xgboost -from xgboost import XGBClassifier -from gators.model_building.xgb_treelite_dumper import XGBTreeliteDumper - - -def test(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - dtrain = xgboost.DMatrix(X_train, label=y_train) - model = xgboost.train({'max_depth': 1}, dtrain, num_boost_round=1) - XGBTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - XGBTreeliteDumper.dump( - model=model, - toolchain='clang', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - os.remove('dummy.zip') - os.remove('dummy.so') - os.remove('dummy.dylib') - - -def test_input(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - dtrain = xgboost.DMatrix(X_train, label=y_train) - model = xgboost.train({'max_depth': 1}, dtrain, num_boost_round=1) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=0, - toolchain='gcc', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain=0, - parallel_comp=1, - model_path='.', - model_name='dummy' - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp='a', - model_path='.', - model_name='dummy' - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp=1, - model_path=0, - model_name='dummy' - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain='gcc', - parallel_comp=1, - model_path='.', - model_name=0 - ) - with pytest.raises(ValueError): - XGBTreeliteDumper.dump( - model=model, - toolchain='a', - parallel_comp=1, - model_path='.', - model_name='dummy' - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/train_test_split.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/train_test_split.py deleted file mode 100644 index a2237ced..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/train_test_split.py +++ /dev/null @@ -1,418 +0,0 @@ -from ..transformers import TransformerXY -from ..util import util -from typing import Tuple, Union -import pandas as pd -import databricks.koalas as ks - - -class TrainTestSplit(TransformerXY): - """TrainTestSplit class. - - Parameters - ---------- - test_ratio : float - Proportion of the dataset to include in the test split. - strategy : str - Train/Test split strategy. The possible values are: - - * ordered - * random - * stratified - - random_state : int - Random state. - - Notes - ----- - Note that the `random` and `stratified` strategies will be give different - results for pandas and koalas. - - Examples - -------- - - * transform with `pandas` - - - ordered split - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 1 3 4 5 - 2 6 7 8 - 3 9 10 11 - >>> X_test - A B C - 4 12 13 14 - 5 15 16 17 - 6 18 19 20 - 7 21 22 23 - >>> y_train - 0 0 - 1 1 - 2 2 - 3 0 - Name: TARGET, dtype: int64 - >>> y_test - 4 1 - 5 2 - 6 0 - 7 1 - Name: TARGET, dtype: int64 - - - random split - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 3 9 10 11 - 4 12 13 14 - 5 15 16 17 - >>> X_test - A B C - 6 18 19 20 - 2 6 7 8 - 1 3 4 5 - 7 21 22 23 - >>> y_train - 0 0 - 3 0 - 4 1 - 5 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 2 2 - 1 1 - 7 1 - Name: TARGET, dtype: int64 - - - stratified split - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 1 3 4 5 - 2 6 7 8 - >>> X_test - A B C - 6 18 19 20 - 3 9 10 11 - 7 21 22 23 - 4 12 13 14 - 5 15 16 17 - >>> y_train - 0 0 - 1 1 - 2 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 3 0 - 7 1 - 4 1 - 5 2 - Name: TARGET, dtype: int64 - - * transform with `koalas` - - - ordered split - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 1 3 4 5 - 2 6 7 8 - 3 9 10 11 - >>> X_test - A B C - 4 12 13 14 - 5 15 16 17 - 6 18 19 20 - 7 21 22 23 - >>> y_train - 0 0 - 1 1 - 2 2 - 3 0 - Name: TARGET, dtype: int64 - >>> y_test - 4 1 - 5 2 - 6 0 - 7 1 - Name: TARGET, dtype: int64 - - - random split - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 7 21 22 23 - 3 9 10 11 - 2 6 7 8 - >>> X_test - A B C - 6 18 19 20 - 5 15 16 17 - 1 3 4 5 - 4 12 13 14 - >>> y_train - 0 0 - 7 1 - 3 0 - 2 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 5 2 - 1 1 - 4 1 - Name: TARGET, dtype: int64 - - - stratified split - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 3 9 10 11 - 7 21 22 23 - 2 6 7 8 - >>> X_test - A B C - 6 18 19 20 - 1 3 4 5 - 4 12 13 14 - 5 15 16 17 - >>> y_train - 0 0 - 3 0 - 7 1 - 2 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 1 1 - 4 1 - 5 2 - Name: TARGET, dtype: int64 - - """ - - def __init__(self, test_ratio: float, strategy: str, - random_state: int = 0): - if not isinstance(strategy, str): - raise TypeError('`strategy` must be a string.') - if not isinstance(test_ratio, float): - raise TypeError('`test_ratio` must be a float.') - if not isinstance(random_state, int): - raise TypeError('`random_state` must be an int.') - if strategy not in ['ordered', 'random', 'stratified']: - raise ValueError('`strategy` not implemented.') - self.test_ratio = test_ratio - self.random_state = random_state - self.strategy = strategy - - def transform(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[ - Union[pd.DataFrame, ks.DataFrame], - Union[pd.DataFrame, ks.DataFrame], - Union[pd.Series, ks.Series], - Union[pd.Series, ks.Series]]: - """Transform dataframe and series. - - Parameters - ---------- - X: Union[pd.DataFrame, ks.DataFrame] - Dataframe. - y: np.ndarray - Labels - test_ratio: float - Ratio of data points used for the test set. - - Returns - -------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame], - Union[pd.Series, ks.Series], Union[pd.Series, ks.Series]] - Train-Test split. - """ - self.check_dataframe(X) - self.check_y(X, y) - if self.strategy == 'ordered': - return self.ordered_split(X, y) - y_name = y.name - x_name = X.index.name - if isinstance(X, ks.DataFrame): - X['index'] = X.index - Xy = X.join(y) - - if self.strategy == 'random': - Xy_train, Xy_test = self.random_split(Xy, x_name) - else: - Xy_train, Xy_test = self.stratified_split(Xy, x_name, y_name) - return Xy_train.drop(y_name, axis=1), Xy_test.drop(y_name, axis=1), Xy_train[y_name], Xy_test[y_name] - - def ordered_split(self, - X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: - """Perform random split. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - y : Union[pd.Series, ks.Series] - Series - Returns - ------- - Union[pd.DataFrame, ks.DataFrame]: - Train set. - Union[pd.DataFrame, ks.DataFrame]: - Test set. - """ - n_samples = X.shape[0] - n_test = int(self.test_ratio * n_samples) - n_train = n_samples - n_test - return X.head(n_train), X.tail(n_test), y.head(n_train), y.tail(n_test) - - def random_split(self, - Xy: Union[pd.DataFrame, ks.DataFrame], - x_name: str - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], - Union[pd.DataFrame, ks.DataFrame]]: - """Perform random split. - - Parameters - ---------- - Xy : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - x_name: str - Dataframe index name. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame]: - Train set. - Union[pd.DataFrame, ks.DataFrame]: - Test set. - """ - - if isinstance(Xy, ks.DataFrame): - self.test_ratio -= 1e-6 - Xy_train, Xy_test = Xy.to_spark().randomSplit( - [1. - self.test_ratio, self.test_ratio], - seed=self.random_state - ) - Xy_train = Xy_train.to_koalas() - Xy_test = Xy_test.to_koalas() - Xy_train.set_index('index', drop=True, inplace=True) - Xy_train.index.name = x_name - Xy_test.set_index('index', drop=True, inplace=True) - Xy_test.index.name = x_name - else: - Xy_test = Xy.sample( - frac=self.test_ratio, random_state=self.random_state) - Xy_train = Xy.drop(Xy_test.index) - return Xy_train, Xy_test - - def stratified_split(self, - Xy: Union[pd.DataFrame, ks.DataFrame], - x_name: str, y_name: str - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: - """Perform stratified split. - - Parameters - ---------- - Xy : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - x_name: str - Dataframe index name. - y_name: str - Target column name. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame]: - Train set. - Union[pd.DataFrame, ks.DataFrame]: - Test set. - """ - y_values = Xy[y_name].value_counts(normalize=True) - Xy_test_list = [] - Xy_train_list = [] - if isinstance(Xy, ks.DataFrame): - self.test_ratio -= 1e-6 - for label, ratio in y_values.iteritems(): - Xy_label = Xy[Xy[y_name] == label] - Xy_train_label, Xy_test_label = Xy_label.to_spark( - ).randomSplit( - [1. - self.test_ratio, self.test_ratio], - seed=self.random_state - ) - Xy_train_label = Xy_train_label.to_koalas() - Xy_test_label = Xy_test_label.to_koalas() - Xy_train_label.set_index('index', drop=True, inplace=True) - Xy_train_label.index.name = x_name - Xy_test_label.set_index('index', drop=True, inplace=True) - Xy_test_label.index.name = x_name - Xy_test_list.append(Xy_test_label) - Xy_train_list.append(Xy_train_label) - return util.concat(Xy_train_list, axis=0), \ - util.concat(Xy_test_list, axis=0) - - for label, ratio in y_values.iteritems(): - Xy_label = Xy[Xy[y_name] == label] - Xy_label_test = Xy_label.sample( - frac=self.test_ratio, - random_state=self.random_state) - Xy_test_list.append(Xy_label_test) - Xy_train_list.append(Xy_label.drop(Xy_label_test.index)) - return util.concat(Xy_train_list, axis=0), util.concat(Xy_test_list, axis=0) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/xgb_booster_builder.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/xgb_booster_builder.py deleted file mode 100644 index af693ea4..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/xgb_booster_builder.py +++ /dev/null @@ -1,70 +0,0 @@ -# License: Apache-2.0 -from typing import Union -import numpy as np -import xgboost -from xgboost import ( - XGBClassifier, - XGBRegressor, - XGBRFClassifier, - XGBRFRegressor -) - - -class XGBBoosterBuilder: - """XGBoost Booster Converter Class. - - Examples - -------- - >>> import numpy as np - >>> import xgboost as xgb - >>> from gators.model_building import XGBBoosterBuilder - >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_train = np.array([0, 1, 1, 0]) - >>> model = xgb.XGBClassifier(eval_metric='logloss').fit(X_train, y_train) - >>> xgbooster = XGBBoosterBuilder.train( - ... model=model, - ... X_train=X_train, - ... y_train=y_train, - >>> xgbooster.predict(xgb.DMatrix(X_train)) - array([0.5, 0.5, 0.5, 0.5], dtype=float32) - - """ - - @staticmethod - def train( - model: Union[ - XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor], - X_train: np.array, - y_train: np.ndarray, - num_class=None): - """Convert the XGBoost model to a XGB Booster model. - - Parameters - ---------- - model : Union[XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor] - Trained xgboost.sklearn model. - X_train : np.ndarray - Train array. - y_train : np.ndarray - Labels. - - Returns - ------- - xgboost.Booster - Trained xgboost Booster model. - """ - if not isinstance(model, (XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor)): - raise TypeError( - '`model` should be a `xgboost.sklearn` model.') - if not isinstance(X_train, np.ndarray): - raise TypeError('`X_train` should be a NumPy array.') - if not isinstance(y_train, np.ndarray): - raise TypeError('`y_train` should be a NumPy array.') - if num_class is not None and not isinstance(num_class, int): - raise TypeError('`num_class` should be an int.') - params = model.get_xgb_params() - if num_class: - params['num_class'] = num_class - n_estimators = model.n_estimators - dtrain = xgboost.DMatrix(X_train, label=y_train) - return xgboost.train(params, dtrain, n_estimators) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/xgb_treelite_dumper.py b/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/xgb_treelite_dumper.py deleted file mode 100644 index f67ccc47..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/model_building/xgb_treelite_dumper.py +++ /dev/null @@ -1,92 +0,0 @@ -# License: Apache-2.0 -import os -import numpy as np -import xgboost -from xgboost.sklearn import XGBClassifier -import treelite - - -class XGBTreeliteDumper: - """XGBoost Treelite Dumper class. - - Examples - -------- - >>> import numpy as np - >>> import xgboost as xgb - >>> from gators.model_building import XGBTreeliteDumper - >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_train = np.array([0, 1, 1, 0]) - >>> dtrain = xgb.DMatrix(X_train, label=y_train) - >>> model = xgb.train({'max_depth': 1}, dtrain, num_boost_round=1) - >>> XGBTreeliteDumper.dump( - ... model=model, - ... toolchain='gcc', - ... parallel_comp=1, - ... model_path='.', - ... model_name='dummy') - [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler - [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... - """ - - @staticmethod - def dump(model: xgboost.core.Booster, toolchain: str, - parallel_comp: int, - model_path: str, model_name: str): - """Dump the XGBoost treelite as a .so and a - .dylib file. - - Parameters - ---------- - model: xgboost.core.Booster. - Trained model. - toolchain: str - Compiler. List of available treelite compiler. - * gcc - * clang - * msvc - parallel_comp: int - Treelite parallel compilation. - model_path : str - Model path. - model_name : str - Model name. - """ - if not isinstance(model, xgboost.core.Booster): - raise TypeError('`model` should be an xgboost.core.Booster.') - if not isinstance(toolchain, str): - raise TypeError('`toolchain` should be a str.') - if toolchain not in ['gcc', 'clang', 'msvc']: - raise ValueError( - '`toolchain` should be `gcc`, `clang`, or `msvc`.') - if not isinstance(parallel_comp, int): - raise TypeError('`parallel_comp` should be an int.') - if not isinstance(model_path, str): - raise TypeError('`model_path` should be a str.') - if not isinstance(model_name, str): - raise TypeError('`model_name` should be a str.') - model_ = treelite.Model.from_xgboost(model) - platform_dict = {'gcc': 'unix', 'clang': 'osx', 'msvc': 'windows'} - format_dict = {'gcc': '.so', 'clang': '.dylib', 'msvc': '.dll'} - model_.export_lib( - toolchain=toolchain, - libpath=os.path.join( - model_path, model_name + format_dict[toolchain]), - verbose=False, - params={'parallel_comp': parallel_comp}, - nthread=1, - ) - model_.export_srcpkg( - platform=platform_dict[toolchain], - toolchain=toolchain, - params={'parallel_comp': parallel_comp}, - pkgpath=os.path.join(model_path, model_name + '.zip'), - libname=os.path.join( - model_path, model_name + format_dict[toolchain]), - verbose=True, - ) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/__init__.py deleted file mode 100644 index 0adf1f0c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .pipeline import Pipeline - -__init__ =[ - 'Pipeline' -] \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/pipeline.py b/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/pipeline.py deleted file mode 100644 index b3b048bd..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/pipeline.py +++ /dev/null @@ -1,350 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks -from ..transformers.transformer import Transformer -from ..util import util - - -class Pipeline(Transformer): - """Chain the **gators** transformers together. - - Parameters - ---------- - steps : List[Transformer] - List of transformations. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline - >>> X = pd.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) - >>> obj.fit_transform(X) - A B C - 0 0.1 1.0 a - 1 0.2 2.0 b - 2 0.3 2.0 c - 3 0.2 2.0 MISSING - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline - >>> X = ks.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) - >>> obj.fit_transform(X) - A B C - 0 0.1 1.0 a - 1 0.2 2.0 b - 2 0.3 2.0 c - 3 0.2 2.0 MISSING - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline - >>> X = pd.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 1.0, 'a'], - [0.2, 2.0, 'b'], - [0.3, 2.0, 'c'], - [0.2, 2.0, 'MISSING']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline - >>> X = ks.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 1.0, 'a'], - [0.2, 2.0, 'b'], - [0.3, 2.0, 'c'], - [0.2, 2.0, 'MISSING']], dtype=object) - """ - - def __init__(self, steps: List[Transformer]): - if not isinstance(steps, list): - raise TypeError('`steps` should be a list.') - if not steps: - raise TypeError('`steps` should be an empty list.') - self.steps = steps - self.is_model = hasattr(self.steps[-1], 'predict') - self.n_steps = len(self.steps) - self.n_transformations = self.n_steps - 1 if self.is_model else self.n_steps - - def fit(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'Pipeline': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Pipeline - Instance of itself. - """ - self.base_columns = list(X.columns) - for step in self.steps[:self.n_transformations]: - step = step.fit(X, y) - X = step.transform(X) - if self.is_model: - _ = self.steps[-1].fit(X, y) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for step in self.steps[:self.n_transformations]: - X = step.transform(X) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - for step in self.steps[:self.n_transformations]: - X = step.transform_numpy(X) - return X - - def fit_transform(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Fit and transform the pandas dataframe. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed pandas dataframe. - """ - self.base_columns = list(X.columns).copy() - # import time - for step in self.steps[:self.n_transformations]: - step = step.fit(X, y) - X = step.transform(X) - return X - - def predict(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> np.ndarray: - """Predict on X, and predict. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - np.ndarray - Model predictions. - """ - for step in self.steps[:-1]: - X = step.transform(X) - return self.steps[-1].predict(X) - - def predict_proba(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: np.array = None) -> np.ndarray: - """Predict on X, and return the probability of success. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - np.ndarray - Model probabilities of success. - """ - for step in self.steps[:-1]: - X = step.transform(X) - return self.steps[-1].predict_proba(X) - - def predict_numpy(self, - X: np.ndarray, - y: Union[pd.Series, ks.Series] = None - ) -> np.ndarray: - """Predict on X, and predict. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - np.ndarray - Model predictions. - """ - for step in self.steps[:-1]: - X = step.transform_numpy(X) - return self.steps[-1].predict(X) - - def predict_proba_numpy(self, - X: np.ndarray) -> np.ndarray: - """Predict on X, and return the probability of success. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Model probabilities of success. - """ - for step in self.steps[:-1]: - X = step.transform_numpy(X) - return self.steps[-1].predict_proba(X) - - def get_feature_importances(self, k: int) -> pd.Series: - """Get the feature importances of the pipeline. - - Parameters - ---------- - k int - Number of top features to return. - - Returns - ------- - pd.Series - Feature importances. - """ - if not hasattr(self.steps[-1], 'feature_importances_'): - raise AttributeError( - '''The last step of the pipeline should have - the attribute `feature_importances_`''') - feature_importances_ = self.steps[-1].feature_importances_ - return feature_importances_.sort_values(ascending=False).iloc[:k] - - def get_features(self) -> List[str]: - """Get the feature importances of the pipeline. - - Parameters - ---------- - k int - Number of top features to return. - - Returns - ------- - List[str] - List of features. - """ - if not hasattr(self.steps[-1], 'selected_columns'): - raise AttributeError( - '''The last step of the pipeline should have - the attribute `selected_columns`''') - return self.steps[-1].selected_columns - - def get_production_columns(self): - has_feature_importances_ = hasattr( - self.steps[-1], 'feature_importances_') - if not has_feature_importances_: - raise AttributeError( - '''The last step of the pipeline should contains - the atrribute `feature_importances_`''') - features = self.steps[-1].selected_columns - - base_columns_ = features.copy() - for step in self.steps[::-1]: - if not hasattr(step, 'column_names'): - continue - for i, col in enumerate(base_columns_): - if col in step.column_mapping: - base_columns_[i] = step.column_mapping[col] - base_columns_ = list(set(util.flatten_list(base_columns_))) - base_columns_ = list(set(base_columns_)) - prod_columns = [ - c for c in self.base_columns - if c in base_columns_] - return prod_columns diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/tests/test_pipeline.py b/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/tests/test_pipeline.py deleted file mode 100644 index a0e5c136..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/pipeline/tests/test_pipeline.py +++ /dev/null @@ -1,223 +0,0 @@ -# License: Apache-2.0 -from gators.feature_selection.select_from_model import SelectFromModel -from gators.transformers.transformer import Transformer -from sklearn.ensemble import RandomForestClassifier -from gators.pipeline.pipeline import Pipeline -from pandas.testing import assert_series_equal -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd - - -class MultiplyTransformer(Transformer): - - def __init__(self, multiplier): - self.multiplier = multiplier - - def fit(self, X, y=None): - return self - - def transform(self, X): - - return self.multiplier * X - - def transform_numpy(self, X): - return self.multiplier * X - - -class NameTransformer(Transformer): - - def fit(self, X, y=None): - self.column_names = [f'{c}_new' for c in X.columns] - self.column_mapping = dict( - zip(self.column_names, [[c] for c in X.columns])) - self.column_mapping['D_new'] = 'D' - return self - - def transform(self, X): - return X.rename( - columns=dict(zip(X.columns, self.column_names))) - - def transform_numpy(self, X): - return X - - -@pytest.fixture -def pipeline_example(): - X = pd.DataFrame( - [[1.764, 0.4, 0.979, 2.241], - [1.868, -0.977, 0.95, -0.151], - [-0.103, 0.411, 0.144, 1.454], - [0.761, 0.122, 0.444, 0.334]], - columns=list('ABCD')) - y = pd.Series([0, 1, 0, 1], name='TARGET') - steps = [ - MultiplyTransformer(4.), - MultiplyTransformer(0.5), - NameTransformer(), - ] - pipe = Pipeline(steps) - X_expected = pd.DataFrame( - {'A_new': {0: 3.528, 1: 3.736, 2: -0.206, 3: 1.522}, - 'B_new': {0: 0.8, 1: -1.954, 2: 0.822, 3: 0.244}, - 'C_new': {0: 1.958, 1: 1.9, 2: 0.288, 3: 0.888}, - 'D_new': {0: 4.482, 1: -0.302, 2: 2.908, 3: 0.668}}) - return pipe, X, X_expected - - -@ pytest.fixture -def pipeline_with_feature_selection_example(): - X = pd.DataFrame( - [[1.764, 0.4, 0.979, 2.241], - [1.868, -0.977, 0.95, -0.151], - [-0.103, 0.411, 0.144, 1.454], - [0.761, 0.122, 0.444, 0.334]], - columns=list('ABCD')) - y = pd.Series([0, 1, 0, 1], name='TARGET') - model = RandomForestClassifier( - n_estimators=6, max_depth=4, random_state=0) - steps = [ - MultiplyTransformer(4.), - MultiplyTransformer(0.5), - NameTransformer(), - SelectFromModel( - model=model, k=3) - ] - pipe = Pipeline(steps).fit(X, y) - X_expected = pd.DataFrame( - {'A_new': {0: 3.528, 1: 3.736, 2: -0.206, 3: 1.522}, - 'B_new': {0: 0.8, 1: -1.954, 2: 0.822, 3: 0.244}, - 'C_new': {0: 1.958, 1: 1.9, 2: 0.288, 3: 0.888}, - 'D_new': {0: 4.482, 1: -0.302, 2: 2.908, 3: 0.668}}) - return pipe, X, X_expected - - -@ pytest.fixture -def pipeline_with_model_example(): - X = pd.DataFrame( - [[1.764, 0.4, 0.979, 2.241], - [1.868, -0.977, 0.95, -0.151], - [-0.103, 0.411, 0.144, 1.454], - [0.761, 0.122, 0.444, 0.334]], - columns=list('ABCD')) - y = pd.Series([0, 1, 0, 1], name='TARGET') - model = RandomForestClassifier( - n_estimators=6, max_depth=4, random_state=0) - steps = [ - MultiplyTransformer(4.), - MultiplyTransformer(0.5), - NameTransformer(), - model, - ] - X_expected = pd.DataFrame( - {'A_new': {0: 3.528, 1: 3.736, 2: -0.206, 3: 1.522}, - 'B_new': {0: 0.8, 1: -1.954, 2: 0.822, 3: 0.244}, - 'C_new': {0: 1.958, 1: 1.9, 2: 0.288, 3: 0.888}, - 'D_new': {0: 4.482, 1: -0.302, 2: 2.908, 3: 0.668}}) - pipe = Pipeline(steps).fit(X, y) - return pipe, X, X_expected - - -def test_pandas_pipeline_fit_and_transform(pipeline_example): - pipe, X, X_expected = pipeline_example - _ = pipe.fit(X) - X_new = pipe.transform(X) - assert_frame_equal(X_expected, X_new) - - -def test_pandas_fit_transform_pipeline(pipeline_example): - pipe, X, X_expected = pipeline_example - X_new = pipe.fit_transform(X) - assert_frame_equal(X_expected, X_new) - - -def test_pipeline_predict_pandas(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict(X) - assert y_pred.shape == (4, ) - - -def test_pipeline_predict_proba_pandas(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict_proba(X) - assert y_pred.shape == (4, 2) - - -def test_pipeline_numpy(pipeline_example): - pipe, X, X_expected = pipeline_example - _ = pipe.fit(X) - X_numpy_new = pipe.transform_numpy(X.to_numpy()) - assert np.allclose(X_expected.to_numpy(), X_numpy_new) - - -def test_pipeline_predict_numpy(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict_numpy(X.to_numpy()) - assert y_pred.shape == (4, ) - - -def test_pipeline_predict_proba_numpy(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict_proba_numpy(X.to_numpy()) - assert y_pred.shape == (4, 2) - - -def test_default_fit_transform_pipeline(pipeline_example): - pipe, X, X_expected = pipeline_example - X_new = pipe.fit_transform(X) - assert_frame_equal(X_expected, X_new) - - -def test_init(): - with pytest.raises(TypeError): - _ = Pipeline(0) - with pytest.raises(TypeError): - _ = Pipeline([]) - - -def test_pipeline_transform_input_data(pipeline_example): - pipe, X, _ = pipeline_example - _ = pipe.fit(X) - with pytest.raises(TypeError): - _ = pipe.transform(X.to_numpy()) - with pytest.raises(TypeError): - _ = pipe.transform(X, X) - with pytest.raises(TypeError): - _ = pipe.transform_numpy(X) - - -def test_get_feature_importances(pipeline_with_feature_selection_example): - pipe, _, _ = pipeline_with_feature_selection_example - feature_importances_expected = pd.Series( - {'D_new': 0.6, 'B_new': 0.4}) - feature_importances = pipe.get_feature_importances(k=2) - assert_series_equal(feature_importances, feature_importances_expected) - - -def test_get_features(pipeline_with_feature_selection_example): - pipe, _, _ = pipeline_with_feature_selection_example - assert ['D_new', 'B_new'] == pipe.get_features() - - -def test_get_feature_importances_no_feature_selection(pipeline_example): - pipe, _, _ = pipeline_example - with pytest.raises(AttributeError): - pipe.get_feature_importances(k=2) - - -def test_get_features_no_feature_selection(pipeline_example): - pipe, _, _ = pipeline_example - with pytest.raises(AttributeError): - pipe.get_features() - - -def test_get_production_columns(pipeline_with_feature_selection_example): - pipe, _, _ = pipeline_with_feature_selection_example - assert pipe.get_production_columns() == ['B', 'D'] - - -def test_get_production_columns_no_feature_selection(pipeline_example): - pipe, _, _ = pipeline_example - with pytest.raises(AttributeError): - pipe.get_production_columns() diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/__init__.py deleted file mode 100644 index 8e26e5f7..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from .supervised_sampling import SupervisedSampling -from .unsupervised_sampling import UnsupervisedSampling -__all__ =[ - 'UnsupervisedSampling', - 'SupervisedSampling' -] \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/supervised_sampling.py b/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/supervised_sampling.py deleted file mode 100644 index 43c24a14..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/supervised_sampling.py +++ /dev/null @@ -1,172 +0,0 @@ -from ..transformers import TransformerXY -from ..util import util -from typing import Tuple, Union -import pandas as pd -import databricks.koalas as ks - - -class SupervisedSampling(TransformerXY): - """Sample each class depending on its occurrence. - - For example, in a stronly imbalanced binary classification problem, - only the majority is undersampled. - - Parameters - ---------- - n_samples : int - Number of samples to keep - - Examples - -------- - * pandas transform - - >>> import pandas as pd - >>> from gators.sampling import SupervisedSampling - >>> X = pd.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) - >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = SupervisedSampling(n_samples=3) - >>> X, y = obj.transform(X, y) - >>> X - A B C - 1 3 4 5 - 3 9 10 11 - 4 12 13 14 - 5 15 16 17 - >>> y - 1 0 - 3 1 - 4 2 - 5 3 - Name: TARGET, dtype: int64 - - * koalas transform - - >>> import pandas as ks - >>> from gators.sampling import SupervisedSampling - >>> X = ks.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) - >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = SupervisedSampling(n_samples=3) - >>> X, y = obj.transform(X, y) - >>> X - A B C - 1 3 4 5 - 3 9 10 11 - 4 12 13 14 - 5 15 16 17 - >>> y - 1 0 - 3 1 - 4 2 - 5 3 - Name: TARGET, dtype: int64 - - """ - - def __init__(self, n_samples: int): - if not isinstance(n_samples, int): - raise TypeError('`n_samples` should be an int.') - self.n_samples = n_samples - self.frac_vec = pd.Series([]) - - def transform(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], - Union[pd.Series, ks.Series]]: - """Fit and transform the dataframe `X` and the series `y`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series] - Input target. - - Returns - ------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: - Transformed dataframe and the series. - """ - self.check_dataframe(X) - self.check_y(X, y) - y_name = y.name - self.frac_vec = self.compute_sampling_fractions(y, self.n_samples) - Xy = X.join(y) - Xy_sampled = self.sample_dataframe( - Xy=Xy, - frac_vec=self.frac_vec, - y_name=y_name - ) - return Xy_sampled.drop(y_name, axis=1), Xy_sampled[y_name] - - @staticmethod - def compute_sampling_fractions(y: Union[pd.Series, ks.Series], - n_samples: int) -> pd.Series: - """Compute the sampling fractions. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - n_samples : int - Number of samples to keep. - - Returns - ------- - pd.Series - Fraction to keep for each label. - """ - class_count = y.value_counts() - n_classes = len(class_count) - n_samples_per_class = int(n_samples / n_classes) - mask = class_count > n_samples_per_class - n_classes_ = mask.sum() - n_samples_ = n_samples - class_count[~ mask].sum() - frac_vec = n_samples_ / (class_count * n_classes_) - if isinstance(frac_vec, ks.Series): - frac_vec = frac_vec.to_pandas() - frac_vec[frac_vec > 1] = 1. - frac_vec = frac_vec.mask(frac_vec < 1./n_samples, 1./n_samples) - return frac_vec - - @staticmethod - def sample_dataframe(Xy: Union[pd.DataFrame, ks.DataFrame], - frac_vec: pd.Series, y_name: str - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Sample dataframe. - - Parameters - ---------- - Xy : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - frac_vec : pd.Series - Fraction to keep for each label. - y_name : str - Target name. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - if isinstance(Xy, pd.DataFrame): - Xy_sampled = pd.DataFrame(columns=Xy.columns) - else: - Xy_sampled = ks.DataFrame(columns=Xy.columns) - for c, frac in frac_vec.iteritems(): - if frac == 1: - Xy_sampled = util.concat( - [Xy_sampled, Xy[Xy[y_name] == int(c)]], axis=0) - else: - Xy_sampled = util.concat( - [Xy_sampled, - Xy[Xy[y_name] == int(c)].sample( - frac=frac, random_state=0)], - axis=0 - ) - return Xy_sampled.astype(Xy.dtypes.to_dict()) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/tests/test_supervised_sampling.py b/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/tests/test_supervised_sampling.py deleted file mode 100644 index cc9af44c..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/tests/test_supervised_sampling.py +++ /dev/null @@ -1,79 +0,0 @@ -# License: Apache-2.0 -from gators.sampling import SupervisedSampling -from pandas.testing import assert_series_equal -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - n_rows = 30 - n_cols = 5 - n_samples = 5 - np.random.seed(1) - X = pd.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), - columns=list('ABCDE')) - y = pd.Series([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, ], name='TARGET') - obj = SupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame({ - 'A': {2: 10, 8: 40, 12: 60, 18: 90, 27: 135, 22: 110, 29: 145}, - 'B': {2: 11, 8: 41, 12: 61, 18: 91, 27: 136, 22: 111, 29: 146}, - 'C': {2: 12, 8: 42, 12: 62, 18: 92, 27: 137, 22: 112, 29: 147}, - 'D': {2: 13, 8: 43, 12: 63, 18: 93, 27: 138, 22: 113, 29: 148}, - 'E': {2: 14, 8: 44, 12: 64, 18: 94, 27: 139, 22: 114, 29: 149}}) - y_expected = pd.Series( - {2: 0, 8: 0, 12: 1, 18: 1, 27: 2, 22: 2, 29: 3}, - name='TARGET') - return obj, X, y, X_expected, y_expected - - -@pytest.fixture -def data_ks(): - n_rows = 30 - n_cols = 5 - n_samples = 5 - X = ks.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), - columns=list('ABCDE')) - y = ks.Series([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, ], name='TARGET') - np.random.seed(1) - obj = SupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame({ - 'A': {0: 0, 7: 35, 8: 40, 18: 90, 21: 105, 20: 100, 29: 145}, - 'B': {0: 1, 7: 36, 8: 41, 18: 91, 21: 106, 20: 101, 29: 146}, - 'C': {0: 2, 7: 37, 8: 42, 18: 92, 21: 107, 20: 102, 29: 147}, - 'D': {0: 3, 7: 38, 8: 43, 18: 93, 21: 108, 20: 103, 29: 148}, - 'E': {0: 4, 7: 39, 8: 44, 18: 94, 21: 109, 20: 104, 29: 149}}) - y_expected = pd.Series( - {0: 0, 7: 0, 8: 0, 18: 1, 21: 2, 20: 2, 29: 3}, - name='TARGET') - return obj, X, y, X_expected, y_expected - - -def test_pd(data): - obj, X, y, X_expected, y_expected = data - X_new, y_new = obj.transform(X, y) - assert_frame_equal(X_new.sort_index(), X_expected.sort_index()) - assert_series_equal(y_new.sort_index(), y_expected.sort_index()) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, y, X_expected, y_expected = data_ks - X_new, y_new = obj.transform(X, y) - assert_frame_equal(X_new.to_pandas().sort_index(), X_expected.sort_index()) - assert_series_equal(y_new.to_pandas().sort_index(), y_expected.sort_index()) - - -def test_init(): - with pytest.raises(TypeError): - _ = SupervisedSampling(n_samples='a') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/tests/test_unsupervised_sampling.py b/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/tests/test_unsupervised_sampling.py deleted file mode 100644 index 40a55d1e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/tests/test_unsupervised_sampling.py +++ /dev/null @@ -1,86 +0,0 @@ -# License: Apache-2.0 -from gators.sampling import UnsupervisedSampling -from pandas.testing import assert_series_equal -from pandas.testing import assert_frame_equal -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - n_rows = 30 - n_cols = 5 - n_classes = 4 - n_samples = 5 - X = pd.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), - columns=list('ABCDE')) - np.random.seed(1) - y = pd.Series(np.random.randint(0, n_classes, n_rows), name='TARGET') - obj = UnsupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame({ - 'A': {2: 10, 28: 140, 13: 65, 10: 50, 26: 130}, - 'B': {2: 11, 28: 141, 13: 66, 10: 51, 26: 131}, - 'C': {2: 12, 28: 142, 13: 67, 10: 52, 26: 132}, - 'D': {2: 13, 28: 143, 13: 68, 10: 53, 26: 133}, - 'E': {2: 14, 28: 144, 13: 69, 10: 54, 26: 134}}) - y_expected = pd.Series( - {2: 0, 28: 1, 13: 3, 10: 0, 26: 2}, - name='TARGET') - return obj, X, y, X_expected, y_expected - - -@pytest.fixture -def data_ks(): - n_rows = 30 - n_cols = 5 - n_classes = 4 - n_samples = 5 - X = ks.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), - columns=list('ABCDE')) - np.random.seed(1) - y = ks.Series(np.random.randint(0, n_classes, n_rows), name='TARGET') - obj = UnsupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame({ - 'A': {0: 0, 7: 35, 8: 40, 18: 90, 21: 105, 20: 100}, - 'B': {0: 1, 7: 36, 8: 41, 18: 91, 21: 106, 20: 101}, - 'C': {0: 2, 7: 37, 8: 42, 18: 92, 21: 107, 20: 102}, - 'D': {0: 3, 7: 38, 8: 43, 18: 93, 21: 108, 20: 103}, - 'E': {0: 4, 7: 39, 8: 44, 18: 94, 21: 109, 20: 104}} - ) - y_expected = pd.Series( - {0: 1, 7: 1, 8: 3, 18: 2, 21: 1, 20: 2}, name='TARGET') - return obj, X, y, X_expected, y_expected - - -def test_pd(data): - obj, X, y, X_expected, y_expected = data - X_new, y_new = obj.transform(X, y) - assert_frame_equal(X_new.sort_index(), X_expected.sort_index()) - assert_series_equal(y_new.sort_index(), y_expected.sort_index()) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, y, X_expected, y_expected = data_ks - X_new, y_new = obj.transform(X, y) - assert X_new.to_pandas().shape[0] + 1 == X_expected.shape[0] - assert y_new.to_pandas().shape[0] == y_new.shape[0] - assert X_new.to_pandas().shape[1] == X_expected.shape[1] - - -def test_init(): - with pytest.raises(TypeError): - _ = UnsupervisedSampling(n_samples='a') - - -def test_no_sampling(): - X = pd.DataFrame({'A': [0, 1, 2]}) - y = pd.Series([0, 0, 1], name='TARGET') - obj = UnsupervisedSampling(n_samples=5) - assert_frame_equal(X, obj.transform(X, y)[0]) - assert_series_equal(y, obj.transform(X, y)[1]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/unsupervised_sampling.py b/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/unsupervised_sampling.py deleted file mode 100644 index c54f97cd..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/sampling/unsupervised_sampling.py +++ /dev/null @@ -1,95 +0,0 @@ - -from ..transformers import TransformerXY -from typing import Tuple, Dict, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -class UnsupervisedSampling(TransformerXY): - """Randomly sample the data and target. - - Parameters - ---------- - n_samples : int - Number of samples to keep. - - Examples - -------- - - * pandas transform - - >>> import pandas as pd - >>> from gators.sampling import UnsupervisedSampling - >>> X = pd.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) - >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = UnsupervisedSampling(n_samples=3) - >>> X, y = obj.transform(X, y) - >>> X - A B C - 5 15 16 17 - 2 6 7 8 - 1 3 4 5 - >>> y - 5 3 - 2 1 - 1 0 - Name: TARGET, dtype: int64 - - * koalas transform - - >>> import databricks.koalas as ks - >>> from gators.sampling import UnsupervisedSampling - >>> X = ks.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) - >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = UnsupervisedSampling(n_samples=3) - >>> X, y = obj.transform(X, y) - >>> X - A B C - 0 0 1 2 - 3 9 10 11 - 2 6 7 8 - >>> y - 0 0 - 3 1 - 2 1 - Name: TARGET, dtype: int64 - - """ - - def __init__(self, n_samples: int): - if not isinstance(n_samples, int): - raise TypeError('`n_samples` should be an int.') - self.n_samples = n_samples - - def transform(self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: - """Fit and transform the dataframe `X` and the series `y`. - - Parameters: - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series] - Input target. - - Returns - ------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: - Transformed dataframe and the series. - """ - self.check_dataframe(X) - self.check_y(X, y) - frac = self.n_samples / X.shape[0] - if frac >= 1.: - return X, y - y_name = y.name - Xy = X.join(y).sample(frac=round(frac, 3), random_state=0) - return Xy.drop(y_name, axis=1), Xy[y_name] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/__init__.py deleted file mode 100644 index 1ac533b2..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .minmax_scaler import MinMaxScaler -from .standard_scaler import StandardScaler - -__all__ = [ - 'MinMaxScaler', - 'StandardScaler', -] \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/minmax_scaler.py b/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/minmax_scaler.py deleted file mode 100644 index de30fd4a..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/minmax_scaler.py +++ /dev/null @@ -1,136 +0,0 @@ -# License: Apache-2.0 -from scaler import minmax_scaler -from ..transformers.transformer import Transformer -import numpy as np -from typing import Union -import pandas as pd -import databricks.koalas as ks - - -class MinMaxScaler(Transformer): - """Scale each column to the [0, 1] range. - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.scalers import MinMaxScaler - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() - >>> obj.fit_transform(X) - A B - 0 0.0 0.00 - 1 0.5 0.75 - 2 1.0 1.00 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.scalers import MinMaxScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() - >>> obj.fit_transform(X) - A B - 0 0.0 0.00 - 1 0.5 0.75 - 2 1.0 1.00 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.scalers import MinMaxScaler - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0. , 0. ], - [0.5 , 0.75], - [1. , 1. ]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.scalers import MinMaxScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0. , 0. ], - [0.5 , 0.75], - [1. , 1. ]]) - - """ - - def __init__(self, dtype: type = np.float64): - self.dtype = dtype - self.X_min: Union[pd.DataFrame, ks.DataFrame] = None - self.X_max: Union[pd.DataFrame, ks.DataFrame] = None - self.X_min_np = np.array([]) - self.X_max_np = np.array([]) - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'MinMaxScaler': - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - 'MinMaxScaler': Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.X_min = X.min().astype(self.dtype) - self.X_max = X.max().astype(self.dtype) - self.X_min_np = self.X_min.to_numpy().astype(self.dtype) - self.X_max_np = self.X_max.to_numpy().astype(self.dtype) - return self - - def transform(self, X): - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - - def f(x: ks.Series[self.dtype]): - c = x.name - return (x - self.X_min.loc[c]) / (self.X_max[c] - self.X_min[c]) - - return X.astype(self.dtype).apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - return minmax_scaler( - X.astype(self.dtype), self.X_min_np, self.X_max_np) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/scaler.pyx b/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/scaler.pyx deleted file mode 100644 index 9b3b9ab7..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/scaler.pyx +++ /dev/null @@ -1,45 +0,0 @@ -import cython -import numpy as np -cimport numpy as np - -ctypedef fused num_float_t: - np.float32_t - np.float64_t - - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] standard_scaler( - np.ndarray[num_float_t, ndim=2] X, - np.ndarray[num_float_t, ndim=1] X_mean, - np.ndarray[num_float_t, ndim=1] X_std, - -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = X.shape[1] - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X[i, j] = (X[i, j] - X_mean[j]) / X_std[j] - return X - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] minmax_scaler( - np.ndarray[num_float_t, ndim=2] X, - np.ndarray[num_float_t, ndim=1] X_min, - np.ndarray[num_float_t, ndim=1] X_max, - -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = X.shape[1] - with nogil: - for i in range(n_rows): - for j in range(n_cols): - X[i, j] = (X[i, j] - X_min[j]) / (X_max[j] - X_min[j]) - return X \ No newline at end of file diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/standard_scaler.py b/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/standard_scaler.py deleted file mode 100644 index 259ec77e..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/standard_scaler.py +++ /dev/null @@ -1,139 +0,0 @@ -# License: Apache-2.0 -from scaler import standard_scaler -from ..transformers.transformer import Transformer -import numpy as np -from typing import Union -import pandas as pd -import databricks.koalas as ks - - -class StandardScaler(Transformer): - """Scale each column by setting the mean to 0 and the standard deviation to 1. - - - - Parameters - ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.scalers import StandardScaler - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() - >>> obj.fit_transform(X) - A B - 0 -1.0 -1.120897 - 1 0.0 0.320256 - 2 1.0 0.800641 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.scalers import StandardScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() - >>> obj.fit_transform(X) - A B - 0 -1.0 -1.120897 - 1 0.0 0.320256 - 2 1.0 0.800641 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.scalers import StandardScaler - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1. , -1.12089708], - [ 0. , 0.32025631], - [ 1. , 0.80064077]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.scalers import StandardScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1. , -1.12089708], - [ 0. , 0.32025631], - [ 1. , 0.80064077]]) - - """ - - def __init__(self, dtype: type = np.float64): - self.dtype = dtype - self.X_mean: Union[pd.DataFrame, ks.DataFrame] = None - self.X_std: Union[pd.DataFrame, ks.DataFrame] = None - self.X_mean_np = np.array([]) - self.X_std_np = np.array([]) - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'StandardScaler': - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - 'StandardScaler': Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.X_std = X.std().astype(self.dtype) - self.X_mean = X.mean().astype(self.dtype) - self.X_mean_np = self.X_mean.to_numpy().astype(self.dtype) - self.X_std_np = self.X_std.to_numpy().astype(self.dtype) - return self - - def transform(self, X): - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - - def f(x: ks.Series[self.dtype]): - c = x.name - return (x - self.X_mean[c]) / self.X_std[c] - - return X.astype(self.dtype).apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - self.check_array_is_numerics(X) - return standard_scaler( - X.astype(self.dtype), self.X_mean_np, self.X_std_np) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/tests/test_minmax_scaler.py b/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/tests/test_minmax_scaler.py deleted file mode 100644 index a2ecebbf..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/tests/test_minmax_scaler.py +++ /dev/null @@ -1,107 +0,0 @@ -# License: Apache-2.0 -from gators.scalers.minmax_scaler import MinMaxScaler -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - np.arange(25).reshape((5, 5)), - columns=list('ABCDF') - ) - return MinMaxScaler().fit(X), X - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - np.arange(25).reshape((5, 5)), - columns=list('ABCDF') - ) - return MinMaxScaler().fit(X), X - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - np.random.randn(5, 5), - columns=list('ABCDF'), - ) - return MinMaxScaler(dtype=np.float32).fit(X), X - - -@pytest.fixture -def data_float32_ks(): - X = pd.DataFrame( - np.random.randn(5, 5), - columns=list('ABCDF'), - ) - return MinMaxScaler(dtype=np.float32).fit(X), X - - -def test_pd(data): - obj, X = data - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X = data_ks - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -def test_pd_np(data): - obj, X = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -def test_float32_pd(data_float32): - obj, X = data_float32 - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X = data_float32_ks - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -def test_float32_pd_np(data_float32): - obj, X = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/tests/test_standard_scaler.py b/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/tests/test_standard_scaler.py deleted file mode 100644 index 948d3b19..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/scalers/tests/test_standard_scaler.py +++ /dev/null @@ -1,109 +0,0 @@ -# License: Apache-2.0 -from gators.scalers.standard_scaler import StandardScaler -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - X = pd.DataFrame( - np.random.randn(5, 5), - columns=list('ABCDF') - ) - return StandardScaler().fit(X), X - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - np.random.randn(5, 5), - columns=list('ABCDF') - ) - return StandardScaler().fit(X), X - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - np.random.randn(5, 5), - columns=list('ABCDF'), - dtype=np.float32 - ) - return StandardScaler().fit(X), X - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame( - np.random.randn(5, 5), - columns=list('ABCDF'), - dtype=np.float32 - ) - return StandardScaler().fit(X), X - - -def test_pd(data): - obj, X = data - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X = data_ks - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -def test_pd_np(data): - obj, X = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -def test_float32_pd(data_float32): - obj, X = data_float32 - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X = data_float32_ks - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) - - -def test_float32_pd_np(data_float32): - obj, X = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/__init__.py b/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/__init__.py deleted file mode 100644 index b87dc759..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .transformer import Transformer -from .transformer_xy import TransformerXY - -__init__ = [ - 'Transformer', - 'TransformerXY', -] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/tests/test_transformer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/tests/test_transformer.py deleted file mode 100644 index f2247fd0..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/tests/test_transformer.py +++ /dev/null @@ -1,128 +0,0 @@ -# License: Apache-2.0 -from gators.transformers.transformer import Transformer -import numpy as np -import pytest -import pandas as pd -import databricks.koalas as ks - - -class Class(Transformer): - - def fit(self, X, y=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - - -def test_no_fit_method(): - with pytest.raises(TypeError): - - class Class(Transformer): - pass - - Class() - - -def test_no_transform_method(): - with pytest.raises(TypeError): - - class Class(Transformer): - def fit(self): - pass - - Class() - - -def test_object_creation(): - - class Class(Transformer): - - def fit(self, X, y=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - Class().fit(0).transform(0) - assert True - - -def test_object_creation_with_fit_transform(): - - class Class(Transformer): - - def fit(self, X, y_none=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - - Class().fit_transform(0) - assert True - - -def test_check_dataframe_contains_numerics(): - Transformer.check_dataframe_contains_numerics( - pd.DataFrame({'A': [1], 'B': ['b']})) - - -def test_checks(): - X = pd.DataFrame() - with pytest.raises(TypeError): - Transformer.check_dataframe([]) - with pytest.raises(ValueError): - Transformer.check_dataframe( - pd.DataFrame({'A': [1], 0: ['x']})) - with pytest.raises(TypeError): - Transformer.check_y( - pd.DataFrame({'A': [1], 0: ['x']}), []) - with pytest.raises(TypeError): - Transformer.check_y( - ks.DataFrame({'A': [1], 0: ['x']}), []) - with pytest.raises(TypeError): - Transformer.check_y( - pd.DataFrame({'A': [1], 0: ['x']}), pd.Series([1])) - with pytest.raises(ValueError): - Transformer.check_y( - pd.DataFrame({'A': [1], 0: ['x']}), pd.Series([1, 2], name='Y')) - with pytest.raises(TypeError): - Transformer.check_array([]) - with pytest.raises(TypeError): - Transformer.check_y(X, []) - with pytest.raises(ValueError): - Class().check_array_is_numerics( - np.array(['a'])) - with pytest.raises(ValueError): - Transformer.check_dataframe_is_numerics( - pd.DataFrame({'A': [1], 'x': ['x']})) - with pytest.raises(ValueError): - Transformer.check_binary_target( - pd.Series([1, 2, 3], name='TARGET')) - with pytest.raises(ValueError): - Transformer.check_multiclass_target( - pd.Series([1.1, 2.2, 3.3], name='TARGET')) - with pytest.raises(ValueError): - Transformer.check_regression_target( - pd.Series([1, 0, 0], name='TARGET')) - with pytest.raises(ValueError): - Class().check_nans(pd.DataFrame({'A': [np.nan]}), columns=['A']) - with pytest.raises(ValueError): - Class().check_dataframe_with_objects( - pd.DataFrame({'A': [1.1], 'B': [0]})) - with pytest.raises(ValueError): - Class().check_dataframe_contains_numerics( - pd.DataFrame({'A': ['a'], 'B': ['b']})) - with pytest.raises(ValueError): - Class().check_datatype(object, [np.float64]) - with pytest.raises(ValueError): - Class().check_array_is_numerics( - np.array([['a'], ['b']])) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/tests/test_transformer_xy.py b/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/tests/test_transformer_xy.py deleted file mode 100644 index f0212946..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/tests/test_transformer_xy.py +++ /dev/null @@ -1,54 +0,0 @@ -# License: Apache-2.0 -from gators.transformers.transformer_xy import TransformerXY -import numpy as np -import pytest -import pandas as pd -import databricks.koalas as ks - - -def test_no_transform_method(): - with pytest.raises(TypeError): - - class Class(TransformerXY): - def fit(self): - pass - - Class() - - -def test_object_creation(): - - class Class(TransformerXY): - - def fit(self, X, y=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - Class().fit(0).transform(0) - assert True - - -def test_checks(): - with pytest.raises(TypeError): - TransformerXY.check_dataframe([]) - with pytest.raises(TypeError): - TransformerXY.check_dataframe( - pd.DataFrame({'A': [1], 0: ['x']})) - with pytest.raises(TypeError): - TransformerXY.check_y( - pd.DataFrame({'A': [1], 0: ['x']}), []) - with pytest.raises(TypeError): - TransformerXY.check_y( - ks.DataFrame({'A': [1], 0: ['x']}), []) - with pytest.raises(TypeError): - TransformerXY.check_y( - pd.DataFrame({'A': [1], 0: ['x']}), pd.Series([1])) - with pytest.raises(ValueError): - TransformerXY.check_y( - pd.DataFrame({'A': [1], 0: ['x']}), pd.Series([1, 2], name='y')) - with pytest.raises(TypeError): - TransformerXY.check_y([]) diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/transformer.py b/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/transformer.py deleted file mode 100644 index 0de138be..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/transformer.py +++ /dev/null @@ -1,315 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union -from abc import ABC -from abc import abstractmethod -import numpy as np -import pandas as pd -import databricks.koalas as ks - -NUMERICS_DTYPES = [np.int16, np.int32, np.int64, np.float32, np.float64] -PRINT_NUMERICS_DTYPES = ', '.join( - [dtype.__name__ for dtype in NUMERICS_DTYPES]) - - -class Transformer(ABC): - """Abstract **gators** transformer class. - - Examples - --------- - - * A Gators transformer. - - >>> import pandas as pd - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.transformers import Transformer - >>> class GetFirstColumn(Transformer): - ... def fit(self, X, y=None): - ... return self - ... def transform(self, X: pd.DataFrame): - ... return X[[X.columns[0]]] - ... def transform_numpy(self, X: np.ndarray): - ... return X[:, 0].reshape(-1, 1) - - * fit & transform with `pandas` - - >>> GetFirstColumn().fit_transform( - ... pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) - A - 0 1 - 1 2 - - * fit with `pandas` & transform with `NumPy` - - >>> obj = GetFirstColumn().fit( - ... pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) - >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) - array([[5], - [7]]) - - * fit & transform with `koalas` - - >>> GetFirstColumn().fit_transform( - ... ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) - A - 0 1 - 1 2 - - * fit with `koalas` & transform with `NumPy` - - >>> obj = GetFirstColumn().fit( - ... ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) - >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) - array([[5], - [7]]) - - """ - - @abstractmethod - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None) -> 'Transformer': - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Transformer: Instance of itself. - """ - - @abstractmethod - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame], - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - - @abstractmethod - def transform_numpy(self, X: Union[pd.Series, ks.Series], - y: Union[pd.Series, ks.Series] = None): - """Transform the array X. - - Parameters - ---------- - X : np.ndarray - Array - """ - - def fit_transform( - self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Fit and Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Input target. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - _ = self.fit(X, y) - return self.transform(X) - - @staticmethod - def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): - """Validate dataframe. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - """ - if not isinstance(X, (pd.DataFrame, ks.DataFrame)): - raise TypeError( - '''`X` should be a pandas dataframe or a koalas dataframe.''') - for c in X.columns: - if not isinstance(c, str): - raise ValueError( - 'Column names of `X` should be of type str.') - - @ staticmethod - def check_y(X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]): - """Validate target. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - y : Union[pd.Series, ks.Series] - Labels - """ - if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): - raise TypeError('`y` should be a pandas series.') - if isinstance(X, ks.DataFrame) and (not isinstance(y, ks.Series)): - raise TypeError('`y` should be a koalas series.') - if not isinstance(y.name, str): - raise TypeError('Name of `y` should be a str.') - if X.shape[0] != y.shape[0]: - raise ValueError('Length of `X` and `y` should match.') - - @ staticmethod - def check_array(X: np.ndarray): - """Validate array. - - Parameters - ---------- - X (np.ndarray): Array. - """ - if not isinstance(X, np.ndarray): - raise TypeError('`X` should be a NumPy array.') - - @staticmethod - def check_dataframe_is_numerics(X: Union[pd.DataFrame, ks.DataFrame]): - """Check if dataframe is only numerics. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - X_dtypes = X.dtypes.unique() - for x_dtype in X_dtypes: - if x_dtype not in NUMERICS_DTYPES: - raise ValueError( - f'`X` should be of type {PRINT_NUMERICS_DTYPES}.') - - def check_datatype(self, dtype, accepted_dtypes): - """Check if dataframe is only numerics. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - print_dtypes = ', '.join([dtype.__name__ for dtype in accepted_dtypes]) - if dtype not in accepted_dtypes: - raise ValueError( - f'''`X` should be of type {print_dtypes}. - Use gators.converter.ConvertColumnDatatype before - calling the transformer {self.__class__.__name__}.''') - - @staticmethod - def check_binary_target(y: Union[pd.Series, ks.Series]): - """Raise an error if the target datatype is not binary. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - """ - if y.nunique() != 2 or 'int' not in str(y.dtype): - raise ValueError('`y` should be binary.') - - @staticmethod - def check_multiclass_target(y: Union[pd.Series, ks.Series]): - """Raise an error if the target datatype is not discrete. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - """ - if 'int' not in str(y.dtype): - raise ValueError('`y` should be discrete.') - - @staticmethod - def check_regression_target(y: Union[pd.Series, ks.Series]): - """Raise an error if the target datatype is not discrete. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - """ - if 'float' not in str(y.dtype): - raise ValueError('`y` should be float.') - - @ staticmethod - def check_dataframe_contains_numerics( - X: Union[pd.DataFrame, ks.DataFrame]): - """Check if dataframe is only numerics. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - X_dtypes = X.dtypes.unique() - for x_dtype in X_dtypes: - if x_dtype in NUMERICS_DTYPES: - return - raise ValueError( - f'''`X` should contains one of the following float dtypes: - {PRINT_NUMERICS_DTYPES}. - Use gators.converter.ConvertColumnDatatype before - calling this transformer.''') - - def check_dataframe_with_objects( - self, X: Union[pd.DataFrame, ks.DataFrame]): - """Check if dataframe contains object columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - contains_object = object in X.dtypes.unique() - if not contains_object: - raise ValueError( - f'''`X` should contains object columns to use the transformer - {self.__class__.__name__}.''') - - def check_array_is_numerics(self, X: np.ndarray): - """Check if array is only numerics. - - Parameters - ---------- - X : np.ndarray - Array - """ - if X.dtype not in NUMERICS_DTYPES: - raise ValueError( - f'''`X` should be of type {PRINT_NUMERICS_DTYPES} - to use the transformer {self.__class__.__name__}. - Use gators.converter.ConvertColumnDatatype before calling it. - ''') - - def check_nans(self, X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str]): - """Raise an error if X contains NaN values. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - columns : List[str] - List of columns. - """ - if X[columns].isnull().sum().sum() != 0: - raise ValueError( - f'''The object columns should not contain NaN values - to use the transformer {self.__class__.__name__}. - Use `gators.imputers.ObjectImputer` before calling it.''') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/transformer_xy.py b/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/transformer_xy.py deleted file mode 100644 index fd197d02..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/transformers/transformer_xy.py +++ /dev/null @@ -1,102 +0,0 @@ -# License: Apache-2.0 -from typing import Union -from abc import ABC -from abc import abstractmethod -import pandas as pd -import databricks.koalas as ks - - -class TransformerXY(ABC): - """Abstract **gators** class to transform both X and y. - - Examples - --------- - - >>> from gators.transformers import TransformerXY - >>> class FirsRows(TransformerXY): - ... def transform(self, X, y): - ... return X.head(1), y.head(1) - - * transform with pandas - - >>> import pandas as pd - >>> X, y = FirsRows().transform( - ... X=pd.DataFrame({'A':[1, 2], 'B':[3, 4]}), - ... y=pd.Series([0, 1],name='TARGET')) - >>> X - A B - 0 1 3 - >>> y - 0 0 - Name: TARGET, dtype: int64 - - * transform with `koalas` - - >>> import databricks.koalas as ks - >>> X, y = FirsRows().transform( - ... X=ks.DataFrame({'A':[1, 2], 'B':[3, 4]}), - ... y=ks.Series([0, 1],name='TARGET')) - >>> X - A B - 0 1 3 - >>> y - 0 0 - Name: TARGET, dtype: int64 - - """ - - @abstractmethod - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]): - """Fit and Transform the dataframes `X`ad `y`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series] - None. - - Returns - ------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]] - Transformed dataframes. - """ - - @staticmethod - def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): - """Validate dataframe. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - """ - if not isinstance(X, (pd.DataFrame, ks.DataFrame)): - raise TypeError( - '''`X` should be a pandas dataframe or a koalas dataframe.''') - for c in X.columns: - if not isinstance(c, str): - raise TypeError('Column names of `X` should be of type str.') - - @ staticmethod - def check_y(X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series]): - """Validate target. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - y : Union[pd.Series, ks.Series] - Labels - """ - if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): - raise TypeError('`y` should be a pandas series.') - if isinstance(X, ks.DataFrame) and (not isinstance(y, ks.Series)): - raise TypeError('`y` should be a koalas series.') - if not isinstance(y.name, str): - raise TypeError('Name of `y` should be a str.') - if X.shape[0] != y.shape[0]: - raise ValueError('Length of `X` and `y` should match.') diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/util/benchmark.py b/build/lib.macosx-10.9-x86_64-3.9/gators/util/benchmark.py deleted file mode 100644 index d1900f60..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/util/benchmark.py +++ /dev/null @@ -1,301 +0,0 @@ -# License: Apache-2.0 -from typing import List -import numpy as np -import pandas as pd -import matplotlib.pyplot as plt -from IPython import get_ipython -from ..transformers.transformer import Transformer - - -def get_runtime_in_milliseconds(ipynb_benchmark: str) -> float: - """Return the runtime in seconds. - - Parameters - ---------- - ipynb_benchmark : str - Output of the jupyter - timeit magic command. - - Returns - ------- - float: - Runtime in milliseconds. - """ - if not isinstance(ipynb_benchmark, str): - raise TypeError('`ipynb_benchmark` should be a str') - dump = ipynb_benchmark.split(' ± ')[0].split(' ') - if 's' not in ipynb_benchmark: - raise ValueError('`ipynb_benchmark` format not supported') - val = float(dump[0]) - t_unit = dump[1] - if 'ms' in t_unit: - return val - if 'µs' in t_unit: - return val * 1e-3 - if 'ns' in t_unit: - return val * 1e-6 - if 's' in t_unit: - return val * 1e3 - - -def generate_per_sample_benchmarking( - objs: List[Transformer], - Xs: List[pd.DataFrame], - extra_info_X_vec: List[str] = None, - extra_info_O_vec: List[str] = None, - ys: List[np.ndarray] = None, - timeit_args='') -> pd.DataFrame: - """Calculate the per-sample benchmarking. - - Parameters - ---------- - objs List[Transformer]: - List of transformers. - Xs List[pd.DataFrame]: - List of dataFrames. - ys List[pd.Series], default to None: - List of target values. - - - Returns - ------- - pd.DataFrame: - Benchmarking results. - """ - if ys is None: - ys = len(Xs) * [None] - if not extra_info_O_vec: - index = [ - f'{obj.__class__.__name__}{extra_info_X}' - for obj, extra_info_X in zip(objs, extra_info_X_vec) - ] - elif not extra_info_X_vec: - index = [ - f'{obj.__class__.__name__}{extra_info_O}' - for obj, extra_info_O in zip(objs, extra_info_O_vec) - ] - else: - index = [ - f'{obj.__class__.__name__}{extra_info_O}{extra_info_X}' - for obj, extra_info_O, extra_info_X in zip(objs, extra_info_X_vec, extra_info_O_vec) - ] - columns = ['pandas', 'numpy'] - results = pd.DataFrame(np.nan, columns=columns, index=index) - if not extra_info_O_vec: - extra_info_O_vec = len(objs) * [''] - if not extra_info_X_vec: - extra_info_X_vec = len(Xs) * [''] - for i, (obj, extra_info_O) in enumerate(zip(objs, extra_info_O_vec)): - for X, y, extra_info_X in zip(Xs, ys, extra_info_X_vec): - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o {timeit_args} -q obj.transform(X_row.copy())') - results.loc[f'{obj.__class__.__name__}{extra_info_O}{extra_info_X}', 'pandas' - ] = get_runtime_in_milliseconds(str(dummy)) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())') - results.loc[f'{obj.__class__.__name__}{extra_info_O}{extra_info_X}', 'numpy' - ] = get_runtime_in_milliseconds(str(dummy)) - return results - - -def benchmark_with_same_X( - objs: List[Transformer], - X: pd.DataFrame, - info_vec: List[str], - y: pd.Series = None, - timeit_args='') -> pd.DataFrame: - index = [ - f'{obj.__class__.__name__}{info}' - for obj, info in zip(objs, info_vec) - ] - columns = ['pandas', 'numpy'] - results = pd.DataFrame(np.nan, columns=columns, index=index) - for obj, info in zip(objs, info_vec): - idx = f'{obj.__class__.__name__}{info}' - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform(X_row)') - results.loc[idx, 'pandas'] = get_runtime_in_milliseconds( - str(dummy)) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())') - results.loc[idx, 'numpy'] = get_runtime_in_milliseconds(str(dummy)) - return results - - -def benchmark( - objs: object, - Xs: List[pd.DataFrame], - info_vec: List[str], - y: pd.Series = None, - timeit_args='') -> pd.DataFrame: - - index = [ - f'{obj.__class__.__name__}{info}' - for obj, info in zip(objs, info_vec) - ] - columns = ['pandas', 'numpy'] - bench = pd.DataFrame(np.nan, columns=columns, index=index) - - for obj, X, info in zip(objs, Xs, info_vec): - idx = f'{obj.__class__.__name__}{info}' - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform(X_row)') - bench.loc[idx, 'pandas'] = get_runtime_in_milliseconds(str(dummy)) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())') - bench.loc[idx, 'numpy'] = get_runtime_in_milliseconds(str(dummy)) - return bench - - -def benchmark_with_same_obj( - obj: object, - Xs: List[pd.DataFrame], - info_vec: List[str], - y: pd.Series = None, - timeit_args='') -> pd.DataFrame: - - index = [ - f'{obj.__class__.__name__}{info}' - for info in info_vec - ] - columns = ['pandas', 'numpy'] - results = pd.DataFrame(np.nan, columns=columns, index=index) - for X, info in zip(Xs, info_vec): - idx = f'{obj.__class__.__name__}{info}' - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform(X_row)') - results.loc[idx, 'pandas'] = get_runtime_in_milliseconds( - str(dummy)) - dummy = get_ipython().run_line_magic( - 'timeit', f'-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())') - results.loc[idx, 'numpy'] = get_runtime_in_milliseconds(str(dummy)) - return results - - -def plot_comparison(bench_dict): - for key, val in bench_dict.items(): - column = 'column' if key == 1 else 'columns' - (val[columns] * 1e-3).plot.bar( - logy=True, - ylabel='runtime (s)', - xlabel='trasformer', - rot=90, - color=['#c73d22', '#0077ea'], - legend=True, - figsize=[5*1.61, 5], - title=f'per-sample transform vs transform_numpy\n datetime feature generation - {key} {column}', - width=0.75, - fontsize=10) - plt.show() - - -def plot_ratios(bench_dict): - for key, val in bench_dict.items(): - ratio = val['pandas'] / val['numpy'] - column = 'column' if key == 1 else 'columns' - ax = ratio.plot.bar( - rot=90, - color=['#0077ea'], - legend=False, - figsize=[5*1.61, 5], - title=f'per-sample transform vs transform_numpy\n datetime feature generation - {key} {column}', - width=0.75, - fontsize=10, - ) - for p in ax.patches: - ax.annotate(f'{round(p.get_height())}X', - (p.get_x() * 1+0.25, p.get_height() * 1.02)) - ax.spines['top'].set_visible(False) - ax.spines['right'].set_visible(False) - ax.spines['bottom'].set_visible(False) - ax.spines['left'].set_visible(False) - ax.get_yaxis().set_ticks([]) - plt.show() - - -def plot_all(bench_dict): - # key = list(bench_dict.keys())[-1] - # val = bench_dict[key] - # columns = (val['pandas']/val['numpy']).sort_values().index - # print(columns) - for key, val in bench_dict.items(): - # val = val.loc[columns] - fig, ax = plt.subplots(1, 2, figsize=[18, 8]) - column = 'column' if key == 1 else 'columns' - val.index = val.index.str.split('_').str[0] - (val * 1e-3).plot.bar( - ax=ax[0], - logy=True, - ylabel='runtime (s)', - xlabel='transformers', - rot=90, - color=['#c73d22', '#0077ea'], - legend=True, - figsize=[5*1.61, 5], - width=0.75, - fontsize=10, - ylim=[1e-6, 1]) - (val['pandas']/val['numpy']).plot.bar( - ax=ax[1], - rot=90, - color=['#0077ea'], - legend=False, - figsize=[5*1.61, 5], - ylabel='runtime speed-up', - xlabel='transformers', - width=0.75, - fontsize=10, - ) - for p in ax[1].patches: - ax[1].annotate( - f'{round(p.get_height())}X', - (p.get_x()+p.get_width()/2., p.get_height()), - ha='center', - va='center', - xytext=(0, 10), textcoords='offset points') - - ax[1].spines['top'].set_visible(False) - ax[1].spines['right'].set_visible(False) - ax[1].spines['bottom'].set_visible(False) - ax[1].spines['left'].set_visible(False) - ax[1].get_yaxis().set_ticks([]) - - title = f'''per-sample transform vs transform_numpy - {key} {column}''' - plt.suptitle(title, fontsize=12) - plt.tight_layout() - plt.show() - - -def run_X(objs, X, columns, n_vec=[1, 10, 100], y=None, timeit_args=''): - bench_dict = {} - if y is None: - ys = None - else: - ys = [y] - for n in n_vec: - if n == 1: - bench_dict[1] = generate_per_sample_benchmarking( - objs, [X], extra_info_X_vec=['_1column'], ys=ys, - timeit_args=timeit_args) - - else: - XN = X.copy() - for col in columns: - for i in range(n - 1): - XN[f'{col}{i}'] = X[col].copy() - bench_dict[n] = generate_per_sample_benchmarking( - objs, [XN], extra_info_X_vec=[f'_{n}column'], ys=ys, - timeit_args=timeit_args) - return bench_dict diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/util/tests/test_benchmark.py b/build/lib.macosx-10.9-x86_64-3.9/gators/util/tests/test_benchmark.py deleted file mode 100644 index 3c1aafef..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/util/tests/test_benchmark.py +++ /dev/null @@ -1,43 +0,0 @@ -# # License: Apache-2.0 -# import pytest -# import numpy as np -# import pandas as pd -# from gators.scalers.minmax_scaler import MinMaxScaler -# from gators.scalers.standard_scaler import StandardScaler -# from gators.util import benchmark - - -# def test_get_runtime_in_milliseconds(): -# with pytest.raises(ValueError): -# benchmark.get_runtime_in_milliseconds('5X ± ') -# assert benchmark.get_runtime_in_milliseconds('2 ns ± ') == 2e-6 -# assert benchmark.get_runtime_in_milliseconds('3 µs ± ') == 3e-3 -# assert benchmark.get_runtime_in_milliseconds('4 ms ± ') == 4 -# assert benchmark.get_runtime_in_milliseconds('5 s ± ') == 5e3 - - -# def test_generate_per_sample_benchmarking(): -# data = np.arange(9).reshape(3, 3) -# Xs = [ -# pd.DataFrame( -# data, columns=list('ABC'), dtype=float), -# pd.DataFrame( -# data, columns=list('ABC'), dtype=float), -# ] -# objs = [ -# MinMaxScaler(), -# StandardScaler(), -# ] -# extra_info_X_vec = ['Int', 'Float'] -# timeit_args = '-n 1 -r 1' - -# bench = benchmark.generate_per_sample_benchmarking( -# Xs=Xs, -# objs=objs, -# extra_info_X_vec=extra_info_X_vec, -# timeit_args=timeit_args -# ) -# assert list(bench.columns) == ['pandas', 'numpy'] -# assert list(bench.index) == [ -# 'MinMaxScalerInt', 'StandardScalerFloat', -# 'MinMaxScalerFloat', 'StandardScalerInt'] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/util/tests/test_util.py b/build/lib.macosx-10.9-x86_64-3.9/gators/util/tests/test_util.py deleted file mode 100644 index 201f0c0f..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/util/tests/test_util.py +++ /dev/null @@ -1,199 +0,0 @@ -# License: Apache-2.0 -from gators.util import util -import pytest -import numpy as np -import pandas as pd -import databricks.koalas as ks -from pandas.testing import assert_frame_equal -ks.set_option('compute.default_index_type', 'distributed-sequence') - - -@pytest.fixture -def data(): - return pd.DataFrame({ - 'A': 1.1, 'B': 2.1, 'C': 3.1, 'D': 4, 'E': 5, 'F': 'a'}, - index=[0]) - - -@pytest.fixture -def data_ks(): - return ks.DataFrame({ - 'A': 1.1, 'B': 2.1, 'C': 3.1, 'D': 4, 'E': 5, 'F': 'a'}, - index=[0]) - - -def test_get_bounds(): - assert np.allclose( - util.get_bounds(np.float32), [-3.4028235e+38, 3.4028235e+38]) - assert np.allclose( - util.get_bounds(np.int32), [-2147483648, 2147483647]) - assert np.allclose( - util.get_bounds(np.int16), [-32768, 32767]) - - -def test_get_datatype_columns_float_pd(data): - X = data - float_columns = util.get_datatype_columns(X, np.float64) - assert float_columns == ['A', 'B', 'C'] - - -def test_get_datatype_columns_int_pd(data): - X = data - int_columns = util.get_datatype_columns(X, np.int64) - assert int_columns == ['D', 'E'] - - -def test_get_datatype_columns_object_pd(data): - X = data - object_columns = util.get_datatype_columns(X, object) - assert object_columns == ['F'] - - -def test_get_float_only_columns_pd(data): - X = data - float_only_columns = util.get_float_only_columns(X) - assert float_only_columns == ['A', 'B', 'C'] - - -def test_get_float_only_columns_pd_no(data): - X = pd.DataFrame({'F': 'a'}, index=[0]) - float_only_columns = util.get_float_only_columns(X) - assert float_only_columns == [] - - -def test_get_int_only_columns_pd(data): - X = data - int_only_columns = util.get_int_only_columns(X) - assert int_only_columns == ['D', 'E'] - - -def test_get_int_only_columns_pd_no(data): - X = pd.DataFrame({'A': 'a', 'B': 'b', 'C': 'c', 'F': 'f'}, index=[0]) - int_only_columns = util.get_int_only_columns(X) - assert int_only_columns == [] - - -def test_get_idx_columns(): - columns = ['A', 'B', 'C', 'D', 'E'] - selected_columns = ['A', 'C', 'E'] - indx = util.get_idx_columns( - columns, selected_columns) - assert np.allclose(indx, np.array([0, 2, 4])) - - -def test_exclude_idx_columns(): - columns = ['A', 'B', 'C', 'D', 'E'] - selected_columns = ['A', 'C', 'E'] - idx = util.exclude_idx_columns( - columns, selected_columns) - assert np.allclose(idx, np.array([1, 3])) - - -def test_concat_pd(data): - X = data - assert_frame_equal( - util.concat( - [ - X, - X[['A']].rename(columns={'A': 'AA'}) - ], - axis=1), - pd.concat( - [ - X, - X[['A']].rename(columns={'A': 'AA'}) - ], - axis=1) - ) - - -@pytest.mark.koalas -def test_get_datatype_columns_float_ks(data_ks): - X = data_ks - float_columns = util.get_datatype_columns(X, np.float64) - assert float_columns == ['A', 'B', 'C'] - - -@pytest.mark.koalas -def test_get_datatype_columns_int_ks(data_ks): - X = data_ks - int_columns = util.get_datatype_columns(X, np.int64) - assert int_columns == ['D', 'E'] - - -@pytest.mark.koalas -def test_get_datatype_columns_object_ks(data_ks): - X = data_ks - object_columns = util.get_datatype_columns(X, object) - assert object_columns == ['F'] - - -@pytest.mark.koalas -def test_get_float_only_columns_ks(data_ks): - X = data_ks - float_only_columns = util.get_float_only_columns(X) - assert float_only_columns == ['A', 'B', 'C'] - - -@pytest.mark.koalas -def test_get_int_only_columns_ks(data_ks): - X = data_ks - int_only_columns = util.get_int_only_columns(X) - assert int_only_columns == ['D', 'E'] - - -@pytest.mark.koalas -def test_concat_ks(data_ks): - X = data_ks - assert_frame_equal( - util.concat( - [ - X, - X[['A']].rename(columns={'A': 'AA'}) - ], - axis=1).to_pandas(), - ks.concat( - [ - X, - X[['A']].rename(columns={'A': 'AA'}) - ], - axis=1).to_pandas() - ) - - -@pytest.mark.koalas -def test_generate_spark_dataframe(): - X = ks.DataFrame({ - 'A': [1, 2, 3], - 'B': [100, 50, 50] - }) - y = ks.Series([0, 1, 0], name='TARGET') - ks_expected = ks.DataFrame({ - 'A': [1, 2, 3], - 'B': [100, 50, 50], - 'TARGET': [0, 1, 0], - 'features': [[1.0, 100.0], [2.0, 50.0], [3.0, 50.0]] - }) - spark_df = util.generate_spark_dataframe(X=X, y=y) - spark_df_as_ks = ks.DataFrame(spark_df) - assert_frame_equal(ks_expected.to_pandas(), spark_df_as_ks.to_pandas()) - - -@pytest.mark.koalas -def test_generate_spark_dataframe_no_target(): - X = ks.DataFrame({ - 'A': [1, 2, 3], - 'B': [100, 50, 50] - }) - ks_expected = ks.DataFrame({ - 'A': [1, 2, 3], - 'B': [100, 50, 50], - 'features': [[1.0, 100.0], [2.0, 50.0], [3.0, 50.0]] - }) - spark_df = util.generate_spark_dataframe(X=X) - spark_df_as_ks = ks.DataFrame(spark_df) - assert_frame_equal(ks_expected.to_pandas(), spark_df_as_ks.to_pandas()) - - -def test_flatten_list(): - assert util.flatten_list([1, 2, [3, 4]]) == [1, 2, 3, 4] diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/util/util.py b/build/lib.macosx-10.9-x86_64-3.9/gators/util/util.py deleted file mode 100644 index 63e8a573..00000000 --- a/build/lib.macosx-10.9-x86_64-3.9/gators/util/util.py +++ /dev/null @@ -1,276 +0,0 @@ -# License: Apache-2.0 -from pyspark.ml.feature import VectorAssembler -from typing import List, Union -import numpy as np -import pandas as pd -import databricks.koalas as ks - - -def get_bounds(X_dtype: type) -> List: - """Return upper and lower of the input numerical NumPy datatype. - - Parameters - ---------- - X_dtype : type, default to np.float64 - Numerical NumPy datatype. - - Returns - ------- - List - Lower ad upper bounds. - """ - if 'float' in str(X_dtype): - info = np.finfo(X_dtype) - return info.min, info.max - elif 'int' in str(X_dtype): - info = np.iinfo(X_dtype) - return info.min, info.max - - -def concat(objs: List[Union[pd.DataFrame, ks.DataFrame]], - axis: int) -> Union[pd.DataFrame, ks.DataFrame]: - """Concatenate the `objs` along an axis. - - Parameters - ---------- - objs : List[Union[pd.DataFrame, ks.DataFrame]] - List of dataframes to concatenate. - axis : int - The axis to concatenate along. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Concatenated dataframe. - """ - if isinstance(objs[0], (pd.DataFrame, pd.Series)): - return pd.concat(objs, axis=axis) - return ks.concat(objs, axis=axis) - - -def get_datatype_columns( - X: Union[pd.DataFrame, ks.DataFrame], - datatype: type) -> List[str]: - """Return the columns of the specified datatype. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - datatype : type - Datatype. - - Returns - ------- - List[str] - List of columns - """ - X_dtypes = X.dtypes - mask = X_dtypes == datatype - if isinstance(X, ks.DataFrame) and (datatype == object): - mask = (X_dtypes == object) | ( - X_dtypes.astype(str).str.startswith(' List[str]: - """Return the columns in `columns` not in `selected_columns`. - - Parameters - ---------- - columns : List[str] - List of columns. - excluded_columns : List[str] - List of columns. - - Returns - ------- - List[str] - List of columns. - """ - return [c for c in columns if c not in excluded_columns] - - -def get_idx_columns( - columns: List[str], selected_columns: List[str]) -> np.ndarray: - """Return the indices of the columns in `columns` - and `selected_columns`. - - Parameters - ---------- - columns : List[str] - List of columns. - selected_columns : List[str] - List of columns. - - Returns - ------- - np.ndarray - Array of indices. - """ - selected_idx_columns = [] - for selected_column in selected_columns: - for i, column in enumerate(columns): - if column == selected_column: - selected_idx_columns.append(i) - return np.array(selected_idx_columns) - - -def exclude_idx_columns( - columns: List[str], excluded_columns: List[str]) -> np.ndarray: - """Return the indices of the columns in `columns` - and not in `excluded_columns`. - - Parameters - ---------- - columns : List[str] - List of columns. - excluded_columns : List[str] - List of columns. - - Returns - ------- - np.ndarray - Array of indices. - """ - - selected_idx_columns = [ - i for i, c in enumerate(columns) - if c not in excluded_columns - ] - return np.array(selected_idx_columns) - - -def get_numerical_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: - """Return the float columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - List[str] - List of columns. - """ - X_dtypes = X.dtypes - mask = ( - (X_dtypes == np.float64) | - (X_dtypes == np.int64) | - (X_dtypes == np.float32) | - (X_dtypes == np.int32) | - (X_dtypes == np.float16) | - (X_dtypes == np.int16) - ) - numerical_columns = [c for c, m in zip(X_dtypes.index, mask) if m] - return numerical_columns - - -def get_float_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: - """Return the float columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - List[str] - List of columns. - """ - numerical_columns = get_numerical_columns(X) - if not numerical_columns: - return [] - i_max = int(np.min(np.array([X.shape[0], 50000]))) - X_dummy = X[numerical_columns].head(i_max).to_numpy() - float_columns = [ - col for i, col in enumerate(numerical_columns) - if not np.allclose( - X_dummy[:, i].round(), - X_dummy[:, i], equal_nan=True) or - (X_dummy[:, i] != X_dummy[:, i]).mean() == 1 - ] - return float_columns - - -def get_int_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: - """Return the list of integer columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - List[str] - List of columns. - """ - numerical_columns = get_numerical_columns(X) - if not numerical_columns: - return [] - i_max = int(np.min(np.array([X.shape[0], 50000]))) - X_dummy = X[numerical_columns].head(i_max).to_numpy() - int_columns = [ - col for i, col in enumerate(numerical_columns) - if np.allclose( - X_dummy[:, i].round(), - X_dummy[:, i], equal_nan=True) and - (X_dummy[:, i] != X_dummy[:, i]).mean() != 1 - ] - return int_columns - - -def generate_spark_dataframe(X: ks.DataFrame, y=None): - """ - Generates a Spark dataframe and transforms the features - to one column, ready for training in a SparkML model - - Parameters - ---------- - X : ks.DataFrame - Feature set. - y : ks.Series, default to None. - Target column. Defaults to None. - - Returns - ------- - pyspark.DataFrame - Contains the features transformed into one column. - """ - columns = list(X.columns) - if y is None: - spark_df = X.to_spark() - else: - spark_df = X.join(y).to_spark() - vector_assembler = VectorAssembler( - inputCols=columns, outputCol="features") - transformed_spark_df = vector_assembler.transform(spark_df) - return transformed_spark_df - - -def flatten_list(list_to_flatten: List): - """Flatten list. - - Parameters - ---------- - list_to_flatten : List - List to flatten - - Returns - ------- - List - Flatten list - """ - list_flatten = [] - for i, l in enumerate(list_to_flatten): - if not isinstance(l, list): - list_flatten.append(l) - else: - list_flatten += l - return list_flatten diff --git a/build/lib.macosx-10.9-x86_64-3.9/imputer.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/imputer.cpython-39-darwin.so deleted file mode 100755 index d847e92a..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/imputer.cpython-39-darwin.so and /dev/null differ diff --git a/build/lib.macosx-10.9-x86_64-3.9/scaler.cpython-39-darwin.so b/build/lib.macosx-10.9-x86_64-3.9/scaler.cpython-39-darwin.so deleted file mode 100755 index 982eb3c6..00000000 Binary files a/build/lib.macosx-10.9-x86_64-3.9/scaler.cpython-39-darwin.so and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/binning/binning.o b/build/temp.macosx-10.9-x86_64-3.9/gators/binning/binning.o deleted file mode 100644 index 21cc244b..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/binning/binning.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/clipping/clipping.o b/build/temp.macosx-10.9-x86_64-3.9/gators/clipping/clipping.o deleted file mode 100644 index 58a73a22..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/clipping/clipping.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/data_cleaning/data_cleaning.o b/build/temp.macosx-10.9-x86_64-3.9/gators/data_cleaning/data_cleaning.o deleted file mode 100644 index dc343508..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/data_cleaning/data_cleaning.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/encoders/encoder.o b/build/temp.macosx-10.9-x86_64-3.9/gators/encoders/encoder.o deleted file mode 100644 index 04a97a1c..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/encoders/encoder.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation/feature_gen.o b/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation/feature_gen.o deleted file mode 100644 index d38af623..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation/feature_gen.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.o b/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.o deleted file mode 100644 index 9c71600d..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation_dt/feature_gen_dt.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation_str/feature_gen_str.o b/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation_str/feature_gen_str.o deleted file mode 100644 index 5fc69148..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/feature_generation_str/feature_gen_str.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/imputers/imputer.o b/build/temp.macosx-10.9-x86_64-3.9/gators/imputers/imputer.o deleted file mode 100644 index ea884bef..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/imputers/imputer.o and /dev/null differ diff --git a/build/temp.macosx-10.9-x86_64-3.9/gators/scalers/scaler.o b/build/temp.macosx-10.9-x86_64-3.9/gators/scalers/scaler.o deleted file mode 100644 index d5e030cd..00000000 Binary files a/build/temp.macosx-10.9-x86_64-3.9/gators/scalers/scaler.o and /dev/null differ diff --git a/clipping.cpython-38-darwin.so b/clipping.cpython-38-darwin.so deleted file mode 100755 index aca1e198..00000000 Binary files a/clipping.cpython-38-darwin.so and /dev/null differ diff --git a/combined_cert.pem b/combined_cert.pem new file mode 100644 index 00000000..bdbcb596 --- /dev/null +++ b/combined_cert.pem @@ -0,0 +1,4655 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +/TqlkxA93VaF/0i34YjUUMSSzavf +-----END CERTIFICATE----- diff --git a/cov_html/coverage_html.js b/cov_html/coverage_html.js index 30d3a067..00e18488 100644 --- a/cov_html/coverage_html.js +++ b/cov_html/coverage_html.js @@ -7,227 +7,191 @@ coverage = {}; -// Find all the elements with shortkey_* class, and use them to assign a shortcut key. -coverage.assign_shortkeys = function () { - $("*[class*='shortkey_']").each(function (i, e) { - $.each($(e).attr("class").split(" "), function (i, c) { - if (/^shortkey_/.test(c)) { - $(document).bind('keydown', c.substr(9), function () { - $(e).click(); - }); - } - }); - }); +// General helpers +function debounce(callback, wait) { + let timeoutId = null; + return function(...args) { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + callback.apply(this, args); + }, wait); + }; }; -// Create the events for the help panel. -coverage.wire_up_help_panel = function () { - $("#keyboard_icon").click(function () { - // Show the help panel, and position it so the keyboard icon in the - // panel is in the same place as the keyboard icon in the header. - $(".help_panel").show(); - var koff = $("#keyboard_icon").offset(); - var poff = $("#panel_icon").position(); - $(".help_panel").offset({ - top: koff.top-poff.top-1, - left: koff.left-poff.left-1 +function checkVisible(element) { + const rect = element.getBoundingClientRect(); + const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight); + const viewTop = 30; + return !(rect.bottom < viewTop || rect.top >= viewBottom); +} + +// Helpers for table sorting +function getCellValue(row, column = 0) { + const cell = row.cells[column] + if (cell.childElementCount == 1) { + const child = cell.firstElementChild + if (child instanceof HTMLTimeElement && child.dateTime) { + return child.dateTime + } else if (child instanceof HTMLDataElement && child.value) { + return child.value + } + } + return cell.innerText || cell.textContent; +} + +function rowComparator(rowA, rowB, column = 0) { + let valueA = getCellValue(rowA, column); + let valueB = getCellValue(rowB, column); + if (!isNaN(valueA) && !isNaN(valueB)) { + return valueA - valueB + } + return valueA.localeCompare(valueB, undefined, {numeric: true}); +} + +function sortColumn(th) { + // Get the current sorting direction of the selected header, + // clear state on other headers and then set the new sorting direction + const currentSortOrder = th.getAttribute("aria-sort"); + [...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none")); + if (currentSortOrder === "none") { + th.setAttribute("aria-sort", th.dataset.defaultSortOrder || "ascending"); + } else { + th.setAttribute("aria-sort", currentSortOrder === "ascending" ? "descending" : "ascending"); + } + + const column = [...th.parentElement.cells].indexOf(th) + + // Sort all rows and afterwards append them in order to move them in the DOM + Array.from(th.closest("table").querySelectorAll("tbody tr")) + .sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (th.getAttribute("aria-sort") === "ascending" ? 1 : -1)) + .forEach(tr => tr.parentElement.appendChild(tr) ); +} + +// Find all the elements with data-shortcut attribute, and use them to assign a shortcut key. +coverage.assign_shortkeys = function () { + document.querySelectorAll("[data-shortcut]").forEach(element => { + document.addEventListener("keypress", event => { + if (event.target.tagName.toLowerCase() === "input") { + return; // ignore keypress from search filter + } + if (event.key === element.dataset.shortcut) { + element.click(); + } }); }); - $("#panel_icon").click(function () { - $(".help_panel").hide(); - }); }; // Create the events for the filter box. coverage.wire_up_filter = function () { // Cache elements. - var table = $("table.index"); - var table_rows = table.find("tbody tr"); - var table_row_names = table_rows.find("td.name a"); - var no_rows = $("#no_rows"); - - // Create a duplicate table footer that we can modify with dynamic summed values. - var table_footer = $("table.index tfoot tr"); - var table_dynamic_footer = table_footer.clone(); - table_dynamic_footer.attr('class', 'total_dynamic hidden'); - table_footer.after(table_dynamic_footer); + const table = document.querySelector("table.index"); + const table_body_rows = table.querySelectorAll("tbody tr"); + const no_rows = document.getElementById("no_rows"); // Observe filter keyevents. - $("#filter").on("keyup change", $.debounce(150, function (event) { - var filter_value = $(this).val(); - - if (filter_value === "") { - // Filter box is empty, remove all filtering. - table_rows.removeClass("hidden"); - - // Show standard footer, hide dynamic footer. - table_footer.removeClass("hidden"); - table_dynamic_footer.addClass("hidden"); - - // Hide placeholder, show table. - if (no_rows.length > 0) { - no_rows.hide(); + document.getElementById("filter").addEventListener("input", debounce(event => { + // Keep running total of each metric, first index contains number of shown rows + const totals = new Array(table.rows[0].cells.length).fill(0); + // Accumulate the percentage as fraction + totals[totals.length - 1] = { "numer": 0, "denom": 0 }; + + // Hide / show elements. + table_body_rows.forEach(row => { + if (!row.cells[0].textContent.includes(event.target.value)) { + // hide + row.classList.add("hidden"); + return; } - table.show(); - } - else { - // Filter table items by value. - var hidden = 0; - var shown = 0; - - // Hide / show elements. - $.each(table_row_names, function () { - var element = $(this).parents("tr"); - - if ($(this).text().indexOf(filter_value) === -1) { - // hide - element.addClass("hidden"); - hidden++; - } - else { - // show - element.removeClass("hidden"); - shown++; - } - }); - - // Show placeholder if no rows will be displayed. - if (no_rows.length > 0) { - if (shown === 0) { - // Show placeholder, hide table. - no_rows.show(); - table.hide(); - } - else { - // Hide placeholder, show table. - no_rows.hide(); - table.show(); + // show + row.classList.remove("hidden"); + totals[0]++; + + for (let column = 1; column < totals.length; column++) { + // Accumulate dynamic totals + cell = row.cells[column] + if (column === totals.length - 1) { + // Last column contains percentage + const [numer, denom] = cell.dataset.ratio.split(" "); + totals[column]["numer"] += parseInt(numer, 10); + totals[column]["denom"] += parseInt(denom, 10); + } else { + totals[column] += parseInt(cell.textContent, 10); } } + }); - // Manage dynamic header: - if (hidden > 0) { - // Calculate new dynamic sum values based on visible rows. - for (var column = 2; column < 20; column++) { - // Calculate summed value. - var cells = table_rows.find('td:nth-child(' + column + ')'); - if (!cells.length) { - // No more columns...! - break; - } - - var sum = 0, numer = 0, denom = 0; - $.each(cells.filter(':visible'), function () { - var ratio = $(this).data("ratio"); - if (ratio) { - var splitted = ratio.split(" "); - numer += parseInt(splitted[0], 10); - denom += parseInt(splitted[1], 10); - } - else { - sum += parseInt(this.innerHTML, 10); - } - }); - - // Get footer cell element. - var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')'); - - // Set value into dynamic footer cell element. - if (cells[0].innerHTML.indexOf('%') > -1) { - // Percentage columns use the numerator and denominator, - // and adapt to the number of decimal places. - var match = /\.([0-9]+)/.exec(cells[0].innerHTML); - var places = 0; - if (match) { - places = match[1].length; - } - var pct = numer * 100 / denom; - footer_cell.text(pct.toFixed(places) + '%'); - } - else { - footer_cell.text(sum); - } - } + // Show placeholder if no rows will be displayed. + if (!totals[0]) { + // Show placeholder, hide table. + no_rows.style.display = "block"; + table.style.display = "none"; + return; + } - // Hide standard footer, show dynamic footer. - table_footer.addClass("hidden"); - table_dynamic_footer.removeClass("hidden"); - } - else { - // Show standard footer, hide dynamic footer. - table_footer.removeClass("hidden"); - table_dynamic_footer.addClass("hidden"); + // Hide placeholder, show table. + no_rows.style.display = null; + table.style.display = null; + + const footer = table.tFoot.rows[0]; + // Calculate new dynamic sum values based on visible rows. + for (let column = 1; column < totals.length; column++) { + // Get footer cell element. + const cell = footer.cells[column]; + + // Set value into dynamic footer cell element. + if (column === totals.length - 1) { + // Percentage column uses the numerator and denominator, + // and adapts to the number of decimal places. + const match = /\.([0-9]+)/.exec(cell.textContent); + const places = match ? match[1].length : 0; + const { numer, denom } = totals[column]; + cell.dataset.ratio = `${numer} ${denom}`; + // Check denom to prevent NaN if filtered files contain no statements + cell.textContent = denom + ? `${(numer * 100 / denom).toFixed(places)}%` + : `${(100).toFixed(places)}%`; + } else { + cell.textContent = totals[column]; } } })); // Trigger change event on setup, to force filter on page refresh // (filter value may still be present). - $("#filter").trigger("change"); + document.getElementById("filter").dispatchEvent(new Event("change")); }; +coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2"; + // Loaded on index.html -coverage.index_ready = function ($) { +coverage.index_ready = function () { + coverage.assign_shortkeys(); + coverage.wire_up_filter(); + document.querySelectorAll("[data-sortable] th[aria-sort]").forEach( + th => th.addEventListener("click", e => sortColumn(e.target)) + ); + // Look for a localStorage item containing previous sort settings: - var sort_list = []; - var storage_name = "COVERAGE_INDEX_SORT"; - var stored_list = undefined; - try { - stored_list = localStorage.getItem(storage_name); - } catch(err) {} + const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE); if (stored_list) { - sort_list = JSON.parse('[[' + stored_list + ']]'); + const {column, direction} = JSON.parse(stored_list); + const th = document.querySelector("[data-sortable]").tHead.rows[0].cells[column]; + th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending"); + th.click() } - // Create a new widget which exists only to save and restore - // the sort order: - $.tablesorter.addWidget({ - id: "persistentSort", - - // Format is called by the widget before displaying: - format: function (table) { - if (table.config.sortList.length === 0 && sort_list.length > 0) { - // This table hasn't been sorted before - we'll use - // our stored settings: - $(table).trigger('sorton', [sort_list]); - } - else { - // This is not the first load - something has - // already defined sorting so we'll just update - // our stored value to match: - sort_list = table.config.sortList; - } - } - }); - - // Configure our tablesorter to handle the variable number of - // columns produced depending on report options: - var headers = []; - var col_count = $("table.index > thead > tr > th").length; - - headers[0] = { sorter: 'text' }; - for (i = 1; i < col_count-1; i++) { - headers[i] = { sorter: 'digit' }; - } - headers[col_count-1] = { sorter: 'percent' }; - - // Enable the table sorter: - $("table.index").tablesorter({ - widgets: ['persistentSort'], - headers: headers - }); - - coverage.assign_shortkeys(); - coverage.wire_up_help_panel(); - coverage.wire_up_filter(); - // Watch for page unload events so we can save the final sort settings: - $(window).on("unload", function () { - try { - localStorage.setItem(storage_name, sort_list.toString()) - } catch(err) {} + window.addEventListener("unload", function () { + const th = document.querySelector('[data-sortable] th[aria-sort="ascending"], [data-sortable] [aria-sort="descending"]'); + if (!th) { + return; + } + localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({ + column: [...th.parentElement.cells].indexOf(th), + direction: th.getAttribute("aria-sort"), + })); }); }; @@ -235,28 +199,31 @@ coverage.index_ready = function ($) { coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS"; -coverage.pyfile_ready = function ($) { +coverage.pyfile_ready = function () { // If we're directed to a particular line number, highlight the line. var frag = location.hash; if (frag.length > 2 && frag[1] === 't') { - $(frag).addClass('highlight'); + document.querySelector(frag).closest(".n").classList.add("highlight"); coverage.set_sel(parseInt(frag.substr(2), 10)); - } - else { + } else { coverage.set_sel(0); } - $(document) - .bind('keydown', 'j', coverage.to_next_chunk_nicely) - .bind('keydown', 'k', coverage.to_prev_chunk_nicely) - .bind('keydown', '0', coverage.to_top) - .bind('keydown', '1', coverage.to_first_chunk) - ; + const on_click = function(sel, fn) { + const elt = document.querySelector(sel); + if (elt) { + elt.addEventListener("click", fn); + } + } + on_click(".button_toggle_run", coverage.toggle_lines); + on_click(".button_toggle_mis", coverage.toggle_lines); + on_click(".button_toggle_exc", coverage.toggle_lines); + on_click(".button_toggle_par", coverage.toggle_lines); - $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");}); - $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");}); - $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");}); - $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");}); + on_click(".button_next_chunk", coverage.to_next_chunk_nicely); + on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely); + on_click(".button_top_of_page", coverage.to_top); + on_click(".button_first_chunk", coverage.to_first_chunk); coverage.filters = undefined; try { @@ -275,40 +242,43 @@ coverage.pyfile_ready = function ($) { } coverage.assign_shortkeys(); - coverage.wire_up_help_panel(); - coverage.init_scroll_markers(); + coverage.wire_up_sticky_header(); // Rebuild scroll markers when the window height changes. - $(window).resize(coverage.build_scroll_markers); + window.addEventListener("resize", coverage.build_scroll_markers); }; -coverage.toggle_lines = function (btn, cls) { - var onoff = !$(btn).hasClass("show_" + cls); - coverage.set_line_visibilty(cls, onoff); +coverage.toggle_lines = function (event) { + const btn = event.target.closest("button"); + const category = btn.value + const show = !btn.classList.contains("show_" + category); + coverage.set_line_visibilty(category, show); coverage.build_scroll_markers(); - coverage.filters[cls] = onoff; + coverage.filters[category] = show; try { localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters)); } catch(err) {} }; -coverage.set_line_visibilty = function (cls, onoff) { - var show = "show_" + cls; - var btn = $(".button_toggle_" + cls); - if (onoff) { - $("#source ." + cls).addClass(show); - btn.addClass(show); - } - else { - $("#source ." + cls).removeClass(show); - btn.removeClass(show); +coverage.set_line_visibilty = function (category, should_show) { + const cls = "show_" + category; + const btn = document.querySelector(".button_toggle_" + category); + if (btn) { + if (should_show) { + document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls)); + btn.classList.add(cls); + } + else { + document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls)); + btn.classList.remove(cls); + } } }; // Return the nth line div. coverage.line_elt = function (n) { - return $("#t" + n); + return document.getElementById("t" + n)?.closest("p"); }; // Set the selection. b and e are line numbers. @@ -332,25 +302,26 @@ coverage.to_first_chunk = function () { // Return a string indicating what kind of chunk this line belongs to, // or null if not a chunk. coverage.chunk_indicator = function (line_elt) { - var klass = line_elt.attr('class'); - if (klass) { - var m = klass.match(/\bshow_\w+\b/); - if (m) { - return m[0]; - } + const classes = line_elt?.className; + if (!classes) { + return null; + } + const match = classes.match(/\bshow_\w+\b/); + if (!match) { + return null; } - return null; + return match[0]; }; coverage.to_next_chunk = function () { - var c = coverage; + const c = coverage; // Find the start of the next colored chunk. var probe = c.sel_end; var chunk_indicator, probe_line; while (true) { probe_line = c.line_elt(probe); - if (probe_line.length === 0) { + if (!probe_line) { return; } chunk_indicator = c.chunk_indicator(probe_line); @@ -375,19 +346,19 @@ coverage.to_next_chunk = function () { }; coverage.to_prev_chunk = function () { - var c = coverage; + const c = coverage; // Find the end of the prev colored chunk. var probe = c.sel_begin-1; var probe_line = c.line_elt(probe); - if (probe_line.length === 0) { + if (!probe_line) { return; } var chunk_indicator = c.chunk_indicator(probe_line); - while (probe > 0 && !chunk_indicator) { + while (probe > 1 && !chunk_indicator) { probe--; probe_line = c.line_elt(probe); - if (probe_line.length === 0) { + if (!probe_line) { return; } chunk_indicator = c.chunk_indicator(probe_line); @@ -400,6 +371,9 @@ coverage.to_prev_chunk = function () { var prev_indicator = chunk_indicator; while (prev_indicator === chunk_indicator) { probe--; + if (probe <= 0) { + return; + } probe_line = c.line_elt(probe); prev_indicator = c.chunk_indicator(probe_line); } @@ -407,28 +381,6 @@ coverage.to_prev_chunk = function () { c.show_selection(); }; -// Return the line number of the line nearest pixel position pos -coverage.line_at_pos = function (pos) { - var l1 = coverage.line_elt(1), - l2 = coverage.line_elt(2), - result; - if (l1.length && l2.length) { - var l1_top = l1.offset().top, - line_height = l2.offset().top - l1_top, - nlines = (pos - l1_top) / line_height; - if (nlines < 1) { - result = 1; - } - else { - result = Math.ceil(nlines); - } - } - else { - result = 1; - } - return result; -}; - // Returns 0, 1, or 2: how many of the two ends of the selection are on // the screen right now? coverage.selection_ends_on_screen = function () { @@ -436,31 +388,49 @@ coverage.selection_ends_on_screen = function () { return 0; } - var top = coverage.line_elt(coverage.sel_begin); - var next = coverage.line_elt(coverage.sel_end-1); + const begin = coverage.line_elt(coverage.sel_begin); + const end = coverage.line_elt(coverage.sel_end-1); return ( - (top.isOnScreen() ? 1 : 0) + - (next.isOnScreen() ? 1 : 0) + (checkVisible(begin) ? 1 : 0) + + (checkVisible(end) ? 1 : 0) ); }; coverage.to_next_chunk_nicely = function () { - coverage.finish_scrolling(); if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: select the top line on - // the screen. - var win = $(window); - coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop())); + // The selection is entirely off the screen: + // Set the top line on the screen as selection. + + // This will select the top-left of the viewport + // As this is most likely the span with the line number we take the parent + const line = document.elementFromPoint(0, 0).parentElement; + if (line.parentElement !== document.getElementById("source")) { + // The element is not a source line but the header or similar + coverage.select_line_or_chunk(1); + } else { + // We extract the line number from the id + coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); + } } coverage.to_next_chunk(); }; coverage.to_prev_chunk_nicely = function () { - coverage.finish_scrolling(); if (coverage.selection_ends_on_screen() === 0) { - var win = $(window); - coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height())); + // The selection is entirely off the screen: + // Set the lowest line on the screen as selection. + + // This will select the bottom-left of the viewport + // As this is most likely the span with the line number we take the parent + const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement; + if (line.parentElement !== document.getElementById("source")) { + // The element is not a source line but the header or similar + coverage.select_line_or_chunk(coverage.lines_len); + } else { + // We extract the line number from the id + coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); + } } coverage.to_prev_chunk(); }; @@ -470,7 +440,7 @@ coverage.to_prev_chunk_nicely = function () { coverage.select_line_or_chunk = function (lineno) { var c = coverage; var probe_line = c.line_elt(lineno); - if (probe_line.length === 0) { + if (!probe_line) { return; } var the_indicator = c.chunk_indicator(probe_line); @@ -482,7 +452,7 @@ coverage.select_line_or_chunk = function (lineno) { while (probe > 0 && indicator === the_indicator) { probe--; probe_line = c.line_elt(probe); - if (probe_line.length === 0) { + if (!probe_line) { break; } indicator = c.chunk_indicator(probe_line); @@ -506,106 +476,100 @@ coverage.select_line_or_chunk = function (lineno) { }; coverage.show_selection = function () { - var c = coverage; - // Highlight the lines in the chunk - $("#source .highlight").removeClass("highlight"); - for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) { - c.line_elt(probe).addClass("highlight"); + document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight")); + for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) { + coverage.line_elt(probe).querySelector(".n").classList.add("highlight"); } - c.scroll_to_selection(); + coverage.scroll_to_selection(); }; coverage.scroll_to_selection = function () { // Scroll the page if the chunk isn't fully visible. if (coverage.selection_ends_on_screen() < 2) { - // Need to move the page. The html,body trick makes it scroll in all - // browsers, got it from http://stackoverflow.com/questions/3042651 - var top = coverage.line_elt(coverage.sel_begin); - var top_pos = parseInt(top.offset().top, 10); - coverage.scroll_window(top_pos - 30); + const element = coverage.line_elt(coverage.sel_begin); + coverage.scroll_window(element.offsetTop - 60); } }; coverage.scroll_window = function (to_pos) { - $("html,body").animate({scrollTop: to_pos}, 200); -}; - -coverage.finish_scrolling = function () { - $("html,body").stop(true, true); + window.scroll({top: to_pos, behavior: "smooth"}); }; coverage.init_scroll_markers = function () { - var c = coverage; // Init some variables - c.lines_len = $('#source p').length; - c.body_h = $('body').height(); - c.header_h = $('div#header').height(); + coverage.lines_len = document.querySelectorAll('#source > p').length; // Build html - c.build_scroll_markers(); + coverage.build_scroll_markers(); }; coverage.build_scroll_markers = function () { - var c = coverage, - min_line_height = 3, - max_line_height = 10, - visible_window_h = $(window).height(); - - c.lines_to_mark = $('#source').find('p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par'); - $('#scroll_marker').remove(); + const temp_scroll_marker = document.getElementById('scroll_marker') + if (temp_scroll_marker) temp_scroll_marker.remove(); // Don't build markers if the window has no scroll bar. - if (c.body_h <= visible_window_h) { + if (document.body.scrollHeight <= window.innerHeight) { return; } - $("body").append("
 
"); - var scroll_marker = $('#scroll_marker'), - marker_scale = scroll_marker.height() / c.body_h, - line_height = scroll_marker.height() / c.lines_len; + const marker_scale = window.innerHeight / document.body.scrollHeight; + const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10); - // Line height must be between the extremes. - if (line_height > min_line_height) { - if (line_height > max_line_height) { - line_height = max_line_height; - } - } - else { - line_height = min_line_height; - } - - var previous_line = -99, - last_mark, - last_top, - offsets = {}; + let previous_line = -99, last_mark, last_top; - // Calculate line offsets outside loop to prevent relayouts - c.lines_to_mark.each(function() { - offsets[this.id] = $(this).offset().top; - }); - c.lines_to_mark.each(function () { - var id_name = $(this).attr('id'), - line_top = Math.round(offsets[id_name] * marker_scale), - line_number = parseInt(id_name.substring(1, id_name.length)); + const scroll_marker = document.createElement("div"); + scroll_marker.id = "scroll_marker"; + document.getElementById('source').querySelectorAll( + 'p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par' + ).forEach(element => { + const line_top = Math.floor(element.offsetTop * marker_scale); + const line_number = parseInt(element.id.substr(1)); if (line_number === previous_line + 1) { // If this solid missed block just make previous mark higher. - last_mark.css({ - 'height': line_top + line_height - last_top - }); - } - else { + last_mark.style.height = `${line_top + line_height - last_top}px`; + } else { // Add colored line in scroll_marker block. - scroll_marker.append('
'); - last_mark = $('#m' + line_number); - last_mark.css({ - 'height': line_height, - 'top': line_top - }); + last_mark = document.createElement("div"); + last_mark.id = `m${line_number}`; + last_mark.classList.add("marker"); + last_mark.style.height = `${line_height}px`; + last_mark.style.top = `${line_top}px`; + scroll_marker.append(last_mark); last_top = line_top; } previous_line = line_number; }); + + // Append last to prevent layout calculation + document.body.append(scroll_marker); +}; + +coverage.wire_up_sticky_header = function () { + const header = document.querySelector('header'); + const header_bottom = ( + header.querySelector('.content h2').getBoundingClientRect().top - + header.getBoundingClientRect().top + ); + + function updateHeader() { + if (window.scrollY > header_bottom) { + header.classList.add('sticky'); + } else { + header.classList.remove('sticky'); + } + } + + window.addEventListener('scroll', updateHeader); + updateHeader(); }; + +document.addEventListener("DOMContentLoaded", () => { + if (document.body.classList.contains("indexfile")) { + coverage.index_ready(); + } else { + coverage.pyfile_ready(); + } +}); diff --git a/cov_html/d_06c032577783e370_clipping_py.html b/cov_html/d_06c032577783e370_clipping_py.html index 8afc0061..9401abcd 100644 --- a/cov_html/d_06c032577783e370_clipping_py.html +++ b/cov_html/d_06c032577783e370_clipping_py.html @@ -6,233 +6,228 @@ Coverage for gators/clipping/clipping.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Dict, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ..util import util 

-

7from ..transformers.transformer import Transformer 

-

8from clipping import clipping 

-

9 

-

10 

-

11class Clipping(Transformer): 

-

12 """Trim values using the limits given by the user. 

-

13 

-

14 The data should be only composed of numerical columns. 

-

15 Use `gators.encoders` to replace the categorical columns by 

-

16 numerical ones before using `Clipping`. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 clip_dict : Dict[str, List[float]] 

-

21 The keys are the columns to clip, the values are lists of two elements: 

-

22 

-

23 * the first element is the lower limit 

-

24 * the second element is the upper limit 

-

25 

-

26 dtype : type, default to np.float64. 

-

27 Numerical datatype of the output data. 

-

28 

-

29 Examples 

-

30 --------- 

-

31 * fit & transform with `pandas` 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> from gators.clipping import Clipping 

-

35 >>> X = pd.DataFrame( 

-

36 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

-

37 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

-

38 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) 

-

39 >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} 

-

40 >>> obj = Clipping(clip_dict=clip_dict) 

-

41 >>> obj.fit_transform(X) 

-

42 A B C 

-

43 0 0.5 0.4 1.0 

-

44 1 0.5 0.5 -0.0 

-

45 2 0.5 -0.2 -0.0 

-

46 3 0.4 0.1 1.0 

-

47 4 0.5 0.1 0.4 

-

48 

-

49 * fit & transform with `koalas` 

-

50 

-

51 >>> import databricks.koalas as ks 

-

52 >>> from gators.clipping import Clipping 

-

53 >>> X = ks.DataFrame( 

-

54 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

-

55 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

-

56 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) 

-

57 >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} 

-

58 >>> obj = Clipping(clip_dict=clip_dict) 

-

59 >>> obj.fit_transform(X) 

-

60 A B C 

-

61 0 0.5 0.4 1.0 

-

62 1 0.5 0.5 -0.0 

-

63 2 0.5 -0.2 -0.0 

-

64 3 0.4 0.1 1.0 

-

65 4 0.5 0.1 0.4 

-

66 

-

67 * fit with `pandas` & transform with `NumPy` 

-

68 

-

69 >>> import pandas as pd 

-

70 >>> from gators.clipping import Clipping 

-

71 >>> X = pd.DataFrame( 

-

72 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

-

73 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

-

74 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) 

-

75 >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} 

-

76 >>> obj = Clipping(clip_dict=clip_dict) 

-

77 >>> _ = obj.fit(X) 

-

78 >>> obj.transform_numpy(X.to_numpy()) 

-

79 array([[ 0.5, 0.4, 1. ], 

-

80 [ 0.5, 0.5, -0. ], 

-

81 [ 0.5, -0.2, -0. ], 

-

82 [ 0.4, 0.1, 1. ], 

-

83 [ 0.5, 0.1, 0.4]]) 

-

84 

-

85 * fit with `koalas` & transform with `NumPy` 

-

86 

-

87 >>> import databricks.koalas as ks 

-

88 >>> from gators.clipping import Clipping 

-

89 >>> X = ks.DataFrame( 

-

90 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

-

91 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

-

92 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) 

-

93 >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} 

-

94 >>> obj = Clipping(clip_dict=clip_dict) 

-

95 >>> _ = obj.fit(X) 

-

96 >>> obj.transform_numpy(X.to_numpy()) 

-

97 array([[ 0.5, 0.4, 1. ], 

-

98 [ 0.5, 0.5, -0. ], 

-

99 [ 0.5, -0.2, -0. ], 

-

100 [ 0.4, 0.1, 1. ], 

-

101 [ 0.5, 0.1, 0.4]]) 

-

102 

-

103 """ 

-

104 

-

105 def __init__(self, clip_dict: Dict[str, List[float]], 

-

106 dtype: type = np.float64): 

-

107 if not isinstance(clip_dict, dict): 

-

108 raise TypeError('`clip_dict` should be a dictionary.') 

-

109 if len(clip_dict) == 0: 

-

110 raise ValueError('Length of `clip_dict` should be not zero.') 

-

111 self.clip_dict = clip_dict 

-

112 self.dtype = dtype 

-

113 self.clip_np = np.array(list(clip_dict.values())) 

-

114 self.columns = list(clip_dict.keys()) 

-

115 

-

116 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

117 y: Union[pd.Series, ks.Series] = None) -> 'Clipping': 

-

118 """Fit the transformer on the pandas/koalas dataframe X. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 X : Union[pd.DataFrame, ks.DataFrame] 

-

123 Input dataframe. 

-

124 y : Union[pd.Series, ks.Series], default to None. 

-

125 Labels. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 'Clipping': Instance of itself. 

-

130 """ 

-

131 self.check_dataframe(X) 

-

132 self.check_dataframe_is_numerics(X) 

-

133 self.idx_columns = util.get_idx_columns(X, self.clip_dict.keys()) 

-

134 self.clip_np = self.clip_np.astype(self.dtype) 

-

135 return self 

-

136 

-

137 def transform(self, X): 

-

138 """Transform the dataframe `X`. 

-

139 

-

140 Parameters 

-

141 ---------- 

-

142 X : Union[pd.DataFrame, ks.DataFrame]. 

-

143 Input dataframe. 

-

144 

-

145 Returns 

-

146 ------- 

-

147 Union[pd.DataFrame, ks.DataFrame] 

-

148 Transformed dataframe. 

-

149 """ 

-

150 self.check_dataframe(X) 

-

151 self.check_dataframe_is_numerics(X) 

-

152 

-

153 def clipping(x: ks.Series[self.dtype]) -> ks.Series[self.dtype]: 

-

154 c = x.name 

-

155 if c not in self.columns: 

-

156 return x 

-

157 return x.clip(self.clip_dict[c][0], self.clip_dict[c][1]) 

-

158 

-

159 return X.apply(clipping) 

-

160 

-

161 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

162 """Transform the array X. 

-

163 

-

164 Parameters 

-

165 ---------- 

-

166 X (np.ndarray): Input ndarray. 

-

167 

-

168 Returns 

-

169 ------- 

-

170 np.ndarray: Imputed ndarray. 

-

171 """ 

-

172 self.check_array(X) 

-

173 return clipping(X, self.idx_columns, self.clip_np) 

-
- + diff --git a/cov_html/d_06c032577783e370_quantile_clipping_py.html b/cov_html/d_06c032577783e370_quantile_clipping_py.html new file mode 100644 index 00000000..d78aef8b --- /dev/null +++ b/cov_html/d_06c032577783e370_quantile_clipping_py.html @@ -0,0 +1,246 @@ + + + + + + Coverage for gators/clipping/quantile_clipping.py: 100% + + + + + +
+
+

+ Coverage for gators/clipping/quantile_clipping.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 42 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import Dict, List 

+

3 

+

4import numpy as np 

+

5 

+

6from clipping import _clipping 

+

7 

+

8from ..transformers.transformer import Transformer 

+

9from ..util import util 

+

10 

+

11from gators import DataFrame, Series 

+

12 

+

13 

+

14class QuantileClipping(Transformer): 

+

15 """Trim values using the quantile values provided by the user. 

+

16 

+

17 The column values will be contained between [*min_quantile*, *max_quantile*], 

+

18 

+

19 Parameters 

+

20 ---------- 

+

21 min_quantile : float 

+

22 Lower bound quantile. 

+

23 

+

24 max_quantile : float 

+

25 Upper bound quantile. 

+

26 Examples 

+

27 --------- 

+

28 Imports and initialization: 

+

29 

+

30 >>> from gators.clipping import QuantileClipping 

+

31 >>> obj = QuantileClipping(columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8) 

+

32 

+

33 The `fit`, `transform`, and `fit_transform` methods accept: 

+

34 

+

35 * `dask` dataframes: 

+

36 

+

37 >>> import dask.dataframe as dd 

+

38 >>> import pandas as pd 

+

39 >>> X = dd.from_pandas(pd.DataFrame( 

+

40 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

+

41 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

+

42 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}), npartitions=1) 

+

43 

+

44 * `koalas` dataframes: 

+

45 

+

46 >>> import databricks.koalas as ks 

+

47 >>> X = ks.DataFrame( 

+

48 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

+

49 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

+

50 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) 

+

51 

+

52 * and `pandas` dataframes: 

+

53 

+

54 >>> import pandas as pd 

+

55 >>> X = pd.DataFrame( 

+

56 ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], 

+

57 ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], 

+

58 ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) 

+

59 

+

60 The result is a transformed dataframe belonging to the same dataframe library. 

+

61 

+

62 >>> obj.fit_transform(X) 

+

63 A B C 

+

64 0 0.5 0.4 1.0 

+

65 1 0.5 0.5 -0.0 

+

66 2 0.5 -0.2 -0.0 

+

67 3 0.4 0.1 1.0 

+

68 4 0.5 0.1 0.4 

+

69 

+

70 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

71 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

72 when the number of rows is small *e.g.* in real-time environment. 

+

73 

+

74 >>> obj.transform_numpy(X.to_numpy()) 

+

75 array([[ 0.5, 0.4, 1. ], 

+

76 [ 0.5, 0.5, -0. ], 

+

77 [ 0.5, -0.2, -0. ], 

+

78 [ 0.4, 0.1, 1. ], 

+

79 [ 0.5, 0.1, 0.4]]) 

+

80 """ 

+

81 

+

82 def __init__( 

+

83 self, 

+

84 columns: List[str], 

+

85 min_quantile: float, 

+

86 max_quantile: float, 

+

87 inplace: bool = True, 

+

88 ): 

+

89 if not isinstance(columns, list): 

+

90 raise TypeError("`columns` should be a list.") 

+

91 if not isinstance(min_quantile, float): 

+

92 raise TypeError("`min_quantile` should be a float between [0, 1].") 

+

93 if not isinstance(max_quantile, float): 

+

94 raise TypeError("`max_quantile` should be a float between [0, 1].") 

+

95 if not isinstance(inplace, bool): 

+

96 raise TypeError("`inplace` should be a bool.") 

+

97 if len(columns) == 0: 

+

98 raise ValueError("`columns` should be a not empty list.") 

+

99 self.columns = columns 

+

100 self.min_quantile = min_quantile 

+

101 self.max_quantile = max_quantile 

+

102 self.inplace = inplace 

+

103 self.column_names = self.get_column_names( 

+

104 self.inplace, self.columns, "quantile_clip" 

+

105 ) 

+

106 

+

107 def fit(self, X: DataFrame, y: Series = None) -> "QuantileClipping": 

+

108 """Fit the transformer on the pandas/koalas dataframe X. 

+

109 

+

110 Parameters 

+

111 ---------- 

+

112 X : DataFrame 

+

113 Input dataframe. 

+

114 y : Series, default None. 

+

115 Target values. 

+

116 

+

117 Returns 

+

118 ------- 

+

119 self : 'QuantileClipping' 

+

120 Instance of itself. 

+

121 """ 

+

122 self.check_dataframe(X) 

+

123 self.base_columns = list(X.columns) 

+

124 self.idx_columns = util.get_idx_columns(X, self.columns) 

+

125 

+

126 self.clip_dict = { 

+

127 c: util.get_function(X).to_numpy( 

+

128 X[c].quantile(q=[self.min_quantile, self.max_quantile]) 

+

129 ) 

+

130 for c in self.columns 

+

131 } 

+

132 self.clip_np = np.array(list(self.clip_dict.values())) 

+

133 

+

134 return self 

+

135 

+

136 def transform(self, X): 

+

137 """Transform the dataframe `X`. 

+

138 

+

139 Parameters 

+

140 ---------- 

+

141 X : DataFrame. 

+

142 Input dataframe. 

+

143 

+

144 Returns 

+

145 ------- 

+

146 X : DataFrame 

+

147 Transformed dataframe. 

+

148 """ 

+

149 self.check_dataframe(X) 

+

150 for col, name in zip(self.columns, self.column_names): 

+

151 X[name] = X[col].clip(self.clip_dict[col][0], self.clip_dict[col][1]) 

+

152 

+

153 return X 

+

154 

+

155 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

156 """Transform the array `X`. 

+

157 

+

158 Parameters 

+

159 ---------- 

+

160 X :np.ndarray: 

+

161 Input array. 

+

162 

+

163 Returns 

+

164 ------- 

+

165 X : np.ndarray 

+

166 Transformed array. 

+

167 """ 

+

168 self.check_array(X) 

+

169 if self.inplace: 

+

170 X[:, self.idx_columns] = _clipping( 

+

171 X[:, self.idx_columns].astype(float), self.clip_np 

+

172 ) 

+

173 return X 

+

174 else: 

+

175 X_clip = _clipping(X[:, self.idx_columns].astype(float), self.clip_np) 

+

176 return np.concatenate((X, X_clip), axis=1) 

+
+ + + diff --git a/cov_html/d_1c8eb3056721e0f7_supervised_sampling_py.html b/cov_html/d_1c8eb3056721e0f7_supervised_sampling_py.html index 1dce22aa..2af2f257 100644 --- a/cov_html/d_1c8eb3056721e0f7_supervised_sampling_py.html +++ b/cov_html/d_1c8eb3056721e0f7_supervised_sampling_py.html @@ -6,232 +6,185 @@ Coverage for gators/sampling/supervised_sampling.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers import TransformerXY 

-

2from ..util import util 

-

3from typing import Tuple, Union 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class SupervisedSampling(TransformerXY): 

-

9 """Sample each class depending on its occurrence. 

-

10 

-

11 For example, in a stronly imbalanced binary classification problem, 

-

12 only the majority is undersampled. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 n_samples : int 

-

17 Number of samples to keep 

-

18 

-

19 Examples 

-

20 -------- 

-

21 * pandas transform 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.sampling import SupervisedSampling 

-

25 >>> X = pd.DataFrame({ 

-

26 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

27 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

28 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

29 >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

30 >>> obj = SupervisedSampling(n_samples=3) 

-

31 >>> X, y = obj.transform(X, y) 

-

32 >>> X 

-

33 A B C 

-

34 1 3 4 5 

-

35 3 9 10 11 

-

36 4 12 13 14 

-

37 5 15 16 17 

-

38 >>> y 

-

39 1 0 

-

40 3 1 

-

41 4 2 

-

42 5 3 

-

43 Name: TARGET, dtype: int64 

-

44 

-

45 * koalas transform 

-

46 

-

47 >>> import pandas as ks 

-

48 >>> from gators.sampling import SupervisedSampling 

-

49 >>> X = ks.DataFrame({ 

-

50 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

51 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

52 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

53 >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

54 >>> obj = SupervisedSampling(n_samples=3) 

-

55 >>> X, y = obj.transform(X, y) 

-

56 >>> X 

-

57 A B C 

-

58 1 3 4 5 

-

59 3 9 10 11 

-

60 4 12 13 14 

-

61 5 15 16 17 

-

62 >>> y 

-

63 1 0 

-

64 3 1 

-

65 4 2 

-

66 5 3 

-

67 Name: TARGET, dtype: int64 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, n_samples: int): 

-

72 if not isinstance(n_samples, int): 

-

73 raise TypeError('`n_samples` should be an int.') 

-

74 self.n_samples = n_samples 

-

75 self.frac_vec = pd.Series([]) 

-

76 

-

77 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

78 y: Union[pd.Series, ks.Series] 

-

79 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], 

-

80 Union[pd.Series, ks.Series]]: 

-

81 """Fit and transform the dataframe `X` and the series `y`. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : Union[pd.Series, ks.Series] 

-

88 Input target. 

-

89 

-

90 Returns 

-

91 ------- 

-

92 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: 

-

93 Transformed dataframe and the series. 

-

94 """ 

-

95 self.check_dataframe(X) 

-

96 self.check_y(X, y) 

-

97 y_name = y.name 

-

98 self.frac_vec = self.compute_sampling_fractions(y, self.n_samples) 

-

99 Xy = X.join(y) 

-

100 Xy_sampled = self.sample_dataframe( 

-

101 Xy=Xy, 

-

102 frac_vec=self.frac_vec, 

-

103 y_name=y_name 

-

104 ) 

-

105 return Xy_sampled.drop(y_name, axis=1), Xy_sampled[y_name] 

-

106 

-

107 @staticmethod 

-

108 def compute_sampling_fractions(y: Union[pd.Series, ks.Series], 

-

109 n_samples: int) -> pd.Series: 

-

110 """Compute the sampling fractions. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 y : Union[pd.Series, ks.Series] 

-

115 Target values. 

-

116 n_samples : int 

-

117 Number of samples to keep. 

-

118 

-

119 Returns 

-

120 ------- 

-

121 pd.Series 

-

122 Fraction to keep for each label. 

-

123 """ 

-

124 class_count = y.value_counts() 

-

125 n_classes = len(class_count) 

-

126 n_samples_per_class = int(n_samples / n_classes) 

-

127 mask = class_count > n_samples_per_class 

-

128 n_classes_ = mask.sum() 

-

129 n_samples_ = n_samples - class_count[~ mask].sum() 

-

130 frac_vec = n_samples_ / (class_count * n_classes_) 

-

131 if isinstance(frac_vec, ks.Series): 

-

132 frac_vec = frac_vec.to_pandas() 

-

133 frac_vec[frac_vec > 1] = 1. 

-

134 frac_vec = frac_vec.mask(frac_vec < 1./n_samples, 1./n_samples) 

-

135 return frac_vec 

-

136 

-

137 @staticmethod 

-

138 def sample_dataframe(Xy: Union[pd.DataFrame, ks.DataFrame], 

-

139 frac_vec: pd.Series, y_name: str 

-

140 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

141 """Sample dataframe. 

-

142 

-

143 Parameters 

-

144 ---------- 

-

145 Xy : Union[pd.DataFrame, ks.DataFrame] 

-

146 Dataframe. 

-

147 frac_vec : pd.Series 

-

148 Fraction to keep for each label. 

-

149 y_name : str 

-

150 Target name. 

-

151 

-

152 Returns 

-

153 ------- 

-

154 Union[pd.DataFrame, ks.DataFrame] 

-

155 Transformed dataframe. 

-

156 """ 

-

157 if isinstance(Xy, pd.DataFrame): 

-

158 Xy_sampled = pd.DataFrame(columns=Xy.columns) 

-

159 else: 

-

160 Xy_sampled = ks.DataFrame(columns=Xy.columns) 

-

161 for c, frac in frac_vec.iteritems(): 

-

162 if frac == 1: 

-

163 Xy_sampled = util.concat( 

-

164 [Xy_sampled, Xy[Xy[y_name] == int(c)]], axis=0) 

-

165 else: 

-

166 Xy_sampled = util.concat( 

-

167 [Xy_sampled, 

-

168 Xy[Xy[y_name] == int(c)].sample( 

-

169 frac=frac, random_state=0)], 

-

170 axis=0 

-

171 ) 

-

172 return Xy_sampled.astype(Xy.dtypes.to_dict()) 

-
- + diff --git a/cov_html/d_1c8eb3056721e0f7_unsupervised_sampling_py.html b/cov_html/d_1c8eb3056721e0f7_unsupervised_sampling_py.html index c42c0e43..f77e8c2e 100644 --- a/cov_html/d_1c8eb3056721e0f7_unsupervised_sampling_py.html +++ b/cov_html/d_1c8eb3056721e0f7_unsupervised_sampling_py.html @@ -6,155 +6,165 @@ Coverage for gators/sampling/unsupervised_sampling.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1 

-

2from ..transformers import TransformerXY 

-

3from typing import Tuple, Dict, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class UnsupervisedSampling(TransformerXY): 

-

10 """Randomly sample the data and target. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 n_samples : int 

-

15 Number of samples to keep. 

-

16 

-

17 Examples 

-

18 -------- 

-

19 

-

20 * pandas transform 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.sampling import UnsupervisedSampling 

-

24 >>> X = pd.DataFrame({ 

-

25 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

26 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

27 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

28 >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

29 >>> obj = UnsupervisedSampling(n_samples=3) 

-

30 >>> X, y = obj.transform(X, y) 

-

31 >>> X 

-

32 A B C 

-

33 5 15 16 17 

-

34 2 6 7 8 

-

35 1 3 4 5 

-

36 >>> y 

-

37 5 3 

-

38 2 1 

-

39 1 0 

-

40 Name: TARGET, dtype: int64 

-

41 

-

42 * koalas transform 

-

43 

-

44 >>> import databricks.koalas as ks 

-

45 >>> from gators.sampling import UnsupervisedSampling 

-

46 >>> X = ks.DataFrame({ 

-

47 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

48 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

49 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

50 >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

51 >>> obj = UnsupervisedSampling(n_samples=3) 

-

52 >>> X, y = obj.transform(X, y) 

-

53 >>> X 

-

54 A B C 

-

55 0 0 1 2 

-

56 3 9 10 11 

-

57 2 6 7 8 

-

58 >>> y 

-

59 0 0 

-

60 3 1 

-

61 2 1 

-

62 Name: TARGET, dtype: int64 

-

63 

-

64 """ 

-

65 

-

66 def __init__(self, n_samples: int): 

-

67 if not isinstance(n_samples, int): 

-

68 raise TypeError('`n_samples` should be an int.') 

-

69 self.n_samples = n_samples 

-

70 

-

71 def transform(self, 

-

72 X: Union[pd.DataFrame, ks.DataFrame], 

-

73 y: Union[pd.Series, ks.Series], 

-

74 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: 

-

75 """Fit and transform the dataframe `X` and the series `y`. 

-

76 

-

77 Parameters: 

-

78 X : Union[pd.DataFrame, ks.DataFrame] 

-

79 Input dataframe. 

-

80 y : Union[pd.Series, ks.Series] 

-

81 Input target. 

-

82 

-

83 Returns 

-

84 ------- 

-

85 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: 

-

86 Transformed dataframe and the series. 

-

87 """ 

-

88 self.check_dataframe(X) 

-

89 self.check_y(X, y) 

-

90 frac = self.n_samples / X.shape[0] 

-

91 if frac >= 1.: 

-

92 return X, y 

-

93 y_name = y.name 

-

94 Xy = X.join(y).sample(frac=round(frac, 3), random_state=0) 

-

95 return Xy.drop(y_name, axis=1), Xy[y_name] 

-
- + diff --git a/cov_html/d_1cfcd38d8af35d51_iv_py.html b/cov_html/d_1cfcd38d8af35d51_iv_py.html new file mode 100644 index 00000000..781c94d5 --- /dev/null +++ b/cov_html/d_1cfcd38d8af35d51_iv_py.html @@ -0,0 +1,98 @@ + + + + + + Coverage for gators/util/iv.py: 100% + + + + + +
+
+

+ Coverage for gators/util/iv.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 19 statements   + + + +

+
+ + + + +
+
+
+
+

1import numpy as np 

+

2from gators import DataFrame, Series 

+

3from . import util 

+

4 

+

5 

+

6def compute_iv(X: DataFrame, y: Series, regularization=0.1): 

+

7 y_name = y.name 

+

8 object_columns = util.get_datatype_columns(X, object) 

+

9 stats = ( 

+

10 util.get_function(X) 

+

11 .melt(X[object_columns].join(y), id_vars=y_name) 

+

12 .groupby(["variable", "value"]) 

+

13 .agg(["sum", "count"])[y_name] 

+

14 ) 

+

15 stats = util.get_function(X).to_pandas(stats) 

+

16 stats = stats.rename(columns={"sum": "1"}) 

+

17 stats["0"] = stats["count"] - stats["1"] 

+

18 stats = stats.drop("count", axis=1) 

+

19 stats = stats[["0", "1"]] 

+

20 stats[["distrib_0", "distrib_1"]] = (stats[["0", "1"]] + regularization) / ( 

+

21 stats[["0", "1"]].groupby("variable").sum() + 2 * regularization 

+

22 ) 

+

23 stats["woe"] = np.log(stats["distrib_1"] / stats["distrib_0"]) 

+

24 iv = (stats["distrib_1"] - stats["distrib_0"]) * stats["woe"] 

+

25 iv = iv.groupby("variable").sum() 

+

26 iv.name = "iv" 

+

27 iv.index.name = None 

+

28 return iv, stats 

+
+ + + diff --git a/cov_html/d_1cfcd38d8af35d51_util_py.html b/cov_html/d_1cfcd38d8af35d51_util_py.html index 8405d424..61b474c9 100644 --- a/cov_html/d_1cfcd38d8af35d51_util_py.html +++ b/cov_html/d_1cfcd38d8af35d51_util_py.html @@ -6,336 +6,635 @@ Coverage for gators/util/util.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from pyspark.ml.feature import VectorAssembler 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9def get_bounds(X_dtype: type) -> List: 

-

10 """Return upper and lower of the input numerical NumPy datatype. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 X_dtype : type, default to np.float64 

-

15 Numerical NumPy datatype. 

-

16 

-

17 Returns 

-

18 ------- 

-

19 List 

-

20 Lower ad upper bounds. 

-

21 """ 

-

22 if 'float' in str(X_dtype): 

-

23 info = np.finfo(X_dtype) 

-

24 return info.min, info.max 

-

25 elif 'int' in str(X_dtype): 

-

26 info = np.iinfo(X_dtype) 

-

27 return info.min, info.max 

-

28 

-

29 

-

30def concat(objs: List[Union[pd.DataFrame, ks.DataFrame]], 

-

31 axis: int) -> Union[pd.DataFrame, ks.DataFrame]: 

-

32 """Concatenate the `objs` along an axis. 

-

33 

-

34 Parameters 

-

35 ---------- 

-

36 objs : List[Union[pd.DataFrame, ks.DataFrame]] 

-

37 List of dataframes to concatenate. 

-

38 axis : int 

-

39 The axis to concatenate along. 

-

40 

-

41 Returns 

-

42 ------- 

-

43 Union[pd.DataFrame, ks.DataFrame] 

-

44 Concatenated dataframe. 

-

45 """ 

-

46 if isinstance(objs[0], (pd.DataFrame, pd.Series)): 

-

47 return pd.concat(objs, axis=axis) 

-

48 return ks.concat(objs, axis=axis) 

-

49 

-

50 

-

51def get_datatype_columns( 

-

52 X: Union[pd.DataFrame, ks.DataFrame], 

-

53 datatype: type) -> List[str]: 

-

54 """Return the columns of the specified datatype. 

-

55 

-

56 Parameters 

-

57 ---------- 

-

58 X : Union[pd.DataFrame, ks.DataFrame] 

-

59 Input dataframe. 

-

60 datatype : type 

-

61 Datatype. 

-

62 

-

63 Returns 

-

64 ------- 

-

65 List[str] 

-

66 List of columns 

-

67 """ 

-

68 X_dtypes = X.dtypes 

-

69 mask = X_dtypes == datatype 

-

70 if isinstance(X, ks.DataFrame) and (datatype == object): 

-

71 mask = (X_dtypes == object) | ( 

-

72 X_dtypes.astype(str).str.startswith('<U')) 

-

73 

-

74 datatype_columns = [c for c, m in zip(X_dtypes.index, mask) if m] 

-

75 return datatype_columns 

-

76 

-

77 

-

78def exclude_columns(columns: List[str], 

-

79 excluded_columns: List[str]) -> List[str]: 

-

80 """Return the columns in `columns` not in `selected_columns`. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 columns : List[str] 

-

85 List of columns. 

-

86 excluded_columns : List[str] 

-

87 List of columns. 

-

88 

-

89 Returns 

-

90 ------- 

-

91 List[str] 

-

92 List of columns. 

-

93 """ 

-

94 return [c for c in columns if c not in excluded_columns] 

-

95 

-

96 

-

97def get_idx_columns( 

-

98 columns: List[str], selected_columns: List[str]) -> np.ndarray: 

-

99 """Return the indices of the columns in `columns` 

-

100 and `selected_columns`. 

-

101 

-

102 Parameters 

-

103 ---------- 

-

104 columns : List[str] 

-

105 List of columns. 

-

106 selected_columns : List[str] 

-

107 List of columns. 

-

108 

-

109 Returns 

-

110 ------- 

-

111 np.ndarray 

-

112 Array of indices. 

-

113 """ 

-

114 selected_idx_columns = [] 

-

115 for selected_column in selected_columns: 

-

116 for i, column in enumerate(columns): 

-

117 if column == selected_column: 

-

118 selected_idx_columns.append(i) 

-

119 return np.array(selected_idx_columns) 

-

120 

-

121 

-

122def exclude_idx_columns( 

-

123 columns: List[str], excluded_columns: List[str]) -> np.ndarray: 

-

124 """Return the indices of the columns in `columns` 

-

125 and not in `excluded_columns`. 

-

126 

-

127 Parameters 

-

128 ---------- 

-

129 columns : List[str] 

-

130 List of columns. 

-

131 excluded_columns : List[str] 

-

132 List of columns. 

-

133 

-

134 Returns 

-

135 ------- 

-

136 np.ndarray 

-

137 Array of indices. 

-

138 """ 

-

139 

-

140 selected_idx_columns = [ 

-

141 i for i, c in enumerate(columns) 

-

142 if c not in excluded_columns 

-

143 ] 

-

144 return np.array(selected_idx_columns) 

-

145 

-

146 

-

147def get_numerical_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: 

-

148 """Return the float columns. 

-

149 

-

150 Parameters 

-

151 ---------- 

-

152 X : Union[pd.DataFrame, ks.DataFrame] 

-

153 Input dataframe. 

-

154 

-

155 Returns 

-

156 ------- 

-

157 List[str] 

-

158 List of columns. 

-

159 """ 

-

160 X_dtypes = X.dtypes 

-

161 mask = ( 

-

162 (X_dtypes == np.float64) | 

-

163 (X_dtypes == np.int64) | 

-

164 (X_dtypes == np.float32) | 

-

165 (X_dtypes == np.int32) | 

-

166 (X_dtypes == np.float16) | 

-

167 (X_dtypes == np.int16) 

-

168 ) 

-

169 numerical_columns = [c for c, m in zip(X_dtypes.index, mask) if m] 

-

170 return numerical_columns 

-

171 

-

172 

-

173def get_float_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: 

-

174 """Return the float columns. 

-

175 

-

176 Parameters 

-

177 ---------- 

-

178 X : Union[pd.DataFrame, ks.DataFrame] 

-

179 Input dataframe. 

-

180 

-

181 Returns 

-

182 ------- 

-

183 List[str] 

-

184 List of columns. 

-

185 """ 

-

186 numerical_columns = get_numerical_columns(X) 

-

187 if not numerical_columns: 

-

188 return [] 

-

189 i_max = int(np.min(np.array([X.shape[0], 50000]))) 

-

190 X_dummy = X[numerical_columns].head(i_max).to_numpy() 

-

191 float_columns = [ 

-

192 col for i, col in enumerate(numerical_columns) 

-

193 if not np.allclose( 

-

194 X_dummy[:, i].round(), 

-

195 X_dummy[:, i], equal_nan=True) or 

-

196 (X_dummy[:, i] != X_dummy[:, i]).mean() == 1 

-

197 ] 

-

198 return float_columns 

-

199 

-

200 

-

201def get_int_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: 

-

202 """Return the list of integer columns. 

-

203 

-

204 Parameters 

-

205 ---------- 

-

206 X : Union[pd.DataFrame, ks.DataFrame] 

-

207 Input dataframe. 

-

208 

-

209 Returns 

-

210 ------- 

-

211 List[str] 

-

212 List of columns. 

-

213 """ 

-

214 numerical_columns = get_numerical_columns(X) 

-

215 if not numerical_columns: 

-

216 return [] 

-

217 i_max = int(np.min(np.array([X.shape[0], 50000]))) 

-

218 X_dummy = X[numerical_columns].head(i_max).to_numpy() 

-

219 int_columns = [ 

-

220 col for i, col in enumerate(numerical_columns) 

-

221 if np.allclose( 

-

222 X_dummy[:, i].round(), 

-

223 X_dummy[:, i], equal_nan=True) and 

-

224 (X_dummy[:, i] != X_dummy[:, i]).mean() != 1 

-

225 ] 

-

226 return int_columns 

-

227 

-

228 

-

229def generate_spark_dataframe(X: ks.DataFrame, y=None): 

-

230 """ 

-

231 Generates a Spark dataframe and transforms the features 

-

232 to one column, ready for training in a SparkML model 

-

233 

-

234 Parameters 

-

235 ---------- 

-

236 X : ks.DataFrame 

-

237 Feature set. 

-

238 y : ks.Series, default to None. 

-

239 Target column. Defaults to None. 

-

240 

-

241 Returns 

-

242 ------- 

-

243 pyspark.DataFrame 

-

244 Contains the features transformed into one column. 

-

245 """ 

-

246 columns = list(X.columns) 

-

247 if y is None: 

-

248 spark_df = X.to_spark() 

-

249 else: 

-

250 spark_df = X.join(y).to_spark() 

-

251 vector_assembler = VectorAssembler( 

-

252 inputCols=columns, outputCol="features") 

-

253 transformed_spark_df = vector_assembler.transform(spark_df) 

-

254 return transformed_spark_df 

-

255 

-

256 

-

257def flatten_list(list_to_flatten: List): 

-

258 """Flatten list. 

-

259 

-

260 Parameters 

-

261 ---------- 

-

262 list_to_flatten : List 

-

263 List to flatten 

-

264 

-

265 Returns 

-

266 ------- 

-

267 List 

-

268 Flatten list 

-

269 """ 

-

270 list_flatten = [] 

-

271 for i, l in enumerate(list_to_flatten): 

-

272 if not isinstance(l, list): 

-

273 list_flatten.append(l) 

-

274 else: 

-

275 list_flatten += l 

-

276 return list_flatten 

-
- + diff --git a/cov_html/d_2e7b559919172292__base_encoder_py.html b/cov_html/d_2e7b559919172292__base_encoder_py.html index cb944c67..8d90e670 100644 --- a/cov_html/d_2e7b559919172292__base_encoder_py.html +++ b/cov_html/d_2e7b559919172292__base_encoder_py.html @@ -6,168 +6,239 @@ Coverage for gators/encoders/_base_encoder.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from encoder import encoder 

-

3from ..transformers.transformer import Transformer 

-

4from typing import List, Tuple, Union, Dict, Collection, Any 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from ..transformers.transformer import NUMERICS_DTYPES 

-

9from ..transformers.transformer import PRINT_NUMERICS_DTYPES 

-

10 

-

11 

-

12class _BaseEncoder(Transformer): 

-

13 """Base encoder transformer class. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 dtype : type, default to np.float64. 

-

18 Numerical datatype of the output data. 

-

19 """ 

-

20 

-

21 def __init__(self, dtype=np.float64): 

-

22 if dtype not in NUMERICS_DTYPES: 

-

23 raise TypeError( 

-

24 f'`dtype` should be a dtype from {PRINT_NUMERICS_DTYPES}.') 

-

25 Transformer.__init__(self) 

-

26 self.dtype = dtype 

-

27 self.columns = [] 

-

28 self.idx_columns: np.ndarray = np.array([]) 

-

29 self.num_categories_vec = np.array([]) 

-

30 self.values_vec = np.array([]) 

-

31 self.encoded_values_vec = np.array([]) 

-

32 self.mapping: Dict[str, Dict[str, float]] = {} 

-

33 

-

34 def transform(self, 

-

35 X: Union[pd.DataFrame, ks.DataFrame] 

-

36 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

37 """Transform the dataframe `X`. 

-

38 

-

39 Parameters 

-

40 ---------- 

-

41 X : Union[pd.DataFrame, ks.DataFrame]. 

-

42 Input dataframe. 

-

43 Returns 

-

44 ------- 

-

45 Union[pd.DataFrame, ks.DataFrame] 

-

46 Transformed dataframe. 

-

47 """ 

-

48 self.check_dataframe(X) 

-

49 

-

50 def f(x) -> ks.Series[self.dtype]: 

-

51 x_name = x.name 

-

52 if x_name not in self.mapping: 

-

53 return x.astype(self.dtype) 

-

54 return x.replace(self.mapping[x_name]).astype(self.dtype) 

-

55 return X.apply(f) 

-

56 

-

57 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

58 """Transform the input array. 

-

59 

-

60 Parameters 

-

61 ---------- 

-

62 X : np.ndarray 

-

63 Input array. 

-

64 Returns 

-

65 ------- 

-

66 np.ndarray: Encoded array. 

-

67 """ 

-

68 self.check_array(X) 

-

69 if len(self.idx_columns) == 0: 

-

70 return X.astype(self.dtype) 

-

71 return encoder( 

-

72 X, 

-

73 self.num_categories_vec, 

-

74 self.values_vec, 

-

75 self.encoded_values_vec, 

-

76 self.idx_columns, 

-

77 ).astype(self.dtype) 

-

78 

-

79 @ staticmethod 

-

80 def decompose_mapping( 

-

81 mapping: List[Dict[str, Collection[Any]]], 

-

82 ) -> Tuple[List[str], np.ndarray, np.ndarray]: 

-

83 """Decompose the mapping. 

-

84 

-

85 Parameters 

-

86 ---------- 

-

87 mapping List[Dict[str, Collection[Any]]]: 

-

88 Mapping obtained from the categorical encoder package. 

-

89 Returns 

-

90 ------- 

-

91 Tuple[List[str], np.ndarray, np.ndarray] 

-

92 Decomposed mapping. 

-

93 """ 

-

94 columns = list(mapping.keys()) 

-

95 n_columns = len(columns) 

-

96 max_categories = max([len(m) for m in mapping.values()]) 

-

97 encoded_values_vec = np.zeros((n_columns, max_categories)) 

-

98 values_vec = np.zeros( 

-

99 (n_columns, max_categories), dtype=object 

-

100 ) 

-

101 for i, c in enumerate(columns): 

-

102 mapping_col = mapping[c] 

-

103 n_values = len(mapping_col) 

-

104 encoded_values_vec[i, :n_values] = np.array( 

-

105 list(mapping_col.values())) 

-

106 values_vec[i, :n_values] = np.array( 

-

107 list(mapping_col.keys())) 

-

108 return columns, values_vec, encoded_values_vec 

-
- + diff --git a/cov_html/d_2e7b559919172292_binned_columns_encoder_py.html b/cov_html/d_2e7b559919172292_binned_columns_encoder_py.html new file mode 100644 index 00000000..518a979e --- /dev/null +++ b/cov_html/d_2e7b559919172292_binned_columns_encoder_py.html @@ -0,0 +1,203 @@ + + + + + + Coverage for gators/encoders/binned_columns_encoder.py: 100% + + + + + +
+
+

+ Coverage for gators/encoders/binned_columns_encoder.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 38 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2. 

+

2import numpy as np 

+

3 

+

4from typing import Dict, List 

+

5 

+

6import numpy as np 

+

7 

+

8from encoder import binned_columns_encoder 

+

9from encoder import binned_columns_encoder_inplace 

+

10 

+

11from ..util import util 

+

12from ._base_encoder import _BaseEncoder 

+

13 

+

14from gators import DataFrame, Series 

+

15 

+

16 

+

17class BinnedColumnsEncoder(_BaseEncoder): 

+

18 """Encode the categorical variables after running a **Gators** Binning transformer. 

+

19 

+

20 Replace the bins "_X" by *X*, where *X* is an integer. 

+

21 

+

22 Parameters 

+

23 ---------- 

+

24 dtype : type, default np.float64. 

+

25 Numerical datatype of the output data. 

+

26 

+

27 Examples 

+

28 -------- 

+

29 

+

30 Imports and initialization: 

+

31 

+

32 >>> from gators.encoders import BinnedColumnsEncoder 

+

33 >>> obj = BinnedColumnsEncoder(columns=['A', 'B'], inplace=False) 

+

34 

+

35 The `fit`, `transform`, and `fit_transform` methods accept: 

+

36 

+

37 * `dask` dataframes: 

+

38 

+

39 >>> import dask.dataframe as dd 

+

40 >>> import pandas as pd 

+

41 >>> X = dd.from_pandas(pd.DataFrame({'A': ['_0', '_0', '_1'], 'B': ['_1', '_0', '_0']}), npartitions=1) 

+

42 

+

43 * `koalas` dataframes: 

+

44 

+

45 >>> import databricks.koalas as ks 

+

46 >>> X = ks.DataFrame({'A': ['_0', '_0', '_1'], 'B': ['_1', '_0', '_0']}) 

+

47 

+

48 * and `pandas` dataframes: 

+

49 

+

50 >>> import pandas as pd 

+

51 >>> X = pd.DataFrame({'A': ['_0', '_0', '_1'], 'B': ['_1', '_0', '_0']}) 

+

52 

+

53 The result is a transformed dataframe belonging to the same dataframe library. 

+

54 

+

55 >>> obj.fit_transform(X.copy()) 

+

56 A B A__ordinal B__ordinal 

+

57 0 _0 _1 0.0 1.0 

+

58 1 _0 _0 0.0 0.0 

+

59 2 _1 _0 1.0 0.0 

+

60 

+

61 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

62 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

63 when the number of rows is small *e.g.* in real-time environment. 

+

64 

+

65 >>> obj.transform_numpy(X.to_numpy()) 

+

66 array([['_0', '_1', 0.0, 1.0], 

+

67 ['_0', '_0', 0.0, 0.0], 

+

68 ['_1', '_0', 1.0, 0.0]], dtype=object) 

+

69 """ 

+

70 

+

71 def __init__(self, columns: List[str], inplace: bool = True): 

+

72 if not isinstance(columns, (list, np.ndarray)): 

+

73 raise TypeError("`columns` should be a list.") 

+

74 if not isinstance(inplace, bool): 

+

75 raise TypeError("`inplace` should be a bool.") 

+

76 self.columns = columns 

+

77 self.inplace = inplace 

+

78 

+

79 def fit(self, X: DataFrame, y: Series = None) -> "BinnedColumnsEncoder": 

+

80 """Fit the encoder. 

+

81 

+

82 Parameters 

+

83 ---------- 

+

84 X : DataFrame: 

+

85 Input dataframe. 

+

86 y : Series, default None. 

+

87 Target values. 

+

88 

+

89 Returns 

+

90 ------- 

+

91 BinnedColumnsEncoder: 

+

92 Instance of itself. 

+

93 """ 

+

94 self.check_dataframe(X) 

+

95 self.idx_columns = util.get_idx_columns( 

+

96 columns=X.columns, selected_columns=self.columns 

+

97 ) 

+

98 return self 

+

99 

+

100 def transform(self, X: DataFrame, y: Series = None) -> Dict[str, Dict[str, float]]: 

+

101 """Generate the mapping to perform the encoding. 

+

102 

+

103 Parameters 

+

104 ---------- 

+

105 X : DataFrame 

+

106 Input dataframe. 

+

107 y : Series, default None 

+

108 Target values. 

+

109 

+

110 Returns 

+

111 ------- 

+

112 X : DataFrame 

+

113 Transformed dataframe. 

+

114 """ 

+

115 self.check_dataframe(X) 

+

116 if not self.columns: 

+

117 return X 

+

118 if self.inplace: 

+

119 for c in self.columns: 

+

120 X[c] = X[c].str.slice(start=1).astype(np.float64) 

+

121 return X 

+

122 for c in self.columns: 

+

123 X[f"{c}__ordinal"] = X[c].str.slice(start=1).astype(np.float64) 

+

124 

+

125 return X 

+

126 

+

127 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

128 self.check_array(X) 

+

129 if self.idx_columns.size == 0: 

+

130 return X 

+

131 if self.inplace: 

+

132 return binned_columns_encoder_inplace(X, self.idx_columns) 

+

133 return binned_columns_encoder(X, self.idx_columns) 

+
+ + + diff --git a/cov_html/d_2e7b559919172292_frequency_encoder_py.html b/cov_html/d_2e7b559919172292_frequency_encoder_py.html new file mode 100644 index 00000000..e8e6b8c8 --- /dev/null +++ b/cov_html/d_2e7b559919172292_frequency_encoder_py.html @@ -0,0 +1,196 @@ + + + + + + Coverage for gators/encoders/frequency_encoder.py: 100% + + + + + +
+
+

+ Coverage for gators/encoders/frequency_encoder.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 27 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import warnings 

+

3from typing import Dict 

+

4 

+

5import numpy as np 

+

6 

+

7from ..util import util 

+

8from ._base_encoder import _BaseEncoder 

+

9 

+

10from gators import DataFrame, Series 

+

11 

+

12 

+

13class FrequencyEncoder(_BaseEncoder): 

+

14 """Encode the categorical columns as integer columns based on the category count. 

+

15 

+

16 Parameters 

+

17 ---------- 

+

18 inplace : bool, default to True. 

+

19 If True, replace in-place the categorical values by numerical ones. 

+

20 If False, keep the categorical columns and create new encoded columns. 

+

21 

+

22 Examples 

+

23 --------- 

+

24 

+

25 Imports and initialization: 

+

26 

+

27 >>> from gators.encoders import FrequencyEncoder 

+

28 >>> obj = FrequencyEncoder() 

+

29 

+

30 The `fit`, `transform`, and `fit_transform` methods accept: 

+

31 

+

32 * `dask` dataframes: 

+

33 

+

34 >>> import dask.dataframe as dd 

+

35 >>> import pandas as pd 

+

36 >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}), npartitions=1) 

+

37 

+

38 * `koalas` dataframes: 

+

39 

+

40 >>> import databricks.koalas as ks 

+

41 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

+

42 

+

43 * and `pandas` dataframes: 

+

44 

+

45 >>> import pandas as pd 

+

46 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

+

47 

+

48 The result is a transformed dataframe belonging to the same dataframe library. 

+

49 

+

50 >>> obj.fit_transform(X) 

+

51 A B 

+

52 0 2.0 1.0 

+

53 1 2.0 2.0 

+

54 2 1.0 2.0 

+

55 

+

56 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

57 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

58 when the number of rows is small *e.g.* in real-time environment. 

+

59 

+

60 >>> obj.transform_numpy(X.to_numpy()) 

+

61 array([[2., 1.], 

+

62 [2., 2.], 

+

63 [1., 2.]]) 

+

64 """ 

+

65 

+

66 def __init__(self, inplace=True): 

+

67 _BaseEncoder.__init__(self, inplace=inplace) 

+

68 

+

69 def fit(self, X: DataFrame, y: Series = None) -> "FrequencyEncoder": 

+

70 """Fit the transformer on the dataframe `X`. 

+

71 

+

72 Parameters 

+

73 ---------- 

+

74 X : DataFrame. 

+

75 Input dataframe. 

+

76 y : Series, default None. 

+

77 Target values. 

+

78 

+

79 Returns 

+

80 ------- 

+

81 FrequencyEncoder: Instance of itself. 

+

82 """ 

+

83 self.check_dataframe(X) 

+

84 self.base_columns = list(X.columns) 

+

85 self.columns = util.get_datatype_columns(X, object) 

+

86 self.column_names = self.get_column_names( 

+

87 self.inplace, self.columns, "frequency" 

+

88 ) 

+

89 if not self.columns: 

+

90 warnings.warn( 

+

91 f"""`X` does not contain object columns: 

+

92 `{self.__class__.__name__}` is not needed""" 

+

93 ) 

+

94 return self 

+

95 self.mapping = self.generate_mapping(X[self.columns]) 

+

96 self.num_categories_vec = np.array([len(m) for m in self.mapping.values()]) 

+

97 columns, self.values_vec, self.encoded_values_vec = self.decompose_mapping( 

+

98 mapping=self.mapping, 

+

99 ) 

+

100 self.idx_columns = util.get_idx_columns( 

+

101 columns=X.columns, selected_columns=columns 

+

102 ) 

+

103 return self 

+

104 

+

105 def generate_mapping(self, X: DataFrame) -> Dict[str, Dict[str, float]]: 

+

106 """Generate the mapping to perform the encoding. 

+

107 

+

108 Parameters 

+

109 ---------- 

+

110 X : DataFrame 

+

111 Input dataframe. 

+

112 

+

113 Returns 

+

114 ------- 

+

115 Dict[str, Dict[str, float]] 

+

116 Mapping. 

+

117 """ 

+

118 mapping = {} 

+

119 for c in X.columns: 

+

120 mapping[c] = ( 

+

121 util.get_function(X) 

+

122 .to_pandas(X[c].value_counts()) 

+

123 .astype(float) 

+

124 .to_dict() 

+

125 ) 

+

126 return mapping 

+
+ + + diff --git a/cov_html/d_2e7b559919172292_multiclass_encoder_py.html b/cov_html/d_2e7b559919172292_multiclass_encoder_py.html deleted file mode 100644 index 1fbeacb1..00000000 --- a/cov_html/d_2e7b559919172292_multiclass_encoder_py.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - Coverage for gators/encoders/multiclass_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import warnings 

-

4import copy 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from ._base_encoder import _BaseEncoder 

-

9from ..util import util 

-

10from ..data_cleaning.drop_columns import DropColumns 

-

11from ..transformers.transformer import Transformer 

-

12 

-

13 

-

14class MultiClassEncoder(_BaseEncoder): 

-

15 """Encode the categorical columns with a binary encoder passed by the user. 

-

16 *N* categorical columns are mapped into *N * (n - 1)* numerical columns 

-

17 where *n* is the number of classes. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 encoder : Transformer 

-

22 Binary Encoder. 

-

23 dtype : type, default to np.float64. 

-

24 Numerical datatype of the output data. 

-

25 

-

26 Examples 

-

27 -------- 

-

28 

-

29 * fit & transform with `pandas` 

-

30 

-

31 >>> import pandas as pd 

-

32 >>> from gators.encoders import MultiClassEncoder 

-

33 >>> from gators.encoders import WOEEncoder 

-

34 >>> X = pd.DataFrame({ 

-

35 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

36 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

37 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

38 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

39 >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

40 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

41 >>> obj.fit_transform(X, y) 

-

42 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

43 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

44 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

45 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

46 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

47 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

48 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

49 

-

50 * fit & transform with `koalas` 

-

51 

-

52 >>> import databricks.koalas as ks 

-

53 >>> from gators.encoders import MultiClassEncoder 

-

54 >>> from gators.encoders import WOEEncoder 

-

55 >>> X = ks.DataFrame({ 

-

56 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

57 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

58 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

59 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

60 >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

61 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

62 >>> obj.fit_transform(X, y) 

-

63 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

64 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

65 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

66 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

67 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

68 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

69 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

70 

-

71 * fit with `pandas` & transform with `NumPy` 

-

72 

-

73 >>> import pandas as pd 

-

74 >>> from gators.encoders import MultiClassEncoder 

-

75 >>> from gators.encoders import WOEEncoder 

-

76 >>> X = pd.DataFrame({ 

-

77 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

78 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

79 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

80 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

81 >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

82 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

83 >>> _ = obj.fit(X, y) 

-

84 >>> obj.transform_numpy(X.to_numpy()) 

-

85 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

86 0. , -0.40546511], 

-

87 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

88 0. , -0.40546511], 

-

89 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

90 0.69314718, -0.40546511], 

-

91 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

92 0.69314718, -0.40546511], 

-

93 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

94 0.69314718, 0.69314718], 

-

95 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

96 0.69314718, 0.69314718]]) 

-

97 

-

98 * fit with `koalas` & transform with `NumPy` 

-

99 

-

100 >>> import databricks.koalas as ks 

-

101 >>> from gators.encoders import MultiClassEncoder 

-

102 >>> from gators.encoders import WOEEncoder 

-

103 >>> X = ks.DataFrame({ 

-

104 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

105 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

106 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

107 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

108 >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

109 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

110 >>> _ = obj.fit(X, y) 

-

111 >>> obj.transform_numpy(X.to_numpy()) 

-

112 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

113 0. , -0.40546511], 

-

114 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

115 0. , -0.40546511], 

-

116 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

117 0.69314718, -0.40546511], 

-

118 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

119 0.69314718, -0.40546511], 

-

120 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

121 0.69314718, 0.69314718], 

-

122 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

123 0.69314718, 0.69314718]]) 

-

124 """ 

-

125 

-

126 def __init__(self, encoder: Transformer, dtype: type = np.float64): 

-

127 if not isinstance(encoder, Transformer): 

-

128 raise TypeError('`encoder` should be a transformer.') 

-

129 _BaseEncoder.__init__(self, dtype=dtype) 

-

130 self.encoder = encoder 

-

131 self.drop_columns = None 

-

132 self.label_names = [] 

-

133 self.encoder_dict = {} 

-

134 self.columns = [] 

-

135 self.idx_columns = np.ndarray([]) 

-

136 self.column_names = [] 

-

137 self.column_mapping = {} 

-

138 self.name = type(encoder).__name__ 

-

139 

-

140 def fit(self, 

-

141 X: Union[pd.DataFrame, ks.DataFrame], 

-

142 y: Union[pd.Series, ks.Series]) -> 'MultiClassEncoder': 

-

143 """Fit the transformer on the dataframe `X`. 

-

144 

-

145 Parameters 

-

146 ---------- 

-

147 X : Union[pd.DataFrame, ks.DataFrame]. 

-

148 Input dataframe. 

-

149 y : Union[pd.Series, ks.Series], default to None. 

-

150 Labels. 

-

151 

-

152 Returns 

-

153 ------- 

-

154 MultiClassEncoder 

-

155 Instance of itself. 

-

156 """ 

-

157 self.check_dataframe(X) 

-

158 self.check_y(X, y) 

-

159 self.check_multiclass_target(y) 

-

160 self.columns = util.get_datatype_columns(X, object) 

-

161 self.check_nans(X, self.columns) 

-

162 self.drop_columns = DropColumns(self.columns).fit(X) 

-

163 if not self.columns: 

-

164 warnings.warn( 

-

165 f'''`X` does not contain object columns: 

-

166 `{self.__class__.__name__}` is not needed''') 

-

167 return self 

-

168 self.idx_columns = util.get_idx_columns( 

-

169 columns=X.columns, 

-

170 selected_columns=self.columns, 

-

171 ) 

-

172 y_name = y.name 

-

173 if isinstance(X, pd.DataFrame): 

-

174 y_one_hot = pd.get_dummies(y, prefix=y_name) 

-

175 else: 

-

176 y_one_hot = ks.get_dummies(y, prefix=y_name) 

-

177 y_one_hot = y_one_hot.drop(y_one_hot.columns[0], axis=1) 

-

178 self.label_names = y_one_hot.columns 

-

179 for label_name in self.label_names: 

-

180 self.encoder_dict[label_name] = copy.copy(self.encoder) 

-

181 self.encoder_dict[label_name].fit( 

-

182 X[self.columns], y_one_hot[label_name]) 

-

183 return self 

-

184 

-

185 def transform(self, 

-

186 X: Union[pd.DataFrame, ks.DataFrame] 

-

187 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

188 """Transform the dataframe `X`. 

-

189 

-

190 Parameters 

-

191 ---------- 

-

192 X : Union[pd.DataFrame, ks.DataFrame]. 

-

193 Input dataframe. 

-

194 

-

195 Returns 

-

196 ------- 

-

197 Union[pd.DataFrame, ks.DataFrame] 

-

198 Transformed dataframe. 

-

199 """ 

-

200 self.check_dataframe(X) 

-

201 if not self.columns: 

-

202 self.idx_columns = np.array([]) 

-

203 return X 

-

204 for i, label_name in enumerate(self.label_names): 

-

205 dummy = self.encoder_dict[label_name].transform( 

-

206 X[self.columns].copy())[self.encoder_dict[label_name].columns] 

-

207 column_names = [ 

-

208 f'{col}__{label_name}_{self.name}' for col in dummy.columns] 

-

209 dummy.columns = column_names 

-

210 self.column_names.extend(column_names) 

-

211 for name, col in zip(column_names, self.columns): 

-

212 self.column_mapping[name] = col 

-

213 X = X.join(dummy, how='inner').sort_index() 

-

214 return self.drop_columns.transform(X).astype(self.dtype) 

-

215 

-

216 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

217 """Transform the NumPy array `X`. 

-

218 

-

219 Parameters 

-

220 ---------- 

-

221 X : np.ndarray 

-

222 Input array. 

-

223 

-

224 Returns 

-

225 ------- 

-

226 np.ndarray 

-

227 Transformed array. 

-

228 """ 

-

229 self.check_array(X) 

-

230 if not self.columns: 

-

231 return X 

-

232 X_encoded_list = [] 

-

233 for i, label_name in enumerate(self.label_names): 

-

234 dummy = self.encoder_dict[label_name].transform_numpy( 

-

235 X[:, self.idx_columns].copy()) 

-

236 X_encoded_list.append(dummy) 

-

237 X_new = np.concatenate( 

-

238 [self.drop_columns.transform_numpy(X)] + X_encoded_list, axis=1) 

-

239 return X_new.astype(self.dtype) 

-
- - - diff --git a/cov_html/d_2e7b559919172292_onehot_encoder_py.html b/cov_html/d_2e7b559919172292_onehot_encoder_py.html index c58d97a2..374db041 100644 --- a/cov_html/d_2e7b559919172292_onehot_encoder_py.html +++ b/cov_html/d_2e7b559919172292_onehot_encoder_py.html @@ -6,264 +6,257 @@ Coverage for gators/encoders/onehot_encoder.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import warnings 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ..util import util 

-

8from ._base_encoder import _BaseEncoder 

-

9from . import OrdinalEncoder 

-

10from encoder import onehot_encoder 

-

11 

-

12 

-

13class OneHotEncoder(_BaseEncoder): 

-

14 """Encode the categorical columns as one-hot numeric columns. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 dtype : type, default to np.float64. 

-

19 Numerical datatype of the output data. 

-

20 

-

21 Examples 

-

22 --------- 

-

23 

-

24 * fit & transform with `pandas` 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.encoders import OneHotEncoder 

-

28 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

29 >>> obj = OneHotEncoder() 

-

30 >>> obj.fit_transform(X) 

-

31 A__b A__a B__d B__c 

-

32 0 0.0 1.0 0.0 1.0 

-

33 1 0.0 1.0 1.0 0.0 

-

34 2 1.0 0.0 1.0 0.0 

-

35 

-

36 * fit & transform with `koalas` 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.encoders import OneHotEncoder 

-

40 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

41 >>> obj = OneHotEncoder() 

-

42 >>> obj.fit_transform(X) 

-

43 A__b A__a B__d B__c 

-

44 0 0.0 1.0 0.0 1.0 

-

45 1 0.0 1.0 1.0 0.0 

-

46 2 1.0 0.0 1.0 0.0 

-

47 

-

48 * fit with `pandas` & transform with `NumPy` 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.encoders import OneHotEncoder 

-

52 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

53 >>> obj = OneHotEncoder() 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[0., 1., 0., 1.], 

-

57 [0., 1., 1., 0.], 

-

58 [1., 0., 1., 0.]]) 

-

59 

-

60 * fit with `koalas` & transform with `NumPy` 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> from gators.encoders import OneHotEncoder 

-

64 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

65 >>> obj = OneHotEncoder() 

-

66 >>> _ = obj.fit(X) 

-

67 >>> obj.transform_numpy(X.to_numpy()) 

-

68 array([[0., 1., 0., 1.], 

-

69 [0., 1., 1., 0.], 

-

70 [1., 0., 1., 0.]]) 

-

71 """ 

-

72 

-

73 def __init__(self, dtype: type = np.float64): 

-

74 _BaseEncoder.__init__(self, dtype=dtype) 

-

75 self.ordinal_encoder = OrdinalEncoder( 

-

76 dtype=dtype, add_other_columns=False) 

-

77 self.idx_numerical_columns = np.array([]) 

-

78 self.onehot_columns = [] 

-

79 self.numerical_columns = [] 

-

80 self.column_mapping = {} 

-

81 

-

82 def fit(self, 

-

83 X: Union[pd.DataFrame, ks.DataFrame], 

-

84 y: Union[pd.Series, ks.Series] = None) -> 'OneHotEncoder': 

-

85 """Fit the transformer on the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 y : None 

-

92 None. 

-

93 

-

94 Returns 

-

95 ------- 

-

96 OneHotEncoder: Instance of itself. 

-

97 """ 

-

98 self.check_dataframe(X) 

-

99 self.columns = util.get_datatype_columns(X, object) 

-

100 if not self.columns: 

-

101 warnings.warn( 

-

102 f'''`X` does not contain object columns: 

-

103 `{self.__class__.__name__}` is not needed''') 

-

104 return self 

-

105 self.check_nans(X, self.columns) 

-

106 self.numerical_columns = util.exclude_columns( 

-

107 X.columns, self.columns) 

-

108 _ = self.ordinal_encoder.fit(X) 

-

109 self.onehot_columns = [] 

-

110 for key, val in self.ordinal_encoder.mapping.items(): 

-

111 self.onehot_columns.extend( 

-

112 [f'{key}__{self.dtype(c)}' 

-

113 for c in sorted(val.values(), key=int)]) 

-

114 for key, val in self.ordinal_encoder.mapping.items(): 

-

115 for k, v in val.items(): 

-

116 self.column_mapping[f'{key}__{self.dtype(v)}'] = \ 

-

117 f'{key}__{k}' 

-

118 self.all_columns = self.numerical_columns + self.onehot_columns 

-

119 self.idx_numerical_columns = util.get_idx_columns( 

-

120 X.columns, self.numerical_columns) 

-

121 self.idx_columns = np.arange( 

-

122 len(self.numerical_columns), 

-

123 len(self.numerical_columns)+len(self.onehot_columns), 

-

124 dtype=int) 

-

125 self.idx_columns = np.arange( 

-

126 len(self.numerical_columns), 

-

127 len(self.onehot_columns), 

-

128 dtype=int) 

-

129 self.n_categories_vec = np.empty( 

-

130 len(self.ordinal_encoder.columns), int) 

-

131 for i, c in enumerate(self.columns): 

-

132 self.n_categories_vec[i] = \ 

-

133 len(self.ordinal_encoder.mapping[c]) 

-

134 

-

135 self.columns_flatten = np.array([ 

-

136 col 

-

137 for col, mapping in self.ordinal_encoder.mapping.items() 

-

138 for v in range(len(mapping))]) 

-

139 self.idx_columns = util.get_idx_columns(X, self.columns_flatten) 

-

140 self.idx_columns_to_keep = [ 

-

141 i for i in range(X.shape[1] + self.idx_columns.shape[0]) 

-

142 if i not in util.get_idx_columns(X, self.columns)] 

-

143 self.cats = np.array([ 

-

144 v 

-

145 for col, mapping in self.ordinal_encoder.mapping.items() 

-

146 for v in dict( 

-

147 sorted(mapping.items(), key=lambda item: item[1])).keys() 

-

148 ]).astype(object) 

-

149 return self 

-

150 

-

151 def transform(self, 

-

152 X: Union[pd.DataFrame, ks.DataFrame], 

-

153 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

154 """Transform the dataframe `X`. 

-

155 

-

156 Parameters 

-

157 ---------- 

-

158 X : Union[pd.DataFrame, ks.DataFrame]. 

-

159 Input dataframe. 

-

160 

-

161 Returns 

-

162 ------- 

-

163 Union[pd.DataFrame, ks.DataFrame] 

-

164 Transformed dataframe. 

-

165 """ 

-

166 self.check_dataframe(X) 

-

167 if not self.columns: 

-

168 return X 

-

169 dummy = X[self.columns].copy() 

-

170 X_new = self.ordinal_encoder.transform(X) 

-

171 X[self.columns] = dummy 

-

172 if isinstance(X, pd.DataFrame): 

-

173 X_new = pd.get_dummies( 

-

174 X_new, 

-

175 prefix_sep='__', 

-

176 columns=self.columns) 

-

177 else: 

-

178 X_new = ks.get_dummies( 

-

179 X_new, 

-

180 prefix_sep='__', 

-

181 columns=self.columns) 

-

182 X_new = X_new.reindex(columns=self.all_columns, fill_value=0.) 

-

183 return X_new.rename(columns=self.column_mapping).astype(self.dtype) 

-

184 

-

185 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

186 """Transform the input array. 

-

187 

-

188 Parameters 

-

189 ---------- 

-

190 X : np.ndarray 

-

191 Input array. 

-

192 

-

193 Returns 

-

194 ------- 

-

195 np.ndarray: Encoded array. 

-

196 """ 

-

197 self.check_array(X) 

-

198 if len(self.idx_columns) == 0: 

-

199 return X 

-

200 return onehot_encoder( 

-

201 X, 

-

202 self.idx_columns, 

-

203 self.cats 

-

204 )[:, self.idx_columns_to_keep].astype(self.dtype) 

-
- + diff --git a/cov_html/d_2e7b559919172292_ordinal_encoder_py.html b/cov_html/d_2e7b559919172292_ordinal_encoder_py.html index 2ea51ad0..d8e93a78 100644 --- a/cov_html/d_2e7b559919172292_ordinal_encoder_py.html +++ b/cov_html/d_2e7b559919172292_ordinal_encoder_py.html @@ -6,219 +6,190 @@ Coverage for gators/encoders/ordinal_encoder.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import warnings 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ..util import util 

-

8from ._base_encoder import _BaseEncoder 

-

9 

-

10 

-

11class OrdinalEncoder(_BaseEncoder): 

-

12 """Encode the categorical columns as integer columns. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 dtype : type, default to np.float64. 

-

17 Numerical datatype of the output data. 

-

18 add_other_columns: bool, default to True. 

-

19 If True, add the columns 'OTHERS' and 'MISSING' 

-

20 to the mapping even if the categories are not 

-

21 present in the data. 

-

22 

-

23 Examples 

-

24 --------- 

-

25 

-

26 * fit & transform with `pandas` 

-

27 

-

28 >>> import pandas as pd 

-

29 >>> from gators.encoders import OrdinalEncoder 

-

30 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

31 >>> obj = OrdinalEncoder() 

-

32 >>> obj.fit_transform(X) 

-

33 A B 

-

34 0 1.0 1.0 

-

35 1 1.0 0.0 

-

36 2 0.0 0.0 

-

37 

-

38 * fit & transform with `koalas` 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.encoders import OrdinalEncoder 

-

42 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

43 >>> obj = OrdinalEncoder() 

-

44 >>> obj.fit_transform(X) 

-

45 A B 

-

46 0 1.0 1.0 

-

47 1 1.0 0.0 

-

48 2 0.0 0.0 

-

49 

-

50 * fit with `pandas` & transform with `NumPy` 

-

51 

-

52 >>> import pandas as pd 

-

53 >>> from gators.encoders import OrdinalEncoder 

-

54 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

55 >>> obj = OrdinalEncoder() 

-

56 >>> _ = obj.fit(X) 

-

57 >>> obj.transform_numpy(X.to_numpy()) 

-

58 array([[1., 1.], 

-

59 [1., 0.], 

-

60 [0., 0.]]) 

-

61 

-

62 * fit with `koalas` & transform with `NumPy` 

-

63 

-

64 >>> import databricks.koalas as ks 

-

65 >>> from gators.encoders import OrdinalEncoder 

-

66 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

67 >>> obj = OrdinalEncoder() 

-

68 >>> _ = obj.fit(X) 

-

69 >>> obj.transform_numpy(X.to_numpy()) 

-

70 array([[1., 1.], 

-

71 [1., 0.], 

-

72 [0., 0.]]) 

-

73 """ 

-

74 

-

75 def __init__(self, dtype: type = np.float64, 

-

76 add_other_columns: bool = True): 

-

77 _BaseEncoder.__init__(self, dtype=dtype) 

-

78 if not isinstance(add_other_columns, bool): 

-

79 raise TypeError('`add_other_columns` shouldbe a bool.') 

-

80 self.add_other_columns = add_other_columns 

-

81 

-

82 def fit(self, 

-

83 X: Union[pd.DataFrame, ks.DataFrame], 

-

84 y: Union[pd.Series, ks.Series] = None) -> 'OrdinalEncoder': 

-

85 """Fit the transformer on the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 y : Union[pd.Series, ks.Series], default to None. 

-

92 Labels. 

-

93 

-

94 Returns 

-

95 ------- 

-

96 OrdinalEncoder: Instance of itself. 

-

97 """ 

-

98 self.check_dataframe(X) 

-

99 self.columns = util.get_datatype_columns(X, object) 

-

100 self.check_nans(X, self.columns) 

-

101 if not self.columns: 

-

102 warnings.warn( 

-

103 f'''`X` does not contain object columns: 

-

104 `{self.__class__.__name__}` is not needed''') 

-

105 return self 

-

106 self.mapping = self.generate_mapping( 

-

107 X, self.columns, self.add_other_columns) 

-

108 self.num_categories_vec = np.array( 

-

109 [len(m) for m in self.mapping.values()] 

-

110 ) 

-

111 columns, self.values_vec, self.encoded_values_vec = \ 

-

112 self.decompose_mapping( 

-

113 mapping=self.mapping, 

-

114 ) 

-

115 self.idx_columns = util.get_idx_columns( 

-

116 columns=X.columns, selected_columns=columns 

-

117 ) 

-

118 return self 

-

119 

-

120 @staticmethod 

-

121 def generate_mapping( 

-

122 X: Union[pd.DataFrame, ks.DataFrame], 

-

123 columns: List[str], 

-

124 add_other_columns: bool) -> Dict[str, Dict[str, float]]: 

-

125 """Generate the mapping to perform the encoding. 

-

126 

-

127 Parameters 

-

128 ---------- 

-

129 X : Union[pd.DataFrame, ks.DataFrame] 

-

130 Input dataframe. 

-

131 self.columns : List[str] 

-

132 List of columns. 

-

133 add_other_columns: bool 

-

134 If True, add the columns 'OTHERS' and 'MISSING' 

-

135 to the mapping even if the categories are not 

-

136 present in the data. 

-

137 

-

138 Returns 

-

139 ------- 

-

140 Dict[str, Dict[str, float]] 

-

141 Mapping. 

-

142 """ 

-

143 mapping = {} 

-

144 for c in columns: 

-

145 categories = X[c].value_counts().to_dict() 

-

146 n_categories = len(categories) 

-

147 category_names = list(categories.keys()) 

-

148 category_names = sorted(category_names) 

-

149 category_mapping = dict(zip( 

-

150 category_names, 

-

151 np.arange(n_categories-1, -1, -1).astype(str) 

-

152 )) 

-

153 if add_other_columns and 'MISSING' not in category_mapping: 

-

154 category_mapping['MISSING'] = str(len(category_mapping)) 

-

155 if add_other_columns and 'OTHERS' not in category_mapping: 

-

156 category_mapping['OTHERS'] = str(len(category_mapping)) 

-

157 mapping[c] = category_mapping 

-

158 

-

159 return mapping 

-
- + diff --git a/cov_html/d_2e7b559919172292_regression_encoder_py.html b/cov_html/d_2e7b559919172292_regression_encoder_py.html deleted file mode 100644 index 2abcbbfe..00000000 --- a/cov_html/d_2e7b559919172292_regression_encoder_py.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - Coverage for gators/encoders/regression_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2import numpy as np 

-

3from typing import Union 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from .multiclass_encoder import MultiClassEncoder 

-

7from ._base_encoder import _BaseEncoder 

-

8from ..transformers import Transformer 

-

9 

-

10 

-

11class RegressionEncoder(_BaseEncoder): 

-

12 """Encode the categorical columns with a binary encoder given by the user. 

-

13 

-

14 The encoding is composed in 2 steps: 

-

15 

-

16 * bin the target values using the discretizer passed as argument. 

-

17 * apply the `MultiClassEncoder` on the discretized target values. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 encoder : Transformer. 

-

22 Encoder. 

-

23 discretizer: Transformer. 

-

24 Discretizer. 

-

25 dtype : type, default to np.float64. 

-

26 Numerical datatype of the output data. 

-

27 

-

28 Examples 

-

29 -------- 

-

30 * fit & transform with `pandas` 

-

31 

-

32 >>> import pandas as pd 

-

33 >>> from gators.binning import QuantileDiscretizer 

-

34 >>> from gators.encoders import WOEEncoder 

-

35 >>> from gators.encoders import RegressionEncoder 

-

36 >>> X = pd.DataFrame({ 

-

37 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

38 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

39 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

40 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

41 >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') 

-

42 >>> obj = RegressionEncoder( 

-

43 ... encoder=WOEEncoder(), 

-

44 ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) 

-

45 >>> obj.fit_transform(X, y) 

-

46 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

47 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

48 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

49 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

50 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

51 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

52 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

53 

-

54 * fit & transform with `koalas` 

-

55 

-

56 >>> import databricks.koalas as ks 

-

57 >>> from gators.binning import QuantileDiscretizer 

-

58 >>> from gators.encoders import WOEEncoder 

-

59 >>> from gators.encoders import RegressionEncoder 

-

60 >>> X = ks.DataFrame({ 

-

61 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

62 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

63 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

64 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

65 >>> y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') 

-

66 >>> obj = RegressionEncoder( 

-

67 ... encoder=WOEEncoder(), 

-

68 ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) 

-

69 >>> obj.fit_transform(X, y) 

-

70 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

71 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

72 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

73 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

74 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

75 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

76 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

77 

-

78 * fit with `pandas` & transform with `NumPy` 

-

79 

-

80 >>> import pandas as pd 

-

81 >>> from gators.binning import QuantileDiscretizer 

-

82 >>> from gators.encoders import WOEEncoder 

-

83 >>> from gators.encoders import RegressionEncoder 

-

84 >>> X = pd.DataFrame({ 

-

85 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

86 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

87 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

88 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

89 >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') 

-

90 >>> obj = RegressionEncoder( 

-

91 ... encoder=WOEEncoder(), 

-

92 ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) 

-

93 >>> _ = obj.fit(X, y) 

-

94 >>> obj.transform_numpy(X.to_numpy()) 

-

95 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

96 0. , -0.40546511], 

-

97 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

98 0. , -0.40546511], 

-

99 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

100 0.69314718, -0.40546511], 

-

101 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

102 0.69314718, -0.40546511], 

-

103 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

104 0.69314718, 0.69314718], 

-

105 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

106 0.69314718, 0.69314718]]) 

-

107 

-

108 * fit with `koalas` & transform with `NumPy` 

-

109 

-

110 >>> import databricks.koalas as ks 

-

111 >>> from gators.binning import QuantileDiscretizer 

-

112 >>> from gators.encoders import WOEEncoder 

-

113 >>> from gators.encoders import RegressionEncoder 

-

114 >>> X = ks.DataFrame({ 

-

115 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

116 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

117 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

118 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

119 >>> y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') 

-

120 >>> obj = RegressionEncoder( 

-

121 ... encoder=WOEEncoder(), 

-

122 ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) 

-

123 >>> _ = obj.fit(X, y) 

-

124 >>> obj.transform_numpy(X.to_numpy()) 

-

125 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

126 0. , -0.40546511], 

-

127 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

128 0. , -0.40546511], 

-

129 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

130 0.69314718, -0.40546511], 

-

131 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

132 0.69314718, -0.40546511], 

-

133 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

134 0.69314718, 0.69314718], 

-

135 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

136 0.69314718, 0.69314718]]) 

-

137 """ 

-

138 

-

139 def __init__(self, encoder: Transformer, discretizer: Transformer, 

-

140 dtype: type = np.float64): 

-

141 _BaseEncoder.__init__(self, dtype=dtype) 

-

142 if not isinstance(discretizer, Transformer): 

-

143 raise TypeError( 

-

144 '`discretizer` should inherit from _BaseDiscretizer.') 

-

145 if not isinstance(encoder, Transformer): 

-

146 raise TypeError('`encoder` should be a transformer.') 

-

147 

-

148 self.discretizer = discretizer 

-

149 self.multiclass_encoder = MultiClassEncoder( 

-

150 encoder=encoder, dtype=dtype) 

-

151 

-

152 def fit(self, 

-

153 X: Union[pd.DataFrame, ks.DataFrame], 

-

154 y: Union[pd.Series, ks.Series]) -> 'RegressionEncoder': 

-

155 """Fit the transformer on the dataframe `X`. 

-

156 

-

157 Parameters 

-

158 ---------- 

-

159 X : Union[pd.DataFrame, ks.DataFrame]. 

-

160 Input dataframe. 

-

161 y : Union[pd.Series, ks.Series], default to None. 

-

162 Labels. 

-

163 

-

164 Returns 

-

165 ------- 

-

166 RegressionEncoder 

-

167 Instance of itself. 

-

168 """ 

-

169 self.check_dataframe(X) 

-

170 self.check_y(X, y) 

-

171 self.check_regression_target(y) 

-

172 y_binned = self.discretizer.fit_transform(y.to_frame()) 

-

173 self.multiclass_encoder.fit( 

-

174 X, y_binned[y.name].astype(float).astype(int)) 

-

175 return self 

-

176 

-

177 def transform(self, 

-

178 X: Union[pd.DataFrame, ks.DataFrame] 

-

179 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

180 """Transform the dataframe `X`. 

-

181 

-

182 Parameters 

-

183 ---------- 

-

184 X : Union[pd.DataFrame, ks.DataFrame]. 

-

185 Input dataframe. 

-

186 

-

187 Returns 

-

188 ------- 

-

189 Union[pd.DataFrame, ks.DataFrame] 

-

190 Transformed dataframe. 

-

191 """ 

-

192 return self.multiclass_encoder.transform(X) 

-

193 

-

194 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

195 """Transform the NumPy array `X`. 

-

196 

-

197 Parameters 

-

198 ---------- 

-

199 X : np.ndarray 

-

200 Input array. 

-

201 

-

202 Returns 

-

203 ------- 

-

204 np.ndarray 

-

205 Transformed array. 

-

206 """ 

-

207 return self.multiclass_encoder.transform_numpy(X) 

-
- - - diff --git a/cov_html/d_2e7b559919172292_target_encoder_py.html b/cov_html/d_2e7b559919172292_target_encoder_py.html index 48e617c8..625216ec 100644 --- a/cov_html/d_2e7b559919172292_target_encoder_py.html +++ b/cov_html/d_2e7b559919172292_target_encoder_py.html @@ -6,227 +6,201 @@ Coverage for gators/encoders/target_encoder.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2. 

-

2from typing import List, Union, Dict 

-

3import warnings 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ._base_encoder import _BaseEncoder 

-

8from ..util import util 

-

9 

-

10 

-

11def clean_mapping(mapping: Dict[str, Dict[str, List[float]]] 

-

12 ) -> Dict[str, Dict[str, List[float]]]: 

-

13 mapping = { 

-

14 col: {k: v for k, v in mapping[col].items() if v == v} 

-

15 for col in mapping.keys() 

-

16 } 

-

17 for m in mapping.values(): 

-

18 if 'OTHERS' not in m: 

-

19 m['OTHERS'] = 0. 

-

20 if 'MISSING' not in m: 

-

21 m['MISSING'] = 0. 

-

22 return mapping 

-

23 

-

24 

-

25class TargetEncoder(_BaseEncoder): 

-

26 """Encode the categorical variable using the target encoding technique. 

-

27 

-

28 Parameters 

-

29 ---------- 

-

30 dtype : type, default to np.float64. 

-

31 Numerical datatype of the output data. 

-

32 

-

33 Examples 

-

34 -------- 

-

35 

-

36 * fit & transform with `pandas` 

-

37 

-

38 >>> import pandas as pd 

-

39 >>> from gators.encoders import TargetEncoder 

-

40 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

41 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

42 >>> obj = TargetEncoder() 

-

43 >>> obj.fit_transform(X, y) 

-

44 A B 

-

45 0 1.0 1.0 

-

46 1 1.0 0.5 

-

47 2 0.0 0.5 

-

48 

-

49 * fit & transform with `koalas` 

-

50 

-

51 >>> import databricks.koalas as ks 

-

52 >>> from gators.encoders import TargetEncoder 

-

53 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

54 >>> y = ks.Series([1, 1, 0], name='TARGET') 

-

55 >>> obj = TargetEncoder() 

-

56 >>> obj.fit_transform(X, y) 

-

57 A B 

-

58 0 1.0 1.0 

-

59 1 1.0 0.5 

-

60 2 0.0 0.5 

-

61 

-

62 * fit with `pandas` & transform with `NumPy` 

-

63 

-

64 >>> import pandas as pd 

-

65 >>> from gators.encoders import TargetEncoder 

-

66 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

67 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

68 >>> obj = TargetEncoder() 

-

69 >>> _ = obj.fit(X, y) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[1. , 1. ], 

-

72 [1. , 0.5], 

-

73 [0. , 0.5]]) 

-

74 

-

75 * fit with `koalas` & transform with `NumPy` 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.encoders import TargetEncoder 

-

79 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

80 >>> y = ks.Series([1, 1, 0], name='TARGET') 

-

81 >>> obj = TargetEncoder() 

-

82 >>> _ = obj.fit(X, y) 

-

83 >>> obj.transform_numpy(X.to_numpy()) 

-

84 array([[1. , 1. ], 

-

85 [1. , 0.5], 

-

86 [0. , 0.5]]) 

-

87 """ 

-

88 

-

89 def __init__(self, dtype: type = np.float64): 

-

90 _BaseEncoder.__init__(self, dtype=dtype) 

-

91 

-

92 def fit(self, 

-

93 X: Union[pd.DataFrame, ks.DataFrame], 

-

94 y: Union[pd.Series, ks.Series]) -> 'TargetEncoder': 

-

95 """Fit the encoder. 

-

96 

-

97 Parameters 

-

98 ---------- 

-

99 X : Union[pd.DataFrame, ks.DataFrame]: 

-

100 Input dataframe. 

-

101 y : Union[pd.Series, ks.Series], default to None. 

-

102 Labels. 

-

103 

-

104 Returns 

-

105 ------- 

-

106 TargetEncoder: 

-

107 Instance of itself. 

-

108 """ 

-

109 self.check_dataframe(X) 

-

110 self.check_y(X, y) 

-

111 self.check_binary_target(y) 

-

112 self.columns = util.get_datatype_columns(X, object) 

-

113 if not self.columns: 

-

114 warnings.warn( 

-

115 f'''`X` does not contain object columns: 

-

116 `{self.__class__.__name__}` is not needed''') 

-

117 return self 

-

118 self.check_nans(X, self.columns) 

-

119 self.mapping = self.generate_mapping( 

-

120 X[self.columns], y) 

-

121 self.num_categories_vec = np.array( 

-

122 [len(m) for m in self.mapping.values()] 

-

123 ) 

-

124 columns, self.values_vec, self.encoded_values_vec = \ 

-

125 self.decompose_mapping(mapping=self.mapping) 

-

126 self.idx_columns = util.get_idx_columns( 

-

127 columns=X.columns, selected_columns=columns 

-

128 ) 

-

129 return self 

-

130 

-

131 @staticmethod 

-

132 def generate_mapping( 

-

133 X: Union[pd.DataFrame, ks.DataFrame], 

-

134 y: Union[pd.Series, ks.Series], 

-

135 

-

136 ) -> Dict[str, Dict[str, float]]: 

-

137 """Generate the mapping to perform the encoding. 

-

138 

-

139 Parameters 

-

140 ---------- 

-

141 X : Union[pd.DataFrame, ks.DataFrame] 

-

142 Input dataframe. 

-

143 y : Union[pd.Series, ks.Series]: 

-

144 Labels. 

-

145 

-

146 Returns 

-

147 ------- 

-

148 Dict[str, Dict[str, float]] 

-

149 Mapping. 

-

150 """ 

-

151 y_name = y.name 

-

152 if isinstance(X, pd.DataFrame): 

-

153 def f(x) -> ks.Series[np.float64]: 

-

154 return pd.DataFrame(x).join(y).groupby(x.name).mean()[y_name] 

-

155 

-

156 mapping = X.apply(f).to_dict() 

-

157 return clean_mapping(mapping) 

-

158 

-

159 mapping_list = [] 

-

160 for name in X.columns: 

-

161 dummy = ks.DataFrame(X[name]).join(y).groupby( 

-

162 name).mean()[y_name].to_pandas() 

-

163 dummy.name = name 

-

164 mapping_list.append(dummy) 

-

165 

-

166 mapping = pd.concat(mapping_list, axis=1).to_dict() 

-

167 return clean_mapping(mapping) 

-
- + diff --git a/cov_html/d_2e7b559919172292_woe_encoder_py.html b/cov_html/d_2e7b559919172292_woe_encoder_py.html index abd5a111..8d6b32e8 100644 --- a/cov_html/d_2e7b559919172292_woe_encoder_py.html +++ b/cov_html/d_2e7b559919172292_woe_encoder_py.html @@ -6,232 +6,214 @@ Coverage for gators/encoders/woe_encoder.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import warnings 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ._base_encoder import _BaseEncoder 

-

8from ..util import util 

-

9 

-

10 

-

11def clean_mapping(mapping: Dict[str, Dict[str, List[float]]] 

-

12 ) -> Dict[str, Dict[str, List[float]]]: 

-

13 mapping = { 

-

14 col: {k: v for k, v in mapping[col].items() if v == v} 

-

15 for col in mapping.keys() 

-

16 } 

-

17 for m in mapping.values(): 

-

18 if 'OTHERS' not in m: 

-

19 m['OTHERS'] = 0. 

-

20 if 'MISSING' not in m: 

-

21 m['MISSING'] = 0. 

-

22 return mapping 

-

23 

-

24 

-

25class WOEEncoder(_BaseEncoder): 

-

26 """Encode all categorical variable using the weight of evidence technique. 

-

27 

-

28 Parameters 

-

29 ---------- 

-

30 dtype : type, default to np.float64. 

-

31 Numerical datatype of the output data. 

-

32 

-

33 Examples 

-

34 -------- 

-

35 

-

36 * fit & transform with `pandas` 

-

37 

-

38 >>> import pandas as pd 

-

39 >>> from gators.encoders import WOEEncoder 

-

40 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

41 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

42 >>> obj = WOEEncoder() 

-

43 >>> obj.fit_transform(X, y) 

-

44 A B 

-

45 0 0.0 0.000000 

-

46 1 0.0 -0.693147 

-

47 2 0.0 -0.693147 

-

48 

-

49 * fit & transform with `koalas` 

-

50 

-

51 >>> import databricks.koalas as ks 

-

52 >>> from gators.encoders import WOEEncoder 

-

53 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

54 >>> y = ks.Series([1, 1, 0], name='TARGET') 

-

55 >>> obj = WOEEncoder() 

-

56 >>> obj.fit_transform(X, y) 

-

57 A B 

-

58 0 0.0 0.000000 

-

59 1 0.0 -0.693147 

-

60 2 0.0 -0.693147 

-

61 

-

62 * fit with `pandas` & transform with `NumPy` 

-

63 

-

64 >>> import pandas as pd 

-

65 >>> from gators.encoders import WOEEncoder 

-

66 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

67 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

68 >>> obj = WOEEncoder() 

-

69 >>> _ = obj.fit(X, y) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[ 0. , 0. ], 

-

72 [ 0. , -0.69314718], 

-

73 [ 0. , -0.69314718]]) 

-

74 

-

75 * fit with `koalas` & transform with `NumPy` 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.encoders import WOEEncoder 

-

79 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

80 >>> y = ks.Series([1, 1, 0], name='TARGET') 

-

81 >>> obj = WOEEncoder() 

-

82 >>> _ = obj.fit(X, y) 

-

83 >>> obj.transform_numpy(X.to_numpy()) 

-

84 array([[ 0. , 0. ], 

-

85 [ 0. , -0.69314718], 

-

86 [ 0. , -0.69314718]]) 

-

87 """ 

-

88 

-

89 def __init__(self, dtype: type = np.float64): 

-

90 _BaseEncoder.__init__(self, dtype=dtype) 

-

91 

-

92 def fit(self, 

-

93 X: Union[pd.DataFrame, ks.DataFrame], 

-

94 y: Union[pd.Series, ks.Series]) -> 'WOEEncoder': 

-

95 """Fit the encoder. 

-

96 

-

97 Parameters 

-

98 ---------- 

-

99 X : Union[pd.DataFrame, ks.DataFrame]: 

-

100 Input dataframe. 

-

101 y : Union[pd.Series, ks.Series], default to None. 

-

102 Labels. 

-

103 

-

104 Returns 

-

105 ------- 

-

106 WOEEncoder: 

-

107 Instance of itself. 

-

108 """ 

-

109 self.check_dataframe(X) 

-

110 self.check_y(X, y) 

-

111 self.check_binary_target(y) 

-

112 self.columns = util.get_datatype_columns(X, object) 

-

113 if not self.columns: 

-

114 warnings.warn( 

-

115 f'''`X` does not contain object columns: 

-

116 `{self.__class__.__name__}` is not needed''') 

-

117 return self 

-

118 self.check_binary_target(y) 

-

119 self.check_nans(X, self.columns) 

-

120 self.mapping = self.generate_mapping( 

-

121 X[self.columns], y) 

-

122 self.num_categories_vec = np.array( 

-

123 [len(m) for m in self.mapping.values()] 

-

124 ) 

-

125 columns, self.values_vec, self.encoded_values_vec = \ 

-

126 self.decompose_mapping(mapping=self.mapping) 

-

127 self.idx_columns = util.get_idx_columns( 

-

128 columns=X.columns, selected_columns=columns 

-

129 ) 

-

130 return self 

-

131 

-

132 @staticmethod 

-

133 def generate_mapping( 

-

134 X: Union[pd.DataFrame, ks.DataFrame], 

-

135 y: Union[pd.Series, ks.Series], 

-

136 

-

137 ) -> Dict[str, Dict[str, float]]: 

-

138 """Generate the mapping to perform the encoding. 

-

139 

-

140 Parameters 

-

141 ---------- 

-

142 X : Union[pd.DataFrame, ks.DataFrame] 

-

143 Input dataframe. 

-

144 y : Union[pd.Series, ks.Series]: 

-

145 Labels. 

-

146 

-

147 Returns 

-

148 ------- 

-

149 Dict[str, Dict[str, float]] 

-

150 Mapping. 

-

151 """ 

-

152 mapping_list = [] 

-

153 y_name = y.name 

-

154 X = X.join(y) 

-

155 for col in X.columns: 

-

156 if isinstance(X, pd.DataFrame): 

-

157 tab = X.groupby( 

-

158 [col, y_name])[y_name].count().unstack( 

-

159 ).fillna(0) 

-

160 else: 

-

161 tab = X.groupby( 

-

162 [col, y_name])[y_name].count().unstack( 

-

163 ).to_pandas().fillna(0) 

-

164 tab /= tab.sum() 

-

165 tab.columns = [int(c) for c in tab.columns] 

-

166 with np.errstate(divide='ignore'): 

-

167 woe = pd.Series(np.log(tab[1] / tab[0])) 

-

168 woe[(woe == np.inf) | (woe == -np.inf)] = 0. 

-

169 mapping_list.append(pd.Series(woe, name=col)) 

-

170 mapping = pd.concat(mapping_list, axis=1).to_dict() 

-

171 X = X.drop(y_name, axis=1) 

-

172 return clean_mapping(mapping) 

-
- + diff --git a/cov_html/d_3136addfbdc92683_pipeline_py.html b/cov_html/d_3136addfbdc92683_pipeline_py.html index 05358cad..7e8c96f4 100644 --- a/cov_html/d_3136addfbdc92683_pipeline_py.html +++ b/cov_html/d_3136addfbdc92683_pipeline_py.html @@ -6,410 +6,180 @@ Coverage for gators/pipeline/pipeline.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ..transformers.transformer import Transformer 

-

7from ..util import util 

-

8 

-

9 

-

10class Pipeline(Transformer): 

-

11 """Chain the **gators** transformers together. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 steps : List[Transformer] 

-

16 List of transformations. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> import numpy as np 

-

25 >>> from gators.imputers import IntImputer 

-

26 >>> from gators.imputers import FloatImputer 

-

27 >>> from gators.imputers import ObjectImputer 

-

28 >>> from gators.pipeline import Pipeline 

-

29 >>> X = pd.DataFrame({ 

-

30 ... 'A': [0.1, 0.2, 0.3, np.nan], 

-

31 ... 'B': [1, 2, 2, np.nan], 

-

32 ... 'C': ['a', 'b', 'c', np.nan]}) 

-

33 >>> steps = [ 

-

34 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

35 ... FloatImputer(strategy='median'), 

-

36 ... IntImputer(strategy='most_frequent')] 

-

37 >>> obj = Pipeline(steps=steps) 

-

38 >>> obj.fit_transform(X) 

-

39 A B C 

-

40 0 0.1 1.0 a 

-

41 1 0.2 2.0 b 

-

42 2 0.3 2.0 c 

-

43 3 0.2 2.0 MISSING 

-

44 

-

45 * fit & transform with `koalas` 

-

46 

-

47 >>> import databricks.koalas as ks 

-

48 >>> import numpy as np 

-

49 >>> from gators.imputers import IntImputer 

-

50 >>> from gators.imputers import FloatImputer 

-

51 >>> from gators.imputers import ObjectImputer 

-

52 >>> from gators.pipeline import Pipeline 

-

53 >>> X = ks.DataFrame({ 

-

54 ... 'A': [0.1, 0.2, 0.3, np.nan], 

-

55 ... 'B': [1, 2, 2, np.nan], 

-

56 ... 'C': ['a', 'b', 'c', np.nan]}) 

-

57 >>> steps = [ 

-

58 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

59 ... FloatImputer(strategy='median'), 

-

60 ... IntImputer(strategy='most_frequent')] 

-

61 >>> obj = Pipeline(steps=steps) 

-

62 >>> obj.fit_transform(X) 

-

63 A B C 

-

64 0 0.1 1.0 a 

-

65 1 0.2 2.0 b 

-

66 2 0.3 2.0 c 

-

67 3 0.2 2.0 MISSING 

-

68 

-

69 * fit with `pandas` & transform with `NumPy` 

-

70 

-

71 >>> import pandas as pd 

-

72 >>> import numpy as np 

-

73 >>> from gators.imputers import IntImputer 

-

74 >>> from gators.imputers import FloatImputer 

-

75 >>> from gators.imputers import ObjectImputer 

-

76 >>> from gators.pipeline import Pipeline 

-

77 >>> X = pd.DataFrame({ 

-

78 ... 'A': [0.1, 0.2, 0.3, np.nan], 

-

79 ... 'B': [1, 2, 2, np.nan], 

-

80 ... 'C': ['a', 'b', 'c', np.nan]}) 

-

81 >>> steps = [ 

-

82 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

83 ... FloatImputer(strategy='median'), 

-

84 ... IntImputer(strategy='most_frequent')] 

-

85 >>> obj = Pipeline(steps=steps) 

-

86 >>> _ = obj.fit(X) 

-

87 >>> obj.transform_numpy(X.to_numpy()) 

-

88 array([[0.1, 1.0, 'a'], 

-

89 [0.2, 2.0, 'b'], 

-

90 [0.3, 2.0, 'c'], 

-

91 [0.2, 2.0, 'MISSING']], dtype=object) 

-

92 

-

93 * fit with `koalas` & transform with `NumPy` 

-

94 

-

95 >>> import databricks.koalas as ks 

-

96 >>> import numpy as np 

-

97 >>> from gators.imputers import IntImputer 

-

98 >>> from gators.imputers import FloatImputer 

-

99 >>> from gators.imputers import ObjectImputer 

-

100 >>> from gators.pipeline import Pipeline 

-

101 >>> X = ks.DataFrame({ 

-

102 ... 'A': [0.1, 0.2, 0.3, np.nan], 

-

103 ... 'B': [1, 2, 2, np.nan], 

-

104 ... 'C': ['a', 'b', 'c', np.nan]}) 

-

105 >>> steps = [ 

-

106 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

107 ... FloatImputer(strategy='median'), 

-

108 ... IntImputer(strategy='most_frequent')] 

-

109 >>> obj = Pipeline(steps=steps) 

-

110 >>> _ = obj.fit(X) 

-

111 >>> obj.transform_numpy(X.to_numpy()) 

-

112 array([[0.1, 1.0, 'a'], 

-

113 [0.2, 2.0, 'b'], 

-

114 [0.3, 2.0, 'c'], 

-

115 [0.2, 2.0, 'MISSING']], dtype=object) 

-

116 """ 

-

117 

-

118 def __init__(self, steps: List[Transformer]): 

-

119 if not isinstance(steps, list): 

-

120 raise TypeError('`steps` should be a list.') 

-

121 if not steps: 

-

122 raise TypeError('`steps` should be an empty list.') 

-

123 self.steps = steps 

-

124 self.is_model = hasattr(self.steps[-1], 'predict') 

-

125 self.n_steps = len(self.steps) 

-

126 self.n_transformations = self.n_steps - 1 if self.is_model else self.n_steps 

-

127 

-

128 def fit(self, 

-

129 X: Union[pd.DataFrame, ks.DataFrame], 

-

130 y: Union[pd.Series, ks.Series] = None) -> 'Pipeline': 

-

131 """Fit the transformer on the dataframe `X`. 

-

132 

-

133 Parameters 

-

134 ---------- 

-

135 X : Union[pd.DataFrame, ks.DataFrame]. 

-

136 Input dataframe. 

-

137 y : None 

-

138 None. 

-

139 

-

140 Returns 

-

141 ------- 

-

142 Pipeline 

-

143 Instance of itself. 

-

144 """ 

-

145 self.base_columns = list(X.columns) 

-

146 for step in self.steps[:self.n_transformations]: 

-

147 step = step.fit(X, y) 

-

148 X = step.transform(X) 

-

149 if self.is_model: 

-

150 _ = self.steps[-1].fit(X, y) 

-

151 return self 

-

152 

-

153 def transform( 

-

154 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

155 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

156 """Transform the dataframe `X`. 

-

157 

-

158 Parameters 

-

159 ---------- 

-

160 X : Union[pd.DataFrame, ks.DataFrame]. 

-

161 Input dataframe. 

-

162 

-

163 Returns 

-

164 ------- 

-

165 Union[pd.DataFrame, ks.DataFrame] 

-

166 Transformed dataframe. 

-

167 """ 

-

168 self.check_dataframe(X) 

-

169 for step in self.steps[:self.n_transformations]: 

-

170 X = step.transform(X) 

-

171 return X 

-

172 

-

173 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

174 """Transform the NumPy array `X`. 

-

175 

-

176 Parameters 

-

177 ---------- 

-

178 X : np.ndarray 

-

179 Input array. 

-

180 

-

181 Returns 

-

182 ------- 

-

183 np.ndarray 

-

184 Transformed array. 

-

185 """ 

-

186 self.check_array(X) 

-

187 for step in self.steps[:self.n_transformations]: 

-

188 X = step.transform_numpy(X) 

-

189 return X 

-

190 

-

191 def fit_transform(self, 

-

192 X: Union[pd.DataFrame, ks.DataFrame], 

-

193 y: Union[pd.Series, ks.Series] = None 

-

194 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

195 """Fit and transform the pandas dataframe. 

-

196 

-

197 Parameters 

-

198 ---------- 

-

199 X : Union[pd.DataFrame, ks.DataFrame] 

-

200 Input dataframe. 

-

201 

-

202 Returns 

-

203 ------- 

-

204 Union[pd.DataFrame, ks.DataFrame] 

-

205 Transformed pandas dataframe. 

-

206 """ 

-

207 self.base_columns = list(X.columns).copy() 

-

208 # import time 

-

209 for step in self.steps[:self.n_transformations]: 

-

210 step = step.fit(X, y) 

-

211 X = step.transform(X) 

-

212 return X 

-

213 

-

214 def predict(self, 

-

215 X: Union[pd.DataFrame, ks.DataFrame], 

-

216 y: Union[pd.Series, ks.Series] = None) -> np.ndarray: 

-

217 """Predict on X, and predict. 

-

218 

-

219 Parameters 

-

220 ---------- 

-

221 X : Union[pd.DataFrame, ks.DataFrame]. 

-

222 Input dataframe. 

-

223 

-

224 Returns 

-

225 ------- 

-

226 np.ndarray 

-

227 Model predictions. 

-

228 """ 

-

229 for step in self.steps[:-1]: 

-

230 X = step.transform(X) 

-

231 return self.steps[-1].predict(X) 

-

232 

-

233 def predict_proba(self, 

-

234 X: Union[pd.DataFrame, ks.DataFrame], 

-

235 y: np.array = None) -> np.ndarray: 

-

236 """Predict on X, and return the probability of success. 

-

237 

-

238 Parameters 

-

239 ---------- 

-

240 X : Union[pd.DataFrame, ks.DataFrame]. 

-

241 Input dataframe. 

-

242 

-

243 Returns 

-

244 ------- 

-

245 np.ndarray 

-

246 Model probabilities of success. 

-

247 """ 

-

248 for step in self.steps[:-1]: 

-

249 X = step.transform(X) 

-

250 return self.steps[-1].predict_proba(X) 

-

251 

-

252 def predict_numpy(self, 

-

253 X: np.ndarray, 

-

254 y: Union[pd.Series, ks.Series] = None 

-

255 ) -> np.ndarray: 

-

256 """Predict on X, and predict. 

-

257 

-

258 Parameters 

-

259 ---------- 

-

260 X : Union[pd.DataFrame, ks.DataFrame]. 

-

261 Input dataframe. 

-

262 

-

263 Returns 

-

264 ------- 

-

265 np.ndarray 

-

266 Model predictions. 

-

267 """ 

-

268 for step in self.steps[:-1]: 

-

269 X = step.transform_numpy(X) 

-

270 return self.steps[-1].predict(X) 

-

271 

-

272 def predict_proba_numpy(self, 

-

273 X: np.ndarray) -> np.ndarray: 

-

274 """Predict on X, and return the probability of success. 

-

275 

-

276 Parameters 

-

277 ---------- 

-

278 X : np.ndarray 

-

279 Input array. 

-

280 

-

281 Returns 

-

282 ------- 

-

283 np.ndarray 

-

284 Model probabilities of success. 

-

285 """ 

-

286 for step in self.steps[:-1]: 

-

287 X = step.transform_numpy(X) 

-

288 return self.steps[-1].predict_proba(X) 

-

289 

-

290 def get_feature_importances(self, k: int) -> pd.Series: 

-

291 """Get the feature importances of the pipeline. 

-

292 

-

293 Parameters 

-

294 ---------- 

-

295 k int 

-

296 Number of top features to return. 

-

297 

-

298 Returns 

-

299 ------- 

-

300 pd.Series 

-

301 Feature importances. 

-

302 """ 

-

303 if not hasattr(self.steps[-1], 'feature_importances_'): 

-

304 raise AttributeError( 

-

305 '''The last step of the pipeline should have 

-

306 the attribute `feature_importances_`''') 

-

307 feature_importances_ = self.steps[-1].feature_importances_ 

-

308 return feature_importances_.sort_values(ascending=False).iloc[:k] 

-

309 

-

310 def get_features(self) -> List[str]: 

-

311 """Get the feature importances of the pipeline. 

-

312 

-

313 Parameters 

-

314 ---------- 

-

315 k int 

-

316 Number of top features to return. 

-

317 

-

318 Returns 

-

319 ------- 

-

320 List[str] 

-

321 List of features. 

-

322 """ 

-

323 if not hasattr(self.steps[-1], 'selected_columns'): 

-

324 raise AttributeError( 

-

325 '''The last step of the pipeline should have 

-

326 the attribute `selected_columns`''') 

-

327 return self.steps[-1].selected_columns 

-

328 

-

329 def get_production_columns(self): 

-

330 has_feature_importances_ = hasattr( 

-

331 self.steps[-1], 'feature_importances_') 

-

332 if not has_feature_importances_: 

-

333 raise AttributeError( 

-

334 '''The last step of the pipeline should contains 

-

335 the atrribute `feature_importances_`''') 

-

336 features = self.steps[-1].selected_columns 

-

337 

-

338 base_columns_ = features.copy() 

-

339 for step in self.steps[::-1]: 

-

340 if not hasattr(step, 'column_names'): 

-

341 continue 

-

342 for i, col in enumerate(base_columns_): 

-

343 if col in step.column_mapping: 

-

344 base_columns_[i] = step.column_mapping[col] 

-

345 base_columns_ = list(set(util.flatten_list(base_columns_))) 

-

346 base_columns_ = list(set(base_columns_)) 

-

347 prod_columns = [ 

-

348 c for c in self.base_columns 

-

349 if c in base_columns_] 

-

350 return prod_columns 

-
- + diff --git a/cov_html/d_603dd87602f86b7b__base_datetime_feature_py.html b/cov_html/d_603dd87602f86b7b__base_datetime_feature_py.html index 9edbab44..673f3a86 100644 --- a/cov_html/d_603dd87602f86b7b__base_datetime_feature_py.html +++ b/cov_html/d_603dd87602f86b7b__base_datetime_feature_py.html @@ -6,140 +6,191 @@ Coverage for gators/feature_generation_dt/_base_datetime_feature.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseDatetimeFeature(Transformer): 

-

11 """Base datetime transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of column names. 

-

19 column_mapping: Dict[str, List[str]] 

-

20 Mapping between generated features and base features. 

-

21 

-

22 """ 

-

23 

-

24 def __init__(self, columns: List[str], column_names: List[str], 

-

25 column_mapping: Dict[str, str]): 

-

26 Transformer.__init__(self) 

-

27 self.columns = columns 

-

28 self.column_names = column_names 

-

29 self.column_mapping = column_mapping 

-

30 self.idx_columns: np.ndarray = np.array([]) 

-

31 self.n_columns = len(self.columns) 

-

32 

-

33 def fit(self, 

-

34 X: Union[pd.DataFrame, ks.DataFrame], 

-

35 y: Union[pd.Series, ks.Series] = None) -> '_BaseDatetimeFeature': 

-

36 """Fit the transformer on the dataframe `X`. 

-

37 

-

38 Parameters 

-

39 ---------- 

-

40 X : pd.DataFrame 

-

41 Input dataframe. 

-

42 y : Union[pd.Series, ks.Series], default to None. 

-

43 Target values. 

-

44 

-

45 Returns 

-

46 ------- 

-

47 _BaseDatetimeFeature 

-

48 Instance of itself. 

-

49 """ 

-

50 self.check_dataframe(X) 

-

51 X_datetime_dtype = X.iloc[:100][self.columns].dtypes 

-

52 for column in self.columns: 

-

53 if not np.issubdtype(X_datetime_dtype[column], np.datetime64): 

-

54 raise TypeError( 

-

55 """ 

-

56 Datetime columns should be of subtype np.datetime64. 

-

57 Use `ConvertColumnDatatype` to convert the dtype. 

-

58 """) 

-

59 self.idx_columns = util.get_idx_columns( 

-

60 columns=X.columns, 

-

61 selected_columns=self.columns, 

-

62 ) 

-

63 return self 

-

64 

-

65 @staticmethod 

-

66 def get_cyclic_column_names(columns: List[str], pattern: str): 

-

67 """Get the column names. 

-

68 

-

69 Parameters 

-

70 ---------- 

-

71 columns : List[str] 

-

72 List of datetime features. 

-

73 pattern: str 

-

74 Pattern. 

-

75 """ 

-

76 column_names = [] 

-

77 for c in columns: 

-

78 column_names.append(f'{c}__{pattern}_cos') 

-

79 column_names.append(f'{c}__{pattern}_sin') 

-

80 return column_names 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_cyclic_day_of_month_py.html b/cov_html/d_603dd87602f86b7b_cyclic_day_of_month_py.html index 0c8ab7d1..3975aa16 100644 --- a/cov_html/d_603dd87602f86b7b_cyclic_day_of_month_py.html +++ b/cov_html/d_603dd87602f86b7b_cyclic_day_of_month_py.html @@ -6,235 +6,201 @@ Coverage for gators/feature_generation_dt/cyclic_day_of_month.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10TWO_PI = 2 * pi 

-

11 

-

12 

-

13class CyclicDayOfMonth(_BaseDatetimeFeature): 

-

14 """Create new columns based on the cyclic mapping of the day of the month. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 columns: List[str] 

-

19 List of columns. 

-

20 

-

21 Examples 

-

22 --------- 

-

23 

-

24 * fit & transform with `pandas` 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

28 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

29 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B A__day_of_month_cos A__day_of_month_sin 

-

32 0 2020-01-01 23:00:00 0 1.000000 0.000000 

-

33 1 2020-12-15 18:00:00 1 -0.978148 0.207912 

-

34 2 NaT 0 NaN NaN 

-

35 

-

36 * fit & transform with `koalas` 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

40 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

41 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__day_of_month_cos A__day_of_month_sin 

-

44 0 2020-01-01 23:00:00 0 1.000000 0.000000 

-

45 1 2020-12-15 18:00:00 1 -0.978148 0.207912 

-

46 2 NaT 0 NaN NaN 

-

47 

-

48 * fit & transform with `pandas` 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

52 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

53 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

57 [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338057, 

-

58 0.2079116908177593], 

-

59 [NaT, 0, nan, nan]], dtype=object) 

-

60 

-

61 * fit with `koalas` & transform with `NumPy` 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

65 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

66 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

70 [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338057, 

-

71 0.2079116908177593], 

-

72 [NaT, 0, nan, nan]], dtype=object) 

-

73 

-

74 

-

75 """ 

-

76 

-

77 def __init__(self, columns: List[str]): 

-

78 if not isinstance(columns, list): 

-

79 raise TypeError('`columns` should be a list.') 

-

80 if not columns: 

-

81 raise ValueError('`columns` should not be empty.') 

-

82 column_names = self.get_cyclic_column_names(columns, 'day_of_month') 

-

83 column_mapping = { 

-

84 name: col for name, col in zip(column_names, columns + columns)} 

-

85 _BaseDatetimeFeature.__init__( 

-

86 self, columns, column_names, column_mapping) 

-

87 

-

88 def transform( 

-

89 self, X: Union[pd.DataFrame, ks.DataFrame]) -> Union[pd.DataFrame, ks.DataFrame]: 

-

90 """Transform the dataframe `X`. 

-

91 

-

92 Parameters 

-

93 ---------- 

-

94 X : Union[pd.DataFrame, ks.DataFrame] 

-

95 Input dataframe. 

-

96 

-

97 Returns 

-

98 ------- 

-

99 Union[pd.DataFrame, ks.DataFrame] 

-

100 Transformed dataframe. 

-

101 """ 

-

102 self.check_dataframe(X) 

-

103 return self.compute_cyclic_day_of_month( 

-

104 X, self.columns, self.column_names) 

-

105 

-

106 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

107 """Transform the NumPy array `X`. 

-

108 

-

109 Parameters 

-

110 ---------- 

-

111 X : np.ndarray 

-

112 Input array. 

-

113 

-

114 Returns 

-

115 ------- 

-

116 np.ndarray 

-

117 Transformed array. 

-

118 """ 

-

119 

-

120 self.check_array(X) 

-

121 return feature_gen_dt.cyclic_day_of_month( 

-

122 X, self.idx_columns) 

-

123 

-

124 @ staticmethod 

-

125 def compute_cyclic_day_of_month( 

-

126 X: Union[pd.DataFrame, ks.DataFrame], 

-

127 columns: List[str], 

-

128 column_names: List[str] 

-

129 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

130 """Compute the cyclic day of the month features. 

-

131 

-

132 Parameters 

-

133 ---------- 

-

134 X : Union[pd.DataFrame, ks.DataFrame] 

-

135 Dataframe of datetime columns. 

-

136 

-

137 Returns 

-

138 ------- 

-

139 Union[pd.DataFrame, ks.DataFrame] 

-

140 Dataframe of cyclic day of the month features. 

-

141 """ 

-

142 

-

143 def f_cos(x): 

-

144 day_of_month = x.dt.day - 1 

-

145 n_days_in_month = x.dt.daysinmonth - 1 

-

146 prefactors = 2 * np.pi / n_days_in_month 

-

147 return np.cos(prefactors * day_of_month) 

-

148 

-

149 def f_sin(x): 

-

150 day_of_month = x.dt.day - 1 

-

151 n_days_in_month = x.dt.daysinmonth - 1 

-

152 prefactors = 2 * np.pi / n_days_in_month 

-

153 return np.sin(prefactors * day_of_month) 

-

154 

-

155 if isinstance(X, pd.DataFrame): 

-

156 for i, col in enumerate(columns): 

-

157 X_cos = X[[col]].apply(f_cos) 

-

158 X_cos.columns = [column_names[2*i]] 

-

159 X_sin = X[[col]].apply(f_sin) 

-

160 X_sin.columns = [column_names[2*i+1]] 

-

161 X = X.join(X_cos.join(X_sin)) 

-

162 return X 

-

163 

-

164 for i, col in enumerate(columns): 

-

165 n_days_in_month = X[col].dt.daysinmonth - 1 

-

166 prefactors = 2 * np.pi / n_days_in_month 

-

167 X = X.assign( 

-

168 dummy_cos=np.cos(prefactors * (X[col].dt.day - 1.)), 

-

169 dummy_sin=np.sin(prefactors * (X[col].dt.day - 1.)) 

-

170 ).rename( 

-

171 columns={ 

-

172 'dummy_cos': column_names[2*i], 

-

173 'dummy_sin': column_names[2*i+1]} 

-

174 ) 

-

175 return X 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_cyclic_day_of_week_py.html b/cov_html/d_603dd87602f86b7b_cyclic_day_of_week_py.html index 0b04e3ed..29748532 100644 --- a/cov_html/d_603dd87602f86b7b_cyclic_day_of_week_py.html +++ b/cov_html/d_603dd87602f86b7b_cyclic_day_of_week_py.html @@ -6,222 +6,201 @@ Coverage for gators/feature_generation_dt/cyclic_day_of_week.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4import numpy as np 

-

5from typing import List, Union 

-

6from math import pi 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 6. 

-

12 

-

13 

-

14class CyclicDayOfWeek(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the day of the week. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with `pandas` 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

29 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

30 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

31 >>> obj.fit_transform(X) 

-

32 A B A__day_of_week_cos A__day_of_week_sin 

-

33 0 2020-01-01 23:00:00 0 -0.5 0.866025 

-

34 1 2020-12-15 18:00:00 1 0.5 0.866025 

-

35 2 NaT 0 NaN NaN 

-

36 

-

37 * fit & transform with `koalas` 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

41 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

42 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

43 >>> obj.fit_transform(X) 

-

44 A B A__day_of_week_cos A__day_of_week_sin 

-

45 0 2020-01-01 23:00:00 0 -0.5 0.866025 

-

46 1 2020-12-15 18:00:00 1 0.5 0.866025 

-

47 2 NaT 0 NaN NaN 

-

48 

-

49 * fit & transform with `pandas` 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

53 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

54 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

55 >>> _ = obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, 

-

58 0.8660254037844388], 

-

59 [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, 

-

60 0.8660254037844386], 

-

61 [NaT, 0, nan, nan]], dtype=object) 

-

62 

-

63 * fit with `koalas` & transform with `NumPy` 

-

64 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

67 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

68 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, 

-

72 0.8660254037844388], 

-

73 [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, 

-

74 0.8660254037844386], 

-

75 [NaT, 0, nan, nan]], dtype=object) 

-

76 """ 

-

77 

-

78 def __init__(self, columns: List[str]): 

-

79 if not isinstance(columns, list): 

-

80 raise TypeError('`columns` should be a list.') 

-

81 if not columns: 

-

82 raise ValueError('`columns` should not be empty.') 

-

83 column_names = self.get_cyclic_column_names(columns, 'day_of_week') 

-

84 column_mapping = { 

-

85 name: col for name, col in zip(column_names, columns + columns)} 

-

86 _BaseDatetimeFeature.__init__( 

-

87 self, columns, column_names, column_mapping) 

-

88 

-

89 def transform( 

-

90 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

91 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

92 """Transform the dataframe `X`. 

-

93 

-

94 Parameters 

-

95 ---------- 

-

96 X : Union[pd.DataFrame, ks.DataFrame]. 

-

97 Input dataframe. 

-

98 

-

99 Returns 

-

100 ------- 

-

101 Union[pd.DataFrame, ks.DataFrame] 

-

102 Transformed dataframe. 

-

103 """ 

-

104 self.check_dataframe(X) 

-

105 return self.compute_cyclic_day_of_week( 

-

106 X, self.columns, self.column_names) 

-

107 

-

108 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

109 """Transform the NumPy array `X`. 

-

110 

-

111 Parameters 

-

112 ---------- 

-

113 X : np.ndarray 

-

114 Input array. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 np.ndarray 

-

119 Transformed array. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.cyclic_day_of_week( 

-

123 X, self.idx_columns, PREFACTOR) 

-

124 

-

125 @ staticmethod 

-

126 def compute_cyclic_day_of_week( 

-

127 X: Union[pd.DataFrame, ks.DataFrame], 

-

128 columns: List[str], 

-

129 column_names: List[str]) -> Union[pd.DataFrame, ks.DataFrame]: 

-

130 """Compute the cyclic day of the week features. 

-

131 

-

132 Parameters 

-

133 ---------- 

-

134 X : Union[pd.DataFrame, ks.DataFrame] 

-

135 Dataframe of datetime columns. 

-

136 columns: str 

-

137 List of datetime columns. 

-

138 column_names: str 

-

139 List of datetime column names. 

-

140 

-

141 Returns 

-

142 ------- 

-

143 Union[pd.DataFrame, ks.DataFrame] 

-

144 Dataframe of cyclic day of the week features. 

-

145 """ 

-

146 if isinstance(X, pd.DataFrame): 

-

147 dummy = X[columns].apply( 

-

148 lambda x: PREFACTOR * x.dt.dayofweek) 

-

149 X_cyclic = dummy.agg(['cos', 'sin']) 

-

150 X_cyclic.columns = column_names 

-

151 return X.join(X_cyclic) 

-

152 

-

153 for i, col in enumerate(columns): 

-

154 X = X.assign( 

-

155 dummy_cos=np.cos(PREFACTOR * X[col].dt.dayofweek), 

-

156 dummy_sin=np.sin(PREFACTOR * X[col].dt.dayofweek) 

-

157 ).rename( 

-

158 columns={ 

-

159 'dummy_cos': column_names[2*i], 

-

160 'dummy_sin': column_names[2*i+1]} 

-

161 ) 

-

162 return X 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_cyclic_hour_of_day_py.html b/cov_html/d_603dd87602f86b7b_cyclic_hour_of_day_py.html index 2e2af111..bb7486bb 100644 --- a/cov_html/d_603dd87602f86b7b_cyclic_hour_of_day_py.html +++ b/cov_html/d_603dd87602f86b7b_cyclic_hour_of_day_py.html @@ -6,221 +6,199 @@ Coverage for gators/feature_generation_dt/cyclic_hour_of_day.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 23. 

-

12 

-

13 

-

14class CyclicHourOfDay(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the hour of the day. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with `pandas` 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

29 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

30 >>> obj = CyclicHourOfDay(columns=['A']) 

-

31 >>> obj.fit_transform(X) 

-

32 A B A__hour_of_day_cos A__hour_of_day_sin 

-

33 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 

-

34 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 

-

35 2 NaT 0 NaN NaN 

-

36 

-

37 * fit & transform with `koalas` 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

41 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

42 >>> obj = CyclicHourOfDay(columns=['A']) 

-

43 >>> obj.fit_transform(X) 

-

44 A B A__hour_of_day_cos A__hour_of_day_sin 

-

45 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 

-

46 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 

-

47 2 NaT 0 NaN NaN 

-

48 

-

49 * fit with `pandas` & transform with `NumPy` 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

53 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

54 >>> obj = CyclicHourOfDay(columns=['A']) 

-

55 >>> _ = obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 

-

58 -2.4492935982947064e-16], 

-

59 [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, 

-

60 -0.979084087682323], 

-

61 [NaT, 0, nan, nan]], dtype=object) 

-

62 

-

63 * fit with `koalas` & transform with `NumPy` 

-

64 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

67 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

68 >>> obj = CyclicHourOfDay(columns=['A']) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 

-

72 -2.4492935982947064e-16], 

-

73 [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, 

-

74 -0.979084087682323], 

-

75 [NaT, 0, nan, nan]], dtype=object) 

-

76 

-

77 

-

78 """ 

-

79 

-

80 def __init__(self, columns: List[str]): 

-

81 if not isinstance(columns, list): 

-

82 raise TypeError('`columns` should be a list.') 

-

83 if not columns: 

-

84 raise ValueError('`columns` should not be empty.') 

-

85 column_names = self.get_cyclic_column_names(columns, 'hour_of_day') 

-

86 column_mapping = { 

-

87 name: col for name, col in zip(column_names, columns + columns)} 

-

88 _BaseDatetimeFeature.__init__( 

-

89 self, columns, column_names, column_mapping) 

-

90 

-

91 def transform( 

-

92 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

93 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

94 """Transform the dataframe `X`. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame]. 

-

99 Input dataframe. 

-

100 

-

101 Returns 

-

102 ------- 

-

103 Union[pd.DataFrame, ks.DataFrame] 

-

104 Transformed dataframe. 

-

105 """ 

-

106 self.check_dataframe(X) 

-

107 return self.compute_cyclic_hour_of_day( 

-

108 X, self.columns, self.column_names) 

-

109 

-

110 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

111 """Transform the NumPy array `X`. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : np.ndarray 

-

116 Input array. 

-

117 

-

118 Returns 

-

119 ------- 

-

120 np.ndarray 

-

121 Transformed array. 

-

122 """ 

-

123 self.check_array(X) 

-

124 return feature_gen_dt.cyclic_hour_of_day( 

-

125 X, self.idx_columns, PREFACTOR) 

-

126 

-

127 @ staticmethod 

-

128 def compute_cyclic_hour_of_day( 

-

129 X: Union[pd.DataFrame, ks.DataFrame], 

-

130 columns: List[str], 

-

131 column_names: List[str], 

-

132 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

133 """Compute the cyclic hours of the day features. 

-

134 

-

135 Parameters 

-

136 ---------- 

-

137 X_datetime : Union[pd.DataFrame, ks.DataFrame] 

-

138 Dataframe of datetime columns. 

-

139 

-

140 Returns 

-

141 ------- 

-

142 Union[pd.DataFrame, ks.DataFrame] 

-

143 Dataframe of cyclic hours of the day features. 

-

144 """ 

-

145 if isinstance(X, pd.DataFrame): 

-

146 X_cyclic = X[columns].apply( 

-

147 lambda x: PREFACTOR * x.dt.hour 

-

148 ).agg(['cos', 'sin']) 

-

149 X_cyclic.columns = column_names 

-

150 return X.join(X_cyclic) 

-

151 

-

152 for i, col in enumerate(columns): 

-

153 X = X.assign( 

-

154 dummy_cos=np.cos(PREFACTOR * X[col].dt.hour), 

-

155 dummy_sin=np.sin(PREFACTOR * X[col].dt.hour) 

-

156 ).rename( 

-

157 columns={ 

-

158 'dummy_cos': column_names[2*i], 

-

159 'dummy_sin': column_names[2*i+1]} 

-

160 ) 

-

161 return X 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_cyclic_minute_of_hour_py.html b/cov_html/d_603dd87602f86b7b_cyclic_minute_of_hour_py.html index c3eaa5d6..33db553d 100644 --- a/cov_html/d_603dd87602f86b7b_cyclic_minute_of_hour_py.html +++ b/cov_html/d_603dd87602f86b7b_cyclic_minute_of_hour_py.html @@ -6,222 +6,199 @@ Coverage for gators/feature_generation_dt/cyclic_minute_of_hour.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 59. 

-

12 

-

13 

-

14class CyclicMinuteOfHour(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the minute of the hour. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with `pandas` 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

29 >>> X = pd.DataFrame( 

-

30 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

31 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

32 >>> obj.fit_transform(X) 

-

33 A B A__minute_of_hour_cos A__minute_of_hour_sin 

-

34 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

35 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 

-

36 2 NaT 0 NaN NaN 

-

37 

-

38 * fit & transform with `koalas` 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

42 >>> X = ks.DataFrame( 

-

43 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

44 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

45 >>> obj.fit_transform(X) 

-

46 A B A__minute_of_hour_cos A__minute_of_hour_sin 

-

47 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

48 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 

-

49 2 NaT 0 NaN NaN 

-

50 

-

51 * fit with `pandas` & transform with `NumPy` 

-

52 

-

53 >>> import pandas as pd 

-

54 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

55 >>> X = pd.DataFrame( 

-

56 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

57 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

58 >>> _ = obj.fit(X) 

-

59 >>> obj.transform_numpy(X.to_numpy()) 

-

60 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

61 [Timestamp('2020-12-15 18:59:00'), 1, 1.0, 

-

62 -2.4492935982947064e-16], 

-

63 [NaT, 0, nan, nan]], dtype=object) 

-

64 

-

65 * fit with `koalas` & transform with `NumPy` 

-

66 

-

67 >>> import databricks.koalas as ks 

-

68 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

69 >>> X = ks.DataFrame( 

-

70 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

71 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

72 >>> _ = obj.fit(X) 

-

73 >>> obj.transform_numpy(X.to_numpy()) 

-

74 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

75 [Timestamp('2020-12-15 18:59:00'), 1, 1.0, 

-

76 -2.4492935982947064e-16], 

-

77 [NaT, 0, nan, nan]], dtype=object) 

-

78 

-

79 """ 

-

80 

-

81 def __init__(self, columns: List[str]): 

-

82 if not isinstance(columns, list): 

-

83 raise TypeError('`columns` should be a list.') 

-

84 if not columns: 

-

85 raise ValueError('`columns` should not be empty.') 

-

86 column_names = self.get_cyclic_column_names(columns, 'minute_of_hour') 

-

87 column_mapping = { 

-

88 name: col for name, col in zip(column_names, columns + columns)} 

-

89 _BaseDatetimeFeature.__init__( 

-

90 self, columns, column_names, column_mapping) 

-

91 

-

92 def transform( 

-

93 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

94 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

95 """Transform the dataframe `X`. 

-

96 

-

97 Parameters 

-

98 ---------- 

-

99 X : Union[pd.DataFrame, ks.DataFrame]. 

-

100 Input dataframe. 

-

101 

-

102 Returns 

-

103 ------- 

-

104 Union[pd.DataFrame, ks.DataFrame] 

-

105 Transformed dataframe. 

-

106 """ 

-

107 self.check_dataframe(X) 

-

108 return self.compute_cyclic_minute_of_hour( 

-

109 X, self.columns, self.column_names) 

-

110 

-

111 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

112 """Transform the NumPy array `X`. 

-

113 

-

114 Parameters 

-

115 ---------- 

-

116 X : np.ndarray 

-

117 Input array. 

-

118 

-

119 Returns 

-

120 ------- 

-

121 np.ndarray 

-

122 Transformed array. 

-

123 """ 

-

124 self.check_array(X) 

-

125 return feature_gen_dt.cyclic_minute_of_hour( 

-

126 X, self.idx_columns, PREFACTOR) 

-

127 

-

128 @ staticmethod 

-

129 def compute_cyclic_minute_of_hour( 

-

130 X: Union[pd.DataFrame, ks.DataFrame], 

-

131 columns: List[str], 

-

132 column_names: List[str], 

-

133 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

134 """Compute the cyclic hours of the day features. 

-

135 

-

136 Parameters 

-

137 ---------- 

-

138 X_datetime : Union[pd.DataFrame, ks.DataFrame] 

-

139 Dataframe of datetime columns. 

-

140 

-

141 Returns 

-

142 ------- 

-

143 Union[pd.DataFrame, ks.DataFrame] 

-

144 Dataframe of cyclic hours of the day features. 

-

145 """ 

-

146 if isinstance(X, pd.DataFrame): 

-

147 X_cyclic = X[columns].apply( 

-

148 lambda x: PREFACTOR * x.dt.minute 

-

149 ).agg(['cos', 'sin']) 

-

150 X_cyclic.columns = column_names 

-

151 return X.join(X_cyclic) 

-

152 

-

153 for i, col in enumerate(columns): 

-

154 X = X.assign( 

-

155 dummy_cos=np.cos(PREFACTOR * X[col].dt.minute), 

-

156 dummy_sin=np.sin(PREFACTOR * X[col].dt.minute) 

-

157 ).rename( 

-

158 columns={ 

-

159 'dummy_cos': column_names[2*i], 

-

160 'dummy_sin': column_names[2*i+1]} 

-

161 ) 

-

162 return X 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_cyclic_month_of_year_py.html b/cov_html/d_603dd87602f86b7b_cyclic_month_of_year_py.html index 2eb9f101..eedd6b7f 100644 --- a/cov_html/d_603dd87602f86b7b_cyclic_month_of_year_py.html +++ b/cov_html/d_603dd87602f86b7b_cyclic_month_of_year_py.html @@ -6,221 +6,196 @@ Coverage for gators/feature_generation_dt/cyclic_month_of_year.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ._base_datetime_feature import _BaseDatetimeFeature 

-

3import feature_gen_dt 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 11. 

-

12 

-

13 

-

14class CyclicMonthOfYear(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the month of the year. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 * fit & transform with `pandas` 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

28 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

29 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B A__month_of_year_cos A__month_of_year_sin 

-

32 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

33 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 

-

34 2 NaT 0 NaN NaN 

-

35 

-

36 * fit & transform with `koalas` 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

40 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

41 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__month_of_year_cos A__month_of_year_sin 

-

44 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

45 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 

-

46 2 NaT 0 NaN NaN 

-

47 

-

48 * fit with `pandas` & transform with `NumPy` 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

52 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

53 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

57 [Timestamp('2020-12-15 18:00:00'), 1, 1.0, 

-

58 -2.4492935982947064e-16], 

-

59 [NaT, 0, nan, nan]], dtype=object) 

-

60 

-

61 * fit with `koalas` & transform with `NumPy` 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

65 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

66 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

70 [Timestamp('2020-12-15 18:00:00'), 1, 1.0, 

-

71 -2.4492935982947064e-16], 

-

72 [NaT, 0, nan, nan]], dtype=object) 

-

73 

-

74 

-

75 """ 

-

76 

-

77 def __init__(self, columns: List[str]): 

-

78 if not isinstance(columns, list): 

-

79 raise TypeError('`columns` should be a list.') 

-

80 if not columns: 

-

81 raise ValueError('`columns` should not be empty.') 

-

82 column_names = self.get_cyclic_column_names(columns, 'month_of_year') 

-

83 column_mapping = { 

-

84 name: col for name, col in zip(column_names, columns + columns)} 

-

85 _BaseDatetimeFeature.__init__( 

-

86 self, columns, column_names, column_mapping) 

-

87 

-

88 def transform( 

-

89 self, 

-

90 X: Union[pd.DataFrame, ks.DataFrame] 

-

91 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

92 """Transform the dataframe `X`. 

-

93 

-

94 Parameters 

-

95 ---------- 

-

96 X : Union[pd.DataFrame, ks.DataFrame]. 

-

97 Input dataframe. 

-

98 

-

99 Returns 

-

100 ------- 

-

101 Union[pd.DataFrame, ks.DataFrame] 

-

102 Transformed dataframe. 

-

103 """ 

-

104 self.check_dataframe(X) 

-

105 return self.compute_cyclic_month_of_year( 

-

106 X, self.columns, self.column_names) 

-

107 

-

108 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

109 """Transform the NumPy array `X`. 

-

110 

-

111 Parameters 

-

112 ---------- 

-

113 X : np.ndarray 

-

114 Input array. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 np.ndarray 

-

119 Transformed array. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.cyclic_month_of_year( 

-

123 X, self.idx_columns, PREFACTOR) 

-

124 

-

125 @ staticmethod 

-

126 def compute_cyclic_month_of_year( 

-

127 X: Union[pd.DataFrame, ks.DataFrame], 

-

128 columns: List[str], 

-

129 column_names: List[str] 

-

130 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

131 """Compute the cyclic hours of the day features. 

-

132 

-

133 Parameters 

-

134 ---------- 

-

135 X : Union[pd.DataFrame, ks.DataFrame] 

-

136 Dataframe of datetime columns. 

-

137 

-

138 column_names : List[str], default to None. 

-

139 List of column names. 

-

140 

-

141 Returns 

-

142 ------- 

-

143 Union[pd.DataFrame, ks.DataFrame] 

-

144 Dataframe of cyclic hours of the day features. 

-

145 """ 

-

146 if isinstance(X, pd.DataFrame): 

-

147 dummy = X[columns].apply(lambda x: PREFACTOR * (x.dt.month - 1.)) 

-

148 X_cyclic = dummy.agg(['cos', 'sin']) 

-

149 X_cyclic.columns = column_names 

-

150 return X.join(X_cyclic) 

-

151 

-

152 for i, col in enumerate(columns): 

-

153 X = X.assign( 

-

154 dummy_cos=np.cos(PREFACTOR * (X[col].dt.month - 1.)), 

-

155 dummy_sin=np.sin(PREFACTOR * (X[col].dt.month - 1.)) 

-

156 ).rename( 

-

157 columns={ 

-

158 'dummy_cos': column_names[2*i], 

-

159 'dummy_sin': column_names[2*i+1]} 

-

160 ) 

-

161 return X 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_delta_time_py.html b/cov_html/d_603dd87602f86b7b_delta_time_py.html index 0dea995a..960dc07d 100644 --- a/cov_html/d_603dd87602f86b7b_delta_time_py.html +++ b/cov_html/d_603dd87602f86b7b_delta_time_py.html @@ -6,253 +6,248 @@ Coverage for gators/feature_generation_dt/delta_time.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ..util import util 

-

4from ..transformers import Transformer 

-

5from typing import List, Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class DeltaTime(Transformer): 

-

12 """Create new columns based on the time difference in sec. between two columns. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import DeltaTime 

-

25 >>> X = pd.DataFrame({ 

-

26 ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

27 ... 'B': [0, 1, 0], 

-

28 ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) 

-

29 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B C C__A__Deltatime[s] 

-

32 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 

-

33 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 

-

34 2 NaT 0 NaT NaN 

-

35 

-

36 * fit & transform with `koalas` 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation_dt import DeltaTime 

-

40 >>> X = ks.DataFrame({ 

-

41 ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

42 ... 'B': [0, 1, 0], 

-

43 ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) 

-

44 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

45 >>> obj.fit_transform(X) 

-

46 A B C C__A__Deltatime[s] 

-

47 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 

-

48 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 

-

49 2 NaT 0 NaT NaN 

-

50 

-

51 * fit with `pandas` & transform with `NumPy` 

-

52 

-

53 >>> import pandas as pd 

-

54 >>> from gators.feature_generation_dt import DeltaTime 

-

55 >>> X = pd.DataFrame({ 

-

56 ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

57 ... 'B': [0, 1, 0], 

-

58 ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) 

-

59 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

60 >>> _ = obj.fit(X) 

-

61 >>> obj.transform_numpy(X.to_numpy()) 

-

62 array([[Timestamp('2020-01-01 23:00:00'), 0, 

-

63 Timestamp('2020-01-02 05:00:00'), 21600.0], 

-

64 [Timestamp('2020-01-15 18:00:00'), 1, 

-

65 Timestamp('2020-01-15 23:00:00'), 18000.0], 

-

66 [NaT, 0, NaT, nan]], dtype=object) 

-

67 

-

68 * fit with `koalas` & transform with `NumPy` 

-

69 

-

70 >>> import databricks.koalas as ks 

-

71 >>> from gators.feature_generation_dt import DeltaTime 

-

72 >>> X = ks.DataFrame({ 

-

73 ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

74 ... 'B': [0, 1, 0], 

-

75 ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) 

-

76 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

77 >>> _ = obj.fit(X) 

-

78 >>> obj.transform_numpy(X.to_numpy()) 

-

79 array([[Timestamp('2020-01-01 23:00:00'), 0, 

-

80 Timestamp('2020-01-02 05:00:00'), 21600.0], 

-

81 [Timestamp('2020-01-15 18:00:00'), 1, 

-

82 Timestamp('2020-01-15 23:00:00'), 18000.0], 

-

83 [NaT, 0, NaT, nan]], dtype=object) 

-

84 

-

85 

-

86 

-

87 """ 

-

88 

-

89 def __init__(self, columns_a: List[str], columns_b: List[str]): 

-

90 Transformer.__init__(self) 

-

91 if not isinstance(columns_a, list): 

-

92 raise TypeError('`columns_a` should be a list.') 

-

93 if not columns_a: 

-

94 raise ValueError('`columns_a` should not be empty.') 

-

95 if not isinstance(columns_b, list): 

-

96 raise TypeError('`columns_b` should be a list.') 

-

97 if not columns_b: 

-

98 raise ValueError('`columns_b` should not be empty.') 

-

99 if len(columns_b) != len(columns_a): 

-

100 raise ValueError( 

-

101 '`columns_a` and `columns_b` should have the same length.') 

-

102 self.unit = 's' 

-

103 self.columns_a = columns_a 

-

104 self.columns_b = columns_b 

-

105 self.deltatime_dtype = f'timedelta64[{self.unit}]' 

-

106 self.column_names = [ 

-

107 f'{c_a}__{c_b}__Deltatime[{self.unit}]' 

-

108 for c_a, c_b in zip(columns_a, columns_b) 

-

109 ] 

-

110 self.column_mapping = { 

-

111 name: [c_a, c_b] for name, c_a, c_b 

-

112 in zip(self.column_names, columns_a, columns_b) 

-

113 } 

-

114 

-

115 def fit(self, 

-

116 X: Union[pd.DataFrame, ks.DataFrame], 

-

117 y: Union[pd.Series, ks.Series] = None) -> 'DeltaTime': 

-

118 """Fit the transformer on the dataframe `X`. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 X : pd.DataFrame 

-

123 Input dataframe. 

-

124 y : Union[pd.Series, ks.Series], default to None. 

-

125 Target values. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 DeltaTime 

-

130 Instance of itself. 

-

131 """ 

-

132 self.check_dataframe(X) 

-

133 columns = list(set(self.columns_a+self.columns_b)) 

-

134 X_datetime_dtype = X.iloc[:5000][columns].dtypes 

-

135 for column in columns: 

-

136 if not np.issubdtype(X_datetime_dtype[column], np.datetime64): 

-

137 raise TypeError( 

-

138 """ 

-

139 Datetime columns should be of subtype np.datetime64. 

-

140 Use `ConvertColumnDatatype` to convert the dtype. 

-

141 """) 

-

142 self.idx_columns_a = util.get_idx_columns( 

-

143 columns=X.columns, 

-

144 selected_columns=self.columns_a, 

-

145 ) 

-

146 self.idx_columns_b = util.get_idx_columns( 

-

147 columns=X.columns, 

-

148 selected_columns=self.columns_b, 

-

149 ) 

-

150 return self 

-

151 

-

152 def transform( 

-

153 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

154 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

155 """Transform the dataframe `X`. 

-

156 

-

157 Parameters 

-

158 ---------- 

-

159 X : Union[pd.DataFrame, ks.DataFrame]. 

-

160 Input dataframe. 

-

161 

-

162 Returns 

-

163 ------- 

-

164 Union[pd.DataFrame, ks.DataFrame] 

-

165 Transformed dataframe. 

-

166 """ 

-

167 self.check_dataframe(X) 

-

168 if isinstance(X, pd.DataFrame): 

-

169 for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): 

-

170 X.loc[:, name] = (X[c_a] - X[c_b]).astype(self.deltatime_dtype) 

-

171 return X 

-

172 for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): 

-

173 X = X.assign( 

-

174 dummy=(X[c_a].astype(float) - X[c_b].astype(float))).rename( 

-

175 columns={'dummy': name}) 

-

176 return X 

-

177 

-

178 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

179 """Transform the array X. 

-

180 

-

181 Parameters 

-

182 ---------- 

-

183 X : np.ndarray 

-

184 Input array. 

-

185 

-

186 Returns 

-

187 ------- 

-

188 np.ndarray: 

-

189 Array with the datetime features added. 

-

190 """ 

-

191 self.check_array(X) 

-

192 return feature_gen_dt.deltatime( 

-

193 X, self.idx_columns_a, self.idx_columns_b) 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_ordinal_day_of_month_py.html b/cov_html/d_603dd87602f86b7b_ordinal_day_of_month_py.html index 245c1cbb..99bf2c71 100644 --- a/cov_html/d_603dd87602f86b7b_ordinal_day_of_month_py.html +++ b/cov_html/d_603dd87602f86b7b_ordinal_day_of_month_py.html @@ -6,183 +6,177 @@ Coverage for gators/feature_generation_dt/ordinal_day_of_month.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalDayOfMonth(_BaseDatetimeFeature): 

-

11 """Create new columns based on the day of the month. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 * fit & transform with `pandas` 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

24 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

25 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

26 >>> obj.fit_transform(X) 

-

27 A B A__day_of_month 

-

28 0 2020-01-01 23:00:00 0 1.0 

-

29 1 2020-12-15 18:00:00 1 15.0 

-

30 2 NaT 0 nan 

-

31 

-

32 * fit & transform with `koalas` 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

36 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

37 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

38 >>> obj.fit_transform(X) 

-

39 A B A__day_of_month 

-

40 0 2020-01-01 23:00:00 0 1.0 

-

41 1 2020-12-15 18:00:00 1 15.0 

-

42 2 NaT 0 nan 

-

43 

-

44 * fit with `pandas` & transform with `NumPy` 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

48 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

49 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

50 >>> _ = obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

53 [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], 

-

54 [NaT, 0, 'nan']], dtype=object) 

-

55 

-

56 * fit with `koalas` & transform with `NumPy` 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

60 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

61 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

62 >>> _ = obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

65 [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], 

-

66 [NaT, 0, 'nan']], dtype=object) 

-

67 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, columns: List[str]): 

-

72 if not isinstance(columns, list): 

-

73 raise TypeError('`columns` should be a list.') 

-

74 if not columns: 

-

75 raise ValueError('`columns` should not be empty.') 

-

76 column_names = [f'{c}__day_of_month' for c in columns] 

-

77 column_mapping = dict(zip(column_names, columns)) 

-

78 _BaseDatetimeFeature.__init__( 

-

79 self, columns, column_names, column_mapping) 

-

80 

-

81 def transform( 

-

82 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

83 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

84 """Transform the dataframe `X`. 

-

85 

-

86 Parameters 

-

87 ---------- 

-

88 X : Union[pd.DataFrame, ks.DataFrame]. 

-

89 Input dataframe. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 Union[pd.DataFrame, ks.DataFrame] 

-

94 Transformed dataframe. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 if isinstance(X, pd.DataFrame): 

-

98 X_ordinal = X[self.columns].apply( 

-

99 lambda x: x.dt.day.astype(np.float64).astype(str)) 

-

100 X_ordinal.columns = self.column_names 

-

101 return X.join(X_ordinal) 

-

102 

-

103 for col, name in zip(self.columns, self.column_names): 

-

104 X = X.assign( 

-

105 dummy=X[col].dt.day.astype(np.float64).astype(str) 

-

106 ).rename(columns={'dummy': name}) 

-

107 return X 

-

108 

-

109 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

110 """Transform the array X. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : np.ndarray 

-

115 Input array. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 np.ndarray: Dataset with the Tree features. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.ordinal_day_of_month( 

-

123 X, self.idx_columns) 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_ordinal_day_of_week_py.html b/cov_html/d_603dd87602f86b7b_ordinal_day_of_week_py.html index fb065b78..02441b8a 100644 --- a/cov_html/d_603dd87602f86b7b_ordinal_day_of_week_py.html +++ b/cov_html/d_603dd87602f86b7b_ordinal_day_of_week_py.html @@ -6,185 +6,176 @@ Coverage for gators/feature_generation_dt/ordinal_day_of_week.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalDayOfWeek(_BaseDatetimeFeature): 

-

11 """Create new columns based on the day of the week. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

25 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

26 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__day_of_week 

-

29 0 2020-01-01 23:00:00 0 2.0 

-

30 1 2020-12-15 18:00:00 1 1.0 

-

31 2 NaT 0 nan 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

37 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

38 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__day_of_week 

-

41 0 2020-01-01 23:00:00 0 2.0 

-

42 1 2020-12-15 18:00:00 1 1.0 

-

43 2 NaT 0 nan 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

49 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

50 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], 

-

54 [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], 

-

55 [NaT, 0, 'nan']], dtype=object) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

61 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

62 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], 

-

66 [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], 

-

67 [NaT, 0, 'nan']], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 column_names = [f'{c}__day_of_week' for c in columns] 

-

78 column_mapping = dict(zip(column_names, columns)) 

-

79 _BaseDatetimeFeature.__init__( 

-

80 self, columns, column_names, column_mapping) 

-

81 

-

82 def transform( 

-

83 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

84 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

85 """Transform the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Union[pd.DataFrame, ks.DataFrame] 

-

95 Transformed dataframe. 

-

96 """ 

-

97 self.check_dataframe(X) 

-

98 if isinstance(X, pd.DataFrame): 

-

99 X_ordinal = X[self.columns].apply( 

-

100 lambda x: x.dt.dayofweek.astype(np.float64).astype(str)) 

-

101 X_ordinal.columns = self.column_names 

-

102 return X.join(X_ordinal) 

-

103 

-

104 for col, name in zip(self.columns, self.column_names): 

-

105 X = X.assign( 

-

106 dummy=X[col].dt.dayofweek.astype(np.float64).astype(str) 

-

107 ).rename(columns={'dummy': name}) 

-

108 return X 

-

109 

-

110 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

111 """Transform the array X. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : np.ndarray 

-

116 Input array. 

-

117 

-

118 Returns 

-

119 ------- 

-

120 np.ndarray: 

-

121 Transformed array. 

-

122 """ 

-

123 self.check_array(X) 

-

124 return feature_gen_dt.ordinal_day_of_week( 

-

125 X, self.idx_columns) 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_ordinal_hour_of_day_py.html b/cov_html/d_603dd87602f86b7b_ordinal_hour_of_day_py.html index 7eb1100f..0544ee3f 100644 --- a/cov_html/d_603dd87602f86b7b_ordinal_hour_of_day_py.html +++ b/cov_html/d_603dd87602f86b7b_ordinal_hour_of_day_py.html @@ -6,184 +6,175 @@ Coverage for gators/feature_generation_dt/ordinal_hour_of_day.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalHourOfDay(_BaseDatetimeFeature): 

-

11 """Create new columns based on the hour of the day. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

25 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

26 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__hour_of_day 

-

29 0 2020-01-01 23:00:00 0 23.0 

-

30 1 2020-12-15 18:00:00 1 18.0 

-

31 2 NaT 0 nan 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

37 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

38 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__hour_of_day 

-

41 0 2020-01-01 23:00:00 0 23.0 

-

42 1 2020-12-15 18:00:00 1 18.0 

-

43 2 NaT 0 nan 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

49 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

50 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], 

-

54 [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], 

-

55 [NaT, 0, 'nan']], dtype=object) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

61 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

62 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], 

-

66 [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], 

-

67 [NaT, 0, 'nan']], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 column_names = [f'{c}__hour_of_day' for c in columns] 

-

78 column_mapping = dict(zip(column_names, columns)) 

-

79 _BaseDatetimeFeature.__init__( 

-

80 self, columns, column_names, column_mapping) 

-

81 

-

82 def transform( 

-

83 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

84 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

85 """Transform the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Union[pd.DataFrame, ks.DataFrame] 

-

95 Transformed dataframe. 

-

96 """ 

-

97 if isinstance(X, pd.DataFrame): 

-

98 X_ordinal = X[self.columns].apply( 

-

99 lambda x: x.dt.hour.astype(np.float64).astype(str)) 

-

100 X_ordinal.columns = self.column_names 

-

101 return X.join(X_ordinal) 

-

102 

-

103 for col, name in zip(self.columns, self.column_names): 

-

104 X = X.assign( 

-

105 dummy=X[col].dt.hour.astype(np.float64).astype(str) 

-

106 ).rename(columns={'dummy': name}) 

-

107 return X 

-

108 

-

109 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

110 """Transform the array X. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : np.ndarray 

-

115 Input array. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 np.ndarray: 

-

120 Array with the datetime features added. 

-

121 """ 

-

122 self.check_array(X) 

-

123 return feature_gen_dt.ordinal_hour_of_day( 

-

124 X, self.idx_columns) 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_ordinal_minute_of_hour_py.html b/cov_html/d_603dd87602f86b7b_ordinal_minute_of_hour_py.html index 0f5c1720..be457574 100644 --- a/cov_html/d_603dd87602f86b7b_ordinal_minute_of_hour_py.html +++ b/cov_html/d_603dd87602f86b7b_ordinal_minute_of_hour_py.html @@ -6,188 +6,180 @@ Coverage for gators/feature_generation_dt/ordinal_minute_of_hour.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalMinuteOfHour(_BaseDatetimeFeature): 

-

11 """Create new columns based on the minute of the hour. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

25 >>> X = ks.DataFrame( 

-

26 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

27 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

28 >>> obj.fit_transform(X) 

-

29 A B A__minute_of_hour 

-

30 0 2020-01-01 23:00:00 0 0.0 

-

31 1 2020-12-15 18:59:00 1 59.0 

-

32 2 NaT 0 nan 

-

33 

-

34 * fit & transform with `koalas` 

-

35 

-

36 >>> import databricks.koalas as ks 

-

37 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

38 >>> X = ks.DataFrame( 

-

39 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

40 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

41 >>> obj.fit_transform(X) 

-

42 A B A__minute_of_hour 

-

43 0 2020-01-01 23:00:00 0 0.0 

-

44 1 2020-12-15 18:59:00 1 59.0 

-

45 2 NaT 0 nan 

-

46 

-

47 * fit with `pandas` & transform with `NumPy` 

-

48 

-

49 >>> import pandas as pd 

-

50 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

51 >>> X = ks.DataFrame( 

-

52 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

53 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], 

-

57 [Timestamp('2020-12-15 18:59:00'), 1, '59.0'], 

-

58 [NaT, 0, 'nan']], dtype=object) 

-

59 

-

60 * fit with `koalas` & transform with `NumPy` 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

64 >>> X = ks.DataFrame( 

-

65 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

66 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], 

-

70 [Timestamp('2020-12-15 18:59:00'), 1, '59.0'], 

-

71 [NaT, 0, 'nan']], dtype=object) 

-

72 

-

73 

-

74 """ 

-

75 

-

76 def __init__(self, columns: List[str]): 

-

77 if not isinstance(columns, list): 

-

78 raise TypeError('`columns` should be a list.') 

-

79 if not columns: 

-

80 raise ValueError('`columns` should not be empty.') 

-

81 column_names = [f'{c}__minute_of_hour' for c in columns] 

-

82 column_mapping = dict(zip(column_names, columns)) 

-

83 _BaseDatetimeFeature.__init__( 

-

84 self, columns, column_names, column_mapping) 

-

85 

-

86 def transform( 

-

87 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

88 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

89 """Transform the dataframe `X`. 

-

90 

-

91 Parameters 

-

92 ---------- 

-

93 X : Union[pd.DataFrame, ks.DataFrame]. 

-

94 Input dataframe. 

-

95 

-

96 Returns 

-

97 ------- 

-

98 Union[pd.DataFrame, ks.DataFrame] 

-

99 Transformed dataframe. 

-

100 """ 

-

101 if isinstance(X, pd.DataFrame): 

-

102 X_ordinal = X[self.columns].apply( 

-

103 lambda x: x.dt.minute.astype(np.float64).astype(str)) 

-

104 X_ordinal.columns = self.column_names 

-

105 return X.join(X_ordinal) 

-

106 

-

107 for col, name in zip(self.columns, self.column_names): 

-

108 X = X.assign( 

-

109 dummy=X[col].dt.minute.astype(np.float64).astype(str) 

-

110 ).rename(columns={'dummy': name}) 

-

111 return X 

-

112 

-

113 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

114 """Transform the array X. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : np.ndarray 

-

119 Input array. 

-

120 

-

121 Returns 

-

122 ------- 

-

123 np.ndarray: 

-

124 Array with the datetime features added. 

-

125 """ 

-

126 self.check_array(X) 

-

127 return feature_gen_dt.ordinal_minute_of_hour( 

-

128 X, self.idx_columns) 

-
- + diff --git a/cov_html/d_603dd87602f86b7b_ordinal_month_of_year_py.html b/cov_html/d_603dd87602f86b7b_ordinal_month_of_year_py.html index c5e3f100..a50413da 100644 --- a/cov_html/d_603dd87602f86b7b_ordinal_month_of_year_py.html +++ b/cov_html/d_603dd87602f86b7b_ordinal_month_of_year_py.html @@ -6,183 +6,176 @@ Coverage for gators/feature_generation_dt/ordinal_month_of_year.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalMonthOfYear(_BaseDatetimeFeature): 

-

11 """Create new columns based on the month of the year. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

25 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

26 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__month_of_year 

-

29 0 2020-01-01 23:00:00 0 1.0 

-

30 1 2020-12-15 18:00:00 1 12.0 

-

31 2 NaT 0 nan 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

37 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

38 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__month_of_year 

-

41 0 2020-01-01 23:00:00 0 1.0 

-

42 1 2020-12-15 18:00:00 1 12.0 

-

43 2 NaT 0 nan 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

49 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

50 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

54 [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], 

-

55 [NaT, 0, 'nan']], dtype=object) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

61 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

62 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

66 [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], 

-

67 [NaT, 0, 'nan']], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 column_names = [f'{c}__month_of_year' for c in columns] 

-

78 column_mapping = dict(zip(column_names, columns)) 

-

79 _BaseDatetimeFeature.__init__( 

-

80 self, columns, column_names, column_mapping) 

-

81 

-

82 def transform( 

-

83 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

84 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

85 """Transform the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Union[pd.DataFrame, ks.DataFrame] 

-

95 Transformed dataframe. 

-

96 """ 

-

97 if isinstance(X, pd.DataFrame): 

-

98 X_ordinal = X[self.columns].apply( 

-

99 lambda x: x.dt.month.astype(np.float64).astype(str)) 

-

100 X_ordinal.columns = self.column_names 

-

101 return X.join(X_ordinal) 

-

102 

-

103 for col, name in zip(self.columns, self.column_names): 

-

104 X = X.assign( 

-

105 dummy=X[col].dt.month.astype(np.float64).astype(str) 

-

106 ).rename(columns={'dummy': name}) 

-

107 return X 

-

108 

-

109 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

110 """Transform the array X. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : np.ndarray 

-

115 Input array. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 np.ndarray: Dataset with the Tree features. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.ordinal_month_of_year( 

-

123 X, self.idx_columns) 

-
- + diff --git a/cov_html/d_6c98d578b789a2c0__base_string_feature_py.html b/cov_html/d_6c98d578b789a2c0__base_string_feature_py.html index 770b203e..1d64b4ac 100644 --- a/cov_html/d_6c98d578b789a2c0__base_string_feature_py.html +++ b/cov_html/d_6c98d578b789a2c0__base_string_feature_py.html @@ -6,120 +6,125 @@ Coverage for gators/feature_generation_str/_base_string_feature.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseStringFeature(Transformer): 

-

11 """Base string feature transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of column names. 

-

19 

-

20 """ 

-

21 

-

22 def __init__(self, columns: List[str], column_names: List[str]): 

-

23 if not isinstance(columns, list): 

-

24 raise TypeError('`columns` should be a list.') 

-

25 if not columns: 

-

26 raise ValueError('`columns` should not be empty.') 

-

27 if column_names and not isinstance(column_names, list): 

-

28 raise TypeError('`column_names` should be a list.') 

-

29 if column_names and len(column_names) != len(columns): 

-

30 raise ValueError( 

-

31 'Length of `columns` and `column_names` should match.') 

-

32 Transformer.__init__(self) 

-

33 self.columns = columns 

-

34 self.column_names: List[str] = column_names 

-

35 self.column_mapping = dict(zip(column_names, columns)) 

-

36 self.idx_columns: np.ndarray = np.array([]) 

-

37 

-

38 def fit(self, 

-

39 X: Union[pd.DataFrame, ks.DataFrame], 

-

40 y: Union[pd.Series, ks.Series] = None) -> '_BaseStringFeature': 

-

41 """Fit the transformer on the dataframe `X`. 

-

42 

-

43 Parameters 

-

44 ---------- 

-

45 X : pd.DataFrame 

-

46 Input dataframe. 

-

47 y : Union[pd.Series, ks.Series], default to None. 

-

48 Target values. 

-

49 

-

50 Returns 

-

51 ------- 

-

52 _BaseStringFeature 

-

53 Instance of itself. 

-

54 """ 

-

55 self.check_dataframe(X) 

-

56 self.idx_columns = util.get_idx_columns( 

-

57 columns=X.columns, 

-

58 selected_columns=self.columns, 

-

59 ) 

-

60 return self 

-
- + diff --git a/cov_html/d_6c98d578b789a2c0_extract_py.html b/cov_html/d_6c98d578b789a2c0_extract_py.html index a543b2c4..12561af7 100644 --- a/cov_html/d_6c98d578b789a2c0_extract_py.html +++ b/cov_html/d_6c98d578b789a2c0_extract_py.html @@ -6,225 +6,198 @@ Coverage for gators/feature_generation_str/extract.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import extract_str 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9 

-

10 

-

11class Extract(_BaseStringFeature): 

-

12 """Create new object columns based on substrings. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 i_min_vec : List[int] 

-

19 List of indices. 

-

20 i_max_vec : List[int] 

-

21 List of indices. 

-

22 column_names : List[int] 

-

23 List of column names. 

-

24 

-

25 Examples 

-

26 --------- 

-

27 * fit & transform with `pandas` 

-

28 

-

29 >>> import pandas as pd 

-

30 >>> from gators.feature_generation_str import Extract 

-

31 >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

32 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

33 >>> obj.fit_transform(X) 

-

34 A B A__substring_0_to_1 A__substring_2_to_3 

-

35 0 qwe 1 q e 

-

36 1 asd 2 a d 

-

37 2 zxc 3 z c 

-

38 

-

39 * fit with `koalas` & transform with `NumPy` 

-

40 

-

41 >>> import databricks.koalas as ks 

-

42 >>> from gators.feature_generation_str import Extract 

-

43 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

44 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

45 >>> obj.fit_transform(X) 

-

46 A B A__substring_0_to_1 A__substring_2_to_3 

-

47 0 qwe 1 q e 

-

48 1 asd 2 a d 

-

49 2 zxc 3 z c 

-

50 

-

51 * fit with `pandas` & transform with `NumPy` 

-

52 

-

53 >>> import pandas as pd 

-

54 >>> from gators.feature_generation_str import Extract 

-

55 >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

56 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

57 >>> _ = obj.fit(X) 

-

58 >>> obj.transform_numpy(X.to_numpy()) 

-

59 array([['qwe', 1, 'q', 'e'], 

-

60 ['asd', 2, 'a', 'd'], 

-

61 ['zxc', 3, 'z', 'c']], dtype=object) 

-

62 

-

63 * fit with `koalas` & transform with `NumPy` 

-

64 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.feature_generation_str import Extract 

-

67 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

68 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([['qwe', 1, 'q', 'e'], 

-

72 ['asd', 2, 'a', 'd'], 

-

73 ['zxc', 3, 'z', 'c']], dtype=object) 

-

74 

-

75 

-

76 """ 

-

77 

-

78 def __init__(self, columns: List[str], i_min_vec: List[int], i_max_vec: List[int], 

-

79 column_names: List[int] = None): 

-

80 if not isinstance(columns, list): 

-

81 raise TypeError('`columns` should be a list.') 

-

82 if not isinstance(i_min_vec, list): 

-

83 raise TypeError('`i_min_vec` should be a list.') 

-

84 if len(columns) != len(i_min_vec): 

-

85 raise ValueError( 

-

86 'Length of `columns` and `i_min_vec` should match.') 

-

87 if not isinstance(i_max_vec, list): 

-

88 raise TypeError('`i_max_vec` should be a list.') 

-

89 if len(columns) != len(i_max_vec): 

-

90 raise ValueError( 

-

91 'Length of `columns` and `i_max_vec` should match.') 

-

92 if not column_names: 

-

93 column_names = [ 

-

94 f'{c}__substring_{i_min}_to_{i_max}' 

-

95 for c, i_min, i_max in zip(columns, i_min_vec, i_max_vec) 

-

96 ] 

-

97 _BaseStringFeature.__init__(self, columns, column_names) 

-

98 self.i_min_vec = np.array(i_min_vec, int) 

-

99 self.i_max_vec = np.array(i_max_vec, int) 

-

100 

-

101 def fit(self, 

-

102 X: Union[pd.DataFrame, ks.DataFrame], 

-

103 y: Union[pd.Series, ks.Series] = None) -> 'Extract': 

-

104 """Fit the transformer on the dataframe `X`. 

-

105 

-

106 Parameters 

-

107 ---------- 

-

108 X : Union[pd.DataFrame, ks.DataFrame]. 

-

109 Input dataframe. 

-

110 y : None 

-

111 None. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 Extract 

-

116 Instance of itself. 

-

117 """ 

-

118 self.check_dataframe(X) 

-

119 self.idx_columns = util.get_idx_columns( 

-

120 columns=X.columns, 

-

121 selected_columns=self.columns 

-

122 ) 

-

123 return self 

-

124 

-

125 def transform( 

-

126 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

127 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

128 """Transform the dataframe `X`. 

-

129 

-

130 Parameters 

-

131 ---------- 

-

132 X : Union[pd.DataFrame, ks.DataFrame]. 

-

133 Input dataframe. 

-

134 

-

135 Returns 

-

136 ------- 

-

137 Union[pd.DataFrame, ks.DataFrame] 

-

138 Transformed dataframe. 

-

139 """ 

-

140 self.check_dataframe(X) 

-

141 

-

142 for col, i_min, i_max, name in zip( 

-

143 self.columns, self.i_min_vec, 

-

144 self.i_max_vec, self.column_names): 

-

145 X.loc[:, name] = X[col].str.slice( 

-

146 start=i_min, stop=i_max).replace({'': 'MISSING'}) 

-

147 return X 

-

148 

-

149 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

150 """Transform the NumPy array `X`. 

-

151 

-

152 Parameters 

-

153 ---------- 

-

154 X : np.ndarray 

-

155 Input array. 

-

156 

-

157 Returns 

-

158 ------- 

-

159 np.ndarray 

-

160 Transformed array. 

-

161 """ 

-

162 self.check_array(X) 

-

163 return extract_str( 

-

164 X, self.idx_columns, self.i_min_vec, self.i_max_vec 

-

165 ) 

-
- + diff --git a/cov_html/d_6c98d578b789a2c0_lower_case_py.html b/cov_html/d_6c98d578b789a2c0_lower_case_py.html index 6a4591e4..707ef1c3 100644 --- a/cov_html/d_6c98d578b789a2c0_lower_case_py.html +++ b/cov_html/d_6c98d578b789a2c0_lower_case_py.html @@ -6,199 +6,180 @@ Coverage for gators/feature_generation_str/lower_case.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import lower_case 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9 

-

10 

-

11class LowerCase(_BaseStringFeature): 

-

12 """Convert the selected columns to lower case. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_str import LowerCase 

-

25 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

26 >>> obj = LowerCase(columns=['A','B']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B 

-

29 0 abc abc 

-

30 1 ab ab 

-

31 2 None 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_str import LowerCase 

-

37 >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

38 >>> obj = LowerCase(columns=['A','B']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B 

-

41 0 abc abc 

-

42 1 ab ab 

-

43 2 None 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_str import LowerCase 

-

49 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

50 >>> obj = LowerCase(columns=['A','B']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([['abc', 'abc'], 

-

54 ['ab', 'ab'], 

-

55 ['', None]], dtype=object) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_str import LowerCase 

-

61 >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

62 >>> obj = LowerCase(columns=['A','B']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([['abc', 'abc'], 

-

66 ['ab', 'ab'], 

-

67 ['', None]], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 self.columns = columns 

-

78 

-

79 def fit(self, 

-

80 X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'LowerCase': 

-

82 """Fit the transformer on the dataframe `X`. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 LowerCase 

-

94 Instance of itself. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 self.idx_columns = util.get_idx_columns( 

-

98 columns=X.columns, 

-

99 selected_columns=self.columns 

-

100 ) 

-

101 return self 

-

102 

-

103 def transform( 

-

104 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

105 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

106 """Transform the dataframe `X`. 

-

107 

-

108 Parameters 

-

109 ---------- 

-

110 X : Union[pd.DataFrame, ks.DataFrame]. 

-

111 Input dataframe. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 Union[pd.DataFrame, ks.DataFrame] 

-

116 Transformed dataframe. 

-

117 """ 

-

118 def f(x): 

-

119 if x.name in self.columns: 

-

120 return x.astype(str).str.lower().replace( 

-

121 {'none': None}) 

-

122 return x 

-

123 return X.apply(f) 

-

124 

-

125 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

126 """Transform the NumPy array `X`. 

-

127 

-

128 Parameters 

-

129 ---------- 

-

130 X : np.ndarray 

-

131 Input array. 

-

132 

-

133 Returns 

-

134 ------- 

-

135 np.ndarray 

-

136 Transformed array. 

-

137 """ 

-

138 self.check_array(X) 

-

139 return lower_case(X, self.idx_columns) 

-
- + diff --git a/cov_html/d_6c98d578b789a2c0_split_extract_py.html b/cov_html/d_6c98d578b789a2c0_split_extract_py.html index 9227dba7..785ef77c 100644 --- a/cov_html/d_6c98d578b789a2c0_split_extract_py.html +++ b/cov_html/d_6c98d578b789a2c0_split_extract_py.html @@ -6,213 +6,210 @@ Coverage for gators/feature_generation_str/split_extract.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen_str import split_and_extract_str 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from._base_string_feature import _BaseStringFeature 

-

8 

-

9 

-

10class SplitExtract(_BaseStringFeature): 

-

11 """Create new columns based on split strings. 

-

12 

-

13 The transformer applies two steps: 

-

14 

-

15 * split each string element using the given value. 

-

16 * extract the string of the given split list element. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 columns : List[str] 

-

21 List of columns. 

-

22 

-

23 str_split_vec : List[int] 

-

24 List of separators. 

-

25 

-

26 idx_split_vec : List[int] 

-

27 List of split indices. 

-

28 

-

29 column_names : List[int] 

-

30 List of new column names. 

-

31 

-

32 Examples 

-

33 --------- 

-

34 

-

35 * fit & transform with `pandas` 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> from gators.feature_generation_str import SplitExtract 

-

39 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

40 >>> obj = SplitExtract( 

-

41 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__split_by_*_idx_0 A__split_by_*_idx_1 

-

44 0 qw*e 1 qw e 

-

45 1 a*qd 2 a qd 

-

46 2 zxq* 3 zxq  

-

47 

-

48 * fit & transform with `koalas` 

-

49 

-

50 >>> import databricks.koalas as ks 

-

51 >>> from gators.feature_generation_str import SplitExtract 

-

52 >>> X = ks.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

53 >>> obj = SplitExtract( 

-

54 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

55 >>> obj.fit_transform(X) 

-

56 A B A__split_by_*_idx_0 A__split_by_*_idx_1 

-

57 0 qw*e 1 qw e 

-

58 1 a*qd 2 a qd 

-

59 2 zxq* 3 zxq  

-

60 

-

61 * fit with `pandas` & transform with `NumPy` 

-

62 

-

63 >>> import pandas as pd 

-

64 >>> from gators.feature_generation_str import SplitExtract 

-

65 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

66 >>> obj = SplitExtract( 

-

67 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

68 >>> _ = obj.fit(X) 

-

69 >>> obj.transform_numpy(X.to_numpy()) 

-

70 array([['qw*e', 1, 'qw', 'e'], 

-

71 ['a*qd', 2, 'a', 'qd'], 

-

72 ['zxq*', 3, 'zxq', '']], dtype=object) 

-

73 

-

74 * fit with `koalas` & transform with `NumPy` 

-

75 

-

76 >>> import databricks.koalas as ks 

-

77 >>> from gators.feature_generation_str import SplitExtract 

-

78 >>> X = ks.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

79 >>> obj = SplitExtract( 

-

80 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

81 >>> _ = obj.fit(X) 

-

82 >>> obj.transform_numpy(X.to_numpy()) 

-

83 array([['qw*e', 1, 'qw', 'e'], 

-

84 ['a*qd', 2, 'a', 'qd'], 

-

85 ['zxq*', 3, 'zxq', '']], dtype=object) 

-

86 

-

87 """ 

-

88 

-

89 def __init__(self, columns: List[str], 

-

90 str_split_vec: List[int], idx_split_vec: List[int], 

-

91 column_names: List[str] = None): 

-

92 if not isinstance(columns, list): 

-

93 raise TypeError('`columns` should be a list.') 

-

94 if not isinstance(str_split_vec, list): 

-

95 raise TypeError('`str_split_vec` should be a list.') 

-

96 if len(columns) != len(str_split_vec): 

-

97 raise ValueError( 

-

98 'Length of `columns` and `str_split_vec` should match.') 

-

99 if not isinstance(idx_split_vec, list): 

-

100 raise TypeError('`idx_split_vec` should be a list.') 

-

101 if len(columns) != len(idx_split_vec): 

-

102 raise ValueError( 

-

103 'Length of `columns` and `idx_split_vec` should match.') 

-

104 if not column_names: 

-

105 column_names = [ 

-

106 f'{col}__split_by_{split}_idx_{idx}' for 

-

107 col, split, idx in zip(columns, str_split_vec, idx_split_vec) 

-

108 ] 

-

109 _BaseStringFeature.__init__(self, columns, column_names) 

-

110 self.str_split_vec = np.array(str_split_vec, object) 

-

111 self.idx_split_vec = np.array(idx_split_vec, int) 

-

112 

-

113 def transform( 

-

114 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

115 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

116 """Transform the dataframe `X`. 

-

117 

-

118 Parameters 

-

119 ---------- 

-

120 X : Union[pd.DataFrame, ks.DataFrame]. 

-

121 Input dataframe. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 Union[pd.DataFrame, ks.DataFrame] 

-

126 Transformed dataframe. 

-

127 """ 

-

128 self.check_dataframe(X) 

-

129 for col, idx, str_split, name in zip( 

-

130 self.columns, self.idx_split_vec, 

-

131 self.str_split_vec, self.column_names): 

-

132 n = idx if idx > 0 else 1 

-

133 X.loc[:, name] = X[col].str.split(str_split, n=n, expand=True)[ 

-

134 idx].fillna('MISSING') 

-

135 return X 

-

136 

-

137 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

138 """Transform the NumPy array `X`. 

-

139 

-

140 Parameters 

-

141 ---------- 

-

142 X : np.ndarray 

-

143 Input array. 

-

144 

-

145 Returns 

-

146 ------- 

-

147 np.ndarray 

-

148 Transformed array. 

-

149 """ 

-

150 self.check_array(X) 

-

151 return split_and_extract_str( 

-

152 X, self.idx_columns, self.str_split_vec, self.idx_split_vec 

-

153 ) 

-
- + diff --git a/cov_html/d_6c98d578b789a2c0_string_contains_py.html b/cov_html/d_6c98d578b789a2c0_string_contains_py.html index ca421ab8..d21e050d 100644 --- a/cov_html/d_6c98d578b789a2c0_string_contains_py.html +++ b/cov_html/d_6c98d578b789a2c0_string_contains_py.html @@ -1,195 +1,416 @@ + - Coverage for gators/feature_generation_str/string_contains.py: 100% + Coverage for gators/feature_generation_str/contains.py: 100% - - - - - + + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen_str import contains 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from._base_string_feature import _BaseStringFeature 

-

8 

-

9 

-

10class StringContains(_BaseStringFeature): 

-

11 """Create new binary columns. 

-

12 

-

13 The value is 1 if the element contains the given substring and 0 otherwise. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 contains_vec : List[int] 

-

20 List of substrings. 

-

21 column_names : List[int], default to None. 

-

22 List new column names. 

-

23 

-

24 Examples 

-

25 --------- 

-

26 * fit & transform with `pandas` 

-

27 

-

28 >>> import pandas as pd 

-

29 >>> from gators.feature_generation_str import StringContains 

-

30 >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) 

-

31 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

32 >>> obj.fit_transform(X) 

-

33 A B A__contains_qw A__contains_we 

-

34 0 qwe 1 1.0 1.0 

-

35 1 qwd 2 1.0 0.0 

-

36 2 zwe 3 0.0 1.0 

-

37 

-

38 * fit & transform with `koalas` 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.feature_generation_str import StringLength 

-

42 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

43 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

44 >>> obj.fit_transform(X) 

-

45 A B A__contains_qw A__contains_we 

-

46 0 qwe 1 1.0 1.0 

-

47 1 asd 2 0.0 0.0 

-

48 2 zxc 3 0.0 0.0 

-

49 

-

50 * fit with `pandas` & transform with `NumPy` 

-

51 

-

52 >>> import pandas as pd 

-

53 >>> from gators.feature_generation_str import StringLength 

-

54 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

55 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

56 >>> _ = obj.fit(X) 

-

57 >>> obj.transform_numpy(X.to_numpy()) 

-

58 array([['qwe', 1, 1.0, 1.0], 

-

59 ['asd', 2, 0.0, 0.0], 

-

60 ['zxc', 3, 0.0, 0.0]], dtype=object) 

-

61 

-

62 * fit with `koalas` & transform with `NumPy` 

-

63 

-

64 >>> import databricks.koalas as ks 

-

65 >>> from gators.feature_generation_str import StringLength 

-

66 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

67 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

68 >>> _ = obj.fit(X) 

-

69 >>> obj.transform_numpy(X.to_numpy()) 

-

70 array([['qwe', 1, 1.0, 1.0], 

-

71 ['asd', 2, 0.0, 0.0], 

-

72 ['zxc', 3, 0.0, 0.0]], dtype=object) 

-

73 

-

74 """ 

-

75 

-

76 def __init__(self, columns: List[str], contains_vec: List[str], 

-

77 column_names: List[str] = None): 

-

78 if not isinstance(columns, list): 

-

79 raise TypeError('`columns` should be a list.') 

-

80 if not isinstance(contains_vec, list): 

-

81 raise TypeError('`contains_vec` should be a list.') 

-

82 if len(columns) != len(contains_vec): 

-

83 raise ValueError( 

-

84 'Length of `columns` and `contains_vec` should match.') 

-

85 if not column_names: 

-

86 column_names = [ 

-

87 f'{col}__contains_{val}' 

-

88 for col, val in zip(columns, contains_vec) 

-

89 ] 

-

90 _BaseStringFeature.__init__( 

-

91 self, columns, column_names) 

-

92 self.contains_vec = np.array(contains_vec, str).astype(object) 

-

93 

-

94 def transform( 

-

95 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

96 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

97 """Transform the dataframe `X`. 

-

98 

-

99 Parameters 

-

100 ---------- 

-

101 X : Union[pd.DataFrame, ks.DataFrame]. 

-

102 Input dataframe. 

-

103 

-

104 Returns 

-

105 ------- 

-

106 Union[pd.DataFrame, ks.DataFrame] 

-

107 Transformed dataframe. 

-

108 """ 

-

109 self.check_dataframe(X) 

-

110 for col, val, name in zip( 

-

111 self.columns, self.contains_vec, self.column_names): 

-

112 X.loc[:, name] = X[col].str.contains( 

-

113 val, regex=False).astype(np.float64) 

-

114 return X 

-

115 

-

116 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

117 """Transform the NumPy array `X`. 

-

118 

-

119 Parameters 

-

120 ---------- 

-

121 X : np.ndarray 

-

122 Input array. 

-

123 

-

124 Returns 

-

125 ------- 

-

126 np.ndarray 

-

127 Transformed array. 

-

128 """ 

-

129 self.check_array(X) 

-

130 return contains(X, self.idx_columns, self.contains_vec) 

-
- +

35 

+

36 The + `fit`, `transform`, and `fit_transform` methods accept:  +

+

37 

+

38 * `dask` + dataframes: 

+

39 

+

40 >>> + import dask.dataframe as dd 

+

41 >>> + import pandas as pd 

+

42 >>> X = + dd.from_pandas( 

+

43 ... + pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}), npartitions=1) 

+

44 

+

45 * + `koalas` dataframes: 

+

46 

+

47 >>> + import databricks.koalas as ks 

+

48 >>> X = + ks.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) 

+

49 

+

50 * and + `pandas` dataframes: 

+

51 

+

52 >>> + import pandas as pd 

+

53 >>> X = + pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) 

+

54 

+

55 The + result is a transformed dataframe belonging to the same dataframe library. 

+

56 

+

57 >>> + obj.fit_transform(X) 

+

58 A B + A__contains_qw A__contains_we 

+

59 0 qwe 1 + 1.0 1.0 

+

60 1 qwd 2 + 1.0 0.0 

+

61 2 zwe 3 + 0.0 1.0 

+

62 

+

63 >>> X = + pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) 

+

64 >>> _ = + obj.fit(X) 

+

65 >>> + obj.transform_numpy(X.to_numpy()) 

+

66 + array([['qwe', 1, 1.0, 1.0], 

+

67 ['qwd', + 2, 1.0, 0.0], 

+

68 ['zwe', + 3, 0.0, 1.0]], dtype=object) 

+

69 + """ 

+

70 

+

71 def __init__( 

+

72 self, 

+

73 columns: List[str], 

+

74 contains_vec: List[str], 

+

75 column_names: List[str] = + None, 

+

76 ): 

+

77 if + not isinstance(columns, (list, np.ndarray)): 

+

78 raise TypeError("`columns` should be a list.") 

+

79 if + not isinstance(contains_vec, (list, np.ndarray)): 

+

80 raise TypeError("`contains_vec` should be a list.") 

+

81 if + len(columns) != len(contains_vec): 

+

82 raise ValueError("Length of `columns` and `contains_vec` should match.") 

+

83 if + not column_names: 

+

84 column_names = [ 

+

85 f"{col}__contains_{val}" for col, val in zip(columns, contains_vec) 

+

86 ] 

+

87 _BaseStringFeature.__init__(self, columns, column_names) 

+

88 self.contains_vec = contains_vec 

+

89 self.contains_vec_np = np.array(self.contains_vec).astype(object) 

+

90 

+

91 def transform(self, X: + DataFrame) -> DataFrame: 

+

92 """Transform the dataframe `X`. 

+

93 

+

94 + Parameters 

+

95 + ---------- 

+

96 X : + DataFrame. 

+

97 Input + dataframe. 

+

98 

+

99 + Returns 

+

100 + ------- 

+

101 X : + DataFrame 

+

102 + Transformed dataframe. 

+

103 + """ 

+

104 

+

105 self.check_dataframe(X) 

+

106 for col, val, name in zip(self.columns, self.contains_vec, self.column_names): 

+

107 X[name] + = X[col].str.contains(val, regex=False).astype(np.float64) 

+

108 

+

109 return X 

+

110 

+

111 def transform_numpy(self, X: + np.ndarray) -> np.ndarray: 

+

112 """Transform the array `X`. 

+

113 

+

114 + Parameters 

+

115 + ---------- 

+

116 X : + np.ndarray 

+

117 Input + array. 

+

118 

+

119 + Returns 

+

120 + ------- 

+

121 X : + np.ndarray 

+

122 + Transformed array. 

+

123 + """ 

+

124 self.check_array(X) 

+

125 return contains(X, self.idx_columns, self.contains_vec_np) 

+ + - + + \ No newline at end of file diff --git a/cov_html/d_6c98d578b789a2c0_string_length_py.html b/cov_html/d_6c98d578b789a2c0_string_length_py.html index 676f2235..d912eb21 100644 --- a/cov_html/d_6c98d578b789a2c0_string_length_py.html +++ b/cov_html/d_6c98d578b789a2c0_string_length_py.html @@ -1,204 +1,458 @@ + - - - Coverage for gators/feature_generation_str/string_length.py: 100% - - - - - - - + + + Coverage for gators/feature_generation_str/length.py: 100% + + + + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import string_length 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9pd.options.mode.chained_assignment = None 

-

10 

-

11 

-

12class StringLength(_BaseStringFeature): 

-

13 """Create new columns based on the length of its elements. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 

-

20 Examples 

-

21 --------- 

-

22 * fit & transform with `pandas` 

-

23 

-

24 >>> import pandas as pd 

-

25 >>> from gators.feature_generation_str import StringLength 

-

26 >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

27 >>> obj = StringLength(columns=['A','B']) 

-

28 >>> obj.fit_transform(X) 

-

29 A B A__length B__length 

-

30 0 qwe 1 3.0 1.0 

-

31 1 as 22 2.0 2.0 

-

32 2 333 0.0 3.0 

-

33 

-

34 * fit & transform with `koalas` 

-

35 

-

36 >>> import databricks.koalas as ks 

-

37 >>> from gators.feature_generation_str import StringLength 

-

38 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

39 >>> obj = StringLength(columns=['A','B']) 

-

40 >>> obj.fit_transform(X) 

-

41 A B A__length B__length 

-

42 0 qwe 1 3.0 1.0 

-

43 1 as 22 2.0 2.0 

-

44 2 333 0.0 3.0 

-

45 

-

46 * fit with `pandas` & transform with `NumPy` 

-

47 

-

48 >>> import pandas as pd 

-

49 >>> from gators.feature_generation_str import StringLength 

-

50 >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

51 >>> obj = StringLength(columns=['A','B']) 

-

52 >>> _ = obj.fit(X) 

-

53 >>> obj.transform_numpy(X.to_numpy()) 

-

54 array([['qwe', 1, 3.0, 1.0], 

-

55 ['as', 22, 2.0, 2.0], 

-

56 ['', 333, 0.0, 3.0]], dtype=object) 

-

57 

-

58 * fit with `koalas` & transform with `NumPy` 

-

59 

-

60 >>> import databricks.koalas as ks 

-

61 >>> from gators.feature_generation_str import StringLength 

-

62 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

63 >>> obj = StringLength(columns=['A','B']) 

-

64 >>> _ = obj.fit(X) 

-

65 >>> obj.transform_numpy(X.to_numpy()) 

-

66 array([['qwe', 1, 3.0, 1.0], 

-

67 ['as', 22, 2.0, 2.0], 

-

68 ['', 333, 0.0, 3.0]], dtype=object) 

-

69 

-

70 

-

71 """ 

-

72 

-

73 def __init__(self, columns: List[str], column_names: List[str] = None): 

-

74 if not column_names: 

-

75 column_names = [f'{col}__length' for col in columns] 

-

76 _BaseStringFeature.__init__( 

-

77 self, columns, column_names) 

-

78 

-

79 def fit(self, 

-

80 X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'StringLength': 

-

82 """Fit the transformer on the dataframe `X`. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 StringLength 

-

94 Instance of itself. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 self.idx_columns = util.get_idx_columns( 

-

98 columns=X.columns, 

-

99 selected_columns=self.columns 

-

100 ) 

-

101 return self 

-

102 

-

103 def transform( 

-

104 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

105 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

106 """Transform the dataframe `X`. 

-

107 

-

108 Parameters 

-

109 ---------- 

-

110 X : Union[pd.DataFrame, ks.DataFrame]. 

-

111 Input dataframe. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 Union[pd.DataFrame, ks.DataFrame] 

-

116 Transformed dataframe. 

-

117 """ 

-

118 self.check_dataframe(X) 

-

119 for col, name in zip(self.columns, self.column_names): 

-

120 X.loc[:, name] = X.loc[:, col].fillna('').astype(str).replace( 

-

121 {'nan': ''}).str.len().astype(np.float64) 

-

122 pass 

-

123 return X 

-

124 

-

125 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

126 """Transform the NumPy array `X`. 

-

127 

-

128 Parameters 

-

129 ---------- 

-

130 X : np.ndarray 

-

131 Input array. 

-

132 

-

133 Returns 

-

134 ------- 

-

135 np.ndarray 

-

136 Transformed array. 

-

137 """ 

-

138 self.check_array(X) 

-

139 return string_length(X, self.idx_columns) 

-
- +
+
+

+ Coverage for gators/feature_generation_str/length.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 21 statements   + + + +

+
+ + + + +
+
+
+
+

1# + License: + Apache-2.0 

+

2from + typing import List 

+

3 

+

4import + numpy as np 

+

5import + pandas as pd 

+

6 

+

7from + feature_gen_str import length 

+

8 

+

9from + ..util import util 

+

10from ._base_string_feature import _BaseStringFeature 

+

11 

+

12pd.options.mode.chained_assignment = None 

+

13 

+

14 

+

15from gators import DataFrame, Series 

+

16 

+

17 

+

18class Length(_BaseStringFeature):  +

+

19 """Create + new columns based on the length of its elements. 

+

20 

+

21 + Parameters 

+

22 + ---------- 

+

23 + theta_vec + : List[float] 

+

24 + List of + columns. 

+

25 

+

26 + Examples 

+

27 + --------- 

+

28 + Imports + and initialization: 

+

29 

+

30 + >>> from + gators.feature_generation_str import Length 

+

31 + >>> obj = + Length(columns=['A', 'B']) 

+

32 

+

33 + The + `fit`, `transform`, and `fit_transform` methods accept:  +

+

34 

+

35 * + `dask` + dataframes: 

+

36 

+

37 + >>> + import dask.dataframe as dd 

+

38 + >>> + import pandas as pd 

+

39 + >>> X = + dd.from_pandas( 

+

40 + ... + pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}), + npartitions=1) 

+

41 

+

42 * + `koalas` dataframes: 

+

43 

+

44 + >>> + import databricks.koalas as ks 

+

45 + >>> X = + ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, + 333]})  +

+

46 

+

47 * + and + `pandas` dataframes: 

+

48 

+

49 + >>> + import pandas as pd 

+

50 + >>> X = + pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, + 333]})  +

+

51 

+

52 + The + result is a transformed dataframe belonging to the same dataframe + library. 

+

53 

+

54 + >>> + obj.fit_transform(X) 

+

55 A + B + A__length B__length 

+

56 0 + qwe 1 + 3.0 1.0 

+

57 1 + as 22 + 2.0 2.0 

+

58 2 + 333 0.0 + 3.0 

+

59 

+

60 + >>> X = + pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, + 333]})  +

+

61 + >>> _ = + obj.fit(X) 

+

62 + >>> + obj.transform_numpy(X.to_numpy()) 

+

63 + array([['qwe', 1, 3.0, 1.0], 

+

64 + ['as', + 22, 2.0, 2.0], 

+

65 + ['', 333, + 0.0, 3.0]], dtype=object) 

+

66 

+

67 + """ 

+

68 

+

69 def __init__(self, columns: List[str], column_names: List[str] = + None): 

+

70 if + not column_names: 

+

71 column_names = [f"{col}__length" for col in + columns] 

+

72 _BaseStringFeature.__init__(self, columns, column_names) 

+

73 

+

74 def transform(self, X: + DataFrame) -> + DataFrame: 

+

75 """Transform the dataframe `X`. 

+

76 

+

77 + Parameters 

+

78 + ---------- 

+

79 X + : + DataFrame. 

+

80 + Input + dataframe. 

+

81 

+

82 + Returns 

+

83 + ------- 

+

84 X + : + DataFrame 

+

85 + Transformed dataframe. 

+

86 + """ 

+

87 self.check_dataframe(X) 

+

88 

+

89 for name, + col in zip(self.column_names, self.columns): 

+

90 X[name] + = (  +

+

91 util.get_function(X) 

+

92 .replace(X[col].fillna("").astype(str), {"nan": ""}) 

+

93 .str.len() 

+

94 .astype(np.float64) 

+

95 ) 

+

96 

+

97 return X 

+

98 

+

99 def transform_numpy(self, X: + np.ndarray) -> + np.ndarray: 

+

100 """Transform the array `X`. 

+

101 

+

102 + Parameters 

+

103 + ---------- 

+

104 X : + np.ndarray 

+

105 Input + array. 

+

106 

+

107 + Returns 

+

108 + ------- 

+

109 X : + np.ndarray 

+

110 + Transformed array. 

+

111 + """ 

+

112 self.check_array(X) 

+

113 return length(X, self.idx_columns) 

+
+ - + + \ No newline at end of file diff --git a/cov_html/d_6c98d578b789a2c0_upper_case_py.html b/cov_html/d_6c98d578b789a2c0_upper_case_py.html index 44a2e7ec..f5a1440e 100644 --- a/cov_html/d_6c98d578b789a2c0_upper_case_py.html +++ b/cov_html/d_6c98d578b789a2c0_upper_case_py.html @@ -6,202 +6,180 @@ Coverage for gators/feature_generation_str/upper_case.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import upper_case 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9 

-

10 

-

11class UpperCase(_BaseStringFeature): 

-

12 """Convert the selected columns to upper case. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_str import UpperCase 

-

25 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

26 >>> obj = UpperCase(columns=['A','B']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B 

-

29 0 ABC ABC 

-

30 1 AB AB 

-

31 2 None 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_str import UpperCase 

-

37 >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

38 >>> obj = UpperCase(columns=['A','B']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B 

-

41 0 ABC ABC 

-

42 1 AB AB 

-

43 2 None 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_str import UpperCase 

-

49 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

50 >>> obj = UpperCase(columns=['A','B']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([['ABC', 'ABC'], 

-

54 ['AB', 'AB'], 

-

55 ['', None]], dtype=object) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_str import UpperCase 

-

61 >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

62 >>> obj = UpperCase(columns=['A','B']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([['ABC', 'ABC'], 

-

66 ['AB', 'AB'], 

-

67 ['', None]], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str], column_names: List[str] = None): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 self.columns = columns 

-

78 

-

79 def fit(self, 

-

80 X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'StringLength': 

-

82 """Fit the transformer on the dataframe `X`. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 StringLength 

-

94 Instance of itself. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 self.idx_columns = util.get_idx_columns( 

-

98 columns=X.columns, 

-

99 selected_columns=self.columns 

-

100 ) 

-

101 return self 

-

102 

-

103 def transform( 

-

104 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

105 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

106 """Transform the dataframe `X`. 

-

107 

-

108 Parameters 

-

109 ---------- 

-

110 X : Union[pd.DataFrame, ks.DataFrame]. 

-

111 Input dataframe. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 Union[pd.DataFrame, ks.DataFrame] 

-

116 Transformed dataframe. 

-

117 """ 

-

118 self.check_dataframe(X) 

-

119 

-

120 def f(x): # -> ks.Series[str]: 

-

121 if x.name in self.columns: 

-

122 return x.astype(str).str.upper().replace( 

-

123 {'NAN': 'nan', 'NONE': None}) 

-

124 return x 

-

125 # X[self.columns] = X[self.columns] 

-

126 return X.apply(f) 

-

127 

-

128 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

129 """Transform the NumPy array `X`. 

-

130 

-

131 Parameters 

-

132 ---------- 

-

133 X: np.ndarray 

-

134 Input array. 

-

135 

-

136 Returns 

-

137 ------- 

-

138 np.ndarray 

-

139 Transformed array. 

-

140 """ 

-

141 self.check_array(X) 

-

142 return upper_case(X, self.idx_columns) 

-
- + diff --git a/cov_html/d_77d5126526bda421__base_feature_selection_py.html b/cov_html/d_77d5126526bda421__base_feature_selection_py.html index cc6d4c41..e795735a 100644 --- a/cov_html/d_77d5126526bda421__base_feature_selection_py.html +++ b/cov_html/d_77d5126526bda421__base_feature_selection_py.html @@ -6,128 +6,126 @@ Coverage for gators/feature_selection/_base_feature_selection.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseFeatureSelection(Transformer): 

-

11 """Base feature selection transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns: List[str] 

-

16 List of columns to drop. 

-

17 selected_columns : List[str] 

-

18 List of selected columns. 

-

19 feature_importances_ : pd.Series 

-

20 Feature importance. 

-

21 

-

22 """ 

-

23 

-

24 def __init__(self): 

-

25 self.feature_importances_ = pd.Series([], dtype=np.float64) 

-

26 self.selected_columns: List[str] = [] 

-

27 self.idx_selected_columns: List[str] = [] 

-

28 self.columns_to_drop: List[str] = [] 

-

29 

-

30 def transform( 

-

31 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

32 y: Union[pd.Series, ks.Series] = None) -> Union[pd.DataFrame, ks.DataFrame]: 

-

33 """Transform the dataframe `X`. 

-

34 

-

35 Parameters 

-

36 ---------- 

-

37 X : Union[pd.DataFrame, ks.DataFrame]. 

-

38 Input dataframe. 

-

39 y : np.ndarray 

-

40 Labels. 

-

41 

-

42 Returns 

-

43 ------- 

-

44 Union[pd.DataFrame, ks.DataFrame] 

-

45 Transformed dataframe. 

-

46 """ 

-

47 self.check_dataframe(X) 

-

48 if len(self.columns_to_drop): 

-

49 return X.drop(self.columns_to_drop, axis=1) 

-

50 else: 

-

51 return X 

-

52 

-

53 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

54 """Transform the NumPy array `X`. 

-

55 

-

56 Parameters 

-

57 ---------- 

-

58 X : np.ndarray 

-

59 Input array. 

-

60 

-

61 Returns 

-

62 ------- 

-

63 np.ndarray 

-

64 Transformed array. 

-

65 """ 

-

66 self.check_array(X) 

-

67 self.idx_selected_columns.sort() 

-

68 return X[:, self.idx_selected_columns] 

-
- + diff --git a/cov_html/d_77d5126526bda421_correlation_filter_py.html b/cov_html/d_77d5126526bda421_correlation_filter_py.html index 9c48c799..caac0b06 100644 --- a/cov_html/d_77d5126526bda421_correlation_filter_py.html +++ b/cov_html/d_77d5126526bda421_correlation_filter_py.html @@ -6,176 +6,167 @@ Coverage for gators/feature_selection/correlation_filter.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ._base_feature_selection import _BaseFeatureSelection 

-

7from ..util import util 

-

8 

-

9 

-

10class CorrelationFilter(_BaseFeatureSelection): 

-

11 """Remove highly correlated columns. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 max_corr : float 

-

16 Max correlation value tolerated between two columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_selection import CorrelationFilter 

-

25 >>> X = pd.DataFrame( 

-

26 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

27 >>> obj = CorrelationFilter(max_corr=0.9) 

-

28 >>> obj.fit_transform(X) 

-

29 B C 

-

30 0 1.0 0.00 

-

31 1 2.0 0.00 

-

32 2 3.0 0.15 

-

33 

-

34 * fit & transform with `koalas` 

-

35 

-

36 >>> import databricks.koalas as ks 

-

37 >>> from gators.feature_selection import CorrelationFilter 

-

38 >>> X = ks.DataFrame( 

-

39 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

40 >>> obj = CorrelationFilter(max_corr=0.9) 

-

41 >>> obj.fit_transform(X) 

-

42 B C 

-

43 0 1.0 0.00 

-

44 1 2.0 0.00 

-

45 2 3.0 0.15 

-

46 

-

47 * fit with `pandas` & transform with `NumPy` 

-

48 

-

49 >>> import pandas as pd 

-

50 >>> from gators.feature_selection import CorrelationFilter 

-

51 >>> X = pd.DataFrame( 

-

52 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

53 >>> obj = CorrelationFilter(max_corr=0.9) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[1. , 0. ], 

-

57 [2. , 0. ], 

-

58 [3. , 0.15]]) 

-

59 

-

60 * fit with `koalas` & transform with `NumPy` 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> from gators.feature_selection import CorrelationFilter 

-

64 >>> X = ks.DataFrame( 

-

65 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

66 >>> obj = CorrelationFilter(max_corr=0.9) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[1. , 0. ], 

-

70 [2. , 0. ], 

-

71 [3. , 0.15]]) 

-

72 

-

73 """ 

-

74 

-

75 def __init__(self, max_corr: float): 

-

76 if not isinstance(max_corr, float): 

-

77 raise TypeError('`max_corr` should be a float.') 

-

78 _BaseFeatureSelection.__init__(self) 

-

79 self.max_corr = max_corr 

-

80 

-

81 def fit(self, 

-

82 X: Union[pd.DataFrame, ks.DataFrame], 

-

83 y: Union[pd.Series, ks.Series] = None) -> 'CorrelationFilter': 

-

84 """Fit the transformer on the dataframe `X`. 

-

85 

-

86 Parameters 

-

87 ---------- 

-

88 X : Union[pd.DataFrame, ks.DataFrame]. 

-

89 Input dataframe. 

-

90 y : None 

-

91 None. 

-

92 

-

93 Returns 

-

94 ------- 

-

95 CorrelationFilter: Instance of itself. 

-

96 """ 

-

97 self.check_dataframe(X) 

-

98 columns = X.columns 

-

99 corr = X.corr().abs() 

-

100 if isinstance(X, ks.DataFrame): 

-

101 corr = corr.to_pandas() 

-

102 stacked_corr = (corr.where(np.tril(np.ones(corr.shape), k=-1).astype(np.bool)) 

-

103 .stack() 

-

104 .sort_values(ascending=False)) 

-

105 stacked_corr = stacked_corr.sort_values(ascending=False) 

-

106 mask = (stacked_corr >= self.max_corr) 

-

107 self.columns_to_drop = stacked_corr[mask].sort_index( 

-

108 ).index.get_level_values(1) 

-

109 self.columns_to_drop = list(set(self.columns_to_drop)) 

-

110 self.selected_columns = [ 

-

111 c for c in columns if c not in self.columns_to_drop] 

-

112 self.feature_importances_ = pd.Series( 

-

113 1., index=self.selected_columns, dtype=float) 

-

114 self.idx_selected_columns = util.get_idx_columns( 

-

115 X.columns, self.selected_columns) 

-

116 return self 

-
- + diff --git a/cov_html/d_77d5126526bda421_information_value_py.html b/cov_html/d_77d5126526bda421_information_value_py.html index 0c9cf081..70b9b5ac 100644 --- a/cov_html/d_77d5126526bda421_information_value_py.html +++ b/cov_html/d_77d5126526bda421_information_value_py.html @@ -6,277 +6,237 @@ Coverage for gators/feature_selection/information_value.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import databricks.koalas as ks 

-

5import pandas as pd 

-

6from ._base_feature_selection import _BaseFeatureSelection 

-

7from ..util import util 

-

8from ..binning._base_discretizer import _BaseDiscretizer 

-

9 

-

10 

-

11class InformationValue(_BaseFeatureSelection): 

-

12 """Feature selection based on the information value. 

-

13 

-

14 `InformationValue` accepts only binary variable targets. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 k : int 

-

19 Number of features to keep. 

-

20 discretizer : _BaseDiscretizer 

-

21 Discretizer transformer. 

-

22 

-

23 See Also 

-

24 -------- 

-

25 gators.feature_selection.MultiClassInformationValue 

-

26 Information value for muti-class classification problems. 

-

27 gators.feature_selection.RegressionInformationValue 

-

28 Information value for regression problems. 

-

29 

-

30 Examples 

-

31 --------- 

-

32 

-

33 * fit & transform with `pandas` 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> from gators.feature_selection import InformationValue 

-

37 >>> from gators.binning import Discretizer 

-

38 >>> X = pd.DataFrame({ 

-

39 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

40 ... 'B': [1, 1, 0, 1, 0, 0], 

-

41 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

42 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

43 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

44 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

45 >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

46 >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) 

-

47 >>> obj.fit_transform(X, y) 

-

48 A B C 

-

49 0 87.25 1 a 

-

50 1 5.25 1 b 

-

51 2 70.25 0 b 

-

52 3 5.25 1 b 

-

53 4 0.25 0 a 

-

54 5 7.25 0 a 

-

55 

-

56 * fit & transform with `koalas` 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.binning import Discretizer 

-

60 >>> from gators.feature_selection import InformationValue 

-

61 >>> X = ks.DataFrame({ 

-

62 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

63 ... 'B': [1, 1, 0, 1, 0, 0], 

-

64 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

65 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

66 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

67 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

68 >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

69 >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) 

-

70 >>> obj.fit_transform(X, y) 

-

71 A B C 

-

72 0 87.25 1 a 

-

73 1 5.25 1 b 

-

74 2 70.25 0 b 

-

75 3 5.25 1 b 

-

76 4 0.25 0 a 

-

77 5 7.25 0 a 

-

78 

-

79 * fit with `pandas` & transform with `NumPy` 

-

80 

-

81 >>> import pandas as pd 

-

82 >>> from gators.feature_selection import InformationValue 

-

83 >>> from gators.binning import Discretizer 

-

84 >>> X = pd.DataFrame({ 

-

85 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

86 ... 'B': [1, 1, 0, 1, 0, 0], 

-

87 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

88 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

89 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

90 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

91 >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

92 >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) 

-

93 >>> _ = obj.fit(X, y) 

-

94 >>> obj.transform_numpy(X.to_numpy()) 

-

95 array([[87.25, 1, 'a'], 

-

96 [5.25, 1, 'b'], 

-

97 [70.25, 0, 'b'], 

-

98 [5.25, 1, 'b'], 

-

99 [0.25, 0, 'a'], 

-

100 [7.25, 0, 'a']], dtype=object) 

-

101 

-

102 * fit with `koalas` & transform with `NumPy` 

-

103 

-

104 >>> import databricks.koalas as ks 

-

105 >>> from gators.feature_selection import InformationValue 

-

106 >>> from gators.binning import Discretizer 

-

107 >>> X = ks.DataFrame({ 

-

108 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

109 ... 'B': [1, 1, 0, 1, 0, 0], 

-

110 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

111 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

112 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

113 >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

114 >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) 

-

115 >>> _ = obj.fit(X, y) 

-

116 >>> obj.transform_numpy(X.to_numpy()) 

-

117 array([[87.25, 1, 'a'], 

-

118 [5.25, 1, 'b'], 

-

119 [70.25, 0, 'b'], 

-

120 [5.25, 1, 'b'], 

-

121 [0.25, 0, 'a'], 

-

122 [7.25, 0, 'a']], dtype=object) 

-

123 """ 

-

124 

-

125 def __init__(self, k: int, discretizer: _BaseDiscretizer): 

-

126 if not isinstance(k, int): 

-

127 raise TypeError('`k` should be an int.') 

-

128 if not isinstance(discretizer, _BaseDiscretizer): 

-

129 raise TypeError( 

-

130 '`discretizer` should derive from _BaseDiscretizer.') 

-

131 _BaseFeatureSelection.__init__(self) 

-

132 self.k = k 

-

133 self.discretizer = discretizer 

-

134 

-

135 def fit(self, 

-

136 X: Union[pd.DataFrame, ks.DataFrame], 

-

137 y: Union[pd.Series, ks.Series] = None) -> 'InformationValue': 

-

138 """Fit the transformer on the dataframe `X`. 

-

139 

-

140 Parameters 

-

141 ---------- 

-

142 X: Union[pd.DataFrame, ks.DataFrame] 

-

143 Input dataframe. 

-

144 y: Union[pd.Series, ks.Series], default to None. 

-

145 Labels. 

-

146 

-

147 Returns 

-

148 ------- 

-

149 InformationValue: Instance of itself. 

-

150 """ 

-

151 self.check_dataframe(X) 

-

152 self.check_y(X, y) 

-

153 self.check_binary_target(y) 

-

154 columns = X.columns 

-

155 self.feature_importances_ = self.compute_information_value( 

-

156 X, y, self.discretizer 

-

157 ) 

-

158 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

159 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

160 self.columns_to_drop = [ 

-

161 c for c in columns if c not in self.selected_columns 

-

162 ] 

-

163 self.idx_selected_columns = util.get_idx_columns( 

-

164 X.columns, self.selected_columns) 

-

165 return self 

-

166 

-

167 @staticmethod 

-

168 def compute_information_value( 

-

169 X: Union[pd.DataFrame, ks.DataFrame], 

-

170 y: Union[pd.Series, ks.Series], 

-

171 discretizer: _BaseDiscretizer) -> pd.Series: 

-

172 """Compute information value. 

-

173 

-

174 Parameters 

-

175 ---------- 

-

176 X: Union[pd.DataFrame, ks.DataFrame] 

-

177 Input dataframe. 

-

178 y: np.ndarray 

-

179 Target values. 

-

180 discretizer: _BaseDiscretizer 

-

181 Discretizer. 

-

182 

-

183 Returns 

-

184 ------- 

-

185 pd.Series 

-

186 Information value. 

-

187 """ 

-

188 discretizer.inplace = False 

-

189 object_columns = util.get_datatype_columns(X, object) 

-

190 numerical_columns = util.get_numerical_columns(X) 

-

191 binned_columns = [ 

-

192 f'{c}__bin' for c in numerical_columns] 

-

193 iv_columns = object_columns.copy() + binned_columns.copy() 

-

194 X = discretizer.fit_transform(X) 

-

195 iv = pd.Series(0, index=iv_columns) 

-

196 X = X.join(y) 

-

197 y_name = y.name 

-

198 for col in iv_columns: 

-

199 if isinstance(X, pd.DataFrame): 

-

200 tab = X.groupby( 

-

201 [col, y_name])[y_name].count().unstack( 

-

202 ).fillna(0) 

-

203 else: 

-

204 tab = X[[col, y_name]].groupby( 

-

205 [col, y_name])[y_name].count().to_pandas().unstack( 

-

206 ).fillna(0) 

-

207 tab /= tab.sum() 

-

208 tab = tab.to_numpy() 

-

209 with np.errstate(divide='ignore'): 

-

210 woe = pd.Series(np.log(tab[:, 1] / tab[:, 0])) 

-

211 woe[(woe == np.inf) | (woe == -np.inf)] = 0. 

-

212 iv.loc[col] = np.sum(woe * (tab[:, 1] - tab[:, 0])) 

-

213 

-

214 X = X.drop(binned_columns + [y_name], axis=1) 

-

215 iv.index = [ 

-

216 c.split('__bin')[0] for c in iv.index] 

-

217 return iv.sort_values(ascending=False).fillna(0) 

-
- + diff --git a/cov_html/d_77d5126526bda421_multiclass_information_value_py.html b/cov_html/d_77d5126526bda421_multiclass_information_value_py.html deleted file mode 100644 index 4f9dde29..00000000 --- a/cov_html/d_77d5126526bda421_multiclass_information_value_py.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - Coverage for gators/feature_selection/multiclass_information_value.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ._base_feature_selection import _BaseFeatureSelection 

-

6from .information_value import InformationValue 

-

7from ..util import util 

-

8from ..binning._base_discretizer import _BaseDiscretizer 

-

9 

-

10 

-

11class MultiClassInformationValue(_BaseFeatureSelection): 

-

12 """Feature selection based on the information value. 

-

13 

-

14 `MultiClassInformationValue` accepts only for muti-class variable targets. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 k : int 

-

19 Number of features to keep. 

-

20 discretizer : _BaseDiscretizer 

-

21 Discretizer Transformer. 

-

22 

-

23 See Also 

-

24 -------- 

-

25 gators.feature_selection.InformationValue 

-

26 Information value for binary classification problems. 

-

27 gators.feature_selection.RegressionInformationValue 

-

28 Information value for regression problems. 

-

29 

-

30 Examples 

-

31 -------- 

-

32 * fit & transform with `pandas` 

-

33 

-

34 >>> import pandas as pd 

-

35 >>> from gators.feature_selection import MultiClassInformationValue 

-

36 >>> from gators.binning import Discretizer 

-

37 >>> X = pd.DataFrame({ 

-

38 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

39 ... 'B': [1, 1, 0, 1, 0, 0], 

-

40 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

41 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

42 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

43 >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

44 >>> discretizer = Discretizer(n_bins=4) 

-

45 >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) 

-

46 >>> obj.fit_transform(X, y) 

-

47 A B C 

-

48 0 87.25 1 a 

-

49 1 5.25 1 b 

-

50 2 70.25 0 b 

-

51 3 5.25 1 b 

-

52 4 0.25 0 a 

-

53 5 7.25 0 a 

-

54 

-

55 * fit & transform with `koalas` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.feature_selection import InformationValue 

-

59 >>> from gators.binning import Discretizer 

-

60 >>> X = ks.DataFrame({ 

-

61 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

62 ... 'B': [1, 1, 0, 1, 0, 0], 

-

63 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

64 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

65 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

66 >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

67 >>> discretizer = Discretizer(n_bins=4) 

-

68 >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) 

-

69 >>> obj.fit_transform(X, y) 

-

70 A B C 

-

71 0 87.25 1 a 

-

72 1 5.25 1 b 

-

73 2 70.25 0 b 

-

74 3 5.25 1 b 

-

75 4 0.25 0 a 

-

76 5 7.25 0 a 

-

77 

-

78 * fit with `pandas` & transform with `NumPy` 

-

79 

-

80 >>> import pandas as pd 

-

81 >>> from gators.feature_selection import InformationValue 

-

82 >>> from gators.binning import Discretizer 

-

83 >>> X = pd.DataFrame({ 

-

84 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

85 ... 'B': [1, 1, 0, 1, 0, 0], 

-

86 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

87 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

88 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

89 >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

90 >>> discretizer = Discretizer(n_bins=4) 

-

91 >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) 

-

92 >>> _ = obj.fit(X, y) 

-

93 >>> obj.transform_numpy(X.to_numpy()) 

-

94 array([[87.25, 1, 'a'], 

-

95 [5.25, 1, 'b'], 

-

96 [70.25, 0, 'b'], 

-

97 [5.25, 1, 'b'], 

-

98 [0.25, 0, 'a'], 

-

99 [7.25, 0, 'a']], dtype=object) 

-

100 

-

101 * fit with `koalas` & transform with `NumPy` 

-

102 

-

103 >>> import databricks.koalas as ks 

-

104 >>> from gators.feature_selection import InformationValue 

-

105 >>> from gators.binning import Discretizer 

-

106 >>> X = ks.DataFrame({ 

-

107 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

108 ... 'B': [1, 1, 0, 1, 0, 0], 

-

109 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

110 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

111 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

112 >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

113 >>> discretizer = Discretizer(n_bins=4) 

-

114 >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) 

-

115 >>> _ = obj.fit(X, y) 

-

116 >>> obj.transform_numpy(X.to_numpy()) 

-

117 array([[87.25, 1, 'a'], 

-

118 [5.25, 1, 'b'], 

-

119 [70.25, 0, 'b'], 

-

120 [5.25, 1, 'b'], 

-

121 [0.25, 0, 'a'], 

-

122 [7.25, 0, 'a']], dtype=object) 

-

123 """ 

-

124 

-

125 def __init__(self, k: int, discretizer: _BaseDiscretizer): 

-

126 if not isinstance(k, int): 

-

127 raise TypeError('`k` should be an int.') 

-

128 if not isinstance(discretizer, _BaseDiscretizer): 

-

129 raise TypeError( 

-

130 '`discretizer` should inherite from _BaseDiscretizer.') 

-

131 _BaseFeatureSelection.__init__(self) 

-

132 self.k = k 

-

133 self.discretizer = discretizer 

-

134 

-

135 def fit(self, 

-

136 X: Union[pd.DataFrame, ks.DataFrame], 

-

137 y: Union[pd.Series, ks.Series] = None 

-

138 ) -> 'MultiClassInformationValue': 

-

139 """Fit the transformer on the dataframe `X`. 

-

140 

-

141 Parameters 

-

142 ---------- 

-

143 X : Union[pd.DataFrame, ks.DataFrame] 

-

144 Input dataframe. 

-

145 y : Union[pd.Series, ks.Series], default to None. 

-

146 Labels. 

-

147 

-

148 Returns 

-

149 ------- 

-

150 InformationValue: Instance of itself. 

-

151 """ 

-

152 self.check_dataframe(X) 

-

153 self.check_y(X, y) 

-

154 self.check_multiclass_target(y) 

-

155 columns = X.columns 

-

156 self.feature_importances_ = self.compute_information_value( 

-

157 X, y, self.discretizer 

-

158 ) 

-

159 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

160 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

161 self.columns_to_drop = [ 

-

162 c for c in columns if c not in self.selected_columns 

-

163 ] 

-

164 self.idx_selected_columns = util.get_idx_columns( 

-

165 X.columns, self.selected_columns) 

-

166 return self 

-

167 

-

168 @staticmethod 

-

169 def compute_information_value( 

-

170 X: Union[pd.DataFrame, ks.DataFrame], 

-

171 y: Union[pd.Series, ks.Series], 

-

172 discretizer: _BaseDiscretizer) -> pd.Series: 

-

173 """Compute information value. 

-

174 

-

175 Parameters 

-

176 ---------- 

-

177 X : Union[pd.DataFrame, ks.DataFrame] 

-

178 Input dataframe. 

-

179 y : Union[pd.Series, ks.Series], default to None. 

-

180 Labels. 

-

181 discretizer : _BaseDiscretizer 

-

182 Discretizer Transformer. 

-

183 

-

184 Returns 

-

185 ------- 

-

186 pd.Series 

-

187 Information value. 

-

188 """ 

-

189 discretizer.inplace = False 

-

190 if isinstance(X, pd.DataFrame): 

-

191 y_onehot = pd.get_dummies(y, prefix=y.name) 

-

192 else: 

-

193 y_onehot = ks.get_dummies(y, prefix=y.name) 

-

194 y_onehot = y_onehot.drop(y_onehot.columns[0], axis=1) 

-

195 information_values = pd.DataFrame( 

-

196 index=X.columns, columns=y_onehot.columns[1:]) 

-

197 iv = InformationValue(discretizer=discretizer, k=X.shape[1]) 

-

198 object_columns = util.get_datatype_columns(X, object) 

-

199 columns = object_columns + discretizer.output_columns 

-

200 for col in y_onehot.columns[1:]: 

-

201 _ = iv.fit(X[columns], y_onehot.loc[:, col]) 

-

202 information_values.loc[:, col] = iv.feature_importances_ 

-

203 return information_values.fillna(0).max(1).sort_values( 

-

204 ascending=False) 

-
- - - diff --git a/cov_html/d_77d5126526bda421_regression_information_value_py.html b/cov_html/d_77d5126526bda421_regression_information_value_py.html deleted file mode 100644 index 0dbcb1fb..00000000 --- a/cov_html/d_77d5126526bda421_regression_information_value_py.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - Coverage for gators/feature_selection/regression_information_value.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ._base_feature_selection import _BaseFeatureSelection 

-

6from .multiclass_information_value import MultiClassInformationValue 

-

7from ..util import util 

-

8from ..binning._base_discretizer import _BaseDiscretizer 

-

9 

-

10 

-

11class RegressionInformationValue(_BaseFeatureSelection): 

-

12 """Regression Information Value Transformer. 

-

13 

-

14 `RegressionInformationValue` accepts only continuous variable targets. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 k : int 

-

19 Number of features to keep. 

-

20 discretizer : _BaseDiscretizer 

-

21 Discretizer Transformer. 

-

22 

-

23 See Also 

-

24 -------- 

-

25 gators.feature_selection.InformationValue 

-

26 Information value for binary classification problems. 

-

27 gators.feature_selection.MultiClassInformationValue 

-

28 Information value for multi-class classification problems. 

-

29 

-

30 Examples 

-

31 -------- 

-

32 * fit & transform with `pandas` 

-

33 

-

34 >>> import pandas as pd 

-

35 >>> from gators.feature_selection import RegressionInformationValue 

-

36 >>> from gators.binning import Discretizer 

-

37 >>> X = pd.DataFrame({ 

-

38 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

39 ... 'B': [1, 1, 0, 1, 0, 0], 

-

40 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

41 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

42 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

43 >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

44 >>> discretizer = Discretizer(n_bins=4) 

-

45 >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) 

-

46 >>> obj.fit_transform(X, y) 

-

47 A B C 

-

48 0 87.25 1 a 

-

49 1 5.25 1 b 

-

50 2 70.25 0 b 

-

51 3 5.25 1 b 

-

52 4 0.25 0 a 

-

53 5 7.25 0 a 

-

54 

-

55 * fit & transform with `koalas` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.binning import Discretizer 

-

59 >>> from gators.feature_selection import InformationValue 

-

60 >>> X = ks.DataFrame({ 

-

61 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

62 ... 'B': [1, 1, 0, 1, 0, 0], 

-

63 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

64 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

65 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

66 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

67 >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

68 >>> discretizer = Discretizer(n_bins=4) 

-

69 >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) 

-

70 >>> obj.fit_transform(X, y) 

-

71 A B C 

-

72 0 87.25 1 a 

-

73 1 5.25 1 b 

-

74 2 70.25 0 b 

-

75 3 5.25 1 b 

-

76 4 0.25 0 a 

-

77 5 7.25 0 a 

-

78 

-

79 * fit with `pandas` & transform with `NumPy` 

-

80 

-

81 >>> import pandas as pd 

-

82 >>> from gators.feature_selection import RegressionInformationValue 

-

83 >>> from gators.binning import Discretizer 

-

84 >>> X = pd.DataFrame({ 

-

85 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

86 ... 'B': [1, 1, 0, 1, 0, 0], 

-

87 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

88 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

89 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

90 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

91 >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

92 >>> discretizer = Discretizer(n_bins=4) 

-

93 >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) 

-

94 >>> _ = obj.fit(X, y) 

-

95 >>> obj.transform_numpy(X.to_numpy()) 

-

96 array([[87.25, 1, 'a'], 

-

97 [5.25, 1, 'b'], 

-

98 [70.25, 0, 'b'], 

-

99 [5.25, 1, 'b'], 

-

100 [0.25, 0, 'a'], 

-

101 [7.25, 0, 'a']], dtype=object) 

-

102 

-

103 * fit with `koalas` & transform with `NumPy` 

-

104 

-

105 >>> import databricks.koalas as ks 

-

106 >>> from gators.feature_selection import InformationValue 

-

107 >>> from gators.binning import Discretizer 

-

108 >>> X = ks.DataFrame({ 

-

109 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

110 ... 'B': [1, 1, 0, 1, 0, 0], 

-

111 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

112 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

113 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

114 >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

115 >>> discretizer = Discretizer(n_bins=4) 

-

116 >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) 

-

117 >>> _ = obj.fit(X, y) 

-

118 >>> obj.transform_numpy(X.to_numpy()) 

-

119 array([[87.25, 1, 'a'], 

-

120 [5.25, 1, 'b'], 

-

121 [70.25, 0, 'b'], 

-

122 [5.25, 1, 'b'], 

-

123 [0.25, 0, 'a'], 

-

124 [7.25, 0, 'a']], dtype=object) 

-

125 

-

126 

-

127 """ 

-

128 

-

129 def __init__(self, k: int, discretizer: _BaseDiscretizer): 

-

130 if not isinstance(k, int): 

-

131 raise TypeError('`k` should be an int.') 

-

132 if not isinstance(discretizer, _BaseDiscretizer): 

-

133 raise TypeError( 

-

134 '`discretizer` should inherite from _BaseDiscretizer.') 

-

135 _BaseFeatureSelection.__init__(self) 

-

136 self.k = k 

-

137 self.discretizer = discretizer 

-

138 

-

139 def fit(self, 

-

140 X: Union[pd.DataFrame, ks.DataFrame], 

-

141 y: Union[pd.Series, ks.Series] = None 

-

142 ) -> 'RegressionInformationValue': 

-

143 """Fit the transformer on the dataframe `X`. 

-

144 

-

145 Parameters 

-

146 ---------- 

-

147 X : Union[pd.DataFrame, ks.DataFrame] 

-

148 Input dataframe. 

-

149 y : Union[pd.Series, ks.Series], default to None. 

-

150 Labels. 

-

151 

-

152 Returns 

-

153 ------- 

-

154 InformationValue: Instance of itself. 

-

155 """ 

-

156 self.check_dataframe(X) 

-

157 self.check_y(X, y) 

-

158 self.check_regression_target(y) 

-

159 columns = X.columns 

-

160 self.feature_importances_ = self.compute_information_value( 

-

161 X, y, self.discretizer 

-

162 ) 

-

163 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

164 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

165 self.columns_to_drop = [ 

-

166 c for c in columns if c not in self.selected_columns 

-

167 ] 

-

168 self.idx_selected_columns = util.get_idx_columns( 

-

169 X.columns, self.selected_columns) 

-

170 return self 

-

171 

-

172 @staticmethod 

-

173 def compute_information_value( 

-

174 X: Union[pd.DataFrame, ks.DataFrame], 

-

175 y: Union[pd.Series, ks.Series], 

-

176 discretizer: _BaseDiscretizer) -> pd.Series: 

-

177 """Compute information value. 

-

178 

-

179 Parameters 

-

180 ---------- 

-

181 X : Union[pd.DataFrame, ks.DataFrame] 

-

182 Input dataframe. 

-

183 y : Union[pd.Series, ks.Series], default to None. 

-

184 Labels. 

-

185 discretizer : _BaseDiscretizer 

-

186 Discretizer Transformer. 

-

187 

-

188 Returns 

-

189 ------- 

-

190 pd.Series 

-

191 Information value. 

-

192 """ 

-

193 discretizer.inplace = True 

-

194 y_binned = discretizer.fit_transform(y.to_frame())[y.name] 

-

195 discretizer.inplace = False 

-

196 discretizer.output_columns = [] 

-

197 return MultiClassInformationValue.compute_information_value( 

-

198 X, 

-

199 y_binned.astype(float).astype(int), 

-

200 discretizer=discretizer) 

-
- - - diff --git a/cov_html/d_77d5126526bda421_select_from_model_py.html b/cov_html/d_77d5126526bda421_select_from_model_py.html index 9ff4c9bf..ef219c85 100644 --- a/cov_html/d_77d5126526bda421_select_from_model_py.html +++ b/cov_html/d_77d5126526bda421_select_from_model_py.html @@ -6,217 +6,205 @@ Coverage for gators/feature_selection/select_from_model.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ._base_feature_selection import _BaseFeatureSelection 

-

6from ..converter import KoalasToPandas 

-

7from ..util import util 

-

8 

-

9 

-

10class SelectFromModel(_BaseFeatureSelection): 

-

11 """Select From Model Transformer. 

-

12 

-

13 Select the top *k* features based on the feature importance 

-

14 of the given machine learning model. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 model : model 

-

19 Machine learning model. 

-

20 k : int 

-

21 Number of features to keep. 

-

22 

-

23 Examples 

-

24 --------- 

-

25 * fit & transform with `koalas` 

-

26 

-

27 

-

28 >>> import pandas as pd 

-

29 >>> from sklearn.ensemble import RandomForestClassifier as RFC 

-

30 >>> from gators.feature_selection import SelectFromModel 

-

31 >>> X = pd.DataFrame( 

-

32 ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

33 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

34 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

35 >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

36 >>> model = RFC(n_estimators=1, max_depth=2, random_state=0) 

-

37 >>> obj = SelectFromModel(model=model, k=2) 

-

38 >>> obj.fit_transform(X, y) 

-

39 A C 

-

40 0 22.00 3.0 

-

41 1 38.00 1.0 

-

42 2 26.00 3.0 

-

43 3 35.00 1.0 

-

44 4 35.00 3.0 

-

45 5 28.11 3.0 

-

46 6 54.00 1.0 

-

47 7 2.00 3.0 

-

48 8 27.00 3.0 

-

49 9 14.00 2.0 

-

50 

-

51 * fit & transform with `koalas` 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark 

-

55 >>> from gators.feature_selection import SelectFromModel 

-

56 >>> X = ks.DataFrame( 

-

57 ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

58 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

59 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

60 >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

61 >>> model = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) 

-

62 >>> obj = SelectFromModel(model=model, k=2) 

-

63 >>> obj.fit_transform(X, y) 

-

64 A B 

-

65 0 22.00 7.25 

-

66 1 38.00 71.28 

-

67 2 26.00 7.92 

-

68 3 35.00 53.10 

-

69 4 35.00 8.05 

-

70 5 28.11 8.46 

-

71 6 54.00 51.86 

-

72 7 2.00 21.08 

-

73 8 27.00 11.13 

-

74 9 14.00 30.07 

-

75 

-

76 See Also 

-

77 -------- 

-

78 gators.feature_selection.SelectFromModels 

-

79 Similar method using multiple models. 

-

80 

-

81 """ 

-

82 

-

83 def __init__(self, model, k: int): 

-

84 if not isinstance(k, int): 

-

85 raise TypeError('`k` should be an int.') 

-

86 if not hasattr(model, 'fit'): 

-

87 raise TypeError( 

-

88 '`model` should have the attribute `fit`.' 

-

89 ) 

-

90 _BaseFeatureSelection.__init__(self) 

-

91 self.model = model 

-

92 self.k = k 

-

93 

-

94 def fit(self, 

-

95 X: Union[pd.DataFrame, ks.DataFrame], 

-

96 y: Union[pd.Series, ks.Series] = None) -> 'SelectFromModel': 

-

97 """Fit the transformer on the dataframe `X`. 

-

98 

-

99 Parameters 

-

100 ---------- 

-

101 X : Union[pd.DataFrame, ks.DataFrame] 

-

102 Input dataframe. 

-

103 y : Union[pd.Series, ks.Series], default to None. 

-

104 Labels. 

-

105 

-

106 Returns 

-

107 ------- 

-

108 SelectFromModel: Instance of itself. 

-

109 """ 

-

110 self.check_dataframe(X) 

-

111 self.check_y(X, y) 

-

112 columns = list(X.columns) 

-

113 if isinstance(X, pd.DataFrame): 

-

114 self.feature_importances_ = self.calculate_feature_importances_pd( 

-

115 model=self.model, X=X, y=y, columns=columns) 

-

116 else: 

-

117 if hasattr(self.model, 'labelCol'): 

-

118 self.feature_importances_ = \ 

-

119 self.calculate_feature_importances_ks( 

-

120 model=self.model, X=X, y=y, columns=columns) 

-

121 else: 

-

122 X_, y_ = KoalasToPandas().transform(X, y) 

-

123 self.feature_importances_ = \ 

-

124 self.calculate_feature_importances_pd( 

-

125 model=self.model, X=X_, y=y_, columns=columns) 

-

126 mask = self.feature_importances_ != 0 

-

127 self.feature_importances_ = self.feature_importances_[mask] 

-

128 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

129 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

130 self.columns_to_drop = [ 

-

131 c for c in columns if c not in self.selected_columns] 

-

132 self.idx_selected_columns = util.get_idx_columns( 

-

133 X.columns, self.selected_columns) 

-

134 return self 

-

135 

-

136 @staticmethod 

-

137 def calculate_feature_importances_pd( 

-

138 model: object, X: pd.DataFrame, 

-

139 y: Union[pd.Series, ks.Series], columns: list) -> pd.Series: 

-

140 model.fit(X.to_numpy(), y) 

-

141 feature_importances_ = pd.Series( 

-

142 model.feature_importances_, 

-

143 index=columns, 

-

144 ) 

-

145 return feature_importances_ 

-

146 

-

147 @staticmethod 

-

148 def calculate_feature_importances_ks( 

-

149 model: object, X: ks.DataFrame, 

-

150 y: ks.Series, columns: list) -> pd.Series: 

-

151 spark_df = util.generate_spark_dataframe(X=X, y=y) 

-

152 trained_model = model.fit(spark_df) 

-

153 feature_importances_ = pd.Series( 

-

154 trained_model.featureImportances.toArray(), 

-

155 index=columns 

-

156 ) 

-

157 return feature_importances_ 

-
- + diff --git a/cov_html/d_77d5126526bda421_select_from_models_py.html b/cov_html/d_77d5126526bda421_select_from_models_py.html index 0a2c585c..3f55b366 100644 --- a/cov_html/d_77d5126526bda421_select_from_models_py.html +++ b/cov_html/d_77d5126526bda421_select_from_models_py.html @@ -6,239 +6,248 @@ Coverage for gators/feature_selection/select_from_models.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6import pyspark.sql.dataframe as ps 

-

7from ._base_feature_selection import _BaseFeatureSelection 

-

8from ..scalers.minmax_scaler import MinMaxScaler 

-

9from ..util import util 

-

10 

-

11 

-

12class SelectFromModels(_BaseFeatureSelection): 

-

13 """Select From Models By Vote Transformer. 

-

14 

-

15 Select the top *k* features based on the feature importance 

-

16 of the given machine learning models. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 models : List[model] 

-

21 List of machine learning models. 

-

22 k : int 

-

23 Number of features to keep. 

-

24 

-

25 Examples 

-

26 --------- 

-

27 * fit & transform with `koalas` 

-

28 

-

29 >>> import pandas as pd 

-

30 >>> from sklearn.ensemble import RandomForestClassifier as RFC 

-

31 >>> from gators.feature_selection import SelectFromModels 

-

32 >>> X = pd.DataFrame({ 

-

33 ... 'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

34 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

35 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

36 >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

37 >>> models = [RFC(n_estimators=1, max_depth=1, random_state=0), 

-

38 ... RFC(n_estimators=1, max_depth=2, random_state=1)] 

-

39 >>> obj = SelectFromModels(models=models, k=2) 

-

40 >>> obj.fit_transform(X, y) 

-

41 B C 

-

42 0 7.25 3.0 

-

43 1 71.28 1.0 

-

44 2 7.92 3.0 

-

45 3 53.10 1.0 

-

46 4 8.05 3.0 

-

47 5 8.46 3.0 

-

48 6 51.86 1.0 

-

49 7 21.08 3.0 

-

50 8 11.13 3.0 

-

51 9 30.07 2.0 

-

52 

-

53 * fit & transform with `koalas` 

-

54 

-

55 >>> import databricks.koalas as ks 

-

56 >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark 

-

57 >>> from gators.feature_selection import SelectFromModels 

-

58 >>> X = ks.DataFrame({ 

-

59 ... 'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

60 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

61 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

62 >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

63 >>> models = [RFCSpark(numTrees=1, maxDepth=1, labelCol=y.name, seed=0), 

-

64 ... RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=1)] 

-

65 >>> obj = SelectFromModels(models=models, k=2) 

-

66 >>> obj.fit_transform(X, y) 

-

67 A B 

-

68 0 22.00 7.25 

-

69 1 38.00 71.28 

-

70 2 26.00 7.92 

-

71 3 35.00 53.10 

-

72 4 35.00 8.05 

-

73 5 28.11 8.46 

-

74 6 54.00 51.86 

-

75 7 2.00 21.08 

-

76 8 27.00 11.13 

-

77 9 14.00 30.07 

-

78 

-

79 See Also 

-

80 -------- 

-

81 gators.feature_selection.SelectFromMode 

-

82 Similar method using one model. 

-

83 

-

84 """ 

-

85 

-

86 def __init__(self, models: List[object], k: int): 

-

87 if not isinstance(models, list): 

-

88 raise TypeError('`models` should be a list.') 

-

89 if not isinstance(k, int): 

-

90 raise TypeError('`k` should be an int.') 

-

91 for model in models: 

-

92 if not hasattr(model, 'fit'): 

-

93 raise TypeError( 

-

94 'All the elements of `models` should have the attribute `fit`.' 

-

95 ) 

-

96 _BaseFeatureSelection.__init__(self) 

-

97 self.models = models 

-

98 self.k = k 

-

99 

-

100 def fit(self, 

-

101 X: Union[pd.DataFrame, ks.DataFrame], 

-

102 y: Union[pd.Series, ks.Series] = None) -> 'SelectFromModels': 

-

103 """Fit the transformer on the dataframe `X`. 

-

104 

-

105 Parameters 

-

106 ---------- 

-

107 X : Union[pd.DataFrame, ks.DataFrame] 

-

108 Input dataframe. 

-

109 y : Union[pd.Series, ks.Series], default to None. 

-

110 Labels. 

-

111 

-

112 Returns 

-

113 ------- 

-

114 SelectFromModels: Instance of itself. 

-

115 """ 

-

116 self.check_dataframe(X) 

-

117 self.check_y(X, y) 

-

118 self.feature_importances_ = self.get_feature_importances_frame( 

-

119 X, self.models) 

-

120 if isinstance(X, pd.DataFrame): 

-

121 for col, model in zip( 

-

122 self.feature_importances_.columns, self.models): 

-

123 model_feature_importances_ = self.get_feature_importances_pd( 

-

124 model=model, X=X, y=y) 

-

125 self.feature_importances_[col] = model_feature_importances_ 

-

126 else: 

-

127 spark_df = util.generate_spark_dataframe(X=X, y=y) 

-

128 for col, model in zip( 

-

129 self.feature_importances_.columns, self.models): 

-

130 model_feature_importances_ = self.get_feature_importances_sk( 

-

131 model=model, spark_df=spark_df) 

-

132 self.feature_importances_[col] = model_feature_importances_ 

-

133 self.feature_importances_ = self.clean_feature_importances_frame( 

-

134 self.feature_importances_) 

-

135 self.selected_columns = list( 

-

136 self.feature_importances_['count'].iloc[:self.k].index) 

-

137 self.columns_to_drop = [ 

-

138 c for c in self.feature_importances_.index 

-

139 if c not in self.selected_columns 

-

140 ] 

-

141 self.idx_selected_columns = util.get_idx_columns( 

-

142 X.columns, self.selected_columns) 

-

143 return self 

-

144 

-

145 @staticmethod 

-

146 def get_feature_importances_pd( 

-

147 model: object, X: pd.DataFrame, y: Union[pd.Series, ks.Series]): 

-

148 model.fit(X, y) 

-

149 feature_importances_ = model.feature_importances_ 

-

150 return feature_importances_ 

-

151 

-

152 @staticmethod 

-

153 def get_feature_importances_sk( 

-

154 model: object, spark_df: ps.DataFrame): 

-

155 trained_model = model.fit(spark_df) 

-

156 feature_importances_ = trained_model.featureImportances.toArray() 

-

157 return feature_importances_ 

-

158 

-

159 @staticmethod 

-

160 def get_feature_importances_frame(X, models): 

-

161 index = np.array(list(X.columns)) 

-

162 columns = [] 

-

163 for i, model in enumerate(models): 

-

164 col = str(model).split('(')[0] 

-

165 columns.append(col + '_' + str(i)) 

-

166 return pd.DataFrame( 

-

167 columns=columns, index=index, dtype=np.float64) 

-

168 

-

169 @staticmethod 

-

170 def clean_feature_importances_frame(feature_importances): 

-

171 feature_importances = MinMaxScaler( 

-

172 ).fit_transform(feature_importances) 

-

173 feature_importances_sum = feature_importances.sum(1) 

-

174 feature_importances_count = (feature_importances != 0).sum(1) 

-

175 feature_importances['sum'] = feature_importances_sum 

-

176 feature_importances['count'] = feature_importances_count 

-

177 feature_importances.sort_values( 

-

178 by=['count', 'sum'], ascending=False, inplace=True) 

-

179 return feature_importances 

-
- + diff --git a/cov_html/d_77d5126526bda421_supervized_correlation_filter_py.html b/cov_html/d_77d5126526bda421_supervized_correlation_filter_py.html new file mode 100644 index 00000000..10770064 --- /dev/null +++ b/cov_html/d_77d5126526bda421_supervized_correlation_filter_py.html @@ -0,0 +1,197 @@ + + + + + + Coverage for gators/feature_selection/supervized_correlation_filter.py: 100% + + + + + +
+
+

+ Coverage for gators/feature_selection/supervized_correlation_filter.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 36 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import pandas as pd 

+

3 

+

4from ..util import util 

+

5from ._base_feature_selection import _BaseFeatureSelection 

+

6 

+

7from gators import DataFrame, Series 

+

8 

+

9 

+

10class SupervizedCorrelationFilter(_BaseFeatureSelection): 

+

11 """Remove highly correlated columns. 

+

12 

+

13 Select the features based on the highest feature importance. 

+

14 

+

15 Parameters 

+

16 ---------- 

+

17 feature_importances: Series 

+

18 Feature importances. 

+

19 max_corr : float 

+

20 Max correlation value tolerated between two columns. 

+

21 method: str or callable 

+

22 Method of correlation: 

+

23 

+

24 * pearson : standard correlation coefficient 

+

25 * kendall : Kendall Tau correlation coefficient 

+

26 * spearman : Spearman rank correlation 

+

27 

+

28 Examples 

+

29 --------- 

+

30 Imports and initialization: 

+

31 

+

32 >>> from gators.feature_selection import SupervizedCorrelationFilter 

+

33 >>> feature_importances = pd.Series({'A': 0.1, 'B': 0.7, 'C':0.9}) 

+

34 >>> obj = SupervizedCorrelationFilter(max_corr=0.9, feature_importances=feature_importances) 

+

35 

+

36 The `fit`, `transform`, and `fit_transform` methods accept: 

+

37 

+

38 * `dask` dataframes: 

+

39 

+

40 >>> import dask.dataframe as dd 

+

41 >>> import pandas as pd 

+

42 >>> X = dd.from_pandas(pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}), npartitions=1) 

+

43 

+

44 * `koalas` dataframes: 

+

45 

+

46 >>> import databricks.koalas as ks 

+

47 >>> X = ks.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

+

48 

+

49 * and `pandas` dataframes: 

+

50 

+

51 >>> import pandas as pd 

+

52 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

+

53 

+

54 The result is a transformed dataframe belonging to the same dataframe library. 

+

55 

+

56 >>> obj.fit_transform(X) 

+

57 B C 

+

58 0 1.0 0.00 

+

59 1 2.0 0.00 

+

60 2 3.0 0.15 

+

61 

+

62 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

+

63 >>> _ = obj.fit(X) 

+

64 >>> obj.transform_numpy(X.to_numpy()) 

+

65 array([[1. , 0. ], 

+

66 [2. , 0. ], 

+

67 [3. , 0.15]]) 

+

68 """ 

+

69 

+

70 def __init__( 

+

71 self, feature_importances: Series, max_corr: float, method: str = "pearson" 

+

72 ): 

+

73 if "Series" not in str(type(feature_importances)): 

+

74 raise TypeError( 

+

75 "`feature_importances` should be a pandas, dask, or koalas Series." 

+

76 ) 

+

77 if not isinstance(max_corr, float): 

+

78 raise TypeError("`max_corr` should be a float.") 

+

79 _BaseFeatureSelection.__init__(self) 

+

80 self.max_corr = max_corr 

+

81 self.method = method 

+

82 self.feature_importances = util.get_function(feature_importances).to_pandas( 

+

83 feature_importances 

+

84 ) 

+

85 

+

86 def fit(self, X: DataFrame, y: Series = None) -> "SupervizedCorrelationFilter": 

+

87 """Fit the transformer on the dataframe `X`. 

+

88 

+

89 Parameters 

+

90 ---------- 

+

91 X : DataFrame. 

+

92 Input dataframe. 

+

93 y : Series, default None. 

+

94 Target values. 

+

95 

+

96 Returns 

+

97 ------- 

+

98 self : "CorrelationFilter" 

+

99 Instance of itself. 

+

100 """ 

+

101 self.check_dataframe(X) 

+

102 columns = X.columns 

+

103 corr = util.get_function(X).to_pandas(X.corr()).abs() 

+

104 self.columns_to_drop = [] 

+

105 for i in range(len(columns)): 

+

106 for j in range(i + 1): 

+

107 item = corr.iloc[j : (j + 1), (i + 1) : (i + 2)] 

+

108 col = item.columns 

+

109 row = item.index 

+

110 val = item.values 

+

111 if val >= self.max_corr: 

+

112 col_value_corr = self.feature_importances[col.values[0]] 

+

113 row_value_corr = self.feature_importances[row.values[0]] 

+

114 if col_value_corr < row_value_corr: 

+

115 self.columns_to_drop.append(col.values[0]) 

+

116 else: 

+

117 self.columns_to_drop.append(row.values[0]) 

+

118 

+

119 self.columns_to_drop = list(set(self.columns_to_drop)) 

+

120 self.selected_columns = [c for c in columns if c not in self.columns_to_drop] 

+

121 self.feature_importances_ = pd.Series( 

+

122 1.0, index=self.selected_columns, dtype=float 

+

123 ) 

+

124 self.idx_selected_columns = util.get_idx_columns( 

+

125 X.columns, self.selected_columns 

+

126 ) 

+

127 return self 

+
+ + + diff --git a/cov_html/d_77d5126526bda421_variance_filter_py.html b/cov_html/d_77d5126526bda421_variance_filter_py.html index d5701db3..cccf1de3 100644 --- a/cov_html/d_77d5126526bda421_variance_filter_py.html +++ b/cov_html/d_77d5126526bda421_variance_filter_py.html @@ -6,167 +6,155 @@ Coverage for gators/feature_selection/variance_filter.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_feature_selection import _BaseFeatureSelection 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class VarianceFilter(_BaseFeatureSelection): 

-

10 """Remove low variance columns. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 min_var : float 

-

15 Variance threshold. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with `pandas` 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.feature_selection import VarianceFilter 

-

23 >>> X = pd.DataFrame( 

-

24 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

25 >>> obj = VarianceFilter(min_var=0.9) 

-

26 >>> obj.fit_transform(X) 

-

27 B 

-

28 0 1.0 

-

29 1 2.0 

-

30 2 3.0 

-

31 

-

32 * fit & transform with `koalas` 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.feature_selection import VarianceFilter 

-

36 >>> X = pd.DataFrame( 

-

37 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

38 >>> obj = VarianceFilter(min_var=0.9) 

-

39 >>> obj.fit_transform(X) 

-

40 B 

-

41 0 1.0 

-

42 1 2.0 

-

43 2 3.0 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_selection import VarianceFilter 

-

49 >>> X = pd.DataFrame( 

-

50 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

51 >>> obj = VarianceFilter(min_var=0.9) 

-

52 >>> _ = obj.fit(X) 

-

53 >>> obj.transform_numpy(X.to_numpy()) 

-

54 array([[1.], 

-

55 [2.], 

-

56 [3.]]) 

-

57 

-

58 * fit with `koalas` & transform with `NumPy` 

-

59 

-

60 >>> import databricks.koalas as ks 

-

61 >>> from gators.feature_selection import VarianceFilter 

-

62 >>> X = ks.DataFrame( 

-

63 ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

64 >>> obj = VarianceFilter(min_var=0.9) 

-

65 >>> _ = obj.fit(X) 

-

66 >>> obj.transform_numpy(X.to_numpy()) 

-

67 array([[1.], 

-

68 [2.], 

-

69 [3.]]) 

-

70 

-

71 """ 

-

72 

-

73 def __init__(self, min_var: float): 

-

74 if not isinstance(min_var, float): 

-

75 raise TypeError('`min_var` should be a float.') 

-

76 _BaseFeatureSelection.__init__(self) 

-

77 self.min_var = min_var 

-

78 

-

79 def fit(self, 

-

80 X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'VarianceFilter': 

-

82 """Fit the transformer on the dataframe `X`. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 VarianceFilter: Instance of itself. 

-

94 """ 

-

95 self.check_dataframe(X) 

-

96 numerical_columns = util.get_numerical_columns(X) 

-

97 self.feature_importances_ = X[numerical_columns].var() 

-

98 if isinstance(self.feature_importances_, ks.Series): 

-

99 self.feature_importances_ = self.feature_importances_.to_pandas() 

-

100 mask = self.feature_importances_ < self.min_var 

-

101 self.columns_to_drop = list(self.feature_importances_.index[mask]) 

-

102 self.selected_columns = util.exclude_columns( 

-

103 X.columns, self.columns_to_drop 

-

104 ) 

-

105 self.idx_selected_columns = util.get_idx_columns( 

-

106 X.columns, self.selected_columns) 

-

107 return self 

-
- + diff --git a/cov_html/d_8813d29e2db35b41__base_imputer_py.html b/cov_html/d_8813d29e2db35b41__base_imputer_py.html index 81c9b6f2..8a7b4818 100644 --- a/cov_html/d_8813d29e2db35b41__base_imputer_py.html +++ b/cov_html/d_8813d29e2db35b41__base_imputer_py.html @@ -6,177 +6,185 @@ Coverage for gators/imputers/_base_imputer.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from typing import List, Dict, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class _BaseImputer(Transformer): 

-

10 """Base imputer transformer class. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 strategy : str 

-

15 Imputation strategy. The possible values are: 

-

16 

-

17 * constant 

-

18 * most_frequent (only for the FloatImputer class) 

-

19 * mean (only for the FloatImputer class) 

-

20 * median (only for the FloatImputer class) 

-

21 

-

22 value (Union[float, str, None]): Imputation value, default to None. 

-

23 used for `strategy=constant`. 

-

24 columns: List[str], default to None. 

-

25 List of columns. 

-

26 

-

27 """ 

-

28 

-

29 def __init__(self, strategy: str, 

-

30 value: Union[float, str, None], 

-

31 columns: List[str]): 

-

32 if not isinstance(strategy, str): 

-

33 raise TypeError('`strategy` should be a string.') 

-

34 if strategy == 'constant' and value is None: 

-

35 raise ValueError( 

-

36 'if `strategy` is "constant", `value` should not be None.') 

-

37 if strategy not in ['constant', 'mean', 'median', 'most_frequent']: 

-

38 raise ValueError('Imputation `strategy` not implemented.') 

-

39 if not isinstance(columns, list) and columns is not None: 

-

40 raise TypeError('`columns` should be a list or None.') 

-

41 

-

42 Transformer.__init__(self) 

-

43 self.strategy = strategy 

-

44 self.value = value 

-

45 self.columns = columns 

-

46 self.statistics: Dict = {} 

-

47 self.statistics_values: np.ndarray = None 

-

48 self.idx_columns: np.ndarray = None 

-

49 self.X_dtypes: Union[pd.Series, ks.Series] = None 

-

50 

-

51 def transform( 

-

52 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

53 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

54 """Transform the dataframe `X`. 

-

55 

-

56 Parameters 

-

57 ---------- 

-

58 X : Union[pd.DataFrame, ks.DataFrame]. 

-

59 Input dataframe. 

-

60 

-

61 Returns 

-

62 ------- 

-

63 Union[pd.DataFrame, ks.DataFrame] 

-

64 Transformed dataframe. 

-

65 """ 

-

66 self.check_dataframe(X) 

-

67 if isinstance(X, pd.DataFrame): 

-

68 return X.fillna(self.statistics) 

-

69 for col, val in self.statistics.items(): 

-

70 X[col] = X[col].fillna(val) 

-

71 return X 

-

72 

-

73 @staticmethod 

-

74 def compute_statistics( 

-

75 X: Union[pd.DataFrame, ks.DataFrame], columns: List[str], 

-

76 strategy: str, 

-

77 value: Union[float, int, str, None] 

-

78 ) -> Dict[str, Union[float, int, str]]: 

-

79 """Compute the imputation values. 

-

80 

-

81 Parameters 

-

82 ---------- 

-

83 X : Union[pd.DataFrame, ks.DataFrame] 

-

84 Dataframe used to compute the imputation values. 

-

85 columns : List[str] 

-

86 Columns to consider. 

-

87 strategy : str 

-

88 Imputation strategy. 

-

89 value : Union[float, int, str, None] 

-

90 Value used for imputation. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Dict[str, Union[float, int, str]] 

-

95 Imputation value mapping. 

-

96 """ 

-

97 if strategy == 'mean': 

-

98 statistics = X[columns].astype(np.float64).mean().to_dict() 

-

99 elif strategy == 'median': 

-

100 statistics = X[columns].astype(np.float64).median().to_dict() 

-

101 elif strategy == 'most_frequent': 

-

102 values = [ 

-

103 X[c].value_counts().index.to_numpy()[0] 

-

104 for c in columns 

-

105 ] 

-

106 statistics = dict(zip(columns, values)) 

-

107 else: # strategy == 'constant' 

-

108 values = len(columns) * [value] 

-

109 statistics = dict(zip(columns, values)) 

-

110 if pd.Series(statistics).isnull().sum(): 

-

111 raise ValueError( 

-

112 '''Some columns contains only NaN values and the 

-

113 imputation values cannot be calculated. 

-

114 Remove these columns 

-

115 before performing the imputation 

-

116 (e.g. with `gators.data_cleaning.drop_high_nan_ratio()`).''') 

-

117 return statistics 

-
- + diff --git a/cov_html/d_8813d29e2db35b41_float_imputer_py.html b/cov_html/d_8813d29e2db35b41_float_imputer_py.html deleted file mode 100644 index e9c8dcd8..00000000 --- a/cov_html/d_8813d29e2db35b41_float_imputer_py.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - Coverage for gators/imputers/float_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import float_imputer_object 

-

4from imputer import float_imputer 

-

5from ..util import util 

-

6import numpy as np 

-

7from typing import List, Union 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10import warnings 

-

11 

-

12 

-

13class FloatImputer(_BaseImputer): 

-

14 """Impute the numerical columns satisfying the condition X != X.round() 

-

15 using the strategy passed by the user. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 strategy : str 

-

20 Imputation strategy. 

-

21 

-

22 Supported imputation strategies are: 

-

23 

-

24 - 'constant' 

-

25 - 'mean' 

-

26 - 'median' 

-

27 

-

28 value : str, default to None. 

-

29 Imputation value used for `strategy=constant`. 

-

30 

-

31 columns: List[str], default to None. 

-

32 List of columns. 

-

33 

-

34 Examples 

-

35 --------- 

-

36 

-

37 * fit & transform with `pandas` 

-

38 

-

39 >>> import pandas as pd 

-

40 >>> import numpy as np 

-

41 >>> from gators.imputers import FloatImputer 

-

42 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

43 >>> obj = FloatImputer(strategy='median') 

-

44 >>> obj.fit_transform(X) 

-

45 A B 

-

46 0 0.10 z 

-

47 1 0.20 a 

-

48 2 0.15 a 

-

49 

-

50 * fit & transform with `koalas` 

-

51 

-

52 >>> import databricks.koalas as ks 

-

53 >>> import numpy as np 

-

54 >>> from gators.imputers import FloatImputer 

-

55 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

56 >>> obj = FloatImputer(strategy='median') 

-

57 >>> obj.fit_transform(X) 

-

58 A B 

-

59 0 0.1 z 

-

60 1 0.2 a 

-

61 2 0.1 a 

-

62 

-

63 * fit & transform with `pandas` 

-

64 

-

65 >>> import pandas as pd 

-

66 >>> import numpy as np 

-

67 >>> from gators.imputers import FloatImputer 

-

68 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

69 >>> obj = FloatImputer(strategy='median') 

-

70 >>> _ = obj.fit(X) 

-

71 >>> obj.transform_numpy(X.to_numpy()) 

-

72 array([[0.1, 'z'], 

-

73 [0.2, 'a'], 

-

74 [0.15000000000000002, 'a']], dtype=object) 

-

75 

-

76 * fit with `koalas` & transform with `NumPy` 

-

77 

-

78 >>> import databricks.koalas as ks 

-

79 >>> import numpy as np 

-

80 >>> from gators.imputers import FloatImputer 

-

81 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

82 >>> obj = FloatImputer(strategy='median') 

-

83 >>> _ = obj.fit(X) 

-

84 >>> obj.transform_numpy(X.to_numpy()) 

-

85 array([[0.1, 'z'], 

-

86 [0.2, 'a'], 

-

87 [0.1, 'a']], dtype=object) 

-

88 

-

89 See Also 

-

90 -------- 

-

91 gators.imputers.IntImputer 

-

92 Impute integer columns. 

-

93 gators.imputers.NumericsImputer 

-

94 Impute numerical columns. 

-

95 gators.imputers.ObjectImputer 

-

96 Impute categorical columns. 

-

97 

-

98 """ 

-

99 

-

100 def __init__(self, strategy: str, 

-

101 value: float = None, 

-

102 columns: List[str] = None): 

-

103 _BaseImputer.__init__(self, strategy, value, columns) 

-

104 if strategy not in ['constant', 'mean', 'median']: 

-

105 raise ValueError( 

-

106 '''`strategy` should be "constant", ,"mean" 

-

107 or "median" for FloatImputer Transformer.''') 

-

108 if strategy == 'constant' and not isinstance(value, float): 

-

109 raise TypeError( 

-

110 '''`value` should be a float 

-

111 for the FloatImputer class''') 

-

112 

-

113 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

114 y: Union[pd.Series, ks.Series] = None) -> 'FloatImputer': 

-

115 """Fit the transformer on the pandas/koalas dataframe X. 

-

116 

-

117 Parameters 

-

118 ---------- 

-

119 X : Union[pd.DataFrame, ks.DataFrame]. 

-

120 Input dataframe. 

-

121 y : None 

-

122 None. 

-

123 

-

124 Returns 

-

125 ------- 

-

126 'FloatImputer': Instance of itself. 

-

127 """ 

-

128 self.check_dataframe(X) 

-

129 if not self.columns: 

-

130 self.columns = util.get_float_only_columns(X=X) 

-

131 if not self.columns: 

-

132 warnings.warn( 

-

133 '''`X` does not contain columns satisfying: 

-

134 X[column] != X[column].round(), 

-

135 `FloatImputer` is not needed''') 

-

136 self.idx_columns = np.array([]) 

-

137 return self 

-

138 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

139 self.statistics = self.compute_statistics( 

-

140 X=X, 

-

141 columns=self.columns, 

-

142 strategy=self.strategy, 

-

143 value=self.value, 

-

144 ) 

-

145 self.statistics_values = np.array( 

-

146 list(self.statistics.values())) 

-

147 return self 

-

148 

-

149 def transform( 

-

150 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

151 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

152 """Transform the dataframe `X`. 

-

153 

-

154 Parameters 

-

155 ---------- 

-

156 X : Union[pd.DataFrame, ks.DataFrame]. 

-

157 Input dataframe. 

-

158 

-

159 Returns 

-

160 ------- 

-

161 Union[pd.DataFrame, ks.DataFrame] 

-

162 Transformed dataframe. 

-

163 """ 

-

164 self.check_dataframe(X) 

-

165 if isinstance(X, pd.DataFrame): 

-

166 return X.fillna(self.statistics) 

-

167 for col, val in self.statistics.items(): 

-

168 X[col] = X[col].replace({np.nan: val}) 

-

169 return X 

-

170 

-

171 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

172 """Transform the numpy ndarray X. 

-

173 

-

174 Parameters 

-

175 ---------- 

-

176 X (np.ndarray): Input ndarray. 

-

177 

-

178 Returns 

-

179 ------- 

-

180 np.ndarray: 

-

181 Transformed NumPy array. 

-

182 """ 

-

183 self.check_array(X) 

-

184 if self.idx_columns.size == 0: 

-

185 return X 

-

186 if X.dtype == object: 

-

187 return float_imputer_object( 

-

188 X, 

-

189 self.statistics_values.astype(object), 

-

190 self.idx_columns) 

-

191 return float_imputer( 

-

192 X, 

-

193 self.statistics_values, 

-

194 self.idx_columns) 

-
- - - diff --git a/cov_html/d_8813d29e2db35b41_int_imputer_py.html b/cov_html/d_8813d29e2db35b41_int_imputer_py.html deleted file mode 100644 index a6e0174f..00000000 --- a/cov_html/d_8813d29e2db35b41_int_imputer_py.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - Coverage for gators/imputers/int_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import float_imputer_object 

-

4from imputer import float_imputer 

-

5from ..util import util 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10import warnings 

-

11 

-

12 

-

13class IntImputer(_BaseImputer): 

-

14 """Impute the numerical columns satisfying the condition X == X.round() 

-

15 using the strategy passed by the user. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 strategy : str 

-

20 Imputation strategy. 

-

21 

-

22 Supported imputation strategies are: 

-

23 

-

24 - 'constant' 

-

25 - 'most_frequent' 

-

26 - 'mean' 

-

27 - 'median' 

-

28 

-

29 value : str, default to None. 

-

30 Imputation value used for `strategy=constant`. 

-

31 

-

32 columns: List[str], default to None. 

-

33 List of columns. 

-

34 

-

35 Examples 

-

36 --------- 

-

37 

-

38 * fit & transform with `pandas` 

-

39 

-

40 >>> import pandas as pd 

-

41 >>> import numpy as np 

-

42 >>> from gators.imputers import IntImputer 

-

43 >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

44 >>> obj = IntImputer(strategy='constant', value=-999) 

-

45 >>> obj.fit_transform(X) 

-

46 A B 

-

47 0 1.0 z 

-

48 1 2.0 a 

-

49 2 -999.0 a 

-

50 

-

51 * fit & transform with `koalas` 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> import numpy as np 

-

55 >>> from gators.imputers import IntImputer 

-

56 >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

57 >>> obj = IntImputer(strategy='constant', value=-999) 

-

58 >>> obj.fit_transform(X) 

-

59 A B 

-

60 0 1.0 z 

-

61 1 2.0 a 

-

62 2 -999.0 a 

-

63 

-

64 * fit with `pandas` & transform with `NumPy` 

-

65 

-

66 >>> import pandas as pd 

-

67 >>> import numpy as np 

-

68 >>> from gators.imputers import IntImputer 

-

69 >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

70 >>> obj = IntImputer(strategy='constant', value=-999) 

-

71 >>> _ = obj.fit(X) 

-

72 >>> obj.transform_numpy(X.to_numpy()) 

-

73 array([[1.0, 'z'], 

-

74 [2.0, 'a'], 

-

75 [-999.0, 'a']], dtype=object) 

-

76 

-

77 * fit with `koalas` & transform with `NumPy` 

-

78 

-

79 >>> import databricks.koalas as ks 

-

80 >>> import numpy as np 

-

81 >>> from gators.imputers import IntImputer 

-

82 >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

83 >>> obj = IntImputer(strategy='constant', value=-999) 

-

84 >>> _ = obj.fit(X) 

-

85 >>> obj.transform_numpy(X.to_numpy()) 

-

86 array([[1.0, 'z'], 

-

87 [2.0, 'a'], 

-

88 [-999.0, 'a']], dtype=object) 

-

89 

-

90 See Also 

-

91 -------- 

-

92 gators.imputers.FloatImputer 

-

93 Impute float columns. 

-

94 gators.imputers.NumericsImputer 

-

95 Impute numerical columns. 

-

96 gators.imputers.ObjectImputer 

-

97 Impute categorical columns. 

-

98 

-

99 """ 

-

100 

-

101 def __init__(self, strategy: str, 

-

102 value: float = None, 

-

103 columns: List[str] = None): 

-

104 _BaseImputer.__init__(self, strategy, value, columns) 

-

105 if strategy == 'constant' and not isinstance(value, int): 

-

106 raise TypeError( 

-

107 '''`value` should be a integer 

-

108 for the IntImputer class''') 

-

109 self.columns = columns 

-

110 

-

111 def fit(self, 

-

112 X: Union[pd.DataFrame, ks.DataFrame], 

-

113 y: Union[pd.Series, ks.Series] = None) -> 'IntImputer': 

-

114 """Fit the transformer on the dataframe `X`. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : Union[pd.DataFrame, ks.DataFrame]. 

-

119 Input dataframe. 

-

120 y : None 

-

121 None. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 Imputer: Instance of itself. 

-

126 """ 

-

127 self.check_dataframe(X) 

-

128 if not self.columns: 

-

129 self.columns = util.get_int_only_columns(X=X) 

-

130 if not self.columns: 

-

131 warnings.warn( 

-

132 '''`X` does not contain columns satisfying: 

-

133 X[column] == X[column].round(), 

-

134 `IntImputer` is not needed''') 

-

135 self.idx_columns = np.array([]) 

-

136 return self 

-

137 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

138 self.statistics = self.compute_statistics( 

-

139 X=X, 

-

140 columns=self.columns, 

-

141 strategy=self.strategy, 

-

142 value=self.value, 

-

143 ) 

-

144 self.statistics_values = np.array( 

-

145 list(self.statistics.values())).astype(np.float64) 

-

146 return self 

-

147 

-

148 def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): 

-

149 """Transform the numpy ndarray X. 

-

150 

-

151 Parameters 

-

152 ---------- 

-

153 X (np.ndarray): Input ndarray. 

-

154 

-

155 Returns 

-

156 ------- 

-

157 np.ndarray: Imputed ndarray. 

-

158 """ 

-

159 self.check_array(X) 

-

160 if self.idx_columns.size == 0: 

-

161 return X 

-

162 X_dtype = X.dtype 

-

163 if 'int' in str(X_dtype): 

-

164 return X 

-

165 elif X_dtype == object: 

-

166 return float_imputer_object( 

-

167 X, 

-

168 self.statistics_values.astype(object), 

-

169 self.idx_columns) 

-

170 else: 

-

171 return float_imputer( 

-

172 X, 

-

173 self.statistics_values, 

-

174 self.idx_columns) 

-
- - - diff --git a/cov_html/d_8813d29e2db35b41_numeric_imputer_py.html b/cov_html/d_8813d29e2db35b41_numeric_imputer_py.html new file mode 100644 index 00000000..f1a7c49a --- /dev/null +++ b/cov_html/d_8813d29e2db35b41_numeric_imputer_py.html @@ -0,0 +1,260 @@ + + + + + + Coverage for gators/imputers/numeric_imputer.py: 100% + + + + + +
+
+

+ Coverage for gators/imputers/numeric_imputer.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 39 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import warnings 

+

3from typing import List 

+

4 

+

5import numpy as np 

+

6 

+

7from imputer import float_imputer 

+

8 

+

9from ..util import util 

+

10from ._base_imputer import _BaseImputer 

+

11 

+

12from gators import DataFrame, Series 

+

13 

+

14 

+

15class NumericImputer(_BaseImputer): 

+

16 """Impute the numerical columns using the strategy passed by the user. 

+

17 

+

18 Parameters 

+

19 ---------- 

+

20 strategy : str 

+

21 Imputation strategy. 

+

22 

+

23 Supported imputation strategies are: 

+

24 

+

25 - 'constant' 

+

26 - 'mean' 

+

27 - 'median' 

+

28 

+

29 value : str, default None. 

+

30 Imputation value used for `strategy=constant`. 

+

31 inplace : bool, default True. 

+

32 If True, impute in-place. 

+

33 If False, create new imputed columns. 

+

34 

+

35 Examples 

+

36 --------- 

+

37 

+

38 >>> from gators.imputers import NumericImputer 

+

39 

+

40 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

+

41 

+

42 The imputation can be done for the selected numerical columns 

+

43 

+

44 >>> obj = NumericImputer(strategy='mean', columns=['A']) 

+

45 

+

46 or for all the numerical columns 

+

47 

+

48 >>> obj = NumericImputer(strategy='mean') 

+

49 

+

50 The `fit`, `transform`, and `fit_transform` methods accept: 

+

51 

+

52 * `dask` dataframes: 

+

53 

+

54 >>> import dask.dataframe as dd 

+

55 >>> import pandas as pd 

+

56 >>> import numpy as np 

+

57 >>> X = dd.from_pandas(pd.DataFrame( 

+

58 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}), npartitions=1) 

+

59 

+

60 * `koalas` dataframes: 

+

61 

+

62 >>> import databricks.koalas as ks 

+

63 >>> import numpy as np 

+

64 >>> X = ks.DataFrame( 

+

65 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) 

+

66 

+

67 * and `pandas` dataframes: 

+

68 

+

69 >>> import pandas as pd 

+

70 >>> import numpy as np 

+

71 >>> X = pd.DataFrame( 

+

72 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) 

+

73 

+

74 The result is a transformed dataframe belonging to the same dataframe library. 

+

75 

+

76 * imputation done for the selected columns: 

+

77 

+

78 >>> obj = NumericImputer(strategy='mean', columns=['A']) 

+

79 >>> obj.fit_transform(X) 

+

80 A B C 

+

81 0 0.10 1.0 z 

+

82 1 0.20 2.0 a 

+

83 2 0.15 NaN a 

+

84 

+

85 * imputation done for all the columns: 

+

86 

+

87 >>> X = pd.DataFrame( 

+

88 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) 

+

89 >>> obj = NumericImputer(strategy='mean') 

+

90 >>> obj.fit_transform(X) 

+

91 A B C 

+

92 0 0.10 1.0 z 

+

93 1 0.20 2.0 a 

+

94 2 0.15 1.5 a 

+

95 

+

96 

+

97 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

98 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

99 when the number of rows is small *e.g.* in real-time environment. 

+

100 

+

101 >>> X = pd.DataFrame( 

+

102 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) 

+

103 >>> obj.transform_numpy(X.to_numpy()) 

+

104 array([[0.1, 1.0, 'z'], 

+

105 [0.2, 2.0, 'a'], 

+

106 [0.15000000000000002, 1.5, 'a']], dtype=object) 

+

107 

+

108 See Also 

+

109 -------- 

+

110 gators.imputers.ObjectImputer 

+

111 Impute categorical columns. 

+

112 """ 

+

113 

+

114 def __init__( 

+

115 self, 

+

116 strategy: str, 

+

117 value: float = None, 

+

118 columns: List[str] = None, 

+

119 inplace: bool = True, 

+

120 ): 

+

121 _BaseImputer.__init__(self, strategy, value, columns=columns, inplace=inplace) 

+

122 if strategy == "constant" and not isinstance(self.value, (int, float)): 

+

123 raise TypeError( 

+

124 """`value` should be an int or a float 

+

125 for the NumericImputer class""" 

+

126 ) 

+

127 self.value = float(self.value) if self.value is not None else None 

+

128 

+

129 def fit(self, X: DataFrame, y: Series = None) -> "NumericImputer": 

+

130 """Fit the transformer on the pandas/koalas dataframe X. 

+

131 

+

132 Parameters 

+

133 ---------- 

+

134 X : DataFrame. 

+

135 Input dataframe. 

+

136 y : Series, default None. 

+

137 Target values. 

+

138 

+

139 Returns 

+

140 ------- 

+

141 self : 'NumericImputer' 

+

142 Instance of itself. 

+

143 """ 

+

144 self.check_dataframe(X) 

+

145 self.base_columns = list(X.columns) 

+

146 if not self.columns: 

+

147 self.columns = util.get_datatype_columns(X, float) 

+

148 self.columns += util.get_datatype_columns(X, int) 

+

149 self.column_names = self.get_column_names(self.inplace, self.columns, "impute") 

+

150 if not self.columns: 

+

151 warnings.warn( 

+

152 """`X` does not contain numerical columns, 

+

153 `NumericImputer` is not needed""" 

+

154 ) 

+

155 self.idx_columns = np.array([]) 

+

156 return self 

+

157 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

+

158 self.statistics = self.compute_statistics(X=X, value=self.value) 

+

159 

+

160 self.statistics_np = np.array(list(self.statistics.values())) 

+

161 return self 

+

162 

+

163 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

164 """Transform the NumPy array X. 

+

165 

+

166 Parameters 

+

167 ---------- 

+

168 X :np.ndarray: 

+

169 Input array. 

+

170 

+

171 Returns 

+

172 ------- 

+

173 X : np.ndarray: 

+

174 Transformed array. 

+

175 """ 

+

176 self.check_array(X) 

+

177 if isinstance(X[0, 0], np.integer): 

+

178 return X 

+

179 if self.idx_columns.size == 0: 

+

180 return X 

+

181 if self.inplace: 

+

182 X[:, self.idx_columns] = float_imputer( 

+

183 X[:, self.idx_columns].astype(float), self.statistics_np 

+

184 ) 

+

185 return X 

+

186 else: 

+

187 X_impute = float_imputer( 

+

188 X[:, self.idx_columns].copy().astype(float), self.statistics_np 

+

189 ) 

+

190 return np.concatenate((X, X_impute), axis=1) 

+
+ + + diff --git a/cov_html/d_8813d29e2db35b41_numerics_imputer_py.html b/cov_html/d_8813d29e2db35b41_numerics_imputer_py.html index e505b138..2eab1109 100644 --- a/cov_html/d_8813d29e2db35b41_numerics_imputer_py.html +++ b/cov_html/d_8813d29e2db35b41_numerics_imputer_py.html @@ -3,269 +3,258 @@ - Coverage for gators/imputers/numerics_imputer.py: 100% + Coverage for gators/imputers/Numeric_imputer.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import float_imputer_object 

-

4from imputer import float_imputer 

-

5from ..util import util 

-

6import numpy as np 

-

7from typing import List, Union 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10import warnings 

-

11 

-

12 

-

13class NumericsImputer(_BaseImputer): 

-

14 """Impute the numerical columns using the strategy passed by the user. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 strategy : str 

-

19 Imputation strategy. 

-

20 

-

21 Supported imputation strategies are: 

-

22 

-

23 - 'constant' 

-

24 - 'mean' 

-

25 - 'median' 

-

26 

-

27 value : str, default to None. 

-

28 Imputation value used for `strategy=constant`. 

-

29 

-

30 Examples 

-

31 --------- 

-

32 

-

33 * fit & transform with `pandas` 

-

34 

-

35 - impute all the numerical columns 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> import numpy as np 

-

39 >>> from gators.imputers import NumericsImputer 

-

40 >>> X = pd.DataFrame( 

-

41 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) 

-

42 >>> obj = NumericsImputer(strategy='mean') 

-

43 >>> obj.fit_transform(X) 

-

44 A B C 

-

45 0 0.10 1.0 z 

-

46 1 0.20 2.0 a 

-

47 2 0.15 1.5 a 

-

48 

-

49 - impute selected numerical columns 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> import numpy as np 

-

53 >>> from gators.imputers import NumericsImputer 

-

54 >>> X = pd.DataFrame( 

-

55 ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) 

-

56 >>> obj = NumericsImputer(strategy='mean', columns=['A']) 

-

57 >>> obj.fit_transform(X) 

-

58 A B C 

-

59 0 0.10 1.0 z 

-

60 1 0.20 2.0 a 

-

61 2 0.15 NaN a 

-

62 

-

63 * fit & transform with `koalas` 

-

64 

-

65 >>> import databricks.koalas as ks 

-

66 >>> import numpy as np 

-

67 >>> from gators.imputers import NumericsImputer 

-

68 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

69 >>> obj = NumericsImputer(strategy='mean') 

-

70 >>> obj.fit_transform(X) 

-

71 A B 

-

72 0 0.10 z 

-

73 1 0.20 a 

-

74 2 0.15 a 

-

75 

-

76 * fit with `pandas` & transform with `NumPy` 

-

77 

-

78 >>> import pandas as pd 

-

79 >>> import numpy as np 

-

80 >>> from gators.imputers import NumericsImputer 

-

81 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

82 >>> obj = NumericsImputer(strategy='mean') 

-

83 >>> _ = obj.fit(X) 

-

84 >>> obj.transform_numpy(X.to_numpy()) 

-

85 array([[0.1, 'z'], 

-

86 [0.2, 'a'], 

-

87 [0.15000000000000002, 'a']], dtype=object) 

-

88 

-

89 * fit with `koalas` & transform with `NumPy` 

-

90 

-

91 >>> import databricks.koalas as ks 

-

92 >>> import numpy as np 

-

93 >>> from gators.imputers import NumericsImputer 

-

94 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

95 >>> obj = NumericsImputer(strategy='mean') 

-

96 >>> _ = obj.fit(X) 

-

97 >>> obj.transform_numpy(X.to_numpy()) 

-

98 array([[0.1, 'z'], 

-

99 [0.2, 'a'], 

-

100 [0.15000000000000002, 'a']], dtype=object) 

-

101 

-

102 See Also 

-

103 -------- 

-

104 gators.imputers.IntImputer 

-

105 Impute integer columns. 

-

106 gators.imputers.FloatImputer 

-

107 Impute float columns. 

-

108 gators.imputers.ObjectImputer 

-

109 Impute categorical columns. 

-

110 

-

111 """ 

-

112 

-

113 def __init__(self, strategy: str, 

-

114 value: float = None, 

-

115 columns: List[str] = None): 

-

116 _BaseImputer.__init__(self, strategy, value, columns) 

-

117 if strategy not in ['constant', 'mean', 'median']: 

-

118 raise ValueError( 

-

119 '''`strategy` should be "constant", ,"mean" 

-

120 or "median" for NumericsImputer Transformer.''') 

-

121 if strategy == 'constant' and not isinstance(value, float): 

-

122 raise TypeError( 

-

123 '''`value` should be a float 

-

124 for the NumericsImputer class''') 

-

125 

-

126 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

127 y: Union[pd.Series, ks.Series] = None) -> 'NumericsImputer': 

-

128 """Fit the transformer on the pandas/koalas dataframe X. 

-

129 

-

130 Parameters 

-

131 ---------- 

-

132 X : Union[pd.DataFrame, ks.DataFrame]. 

-

133 Input dataframe. 

-

134 y : None 

-

135 None. 

-

136 

-

137 Returns 

-

138 ------- 

-

139 'NumericsImputer': Instance of itself. 

-

140 """ 

-

141 self.check_dataframe(X) 

-

142 if not self.columns: 

-

143 self.columns = util.get_datatype_columns(X, float) 

-

144 if not self.columns: 

-

145 warnings.warn( 

-

146 '''`X` does not contain numerical columns, 

-

147 `NumericsImputer` is not needed''') 

-

148 self.idx_columns = np.array([]) 

-

149 return self 

-

150 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

151 self.statistics = self.compute_statistics( 

-

152 X=X, 

-

153 columns=self.columns, 

-

154 strategy=self.strategy, 

-

155 value=self.value, 

-

156 ) 

-

157 self.statistics_values = np.array( 

-

158 list(self.statistics.values())) 

-

159 return self 

-

160 

-

161 def transform( 

-

162 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

163 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

164 """Transform the dataframe `X`. 

-

165 

-

166 Parameters 

-

167 ---------- 

-

168 X : Union[pd.DataFrame, ks.DataFrame]. 

-

169 Input dataframe. 

-

170 

-

171 Returns 

-

172 ------- 

-

173 Union[pd.DataFrame, ks.DataFrame] 

-

174 Transformed dataframe. 

-

175 """ 

-

176 self.check_dataframe(X) 

-

177 if isinstance(X, pd.DataFrame): 

-

178 return X.fillna(self.statistics) 

-

179 for col, val in self.statistics.items(): 

-

180 X[col] = X[col].replace({np.nan: val}) 

-

181 return X 

-

182 

-

183 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

184 """Transform the numpy ndarray X. 

-

185 

-

186 Parameters 

-

187 ---------- 

-

188 X (np.ndarray): Input ndarray. 

-

189 

-

190 Returns 

-

191 ------- 

-

192 np.ndarray: 

-

193 Transformed NumPy array. 

-

194 """ 

-

195 self.check_array(X) 

-

196 if self.idx_columns.size == 0: 

-

197 return X 

-

198 if X.dtype == object: 

-

199 return float_imputer_object( 

-

200 X, 

-

201 self.statistics_values.astype(object), 

-

202 self.idx_columns) 

-

203 return float_imputer( 

-

204 X, 

-

205 self.statistics_values, 

-

206 self.idx_columns) 

-
- + diff --git a/cov_html/d_8813d29e2db35b41_object_imputer_py.html b/cov_html/d_8813d29e2db35b41_object_imputer_py.html index 1f2444f6..f2eb5d35 100644 --- a/cov_html/d_8813d29e2db35b41_object_imputer_py.html +++ b/cov_html/d_8813d29e2db35b41_object_imputer_py.html @@ -6,247 +6,256 @@ Coverage for gators/imputers/object_imputer.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import object_imputer 

-

4from ..util import util 

-

5from typing import Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9import warnings 

-

10 

-

11 

-

12class ObjectImputer(_BaseImputer): 

-

13 """Impute the categorical columns using the strategy passed by the user. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 strategy : str 

-

18 Imputation strategy. 

-

19 

-

20 Supported imputation strategies are: 

-

21 

-

22 - 'constant' 

-

23 - 'most_frequent' 

-

24 

-

25 value : str, default to None. 

-

26 Imputation value used for `strategy=constant`. 

-

27 

-

28 Examples 

-

29 --------- 

-

30 

-

31 * fit & transform with `pandas` 

-

32 

-

33 - impute all the object columns 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> import numpy as np 

-

37 >>> from gators.imputers import ObjectImputer 

-

38 >>> X = pd.DataFrame( 

-

39 ... {'A': ['a', 'b', 'a', None], 

-

40 ... 'B': ['c', 'c', 'd', None], 

-

41 ... 'C': [0, 1, 2, np.nan]}) 

-

42 >>> obj = ObjectImputer(strategy='most_frequent') 

-

43 >>> obj.fit_transform(X) 

-

44 A B C 

-

45 0 a c 0.0 

-

46 1 b c 1.0 

-

47 2 a d 2.0 

-

48 3 a c NaN 

-

49 

-

50 - impute selected object columns 

-

51 

-

52 >>> import pandas as pd 

-

53 >>> import numpy as np 

-

54 >>> from gators.imputers import ObjectImputer 

-

55 >>> X = pd.DataFrame( 

-

56 ... {'A': ['a', 'b', 'a', None], 

-

57 ... 'B': ['c', 'c', 'd', None], 

-

58 ... 'C': [0, 1, 2, np.nan]}) 

-

59 >>> obj = ObjectImputer(strategy='most_frequent', columns=['A']) 

-

60 >>> obj.fit_transform(X) 

-

61 A B C 

-

62 0 a c 0.0 

-

63 1 b c 1.0 

-

64 2 a d 2.0 

-

65 3 a None NaN 

-

66 

-

67 

-

68 * fit & transform with `koalas` 

-

69 

-

70 >>> import databricks.koalas as ks 

-

71 >>> import numpy as np 

-

72 >>> from gators.imputers import ObjectImputer 

-

73 >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

74 >>> obj = ObjectImputer(strategy='most_frequent') 

-

75 >>> obj.fit_transform(X) 

-

76 A B 

-

77 0 a 0.0 

-

78 1 b 1.0 

-

79 2 a 2.0 

-

80 3 a NaN 

-

81 

-

82 * fit with `pandas` & transform with `NumPy` 

-

83 

-

84 >>> import pandas as pd 

-

85 >>> import numpy as np 

-

86 >>> from gators.imputers import ObjectImputer 

-

87 >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

88 >>> obj = ObjectImputer(strategy='most_frequent') 

-

89 >>> _ = obj.fit(X) 

-

90 >>> obj.transform_numpy(X.to_numpy()) 

-

91 array([['a', 0.0], 

-

92 ['b', 1.0], 

-

93 ['a', 2.0], 

-

94 ['a', nan]], dtype=object) 

-

95 

-

96 * fit with `koalas` & transform with `NumPy` 

-

97 

-

98 >>> import databricks.koalas as ks 

-

99 >>> import numpy as np 

-

100 >>> from gators.imputers import ObjectImputer 

-

101 >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

102 >>> obj = ObjectImputer(strategy='most_frequent') 

-

103 >>> _ = obj.fit(X) 

-

104 >>> obj.transform_numpy(X.to_numpy()) 

-

105 array([['a', 0.0], 

-

106 ['b', 1.0], 

-

107 ['a', 2.0], 

-

108 ['a', nan]], dtype=object) 

-

109 

-

110 See Also 

-

111 -------- 

-

112 gators.imputers.IntImputer 

-

113 Impute integer columns. 

-

114 gators.imputers.FloatImputer 

-

115 Impute float columns. 

-

116 gators.imputers.NumericsImputer 

-

117 Impute numerical columns. 

-

118 

-

119 """ 

-

120 

-

121 def __init__(self, strategy: str, value: str = None, columns=None): 

-

122 _BaseImputer.__init__(self, strategy, value, columns=columns) 

-

123 if strategy not in ['constant', 'most_frequent']: 

-

124 raise ValueError( 

-

125 '''`strategy` should be "constant" or "most_frequent" 

-

126 for the ObjectImputer Transformer.''') 

-

127 if strategy == 'constant' and not isinstance(value, str): 

-

128 raise TypeError( 

-

129 '''`value` should be a string 

-

130 for the ObjectImputer class''') 

-

131 

-

132 def fit(self, 

-

133 X: Union[pd.DataFrame, ks.DataFrame], 

-

134 y: Union[pd.Series, ks.Series] = None) -> 'ObjectImputer': 

-

135 """Fit the transformer on the dataframe `X`. 

-

136 

-

137 Parameters 

-

138 ---------- 

-

139 X : Union[pd.DataFrame, ks.DataFrame]. 

-

140 Input dataframe. 

-

141 y : None 

-

142 None. 

-

143 

-

144 Returns 

-

145 ------- 

-

146 ObjectImputer: Instance of itself. 

-

147 """ 

-

148 self.check_dataframe(X) 

-

149 if not self.columns: 

-

150 self.columns = util.get_datatype_columns(X, object) 

-

151 if not self.columns: 

-

152 warnings.warn( 

-

153 '''`X` does not contain object columns: 

-

154 `ObjectImputer` is not needed''') 

-

155 self.idx_columns = np.array([]) 

-

156 return self 

-

157 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

158 self.idx_columns = np.array( 

-

159 util.get_idx_columns(X, self.columns)) 

-

160 self.statistics = self.compute_statistics( 

-

161 X=X, 

-

162 columns=self.columns, 

-

163 strategy=self.strategy, 

-

164 value=self.value, 

-

165 ) 

-

166 self.statistics_values = np.array( 

-

167 list(self.statistics.values())).astype(object) 

-

168 return self 

-

169 

-

170 def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): 

-

171 """Transform the numpy ndarray X. 

-

172 

-

173 Parameters 

-

174 ---------- 

-

175 X (np.ndarray): Input ndarray. 

-

176 

-

177 Returns 

-

178 ------- 

-

179 np.ndarray: Imputed ndarray. 

-

180 """ 

-

181 self.check_array(X) 

-

182 if self.idx_columns.size == 0: 

-

183 return X 

-

184 return object_imputer( 

-

185 X, 

-

186 self.statistics_values, 

-

187 self.idx_columns) 

-
- + diff --git a/cov_html/d_94684d755a8de1fa_transformer_py.html b/cov_html/d_94684d755a8de1fa_transformer_py.html index 9dcc70e5..868d08b3 100644 --- a/cov_html/d_94684d755a8de1fa_transformer_py.html +++ b/cov_html/d_94684d755a8de1fa_transformer_py.html @@ -6,375 +6,405 @@ Coverage for gators/transformers/transformer.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3from abc import ABC 

-

4from abc import abstractmethod 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9NUMERICS_DTYPES = [np.int16, np.int32, np.int64, np.float32, np.float64] 

-

10PRINT_NUMERICS_DTYPES = ', '.join( 

-

11 [dtype.__name__ for dtype in NUMERICS_DTYPES]) 

-

12 

-

13 

-

14class Transformer(ABC): 

-

15 """Abstract **gators** transformer class. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * A Gators transformer. 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> import databricks.koalas as ks 

-

24 >>> import numpy as np 

-

25 >>> from gators.transformers import Transformer 

-

26 >>> class GetFirstColumn(Transformer): 

-

27 ... def fit(self, X, y=None): 

-

28 ... return self 

-

29 ... def transform(self, X: pd.DataFrame): 

-

30 ... return X[[X.columns[0]]] 

-

31 ... def transform_numpy(self, X: np.ndarray): 

-

32 ... return X[:, 0].reshape(-1, 1) 

-

33 

-

34 * fit & transform with `pandas` 

-

35 

-

36 >>> GetFirstColumn().fit_transform( 

-

37 ... pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

38 A 

-

39 0 1 

-

40 1 2 

-

41 

-

42 * fit with `pandas` & transform with `NumPy` 

-

43 

-

44 >>> obj = GetFirstColumn().fit( 

-

45 ... pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

46 >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) 

-

47 array([[5], 

-

48 [7]]) 

-

49 

-

50 * fit & transform with `koalas` 

-

51 

-

52 >>> GetFirstColumn().fit_transform( 

-

53 ... ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

54 A 

-

55 0 1 

-

56 1 2 

-

57 

-

58 * fit with `koalas` & transform with `NumPy` 

-

59 

-

60 >>> obj = GetFirstColumn().fit( 

-

61 ... ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

62 >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) 

-

63 array([[5], 

-

64 [7]]) 

-

65 

-

66 """ 

-

67 

-

68 @abstractmethod 

-

69 def fit( 

-

70 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

71 y: Union[pd.Series, ks.Series] = None) -> 'Transformer': 

-

72 """Fit the transformer on the dataframe `X`. 

-

73 

-

74 Parameters 

-

75 ---------- 

-

76 X : Union[pd.DataFrame, ks.DataFrame]. 

-

77 Input dataframe. 

-

78 y : None 

-

79 None. 

-

80 

-

81 Returns 

-

82 ------- 

-

83 Transformer: Instance of itself. 

-

84 """ 

-

85 

-

86 @abstractmethod 

-

87 def transform( 

-

88 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

89 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

90 """Transform the dataframe `X`. 

-

91 

-

92 Parameters 

-

93 ---------- 

-

94 X : Union[pd.DataFrame, ks.DataFrame]. 

-

95 Input dataframe. 

-

96 

-

97 Returns 

-

98 ------- 

-

99 Union[pd.DataFrame, ks.DataFrame] 

-

100 Transformed dataframe. 

-

101 """ 

-

102 

-

103 @abstractmethod 

-

104 def transform_numpy(self, X: Union[pd.Series, ks.Series], 

-

105 y: Union[pd.Series, ks.Series] = None): 

-

106 """Transform the array X. 

-

107 

-

108 Parameters 

-

109 ---------- 

-

110 X : np.ndarray 

-

111 Array 

-

112 """ 

-

113 

-

114 def fit_transform( 

-

115 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

116 y: Union[pd.Series, ks.Series] = None 

-

117 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

118 """Fit and Transform the dataframe `X`. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 X : Union[pd.DataFrame, ks.DataFrame]. 

-

123 Input dataframe. 

-

124 y : Union[pd.Series, ks.Series], default to None. 

-

125 Input target. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 Union[pd.DataFrame, ks.DataFrame] 

-

130 Transformed dataframe. 

-

131 """ 

-

132 _ = self.fit(X, y) 

-

133 return self.transform(X) 

-

134 

-

135 @staticmethod 

-

136 def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): 

-

137 """Validate dataframe. 

-

138 

-

139 Parameters 

-

140 ---------- 

-

141 X : Union[pd.DataFrame, ks.DataFrame] 

-

142 Input dataframe. 

-

143 """ 

-

144 if not isinstance(X, (pd.DataFrame, ks.DataFrame)): 

-

145 raise TypeError( 

-

146 '''`X` should be a pandas dataframe or a koalas dataframe.''') 

-

147 for c in X.columns: 

-

148 if not isinstance(c, str): 

-

149 raise ValueError( 

-

150 'Column names of `X` should be of type str.') 

-

151 

-

152 @ staticmethod 

-

153 def check_y(X: Union[pd.DataFrame, ks.DataFrame], 

-

154 y: Union[pd.Series, ks.Series]): 

-

155 """Validate target. 

-

156 

-

157 Parameters 

-

158 ---------- 

-

159 X : Union[pd.DataFrame, ks.DataFrame] 

-

160 Dataframe 

-

161 y : Union[pd.Series, ks.Series] 

-

162 Labels 

-

163 """ 

-

164 if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): 

-

165 raise TypeError('`y` should be a pandas series.') 

-

166 if isinstance(X, ks.DataFrame) and (not isinstance(y, ks.Series)): 

-

167 raise TypeError('`y` should be a koalas series.') 

-

168 if not isinstance(y.name, str): 

-

169 raise TypeError('Name of `y` should be a str.') 

-

170 if X.shape[0] != y.shape[0]: 

-

171 raise ValueError('Length of `X` and `y` should match.') 

-

172 

-

173 @ staticmethod 

-

174 def check_array(X: np.ndarray): 

-

175 """Validate array. 

-

176 

-

177 Parameters 

-

178 ---------- 

-

179 X (np.ndarray): Array. 

-

180 """ 

-

181 if not isinstance(X, np.ndarray): 

-

182 raise TypeError('`X` should be a NumPy array.') 

-

183 

-

184 @staticmethod 

-

185 def check_dataframe_is_numerics(X: Union[pd.DataFrame, ks.DataFrame]): 

-

186 """Check if dataframe is only numerics. 

-

187 

-

188 Parameters 

-

189 ---------- 

-

190 X : Union[pd.DataFrame, ks.DataFrame] 

-

191 Dataframe 

-

192 """ 

-

193 X_dtypes = X.dtypes.unique() 

-

194 for x_dtype in X_dtypes: 

-

195 if x_dtype not in NUMERICS_DTYPES: 

-

196 raise ValueError( 

-

197 f'`X` should be of type {PRINT_NUMERICS_DTYPES}.') 

-

198 

-

199 def check_datatype(self, dtype, accepted_dtypes): 

-

200 """Check if dataframe is only numerics. 

-

201 

-

202 Parameters 

-

203 ---------- 

-

204 X : Union[pd.DataFrame, ks.DataFrame] 

-

205 Dataframe 

-

206 """ 

-

207 print_dtypes = ', '.join([dtype.__name__ for dtype in accepted_dtypes]) 

-

208 if dtype not in accepted_dtypes: 

-

209 raise ValueError( 

-

210 f'''`X` should be of type {print_dtypes}. 

-

211 Use gators.converter.ConvertColumnDatatype before 

-

212 calling the transformer {self.__class__.__name__}.''') 

-

213 

-

214 @staticmethod 

-

215 def check_binary_target(y: Union[pd.Series, ks.Series]): 

-

216 """Raise an error if the target datatype is not binary. 

-

217 

-

218 Parameters 

-

219 ---------- 

-

220 y : Union[pd.Series, ks.Series] 

-

221 Target values. 

-

222 """ 

-

223 if y.nunique() != 2 or 'int' not in str(y.dtype): 

-

224 raise ValueError('`y` should be binary.') 

-

225 

-

226 @staticmethod 

-

227 def check_multiclass_target(y: Union[pd.Series, ks.Series]): 

-

228 """Raise an error if the target datatype is not discrete. 

-

229 

-

230 Parameters 

-

231 ---------- 

-

232 y : Union[pd.Series, ks.Series] 

-

233 Target values. 

-

234 """ 

-

235 if 'int' not in str(y.dtype): 

-

236 raise ValueError('`y` should be discrete.') 

-

237 

-

238 @staticmethod 

-

239 def check_regression_target(y: Union[pd.Series, ks.Series]): 

-

240 """Raise an error if the target datatype is not discrete. 

-

241 

-

242 Parameters 

-

243 ---------- 

-

244 y : Union[pd.Series, ks.Series] 

-

245 Target values. 

-

246 """ 

-

247 if 'float' not in str(y.dtype): 

-

248 raise ValueError('`y` should be float.') 

-

249 

-

250 @ staticmethod 

-

251 def check_dataframe_contains_numerics( 

-

252 X: Union[pd.DataFrame, ks.DataFrame]): 

-

253 """Check if dataframe is only numerics. 

-

254 

-

255 Parameters 

-

256 ---------- 

-

257 X : Union[pd.DataFrame, ks.DataFrame] 

-

258 Dataframe 

-

259 """ 

-

260 X_dtypes = X.dtypes.unique() 

-

261 for x_dtype in X_dtypes: 

-

262 if x_dtype in NUMERICS_DTYPES: 

-

263 return 

-

264 raise ValueError( 

-

265 f'''`X` should contains one of the following float dtypes: 

-

266 {PRINT_NUMERICS_DTYPES}. 

-

267 Use gators.converter.ConvertColumnDatatype before 

-

268 calling this transformer.''') 

-

269 

-

270 def check_dataframe_with_objects( 

-

271 self, X: Union[pd.DataFrame, ks.DataFrame]): 

-

272 """Check if dataframe contains object columns. 

-

273 

-

274 Parameters 

-

275 ---------- 

-

276 X : Union[pd.DataFrame, ks.DataFrame] 

-

277 Dataframe 

-

278 """ 

-

279 contains_object = object in X.dtypes.unique() 

-

280 if not contains_object: 

-

281 raise ValueError( 

-

282 f'''`X` should contains object columns to use the transformer 

-

283 {self.__class__.__name__}.''') 

-

284 

-

285 def check_array_is_numerics(self, X: np.ndarray): 

-

286 """Check if array is only numerics. 

-

287 

-

288 Parameters 

-

289 ---------- 

-

290 X : np.ndarray 

-

291 Array 

-

292 """ 

-

293 if X.dtype not in NUMERICS_DTYPES: 

-

294 raise ValueError( 

-

295 f'''`X` should be of type {PRINT_NUMERICS_DTYPES} 

-

296 to use the transformer {self.__class__.__name__}. 

-

297 Use gators.converter.ConvertColumnDatatype before calling it. 

-

298 ''') 

-

299 

-

300 def check_nans(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

301 columns: List[str]): 

-

302 """Raise an error if X contains NaN values. 

-

303 

-

304 Parameters 

-

305 ---------- 

-

306 X : Union[pd.DataFrame, ks.DataFrame] 

-

307 Dataframe. 

-

308 columns : List[str] 

-

309 List of columns. 

-

310 """ 

-

311 if X[columns].isnull().sum().sum() != 0: 

-

312 raise ValueError( 

-

313 f'''The object columns should not contain NaN values 

-

314 to use the transformer {self.__class__.__name__}. 

-

315 Use `gators.imputers.ObjectImputer` before calling it.''') 

-
- + diff --git a/cov_html/d_94684d755a8de1fa_transformer_xy_py.html b/cov_html/d_94684d755a8de1fa_transformer_xy_py.html index 72c32ed8..c511db3f 100644 --- a/cov_html/d_94684d755a8de1fa_transformer_xy_py.html +++ b/cov_html/d_94684d755a8de1fa_transformer_xy_py.html @@ -6,162 +6,161 @@ Coverage for gators/transformers/transformer_xy.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3from abc import ABC 

-

4from abc import abstractmethod 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class TransformerXY(ABC): 

-

10 """Abstract **gators** class to transform both X and y. 

-

11 

-

12 Examples 

-

13 --------- 

-

14 

-

15 >>> from gators.transformers import TransformerXY 

-

16 >>> class FirsRows(TransformerXY): 

-

17 ... def transform(self, X, y): 

-

18 ... return X.head(1), y.head(1) 

-

19 

-

20 * transform with pandas 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> X, y = FirsRows().transform( 

-

24 ... X=pd.DataFrame({'A':[1, 2], 'B':[3, 4]}), 

-

25 ... y=pd.Series([0, 1],name='TARGET')) 

-

26 >>> X 

-

27 A B 

-

28 0 1 3 

-

29 >>> y 

-

30 0 0 

-

31 Name: TARGET, dtype: int64 

-

32 

-

33 * transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> X, y = FirsRows().transform( 

-

37 ... X=ks.DataFrame({'A':[1, 2], 'B':[3, 4]}), 

-

38 ... y=ks.Series([0, 1],name='TARGET')) 

-

39 >>> X 

-

40 A B 

-

41 0 1 3 

-

42 >>> y 

-

43 0 0 

-

44 Name: TARGET, dtype: int64 

-

45 

-

46 """ 

-

47 

-

48 @abstractmethod 

-

49 def transform( 

-

50 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

51 y: Union[pd.Series, ks.Series]): 

-

52 """Fit and Transform the dataframes `X`ad `y`. 

-

53 

-

54 Parameters 

-

55 ---------- 

-

56 X : Union[pd.DataFrame, ks.DataFrame]. 

-

57 Input dataframe. 

-

58 y : Union[pd.Series, ks.Series] 

-

59 None. 

-

60 

-

61 Returns 

-

62 ------- 

-

63 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]] 

-

64 Transformed dataframes. 

-

65 """ 

-

66 

-

67 @staticmethod 

-

68 def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): 

-

69 """Validate dataframe. 

-

70 

-

71 Parameters 

-

72 ---------- 

-

73 X : Union[pd.DataFrame, ks.DataFrame] 

-

74 Input dataframe. 

-

75 """ 

-

76 if not isinstance(X, (pd.DataFrame, ks.DataFrame)): 

-

77 raise TypeError( 

-

78 '''`X` should be a pandas dataframe or a koalas dataframe.''') 

-

79 for c in X.columns: 

-

80 if not isinstance(c, str): 

-

81 raise TypeError('Column names of `X` should be of type str.') 

-

82 

-

83 @ staticmethod 

-

84 def check_y(X: Union[pd.DataFrame, ks.DataFrame], 

-

85 y: Union[pd.Series, ks.Series]): 

-

86 """Validate target. 

-

87 

-

88 Parameters 

-

89 ---------- 

-

90 X : Union[pd.DataFrame, ks.DataFrame] 

-

91 Dataframe 

-

92 y : Union[pd.Series, ks.Series] 

-

93 Labels 

-

94 """ 

-

95 if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): 

-

96 raise TypeError('`y` should be a pandas series.') 

-

97 if isinstance(X, ks.DataFrame) and (not isinstance(y, ks.Series)): 

-

98 raise TypeError('`y` should be a koalas series.') 

-

99 if not isinstance(y.name, str): 

-

100 raise TypeError('Name of `y` should be a str.') 

-

101 if X.shape[0] != y.shape[0]: 

-

102 raise ValueError('Length of `X` and `y` should match.') 

-
- + diff --git a/cov_html/d_b016ed27f73af4c4__base_scaler_py.html b/cov_html/d_b016ed27f73af4c4__base_scaler_py.html new file mode 100644 index 00000000..6061bccd --- /dev/null +++ b/cov_html/d_b016ed27f73af4c4__base_scaler_py.html @@ -0,0 +1,133 @@ + + + + + + Coverage for gators/scalers/_base_scaler.py: 100% + + + + + +
+
+

+ Coverage for gators/scalers/_base_scaler.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 24 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import numpy as np 

+

3 

+

4from scaler import scaler 

+

5 

+

6from ..transformers.transformer import Transformer 

+

7from gators import DataFrame, Series 

+

8 

+

9 

+

10class _BaseScaler(Transformer): 

+

11 """Base scaler transformer class. 

+

12 

+

13 Parameters 

+

14 ---------- 

+

15 inplace : bool. 

+

16 If True, perform the encoding inplace. 

+

17 """ 

+

18 

+

19 def __init__(self, inplace: bool): 

+

20 self.X_offset: DataFrame = None 

+

21 self.X_scale: DataFrame = None 

+

22 self.X_offset_np = np.array([]) 

+

23 self.X_scale_np = np.array([]) 

+

24 self.inplace = inplace 

+

25 

+

26 def transform(self, X): 

+

27 """Transform the dataframe `X`. 

+

28 

+

29 Parameters 

+

30 ---------- 

+

31 X : DataFrame. 

+

32 Input dataframe. 

+

33 

+

34 Returns 

+

35 ------- 

+

36 X : DataFrame 

+

37 Transformed dataframe. 

+

38 """ 

+

39 self.check_dataframe(X) 

+

40 X[self.columns] = X[self.columns].astype(float) 

+

41 for col, name in zip(self.columns, self.column_names): 

+

42 X[name] = (X[col] - self.X_offset[col]) * self.X_scale[col] 

+

43 return X 

+

44 

+

45 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

46 """Transform the array `X`. 

+

47 

+

48 Parameters 

+

49 ---------- 

+

50 X :np.ndarray: 

+

51 Input array. 

+

52 

+

53 Returns 

+

54 ------- 

+

55 X : np.ndarray 

+

56 Transformed array. 

+

57 """ 

+

58 self.check_array(X) 

+

59 X_scale = scaler(X.astype(float), self.X_offset_np, self.X_scale_np) 

+

60 if self.inplace: 

+

61 X[:, self.idx_columns] = X_scale 

+

62 return X 

+

63 return np.concatenate((X, X_scale), axis=1) 

+
+ + + diff --git a/cov_html/d_b016ed27f73af4c4_minmax_scaler_py.html b/cov_html/d_b016ed27f73af4c4_minmax_scaler_py.html index 81829fb7..c16866df 100644 --- a/cov_html/d_b016ed27f73af4c4_minmax_scaler_py.html +++ b/cov_html/d_b016ed27f73af4c4_minmax_scaler_py.html @@ -6,196 +6,157 @@ Coverage for gators/scalers/minmax_scaler.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from scaler import minmax_scaler 

-

3from ..transformers.transformer import Transformer 

-

4import numpy as np 

-

5from typing import Union 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class MinMaxScaler(Transformer): 

-

11 """Scale each column to the [0, 1] range. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 dtype : type, default to np.float64. 

-

16 Numerical datatype of the output data. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.scalers import MinMaxScaler 

-

25 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

26 >>> obj = MinMaxScaler() 

-

27 >>> obj.fit_transform(X) 

-

28 A B 

-

29 0 0.0 0.00 

-

30 1 0.5 0.75 

-

31 2 1.0 1.00 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.scalers import MinMaxScaler 

-

37 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

38 >>> obj = MinMaxScaler() 

-

39 >>> obj.fit_transform(X) 

-

40 A B 

-

41 0 0.0 0.00 

-

42 1 0.5 0.75 

-

43 2 1.0 1.00 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.scalers import MinMaxScaler 

-

49 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

50 >>> obj = MinMaxScaler() 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[0. , 0. ], 

-

54 [0.5 , 0.75], 

-

55 [1. , 1. ]]) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.scalers import MinMaxScaler 

-

61 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

62 >>> obj = MinMaxScaler() 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[0. , 0. ], 

-

66 [0.5 , 0.75], 

-

67 [1. , 1. ]]) 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, dtype: type = np.float64): 

-

72 self.dtype = dtype 

-

73 self.X_min: Union[pd.DataFrame, ks.DataFrame] = None 

-

74 self.X_max: Union[pd.DataFrame, ks.DataFrame] = None 

-

75 self.X_min_np = np.array([]) 

-

76 self.X_max_np = np.array([]) 

-

77 

-

78 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

79 y: Union[pd.Series, ks.Series] = None) -> 'MinMaxScaler': 

-

80 """Fit the transformer on the pandas/koalas dataframe X. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 X : Union[pd.DataFrame, ks.DataFrame] 

-

85 Input dataframe. 

-

86 y : Union[pd.Series, ks.Series], default to None. 

-

87 Labels. 

-

88 

-

89 Returns 

-

90 ------- 

-

91 'MinMaxScaler': Instance of itself. 

-

92 """ 

-

93 self.check_dataframe(X) 

-

94 self.check_dataframe_is_numerics(X) 

-

95 self.X_min = X.min().astype(self.dtype) 

-

96 self.X_max = X.max().astype(self.dtype) 

-

97 self.X_min_np = self.X_min.to_numpy().astype(self.dtype) 

-

98 self.X_max_np = self.X_max.to_numpy().astype(self.dtype) 

-

99 return self 

-

100 

-

101 def transform(self, X): 

-

102 """Transform the dataframe `X`. 

-

103 

-

104 Parameters 

-

105 ---------- 

-

106 X : Union[pd.DataFrame, ks.DataFrame]. 

-

107 Input dataframe. 

-

108 

-

109 Returns 

-

110 ------- 

-

111 Union[pd.DataFrame, ks.DataFrame] 

-

112 Transformed dataframe. 

-

113 """ 

-

114 self.check_dataframe(X) 

-

115 self.check_dataframe_is_numerics(X) 

-

116 

-

117 def f(x: ks.Series[self.dtype]): 

-

118 c = x.name 

-

119 return (x - self.X_min.loc[c]) / (self.X_max[c] - self.X_min[c]) 

-

120 

-

121 return X.astype(self.dtype).apply(f) 

-

122 

-

123 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

124 """Transform the array X. 

-

125 

-

126 Parameters 

-

127 ---------- 

-

128 X (np.ndarray): Input ndarray. 

-

129 

-

130 Returns 

-

131 ------- 

-

132 np.ndarray: Imputed ndarray. 

-

133 """ 

-

134 self.check_array(X) 

-

135 return minmax_scaler( 

-

136 X.astype(self.dtype), self.X_min_np, self.X_max_np) 

-
- + diff --git a/cov_html/d_b016ed27f73af4c4_standard_scaler_py.html b/cov_html/d_b016ed27f73af4c4_standard_scaler_py.html index a6f69633..a236954f 100644 --- a/cov_html/d_b016ed27f73af4c4_standard_scaler_py.html +++ b/cov_html/d_b016ed27f73af4c4_standard_scaler_py.html @@ -6,199 +6,162 @@ Coverage for gators/scalers/standard_scaler.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from scaler import standard_scaler 

-

3from ..transformers.transformer import Transformer 

-

4import numpy as np 

-

5from typing import Union 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class StandardScaler(Transformer): 

-

11 """Scale each column by setting the mean to 0 and the standard deviation to 1. 

-

12 

-

13 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 dtype : type, default to np.float64. 

-

18 Numerical datatype of the output data. 

-

19 

-

20 Examples 

-

21 -------- 

-

22 

-

23 * fit & transform with `pandas` 

-

24 

-

25 >>> import pandas as pd 

-

26 >>> from gators.scalers import StandardScaler 

-

27 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

28 >>> obj = StandardScaler() 

-

29 >>> obj.fit_transform(X) 

-

30 A B 

-

31 0 -1.0 -1.120897 

-

32 1 0.0 0.320256 

-

33 2 1.0 0.800641 

-

34 

-

35 * fit & transform with `koalas` 

-

36 

-

37 >>> import databricks.koalas as ks 

-

38 >>> from gators.scalers import StandardScaler 

-

39 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

40 >>> obj = StandardScaler() 

-

41 >>> obj.fit_transform(X) 

-

42 A B 

-

43 0 -1.0 -1.120897 

-

44 1 0.0 0.320256 

-

45 2 1.0 0.800641 

-

46 

-

47 * fit with `pandas` & transform with `NumPy` 

-

48 

-

49 >>> import pandas as pd 

-

50 >>> from gators.scalers import StandardScaler 

-

51 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

52 >>> obj = StandardScaler() 

-

53 >>> _ = obj.fit(X) 

-

54 >>> obj.transform_numpy(X.to_numpy()) 

-

55 array([[-1. , -1.12089708], 

-

56 [ 0. , 0.32025631], 

-

57 [ 1. , 0.80064077]]) 

-

58 

-

59 * fit with `koalas` & transform with `NumPy` 

-

60 

-

61 >>> import databricks.koalas as ks 

-

62 >>> from gators.scalers import StandardScaler 

-

63 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

64 >>> obj = StandardScaler() 

-

65 >>> _ = obj.fit(X) 

-

66 >>> obj.transform_numpy(X.to_numpy()) 

-

67 array([[-1. , -1.12089708], 

-

68 [ 0. , 0.32025631], 

-

69 [ 1. , 0.80064077]]) 

-

70 

-

71 """ 

-

72 

-

73 def __init__(self, dtype: type = np.float64): 

-

74 self.dtype = dtype 

-

75 self.X_mean: Union[pd.DataFrame, ks.DataFrame] = None 

-

76 self.X_std: Union[pd.DataFrame, ks.DataFrame] = None 

-

77 self.X_mean_np = np.array([]) 

-

78 self.X_std_np = np.array([]) 

-

79 

-

80 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'StandardScaler': 

-

82 """Fit the transformer on the pandas/koalas dataframe X. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 'StandardScaler': Instance of itself. 

-

94 """ 

-

95 self.check_dataframe(X) 

-

96 self.check_dataframe_is_numerics(X) 

-

97 self.X_std = X.std().astype(self.dtype) 

-

98 self.X_mean = X.mean().astype(self.dtype) 

-

99 self.X_mean_np = self.X_mean.to_numpy().astype(self.dtype) 

-

100 self.X_std_np = self.X_std.to_numpy().astype(self.dtype) 

-

101 return self 

-

102 

-

103 def transform(self, X): 

-

104 """Transform the dataframe `X`. 

-

105 

-

106 Parameters 

-

107 ---------- 

-

108 X : Union[pd.DataFrame, ks.DataFrame]. 

-

109 Input dataframe. 

-

110 

-

111 Returns 

-

112 ------- 

-

113 Union[pd.DataFrame, ks.DataFrame] 

-

114 Transformed dataframe. 

-

115 """ 

-

116 self.check_dataframe(X) 

-

117 self.check_dataframe_is_numerics(X) 

-

118 

-

119 def f(x: ks.Series[self.dtype]): 

-

120 c = x.name 

-

121 return (x - self.X_mean[c]) / self.X_std[c] 

-

122 

-

123 return X.astype(self.dtype).apply(f) 

-

124 

-

125 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

126 """Transform the numpy ndarray X. 

-

127 

-

128 Parameters 

-

129 ---------- 

-

130 X (np.ndarray): Input ndarray. 

-

131 

-

132 Returns 

-

133 ------- 

-

134 np.ndarray: Imputed ndarray. 

-

135 """ 

-

136 self.check_array(X) 

-

137 self.check_array_is_numerics(X) 

-

138 return standard_scaler( 

-

139 X.astype(self.dtype), self.X_mean_np, self.X_std_np) 

-
- + diff --git a/cov_html/d_b016ed27f73af4c4_yeo_johnson_py.html b/cov_html/d_b016ed27f73af4c4_yeo_johnson_py.html new file mode 100644 index 00000000..f9f74eb6 --- /dev/null +++ b/cov_html/d_b016ed27f73af4c4_yeo_johnson_py.html @@ -0,0 +1,250 @@ + + + + + + Coverage for gators/scalers/yeo_johnson.py: 100% + + + + + +
+
+

+ Coverage for gators/scalers/yeo_johnson.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 42 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import Dict 

+

3 

+

4import numpy as np 

+

5 

+

6from scaler import yeo_johnson 

+

7 

+

8from . import StandardScaler 

+

9from ..transformers.transformer import Transformer 

+

10from ..util import util 

+

11 

+

12from gators import DataFrame, Series 

+

13 

+

14 

+

15class YeoJohnson(Transformer): 

+

16 """Scale the data accoring to the Yeo-Johnson transformation. 

+

17 

+

18 .. note:: 

+

19 It is recommanded to use the StandardScaler transformer before running YeoJohnson. 

+

20 

+

21 Parameters 

+

22 ---------- 

+

23 lambdas_dict : Dict[str, List[float]] 

+

24 The keys are the columns, the values are the list of lambdas: 

+

25 

+

26 Examples 

+

27 --------- 

+

28 Imports and initialization: 

+

29 

+

30 >>> from gators.scalers import YeoJohnson 

+

31 >>> lambdas_dict = {'A': 0.8130050344716966, 'B': 1.0431595843133055, 'C': 0.9168245659045446} 

+

32 >>> obj = YeoJohnson(lambdas_dict=lambdas_dict) 

+

33 

+

34 The `fit`, `transform`, and `fit_transform` methods accept: 

+

35 

+

36 >>> import dask.dataframe as dd 

+

37 >>> import pandas as pd 

+

38 >>> X = dd.from_pandas(pd.DataFrame({ 

+

39 ... "A": [3., 1., -3., -1., -3.], 

+

40 ... "B": [22.0, 38.0, -26.0, 35.0, 3 - 5.0], 

+

41 ... "C": [7.25, 71.2833, -7.925, -53.1, -8.05]}), npartitions=1) 

+

42 

+

43 * `koalas` dataframes: 

+

44 

+

45 >>> import databricks.koalas as ks 

+

46 >>> X = ks.DataFrame({ 

+

47 ... "A": [3., 1., -3., -1., -3.], 

+

48 ... "B": [22.0, 38.0, -26.0, 35.0, 3 - 5.0], 

+

49 ... "C": [7.25, 71.2833, -7.925, -53.1, -8.05]}) 

+

50 

+

51 * and `pandas` dataframes: 

+

52 

+

53 >>> import pandas as pd 

+

54 >>> X = pd.DataFrame({ 

+

55 ... "A": [3., 1., -3., -1., -3.], 

+

56 ... "B": [22.0, 38.0, -26.0, 35.0, 3 - 5.0], 

+

57 ... "C": [7.25, 71.2833, -7.925, -53.1, -8.05]}) 

+

58 

+

59 The result is a transformed dataframe belonging to the same dataframe library. 

+

60 

+

61 >>> obj.fit_transform(X) 

+

62 A B C 

+

63 0 2.566505 24.284823 6.459180 

+

64 1 0.930950 42.832241 54.132971 

+

65 2 -3.524638 -23.431274 -8.961789 

+

66 3 -1.075641 39.324310 -68.684587 

+

67 4 -3.524638 -1.945019 -9.111836 

+

68 

+

69 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

70 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

71 when the number of rows is small *e.g.* in real-time environment. 

+

72 

+

73 >>> obj.transform_numpy(X.to_numpy()) 

+

74 array([[ 2.22845745, 26.90617943, 5.7929225 ], 

+

75 [ 0.87009573, 48.50683594, 41.9899559 ], 

+

76 [ -4.21259165, -21.19840813, -10.21141434], 

+

77 [ -1.16205084, 44.38453674, -90.64434052], 

+

78 [ -4.21259165, -1.89256322, -10.39319134]]) 

+

79 """ 

+

80 

+

81 def __init__(self, lambdas_dict: Dict[str, float], inplace: bool = True): 

+

82 if not isinstance(lambdas_dict, dict): 

+

83 raise TypeError("`lambdas_dict` should be a dictionary.") 

+

84 if len(lambdas_dict) == 0: 

+

85 raise ValueError("Length of `lambdas_dict` should be not zero.") 

+

86 if not isinstance(inplace, bool): 

+

87 raise TypeError("`inplace` should be a bool.") 

+

88 self.lambdas_dict = lambdas_dict 

+

89 self.inplace = inplace 

+

90 self.lambdas_np = np.array(list(lambdas_dict.values())).astype(float) 

+

91 self.columns = list(lambdas_dict.keys()) 

+

92 

+

93 def fit(self, X: DataFrame, y: Series = None) -> "YeoJonhson": 

+

94 """Fit the transformer on the pandas/koalas dataframe X. 

+

95 

+

96 Parameters 

+

97 ---------- 

+

98 X : DataFrame 

+

99 Input dataframe. 

+

100 y : Series, default None. 

+

101 Target values. 

+

102 

+

103 Returns 

+

104 ------- 

+

105 self : 'YeoJonhson' 

+

106 Instance of itself. 

+

107 """ 

+

108 self.check_dataframe(X) 

+

109 self.base_columns = list(X.columns) 

+

110 self.idx_columns = util.get_idx_columns(X, self.columns) 

+

111 self.column_names = self.get_column_names( 

+

112 self.inplace, self.columns, "yeojohnson" 

+

113 ) 

+

114 return self 

+

115 

+

116 def transform(self, X): 

+

117 """Transform the dataframe `X`. 

+

118 

+

119 Parameters 

+

120 ---------- 

+

121 X : DataFrame. 

+

122 Input dataframe. 

+

123 

+

124 Returns 

+

125 ------- 

+

126 X : DataFrame 

+

127 Transformed dataframe. 

+

128 """ 

+

129 self.check_dataframe(X) 

+

130 for col, name in zip(self.columns, self.column_names): 

+

131 lmbda = self.lambdas_dict[col] 

+

132 if lmbda == 0: 

+

133 X[name] = ( 

+

134 X[col] 

+

135 .where(X[col] < 0, np.log1p(X[col])) 

+

136 .where( 

+

137 X[col] >= 0, -((-X[col] + 1) ** (2 - lmbda) - 1) / (2 - lmbda) 

+

138 ) 

+

139 ) 

+

140 elif lmbda == 2: 

+

141 X[name] = ( 

+

142 X[col] 

+

143 .where(X[col] < 0, ((X[col] + 1) ** lmbda - 1) / lmbda) 

+

144 .where(X[col] >= 0, -np.log1p(-X[col])) 

+

145 ) 

+

146 else: 

+

147 X[name] = ( 

+

148 X[col] 

+

149 .where(X[col] < 0, ((X[col] + 1) ** lmbda - 1) / lmbda) 

+

150 .where( 

+

151 X[col] >= 0, -((-X[col] + 1) ** (2 - lmbda) - 1) / (2 - lmbda) 

+

152 ) 

+

153 ) 

+

154 

+

155 return X 

+

156 

+

157 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

158 """Transform the array `X`. 

+

159 

+

160 Parameters 

+

161 ---------- 

+

162 X :np.ndarray: 

+

163 Input array. 

+

164 

+

165 Returns 

+

166 ------- 

+

167 X : np.ndarray 

+

168 Transformed array. 

+

169 """ 

+

170 self.check_array(X) 

+

171 X_yeo_johnson = yeo_johnson(X.astype(float), self.lambdas_np) 

+

172 if self.inplace: 

+

173 X[:, self.idx_columns] = X_yeo_johnson 

+

174 return X 

+

175 return np.concatenate((X, X_yeo_johnson), axis=1) 

+

176 # if self.inplace: 

+

177 # return yeo_johnson(X, self.idx_columns, self.lambdas_np) 

+

178 # else: 

+

179 # X_yeo_johnson = yeo_johnson(X.copy(), self.idx_columns, self.lambdas_np) 

+

180 # return np.concatenate((X, X_yeo_johnson[:, self.idx_columns]), axis=1) 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb__base_binning_py.html b/cov_html/d_b13ffdfa7fdfb0fb__base_binning_py.html new file mode 100644 index 00000000..08f8d355 --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb__base_binning_py.html @@ -0,0 +1,246 @@ + + + + + + Coverage for gators/binning/_base_binning.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/_base_binning.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 72 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import Dict 

+

3 

+

4import pandas as pd 

+

5import numpy as np 

+

6 

+

7from binning import binning_new 

+

8 

+

9from ..transformers.transformer import Transformer 

+

10from ..util import util 

+

11 

+

12from gators import DataFrame, Series 

+

13 

+

14 

+

15class _BaseBinning(Transformer): 

+

16 """Base binning transformer class. 

+

17 

+

18 Parameters 

+

19 ---------- 

+

20 n_bins : int 

+

21 Number of bins to use. 

+

22 inplace : bool 

+

23 If False, return the dataframe with the new binned columns 

+

24 with the names *column_name__bin*). Otherwise, 

+

25 return the dataframe with the existing binned columns. 

+

26 """ 

+

27 

+

28 def __init__(self, n_bins: int, inplace: bool): 

+

29 if (not isinstance(n_bins, int)) or (n_bins <= 0): 

+

30 raise TypeError("`n_bins` should be a positive int.") 

+

31 if not isinstance(inplace, bool): 

+

32 raise TypeError("`inplace` should be a bool.") 

+

33 Transformer.__init__(self) 

+

34 self.n_bins = n_bins 

+

35 self.inplace = inplace 

+

36 self.base_columns = [] 

+

37 self.columns = [] 

+

38 self.column_names = [] 

+

39 self.idx_columns = np.array([]) 

+

40 self.bins = {} 

+

41 self.mapping = {} 

+

42 self.bins_np = np.array([]) 

+

43 

+

44 def fit(self, X: DataFrame, y: Series = None) -> "Transformer": 

+

45 """Fit the transformer on the dataframe `X`. 

+

46 

+

47 Parameters 

+

48 ---------- 

+

49 X : DataFrame 

+

50 Input dataframe. 

+

51 y : Series, default None. 

+

52 Target values. 

+

53 

+

54 Returns 

+

55 ------- 

+

56 self : 'Transformer' 

+

57 Instance of itself. 

+

58 """ 

+

59 self.check_dataframe(X) 

+

60 self.base_columns = list(X.columns) 

+

61 self.columns = util.get_numerical_columns(X) 

+

62 self.column_names = self.get_column_names( 

+

63 inplace=False, columns=self.columns, suffix="bin" 

+

64 ) 

+

65 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

+

66 if self.idx_columns.size == 0: 

+

67 return self 

+

68 self.bins_dict, self.pretty_bins_dict, self.bins_np = self.compute_bins( 

+

69 X[self.columns], y 

+

70 ) 

+

71 self.labels, self.labels_np = self.get_labels(self.pretty_bins_dict) 

+

72 return self 

+

73 

+

74 def transform(self, X: DataFrame) -> DataFrame: 

+

75 """Transform the dataframe `X`. 

+

76 

+

77 Parameters 

+

78 ---------- 

+

79 X : DataFrame 

+

80 Input dataframe. 

+

81 

+

82 Returns 

+

83 ------- 

+

84 X : DataFrame 

+

85 Transformed dataframe. 

+

86 """ 

+

87 self.check_dataframe(X) 

+

88 if self.idx_columns.size == 0: 

+

89 return X 

+

90 

+

91 new_series_list = [] 

+

92 for c, n in zip(self.columns, self.column_names): 

+

93 n_bins = len(self.bins_dict[c]) 

+

94 dummy = X[c].where(~(X[c] < self.bins_dict[c][1]), self.labels[c][0]) 

+

95 for j in range(1, n_bins - 1): 

+

96 dummy = dummy.where( 

+

97 ~( 

+

98 (X[c] >= self.bins_dict[c][j]) 

+

99 & (X[c] < self.bins_dict[c][j + 1]) 

+

100 ), 

+

101 self.labels[c][j], 

+

102 ) 

+

103 dummy = dummy.where(~(X[c] > self.bins_dict[c][-2]), self.labels[c][-1]) 

+

104 new_series_list.append(dummy.rename(n)) 

+

105 

+

106 X_binning = util.get_function(X).concat(new_series_list, axis=1) 

+

107 if self.inplace: 

+

108 columns_dict = dict(zip(self.column_names, self.columns)) 

+

109 if len(self.base_columns) == len(self.column_names): 

+

110 return X_binning.rename(columns=columns_dict) 

+

111 return ( 

+

112 util.get_function(X) 

+

113 .concat([X.drop(self.columns, axis=1), X_binning], axis=1) 

+

114 .rename(columns=columns_dict)[self.base_columns] 

+

115 ) 

+

116 return util.get_function(X).concat([X, X_binning], axis=1) 

+

117 

+

118 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

119 """Transform the array `X`. 

+

120 

+

121 Parameters 

+

122 ---------- 

+

123 X : np.ndarray 

+

124 Array. 

+

125 

+

126 Returns 

+

127 ------- 

+

128 X : np.ndarray 

+

129 Transformed array. 

+

130 """ 

+

131 self.check_array(X) 

+

132 if self.idx_columns.size == 0: 

+

133 return X 

+

134 X_bin = binning_new( 

+

135 X[:, self.idx_columns].astype(float), self.bins_np, self.labels_np 

+

136 ) 

+

137 if self.inplace: 

+

138 X = X.astype(object) 

+

139 X[:, self.idx_columns] = X_bin 

+

140 return X 

+

141 return np.concatenate((X, X_bin), axis=1) 

+

142 

+

143 @staticmethod 

+

144 def get_labels(pretty_bins_dict: Dict[str, np.array]): 

+

145 """Get the labels of the bins. 

+

146 

+

147 Parameters 

+

148 ---------- 

+

149 pretty_bins_dict : Dict[str, np.array]) 

+

150 pretified bins used to generate the labels. 

+

151 

+

152 Returns 

+

153 ------- 

+

154 Dict[str, np.array] 

+

155 Labels. 

+

156 np.array 

+

157 Labels. 

+

158 """ 

+

159 labels = {} 

+

160 for col, bins in pretty_bins_dict.items(): 

+

161 if len(bins) == 2: 

+

162 labels[col] = ["(-inf, inf)"] 

+

163 else: 

+

164 labels[col] = ( 

+

165 [f"(-inf, {bins[1]})"] 

+

166 + [f"[{b1}, {b2})" for b1, b2 in zip(bins[1:-2], bins[2:-1])] 

+

167 + [f"[{bins[-2]}, inf)"] 

+

168 ) 

+

169 labels_np = ( 

+

170 pd.DataFrame( 

+

171 {k: {i: x for i, x in enumerate(v)} for k, v in labels.items()} 

+

172 ) 

+

173 .fillna(0) 

+

174 .to_numpy() 

+

175 ) 

+

176 return labels, labels_np 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb__base_discretizer_py.html b/cov_html/d_b13ffdfa7fdfb0fb__base_discretizer_py.html deleted file mode 100644 index 515e1c37..00000000 --- a/cov_html/d_b13ffdfa7fdfb0fb__base_discretizer_py.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - Coverage for gators/binning/_base_discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from binning import discretizer, discretizer_inplace 

-

3from ..util import util 

-

4from ..transformers.transformer import Transformer 

-

5from pyspark.ml.feature import Bucketizer 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10 

-

11 

-

12EPSILON = 1e-10 

-

13 

-

14 

-

15class _BaseDiscretizer(Transformer): 

-

16 """Base discretizer transformer class. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 n_bins : int 

-

21 Number of bins to use. 

-

22 inplace : bool 

-

23 If False, return the dataframe with the new discretized columns 

-

24 with the names '`column_name`__bin'). Otherwise, 

-

25 return the dataframe with the existing binned columns. 

-

26 

-

27 """ 

-

28 def __init__(self, n_bins: int, inplace: bool): 

-

29 if not isinstance(n_bins, int): 

-

30 raise TypeError('`n_bins` should be an int.') 

-

31 if not isinstance(inplace, bool): 

-

32 raise TypeError('`inplace` should be a bool.') 

-

33 Transformer.__init__(self) 

-

34 self.n_bins = n_bins 

-

35 self.inplace = inplace 

-

36 self.columns = [] 

-

37 self.output_columns = [] 

-

38 self.idx_columns: np.ndarray = np.array([]) 

-

39 self.bins = {} 

-

40 self.bins_np = np.array([]) 

-

41 self.bins_ks: List[List[float]] = [[]] 

-

42 

-

43 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

44 y=None) -> '_BaseDiscretizer': 

-

45 """Fit the transformer on the dataframe `X`. 

-

46 

-

47 Parameters 

-

48 ---------- 

-

49 X : Union[pd.DataFrame, ks.DataFrame] 

-

50 Input dataframe. 

-

51 y : Union[pd.Series, ks.Series], default to None. 

-

52 Labels. 

-

53 

-

54 Returns 

-

55 ------- 

-

56 'Discretizer' 

-

57 Instance of itself. 

-

58 """ 

-

59 self.check_dataframe(X) 

-

60 self.columns = util.get_numerical_columns(X) 

-

61 self.output_columns = [f'{c}__bin' for c in self.columns] 

-

62 self.idx_columns = util.get_idx_columns( 

-

63 X.columns, self.columns 

-

64 ) 

-

65 if self.idx_columns.size == 0: 

-

66 return self 

-

67 

-

68 self.bins, self.bins_np = self.compute_bins( 

-

69 X[self.columns], self.n_bins) 

-

70 return self 

-

71 

-

72 def transform(self, 

-

73 X: Union[pd.DataFrame, ks.DataFrame] 

-

74 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

75 """Transform the dataframe `X`. 

-

76 

-

77 Parameters 

-

78 ---------- 

-

79 X : Union[pd.DataFrame, ks.DataFrame] 

-

80 Input dataframe. 

-

81 

-

82 Returns 

-

83 ------- 

-

84 Union[pd.DataFrame, ks.DataFrame] 

-

85 Transformed dataframe. 

-

86 """ 

-

87 self.check_dataframe(X) 

-

88 if self.idx_columns.size == 0: 

-

89 return X 

-

90 if isinstance(X, pd.DataFrame): 

-

91 if self.inplace: 

-

92 return self.bin_pd_inplace( 

-

93 X, self.columns, self.output_columns, 

-

94 self.bins) 

-

95 return self.bin_pd( 

-

96 X, self.columns, self.output_columns, 

-

97 self.bins) 

-

98 if self.inplace: 

-

99 return self.bin_ks_inplace( 

-

100 X, self.columns, self.output_columns, 

-

101 self.bins)[X.columns] 

-

102 

-

103 return self.bin_ks( 

-

104 X, self.columns, self.output_columns, 

-

105 self.bins) 

-

106 

-

107 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

108 """Transform the NumPy array. 

-

109 

-

110 Parameters 

-

111 ---------- 

-

112 X : np.ndarray 

-

113 NumPy array. 

-

114 

-

115 Returns 

-

116 ------- 

-

117 np.ndarray 

-

118 Transformed NumPy array. 

-

119 """ 

-

120 self.check_array(X) 

-

121 if self.idx_columns.size == 0: 

-

122 return X 

-

123 if self.inplace: 

-

124 if X.dtype == object: 

-

125 return discretizer_inplace( 

-

126 X, 

-

127 self.bins_np, 

-

128 self.idx_columns 

-

129 ) 

-

130 return discretizer_inplace( 

-

131 X.astype(object), 

-

132 self.bins_np, 

-

133 self.idx_columns 

-

134 ) 

-

135 if X.dtype == object: 

-

136 return discretizer( 

-

137 X, 

-

138 self.bins_np, 

-

139 self.idx_columns 

-

140 ) 

-

141 return discretizer( 

-

142 X.astype(object), 

-

143 self.bins_np, 

-

144 self.idx_columns 

-

145 ) 

-

146 

-

147 @staticmethod 

-

148 def bin_pd_inplace(X: pd.DataFrame, columns: List[str], 

-

149 output_columns: List[str], bins): 

-

150 """Perform the binning inplace for pandas dataframes. 

-

151 

-

152 Parameters 

-

153 ---------- 

-

154 X : pd.DataFrame 

-

155 Dataframe. 

-

156 columns : List[str] 

-

157 Columns to be binnned. 

-

158 output_columns : List[str] 

-

159 Binnned column names. 

-

160 bins : [type] 

-

161 [description] 

-

162 

-

163 Returns 

-

164 ------- 

-

165 pd.DataFrame 

-

166 Dataframe. 

-

167 """ 

-

168 def f(x, bins, columns): 

-

169 name = x.name 

-

170 if name not in columns: 

-

171 return x 

-

172 return pd.cut( 

-

173 x, 

-

174 bins[name], 

-

175 labels=np.arange(len(bins[name]) - 1), 

-

176 duplicates='drop').fillna(0).astype(float).astype(str) 

-

177 return X.apply(f, args=(bins, columns)) 

-

178 

-

179 @staticmethod 

-

180 def bin_pd(X, columns, output_columns, bins): 

-

181 """Perform the binning not inplace for pandas dataframes. 

-

182 

-

183 Parameters 

-

184 ---------- 

-

185 X : pd.DataFrame 

-

186 Dataframe. 

-

187 columns : List[str] 

-

188 Columns to be binnned. 

-

189 output_columns : List[str] 

-

190 Binnned column names. 

-

191 bins : [type] 

-

192 [description] 

-

193 

-

194 Returns 

-

195 ------- 

-

196 pd.DataFrame 

-

197 Dataframe. 

-

198 """ 

-

199 def f(x, bins, columns): 

-

200 name = x.name 

-

201 return pd.cut( 

-

202 x, 

-

203 bins[name], 

-

204 labels=np.arange(len(bins[name]) - 1), 

-

205 duplicates='drop').fillna(0).astype(float).astype(str) 

-

206 return X.join( 

-

207 X[columns].apply( 

-

208 f, args=(bins, columns)).astype(object).rename( 

-

209 columns=dict(zip(columns, output_columns)))) 

-

210 

-

211 @staticmethod 

-

212 def bin_ks_inplace(X, columns, output_columns, bins): 

-

213 """Perform the binning not inplace for kolas dataframes. 

-

214 

-

215 Parameters 

-

216 ---------- 

-

217 X : pd.DataFrame 

-

218 Dataframe. 

-

219 columns : List[str] 

-

220 Columns to be binnned. 

-

221 output_columns : List[str] 

-

222 Binnned column names. 

-

223 bins : [type] 

-

224 [description] 

-

225 

-

226 Returns 

-

227 ------- 

-

228 ks.DataFrame 

-

229 Dataframe. 

-

230 """ 

-

231 X = Bucketizer( 

-

232 splitsArray=bins, 

-

233 inputCols=columns, 

-

234 outputCols=output_columns 

-

235 ).transform(X.to_spark()).to_koalas( 

-

236 ).drop(columns, axis=1).rename( 

-

237 columns=dict(zip(output_columns, columns))) 

-

238 X[columns] = X[columns].astype(str) 

-

239 return X 

-

240 

-

241 @staticmethod 

-

242 def bin_ks(X, columns, output_columns, bins): 

-

243 """Perform the binning inplace for kolas dataframes. 

-

244 

-

245 Parameters 

-

246 ---------- 

-

247 X : pd.DataFrame 

-

248 Dataframe. 

-

249 columns : List[str] 

-

250 Columns to be binnned. 

-

251 output_columns : List[str] 

-

252 Binnned column names. 

-

253 bins : [type] 

-

254 [description] 

-

255 

-

256 Returns 

-

257 ------- 

-

258 ks.DataFrame 

-

259 Dataframe. 

-

260 """ 

-

261 X = Bucketizer( 

-

262 splitsArray=bins, 

-

263 inputCols=columns, 

-

264 outputCols=output_columns 

-

265 ).transform(X.to_spark()).to_koalas() 

-

266 X[output_columns] = X[output_columns].astype(str) 

-

267 return X 

-
- - - diff --git a/cov_html/d_b13ffdfa7fdfb0fb_bin_factory_py.html b/cov_html/d_b13ffdfa7fdfb0fb_bin_factory_py.html new file mode 100644 index 00000000..ef135024 --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_bin_factory_py.html @@ -0,0 +1,389 @@ + + + + + + Coverage for gators/binning/bin_factory.py: 0% + + + + + +
+
+

+ Coverage for gators/binning/bin_factory.py: + 0% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 56 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from abc import ABC 

+

3from typing import List, Dict, Union 

+

4 

+

5import numpy as np 

+

6import pandas as pd 

+

7 

+

8from gators import DataFrame 

+

9 

+

10 

+

11EPSILON = 1e-10 

+

12 

+

13 

+

14class BinFactory(ABC): 

+

15 def bin(self) -> DataFrame: 

+

16 """Add the binned columns to the input dataframe.""" 

+

17 

+

18 def bin_inplace(self) -> DataFrame: 

+

19 """Add in-place the binned columns to the input dataframe.""" 

+

20 

+

21 

+

22class BinPandas(BinFactory): 

+

23 def bin( 

+

24 self, 

+

25 X: DataFrame, 

+

26 bins_dict: Dict[str, List], 

+

27 labels: Dict[str, str], 

+

28 columns: List[str], 

+

29 column_names: List[str], 

+

30 ) -> DataFrame: 

+

31 """Add the binned columns to the input Pandas dataframe. 

+

32 

+

33 Parameters 

+

34 ---------- 

+

35 X : DataFrame 

+

36 Input dataframe. 

+

37 bins_dict : Dict[str, List] 

+

38 Dictionary of bins_dict. The keys are the column names, the values are the split arrays. 

+

39 labels : Dict[str, str] 

+

40 Dictionary of labels. The keys are the column names, the values are the label arrays. 

+

41 columns : List[str] 

+

42 List of columns. 

+

43 column_names : List[str] 

+

44 List of output columns, only used where `inplace=True`. 

+

45 

+

46 Returns 

+

47 ------- 

+

48 DataFrame 

+

49 Transformed dataframe. 

+

50 """ 

+

51 

+

52 for c, name in zip(columns, column_names): 

+

53 n_bins = len(bins_dict[c]) 

+

54 dummy = X[c].where(~(X[c] < X.bins_dict[c][1]), X.labels[c][0]) 

+

55 for j in range(1, n_bins - 1): 

+

56 dummy = dummy.where( 

+

57 ~((X[c] >= X.bins_dict[c][j]) & (X[c] < X.bins_dict[c][j + 1])), 

+

58 X.labels[c][j], 

+

59 ) 

+

60 dummy = dummy.where(~(X[c] > X.bins_dict[c][-2]), X.labels[c][-1]) 

+

61 X[name] = dummy 

+

62 

+

63 # for name, col in zip(column_names, columns): 

+

64 # X[name] = pd.cut( 

+

65 # X[col], 

+

66 # bins=bins_dict[col], 

+

67 # labels=labels[col], 

+

68 # duplicates="drop", 

+

69 # include_lowest=True, 

+

70 # right=False, 

+

71 # ) 

+

72 # X[column_names] = X[column_names].astype(str) 

+

73 return X 

+

74 

+

75 def bin_inplace( 

+

76 self, 

+

77 X: DataFrame, 

+

78 bins_dict: pd.DataFrame, 

+

79 labels: Dict[str, str], 

+

80 columns: List[str], 

+

81 column_names: List[str], 

+

82 ) -> DataFrame: 

+

83 """Add in-place the binned columns to the input Pandas dataframe. 

+

84 

+

85 Parameters 

+

86 ---------- 

+

87 X : DataFrame 

+

88 Input dataframe. 

+

89 bins_dict : pd.DataFrame 

+

90 Dictionary of bins_dict. The keys are the column names, the values are the split arrays. 

+

91 labels : Dict[str, str] 

+

92 Dictionary of labels. The keys are the column names, the values are the label arrays. 

+

93 columns : List[str] 

+

94 List of columns. 

+

95 column_names : List[str] 

+

96 List of output columns, only used where `inplace=True`. 

+

97 

+

98 Returns 

+

99 ------- 

+

100 DataFrame 

+

101 Transformed dataframe. 

+

102 """ 

+

103 # for _, col in zip(column_names, columns): 

+

104 # X[col] = pd.cut( 

+

105 # X[col], 

+

106 # bins=bins_dict[col], 

+

107 # labels=labels[col], 

+

108 # duplicates="drop", 

+

109 # include_lowest=True, 

+

110 # right=False, 

+

111 # ) 

+

112 # X[columns] = X[columns].astype(str) 

+

113 for c in columns: 

+

114 n_bins = len(bins_dict[c]) 

+

115 dummy = X[c].where(~(X[c] < X.bins[c][1]), X.mapping[c][0]) 

+

116 for j in range(1, n_bins - 1): 

+

117 dummy = dummy.where( 

+

118 ~((X[c] >= X.bins[c][j]) & (X[c] < X.bins[c][j + 1])), 

+

119 X.mapping[c][j], 

+

120 ) 

+

121 dummy = dummy.where(~(X[c] > X.bins[c][-2]), X.mapping[c][-1]) 

+

122 X[c] = dummy 

+

123 

+

124 return X 

+

125 

+

126 

+

127class BinKoalas(BinFactory): 

+

128 def bin( 

+

129 self, 

+

130 X: DataFrame, 

+

131 bins_dict: pd.DataFrame, 

+

132 labels: Dict[str, str], 

+

133 columns: List[str], 

+

134 column_names: List[str], 

+

135 ) -> DataFrame: 

+

136 """Add the binned columns to the input Koalas dataframe. 

+

137 

+

138 Parameters 

+

139 ---------- 

+

140 X : DataFrame 

+

141 Input dataframe. 

+

142 bins_dict : pd.DataFrame 

+

143 Dictionary of bins_dict. The keys are the column names, the values are the split arrays. 

+

144 labels : Dict[str, str] 

+

145 Dictionary of labels. The keys are the column names, the values are the label arrays. 

+

146 columns : List[str] 

+

147 List of columns. 

+

148 column_names : List[str] 

+

149 List of output columns, only used where `inplace=True`. 

+

150 

+

151 Returns 

+

152 ------- 

+

153 DataFrame 

+

154 Transformed dataframe. 

+

155 """ 

+

156 from pyspark.ml.feature import Bucketizer 

+

157 

+

158 bins_np = [np.unique(b) - 1e-10 for b in bins_dict.values()] 

+

159 X = ( 

+

160 Bucketizer( 

+

161 bins_dictArray=bins_np, inputCols=columns, outputCols=column_names 

+

162 ) 

+

163 .transform(X.to_spark()) 

+

164 .to_koalas() 

+

165 ) 

+

166 X[column_names] = "_" + X[column_names].astype(int).astype(str) 

+

167 return X 

+

168 

+

169 def bin_inplace( 

+

170 self, 

+

171 X: DataFrame, 

+

172 bins_dict: pd.DataFrame, 

+

173 labels: Dict[str, str], 

+

174 columns: List[str], 

+

175 column_names: List[str], 

+

176 ) -> DataFrame: 

+

177 """Add in-place the binned columns to the input Koalas dataframe. 

+

178 

+

179 Parameters 

+

180 ---------- 

+

181 X : DataFrame 

+

182 Input dataframe. 

+

183 bins_dict : pd.DataFrame 

+

184 Dictionary of bins_dict. The keys are the column names, the values are the split arrays. 

+

185 labels : Dict[str, str] 

+

186 Dictionary of labels. The keys are the column names, the values are the label arrays. 

+

187 columns : List[str] 

+

188 List of columns. 

+

189 column_names : List[str] 

+

190 List of output columns, only used where `inplace=True`. 

+

191 

+

192 Returns 

+

193 ------- 

+

194 DataFrame 

+

195 Transformed dataframe. 

+

196 """ 

+

197 from pyspark.ml.feature import Bucketizer 

+

198 

+

199 bins_np = [np.unique(b) - 1e-10 for b in bins_dict.values()] 

+

200 ordered_columns = X.columns 

+

201 X = ( 

+

202 Bucketizer( 

+

203 bins_dictArray=bins_np, inputCols=columns, outputCols=column_names 

+

204 ) 

+

205 .transform(X.to_spark()) 

+

206 .to_koalas() 

+

207 .drop(columns, axis=1) 

+

208 .rename(columns=dict(zip(column_names, columns))) 

+

209 ) 

+

210 X[columns] = "_" + X[columns].astype(int).astype(str) 

+

211 return X[ordered_columns] 

+

212 

+

213 

+

214class BinDask(BinFactory): 

+

215 def bin( 

+

216 self, 

+

217 X: DataFrame, 

+

218 bins_dict: pd.DataFrame, 

+

219 labels: Dict[str, str], 

+

220 columns: List[str], 

+

221 column_names: List[str], 

+

222 ) -> DataFrame: 

+

223 """Add the binned columns to the input Dask dataframe. 

+

224 

+

225 Parameters 

+

226 ---------- 

+

227 X : DataFrame 

+

228 Input dataframe. 

+

229 bins_dict : pd.DataFrame 

+

230 Dictionary of bins_dict. The keys are the column names, the values are the split arrays. 

+

231 labels : Dict[str, str] 

+

232 Dictionary of labels. The keys are the column names, the values are the label arrays. 

+

233 columns : List[str] 

+

234 List of columns. 

+

235 column_names : List[str] 

+

236 List of output columns, only used where `inplace=True`. 

+

237 

+

238 Returns 

+

239 ------- 

+

240 DataFrame 

+

241 Transformed dataframe. 

+

242 """ 

+

243 for name, col in zip(column_names, columns): 

+

244 X[name] = X[col].map_partitions( 

+

245 pd.cut, 

+

246 bins=bins_dict[col], 

+

247 labels=labels[col], 

+

248 duplicates="drop", 

+

249 include_lowest=True, 

+

250 right=False, 

+

251 ) 

+

252 X[column_names] = X[column_names].astype(str) 

+

253 return X 

+

254 

+

255 def bin_inplace( 

+

256 self, 

+

257 X: DataFrame, 

+

258 bins_dict: pd.DataFrame, 

+

259 labels: Dict[str, str], 

+

260 columns: List[str], 

+

261 column_names: List[str], 

+

262 ) -> DataFrame: 

+

263 """Add in-place the binned columns to the input Dask dataframe. 

+

264 

+

265 Parameters 

+

266 ---------- 

+

267 X : DataFrame 

+

268 Input dataframe. 

+

269 bins_dict : pd.DataFrame 

+

270 Dictionary of bins_dict. The keys are the column names, the values are the split arrays. 

+

271 labels : Dict[str, str] 

+

272 Dictionary of labels. The keys are the column names, the values are the label arrays. 

+

273 columns : List[str] 

+

274 List of columns. 

+

275 column_names : List[str] 

+

276 List of output columns, only used where `inplace=True`. 

+

277 

+

278 Returns 

+

279 ------- 

+

280 DataFrame 

+

281 Transformed dataframe. 

+

282 """ 

+

283 for name, col in zip(column_names, columns): 

+

284 X[col] = ( 

+

285 X[col] 

+

286 .map_partitions( 

+

287 pd.cut, 

+

288 bins=bins_dict[col], 

+

289 labels=labels[col], 

+

290 duplicates="drop", 

+

291 include_lowest=True, 

+

292 right=False, 

+

293 ) 

+

294 .astype(object) 

+

295 ) 

+

296 X[columns] = X[columns].astype(str) 

+

297 return X 

+

298 

+

299 

+

300def get_bin(X: DataFrame) -> Union[BinPandas, BinKoalas, BinDask]: 

+

301 """Return the `Bin` class based on the dataframe library. 

+

302 

+

303 Parameters 

+

304 ---------- 

+

305 X : DataFrame 

+

306 Dataframe. 

+

307 

+

308 Returns 

+

309 ------- 

+

310 Union[BinPandas, BinKoalas, BinDask] 

+

311 `Bin` class assocaited to the dataframe librarry. 

+

312 """ 

+

313 factories = { 

+

314 "<class 'pandas.core.frame.DataFrame'>": BinPandas(), 

+

315 "<class 'databricks.koalas.frame.DataFrame'>": BinKoalas(), 

+

316 "databricks.koalas.frame.DataFrame": BinKoalas(), # needed for python3.6 

+

317 "<class 'dask.dataframe.core.DataFrame'>": BinDask(), 

+

318 } 

+

319 return factories[str(type(X))] 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb_bin_rare_categories_py.html b/cov_html/d_b13ffdfa7fdfb0fb_bin_rare_categories_py.html new file mode 100644 index 00000000..2a5fda65 --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_bin_rare_categories_py.html @@ -0,0 +1,301 @@ + + + + + + Coverage for gators/binning/bin_rare_categories.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/bin_rare_categories.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 66 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import warnings 

+

3from typing import Dict, List 

+

4 

+

5import numpy as np 

+

6 

+

7from binning import bin_rare_events 

+

8 

+

9from ..transformers.transformer import Transformer 

+

10from ..util import util 

+

11 

+

12from gators import DataFrame, Series 

+

13 

+

14 

+

15class BinRareCategories(Transformer): 

+

16 """Replace low occurence categories by the value "OTHERS". 

+

17 

+

18 Use `BinRareCategories` to reduce the cardinality 

+

19 of high cardinal columns. This transformer is also useful 

+

20 to replace unseen categories by a value which is already 

+

21 taken it account by the encoders. 

+

22 

+

23 Parameters 

+

24 ---------- 

+

25 min_ratio : float 

+

26 Min occurence ratio per category. 

+

27 inplace : bool, default False 

+

28 If False, return the dataframe with the new binned columns 

+

29 with the names "column_name__bin_rare"). Otherwise, return 

+

30 the dataframe with the existing binned columns. 

+

31 

+

32 Examples 

+

33 --------- 

+

34 

+

35 Imports and initialization: 

+

36 

+

37 >>> from gators.binning import BinRareCategories 

+

38 >>> obj = BinRareCategories(min_ratio=0.5) 

+

39 

+

40 The `fit`, `transform`, and `fit_transform` methods accept: 

+

41 

+

42 * `dask` dataframes: 

+

43 

+

44 >>> import dask.dataframe as dd 

+

45 >>> import pandas as pd 

+

46 >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}), npartitions=1) 

+

47 

+

48 * `koalas` dataframes: 

+

49 

+

50 >>> import databricks.koalas as ks 

+

51 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

+

52 

+

53 * and `pandas` dataframes: 

+

54 

+

55 >>> import pandas as pd 

+

56 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

+

57 

+

58 The result is a transformed dataframe belonging to the same dataframe library. 

+

59 

+

60 >>> obj.fit_transform(X) 

+

61 A B 

+

62 0 a OTHERS 

+

63 1 a OTHERS 

+

64 2 OTHERS OTHERS 

+

65 

+

66 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

67 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

68 when the number of rows is small *e.g.* in real-time environment. 

+

69 

+

70 >>> obj.transform_numpy(X.to_numpy()) 

+

71 array([['a', 'OTHERS'], 

+

72 ['a', 'OTHERS'], 

+

73 ['OTHERS', 'OTHERS']], dtype=object) 

+

74 """ 

+

75 

+

76 def __init__(self, min_ratio: float, inplace: bool = True): 

+

77 if not isinstance(min_ratio, (int, float)) or min_ratio < 0 or min_ratio > 1: 

+

78 raise TypeError( 

+

79 """`min_ratio` should be a positive float betwwen 0.0 and 1.0.""" 

+

80 ) 

+

81 Transformer.__init__(self) 

+

82 self.min_ratio = min_ratio 

+

83 self.inplace = inplace 

+

84 self.columns = [] 

+

85 self.idx_columns: np.ndarray = np.array([]) 

+

86 self.categories_to_keep_np: np.ndarray = None 

+

87 self.n_categories_to_keep_np: np.ndarray = None 

+

88 self.categories_to_keep_dict: Dict[str, np.ndarray] = {} 

+

89 

+

90 def fit(self, X: DataFrame, y: Series = None) -> "BinRareCategories": 

+

91 """Fit the transformer on the dataframe `X`. 

+

92 

+

93 Parameters 

+

94 ---------- 

+

95 X : DataFrame. 

+

96 Input dataframe. 

+

97 y : Series, default None. 

+

98 Target values. 

+

99 

+

100 Returns 

+

101 ------- 

+

102 BinRareCategories 

+

103 Instance of itself. 

+

104 """ 

+

105 self.check_dataframe(X) 

+

106 if object not in X.dtypes.to_numpy(): 

+

107 warnings.warn( 

+

108 """`X` does not contain object columns: 

+

109 `BinRareCategories` is not needed""" 

+

110 ) 

+

111 return self 

+

112 self.base_columns = list(X.columns) 

+

113 self.columns = util.get_datatype_columns(X, datatype=object) 

+

114 self.column_names = self.get_column_names( 

+

115 self.inplace, self.columns, "bin_rare" 

+

116 ) 

+

117 self.categories_to_keep_dict = self.compute_categories_to_keep_dict( 

+

118 X=X[self.columns], 

+

119 min_ratio=self.min_ratio, 

+

120 ) 

+

121 self.categories_to_keep_np = self.get_categories_to_keep_np( 

+

122 categories_to_keep_dict=self.categories_to_keep_dict, 

+

123 ) 

+

124 self.n_categories_to_keep_np = self.categories_to_keep_np.shape[0] - ( 

+

125 self.categories_to_keep_np == None 

+

126 ).sum(0) 

+

127 self.idx_columns = util.get_idx_columns( 

+

128 columns=X.columns, selected_columns=self.columns 

+

129 ) 

+

130 return self 

+

131 

+

132 def transform(self, X: DataFrame) -> DataFrame: 

+

133 """Transform the dataframe `X`. 

+

134 

+

135 Parameters 

+

136 ---------- 

+

137 X : DataFrame. 

+

138 Input dataframe. 

+

139 

+

140 Returns 

+

141 ------- 

+

142 X : DataFrame 

+

143 Transformed dataframe. 

+

144 """ 

+

145 self.check_dataframe(X) 

+

146 if not self.columns: 

+

147 return X 

+

148 for name, col in zip(self.column_names, self.columns): 

+

149 X[name] = X[col].mask( 

+

150 ~X[col].isin(self.categories_to_keep_dict[col]), "OTHERS" 

+

151 ) 

+

152 return X 

+

153 

+

154 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

155 """Transform the array `X`. 

+

156 

+

157 Parameters 

+

158 ---------- 

+

159 X : np.ndarray 

+

160 Array. 

+

161 

+

162 Returns 

+

163 ------- 

+

164 X : np.ndarray 

+

165 Transformed array. 

+

166 """ 

+

167 self.check_array(X) 

+

168 if self.idx_columns.size == 0: 

+

169 return X 

+

170 X_rare = bin_rare_events( 

+

171 X[:, self.idx_columns], 

+

172 self.categories_to_keep_np, 

+

173 self.n_categories_to_keep_np, 

+

174 ) 

+

175 if self.inplace: 

+

176 X[:, self.idx_columns] = X_rare 

+

177 return X 

+

178 return np.concatenate((X, X_rare), axis=1) 

+

179 

+

180 @staticmethod 

+

181 def compute_categories_to_keep_dict( 

+

182 X: DataFrame, min_ratio: float 

+

183 ) -> Dict[str, List[str]]: 

+

184 """Compute the category frequency. 

+

185 

+

186 Parameters 

+

187 ---------- 

+

188 X : DataFrame. 

+

189 Input dataframe. 

+

190 min_ratio : float 

+

191 Min occurence per category. 

+

192 

+

193 Returns 

+

194 ------- 

+

195 mapping : Dict[str, List[str]] 

+

196 Categories to keep. 

+

197 """ 

+

198 freq = util.get_function(X).to_pandas( 

+

199 util.get_function(X).melt(X).groupby(["variable", "value"]).size() / len(X) 

+

200 ) 

+

201 freq = freq[freq >= min_ratio] 

+

202 mapping = {} 

+

203 for c in X.columns: 

+

204 if c in list(freq.index.get_level_values(0)): 

+

205 mapping[c] = list(freq.loc[c].index) 

+

206 else: 

+

207 mapping[c] = [] 

+

208 return mapping 

+

209 

+

210 @staticmethod 

+

211 def get_categories_to_keep_np( 

+

212 categories_to_keep_dict: Dict[str, np.ndarray] 

+

213 ) -> np.ndarray: 

+

214 """Get the categories to keep. 

+

215 

+

216 Parameters 

+

217 ---------- 

+

218 categories_to_keep_dict : Dict[str, np.ndarray]) 

+

219 Categories to keep. 

+

220 

+

221 Returns 

+

222 ------- 

+

223 categories_to_keep_np : np.ndarray 

+

224 Categories to keep. 

+

225 """ 

+

226 max_category = max([len(val) for val in categories_to_keep_dict.values()]) 

+

227 n_columns = len(categories_to_keep_dict) 

+

228 categories_to_keep_np = np.empty((max_category, n_columns), dtype="object") 

+

229 for i, val in enumerate(categories_to_keep_dict.values()): 

+

230 categories_to_keep_np[: len(val), i] = val 

+

231 return categories_to_keep_np 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb_bin_rare_events_py.html b/cov_html/d_b13ffdfa7fdfb0fb_bin_rare_events_py.html deleted file mode 100644 index 381e5c38..00000000 --- a/cov_html/d_b13ffdfa7fdfb0fb_bin_rare_events_py.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - Coverage for gators/binning/bin_rare_events.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from binning import bin_rare_events 

-

3from ..util import util 

-

4from ..transformers.transformer import Transformer 

-

5from typing import List, Union, Dict 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9import warnings 

-

10 

-

11 

-

12class BinRareEvents(Transformer): 

-

13 """Replace low occurence categories by the value "OTHERS". 

-

14 

-

15 Use `BinRareEvents` to reduce the cardinality 

-

16 of high cardinal columns. This transformer is also useful 

-

17 to replace unseen categories by a value which is already 

-

18 taken it account by the encoders. 

-

19 

-

20 Parameters 

-

21 ---------- 

-

22 min_ratio : float 

-

23 Min occurence ratio per category. 

-

24 

-

25 Examples 

-

26 --------- 

-

27 

-

28 >>> import pandas as pd 

-

29 >>> from gators.binning import BinRareEvents 

-

30 >>> obj = BinRareEvents(min_ratio=0.5) 

-

31 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

32 >>> obj.fit_transform(X) 

-

33 A B 

-

34 0 a OTHERS 

-

35 1 a OTHERS 

-

36 2 OTHERS OTHERS 

-

37 

-

38 * fit & transform with `koalas` 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.binning import BinRareEvents 

-

42 >>> obj = BinRareEvents(min_ratio=0.5) 

-

43 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

44 >>> obj.fit_transform(X) 

-

45 A B 

-

46 0 a OTHERS 

-

47 1 a OTHERS 

-

48 2 OTHERS OTHERS 

-

49 

-

50 * fit with `pandas` & transform with `NumPy` 

-

51 

-

52 >>> import pandas as pd 

-

53 >>> from gators.binning import BinRareEvents 

-

54 >>> obj = BinRareEvents(min_ratio=0.5) 

-

55 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

56 >>> _ = obj.fit(X) 

-

57 >>> obj.transform_numpy(X.to_numpy()) 

-

58 array([['a', 'OTHERS'], 

-

59 ['a', 'OTHERS'], 

-

60 ['OTHERS', 'OTHERS']], dtype=object) 

-

61 

-

62 * fit with `koalas` & transform with `NumPy` 

-

63 

-

64 >>> import databricks.koalas as ks 

-

65 >>> from gators.binning import BinRareEvents 

-

66 >>> obj = BinRareEvents(min_ratio=0.5) 

-

67 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

68 >>> _ = obj.fit(X) 

-

69 >>> obj.transform_numpy(X.to_numpy()) 

-

70 array([['a', 'OTHERS'], 

-

71 ['a', 'OTHERS'], 

-

72 ['OTHERS', 'OTHERS']], dtype=object) 

-

73 

-

74 """ 

-

75 

-

76 def __init__(self, min_ratio: float): 

-

77 if not isinstance(min_ratio, float): 

-

78 raise TypeError( 

-

79 '''`min_ratio` should be a float.''') 

-

80 Transformer.__init__(self) 

-

81 self.min_ratio = min_ratio 

-

82 self.columns = [] 

-

83 self.idx_columns: np.ndarray = np.array([]) 

-

84 self.categories_to_keep_np: np.ndarray = None 

-

85 self.n_categories_to_keep_np: np.ndarray = None 

-

86 self.categories_to_keep_dict: Dict[str, np.ndarray] = {} 

-

87 

-

88 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

89 y=None) -> 'BinRareEvents': 

-

90 """Fit the transformer on the dataframe `X`. 

-

91 

-

92 Parameters 

-

93 ---------- 

-

94 X : Union[pd.DataFrame, ks.DataFrame]. 

-

95 Input dataframe. 

-

96 y : None 

-

97 None. 

-

98 

-

99 Returns 

-

100 ------- 

-

101 BinRareEvents 

-

102 Instance of itself. 

-

103 """ 

-

104 self.check_dataframe(X) 

-

105 if object not in X.dtypes.to_numpy(): 

-

106 warnings.warn( 

-

107 '''`X` does not contain object columns: 

-

108 `BinRareEvents` is not needed''') 

-

109 return self 

-

110 self.columns = util.get_datatype_columns( 

-

111 X, datatype=object) 

-

112 self.categories_to_keep_dict = self.compute_categories_to_keep_dict( 

-

113 X=X[self.columns], 

-

114 min_ratio=self.min_ratio, 

-

115 ) 

-

116 self.categories_to_keep_np = self.get_categories_to_keep_np( 

-

117 categories_to_keep_dict=self.categories_to_keep_dict, 

-

118 ) 

-

119 self.n_categories_to_keep_np = self.categories_to_keep_np.shape[0] \ 

-

120 - (self.categories_to_keep_np == None).sum(0) 

-

121 self.idx_columns = util.get_idx_columns( 

-

122 columns=X.columns, 

-

123 selected_columns=self.columns) 

-

124 return self 

-

125 

-

126 def transform(self, 

-

127 X: Union[pd.DataFrame, ks.DataFrame] 

-

128 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

129 """Transform the dataframe `X`. 

-

130 

-

131 Parameters 

-

132 ---------- 

-

133 X : Union[pd.DataFrame, ks.DataFrame]. 

-

134 Input dataframe. 

-

135 

-

136 Returns 

-

137 ------- 

-

138 Union[pd.DataFrame, ks.DataFrame] 

-

139 Transformed dataframe. 

-

140 """ 

-

141 self.check_dataframe(X) 

-

142 

-

143 def f(x): 

-

144 name = x.name 

-

145 if name not in self.categories_to_keep_dict: 

-

146 return x 

-

147 return x.mask(~ x.isin(self.categories_to_keep_dict[name]), 

-

148 'OTHERS') 

-

149 return X.apply(f) 

-

150 

-

151 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

152 """Transform the NumPy array. 

-

153 

-

154 Parameters 

-

155 ---------- 

-

156 X : np.ndarray 

-

157 NumPy array. 

-

158 

-

159 Returns 

-

160 ------- 

-

161 np.ndarray 

-

162 Transformed NumPy array. 

-

163 

-

164 """ 

-

165 self.check_array(X) 

-

166 if self.idx_columns.size == 0: 

-

167 return X 

-

168 if self.categories_to_keep_np.shape[0] == 0: 

-

169 X[:, self.idx_columns] = 'OTHERS' 

-

170 return X 

-

171 return bin_rare_events( 

-

172 X, 

-

173 self.categories_to_keep_np, 

-

174 self.n_categories_to_keep_np, 

-

175 self.idx_columns, 

-

176 ) 

-

177 

-

178 @ staticmethod 

-

179 def compute_categories_to_keep_dict( 

-

180 X: Union[pd.DataFrame, ks.DataFrame], 

-

181 min_ratio: float) -> Dict[str, List[str]]: 

-

182 """Compute the category frequency. 

-

183 

-

184 Parameters 

-

185 ---------- 

-

186 X : Union[pd.DataFrame, ks.DataFrame]. 

-

187 Input dataframe. 

-

188 min_ratio : float 

-

189 Min occurence per category. 

-

190 

-

191 Returns 

-

192 ------- 

-

193 Dict[str, List[str]]: Categories to keep. 

-

194 """ 

-

195 def f(x): 

-

196 freq = x.astype('object').value_counts( 

-

197 normalize=True).sort_values() 

-

198 freq = freq[freq >= min_ratio] 

-

199 return list(freq.index) 

-

200 

-

201 mapping = X.apply(f).to_dict() 

-

202 mapping = { 

-

203 key: val if isinstance(val, list) else list(val.values()) 

-

204 for key, val in mapping.items() 

-

205 } 

-

206 return mapping 

-

207 

-

208 @ staticmethod 

-

209 def get_categories_to_keep_np( 

-

210 categories_to_keep_dict: Dict[str, np.ndarray]) -> np.ndarray: 

-

211 """Get the categories to keep. 

-

212 

-

213 Parameters 

-

214 ---------- 

-

215 categories_to_keep_dict : Dict[str, np.ndarray]) 

-

216 Categories to keep. 

-

217 

-

218 Returns 

-

219 ------- 

-

220 np.ndarray 

-

221 Categories to keep. 

-

222 """ 

-

223 max_category = max( 

-

224 [len(val) for val in categories_to_keep_dict.values()]) 

-

225 n_columns = len(categories_to_keep_dict) 

-

226 categories_to_keep_np = np.empty( 

-

227 (max_category, n_columns), dtype='object') 

-

228 for i, val in enumerate(categories_to_keep_dict.values()): 

-

229 categories_to_keep_np[:len(val), i] = val 

-

230 return categories_to_keep_np 

-
- - - diff --git a/cov_html/d_b13ffdfa7fdfb0fb_bin_single_target_class_categories_py.html b/cov_html/d_b13ffdfa7fdfb0fb_bin_single_target_class_categories_py.html new file mode 100644 index 00000000..8037ed5c --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_bin_single_target_class_categories_py.html @@ -0,0 +1,282 @@ + + + + + + Coverage for gators/binning/bin_single_target_class_categories.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/bin_single_target_class_categories.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 61 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import warnings 

+

3 

+

4import numpy as np 

+

5 

+

6from ..transformers.transformer import Transformer 

+

7from ..data_cleaning.replace import Replace 

+

8from ..util import util 

+

9 

+

10from gators import DataFrame, Series 

+

11 

+

12 

+

13class BinSingleTargetClassCategories(Transformer): 

+

14 """Bin single target class categories. 

+

15 

+

16 Ensure that the target class ratio for each categy is between 0 and 1 excluded. 

+

17 Note that this transformer should only be used for binary classification problems. 

+

18 

+

19 Parameters 

+

20 ---------- 

+

21 inplace : bool 

+

22 If False, return the dataframe with the new binned columns 

+

23 with the names *column_name__bin_single*). Otherwise, 

+

24 return the dataframe with the existing binned columns. 

+

25 

+

26 Examples 

+

27 --------- 

+

28 

+

29 Imports and initialization: 

+

30 

+

31 >>> from gators.binning import BinSingleTargetClassCategories 

+

32 >>> obj = BinSingleTargetClassCategories() 

+

33 

+

34 The `fit`, `transform`, and `fit_transform` methods accept: 

+

35 

+

36 * `dask` dataframes: 

+

37 

+

38 >>> import dask.dataframe as dd 

+

39 >>> import pandas as pd 

+

40 >>> X = dd.from_pandas(pd.DataFrame({ 

+

41 ... "A": ["_0", "_1", "_2", '_2', '_1'], 

+

42 ... "B": ["_1", "_2", "_1", '_1', '_1'], 

+

43 ... "C": ["_0", "_0", "_1", '_2', '_2'], 

+

44 ... "D": ["_0", '_0', '_1', '_1', '_1'], 

+

45 ... "E": [1, 2, 3, 4, 5]}), npartitions=1) 

+

46 >>> y = dd.from_pandas(pd.Series([0, 1, 1, 0, 0], name='Target'), npartitions=1) 

+

47 

+

48 * `koalas` dataframes: 

+

49 

+

50 >>> import databricks.koalas as ks 

+

51 >>> X = ks.DataFrame({ 

+

52 ... "A": ["_0", "_1", "_2", '_2', '_1'], 

+

53 ... "B": ["_1", "_2", "_1", '_1', '_1'], 

+

54 ... "C": ["_0", "_0", "_1", '_2', '_2'], 

+

55 ... "D": ["_0", '_0', '_1', '_1', '_1'], 

+

56 ... "E": [1, 2, 3, 4, 5]}) 

+

57 >>> y = ks.Series([0, 1, 1, 0, 0], name='Target') 

+

58 

+

59 * and `pandas` dataframes: 

+

60 

+

61 >>> import pandas as pd 

+

62 >>> X = pd.DataFrame({ 

+

63 ... "A": ["_0", "_1", "_2", '_2', '_1'], 

+

64 ... "B": ["_1", "_2", "_1", '_1', '_1'], 

+

65 ... "C": ["_0", "_0", "_1", '_2', '_2'], 

+

66 ... "D": ["_0", '_0', '_1', '_1', '_1'], 

+

67 ... "E": [1, 2, 3, 4, 5]}) 

+

68 >>> y = pd.Series([0, 1, 1, 0, 0], name='Target') 

+

69 

+

70 The result is a transformed dataframe belonging to the same dataframe library. 

+

71 

+

72 >>> obj.fit_transform(X, y) 

+

73 A B C D E 

+

74 0 _0|_1 _1|_2 _0|_1|_2 _0 1 

+

75 1 _0|_1 _1|_2 _0|_1|_2 _0 2 

+

76 2 _2 _1|_2 _0|_1|_2 _1 3 

+

77 3 _2 _1|_2 _0|_1|_2 _1 4 

+

78 4 _0|_1 _1|_2 _0|_1|_2 _1 5 

+

79 

+

80 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

81 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

82 when the number of rows is small *e.g.* in real-time environment. 

+

83 

+

84 >>> obj.transform_numpy(X.to_numpy()) 

+

85 array([['_0|_1', '_1|_2', '_0|_1|_2', '_0', 1], 

+

86 ['_0|_1', '_1|_2', '_0|_1|_2', '_0', 2], 

+

87 ['_2', '_1|_2', '_0|_1|_2', '_1', 3], 

+

88 ['_2', '_1|_2', '_0|_1|_2', '_1', 4], 

+

89 ['_0|_1', '_1|_2', '_0|_1|_2', '_1', 5]], dtype=object) 

+

90 """ 

+

91 

+

92 def __init__(self, inplace: bool = True): 

+

93 Transformer.__init__(self) 

+

94 self.inplace = inplace 

+

95 self.replace = None 

+

96 self.columns = [] 

+

97 self.idx_columns: np.ndarray = np.array([]) 

+

98 self.to_replace_dict = {} 

+

99 self.is_binned = False 

+

100 

+

101 def fit(self, X: DataFrame, y: Series) -> "BinSingleTargetClassCategories": 

+

102 """Fit the transformer on the dataframe `X`. 

+

103 

+

104 Parameters 

+

105 ---------- 

+

106 X : DataFrame. 

+

107 Input dataframe. 

+

108 y : Series. 

+

109 Target values. 

+

110 

+

111 Returns 

+

112 ------- 

+

113 BinSingleTargetClassCategories 

+

114 Instance of itself. 

+

115 """ 

+

116 self.check_dataframe(X) 

+

117 self.check_target(X, y) 

+

118 if object not in X.dtypes.to_numpy(): 

+

119 self.is_binned = False 

+

120 warnings.warn( 

+

121 """`X` does not contain object columns: 

+

122 `BinSingleTargetClassCategories` is not needed""" 

+

123 ) 

+

124 return self 

+

125 y_name = y.name 

+

126 self.base_columns = list(X.columns) 

+

127 self.columns = util.get_datatype_columns(X, datatype=object) 

+

128 means = ( 

+

129 util.get_function(X) 

+

130 .melt( 

+

131 util.get_function(X).join(X[self.columns], y.to_frame()), id_vars=y_name 

+

132 ) 

+

133 .groupby( 

+

134 ["variable", "value"], 

+

135 ) 

+

136 .mean()[y_name] 

+

137 ) 

+

138 means = util.get_function(X).to_pandas(means) 

+

139 means = ( 

+

140 means.groupby("variable") 

+

141 .apply(lambda x: x.sort_index(level=1).sort_values()) 

+

142 .droplevel(0) 

+

143 ) 

+

144 extreme_columns = ( 

+

145 means[(means == 0) | (means == 1)].index.get_level_values(0).unique() 

+

146 ) 

+

147 self.to_replace_dict = {c: {} for c in extreme_columns} 

+

148 self.column_names = self.get_column_names( 

+

149 self.inplace, extreme_columns, "bin_single" 

+

150 ) 

+

151 for c in extreme_columns: 

+

152 cats_0, cats_1 = [], [] 

+

153 idx = (means[c] == 0).sum() 

+

154 if idx: 

+

155 cats_0 = list(means[c].index[: idx + 1]) 

+

156 idx = (means[c] == 1).sum() 

+

157 if idx: 

+

158 cats_1 = list(means[c].index[-idx - 1 :]) 

+

159 if bool(set(cats_0) & set(cats_1)): 

+

160 cats_0 = sorted(list(set(cats_0 + cats_1))) 

+

161 cats_1 = sorted(list(set(cats_0 + cats_1))) 

+

162 

+

163 d_0 = dict(zip(cats_0, len(cats_0) * ["|".join(cats_0)])) 

+

164 d_1 = dict(zip(cats_1, len(cats_1) * ["|".join(cats_1)])) 

+

165 self.to_replace_dict[c] = {**d_0, **d_1} 

+

166 self.is_binned = ( 

+

167 True if sum([len(val) for val in self.to_replace_dict.values()]) else False 

+

168 ) 

+

169 if not self.is_binned: 

+

170 return self 

+

171 self.replace = Replace( 

+

172 to_replace_dict=self.to_replace_dict, inplace=self.inplace 

+

173 ).fit(X) 

+

174 return self 

+

175 

+

176 def transform(self, X: DataFrame) -> DataFrame: 

+

177 """Transform the dataframe `X`. 

+

178 

+

179 Parameters 

+

180 ---------- 

+

181 X : DataFrame. 

+

182 Input dataframe. 

+

183 

+

184 Returns 

+

185 ------- 

+

186 X : DataFrame 

+

187 Transformed dataframe. 

+

188 """ 

+

189 self.check_dataframe(X) 

+

190 

+

191 if not self.is_binned: 

+

192 return X 

+

193 columns = dict(zip(self.replace.column_names, self.column_names)) 

+

194 return self.replace.transform(X).rename(columns=columns) 

+

195 

+

196 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

197 """Transform the array `X`. 

+

198 

+

199 Parameters 

+

200 ---------- 

+

201 X : np.ndarray 

+

202 Array. 

+

203 

+

204 Returns 

+

205 ------- 

+

206 X : np.ndarray 

+

207 Transformed array. 

+

208 """ 

+

209 self.check_array(X) 

+

210 if not self.is_binned: 

+

211 return X 

+

212 return self.replace.transform_numpy(X) 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb_binning_py.html b/cov_html/d_b13ffdfa7fdfb0fb_binning_py.html new file mode 100644 index 00000000..c9f2ceac --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_binning_py.html @@ -0,0 +1,215 @@ + + + + + + Coverage for gators/binning/binning.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/binning.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 24 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import List, Tuple 

+

3 

+

4import numpy as np 

+

5import pandas as pd 

+

6 

+

7from ..util import util 

+

8from ._base_binning import _BaseBinning 

+

9 

+

10EPSILON = 1e-10 

+

11 

+

12from gators import DataFrame, Series 

+

13 

+

14 

+

15class Binning(_BaseBinning): 

+

16 """Bin the columns using equal distance splits. 

+

17 

+

18 The binning can be done inplace or by adding the binned 

+

19 columns to the existing data. 

+

20 

+

21 Parameters 

+

22 ---------- 

+

23 n_bins : int 

+

24 Number of bins to use. 

+

25 inplace : bool, default False 

+

26 If False, return the dataframe with the new binned columns 

+

27 with the names "column_name__bin"). Otherwise, return 

+

28 the dataframe with the existing binned columns. 

+

29 

+

30 Examples 

+

31 --------- 

+

32 Imports and initialization: 

+

33 

+

34 >>> from gators.binning import Binning 

+

35 

+

36 The binning can be done inplace by modifying the existing columns 

+

37 

+

38 >>> obj = Binning(n_bins=3, inplace=True) 

+

39 

+

40 or by adding new binned columns 

+

41 

+

42 >>> obj = Binning(n_bins=3, inplace=False) 

+

43 

+

44 The `fit`, `transform`, and `fit_transform` methods accept: 

+

45 

+

46 * `dask` dataframes: 

+

47 

+

48 >>> import dask.dataframe as dd 

+

49 >>> import pandas as pd 

+

50 >>> X = dd.from_pandas(pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}), npartitions=1) 

+

51 

+

52 * `koalas` dataframes: 

+

53 

+

54 >>> import databricks.koalas as ks 

+

55 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) 

+

56 

+

57 * and `pandas` dataframes: 

+

58 

+

59 >>> import pandas as pd 

+

60 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) 

+

61 

+

62 The result is a transformed dataframe belonging to the same dataframe library. 

+

63 

+

64 * with `inplace=True` 

+

65 

+

66 >>> obj = Binning(n_bins=3, inplace=True) 

+

67 >>> obj.fit_transform(X) 

+

68 A B 

+

69 0 (-inf, -0.33) [2.0, inf) 

+

70 1 [-0.33, 0.33) [1.0, 2.0) 

+

71 2 [0.33, inf) (-inf, 1.0) 

+

72 

+

73 * with `inplace=False` 

+

74 

+

75 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) 

+

76 >>> obj = Binning(n_bins=3, inplace=False) 

+

77 >>> obj.fit_transform(X) 

+

78 A B A__bin B__bin 

+

79 0 -1 3 (-inf, -0.33) [2.0, inf) 

+

80 1 0 1 [-0.33, 0.33) [1.0, 2.0) 

+

81 2 1 0 [0.33, inf) (-inf, 1.0) 

+

82 

+

83 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

84 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

85 when the number of rows is small *e.g.* in real-time environment. 

+

86 

+

87 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) 

+

88 >>> obj.transform_numpy(X.to_numpy()) 

+

89 array([[-1, 3, '(-inf, -0.33)', '[2.0, inf)'], 

+

90 [0, 1, '[-0.33, 0.33)', '[1.0, 2.0)'], 

+

91 [1, 0, '[0.33, inf)', '(-inf, 1.0)']], dtype=object) 

+

92 

+

93 See Also 

+

94 -------- 

+

95 gators.binning.CustomBinning 

+

96 Bin using the splits given by the user. 

+

97 gators.binning.QuantileBinning 

+

98 Bin using splits based on quantiles. 

+

99 gators.binning.TreeBinning 

+

100 Bin using splits based on decision trees. 

+

101 

+

102 """ 

+

103 

+

104 def __init__(self, n_bins: int, inplace=False): 

+

105 _BaseBinning.__init__(self, n_bins=n_bins, inplace=inplace) 

+

106 

+

107 def compute_bins( 

+

108 self, X: DataFrame, y: Series = None 

+

109 ) -> Tuple[List[List[float]], np.ndarray]: 

+

110 """Compute the bins list and the bins array. 

+

111 The bin list is used for dataframes and 

+

112 the bins array is used for arrays. 

+

113 

+

114 Parameters 

+

115 ---------- 

+

116 X : DataFrame 

+

117 Input dataframe. 

+

118 n_bins : int 

+

119 Number of bins to use. 

+

120 

+

121 Returns 

+

122 ------- 

+

123 bins : List[List[float]] 

+

124 Bin splits definition. 

+

125 The dictionary keys are the column names to bin, 

+

126 its values are the split arrays. 

+

127 bins_np : np.ndarray 

+

128 Bin splits definition for NumPy. 

+

129 """ 

+

130 n_cols = X.shape[1] 

+

131 bins_np = np.empty((self.n_bins + 1, n_cols)) 

+

132 bins_np[0, :] = -np.inf 

+

133 bins_np[-1, :] = np.inf 

+

134 x_min = util.get_function(X).to_pandas(X.min()) 

+

135 x_max = util.get_function(X).to_pandas(X.max()) 

+

136 deltas = x_max - x_min 

+

137 for i in range(1, self.n_bins): 

+

138 bins_np[i, :] = x_min + i * deltas / self.n_bins 

+

139 bins_dict = pd.DataFrame(bins_np, columns=X.columns).to_dict(orient="list") 

+

140 bins_dict = {k: np.unique(v) for k, v in bins_dict.items()} 

+

141 pretty_bins_dict = { 

+

142 k: [util.prettify_number(x, precision=2) for x in v] 

+

143 for k, v in bins_dict.items() 

+

144 } 

+

145 return bins_dict, pretty_bins_dict, bins_np 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb_custom_binning_py.html b/cov_html/d_b13ffdfa7fdfb0fb_custom_binning_py.html new file mode 100644 index 00000000..5b984c21 --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_custom_binning_py.html @@ -0,0 +1,215 @@ + + + + + + Coverage for gators/binning/custom_binning.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/custom_binning.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 29 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import Dict, List 

+

3 

+

4import pandas as pd 

+

5import numpy as np 

+

6 

+

7from ..util import util 

+

8from ._base_binning import _BaseBinning 

+

9 

+

10EPSILON = 1e-10 

+

11 

+

12 

+

13from gators import DataFrame, Series 

+

14 

+

15 

+

16class CustomBinning(_BaseBinning): 

+

17 """Bin the columns using the splits given by the user. 

+

18 

+

19 The binning can be done inplace or by adding the binned 

+

20 columns to the existing data. 

+

21 

+

22 Parameters 

+

23 ---------- 

+

24 bins_dict : Dict[str, List[float]] 

+

25 Bin splits definition. The dictionary keys are the column names to 

+

26 bin, its values are the split arrays. 

+

27 inplace : bool, default False 

+

28 If False, return the dataframe with the new binned columns 

+

29 with the names "column_name__bin"). Otherwise, return 

+

30 the dataframe with the existing binned columns. 

+

31 

+

32 Examples 

+

33 -------- 

+

34 >>> import numpy as np 

+

35 >>> from gators.binning import Binning 

+

36 

+

37 >>> bins_dict = {'A':[-np.inf, 1, np.inf], 'B':[-np.inf, 2, np.inf]} 

+

38 

+

39 The binning can be done inplace by modifying the existing columns: 

+

40 

+

41 >>> obj = CustomBinning(bins_dict=bins_dict, inplace=True) 

+

42 

+

43 or by adding new binned columns: 

+

44 

+

45 >>> obj = CustomBinning(bins_dict=bins_dict, inplace=True) 

+

46 

+

47 The `fit`, `transform`, and `fit_transform` methods accept: 

+

48 

+

49 * `dask` dataframes: 

+

50 

+

51 >>> import dask.dataframe as dd 

+

52 >>> import pandas as pd 

+

53 >>> X = dd.from_pandas(pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}), npartitions=1) 

+

54 

+

55 * `koalas` dataframes: 

+

56 

+

57 >>> import databricks.koalas as ks 

+

58 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

59 

+

60 * and `pandas` dataframes: 

+

61 

+

62 >>> import pandas as pd 

+

63 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

64 

+

65 The result is a transformed dataframe belonging to the same dataframe library. 

+

66 

+

67 * with `inplace=True` 

+

68 

+

69 >>> obj = CustomBinning(bins_dict=bins_dict, inplace=True) 

+

70 >>> obj.fit_transform(X) 

+

71 A B 

+

72 0 (-inf, 1.0) [2.0, inf) 

+

73 1 (-inf, 1.0) [2.0, inf) 

+

74 2 [1.0, inf) (-inf, 2.0) 

+

75 

+

76 * with `inplace=False` 

+

77 

+

78 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

79 >>> obj = CustomBinning(bins_dict=bins_dict, inplace=False) 

+

80 >>> obj.fit_transform(X) 

+

81 A B A__bin B__bin 

+

82 0 -1 3 (-inf, 1.0) [2.0, inf) 

+

83 1 0 2 (-inf, 1.0) [2.0, inf) 

+

84 2 1 1 [1.0, inf) (-inf, 2.0) 

+

85 

+

86 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

87 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

88 when the number of rows is small *e.g.* in real-time environment. 

+

89 

+

90 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

91 >>> obj.transform_numpy(X.to_numpy()) 

+

92 array([[-1, 3, '(-inf, 1.0)', '[2.0, inf)'], 

+

93 [0, 2, '(-inf, 1.0)', '[2.0, inf)'], 

+

94 [1, 1, '[1.0, inf)', '(-inf, 2.0)']], dtype=object) 

+

95 

+

96 

+

97 See Also 

+

98 -------- 

+

99 gators.binning.Binning 

+

100 Bin using equal splits. 

+

101 gators.binning.QuantileBinning 

+

102 Bin using splits based on quantiles. 

+

103 gators.binning.TreeBinning 

+

104 Bin using tree-based splits. 

+

105 """ 

+

106 

+

107 def __init__(self, bins_dict: Dict[str, List[float]], inplace=False): 

+

108 if not isinstance(bins_dict, dict): 

+

109 raise TypeError("`bins_dict` should be a dict.") 

+

110 _BaseBinning.__init__(self, n_bins=1, inplace=inplace) 

+

111 self.bins_dict = {key: np.array(val) for key, val in bins_dict.items()} 

+

112 

+

113 def fit(self, X: DataFrame, y: Series = None) -> "CustomBinning": 

+

114 """Fit the transformer on the dataframe `X`. 

+

115 

+

116 Parameters 

+

117 ---------- 

+

118 X : DataFrame 

+

119 Input dataframe. 

+

120 y : Series, default None. 

+

121 Target values. 

+

122 

+

123 Returns 

+

124 ------- 

+

125 self : 'CustomBinning' 

+

126 Instance of itself. 

+

127 """ 

+

128 self.check_dataframe(X) 

+

129 self.base_columns = list(X.columns) 

+

130 self.columns = list(self.bins_dict.keys()) 

+

131 self.column_names = [f"{c}__bin" for c in self.columns] 

+

132 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

+

133 n_cols = self.idx_columns.size 

+

134 if n_cols == 0: 

+

135 return self 

+

136 self.pretty_bins_dict = { 

+

137 k: [util.prettify_number(x, precision=2) for x in v] 

+

138 for k, v in self.bins_dict.items() 

+

139 } 

+

140 self.labels, self.labels_np = self.get_labels(self.pretty_bins_dict) 

+

141 max_bins = max([len(v) for v in self.bins_dict.values()]) 

+

142 self.bins_np = np.inf * np.ones((max_bins, n_cols)) 

+

143 for i, b in enumerate(self.bins_dict.values()): 

+

144 self.bins_np[: len(b), i] = b 

+

145 return self 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb_custom_discretizer_py.html b/cov_html/d_b13ffdfa7fdfb0fb_custom_discretizer_py.html deleted file mode 100644 index 36c926ba..00000000 --- a/cov_html/d_b13ffdfa7fdfb0fb_custom_discretizer_py.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - Coverage for gators/binning/custom_discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_discretizer import _BaseDiscretizer 

-

3from ..util import util 

-

4from typing import List, Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10EPSILON = 1e-10 

-

11 

-

12 

-

13class CustomDiscretizer(_BaseDiscretizer): 

-

14 """Discretize the columns using the splits given by the user. 

-

15 

-

16 The discretization can be done inplace or by adding the discretized 

-

17 columns to the existing data. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 bins : Dict[str, List[float]] 

-

22 Bin splits definition. The dictionary keys are the column names to 

-

23 discretize, its values are the split arrays. 

-

24 inplace : bool, default False 

-

25 If False, return the dataframe with the new discretized columns 

-

26 with the names "`column_name`__bin"). Otherwise, return 

-

27 the dataframe with the existing binned columns. 

-

28 

-

29 Examples 

-

30 -------- 

-

31 * fit & transform with `pandas` 

-

32 

-

33 - inplace discretization 

-

34 >>> import pandas as pd 

-

35 >>> import numpy as np 

-

36 >>> from gators.binning import CustomDiscretizer 

-

37 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

38 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

39 >>> obj = CustomDiscretizer(bins=bins, inplace=True) 

-

40 >>> obj.fit_transform(X) 

-

41 A B 

-

42 0 0.0 0.0 

-

43 1 0.0 1.0 

-

44 2 1.0 1.0 

-

45  

-

46 - add discretization 

-

47 

-

48 >>> import pandas as pd 

-

49 >>> import numpy as np 

-

50 >>> from gators.binning import CustomDiscretizer 

-

51 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

52 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

53 >>> obj = CustomDiscretizer(bins=bins, inplace=False) 

-

54 >>> obj.fit_transform(X) 

-

55 A B A__bin B__bin 

-

56 0 -1 1 0.0 0.0 

-

57 1 0 2 0.0 1.0 

-

58 2 1 3 1.0 1.0 

-

59 

-

60 * fit & transform with `koalas` 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> import numpy as np 

-

64 >>> from gators.binning import CustomDiscretizer 

-

65 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

66 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

67 >>> obj = CustomDiscretizer(bins=bins) 

-

68 >>> obj.fit_transform(X) 

-

69 A B A__bin B__bin 

-

70 0 -1 1 0.0 0.0 

-

71 1 0 2 0.0 1.0 

-

72 2 1 3 1.0 1.0 

-

73 

-

74 * fit with `pandas` & transform with `NumPy` 

-

75 

-

76 >>> import pandas as pd 

-

77 >>> import numpy as np 

-

78 >>> from gators.binning import CustomDiscretizer 

-

79 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

80 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

81 >>> obj = CustomDiscretizer(bins=bins) 

-

82 >>> _ = obj.fit(X) 

-

83 >>> obj.transform_numpy(X.to_numpy()) 

-

84 array([[-1, 1, '0.0', '0.0'], 

-

85 [0, 2, '0.0', '1.0'], 

-

86 [1, 3, '1.0', '1.0']], dtype=object) 

-

87 

-

88 * fit with `koalas` & transform with `NumPy` 

-

89 

-

90 >>> import databricks.koalas as ks 

-

91 >>> import numpy as np 

-

92 >>> from gators.binning import CustomDiscretizer 

-

93 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

94 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

95 >>> obj = CustomDiscretizer(bins=bins) 

-

96 >>> _ = obj.fit(X) 

-

97 >>> obj.transform_numpy(X.to_numpy()) 

-

98 array([[-1, 1, '0.0', '0.0'], 

-

99 [0, 2, '0.0', '1.0'], 

-

100 [1, 3, '1.0', '1.0']], dtype=object) 

-

101 

-

102 See Also 

-

103 -------- 

-

104 gators.binning.Discretizer 

-

105 Discretize using equal splits. 

-

106 gators.binning.QuantileDiscretizer 

-

107 Discretize using splits based on quantiles. 

-

108 

-

109 """ 

-

110 

-

111 def __init__(self, bins: Dict[str, List[float]], inplace=False): 

-

112 if not isinstance(bins, dict): 

-

113 raise TypeError('`bins` should be a dict.') 

-

114 _BaseDiscretizer.__init__(self, n_bins=0, inplace=inplace) 

-

115 self.bins = {key: np.array(val) for key, val in bins.items()} 

-

116 

-

117 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

118 y=None) -> 'CustomDiscretizer': 

-

119 """Fit the transformer on the dataframe `X`. 

-

120 

-

121 Parameters 

-

122 ---------- 

-

123 X : Union[pd.DataFrame, ks.DataFrame] 

-

124 Input dataframe. 

-

125 y : Union[pd.Series, ks.Series], default to None. 

-

126 Labels. 

-

127 

-

128 Returns 

-

129 ------- 

-

130 'CustomDiscretizer' 

-

131 Instance of itself. 

-

132 """ 

-

133 self.check_dataframe(X) 

-

134 self.columns = list(self.bins.keys()) 

-

135 self.output_columns = [f'{c}__bin' for c in self.columns] 

-

136 self.idx_columns = util.get_idx_columns( 

-

137 X.columns, self.columns 

-

138 ) 

-

139 n_cols = len(self.idx_columns) 

-

140 if n_cols == 0: 

-

141 return self 

-

142 max_bins = max([len(v) for v in self.bins.values()]) 

-

143 self.labels = np.arange(max_bins-1) 

-

144 self.bins_np = np.inf * np.ones((max_bins, n_cols)) 

-

145 for i, b in enumerate(self.bins.values()): 

-

146 self.bins_np[:len(b), i] = b 

-

147 if isinstance(X, ks.DataFrame): 

-

148 self.bins = self.bins_np.T.tolist() 

-

149 self.bins = [np.unique(b)+EPSILON for b in self.bins] 

-

150 return self 

-
- - - diff --git a/cov_html/d_b13ffdfa7fdfb0fb_discretizer_py.html b/cov_html/d_b13ffdfa7fdfb0fb_discretizer_py.html deleted file mode 100644 index 64ec2637..00000000 --- a/cov_html/d_b13ffdfa7fdfb0fb_discretizer_py.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Coverage for gators/binning/discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_discretizer import _BaseDiscretizer 

-

3from typing import List, Tuple, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ..util import util 

-

8 

-

9EPSILON = 1e-10 

-

10 

-

11 

-

12class Discretizer(_BaseDiscretizer): 

-

13 """Discretize the columns using equal distance splits. 

-

14 

-

15 The discretization can be done inplace or by adding the discretized 

-

16 columns to the existing data. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 n_bins : int 

-

21 Number of bins to use. 

-

22 inplace : bool, default False 

-

23 If False, return the dataframe with the new discretized columns 

-

24 with the names "`column_name`__bin"). Otherwise, return 

-

25 the dataframe with the existing binned columns. 

-

26 

-

27 Examples 

-

28 --------- 

-

29 * fit & transform with `pandas` 

-

30 

-

31 - inplace discretization 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> from gators.binning import Discretizer 

-

35 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

36 >>> obj = Discretizer(n_bins=3, inplace=True) 

-

37 >>> obj.fit_transform(X) 

-

38 A B 

-

39 0 0.0 0.0 

-

40 1 1.0 1.0 

-

41 2 2.0 2.0 

-

42 

-

43 - add discretization 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.binning import Discretizer 

-

47 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

48 >>> obj = Discretizer(n_bins=3, inplace=False) 

-

49 >>> obj.fit_transform(X) 

-

50 A B A__bin B__bin 

-

51 0 -1 1 0.0 0.0 

-

52 1 0 2 1.0 1.0 

-

53 2 1 3 2.0 2.0 

-

54  

-

55 * fit & transform with `koalas` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.binning import Discretizer 

-

59 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

60 >>> obj = Discretizer(n_bins=3) 

-

61 >>> obj.fit_transform(X) 

-

62 A B A__bin B__bin 

-

63 0 -1 1 0.0 0.0 

-

64 1 0 2 1.0 1.0 

-

65 2 1 3 2.0 2.0 

-

66 

-

67 * fit with `pandas` & transform with `NumPy` 

-

68 

-

69 >>> import pandas as pd 

-

70 >>> from gators.binning import Discretizer 

-

71 >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) 

-

72 >>> obj = Discretizer(n_bins=3) 

-

73 >>> _ = obj.fit(X) 

-

74 >>> obj.transform_numpy(X.to_numpy()) 

-

75 array([[-1.0, 1.0, '0.0', '0.0'], 

-

76 [0.0, 2.0, '1.0', '1.0'], 

-

77 [1.0, 3.0, '2.0', '2.0']], dtype=object) 

-

78 

-

79 * fit with `koalas` & transform with `NumPy` 

-

80 

-

81 >>> import databricks.koalas as ks 

-

82 >>> from gators.binning import Discretizer 

-

83 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

84 >>> obj = Discretizer(n_bins=3) 

-

85 >>> _ = obj.fit(X) 

-

86 >>> obj.transform_numpy(X.to_numpy()) 

-

87 array([[-1, 1, '0.0', '0.0'], 

-

88 [0, 2, '1.0', '1.0'], 

-

89 [1, 3, '2.0', '2.0']], dtype=object) 

-

90 

-

91 See Also 

-

92 -------- 

-

93 gators.binning.CustomDiscretizer 

-

94 Discretize using the splits given by the user. 

-

95 gators.binning.QuantileDiscretizer 

-

96 Discretize using splits based on quantiles. 

-

97 

-

98 """ 

-

99 

-

100 def __init__(self, n_bins: int, inplace=False): 

-

101 _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) 

-

102 

-

103 @staticmethod 

-

104 def compute_bins(X: Union[pd.DataFrame, ks.DataFrame], n_bins: int 

-

105 ) -> Tuple[List[List[float]], np.ndarray]: 

-

106 """Compute the bins list and the bins array. 

-

107 The bin list is used for dataframes and 

-

108 the bins array is used for arrays. 

-

109 

-

110 Parameters 

-

111 ---------- 

-

112 X : Union[pd.DataFrame, ks.DataFrame] 

-

113 Input dataframe. 

-

114 n_bins : int 

-

115 Number of bins to use. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 bins : List[List[float]] 

-

120 Bin splits definition. 

-

121 The dictionary keys are the column names to discretize, 

-

122 its values are the split arrays. 

-

123 bins_np : np.ndarray 

-

124 Bin splits definition for NumPy. 

-

125 """ 

-

126 n_cols = X.shape[1] 

-

127 X_dtype = X.dtypes.to_numpy()[0] 

-

128 if isinstance(X, pd.DataFrame): 

-

129 deltas = X.max() - X.min() 

-

130 bins_np = np.empty((n_bins+1, n_cols)) 

-

131 bins_np[0, :] = util.get_bounds(X_dtype)[0] 

-

132 bins_np[-1, :] = util.get_bounds(X_dtype)[1] 

-

133 for i in range(1, n_bins): 

-

134 bins_np[i, :] = X.min() + i * deltas / n_bins 

-

135 

-

136 bins = pd.DataFrame( 

-

137 bins_np, columns=X.columns).to_dict( 

-

138 orient='list') 

-

139 return bins, bins_np 

-

140 x_min = X.min().to_pandas() 

-

141 x_max = X.max().to_pandas() 

-

142 deltas = x_max - x_min 

-

143 bins_np = np.empty((n_bins+1, n_cols)) 

-

144 bins_np[0, :] = util.get_bounds(X_dtype)[0] 

-

145 bins_np[-1, :] = util.get_bounds(X_dtype)[1] 

-

146 for i in range(1, n_bins): 

-

147 bins_np[i, :] = x_min + i * deltas / n_bins 

-

148 bins = (bins_np.T + EPSILON).tolist() 

-

149 return bins, bins_np 

-
- - - diff --git a/cov_html/d_b13ffdfa7fdfb0fb_quantile_binning_py.html b/cov_html/d_b13ffdfa7fdfb0fb_quantile_binning_py.html new file mode 100644 index 00000000..d9cd9f48 --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_quantile_binning_py.html @@ -0,0 +1,213 @@ + + + + + + Coverage for gators/binning/quantile_binning.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/quantile_binning.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 26 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import List, Tuple 

+

3 

+

4import numpy as np 

+

5 

+

6from ..util import util 

+

7from ._base_binning import _BaseBinning 

+

8from gators import DataFrame, Series 

+

9 

+

10 

+

11class QuantileBinning(_BaseBinning): 

+

12 """Bin the columns using quantile-based splits. 

+

13 

+

14 The binning can be done inplace or by adding the binned 

+

15 columns to the existing data. 

+

16 

+

17 Parameters 

+

18 ---------- 

+

19 n_bins : int 

+

20 Number of bins to use. 

+

21 inplace : bool, default False 

+

22 If False, return the dataframe with the new binned columns 

+

23 with the names "column_name__bin"). Otherwise, return 

+

24 the dataframe with the existing binned columns. 

+

25 

+

26 Examples 

+

27 --------- 

+

28 >>> from gators.binning import QuantileBinning 

+

29 

+

30 The binning can be done inplace by modifying the existing columns 

+

31 

+

32 >>> obj = QuantileBinning(n_bins=3, inplace=True) 

+

33 

+

34 or by adding new binned columns 

+

35 

+

36 >>> obj = QuantileBinning(n_bins=3, inplace=True) 

+

37 

+

38 The `fit`, `transform`, and `fit_transform` methods accept: 

+

39 

+

40 * `dask` dataframes: 

+

41 

+

42 >>> import dask.dataframe as dd 

+

43 >>> import pandas as pd 

+

44 >>> X = dd.from_pandas(pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}), npartitions=1) 

+

45 

+

46 * `koalas` dataframes: 

+

47 

+

48 >>> import databricks.koalas as ks 

+

49 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

50 

+

51 * and `pandas` dataframes: 

+

52 

+

53 >>> import pandas as pd 

+

54 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

55 

+

56 The result is a transformed dataframe belonging to the same dataframe library. 

+

57 

+

58 * with `inplace=True` 

+

59 

+

60 >>> obj = QuantileBinning(n_bins=3, inplace=True) 

+

61 >>> obj.fit_transform(X) 

+

62 A B 

+

63 0 (-inf, -0.33) [2.33, inf) 

+

64 1 [-0.33, 0.33) [1.67, 2.33) 

+

65 2 [0.33, inf) (-inf, 1.67) 

+

66 

+

67 * with `inplace=False` 

+

68 

+

69 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

70 >>> obj = QuantileBinning(n_bins=3, inplace=False) 

+

71 >>> obj.fit_transform(X) 

+

72 A B A__bin B__bin 

+

73 0 -1 3 (-inf, -0.33) [2.33, inf) 

+

74 1 0 2 [-0.33, 0.33) [1.67, 2.33) 

+

75 2 1 1 [0.33, inf) (-inf, 1.67) 

+

76 

+

77 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

78 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

79 when the number of rows is small *e.g.* in real-time environment. 

+

80 

+

81 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) 

+

82 >>> obj.transform_numpy(X.to_numpy()) 

+

83 array([[-1, 3, '(-inf, -0.33)', '[2.33, inf)'], 

+

84 [0, 2, '[-0.33, 0.33)', '[1.67, 2.33)'], 

+

85 [1, 1, '[0.33, inf)', '(-inf, 1.67)']], dtype=object) 

+

86 

+

87 See Also 

+

88 -------- 

+

89 gators.binning.Binning 

+

90 Bin using equal splits. 

+

91 gators.binning.CustomBinning 

+

92 Bin using the variable quantiles. 

+

93 gators.binning.TreeBinning 

+

94 Bin using tree-based splits. 

+

95 """ 

+

96 

+

97 def __init__(self, n_bins: int, inplace=False): 

+

98 _BaseBinning.__init__(self, n_bins=n_bins, inplace=inplace) 

+

99 

+

100 def compute_bins( 

+

101 self, X: DataFrame, y: Series = None 

+

102 ) -> Tuple[List[List[float]], np.ndarray]: 

+

103 """Compute the bins list and the bins array. 

+

104 The bin list is used for dataframes and 

+

105 the bins array is used for arrays. 

+

106 

+

107 Parameters 

+

108 ---------- 

+

109 X : DataFrame 

+

110 Input dataframe. 

+

111 n_bins : int 

+

112 Number of bins to use. 

+

113 

+

114 Returns 

+

115 ------- 

+

116 bins : List[List[float]] 

+

117 Bin splits definition. 

+

118 The dictionary keys are the column names to bin, 

+

119 its values are the split arrays. 

+

120 bins_np : np.ndarray 

+

121 Bin splits definition for NumPy. 

+

122 """ 

+

123 q = np.linspace(0.001, 0.999, self.n_bins + 1)[1:-1].tolist() 

+

124 bins = X.quantile(q=q) 

+

125 bins = util.get_function(bins).to_pandas(bins) 

+

126 bins.loc[-np.inf, :] = -np.inf 

+

127 bins.loc[np.inf, :] = np.inf 

+

128 bins = bins.sort_index() 

+

129 for c in X.columns: 

+

130 unique_bins = bins[c].iloc[1:-1].unique() 

+

131 n_unique = unique_bins.shape[0] 

+

132 bins[c].iloc[1 : 1 + n_unique] = unique_bins 

+

133 bins[c].iloc[1 + n_unique :] = np.inf 

+

134 

+

135 bins = bins.applymap(lambda x: util.prettify_number(x, precision=2)) 

+

136 bins_np = bins.to_numpy() 

+

137 bins_dict = bins.to_dict(orient="list") 

+

138 bins_dict = {k: np.unique(v) for k, v in bins_dict.items()} 

+

139 pretty_bins_dict = { 

+

140 k: [util.prettify_number(x, precision=2) for x in v] 

+

141 for k, v in bins_dict.items() 

+

142 } 

+

143 return bins_dict, pretty_bins_dict, bins_np 

+
+ + + diff --git a/cov_html/d_b13ffdfa7fdfb0fb_quantile_discretizer_py.html b/cov_html/d_b13ffdfa7fdfb0fb_quantile_discretizer_py.html deleted file mode 100644 index 008b1573..00000000 --- a/cov_html/d_b13ffdfa7fdfb0fb_quantile_discretizer_py.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - Coverage for gators/binning/quantile_discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_discretizer import _BaseDiscretizer 

-

3from typing import Tuple, List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ..util import util 

-

8 

-

9EPSILON = 1e-10 

-

10 

-

11 

-

12class QuantileDiscretizer(_BaseDiscretizer): 

-

13 """Discretize the columns using quantile-based splits. 

-

14 

-

15 The discretization can be done inplace or by adding the discretized 

-

16 columns to the existing data. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 n_bins : int 

-

21 Number of bins to use. 

-

22 inplace : bool, default to False 

-

23 If False, return the dataframe with the new discretized columns 

-

24 with the names '`column_name`__bin'). Otherwise, return 

-

25 the dataframe with the existing binned columns. 

-

26 

-

27 Examples 

-

28 --------- 

-

29 * fit & transform with `pandas` 

-

30 

-

31 - inplace discretization 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> from gators.binning import QuantileDiscretizer 

-

35 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

36 >>> obj = QuantileDiscretizer(n_bins=3, inplace=True) 

-

37 >>> obj.fit_transform(X) 

-

38 A B 

-

39 0 0.0 0.0 

-

40 1 1.0 1.0 

-

41 2 2.0 2.0 

-

42 

-

43 - add discretization 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.binning import QuantileDiscretizer 

-

47 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

48 >>> obj = QuantileDiscretizer(n_bins=3, inplace=False) 

-

49 >>> obj.fit_transform(X) 

-

50 A B A__bin B__bin 

-

51 0 -1 1 0.0 0.0 

-

52 1 0 2 1.0 1.0 

-

53 2 1 3 2.0 2.0 

-

54 

-

55 * fit & transform with `koalas` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.binning import QuantileDiscretizer 

-

59 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

60 >>> obj = QuantileDiscretizer(n_bins=3) 

-

61 >>> obj.fit_transform(X) 

-

62 A B A__bin B__bin 

-

63 0 -1 1 0.0 0.0 

-

64 1 0 2 1.0 1.0 

-

65 2 1 3 2.0 2.0 

-

66 

-

67 * fit with `pandas` & transform with `NumPy` 

-

68 

-

69 >>> import pandas as pd 

-

70 >>> from gators.binning import QuantileDiscretizer 

-

71 >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) 

-

72 >>> obj = QuantileDiscretizer(n_bins=3) 

-

73 >>> _ = obj.fit(X) 

-

74 >>> obj.transform_numpy(X.to_numpy()) 

-

75 array([[-1.0, 1.0, '0.0', '0.0'], 

-

76 [0.0, 2.0, '1.0', '1.0'], 

-

77 [1.0, 3.0, '2.0', '2.0']], dtype=object) 

-

78 

-

79 * fit with `koalas` & transform with `NumPy` 

-

80 

-

81 >>> import databricks.koalas as ks 

-

82 >>> from gators.binning import QuantileDiscretizer 

-

83 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

84 >>> obj = QuantileDiscretizer(n_bins=3) 

-

85 >>> _ = obj.fit(X) 

-

86 >>> obj.transform_numpy(X.to_numpy()) 

-

87 array([[-1, 1, '0.0', '0.0'], 

-

88 [0, 2, '1.0', '1.0'], 

-

89 [1, 3, '2.0', '2.0']], dtype=object) 

-

90 

-

91 See Also 

-

92 -------- 

-

93 gators.binning.Discretizer 

-

94 Discretize using equal splits. 

-

95 gators.binning.CustomDiscretizer 

-

96 Discretize using the variable quantiles. 

-

97 

-

98 """ 

-

99 

-

100 def __init__(self, n_bins: int, inplace=False): 

-

101 _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) 

-

102 

-

103 @staticmethod 

-

104 def compute_bins(X: Union[pd.DataFrame, ks.DataFrame], n_bins: int 

-

105 ) -> Tuple[List[List[float]], np.ndarray]: 

-

106 """Compute the bins list and the bins array. 

-

107 The bin list is used for dataframes and 

-

108 the bins array is used for arrays. 

-

109 

-

110 Parameters 

-

111 ---------- 

-

112 X : Union[pd.DataFrame, ks.DataFrame] 

-

113 Input dataframe. 

-

114 n_bins : int 

-

115 Number of bins to use. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 bins : List[List[float]] 

-

120 Bin splits definition. 

-

121 The dictionary keys are the column names to discretize, 

-

122 its values are the split arrays. 

-

123 bins_np : np.ndarray 

-

124 Bin splits definition for NumPy. 

-

125 """ 

-

126 q = np.linspace(0, 1, n_bins+1)[1:-1].tolist() 

-

127 X_dtype = X.dtypes.to_numpy()[0] 

-

128 

-

129 def f(x): 

-

130 return x.quantile(q=q) 

-

131 

-

132 bins = X.apply(f) 

-

133 if isinstance(bins, ks.DataFrame): 

-

134 bins = bins.to_pandas() 

-

135 bins.loc[-np.inf, :] = util.get_bounds(X_dtype)[0] 

-

136 bins.loc[np.inf, :] = util.get_bounds(X_dtype)[1] 

-

137 bins = bins.sort_index() 

-

138 for c in X.columns: 

-

139 unique_bins = bins[c].iloc[1:-1].unique() 

-

140 n_unique = unique_bins.shape[0] 

-

141 bins[c].iloc[1:1+n_unique] = unique_bins 

-

142 bins[c].iloc[1+n_unique:] = util.get_bounds(X_dtype)[1] 

-

143 bins_np = bins.to_numpy() 

-

144 if isinstance(X, pd.DataFrame): 

-

145 return bins.to_dict(orient='list'), bins_np 

-

146 else: 

-

147 bins = bins_np.T.tolist() 

-

148 return [np.unique(b)+EPSILON for b in bins], bins_np 

-
- - - diff --git a/cov_html/d_b13ffdfa7fdfb0fb_tree_binning_py.html b/cov_html/d_b13ffdfa7fdfb0fb_tree_binning_py.html new file mode 100644 index 00000000..6bd0a302 --- /dev/null +++ b/cov_html/d_b13ffdfa7fdfb0fb_tree_binning_py.html @@ -0,0 +1,261 @@ + + + + + + Coverage for gators/binning/tree_binning.py: 100% + + + + + +
+
+

+ Coverage for gators/binning/tree_binning.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 34 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import Union 

+

3 

+

4import numpy as np 

+

5from sklearn import tree 

+

6from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor 

+

7 

+

8from ..util import util 

+

9from ._base_binning import _BaseBinning 

+

10 

+

11 

+

12from gators import DataFrame 

+

13 

+

14 

+

15class TreeBinning(_BaseBinning): 

+

16 """Bin the columns using decision tree based splits. 

+

17 

+

18 The binning can be done inplace or by adding the binned 

+

19 columns to the existing data. 

+

20 

+

21 Parameters 

+

22 ---------- 

+

23 tree : 'DecisionTree' 

+

24 Decision tree model used to create the bin intervals. 

+

25 inplace : bool, default False 

+

26 If False, return the dataframe with the new binned columns 

+

27 with the names "column_name__bin"). Otherwise, return 

+

28 the dataframe with the existing binned columns. 

+

29 

+

30 Examples 

+

31 --------- 

+

32 >>> from gators.binning import TreeBinning 

+

33 >>> from sklearn.tree import DecisionTreeClassifier 

+

34 

+

35 The binning can be done inplace by modifying the existing columns 

+

36 

+

37 >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=True) 

+

38 

+

39 or by adding new binned columns 

+

40 

+

41 >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=True) 

+

42 

+

43 The `fit`, `transform`, and `fit_transform` methods accept: 

+

44 

+

45 * `dask` dataframes: 

+

46 

+

47 >>> import dask.dataframe as dd 

+

48 >>> import pandas as pd 

+

49 >>> X = dd.from_pandas(pd.DataFrame({ 

+

50 ... 'A': [1.07, -2.59, -1.54, 1.72], 

+

51 ... 'B': [-1.19, -0.22, -0.28, 1.28], 

+

52 ... 'C': [-1.15, 1.92, 1.09, -0.95]}), npartitions=1) 

+

53 >>> y = dd.from_pandas(pd.Series([0, 1, 0, 1], name="TARGET"), npartitions=1) 

+

54 

+

55 * `koalas` dataframes: 

+

56 

+

57 >>> import databricks.koalas as ks 

+

58 >>> X = ks.DataFrame({ 

+

59 ... 'A': [1.07, -2.59, -1.54, 1.72], 

+

60 ... 'B': [-1.19, -0.22, -0.28, 1.28], 

+

61 ... 'C': [-1.15, 1.92, 1.09, -0.95]}) 

+

62 >>> y = ks.Series([0, 1, 0, 1], name="TARGET") 

+

63 

+

64 * and `pandas` dataframes: 

+

65 

+

66 >>> import pandas as pd 

+

67 >>> X = pd.DataFrame({ 

+

68 ... 'A': [1.07, -2.59, -1.54, 1.72], 

+

69 ... 'B': [-1.19, -0.22, -0.28, 1.28], 

+

70 ... 'C': [-1.15, 1.92, 1.09, -0.95]}) 

+

71 >>> y = pd.Series([0, 1, 0, 1], name="TARGET") 

+

72 

+

73 The result is a transformed dataframe belonging to the same dataframe library. 

+

74 

+

75 * with `inplace=True` 

+

76 

+

77 >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=True) 

+

78 >>> obj.fit_transform(X, y) 

+

79 A B C 

+

80 0 [-2.06, 1.4) (-inf, -0.25) (-inf, -1.05) 

+

81 1 (-inf, -2.06) [-0.25, inf) [0.07, inf) 

+

82 2 [-2.06, 1.4) (-inf, -0.25) [0.07, inf) 

+

83 3 [1.4, inf) [-0.25, inf) [-1.05, 0.07) 

+

84 

+

85 * with `inplace=False` 

+

86 

+

87 >>> X = pd.DataFrame({ 

+

88 ... 'A': [1.07, -2.59, -1.54, 1.72], 

+

89 ... 'B': [-1.19, -0.22, -0.28, 1.28], 

+

90 ... 'C': [-1.15, 1.92, 1.09, -0.95]}) 

+

91 >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=False) 

+

92 >>> obj.fit_transform(X, y) 

+

93 A B C A__bin B__bin C__bin 

+

94 0 1.07 -1.19 -1.15 [-2.06, 1.4) (-inf, -0.25) (-inf, -1.05) 

+

95 1 -2.59 -0.22 1.92 (-inf, -2.06) [-0.25, inf) [0.07, inf) 

+

96 2 -1.54 -0.28 1.09 [-2.06, 1.4) (-inf, -0.25) [0.07, inf) 

+

97 3 1.72 1.28 -0.95 [1.4, inf) [-0.25, inf) [-1.05, 0.07) 

+

98 

+

99 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

100 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

101 when the number of rows is small *e.g.* in real-time environment. 

+

102 

+

103 >>> X = pd.DataFrame({ 

+

104 ... 'A': [1.07, -2.59, -1.54, 1.72], 

+

105 ... 'B': [-1.19, -0.22, -0.28, 1.28], 

+

106 ... 'C': [-1.15, 1.92, 1.09, -0.95]}) 

+

107 >>> obj.transform_numpy(X.to_numpy()) 

+

108 array([[1.07, -1.19, -1.15, '[-2.06, 1.4)', '(-inf, -0.25)', 

+

109 '(-inf, -1.05)'], 

+

110 [-2.59, -0.22, 1.92, '(-inf, -2.06)', '[-0.25, inf)', 

+

111 '[0.07, inf)'], 

+

112 [-1.54, -0.28, 1.09, '[-2.06, 1.4)', '(-inf, -0.25)', 

+

113 '[0.07, inf)'], 

+

114 [1.72, 1.28, -0.95, '[1.4, inf)', '[-0.25, inf)', '[-1.05, 0.07)']], 

+

115 dtype=object) 

+

116 

+

117 See Also 

+

118 -------- 

+

119 gators.binning.CustomBinning 

+

120 Bin using user input splits. 

+

121 gators.binning.Binning 

+

122 Bin using equal splits. 

+

123 gators.binning.CustomBinning 

+

124 Bin using the variable quantiles. 

+

125 

+

126 """ 

+

127 

+

128 def __init__( 

+

129 self, tree: Union[DecisionTreeClassifier, DecisionTreeRegressor], inplace=False 

+

130 ): 

+

131 _BaseBinning.__init__(self, n_bins=1, inplace=inplace) 

+

132 self.tree = tree 

+

133 

+

134 def fit(self, X: DataFrame, y) -> "TreeBinning": 

+

135 """Fit the transformer on the dataframe `X`. 

+

136 

+

137 Parameters 

+

138 ---------- 

+

139 X : DataFrame 

+

140 Input dataframe. 

+

141 y : Series, default None. 

+

142 Target values. 

+

143 

+

144 Returns 

+

145 ------- 

+

146 "TreeBinning" 

+

147 Instance of itself. 

+

148 """ 

+

149 self.check_dataframe(X) 

+

150 self.check_target(X, y) 

+

151 self.base_columns = list(X.columns) 

+

152 self.columns = util.get_numerical_columns(X) 

+

153 self.column_names = [f"{c}__bin" for c in self.columns] 

+

154 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

+

155 n_cols = self.idx_columns.size 

+

156 if n_cols == 0: 

+

157 return self 

+

158 self.bins = {} 

+

159 for c in self.columns: 

+

160 self.tree.fit( 

+

161 util.get_function(X).to_numpy(X[[c]]).astype(np.float32), 

+

162 util.get_function(X).to_numpy(y).astype(np.int32), 

+

163 ) 

+

164 

+

165 splits = sorted( 

+

166 [ 

+

167 float(node.split("<=")[1]) 

+

168 for node in tree.export_text(self.tree, decimals=6).split("| ") 

+

169 if "<=" in node 

+

170 ] 

+

171 ) 

+

172 self.bins[c] = ( 

+

173 np.unique( 

+

174 [-np.inf] 

+

175 + [util.prettify_number(x, precision=2) for x in splits] 

+

176 + [np.inf] 

+

177 ) 

+

178 if len(splits) 

+

179 else np.array([-np.inf, np.inf]) 

+

180 ) 

+

181 max_bins = max([len(v) for v in self.bins.values()]) 

+

182 self.bins_np = np.inf * np.ones((max_bins, n_cols)) 

+

183 for i, b in enumerate(self.bins.values()): 

+

184 self.bins_np[: len(b), i] = b 

+

185 self.bins_dict = {col: np.unique(self.bins[col]) for col in self.bins.keys()} 

+

186 self.pretty_bins_dict = { 

+

187 k: [util.prettify_number(x, precision=2) for x in v] 

+

188 for k, v in self.bins_dict.items() 

+

189 } 

+

190 self.labels, self.labels_np = self.get_labels(self.pretty_bins_dict) 

+

191 return self 

+
+ + + diff --git a/cov_html/d_bafb7a187804c98b__base_feature_generation_py.html b/cov_html/d_bafb7a187804c98b__base_feature_generation_py.html index 54eba71a..2b44787e 100644 --- a/cov_html/d_bafb7a187804c98b__base_feature_generation_py.html +++ b/cov_html/d_bafb7a187804c98b__base_feature_generation_py.html @@ -6,94 +6,98 @@ Coverage for gators/feature_generation/_base_feature_generation.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ..transformers.transformer import Transformer 

-

4import numpy as np 

-

5from typing import List, Union 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseFeatureGeneration(Transformer): 

-

11 """Base feature generation transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of generated columns. 

-

19 patterns : List[str] 

-

20 List of patterns. 

-

21 column_mapping: Dict[str, List[str]] 

-

22 Mapping between generated features and base features. 

-

23 

-

24 """ 

-

25 

-

26 def __init__(self, columns: List[str], 

-

27 column_names: List[str], column_mapping: List[str], 

-

28 dtype: type = None): 

-

29 Transformer.__init__(self) 

-

30 self.column_names = column_names 

-

31 self.columns = columns 

-

32 self.column_mapping = column_mapping 

-

33 self.idx_columns: np.ndarray = np.array([]) 

-

34 self.dtype = dtype 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_cluster_statistics_py.html b/cov_html/d_bafb7a187804c98b_cluster_statistics_py.html index 3fda8c9e..f522c5c0 100644 --- a/cov_html/d_bafb7a187804c98b_cluster_statistics_py.html +++ b/cov_html/d_bafb7a187804c98b_cluster_statistics_py.html @@ -6,305 +6,291 @@ Coverage for gators/feature_generation/cluster_statistics.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from feature_gen import cluster_statistics 

-

7from ._base_feature_generation import _BaseFeatureGeneration 

-

8 

-

9 

-

10class ClusterStatistics(_BaseFeatureGeneration): 

-

11 """Create new columns based on statistics done at the row level. 

-

12 

-

13 The data should be composed of numerical columns only. 

-

14 Use `gators.encoders` to replace the categorical columns by 

-

15 numerical ones before using `ClusterStatistics`. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 clusters_dict :Dict[str, List[str]] 

-

20 Dictionary of clusters of features. 

-

21 column_names : List[str], default to None. 

-

22 List of new column names 

-

23 dtype : type, default to np.float64. 

-

24 Numerical datatype of the output data. 

-

25 

-

26 Examples 

-

27 --------- 

-

28 * fit & transform with `pandas` 

-

29 

-

30 >>> import pandas as pd 

-

31 >>> from gators.feature_generation import ClusterStatistics 

-

32 >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) 

-

33 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

34 >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) 

-

35 >>> obj.fit_transform(X) 

-

36 A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std 

-

37 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 

-

38 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 

-

39 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 

-

40 

-

41 * fit & transform with `koalas` 

-

42 

-

43 >>> import databricks.koalas as ks 

-

44 >>> from gators.feature_generation import ClusterStatistics 

-

45 >>> X = ks.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) 

-

46 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

47 >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) 

-

48 >>> obj.fit_transform(X) 

-

49 A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std 

-

50 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 

-

51 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 

-

52 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 

-

53 

-

54 * fit with `pandas` & transform with `NumPy` 

-

55 

-

56 >>> import pandas as pd 

-

57 >>> from gators.feature_generation import ClusterStatistics 

-

58 >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) 

-

59 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

60 >>> obj = ClusterStatistics(clusters_dict=clusters_dict) 

-

61 >>> _ = obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[9. , 3. , 6. , 6. , 4.24264069, 

-

64 7.5 , 2.12132034], 

-

65 [9. , 4. , 7. , 6.5 , 3.53553391, 

-

66 8. , 1.41421356], 

-

67 [7. , 5. , 8. , 6. , 1.41421356, 

-

68 7.5 , 0.70710678]]) 

-

69 

-

70 * fit with `koalas` & transform with `NumPy` 

-

71 

-

72 >>> import databricks.koalas as ks 

-

73 >>> from gators.feature_generation import ClusterStatistics 

-

74 >>> X = ks.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) 

-

75 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

76 >>> obj = ClusterStatistics(clusters_dict=clusters_dict) 

-

77 >>> _ = obj.fit(X) 

-

78 >>> obj.transform_numpy(X.to_numpy()) 

-

79 array([[9. , 3. , 6. , 6. , 4.24264069, 

-

80 7.5 , 2.12132034], 

-

81 [9. , 4. , 7. , 6.5 , 3.53553391, 

-

82 8. , 1.41421356], 

-

83 [7. , 5. , 8. , 6. , 1.41421356, 

-

84 7.5 , 0.70710678]]) 

-

85 """ 

-

86 

-

87 def __init__(self, clusters_dict: Dict[str, List[str]], 

-

88 column_names: List[str] = None, 

-

89 dtype: type = np.float64): 

-

90 if not isinstance(clusters_dict, dict): 

-

91 raise TypeError('`clusters_dict` should be a dict.') 

-

92 for key, val in clusters_dict.items(): 

-

93 if not isinstance(val, list): 

-

94 raise TypeError('`clusters_dict` values should be a list.') 

-

95 if len(val) == 0: 

-

96 raise ValueError( 

-

97 '`clusters_dict` values should be a not empty list.') 

-

98 cluster_length = [len(v) for v in clusters_dict.values()] 

-

99 if min(cluster_length) != max(cluster_length): 

-

100 raise ValueError( 

-

101 '`clusters_dict` values should be lists with same length.') 

-

102 if cluster_length[0] == 1: 

-

103 raise ValueError( 

-

104 '''`clusters_dict` values should be 

-

105 lists with a length larger than 1.''') 

-

106 if column_names is not None and not isinstance(column_names, list): 

-

107 raise TypeError('`column_names` should be None or a list.') 

-

108 if not column_names: 

-

109 column_names = self.get_column_names(clusters_dict) 

-

110 column_mapping = { 

-

111 **{f'{key}__mean': val for ( 

-

112 key, val) in clusters_dict.items()}, 

-

113 **{f'{key}__std': val for (key, val) 

-

114 in clusters_dict.items()} 

-

115 } 

-

116 else: 

-

117 column_mapping = dict(zip(column_names, clusters_dict.values())) 

-

118 columns = list( 

-

119 set( 

-

120 [c for s in list(clusters_dict.values()) for c in s] 

-

121 ) 

-

122 ) 

-

123 if column_names and 2 * len(clusters_dict) != len(column_names): 

-

124 raise ValueError( 

-

125 '''Length of `column_names` should be 

-

126 two times the length of `clusters_dict`.''') 

-

127 self.check_datatype(dtype, [np.float32, np.float64]) 

-

128 _BaseFeatureGeneration.__init__( 

-

129 self, columns=columns, column_names=column_names, 

-

130 column_mapping=column_mapping, dtype=dtype) 

-

131 self.clusters_dict = clusters_dict 

-

132 self.n_clusters = len(self.clusters_dict) 

-

133 

-

134 def fit(self, 

-

135 X: Union[pd.DataFrame, ks.DataFrame], 

-

136 y: Union[pd.Series, ks.Series] = None) -> 'ClusterStatistics': 

-

137 """Fit the transformer on the dataframe `X`. 

-

138 

-

139 Parameters 

-

140 ---------- 

-

141 X : Union[pd.DataFrame, ks.DataFrame]. 

-

142 Input dataframe. 

-

143 y : None 

-

144 None. 

-

145 

-

146 Returns 

-

147 ------- 

-

148 ClusterStatistics 

-

149 Instance of itself. 

-

150 """ 

-

151 self.check_dataframe(X) 

-

152 self.check_dataframe_is_numerics(X) 

-

153 self.idx_columns = self.get_idx_columns( 

-

154 X, self.clusters_dict) 

-

155 return self 

-

156 

-

157 def transform(self, 

-

158 X: Union[pd.DataFrame, ks.DataFrame], 

-

159 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

160 """Transform the dataframe X. 

-

161 

-

162 Parameters 

-

163 ---------- 

-

164 X : Union[pd.DataFrame, ks.DataFrame]. 

-

165 Input dataframe. 

-

166 

-

167 Returns 

-

168 ------- 

-

169 Union[pd.DataFrame, ks.DataFrame] 

-

170 Dataframe with statistics cluster features. 

-

171 """ 

-

172 for i, cols in enumerate(self.clusters_dict.values()): 

-

173 X = X.join(X[cols].mean(axis=1).rename( 

-

174 self.column_names[2*i])) 

-

175 X = X.join(X[cols].std(axis=1).rename( 

-

176 self.column_names[2*i+1])) 

-

177 if isinstance(X, ks.DataFrame): 

-

178 return X.astype(self.dtype).sort_index() 

-

179 return X.astype(self.dtype) 

-

180 

-

181 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

182 """Transform the NumPy array `X`. 

-

183 

-

184 Parameters 

-

185 ---------- 

-

186 X : np.ndarray 

-

187 Input array. 

-

188 

-

189 Returns 

-

190 ------- 

-

191 np.ndarray 

-

192 Transformed array. 

-

193 """ 

-

194 self.check_array(X) 

-

195 return cluster_statistics( 

-

196 X.astype(self.dtype), self.idx_columns, self.dtype) 

-

197 

-

198 @ staticmethod 

-

199 def get_idx_columns( 

-

200 X: Union[pd.DataFrame, ks.DataFrame], 

-

201 clusters_dict: Dict[str, List[str]]) -> np.ndarray: 

-

202 """Get the column indices of the clusters. 

-

203 

-

204 Parameters 

-

205 ---------- 

-

206 X : Union[pd.DataFrame, ks.DataFrame] 

-

207 Input data. 

-

208 clusters_dict : Dict[str, List[str]] 

-

209 Clusters. 

-

210 

-

211 Returns 

-

212 ------- 

-

213 Dict[str, List[str]] 

-

214 Column indices of the clusters. 

-

215 """ 

-

216 columns = list(X.columns) 

-

217 n_columns = len(columns) 

-

218 idx_columns = np.array([ 

-

219 [i for i in range(n_columns) 

-

220 if columns[i] in cluster_columns 

-

221 ] 

-

222 for cluster_columns in list(clusters_dict.values()) 

-

223 ]) 

-

224 return idx_columns 

-

225 

-

226 @ staticmethod 

-

227 def get_column_names( 

-

228 clusters_dict: Dict[str, List[str]]) -> List[str]: 

-

229 """Get statistics cluster column names. 

-

230 

-

231 Parameters 

-

232 ---------- 

-

233 X : Union[pd.DataFrame, ks.DataFrame]. 

-

234 Input dataframe. 

-

235 

-

236 Returns 

-

237 ------- 

-

238 List[str] 

-

239 List of columns. 

-

240 """ 

-

241 column_names = [] 

-

242 for name in clusters_dict.keys(): 

-

243 column_names.append(name + '__mean') 

-

244 column_names.append(name + '__std') 

-

245 return column_names 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_elementary_arithmethics_py.html b/cov_html/d_bafb7a187804c98b_elementary_arithmethics_py.html index 1c5997e8..44dc8295 100644 --- a/cov_html/d_bafb7a187804c98b_elementary_arithmethics_py.html +++ b/cov_html/d_bafb7a187804c98b_elementary_arithmethics_py.html @@ -6,344 +6,313 @@ Coverage for gators/feature_generation/elementary_arithmethics.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from gators.feature_generation._base_feature_generation import ( 

-

7 _BaseFeatureGeneration) 

-

8from feature_gen import elementary_arithmetics 

-

9 

-

10EPSILON = 1e-10 

-

11 

-

12 

-

13class ElementaryArithmetics(_BaseFeatureGeneration): 

-

14 """Create new columns based on elementary arithmetics. 

-

15 

-

16 The data should be composed of numerical columns only. 

-

17 Use `gators.encoders` to replace the categorical columns by 

-

18 numerical ones before using `ElementaryArithmetics`. 

-

19 

-

20 Parameters 

-

21 ---------- 

-

22 columns_a : List[str] 

-

23 List of columns. 

-

24 columns_b : List[str] 

-

25 List of columns. 

-

26 operator : str 

-

27 Arithmetic perator. The possible values are: 

-

28 

-

29 * '+' for addition 

-

30 * '*' for multiplication 

-

31 * '/' for division 

-

32 

-

33 column_names : List[str], default to None. 

-

34 List of new column names. 

-

35 coef : float, default to 1. 

-

36 Coefficient value for the addition. 

-

37 

-

38 X[new] = X[column_a] + coef * X[column_b] 

-

39 

-

40 dtype : type, default to np.float64. 

-

41 Numerical datatype of the output data. 

-

42 

-

43 Examples 

-

44 --------- 

-

45 * fit & transform with `pandas` 

-

46 

-

47 - addition 

-

48 

-

49 >>> import pandas as pd 

-

50 >>> from gators.feature_generation import ElementaryArithmetics 

-

51 >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) 

-

52 >>> obj = ElementaryArithmetics( 

-

53 ... columns_a=['A'], columns_b=['B'], operator='+', coef=0.1) 

-

54 >>> obj.fit_transform(X) 

-

55 A B A__+__B 

-

56 0 1.0 1.0 1.1 

-

57 1 1.0 2.0 1.2 

-

58 2 1.0 3.0 1.3 

-

59 

-

60 - division 

-

61 

-

62 >>> import pandas as pd 

-

63 >>> from gators.feature_generation import ElementaryArithmetics 

-

64 >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

65 >>> obj = ElementaryArithmetics( 

-

66 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

67 >>> obj.fit_transform(X) 

-

68 A B A__/__B 

-

69 0 1.0 1.0 1.000000 

-

70 1 1.0 2.0 0.500000 

-

71 2 1.0 3.0 0.333333 

-

72 

-

73 - multiplication & setting new column name 

-

74 

-

75 >>> import pandas as pd 

-

76 >>> from gators.feature_generation import ElementaryArithmetics 

-

77 >>> X = pd.DataFrame({'A': [1., 2., 3.], 'B': [1., 4., 9.]}) 

-

78 >>> obj = ElementaryArithmetics( 

-

79 ... columns_a=['A'], columns_b=['B'], 

-

80 ... operator='*', column_names=['mult']) 

-

81 >>> obj.fit_transform(X) 

-

82 A B mult 

-

83 0 1.0 1.0 1.0 

-

84 1 2.0 4.0 8.0 

-

85 2 3.0 9.0 27.0 

-

86 

-

87 * fit & transform with `koalas` 

-

88 

-

89 >>> import databricks.koalas as ks 

-

90 >>> from gators.feature_generation import ElementaryArithmetics 

-

91 >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

92 >>> obj = ElementaryArithmetics( 

-

93 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

94 >>> obj.fit_transform(X) 

-

95 A B A__/__B 

-

96 0 1.0 1.0 1.000000 

-

97 1 1.0 2.0 0.500000 

-

98 2 1.0 3.0 0.333333 

-

99 

-

100 * fit with `pandas` & transform with `NumPy` 

-

101 

-

102 >>> import pandas as pd 

-

103 >>> from gators.feature_generation import ElementaryArithmetics 

-

104 >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

105 >>> obj = ElementaryArithmetics( 

-

106 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

107 >>> _ = obj.fit(X) 

-

108 >>> obj.transform_numpy(X.to_numpy()) 

-

109 array([[1. , 1. , 1. ], 

-

110 [1. , 2. , 0.5 ], 

-

111 [1. , 3. , 0.33333333]]) 

-

112 

-

113 * fit with `koalas` & transform with `NumPy` 

-

114 

-

115 >>> import databricks.koalas as ks 

-

116 >>> from gators.feature_generation import ElementaryArithmetics 

-

117 >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

118 >>> obj = ElementaryArithmetics( 

-

119 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

120 >>> _ = obj.fit(X) 

-

121 >>> obj.transform_numpy(X.to_numpy()) 

-

122 array([[1. , 1. , 1. ], 

-

123 [1. , 2. , 0.5 ], 

-

124 [1. , 3. , 0.33333333]]) 

-

125 

-

126 """ 

-

127 

-

128 def __init__(self, columns_a: List[str], columns_b: List[str], 

-

129 operator: str, column_names: List[str] = None, 

-

130 coef: float = 1., dtype: type = np.float64): 

-

131 if not isinstance(columns_a, list): 

-

132 raise TypeError('`columns_a` should be a list.') 

-

133 if not isinstance(columns_b, list): 

-

134 raise TypeError('`columns_b` should be a list.') 

-

135 if len(columns_a) == 0: 

-

136 raise ValueError('`columns_a` should not be empty.') 

-

137 if not isinstance(operator, str): 

-

138 raise TypeError('`operator` should be a str.') 

-

139 if not isinstance(coef, float): 

-

140 raise TypeError('`coef` should be a float.') 

-

141 if column_names and not isinstance(column_names, list): 

-

142 raise TypeError('`column_names` should be a list.') 

-

143 if len(columns_a) != len(columns_b): 

-

144 raise ValueError( 

-

145 'Length of `columns_a` and `columns_a` should match.') 

-

146 if operator not in ['+', '*', '/']: 

-

147 raise ValueError( 

-

148 '`operator` should be "+", "*", or "/".') 

-

149 if not column_names: 

-

150 str_operator = operator 

-

151 if coef < 0: 

-

152 str_operator = '-' 

-

153 column_names = [ 

-

154 f'{c_a}__{str_operator}__{c_b}' 

-

155 for c_a, c_b in zip(columns_a, columns_b) 

-

156 ] 

-

157 column_mapping = { 

-

158 f'{c_a}__{str_operator}__{c_b}': [c_a, c_b] 

-

159 for c_a, c_b in zip(columns_a, columns_b) 

-

160 } 

-

161 else: 

-

162 column_mapping = { 

-

163 c: [c_a, c_b] 

-

164 for c, c_a, c_b 

-

165 in zip(column_names, columns_a, columns_b) 

-

166 } 

-

167 if len(column_names) != len(columns_a): 

-

168 raise ValueError( 

-

169 '''Length of `columns_a`, `columns_b`, 

-

170 and `column_names` should match.''') 

-

171 self.check_datatype(dtype, [np.float32, np.float64]) 

-

172 columns = list(set(columns_a + columns_b)) 

-

173 _BaseFeatureGeneration.__init__( 

-

174 self, columns=columns, column_names=column_names, 

-

175 column_mapping=column_mapping, dtype=dtype) 

-

176 self.columns = list(set(columns_a+columns_b)) 

-

177 self.columns_a = columns_a 

-

178 self.columns_b = columns_b 

-

179 self.idx_columns_a: np.ndarray = np.array([]) 

-

180 self.idx_columns_b: np.ndarray = np.array([]) 

-

181 self.operator = operator 

-

182 self.coef = coef 

-

183 

-

184 def fit(self, 

-

185 X: Union[pd.DataFrame, ks.DataFrame], 

-

186 y: Union[pd.Series, ks.Series] = None) -> 'ElementaryArithmetics': 

-

187 """Fit the transformer on the dataframe `X`. 

-

188 

-

189 Parameters 

-

190 ---------- 

-

191 X : Union[pd.DataFrame, ks.DataFrame]. 

-

192 Input dataframe. 

-

193 y : None 

-

194 None. 

-

195 

-

196 Returns 

-

197 ------- 

-

198 ElementaryArithmetics 

-

199 Instance of itself. 

-

200 """ 

-

201 self.check_dataframe(X) 

-

202 self.check_dataframe_is_numerics(X) 

-

203 self.idx_columns_a = self.get_idx_columns( 

-

204 columns=X.columns, 

-

205 selected_columns=self.columns_a 

-

206 ) 

-

207 self.idx_columns_b = self.get_idx_columns( 

-

208 columns=X.columns, 

-

209 selected_columns=self.columns_b 

-

210 ) 

-

211 return self 

-

212 

-

213 def transform( 

-

214 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

215 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

216 """Transform the dataframe `X`. 

-

217 

-

218 Parameters 

-

219 ---------- 

-

220 X : Union[pd.DataFrame, ks.DataFrame]. 

-

221 Input dataframe. 

-

222 

-

223 Returns 

-

224 ------- 

-

225 Union[pd.DataFrame, ks.DataFrame] 

-

226 Transformed dataframe. 

-

227 """ 

-

228 self.check_dataframe(X) 

-

229 self.check_dataframe_is_numerics(X) 

-

230 for c_a, c_b, c in zip( 

-

231 self.columns_a, self.columns_b, self.column_names): 

-

232 if self.operator == '+': 

-

233 X[c] = X[c_a] + self.coef * X[c_b] 

-

234 elif self.operator == '*': 

-

235 X[c] = X[c_a] * X[c_b] 

-

236 else: 

-

237 X[c] = X[c_a] / (X[c_b] + EPSILON) 

-

238 X[c] = X[c] 

-

239 X = X.astype(self.dtype) 

-

240 return X 

-

241 

-

242 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

243 """Transform the NumPy array `X`. 

-

244 

-

245 Parameters 

-

246 ---------- 

-

247 X : np.ndarray 

-

248 Input array. 

-

249 

-

250 Returns 

-

251 ------- 

-

252 np.ndarray 

-

253 Transformed array. 

-

254 """ 

-

255 self.check_array(X) 

-

256 return elementary_arithmetics( 

-

257 X.astype(self.dtype), self.idx_columns_a, self.idx_columns_b, 

-

258 self.operator, self.coef, EPSILON, self.dtype 

-

259 ) 

-

260 

-

261 @staticmethod 

-

262 def get_idx_columns( 

-

263 columns: List[str], 

-

264 selected_columns: List[str]) -> np.ndarray: 

-

265 """Get the indices of the columns used for the combination. 

-

266 

-

267 Parameters 

-

268 ---------- 

-

269 columns : List[str] 

-

270 List of columns. 

-

271 selected_columns : List[str] 

-

272 List of columns. 

-

273 

-

274 Returns: 

-

275 np.ndarray 

-

276 Array of indices. 

-

277 """ 

-

278 idx = [] 

-

279 for selected_column in selected_columns: 

-

280 for i, column in enumerate(columns): 

-

281 if column == selected_column: 

-

282 idx.append(i) 

-

283 break 

-

284 return np.array(idx) 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_is_equal_py.html b/cov_html/d_bafb7a187804c98b_is_equal_py.html index cc0dc3d6..9245a88e 100644 --- a/cov_html/d_bafb7a187804c98b_is_equal_py.html +++ b/cov_html/d_bafb7a187804c98b_is_equal_py.html @@ -6,252 +6,223 @@ Coverage for gators/feature_generation/is_equal.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen import is_equal_object 

-

3from feature_gen import is_equal 

-

4from ._base_feature_generation import _BaseFeatureGeneration 

-

5from ..util import util 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10 

-

11 

-

12class IsEqual(_BaseFeatureGeneration): 

-

13 """Create new columns based on value matching. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns_a : List[str] 

-

18 List of columns. 

-

19 columns_b : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 * fit & transform with `pandas` 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.feature_generation import IsEqual 

-

28 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

29 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B A__is__B 

-

32 0 1 1 1 

-

33 1 2 1 0 

-

34 2 3 1 0 

-

35 

-

36 * fit & transform with `koalas` 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation import IsEqual 

-

40 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

41 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__is__B 

-

44 0 1 1 1 

-

45 1 2 1 0 

-

46 2 3 1 0 

-

47 

-

48 * fit with `pandas` & transform with `NumPy` 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.feature_generation import IsEqual 

-

52 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

53 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[1, 1, 1], 

-

57 [2, 1, 0], 

-

58 [3, 1, 0]]) 

-

59 

-

60 * fit with `koalas` & transform with `NumPy` 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> from gators.feature_generation import IsEqual 

-

64 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

65 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

66 >>> _ = obj.fit(X) 

-

67 >>> obj.transform_numpy(X.to_numpy()) 

-

68 array([[1, 1, 1], 

-

69 [2, 1, 0], 

-

70 [3, 1, 0]]) 

-

71 

-

72 """ 

-

73 

-

74 def __init__(self, columns_a: List[str], columns_b: List[str], 

-

75 column_names: List[str] = None): 

-

76 if not isinstance(columns_a, list): 

-

77 raise TypeError('`columns_a` should be a list.') 

-

78 if not isinstance(columns_b, list): 

-

79 raise TypeError('`columns_b` should be a list.') 

-

80 if column_names is not None and not isinstance(column_names, list): 

-

81 raise TypeError('`columns_a` should be a list.') 

-

82 if len(columns_a) != len(columns_b): 

-

83 raise ValueError( 

-

84 'Length of `columns_a` and `columns_b` should match.') 

-

85 if len(columns_a) == 0: 

-

86 raise ValueError( 

-

87 '`columns_a` and `columns_b` should not be empty.') 

-

88 if not column_names: 

-

89 column_names = [ 

-

90 f'{c_a}__is__{c_b}' 

-

91 for c_a, c_b in zip(columns_a, columns_b) 

-

92 ] 

-

93 if len(columns_a) != len(column_names): 

-

94 raise ValueError( 

-

95 '''Length of `columns_a`, `columns_b` and `column_names` 

-

96 should match.''') 

-

97 column_mapping = { 

-

98 name: [c_a, c_b] 

-

99 for name, c_a, c_b 

-

100 in zip(column_names, columns_a, columns_b) 

-

101 } 

-

102 columns = list(set(columns_a + columns_b)) 

-

103 _BaseFeatureGeneration.__init__( 

-

104 self, columns=columns, column_names=column_names, 

-

105 column_mapping=column_mapping, dtype=None) 

-

106 self.columns_a = columns_a 

-

107 self.columns_b = columns_b 

-

108 self.idx_columns_a: List[int] = [] 

-

109 self.idx_columns_b: List[int] = [] 

-

110 

-

111 def fit(self, 

-

112 X: Union[pd.DataFrame, ks.DataFrame], 

-

113 y: Union[pd.Series, ks.Series] = None): 

-

114 """Fit the transformer on the dataframe `X`. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : Union[pd.DataFrame, ks.DataFrame]. 

-

119 Input dataframe. 

-

120 y : None 

-

121 None. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 IsEqual 

-

126 Instance of itself. 

-

127 """ 

-

128 self.check_dataframe(X) 

-

129 self.idx_columns_a = util.get_idx_columns( 

-

130 columns=X.columns, 

-

131 selected_columns=self.columns_a 

-

132 ) 

-

133 self.idx_columns_b = util.get_idx_columns( 

-

134 columns=X.columns, 

-

135 selected_columns=self.columns_b 

-

136 ) 

-

137 return self 

-

138 

-

139 def transform( 

-

140 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

141 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

142 """Transform the dataframe `X`. 

-

143 

-

144 Parameters 

-

145 ---------- 

-

146 X : Union[pd.DataFrame, ks.DataFrame]. 

-

147 Input dataframe. 

-

148 

-

149 Returns 

-

150 ------- 

-

151 Union[pd.DataFrame, ks.DataFrame] 

-

152 Transformed dataframe. 

-

153 """ 

-

154 self.check_dataframe(X) 

-

155 if isinstance(X, pd.DataFrame): 

-

156 for a, b, name in zip( 

-

157 self.columns_a, self.columns_b, self.column_names): 

-

158 x_dtype = X[a].dtype 

-

159 x_dtype = x_dtype if (x_dtype != object) and ( 

-

160 x_dtype != bool) else np.float64 

-

161 X.loc[:, name] = (X[a] == X[b]).astype(x_dtype) 

-

162 return X 

-

163 

-

164 for a, b, name in zip( 

-

165 self.columns_a, self.columns_b, self.column_names): 

-

166 x_dtype = X[a].dtype 

-

167 x_dtype = x_dtype if (x_dtype != object) and ( 

-

168 x_dtype != bool) else np.float64 

-

169 X = X.assign( 

-

170 dummy=(X[a] == X[b]).astype(x_dtype) 

-

171 ).rename(columns={'dummy': name}) 

-

172 return X 

-

173 

-

174 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

175 """Transform the NumPy array `X`. 

-

176 

-

177 Parameters 

-

178 ---------- 

-

179 X : np.ndarray 

-

180 Input array. 

-

181 

-

182 Returns 

-

183 ------- 

-

184 np.ndarray 

-

185 Transformed array. 

-

186 """ 

-

187 self.check_array(X) 

-

188 if X.dtype == object: 

-

189 return is_equal_object( 

-

190 X, self.idx_columns_a, self.idx_columns_b) 

-

191 return is_equal( 

-

192 X, self.idx_columns_a, self.idx_columns_b) 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_is_null_py.html b/cov_html/d_bafb7a187804c98b_is_null_py.html index 92fce76c..f0bf9e08 100644 --- a/cov_html/d_bafb7a187804c98b_is_null_py.html +++ b/cov_html/d_bafb7a187804c98b_is_null_py.html @@ -6,218 +6,214 @@ Coverage for gators/feature_generation/is_null.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen import is_null_object 

-

3from feature_gen import is_null 

-

4from ._base_feature_generation import _BaseFeatureGeneration 

-

5from ..util import util 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10 

-

11 

-

12class IsNull(_BaseFeatureGeneration): 

-

13 """Create new columns based on missing values. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 dtype : type, default to np.float64 

-

20 Numpy dtype of the output columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with `pandas` 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation import IsNull 

-

29 >>> X = pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) 

-

30 >>> obj = IsNull(columns=['A', 'B']) 

-

31 >>> obj.fit_transform(X) 

-

32 A B A__is_null B__is_null 

-

33 0 None NaN 1.0 1.0 

-

34 1 a 1.0 0.0 0.0 

-

35 2 b 1.0 0.0 0.0 

-

36 

-

37 * fit & transform with `koalas` 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.feature_generation import IsNull 

-

41 >>> X = ks.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) 

-

42 >>> obj = IsNull(columns=['A', 'B']) 

-

43 >>> obj.fit_transform(X) 

-

44 A B A__is_null B__is_null 

-

45 0 None NaN 1.0 1.0 

-

46 1 a 1.0 0.0 0.0 

-

47 2 b 1.0 0.0 0.0 

-

48 

-

49 * fit with `pandas` & transform with `NumPy` 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.feature_generation import IsNull 

-

53 >>> X = pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) 

-

54 >>> obj = IsNull(columns=['A', 'B']) 

-

55 >>> _ = obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([[None, nan, 1.0, 1.0], 

-

58 ['a', 1.0, 0.0, 0.0], 

-

59 ['b', 1.0, 0.0, 0.0]], dtype=object) 

-

60 

-

61 * fit with `koalas` & transform with `NumPy` 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.feature_generation import IsNull 

-

65 >>> X = ks.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) 

-

66 >>> obj = IsNull(columns=['A', 'B']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[None, nan, 1.0, 1.0], 

-

70 ['a', 1.0, 0.0, 0.0], 

-

71 ['b', 1.0, 0.0, 0.0]], dtype=object) 

-

72 

-

73 """ 

-

74 

-

75 def __init__(self, columns: List[str], 

-

76 column_names: List[str] = None, dtype: type = np.float64): 

-

77 if not isinstance(columns, list): 

-

78 raise TypeError('`columns` should be a list.') 

-

79 if not columns: 

-

80 raise ValueError('`columns` should not be empty.') 

-

81 if column_names is not None and not isinstance(column_names, list): 

-

82 raise TypeError('`column_names` should be a list.') 

-

83 if not column_names: 

-

84 column_names = [f'{c}__is_null' for c in columns] 

-

85 if len(column_names) != len(columns): 

-

86 raise ValueError( 

-

87 'Length of `columns` and `column_names` should match.') 

-

88 column_mapping = dict(zip(column_names, columns)) 

-

89 _BaseFeatureGeneration.__init__( 

-

90 self, columns=columns, column_names=column_names, 

-

91 column_mapping=column_mapping, dtype=dtype) 

-

92 

-

93 def fit(self, 

-

94 X: Union[pd.DataFrame, ks.DataFrame], 

-

95 y: Union[pd.Series, ks.Series] = None): 

-

96 """ 

-

97 Fit the dataframe X. 

-

98 

-

99 Parameters 

-

100 ---------- 

-

101 X : Union[pd.DataFrame, ks.DataFrame]. 

-

102 Input dataframe. 

-

103 y (np.ndarray, optional): labels. Defaults to None. 

-

104 

-

105 Returns 

-

106 ------- 

-

107 IsNull: 

-

108 Instance of itself. 

-

109 """ 

-

110 self.check_dataframe(X) 

-

111 self.idx_columns = util.get_idx_columns( 

-

112 columns=X.columns, 

-

113 selected_columns=self.columns 

-

114 ) 

-

115 return self 

-

116 

-

117 def transform( 

-

118 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

119 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

120 """Transform the dataframe `X`. 

-

121 

-

122 Parameters 

-

123 ---------- 

-

124 X : Union[pd.DataFrame, ks.DataFrame]. 

-

125 Input dataframe. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 Union[pd.DataFrame, ks.DataFrame] 

-

130 Transformed dataframe. 

-

131 """ 

-

132 self.check_dataframe(X) 

-

133 if isinstance(X, pd.DataFrame): 

-

134 X[self.column_names] = X[self.columns].isnull().astype(self.dtype) 

-

135 return X 

-

136 for col, name in zip(self.columns, self.column_names): 

-

137 X = X.assign( 

-

138 dummy=X[col].isnull().astype(self.dtype) 

-

139 ).rename(columns={'dummy': name}) 

-

140 return X 

-

141 

-

142 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

143 """Transform the NumPy array `X`. 

-

144 

-

145 Parameters 

-

146 ---------- 

-

147 X : np.ndarray 

-

148 Input array. 

-

149 

-

150 Returns 

-

151 ------- 

-

152 np.ndarray 

-

153 Transformed array. 

-

154 """ 

-

155 self.check_array(X) 

-

156 if X.dtype == object: 

-

157 return is_null_object(X, self.idx_columns) 

-

158 return is_null(X, self.idx_columns, self.dtype) 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_one_hot_py.html b/cov_html/d_bafb7a187804c98b_one_hot_py.html index cf303d38..8f9dc727 100644 --- a/cov_html/d_bafb7a187804c98b_one_hot_py.html +++ b/cov_html/d_bafb7a187804c98b_one_hot_py.html @@ -6,242 +6,222 @@ Coverage for gators/feature_generation/one_hot.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen import one_hot 

-

3from ._base_feature_generation import _BaseFeatureGeneration 

-

4from ..util import util 

-

5from typing import List, Dict, Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class OneHot(_BaseFeatureGeneration): 

-

12 """Create new columns based on the one-hot technique. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 categories_dict : Dict[str: List[str]]. 

-

17 keys: columns, values: list of category name. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with `pandas` 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation import OneHot 

-

25 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

26 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__onehot__b A__onehot__c B__onehot__z 

-

29 0 a z False False True 

-

30 1 b a True False False 

-

31 2 c a False True False 

-

32 

-

33 * fit & transform with `koalas` 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation import OneHot 

-

37 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

38 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__onehot__b A__onehot__c B__onehot__z 

-

41 0 a z False False True 

-

42 1 b a True False False 

-

43 2 c a False True False 

-

44 

-

45 * fit with `pandas` & transform with `NumPy` 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation import OneHot 

-

49 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

50 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([['a', 'z', False, False, True], 

-

54 ['b', 'a', True, False, False], 

-

55 ['c', 'a', False, True, False]], dtype=object) 

-

56 

-

57 * fit with `koalas` & transform with `NumPy` 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation import OneHot 

-

61 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

62 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([['a', 'z', False, False, True], 

-

66 ['b', 'a', True, False, False], 

-

67 ['c', 'a', False, True, False]], dtype=object) 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, categories_dict: Dict[str, List[str]], 

-

72 column_names: List[str] = None): 

-

73 if not isinstance(categories_dict, dict): 

-

74 raise TypeError('`categories_dict` should be a dict.') 

-

75 if column_names is not None and not isinstance(column_names, list): 

-

76 raise TypeError('`column_names` should be None or a list.') 

-

77 self.categories_dict = categories_dict 

-

78 columns = list(set(categories_dict.keys())) 

-

79 if not column_names: 

-

80 column_names = [ 

-

81 f'{col}__onehot__{cat}' 

-

82 for col, cats in categories_dict.items() 

-

83 for cat in cats 

-

84 ] 

-

85 column_mapping = { 

-

86 f'{col}__onehot__{cat}': col 

-

87 for col, cats in categories_dict.items() 

-

88 for cat in cats 

-

89 } 

-

90 else: 

-

91 column_mapping = { 

-

92 name: col 

-

93 for name, col in zip(column_names, categories_dict.keys()) 

-

94 } 

-

95 columns = [ 

-

96 col 

-

97 for col, cats in categories_dict.items() 

-

98 for cat in cats 

-

99 ] 

-

100 n_cats = sum([len(cat) for cat in categories_dict.values()]) 

-

101 if column_names and n_cats != len(column_names): 

-

102 raise ValueError( 

-

103 'Length of `clusters_dict` and `column_names` should match.') 

-

104 

-

105 _BaseFeatureGeneration.__init__( 

-

106 self, columns=columns, column_names=column_names, 

-

107 column_mapping=column_mapping, dtype=None) 

-

108 self.mapping = dict(zip(self.column_names, self.columns)) 

-

109 

-

110 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

111 y: Union[pd.Series, ks.Series] = None): 

-

112 """ 

-

113 Fit the dataframe X. 

-

114 

-

115 Parameters 

-

116 ---------- 

-

117 X : Union[pd.DataFrame, ks.DataFrame]. 

-

118 Input dataframe. 

-

119 y (np.ndarray, optional): labels. Defaults to None. 

-

120 

-

121 Returns 

-

122 ------- 

-

123 OneHot: Instance of itself. 

-

124 """ 

-

125 self.check_dataframe(X) 

-

126 self.cats = np.array( 

-

127 [cat 

-

128 for cats in self.categories_dict.values() 

-

129 for cat in cats] 

-

130 ).astype(object) 

-

131 cols_flatten = np.array( 

-

132 [col 

-

133 for col, cats in self.categories_dict.items() 

-

134 for cat in cats] 

-

135 ) 

-

136 self.idx_columns = util.get_idx_columns(X, cols_flatten) 

-

137 return self 

-

138 

-

139 def transform(self, 

-

140 X: Union[pd.DataFrame, ks.DataFrame] 

-

141 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

142 """Transform the dataframe `X`. 

-

143 

-

144 Parameters 

-

145 ---------- 

-

146 X : Union[pd.DataFrame, ks.DataFrame]. 

-

147 Input dataframe. 

-

148 

-

149 Returns 

-

150 ------- 

-

151 Union[pd.DataFrame, ks.DataFrame] 

-

152 Transformed dataframe. 

-

153 """ 

-

154 self.check_dataframe(X) 

-

155 if isinstance(X, pd.DataFrame): 

-

156 for name, col, cat in zip( 

-

157 self.column_names, self.columns, self.cats): 

-

158 X.loc[:, name] = (X[col] == cat) 

-

159 return X 

-

160 

-

161 for name, col, cat in zip( 

-

162 self.column_names, self.columns, self.cats): 

-

163 X = X.assign( 

-

164 dummy=(X[col] == cat) 

-

165 ).rename(columns={'dummy': name}) 

-

166 return X 

-

167 

-

168 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

169 """Transform the NumPy array `X`. 

-

170 

-

171 Parameters 

-

172 ---------- 

-

173 X : np.ndarray 

-

174 Input array. 

-

175 

-

176 Returns 

-

177 ------- 

-

178 np.ndarray 

-

179 Transformed array. 

-

180 """ 

-

181 self.check_array(X) 

-

182 return one_hot(X, self.idx_columns, self.cats) 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_plan_rotation_py.html b/cov_html/d_bafb7a187804c98b_plan_rotation_py.html new file mode 100644 index 00000000..ac7be6df --- /dev/null +++ b/cov_html/d_bafb7a187804c98b_plan_rotation_py.html @@ -0,0 +1,254 @@ + + + + + + Coverage for gators/feature_generation/plan_rotation.py: 100% + + + + + +
+
+

+ Coverage for gators/feature_generation/plan_rotation.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 52 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from math import cos 

+

3from math import pi as PI 

+

4from math import sin 

+

5from typing import List 

+

6 

+

7import numpy as np 

+

8 

+

9from feature_gen import plan_rotation 

+

10from gators.transformers import Transformer 

+

11from gators.util import util 

+

12 

+

13from ._base_feature_generation import _BaseFeatureGeneration 

+

14 

+

15from gators import DataFrame, Series 

+

16 

+

17 

+

18class PlanRotation(Transformer): 

+

19 """Create new columns based on the plan rotation mapping. 

+

20 

+

21 The data should be composed of numerical columns only. 

+

22 Use `gators.encoders` to replace the categorical columns by 

+

23 numerical ones before using `PlanRotation`. 

+

24 

+

25 Parameters 

+

26 ---------- 

+

27 columns : List[List[str]] 

+

28 List of pair-wise columns. 

+

29 theta_vec : List[float] 

+

30 List of rotation angles. 

+

31 dtype : type, default np.float64 

+

32 Numpy dtype of the output data. 

+

33 

+

34 Examples 

+

35 --------- 

+

36 Imports and initialization: 

+

37 

+

38 >>> from gators.feature_generation import PlanRotation 

+

39 >>> obj = PlanRotation( 

+

40 ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0, 60.0]) 

+

41 

+

42 The `fit`, `transform`, and `fit_transform` methods accept: 

+

43 

+

44 * `dask` dataframes: 

+

45 

+

46 >>> import dask.dataframe as dd 

+

47 >>> import pandas as pd 

+

48 >>> X = dd.from_pandas(pd.DataFrame( 

+

49 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}), npartitions=1) 

+

50 

+

51 * `koalas` dataframes: 

+

52 

+

53 >>> import databricks.koalas as ks 

+

54 >>> X = ks.DataFrame( 

+

55 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) 

+

56 

+

57 * and `pandas` dataframes: 

+

58 

+

59 >>> import pandas as pd 

+

60 >>> X = pd.DataFrame( 

+

61 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) 

+

62 

+

63 The result is a transformed dataframe belonging to the same dataframe library. 

+

64 

+

65 >>> obj.fit_transform(X) 

+

66 X Y Z ... XZ_y_45.0deg XZ_x_60.0deg XZ_y_60.0deg 

+

67 0 200.0 140.0 100.0 ... 212.132034 13.397460 223.205081 

+

68 1 210.0 160.0 125.0 ... 236.880772 -3.253175 244.365335 

+

69 

+

70 >>> X = pd.DataFrame( 

+

71 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) 

+

72 >>> _ = obj.fit(X) 

+

73 >>> obj.transform_numpy(X.to_numpy()) 

+

74 array([[200. , 140. , 100. , 42.42640687, 

+

75 240.4163056 , -21.24355653, 243.20508076, 70.71067812, 

+

76 212.13203436, 13.39745962, 223.20508076], 

+

77 [210. , 160. , 125. , 35.35533906, 

+

78 261.62950904, -33.56406461, 261.86533479, 60.1040764 , 

+

79 236.8807717 , -3.25317547, 244.36533479]]) 

+

80 """ 

+

81 

+

82 def __init__(self, columns: List[List[str]], theta_vec: List[float]): 

+

83 

+

84 if not isinstance(columns, (list, np.ndarray)): 

+

85 raise TypeError("`columns` should be a list.") 

+

86 if not isinstance(theta_vec, (list, np.ndarray)): 

+

87 raise TypeError("`theta_vec` should be a list.") 

+

88 if not columns: 

+

89 raise ValueError("`columns` should not be empty.") 

+

90 if not any(isinstance(cols, list) for cols in columns): 

+

91 raise TypeError("`columns` should be a list of lists.") 

+

92 if not all(isinstance(theta, (float, int)) for theta in theta_vec): 

+

93 raise TypeError("`theta_vec` should be a list of ints or floats.") 

+

94 

+

95 column_names = [ 

+

96 [f"{x}{y}_x_{t}deg", f"{x}{y}_y_{t}deg"] 

+

97 for (x, y) in columns 

+

98 for t in theta_vec 

+

99 ] 

+

100 column_names = [c for cols in column_names for c in cols] 

+

101 _BaseFeatureGeneration.__init__( 

+

102 self, 

+

103 columns=columns, 

+

104 column_names=column_names, 

+

105 ) 

+

106 self.theta_vec = theta_vec 

+

107 self.theta_vec_np = np.array(self.theta_vec) 

+

108 self.cos_theta_vec = np.cos(self.theta_vec_np * np.pi / 180) 

+

109 self.sin_theta_vec = np.sin(self.theta_vec_np * np.pi / 180) 

+

110 

+

111 def fit(self, X: DataFrame, y: Series = None) -> "PlanRotation": 

+

112 """Fit the transformer on the dataframe `X`. 

+

113 

+

114 Parameters 

+

115 ---------- 

+

116 X : DataFrame. 

+

117 Input dataframe. 

+

118 y : Series, default None. 

+

119 Target values. 

+

120 

+

121 Returns 

+

122 ------- 

+

123 PlanRotation 

+

124 Instance of itself. 

+

125 """ 

+

126 self.check_dataframe(X) 

+

127 self.base_columns = list(X.columns) 

+

128 flatten_columns = [c for cols in self.columns for c in cols] 

+

129 self.check_dataframe_is_Numeric(X[list(set(flatten_columns))]) 

+

130 self.idx_columns_x = util.get_idx_columns( 

+

131 X[flatten_columns], flatten_columns[::2] 

+

132 ) 

+

133 self.idx_columns_y = util.get_idx_columns( 

+

134 X[flatten_columns], flatten_columns[1::2] 

+

135 ) 

+

136 self.idx_subarray = util.get_idx_columns(X.columns, flatten_columns) 

+

137 self.flatten_columns = flatten_columns 

+

138 return self 

+

139 

+

140 def transform(self, X: DataFrame) -> DataFrame: 

+

141 """Transform the dataframe `X`. 

+

142 

+

143 Parameters 

+

144 ---------- 

+

145 X : DataFrame. 

+

146 Input dataframe. 

+

147 

+

148 Returns 

+

149 ------- 

+

150 X : DataFrame 

+

151 Transformed dataframe. 

+

152 """ 

+

153 self.check_dataframe(X) 

+

154 for x, y in zip(self.flatten_columns[::2], self.flatten_columns[1::2]): 

+

155 for theta in self.theta_vec_np: 

+

156 cos_theta = cos(theta * PI / 180) 

+

157 sin_theta = sin(theta * PI / 180) 

+

158 X[f"{x}{y}_x_{theta}deg"] = X[x] * cos_theta - X[y] * sin_theta 

+

159 X[f"{x}{y}_y_{theta}deg"] = X[x] * sin_theta + X[y] * cos_theta 

+

160 

+

161 return X 

+

162 

+

163 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

164 """Transform the array `X`. 

+

165 

+

166 Parameters 

+

167 ---------- 

+

168 X : np.ndarray 

+

169 Input array. 

+

170 

+

171 Returns 

+

172 ------- 

+

173 X : np.ndarray 

+

174 Transformed array. 

+

175 """ 

+

176 self.check_array(X) 

+

177 X_new = plan_rotation( 

+

178 X[:, self.idx_subarray].astype(np.float64), 

+

179 self.idx_columns_x, 

+

180 self.idx_columns_y, 

+

181 self.cos_theta_vec, 

+

182 self.sin_theta_vec, 

+

183 ) 

+

184 return np.concatenate((X, X_new), axis=1) 

+
+ + + diff --git a/cov_html/d_bafb7a187804c98b_plane_rotation_py.html b/cov_html/d_bafb7a187804c98b_plane_rotation_py.html index 906e1ec6..420eeac2 100644 --- a/cov_html/d_bafb7a187804c98b_plane_rotation_py.html +++ b/cov_html/d_bafb7a187804c98b_plane_rotation_py.html @@ -6,248 +6,248 @@ Coverage for gators/feature_generation/plane_rotation.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3from math import cos, sin 

-

4from math import pi as PI 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from gators.util import util 

-

9from gators.transformers import Transformer 

-

10from feature_gen import plan_rotation 

-

11from ._base_feature_generation import _BaseFeatureGeneration 

-

12 

-

13 

-

14class PlaneRotation(Transformer): 

-

15 """Create new columns based on the plane rotation mapping. 

-

16 

-

17 The data should be composed of numerical columns only. 

-

18 Use `gators.encoders` to replace the categorical columns by 

-

19 numerical ones before using `PlaneRotation`. 

-

20 

-

21 Parameters 

-

22 ---------- 

-

23 columns : List[List[str]] 

-

24 List of pair-wise columns. 

-

25 theta_vec: List[float] 

-

26 List of rotation angles. 

-

27 dtype : type, default to np.float64 

-

28 Numpy dtype of the output data. 

-

29 

-

30 Examples 

-

31 --------- 

-

32 

-

33 * fit & transform with `pandas` 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> import numpy as np 

-

37 >>> from gators.feature_generation import PlaneRotation 

-

38 >>> X = pd.DataFrame( 

-

39 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) 

-

40 >>> obj = PlaneRotation( 

-

41 ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0, 60.0]) 

-

42 >>> obj.fit_transform(X) 

-

43 X Y Z ... XZ_y_45.0deg XZ_x_60.0deg XZ_y_60.0deg 

-

44 0 200.0 140.0 100.0 ... 212.132034 13.397460 223.205081 

-

45 1 210.0 160.0 125.0 ... 236.880772 -3.253175 244.365335 

-

46 

-

47 * fit & transform with `koalas` 

-

48 

-

49 >>> import databricks.koalas as ks 

-

50 >>> from gators.feature_generation import PlaneRotation 

-

51 >>> X = ks.DataFrame( 

-

52 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) 

-

53 >>> obj = PlaneRotation( 

-

54 ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0]) 

-

55 >>> obj.fit_transform(X) 

-

56 X Y Z XY_x_45.0deg XY_y_45.0deg XZ_x_45.0deg XZ_y_45.0deg 

-

57 0 200.0 140.0 125.0 42.426407 240.416306 53.033009 229.809704 

-

58 1 210.0 160.0 175.0 35.355339 261.629509 24.748737 272.236111 

-

59 

-

60 * fit with `pandas` & transform with `NumPy` 

-

61 

-

62 >>> import pandas as pd 

-

63 >>> from gators.feature_generation import PlaneRotation 

-

64 >>> X = pd.DataFrame( 

-

65 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) 

-

66 >>> obj = PlaneRotation( 

-

67 ... columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45.0]) 

-

68 >>> _ = obj.fit(X) 

-

69 >>> obj.transform_numpy(X.to_numpy()) 

-

70 array([[200. , 140. , 125. , 42.42640687, 

-

71 240.4163056 , 53.03300859, 229.80970389], 

-

72 [210. , 160. , 175. , 35.35533906, 

-

73 261.62950904, 24.74873734, 272.23611076]]) 

-

74 

-

75 * fit with `koalas` & transform with `NumPy` 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.feature_generation import PlaneRotation 

-

79 >>> X = ks.DataFrame( 

-

80 ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) 

-

81 >>> obj = PlaneRotation( 

-

82 ... columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45.0]) 

-

83 >>> _ = obj.fit(X) 

-

84 >>> obj.transform_numpy(X.to_numpy()) 

-

85 array([[200. , 140. , 125. , 42.42640687, 

-

86 240.4163056 , 53.03300859, 229.80970389], 

-

87 [210. , 160. , 175. , 35.35533906, 

-

88 261.62950904, 24.74873734, 272.23611076]]) 

-

89 """ 

-

90 

-

91 def __init__(self, columns: List[List[str]], theta_vec: List[float], 

-

92 dtype: type = np.float64): 

-

93 if not isinstance(columns, list): 

-

94 raise TypeError('`columns` should be a list.') 

-

95 if not isinstance(theta_vec, list): 

-

96 raise TypeError('`theta_vec` should be a list.') 

-

97 if not columns: 

-

98 raise ValueError('`columns` should not be empty.') 

-

99 if not any(isinstance(cols, list) for cols in columns): 

-

100 raise TypeError('`columns` should be a list of lists.') 

-

101 if not all(isinstance(theta, (float, int)) for theta in theta_vec): 

-

102 raise TypeError( 

-

103 '`theta_vec` should be a list of ints or floats.') 

-

104 self.check_datatype(dtype, [np.float32, np.float64]) 

-

105 

-

106 column_names = [ 

-

107 [f'{x}{y}_x_{t}deg', f'{x}{y}_y_{t}deg'] 

-

108 for (x, y) in columns for t in theta_vec] 

-

109 column_names = [c for cols in column_names for c in cols] 

-

110 column_mapping = { 

-

111 **{f'{x}{y}_x_{t}deg': [x, y] 

-

112 for (x, y) in columns for t in theta_vec}, 

-

113 **{f'{x}{y}_y_{t}deg': [x, y] 

-

114 for (x, y) in columns for t in theta_vec} 

-

115 } 

-

116 columns = [c for cols in columns for c in cols] 

-

117 _BaseFeatureGeneration.__init__( 

-

118 self, columns=columns, column_names=column_names, 

-

119 column_mapping=column_mapping, dtype=dtype) 

-

120 self.theta_vec = np.array(theta_vec) 

-

121 self.cos_theta_vec = np.cos(self.theta_vec * np.pi / 180) 

-

122 self.sin_theta_vec = np.sin(self.theta_vec * np.pi / 180) 

-

123 

-

124 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

125 y: Union[pd.Series, ks.Series] = None) -> 'PlaneRotation': 

-

126 """Fit the transformer on the dataframe `X`. 

-

127 

-

128 Parameters 

-

129 ---------- 

-

130 X : Union[pd.DataFrame, ks.DataFrame]. 

-

131 Input dataframe. 

-

132 y : None 

-

133 None. 

-

134 

-

135 Returns 

-

136 ------- 

-

137 PlaneRotation 

-

138 Instance of itself. 

-

139 """ 

-

140 self.check_dataframe(X) 

-

141 self.check_dataframe_is_numerics(X) 

-

142 self.idx_columns_x = util.get_idx_columns(X, self.columns[::2]) 

-

143 self.idx_columns_y = util.get_idx_columns(X, self.columns[1::2]) 

-

144 return self 

-

145 

-

146 def transform(self, X: Union[pd.DataFrame, ks.DataFrame] 

-

147 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

148 """Transform the dataframe `X`. 

-

149 

-

150 Parameters 

-

151 ---------- 

-

152 X : Union[pd.DataFrame, ks.DataFrame]. 

-

153 Input dataframe. 

-

154 

-

155 Returns 

-

156 ------- 

-

157 Union[pd.DataFrame, ks.DataFrame] 

-

158 Transformed dataframe. 

-

159 """ 

-

160 self.check_dataframe(X) 

-

161 for x, y in zip(self.columns[::2], self.columns[1::2]): 

-

162 for theta in self.theta_vec: 

-

163 cos_theta = cos(theta * PI / 180) 

-

164 sin_theta = sin(theta * PI / 180) 

-

165 X.loc[:, f'{x}{y}_x_{theta}deg'] = X[x] * \ 

-

166 cos_theta - X[y] * sin_theta 

-

167 X.loc[:, f'{x}{y}_y_{theta}deg'] = X[x] * \ 

-

168 sin_theta + X[y] * cos_theta 

-

169 X[self.column_names] = X[self.column_names].astype(self.dtype) 

-

170 return X 

-

171 

-

172 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

173 """Transform the NumPy array `X`. 

-

174 

-

175 Parameters 

-

176 ---------- 

-

177 X : np.ndarray 

-

178 Input array. 

-

179 

-

180 Returns 

-

181 ------- 

-

182 np.ndarray 

-

183 Transformed array. 

-

184 """ 

-

185 self.check_array(X) 

-

186 return plan_rotation( 

-

187 X.astype(self.dtype), self.idx_columns_x, self.idx_columns_y, 

-

188 self.cos_theta_vec, self.sin_theta_vec) 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_polynomial_features_py.html b/cov_html/d_bafb7a187804c98b_polynomial_features_py.html index 937da968..ac6bd4ee 100644 --- a/cov_html/d_bafb7a187804c98b_polynomial_features_py.html +++ b/cov_html/d_bafb7a187804c98b_polynomial_features_py.html @@ -6,265 +6,254 @@ Coverage for gators/feature_generation/polynomial_features.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1import numpy as np 

-

2import pandas as pd 

-

3from typing import List, Union 

-

4import databricks.koalas as ks 

-

5from ..util import util 

-

6from gators.transformers import Transformer 

-

7from itertools import combinations, combinations_with_replacement, chain 

-

8from feature_gen import polynomial 

-

9from ._base_feature_generation import _BaseFeatureGeneration 

-

10 

-

11 

-

12class PolynomialFeatures(Transformer): 

-

13 """Create new columns based on columns multiplication. 

-

14 

-

15 The data should be composed of numerical columns only. 

-

16 Use `gators.encoders` to replace the categorical columns by 

-

17 numerical ones before using `PolynomialFeatures`. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 columns : List[str] 

-

22 List of columns. 

-

23 degree : int, default = 2 

-

24 The degree of polynomial. The default of degree of 2 

-

25 will produce A * A, B * B, and A * B from features A and B. 

-

26 interaction_only : bool, default = False 

-

27 Allows to keep only interaction terms. 

-

28 If true, only A * B will be produced from features A and B. 

-

29 dtype : type, default to np.float64 

-

30 Numpy dtype of the output data. 

-

31 

-

32 Examples 

-

33 --------- 

-

34 

-

35 * fit & transform with `pandas` 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> from gators.feature_generation import PolynomialFeatures 

-

39 >>> X = pd.DataFrame( 

-

40 ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) 

-

41 >>> obj = PolynomialFeatures(columns=['A', 'B']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B C A__x__A A__x__B B__x__B 

-

44 0 0.0 1.0 2.0 0.0 0.0 1.0 

-

45 1 3.0 4.0 5.0 9.0 12.0 16.0 

-

46 2 6.0 7.0 8.0 36.0 42.0 49.0 

-

47 

-

48 * fit & transform with `koalas` 

-

49 

-

50 >>> import databricks.koalas as ks 

-

51 >>> from gators.feature_generation import PolynomialFeatures 

-

52 >>> X = ks.DataFrame( 

-

53 ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) 

-

54 >>> obj = PolynomialFeatures( 

-

55 ... columns=['A', 'B', 'C'], degree=3, interaction_only=True) 

-

56 >>> obj.fit_transform(X) 

-

57 A B C A__x__B A__x__C B__x__C A__x__B__x__C 

-

58 0 0.0 1.0 2.0 0.0 0.0 2.0 0.0 

-

59 1 3.0 4.0 5.0 12.0 15.0 20.0 60.0 

-

60 2 6.0 7.0 8.0 42.0 48.0 56.0 336.0 

-

61 

-

62 * fit with `pandas` & transform with `NumPy` 

-

63 

-

64 >>> import pandas as pd 

-

65 >>> from gators.feature_generation import PolynomialFeatures 

-

66 >>> X = pd.DataFrame( 

-

67 ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) 

-

68 >>> obj = PolynomialFeatures( 

-

69 ... columns=['A', 'B', 'C'], degree=2, interaction_only=True) 

-

70 >>> _ = obj.fit(X) 

-

71 >>> obj.transform_numpy(X.to_numpy()) 

-

72 array([[ 0., 1., 2., 0., 0., 2.], 

-

73 [ 3., 4., 5., 12., 15., 20.], 

-

74 [ 6., 7., 8., 42., 48., 56.]]) 

-

75 

-

76 >>> import databricks.koalas as ks 

-

77 >>> from gators.feature_generation import PolynomialFeatures 

-

78 >>> X = ks.DataFrame( 

-

79 ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) 

-

80 >>> obj = PolynomialFeatures( 

-

81 ... columns=['A', 'B', 'C'], degree=2, interaction_only=True) 

-

82 >>> _ = obj.fit(X) 

-

83 >>> obj.transform_numpy(X.to_numpy()) 

-

84 array([[ 0., 1., 2., 0., 0., 2.], 

-

85 [ 3., 4., 5., 12., 15., 20.], 

-

86 [ 6., 7., 8., 42., 48., 56.]]) 

-

87 

-

88 """ 

-

89 

-

90 def __init__(self, columns: List[str], degree=2, interaction_only=False, 

-

91 dtype: type = np.float64): 

-

92 if not isinstance(columns, list): 

-

93 raise TypeError('`columns` should be a list.') 

-

94 if not columns: 

-

95 raise ValueError('`columns` should not be empty.') 

-

96 if not isinstance(degree, int): 

-

97 raise TypeError('`degree` should be an int.') 

-

98 if degree < 2: 

-

99 raise ValueError('`degree` should be at least 2.') 

-

100 if not isinstance(interaction_only, bool): 

-

101 raise TypeError('`interaction_only` should be a bool.') 

-

102 if interaction_only == True and len(columns) == 1: 

-

103 raise ValueError( 

-

104 'Cannot create interaction only terms from single feature.') 

-

105 self.check_datatype(dtype, [np.float32, np.float64]) 

-

106 

-

107 self.degree = degree 

-

108 self.method = ( 

-

109 combinations if interaction_only else combinations_with_replacement 

-

110 ) 

-

111 self.combinations = list( 

-

112 map(list, chain.from_iterable( 

-

113 self.method(columns, self.degree) 

-

114 for self.degree in range(self.degree + 1))) 

-

115 ) 

-

116 self.combinations = [c for c in self.combinations if len(c) >= 2] 

-

117 column_names = ['__x__'.join(map(str, combination)) 

-

118 for combination in self.combinations] 

-

119 column_mapping = dict( 

-

120 zip(column_names, map(list, self.combinations))) 

-

121 _BaseFeatureGeneration.__init__( 

-

122 self, columns=columns, column_names=column_names, 

-

123 column_mapping=column_mapping, dtype=dtype) 

-

124 

-

125 def fit(self, 

-

126 X: Union[pd.DataFrame, ks.DataFrame], 

-

127 y: Union[pd.Series, ks.Series] = None) -> 'PolynomialFeatures': 

-

128 """ 

-

129 Fit the dataframe X. 

-

130 

-

131 Parameters 

-

132 ---------- 

-

133 X : Union[pd.DataFrame, ks.DataFrame]. 

-

134 Input dataframe. 

-

135 y (np.ndarray, optional): labels. Defaults to None. 

-

136 

-

137 Returns 

-

138 ------- 

-

139 PolynomialFeatures: Instance of itself. 

-

140 """ 

-

141 self.check_dataframe(X) 

-

142 self.check_dataframe_is_numerics(X) 

-

143 self.dtype = X[self.columns].dtypes.unique()[0] 

-

144 self.idx_columns = util.get_idx_columns( 

-

145 columns=X.columns, 

-

146 selected_columns=self.columns 

-

147 ) 

-

148 self.n_rows = X[self.columns].shape[0] 

-

149 self.n_cols = X[self.columns].shape[1] 

-

150 self.combinations_np = list( 

-

151 map(list, chain.from_iterable( 

-

152 self.method(self.idx_columns, self.degree) 

-

153 for self.degree in range(self.degree + 1))) 

-

154 ) 

-

155 self.combinations_np = [c for c in self.combinations_np if len(c) >= 2] 

-

156 for combo in self.combinations_np: 

-

157 combo.extend([-1 for _ in range(self.degree - len(combo))]) 

-

158 self.combinations_np = np.array(self.combinations_np) 

-

159 return self 

-

160 

-

161 def transform( 

-

162 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

163 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

164 """Transform the dataframe `X`. 

-

165 

-

166 Parameters 

-

167 ---------- 

-

168 X : Union[pd.DataFrame, ks.DataFrame]. 

-

169 Input dataframe. 

-

170 

-

171 Returns 

-

172 ------- 

-

173 Union[pd.DataFrame, ks.DataFrame] 

-

174 Transformed dataframe. 

-

175 """ 

-

176 self.check_dataframe(X) 

-

177 if isinstance(X, pd.DataFrame): 

-

178 for combi, name in zip(self.combinations, self.column_names): 

-

179 X[name] = X[combi].prod(axis=1) 

-

180 X[self.column_names] = X[self.column_names].astype(self.dtype) 

-

181 return X 

-

182 for combi, name in zip(self.combinations, self.column_names): 

-

183 dummy = X[combi[0]] * X["__x__".join(combi[1:])] 

-

184 X = X.assign( 

-

185 dummy=dummy 

-

186 ).rename(columns={'dummy': name}) 

-

187 X[self.column_names] = X[self.column_names].astype(self.dtype) 

-

188 return X 

-

189 

-

190 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

191 """Transform the NumPy array `X`. 

-

192 

-

193 Parameters 

-

194 ---------- 

-

195 X : np.ndarray 

-

196 Input array. 

-

197 

-

198 Returns 

-

199 ------- 

-

200 np.ndarray 

-

201 Transformed array. 

-

202 """ 

-

203 self.check_array(X) 

-

204 return polynomial( 

-

205 X, self.combinations_np, self.degree, self.dtype) 

-
- + diff --git a/cov_html/d_bafb7a187804c98b_polynomial_object_features_py.html b/cov_html/d_bafb7a187804c98b_polynomial_object_features_py.html new file mode 100644 index 00000000..3d07d7e7 --- /dev/null +++ b/cov_html/d_bafb7a187804c98b_polynomial_object_features_py.html @@ -0,0 +1,251 @@ + + + + + + Coverage for gators/feature_generation/polynomial_object_features.py: 100% + + + + + +
+
+

+ Coverage for gators/feature_generation/polynomial_object_features.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 46 statements   + + + +

+
+ + + + +
+
+
+
+

1from itertools import chain, combinations 

+

2from typing import List 

+

3 

+

4import numpy as np 

+

5 

+

6from feature_gen import polynomial_object 

+

7from gators.transformers import Transformer 

+

8 

+

9from ..util import util 

+

10from ._base_feature_generation import _BaseFeatureGeneration 

+

11 

+

12from gators import DataFrame, Series 

+

13 

+

14 

+

15class PolynomialObjectFeatures(Transformer): 

+

16 """Create new columns based on object columns addition. 

+

17 

+

18 

+

19 Parameters 

+

20 ---------- 

+

21 theta_vec : List[float] 

+

22 List of columns. 

+

23 degree : int, default = 2 

+

24 The degree of polynomial. The default of degree of 2 

+

25 will produce A * A, B * B, and A * B from features A and B. 

+

26 

+

27 Examples 

+

28 --------- 

+

29 

+

30 Imports and initialization: 

+

31 

+

32 >>> from gators.feature_generation import PolynomialObjectFeatures 

+

33 >>> obj = PolynomialObjectFeatures(columns=['A', 'B', 'C'], degree=3) 

+

34 

+

35 The `fit`, `transform`, and `fit_transform` methods accept: 

+

36 

+

37 * `dask` dataframes: 

+

38 

+

39 >>> import dask.dataframe as dd 

+

40 >>> import pandas as pd 

+

41 >>> import dask.dataframe as dd 

+

42 >>> import pandas as pd 

+

43 >>> X = dd.from_pandas(pd.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}), npartitions=1) 

+

44 

+

45 * `koalas` dataframes: 

+

46 

+

47 >>> import databricks.koalas as ks 

+

48 >>> X = ks.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}) 

+

49 

+

50 * and `pandas` dataframes: 

+

51 

+

52 >>> import pandas as pd 

+

53 >>> X = pd.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}) 

+

54 

+

55 The result is a transformed dataframe belonging to the same dataframe library. 

+

56 

+

57 >>> obj.fit_transform(X) 

+

58 A B C A__x__B A__x__C B__x__C A__x__B__x__C 

+

59 0 None z c z c zc zc 

+

60 1 b a d ba bd ad bad 

+

61 2 c a d ca cd ad cad 

+

62 

+

63 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

64 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

65 when the number of rows is small *e.g.* in real-time environment. 

+

66 

+

67 >>> X = pd.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}) 

+

68 >>> _ = obj.fit(X) 

+

69 >>> obj.transform_numpy(X.to_numpy()) 

+

70 array([[None, 'z', 'c', 'z', 'c', 'zc', 'zc'], 

+

71 ['b', 'a', 'd', 'ba', 'bd', 'ad', 'bad'], 

+

72 ['c', 'a', 'd', 'ca', 'cd', 'ad', 'cad']], dtype=object) 

+

73 """ 

+

74 

+

75 def __init__( 

+

76 self, 

+

77 columns: List[str], 

+

78 degree=2, 

+

79 ): 

+

80 self.degree = degree 

+

81 if not isinstance(columns, (list, np.ndarray)): 

+

82 raise TypeError("`columns` should be a list.") 

+

83 if not columns: 

+

84 raise ValueError("`columns` should not be empty.") 

+

85 if not isinstance(degree, int): 

+

86 raise TypeError("`degree` should be an int.") 

+

87 if degree < 1: 

+

88 raise ValueError("`degree` should be at least 2.") 

+

89 self.combinations = list( 

+

90 map( 

+

91 list, 

+

92 chain.from_iterable( 

+

93 combinations(columns, r=r) for r in range(2, self.degree + 1) 

+

94 ), 

+

95 ) 

+

96 ) 

+

97 column_names = [ 

+

98 "__x__".join(map(str, combination)) for combination in self.combinations 

+

99 ] 

+

100 _BaseFeatureGeneration.__init__( 

+

101 self, 

+

102 columns=columns, 

+

103 column_names=column_names, 

+

104 ) 

+

105 

+

106 def fit(self, X: DataFrame, y: Series = None) -> "PolynomialObjectFeatures": 

+

107 """ 

+

108 Fit the dataframe X. 

+

109 

+

110 Parameters 

+

111 ---------- 

+

112 X : DataFrame. 

+

113 Input dataframe. 

+

114 y (np.ndarray, optional): labels. Defaults to None. 

+

115 

+

116 Returns 

+

117 ------- 

+

118 self : PolynomialObjectFeatures 

+

119 Instance of itself. 

+

120 """ 

+

121 self.check_dataframe(X) 

+

122 if self.degree == 1: 

+

123 return self 

+

124 self.base_columns = list(X.columns) 

+

125 self.combinations = list( 

+

126 map( 

+

127 list, 

+

128 chain.from_iterable( 

+

129 combinations(self.columns, r=r) for r in range(2, self.degree + 1) 

+

130 ), 

+

131 ) 

+

132 ) 

+

133 self.combinations_np = [ 

+

134 list(util.get_idx_columns(self.base_columns, cols)) 

+

135 for cols in self.combinations 

+

136 ] 

+

137 

+

138 for combi in self.combinations_np: 

+

139 combi.extend([-1 for _ in range(self.degree - len(combi))]) 

+

140 self.combinations_np = np.array(self.combinations_np) 

+

141 return self 

+

142 

+

143 def transform(self, X: DataFrame) -> DataFrame: 

+

144 """Transform the dataframe `X`. 

+

145 

+

146 Parameters 

+

147 ---------- 

+

148 X : DataFrame. 

+

149 Input dataframe. 

+

150 

+

151 Returns 

+

152 ------- 

+

153 X : DataFrame 

+

154 Transformed dataframe. 

+

155 """ 

+

156 self.check_dataframe(X) 

+

157 if self.degree == 1: 

+

158 return X 

+

159 for combi, name in zip(self.combinations, self.column_names): 

+

160 X[name] = X[combi[0]].fillna("") 

+

161 X[name] += X["__x__".join(combi[1:])].fillna("") 

+

162 

+

163 return X 

+

164 

+

165 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

166 """Transform the array `X`. 

+

167 

+

168 Parameters 

+

169 ---------- 

+

170 X : np.ndarray 

+

171 Input array. 

+

172 

+

173 Returns 

+

174 ------- 

+

175 X : np.ndarray 

+

176 Transformed array. 

+

177 """ 

+

178 self.check_array(X) 

+

179 if self.degree == 1: 

+

180 return X 

+

181 return polynomial_object(X, self.combinations_np, self.degree) 

+
+ + + diff --git a/cov_html/d_c5ff3984fec972b3_hyperopt_py.html b/cov_html/d_c5ff3984fec972b3_hyperopt_py.html deleted file mode 100644 index 54882675..00000000 --- a/cov_html/d_c5ff3984fec972b3_hyperopt_py.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - Coverage for gators/model_building/hyperopt.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from hyperopt.pyll.base import Apply 

-

3from hyperopt import Trials 

-

4from hyperopt import fmin 

-

5from sklearn.model_selection import cross_val_score 

-

6from sklearn.model_selection import KFold, StratifiedKFold 

-

7from sklearn.metrics._scorer import _PredictScorer 

-

8from typing import List, Union, Dict, Callable 

-

9import numpy as np 

-

10import pandas as pd 

-

11import databricks.koalas as ks 

-

12 

-

13 

-

14class HyperOpt(): 

-

15 """Hyper parameter optimization using the Hyperopt package. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 model : object 

-

20 Machine learning model. 

-

21 algo: Callable 

-

22 `algo` can be: 

-

23 

-

24 * hp.rand.suggest for random search. 

-

25 * hp.tpe.suggest for tree of parzen estimators. 

-

26 * hp.atpe.suggest for adaptative tree of parzen estimators. 

-

27 

-

28 scoring : _PredictScorer 

-

29 Score (or loss) function with signature score_func(y, y_pred). 

-

30 space : Dict[str, Apply] 

-

31 Hyperopt search space. 

-

32 kfold : Union[KFold, StratifiedKFold] 

-

33 sklearn K-Folds cross-validator. 

-

34 max_evals : int 

-

35 Number of evaluations. 

-

36 features: List[str] 

-

37 List of feature names. 

-

38 

-

39 Examples 

-

40 -------- 

-

41 

-

42 >>> import numpy as np 

-

43 >>> import sklearn 

-

44 >>> from hyperopt import hp, tpe 

-

45 >>> from lightgbm import LGBMClassifier 

-

46 >>> from gators.model_building import HyperOpt 

-

47 >>> from sklearn.model_selection import StratifiedKFold 

-

48 >>> X_np = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

49 >>> y_np = np.array([0, 1, 1, 0]) 

-

50 >>> hyper = HyperOpt( 

-

51 ... model=LGBMClassifier(random_state=0), 

-

52 ... algo=tpe.suggest, 

-

53 ... scoring=sklearn.metrics.make_scorer(sklearn.metrics.f1_score), 

-

54 ... space={'max_depth': hp.quniform('max_depth',1, 3, 1)}, 

-

55 ... max_evals=3, 

-

56 ... kfold=StratifiedKFold(n_splits=2), 

-

57 ... features=['x', 'y'], 

-

58 ... ) 

-

59 >>> _ = hyper.fit(X_np, y_np) 

-

60 100%|##########| 3/3 [00:03<00:00, 1.03s/trial, best loss: -0.0] 

-

61 >>> hyper.model 

-

62 LGBMClassifier(max_depth=2, random_state=0) 

-

63 

-

64 """ 

-

65 

-

66 def __init__(self, model: object, scoring: _PredictScorer, 

-

67 algo: Callable, 

-

68 space: Dict[str, Apply], 

-

69 kfold: Union[KFold, StratifiedKFold], 

-

70 max_evals: int, 

-

71 features: List[str]) -> 'HyperOpt': 

-

72 

-

73 if not hasattr(model, 'fit') or not hasattr(model, 'predict'): 

-

74 raise TypeError( 

-

75 '`model` should have the methods `fit` and `predict`') 

-

76 if not callable(algo): 

-

77 raise TypeError( 

-

78 ''' 

-

79 `algo` should be: 

-

80 hyperopt.rand, hyperopt.tpe, or hyperopt.atpe''') 

-

81 if not isinstance(scoring, (str, _PredictScorer)): 

-

82 raise TypeError( 

-

83 '''`scoring` should be a str or 

-

84 a sklearn.metrics._scorer._PredictScorer''') 

-

85 if not isinstance(space, dict): 

-

86 raise TypeError( 

-

87 '`space` should be a dict') 

-

88 if not isinstance(kfold, (KFold, StratifiedKFold)): 

-

89 raise TypeError( 

-

90 '`scoring` should be a sklearn.metrics._scorer._PredictScorer') 

-

91 if not isinstance(max_evals, int): 

-

92 raise TypeError( 

-

93 '`max_evals` should be an int') 

-

94 if not isinstance(features, list): 

-

95 raise TypeError( 

-

96 '`features` should be a list') 

-

97 self.model = model 

-

98 self.algo = algo 

-

99 self.scoring = scoring 

-

100 self.space = space 

-

101 self.kfold = kfold 

-

102 self.max_evals = max_evals 

-

103 self.history = pd.DataFrame() 

-

104 self.int_parameters: List[str] = self.get_int_parameters(space) 

-

105 self.features = features 

-

106 

-

107 def fit(self, X: np.ndarray, y: np.ndarray) -> 'HyperOpt': 

-

108 """Fit model on X with y. 

-

109 

-

110 Parameters 

-

111 ---------- 

-

112 X : np.ndarray 

-

113 NumPy array. 

-

114 y : np.ndarray 

-

115 Target values. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 HyperOpt 

-

120 Instance of itself. 

-

121 """ 

-

122 if not isinstance(X, np.ndarray): 

-

123 raise TypeError( 

-

124 '''`X` must be a NumPy array.''') 

-

125 if not isinstance(y, np.ndarray): 

-

126 raise TypeError( 

-

127 '''`y` must be a NumPy array.''') 

-

128 

-

129 def fn(params, cv=self.kfold, X=X, y=y): 

-

130 for int_parameter in self.int_parameters: 

-

131 params[int_parameter] = int(params[int_parameter]) 

-

132 self.model.set_params(**params) 

-

133 self.model.fit(X, y) 

-

134 score = cross_val_score( 

-

135 self.model, X, y, cv=cv, 

-

136 scoring=self.scoring, n_jobs=-1).mean() 

-

137 return - score 

-

138 

-

139 trials = Trials() 

-

140 best = fmin( 

-

141 fn=fn, 

-

142 space=self.space, 

-

143 algo=self.algo, 

-

144 max_evals=self.max_evals, 

-

145 trials=trials, 

-

146 rstate=np.random.RandomState(0) 

-

147 ) 

-

148 for int_parameter in self.int_parameters: 

-

149 best[int_parameter] = int(best[int_parameter]) 

-

150 self.history = self.generate_history(trials) 

-

151 self.model.set_params(**best) 

-

152 self.model.fit(X, y) 

-

153 return self 

-

154 

-

155 def get_feature_importances(self) -> pd.Series: 

-

156 """Generate the feature importances from the selected model. 

-

157 

-

158 Returns 

-

159 ------- 

-

160 pd.Series 

-

161 Feature importances. 

-

162 """ 

-

163 feature_importances_ = pd.Series( 

-

164 self.model.feature_importances_, self.features) 

-

165 return feature_importances_.sort_values(ascending=False) 

-

166 

-

167 @staticmethod 

-

168 def generate_history(trials: object) -> pd.DataFrame: 

-

169 """Generate hyperparameter tuning history. 

-

170 

-

171 Parameters 

-

172 ---------- 

-

173 trials : object 

-

174 Hyperopt trial funnction. 

-

175 

-

176 Returns 

-

177 ------- 

-

178 pd.DataFrame 

-

179 Hyperparameter tuning history. 

-

180 """ 

-

181 def f(x) -> ks.Series[np.float32]: 

-

182 return pd.Series({key: val[0] for key, val in x.items()}) 

-

183 

-

184 loss = pd.DataFrame(trials.results) 

-

185 params = pd.DataFrame(trials.miscs)['vals'].apply(f) 

-

186 history = pd.concat([params, loss], axis=1) 

-

187 history['id'] = history.index 

-

188 history.sort_values('loss', ascending=False) 

-

189 return history 

-

190 

-

191 @staticmethod 

-

192 def get_int_parameters(space) -> List[str]: 

-

193 """Get the list of int parameters based on the hyperopt search space. 

-

194 

-

195 Parameters 

-

196 ---------- 

-

197 space : object 

-

198 Hyperopt search space. 

-

199 

-

200 Returns 

-

201 ------- 

-

202 List[str] 

-

203 List of int parameters. 

-

204 """ 

-

205 int_parameters = [] 

-

206 for key in space.keys(): 

-

207 if 'qlog' in str(space[key]) or 'quni' in str(space[key]): 

-

208 int_parameters.append(key) 

-

209 return int_parameters 

-
- - - diff --git a/cov_html/d_c5ff3984fec972b3_lgbm_treelite_dumper_py.html b/cov_html/d_c5ff3984fec972b3_lgbm_treelite_dumper_py.html index 5cf71b7d..a1392370 100644 --- a/cov_html/d_c5ff3984fec972b3_lgbm_treelite_dumper_py.html +++ b/cov_html/d_c5ff3984fec972b3_lgbm_treelite_dumper_py.html @@ -6,154 +6,156 @@ Coverage for gators/model_building/lgbm_treelite_dumper.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import os 

-

4import treelite 

-

5from lightgbm.sklearn import LGBMClassifier, LGBMRegressor 

-

6 

-

7 

-

8class LGBMTreeliteDumper: 

-

9 """LightGBM Treelite Dumper class. 

-

10 

-

11 Examples 

-

12 -------- 

-

13 >>> import numpy as np 

-

14 >>> from lightgbm import LGBMClassifier 

-

15 >>> from gators.model_building import LGBMTreeliteDumper 

-

16 >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

17 >>> y_train = np.array([0, 1, 1, 0]) 

-

18 >>> model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) 

-

19 >>> LGBMTreeliteDumper.dump( 

-

20 ... model=model, 

-

21 ... toolchain='gcc', 

-

22 ... parallel_comp=1, 

-

23 ... model_path='.', 

-

24 ... model_name='dummy') 

-

25 [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

26 [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler 

-

27 [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

28 [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... 

-

29 [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... 

-

30 [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... 

-

31 [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... 

-

32 [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... 

-

33 """ 

-

34 

-

35 @staticmethod 

-

36 def dump(model: Union[LGBMClassifier, LGBMRegressor], 

-

37 toolchain: str, 

-

38 parallel_comp: int, 

-

39 model_path: str, model_name: str): 

-

40 """Dump the XGBoost treelite as a .so and a 

-

41 .dylib file. 

-

42 

-

43 Parameters 

-

44 ---------- 

-

45 model: Union[LGBMClassifier, LGBMRegressor]. 

-

46 LightGBM trained model. 

-

47 toolchain: str 

-

48 Compiler. List of available treelite compiler. 

-

49 * gcc 

-

50 * clang 

-

51 * msvc 

-

52 parallel_comp: int 

-

53 Treelite parallel compilation. 

-

54 model_path : str 

-

55 Model path. 

-

56 model_name : str 

-

57 Model name. 

-

58 """ 

-

59 if not isinstance(model, (LGBMClassifier, LGBMRegressor)): 

-

60 raise TypeError( 

-

61 '`model` should be a LGBMClassifier or LGBMRegressor.') 

-

62 if not isinstance(toolchain, str): 

-

63 raise TypeError('`toolchain` should be a str.') 

-

64 if toolchain not in ['gcc', 'clang', 'msvc']: 

-

65 raise ValueError( 

-

66 '`toolchain` should be `gcc`, `clang`, or `msvc`.') 

-

67 if not isinstance(parallel_comp, int): 

-

68 raise TypeError('`parallel_comp` should be an int.') 

-

69 if not isinstance(model_path, str): 

-

70 raise TypeError('`model_path` should be a str.') 

-

71 if not isinstance(model_name, str): 

-

72 raise TypeError('`model_name` should be a str.') 

-

73 file_name = 'dummy_lgbm_model.txt' 

-

74 model.booster_.save_model(file_name) 

-

75 model_ = treelite.Model.load(file_name, model_format='lightgbm') 

-

76 platform_dict = {'gcc': 'unix', 'clang': 'osx', 'msvc': 'windows'} 

-

77 format_dict = {'gcc': '.so', 'clang': '.dylib', 'msvc': '.dll'} 

-

78 model_.export_lib( 

-

79 toolchain=toolchain, 

-

80 libpath=os.path.join( 

-

81 model_path, model_name + format_dict[toolchain]), 

-

82 verbose=False, 

-

83 params={'parallel_comp': parallel_comp}, 

-

84 nthread=1, 

-

85 ) 

-

86 model_.export_srcpkg( 

-

87 platform=platform_dict[toolchain], 

-

88 toolchain=toolchain, 

-

89 params={'parallel_comp': parallel_comp}, 

-

90 pkgpath=os.path.join(model_path, model_name + '.zip'), 

-

91 libname=os.path.join( 

-

92 model_path, model_name + format_dict[toolchain]), 

-

93 verbose=True, 

-

94 ) 

-
- + diff --git a/cov_html/d_c5ff3984fec972b3_model_py.html b/cov_html/d_c5ff3984fec972b3_model_py.html new file mode 100644 index 00000000..0b516aa0 --- /dev/null +++ b/cov_html/d_c5ff3984fec972b3_model_py.html @@ -0,0 +1,155 @@ + + + + + + Coverage for gators/model_building/model.py: 100% + + + + + +
+
+

+ Coverage for gators/model_building/model.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 13 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from sklearn.base import BaseEstimator 

+

3 

+

4 

+

5from ..util import util 

+

6from gators import DataFrame, Series 

+

7 

+

8 

+

9class Model(BaseEstimator): 

+

10 """Model wrapper class. 

+

11 

+

12 Examples 

+

13 -------- 

+

14 >>> import numpy as np 

+

15 >>> import xgboost as xgb 

+

16 >>> from gators.model_building import XGBBoosterBuilder 

+

17 >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

+

18 >>> y_train = np.array([0, 1, 1, 0]) 

+

19 >>> model = xgb.XGBClassifier(eval_metric='logloss').fit(X_train, y_train) 

+

20 >>> xgbooster = XGBBoosterBuilder.train( 

+

21 ... model=model, 

+

22 ... X_train=X_train, 

+

23 ... y_train=y_train) 

+

24 >>> xgbooster.predict(xgb.DMatrix(X_train)) 

+

25 array([0.5, 0.5, 0.5, 0.5], dtype=float32) 

+

26 

+

27 """ 

+

28 

+

29 def __init__(self, model): 

+

30 """Wrap the model in the SKLearn fit-transform method. 

+

31 

+

32 Parameters 

+

33 ---------- 

+

34 model : "PySparkML model" 

+

35 model. 

+

36 """ 

+

37 self.model = model 

+

38 

+

39 def fit(self, X: DataFrame, y: Series) -> "Model": 

+

40 """Fit the model on X and y. 

+

41 

+

42 Parameters 

+

43 ---------- 

+

44 X : DataFrame 

+

45 Input dataframe. 

+

46 y : Series 

+

47 Target values 

+

48 

+

49 Returns 

+

50 ------- 

+

51 "SparkMLWrapper" 

+

52 Instance of itself. 

+

53 """ 

+

54 self.model = util.get_function(X).fit(self.model, X, y) 

+

55 return self 

+

56 

+

57 def predict(self, X): 

+

58 """Predict class for X. 

+

59 

+

60 Parameters 

+

61 ---------- 

+

62 X : DataFrame 

+

63 Input dataframe. 

+

64 

+

65 Returns 

+

66 ------- 

+

67 DataFrame 

+

68 The predicted classes of the input dataframe. 

+

69 """ 

+

70 return util.get_function(X).predict(self.model, X) 

+

71 

+

72 def predict_proba(self, X): 

+

73 """Predict class probabilities for X. 

+

74 

+

75 Parameters 

+

76 ---------- 

+

77 X : DataFrame 

+

78 Input dataframe. 

+

79 

+

80 Returns 

+

81 ------- 

+

82 DataFrame 

+

83 The predicted class probabilities of the input dataframe. 

+

84 """ 

+

85 return util.get_function(X).predict_proba(self.model, X) 

+
+ + + diff --git a/cov_html/d_c5ff3984fec972b3_train_test_split_py.html b/cov_html/d_c5ff3984fec972b3_train_test_split_py.html index b1060b08..8e63da94 100644 --- a/cov_html/d_c5ff3984fec972b3_train_test_split_py.html +++ b/cov_html/d_c5ff3984fec972b3_train_test_split_py.html @@ -6,478 +6,341 @@ Coverage for gators/model_building/train_test_split.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers import TransformerXY 

-

2from ..util import util 

-

3from typing import Tuple, Union 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class TrainTestSplit(TransformerXY): 

-

9 """TrainTestSplit class. 

-

10 

-

11 Parameters 

-

12 ---------- 

-

13 test_ratio : float 

-

14 Proportion of the dataset to include in the test split. 

-

15 strategy : str 

-

16 Train/Test split strategy. The possible values are: 

-

17 

-

18 * ordered 

-

19 * random 

-

20 * stratified 

-

21 

-

22 random_state : int 

-

23 Random state. 

-

24 

-

25 Notes 

-

26 ----- 

-

27 Note that the `random` and `stratified` strategies will be give different 

-

28 results for pandas and koalas. 

-

29 

-

30 Examples 

-

31 -------- 

-

32 

-

33 * transform with `pandas` 

-

34 

-

35 - ordered split 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> import numpy as np 

-

39 >>> from gators.model_building import TrainTestSplit 

-

40 >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

41 >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

42 >>> test_ratio = 0.5 

-

43 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') 

-

44 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

45 >>> X_train 

-

46 A B C 

-

47 0 0 1 2 

-

48 1 3 4 5 

-

49 2 6 7 8 

-

50 3 9 10 11 

-

51 >>> X_test 

-

52 A B C 

-

53 4 12 13 14 

-

54 5 15 16 17 

-

55 6 18 19 20 

-

56 7 21 22 23 

-

57 >>> y_train 

-

58 0 0 

-

59 1 1 

-

60 2 2 

-

61 3 0 

-

62 Name: TARGET, dtype: int64 

-

63 >>> y_test 

-

64 4 1 

-

65 5 2 

-

66 6 0 

-

67 7 1 

-

68 Name: TARGET, dtype: int64 

-

69 

-

70 - random split 

-

71 

-

72 >>> import pandas as pd 

-

73 >>> import numpy as np 

-

74 >>> from gators.model_building import TrainTestSplit 

-

75 >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

76 >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

77 >>> test_ratio = 0.5 

-

78 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') 

-

79 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

80 >>> X_train 

-

81 A B C 

-

82 0 0 1 2 

-

83 3 9 10 11 

-

84 4 12 13 14 

-

85 5 15 16 17 

-

86 >>> X_test 

-

87 A B C 

-

88 6 18 19 20 

-

89 2 6 7 8 

-

90 1 3 4 5 

-

91 7 21 22 23 

-

92 >>> y_train 

-

93 0 0 

-

94 3 0 

-

95 4 1 

-

96 5 2 

-

97 Name: TARGET, dtype: int64 

-

98 >>> y_test 

-

99 6 0 

-

100 2 2 

-

101 1 1 

-

102 7 1 

-

103 Name: TARGET, dtype: int64 

-

104 

-

105 - stratified split 

-

106 

-

107 >>> import pandas as pd 

-

108 >>> import numpy as np 

-

109 >>> from gators.model_building import TrainTestSplit 

-

110 >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

111 >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

112 >>> test_ratio = 0.5 

-

113 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') 

-

114 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

115 >>> X_train 

-

116 A B C 

-

117 0 0 1 2 

-

118 1 3 4 5 

-

119 2 6 7 8 

-

120 >>> X_test 

-

121 A B C 

-

122 6 18 19 20 

-

123 3 9 10 11 

-

124 7 21 22 23 

-

125 4 12 13 14 

-

126 5 15 16 17 

-

127 >>> y_train 

-

128 0 0 

-

129 1 1 

-

130 2 2 

-

131 Name: TARGET, dtype: int64 

-

132 >>> y_test 

-

133 6 0 

-

134 3 0 

-

135 7 1 

-

136 4 1 

-

137 5 2 

-

138 Name: TARGET, dtype: int64 

-

139 

-

140 * transform with `koalas` 

-

141 

-

142 - ordered split 

-

143 

-

144 >>> import databricks.koalas as ks 

-

145 >>> import numpy as np 

-

146 >>> from gators.model_building import TrainTestSplit 

-

147 >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

148 >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

149 >>> test_ratio = 0.5 

-

150 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') 

-

151 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

152 >>> X_train 

-

153 A B C 

-

154 0 0 1 2 

-

155 1 3 4 5 

-

156 2 6 7 8 

-

157 3 9 10 11 

-

158 >>> X_test 

-

159 A B C 

-

160 4 12 13 14 

-

161 5 15 16 17 

-

162 6 18 19 20 

-

163 7 21 22 23 

-

164 >>> y_train 

-

165 0 0 

-

166 1 1 

-

167 2 2 

-

168 3 0 

-

169 Name: TARGET, dtype: int64 

-

170 >>> y_test 

-

171 4 1 

-

172 5 2 

-

173 6 0 

-

174 7 1 

-

175 Name: TARGET, dtype: int64 

-

176 

-

177 - random split 

-

178 

-

179 >>> import databricks.koalas as ks 

-

180 >>> import numpy as np 

-

181 >>> from gators.model_building import TrainTestSplit 

-

182 >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

183 >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

184 >>> test_ratio = 0.5 

-

185 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') 

-

186 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

187 >>> X_train 

-

188 A B C 

-

189 0 0 1 2 

-

190 7 21 22 23 

-

191 3 9 10 11 

-

192 2 6 7 8 

-

193 >>> X_test 

-

194 A B C 

-

195 6 18 19 20 

-

196 5 15 16 17 

-

197 1 3 4 5 

-

198 4 12 13 14 

-

199 >>> y_train 

-

200 0 0 

-

201 7 1 

-

202 3 0 

-

203 2 2 

-

204 Name: TARGET, dtype: int64 

-

205 >>> y_test 

-

206 6 0 

-

207 5 2 

-

208 1 1 

-

209 4 1 

-

210 Name: TARGET, dtype: int64 

-

211 

-

212 - stratified split 

-

213 

-

214 >>> import databricks.koalas as ks 

-

215 >>> import numpy as np 

-

216 >>> from gators.model_building import TrainTestSplit 

-

217 >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

218 >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

219 >>> test_ratio = 0.5 

-

220 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') 

-

221 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

222 >>> X_train 

-

223 A B C 

-

224 0 0 1 2 

-

225 3 9 10 11 

-

226 7 21 22 23 

-

227 2 6 7 8 

-

228 >>> X_test 

-

229 A B C 

-

230 6 18 19 20 

-

231 1 3 4 5 

-

232 4 12 13 14 

-

233 5 15 16 17 

-

234 >>> y_train 

-

235 0 0 

-

236 3 0 

-

237 7 1 

-

238 2 2 

-

239 Name: TARGET, dtype: int64 

-

240 >>> y_test 

-

241 6 0 

-

242 1 1 

-

243 4 1 

-

244 5 2 

-

245 Name: TARGET, dtype: int64 

-

246  

-

247 """ 

-

248 

-

249 def __init__(self, test_ratio: float, strategy: str, 

-

250 random_state: int = 0): 

-

251 if not isinstance(strategy, str): 

-

252 raise TypeError('`strategy` must be a string.') 

-

253 if not isinstance(test_ratio, float): 

-

254 raise TypeError('`test_ratio` must be a float.') 

-

255 if not isinstance(random_state, int): 

-

256 raise TypeError('`random_state` must be an int.') 

-

257 if strategy not in ['ordered', 'random', 'stratified']: 

-

258 raise ValueError('`strategy` not implemented.') 

-

259 self.test_ratio = test_ratio 

-

260 self.random_state = random_state 

-

261 self.strategy = strategy 

-

262 

-

263 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

264 y: Union[pd.Series, ks.Series], 

-

265 ) -> Tuple[ 

-

266 Union[pd.DataFrame, ks.DataFrame], 

-

267 Union[pd.DataFrame, ks.DataFrame], 

-

268 Union[pd.Series, ks.Series], 

-

269 Union[pd.Series, ks.Series]]: 

-

270 """Transform dataframe and series. 

-

271 

-

272 Parameters 

-

273 ---------- 

-

274 X: Union[pd.DataFrame, ks.DataFrame] 

-

275 Dataframe. 

-

276 y: np.ndarray 

-

277 Labels 

-

278 test_ratio: float 

-

279 Ratio of data points used for the test set. 

-

280 

-

281 Returns 

-

282 -------- 

-

283 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame], 

-

284 Union[pd.Series, ks.Series], Union[pd.Series, ks.Series]] 

-

285 Train-Test split. 

-

286 """ 

-

287 self.check_dataframe(X) 

-

288 self.check_y(X, y) 

-

289 if self.strategy == 'ordered': 

-

290 return self.ordered_split(X, y) 

-

291 y_name = y.name 

-

292 x_name = X.index.name 

-

293 if isinstance(X, ks.DataFrame): 

-

294 X['index'] = X.index 

-

295 Xy = X.join(y) 

-

296 

-

297 if self.strategy == 'random': 

-

298 Xy_train, Xy_test = self.random_split(Xy, x_name) 

-

299 else: 

-

300 Xy_train, Xy_test = self.stratified_split(Xy, x_name, y_name) 

-

301 return Xy_train.drop(y_name, axis=1), Xy_test.drop(y_name, axis=1), Xy_train[y_name], Xy_test[y_name] 

-

302 

-

303 def ordered_split(self, 

-

304 X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] 

-

305 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: 

-

306 """Perform random split. 

-

307 

-

308 Parameters 

-

309 ---------- 

-

310 X : Union[pd.DataFrame, ks.DataFrame] 

-

311 Dataframe 

-

312 y : Union[pd.Series, ks.Series] 

-

313 Series 

-

314 Returns 

-

315 ------- 

-

316 Union[pd.DataFrame, ks.DataFrame]: 

-

317 Train set. 

-

318 Union[pd.DataFrame, ks.DataFrame]: 

-

319 Test set. 

-

320 """ 

-

321 n_samples = X.shape[0] 

-

322 n_test = int(self.test_ratio * n_samples) 

-

323 n_train = n_samples - n_test 

-

324 return X.head(n_train), X.tail(n_test), y.head(n_train), y.tail(n_test) 

-

325 

-

326 def random_split(self, 

-

327 Xy: Union[pd.DataFrame, ks.DataFrame], 

-

328 x_name: str 

-

329 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], 

-

330 Union[pd.DataFrame, ks.DataFrame]]: 

-

331 """Perform random split. 

-

332 

-

333 Parameters 

-

334 ---------- 

-

335 Xy : Union[pd.DataFrame, ks.DataFrame] 

-

336 Dataframe. 

-

337 x_name: str 

-

338 Dataframe index name. 

-

339 

-

340 Returns 

-

341 ------- 

-

342 Union[pd.DataFrame, ks.DataFrame]: 

-

343 Train set. 

-

344 Union[pd.DataFrame, ks.DataFrame]: 

-

345 Test set. 

-

346 """ 

-

347 

-

348 if isinstance(Xy, ks.DataFrame): 

-

349 self.test_ratio -= 1e-6 

-

350 Xy_train, Xy_test = Xy.to_spark().randomSplit( 

-

351 [1. - self.test_ratio, self.test_ratio], 

-

352 seed=self.random_state 

-

353 ) 

-

354 Xy_train = Xy_train.to_koalas() 

-

355 Xy_test = Xy_test.to_koalas() 

-

356 Xy_train.set_index('index', drop=True, inplace=True) 

-

357 Xy_train.index.name = x_name 

-

358 Xy_test.set_index('index', drop=True, inplace=True) 

-

359 Xy_test.index.name = x_name 

-

360 else: 

-

361 Xy_test = Xy.sample( 

-

362 frac=self.test_ratio, random_state=self.random_state) 

-

363 Xy_train = Xy.drop(Xy_test.index) 

-

364 return Xy_train, Xy_test 

-

365 

-

366 def stratified_split(self, 

-

367 Xy: Union[pd.DataFrame, ks.DataFrame], 

-

368 x_name: str, y_name: str 

-

369 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: 

-

370 """Perform stratified split. 

-

371 

-

372 Parameters 

-

373 ---------- 

-

374 Xy : Union[pd.DataFrame, ks.DataFrame] 

-

375 Dataframe. 

-

376 x_name: str 

-

377 Dataframe index name. 

-

378 y_name: str 

-

379 Target column name. 

-

380 

-

381 Returns 

-

382 ------- 

-

383 Union[pd.DataFrame, ks.DataFrame]: 

-

384 Train set. 

-

385 Union[pd.DataFrame, ks.DataFrame]: 

-

386 Test set. 

-

387 """ 

-

388 y_values = Xy[y_name].value_counts(normalize=True) 

-

389 Xy_test_list = [] 

-

390 Xy_train_list = [] 

-

391 if isinstance(Xy, ks.DataFrame): 

-

392 self.test_ratio -= 1e-6 

-

393 for label, ratio in y_values.iteritems(): 

-

394 Xy_label = Xy[Xy[y_name] == label] 

-

395 Xy_train_label, Xy_test_label = Xy_label.to_spark( 

-

396 ).randomSplit( 

-

397 [1. - self.test_ratio, self.test_ratio], 

-

398 seed=self.random_state 

-

399 ) 

-

400 Xy_train_label = Xy_train_label.to_koalas() 

-

401 Xy_test_label = Xy_test_label.to_koalas() 

-

402 Xy_train_label.set_index('index', drop=True, inplace=True) 

-

403 Xy_train_label.index.name = x_name 

-

404 Xy_test_label.set_index('index', drop=True, inplace=True) 

-

405 Xy_test_label.index.name = x_name 

-

406 Xy_test_list.append(Xy_test_label) 

-

407 Xy_train_list.append(Xy_train_label) 

-

408 return util.concat(Xy_train_list, axis=0), \ 

-

409 util.concat(Xy_test_list, axis=0) 

-

410 

-

411 for label, ratio in y_values.iteritems(): 

-

412 Xy_label = Xy[Xy[y_name] == label] 

-

413 Xy_label_test = Xy_label.sample( 

-

414 frac=self.test_ratio, 

-

415 random_state=self.random_state) 

-

416 Xy_test_list.append(Xy_label_test) 

-

417 Xy_train_list.append(Xy_label.drop(Xy_label_test.index)) 

-

418 return util.concat(Xy_train_list, axis=0), util.concat(Xy_test_list, axis=0) 

-
- + diff --git a/cov_html/d_c5ff3984fec972b3_xgb_booster_builder_py.html b/cov_html/d_c5ff3984fec972b3_xgb_booster_builder_py.html index 74229da7..1c33da1c 100644 --- a/cov_html/d_c5ff3984fec972b3_xgb_booster_builder_py.html +++ b/cov_html/d_c5ff3984fec972b3_xgb_booster_builder_py.html @@ -6,130 +6,132 @@ Coverage for gators/model_building/xgb_booster_builder.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import xgboost 

-

5from xgboost import ( 

-

6 XGBClassifier, 

-

7 XGBRegressor, 

-

8 XGBRFClassifier, 

-

9 XGBRFRegressor 

-

10) 

-

11 

-

12 

-

13class XGBBoosterBuilder: 

-

14 """XGBoost Booster Converter Class. 

-

15 

-

16 Examples 

-

17 -------- 

-

18 >>> import numpy as np 

-

19 >>> import xgboost as xgb 

-

20 >>> from gators.model_building import XGBBoosterBuilder 

-

21 >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

22 >>> y_train = np.array([0, 1, 1, 0]) 

-

23 >>> model = xgb.XGBClassifier(eval_metric='logloss').fit(X_train, y_train) 

-

24 >>> xgbooster = XGBBoosterBuilder.train( 

-

25 ... model=model, 

-

26 ... X_train=X_train, 

-

27 ... y_train=y_train) 

-

28 >>> xgbooster.predict(xgb.DMatrix(X_train)) 

-

29 array([0.5, 0.5, 0.5, 0.5], dtype=float32) 

-

30 

-

31 """ 

-

32 

-

33 @staticmethod 

-

34 def train( 

-

35 model: Union[ 

-

36 XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor], 

-

37 X_train: np.array, 

-

38 y_train: np.ndarray, 

-

39 num_class=None): 

-

40 """Convert the XGBoost model to a XGB Booster model. 

-

41 

-

42 Parameters 

-

43 ---------- 

-

44 model : Union[XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor] 

-

45 Trained xgboost.sklearn model. 

-

46 X_train : np.ndarray 

-

47 Train array. 

-

48 y_train : np.ndarray 

-

49 Labels. 

-

50 

-

51 Returns 

-

52 ------- 

-

53 xgboost.Booster 

-

54 Trained xgboost Booster model. 

-

55 """ 

-

56 if not isinstance(model, (XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor)): 

-

57 raise TypeError( 

-

58 '`model` should be a `xgboost.sklearn` model.') 

-

59 if not isinstance(X_train, np.ndarray): 

-

60 raise TypeError('`X_train` should be a NumPy array.') 

-

61 if not isinstance(y_train, np.ndarray): 

-

62 raise TypeError('`y_train` should be a NumPy array.') 

-

63 if num_class is not None and not isinstance(num_class, int): 

-

64 raise TypeError('`num_class` should be an int.') 

-

65 params = model.get_xgb_params() 

-

66 if num_class: 

-

67 params['num_class'] = num_class 

-

68 n_estimators = model.n_estimators 

-

69 dtrain = xgboost.DMatrix(X_train, label=y_train) 

-

70 return xgboost.train(params, dtrain, n_estimators) 

-
- + diff --git a/cov_html/d_c5ff3984fec972b3_xgb_treelite_dumper_py.html b/cov_html/d_c5ff3984fec972b3_xgb_treelite_dumper_py.html index dd1b7ba3..4ebc8c8c 100644 --- a/cov_html/d_c5ff3984fec972b3_xgb_treelite_dumper_py.html +++ b/cov_html/d_c5ff3984fec972b3_xgb_treelite_dumper_py.html @@ -6,152 +6,154 @@ Coverage for gators/model_building/xgb_treelite_dumper.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2import os 

-

3import numpy as np 

-

4import xgboost 

-

5from xgboost.sklearn import XGBClassifier 

-

6import treelite 

-

7 

-

8 

-

9class XGBTreeliteDumper: 

-

10 """XGBoost Treelite Dumper class. 

-

11 

-

12 Examples 

-

13 -------- 

-

14 >>> import numpy as np 

-

15 >>> import xgboost as xgb 

-

16 >>> from gators.model_building import XGBTreeliteDumper 

-

17 >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

18 >>> y_train = np.array([0, 1, 1, 0]) 

-

19 >>> dtrain = xgb.DMatrix(X_train, label=y_train) 

-

20 >>> model = xgb.train({'max_depth': 1}, dtrain, num_boost_round=1) 

-

21 >>> XGBTreeliteDumper.dump( 

-

22 ... model=model, 

-

23 ... toolchain='gcc', 

-

24 ... parallel_comp=1, 

-

25 ... model_path='.', 

-

26 ... model_name='dummy') 

-

27 [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

28 [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler 

-

29 [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

30 [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... 

-

31 [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... 

-

32 [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... 

-

33 [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... 

-

34 [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... 

-

35 """ 

-

36 

-

37 @staticmethod 

-

38 def dump(model: xgboost.core.Booster, toolchain: str, 

-

39 parallel_comp: int, 

-

40 model_path: str, model_name: str): 

-

41 """Dump the XGBoost treelite as a .so and a 

-

42 .dylib file. 

-

43 

-

44 Parameters 

-

45 ---------- 

-

46 model: xgboost.core.Booster. 

-

47 Trained model. 

-

48 toolchain: str 

-

49 Compiler. List of available treelite compiler. 

-

50 * gcc 

-

51 * clang 

-

52 * msvc 

-

53 parallel_comp: int 

-

54 Treelite parallel compilation. 

-

55 model_path : str 

-

56 Model path. 

-

57 model_name : str 

-

58 Model name. 

-

59 """ 

-

60 if not isinstance(model, xgboost.core.Booster): 

-

61 raise TypeError('`model` should be an xgboost.core.Booster.') 

-

62 if not isinstance(toolchain, str): 

-

63 raise TypeError('`toolchain` should be a str.') 

-

64 if toolchain not in ['gcc', 'clang', 'msvc']: 

-

65 raise ValueError( 

-

66 '`toolchain` should be `gcc`, `clang`, or `msvc`.') 

-

67 if not isinstance(parallel_comp, int): 

-

68 raise TypeError('`parallel_comp` should be an int.') 

-

69 if not isinstance(model_path, str): 

-

70 raise TypeError('`model_path` should be a str.') 

-

71 if not isinstance(model_name, str): 

-

72 raise TypeError('`model_name` should be a str.') 

-

73 model_ = treelite.Model.from_xgboost(model) 

-

74 platform_dict = {'gcc': 'unix', 'clang': 'osx', 'msvc': 'windows'} 

-

75 format_dict = {'gcc': '.so', 'clang': '.dylib', 'msvc': '.dll'} 

-

76 model_.export_lib( 

-

77 toolchain=toolchain, 

-

78 libpath=os.path.join( 

-

79 model_path, model_name + format_dict[toolchain]), 

-

80 verbose=False, 

-

81 params={'parallel_comp': parallel_comp}, 

-

82 nthread=1, 

-

83 ) 

-

84 model_.export_srcpkg( 

-

85 platform=platform_dict[toolchain], 

-

86 toolchain=toolchain, 

-

87 params={'parallel_comp': parallel_comp}, 

-

88 pkgpath=os.path.join(model_path, model_name + '.zip'), 

-

89 libname=os.path.join( 

-

90 model_path, model_name + format_dict[toolchain]), 

-

91 verbose=True, 

-

92 ) 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0__base_data_cleaning_py.html b/cov_html/d_d9c8a9d49d9efff0__base_data_cleaning_py.html index 2c6f78a2..7c29e54a 100644 --- a/cov_html/d_d9c8a9d49d9efff0__base_data_cleaning_py.html +++ b/cov_html/d_d9c8a9d49d9efff0__base_data_cleaning_py.html @@ -6,136 +6,146 @@ Coverage for gators/data_cleaning/_base_data_cleaning.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Union 

-

5from abc import ABC 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class _BaseDataCleaning(Transformer, ABC): 

-

12 """Base data cleaning transformer.""" 

-

13 

-

14 def __init__(self): 

-

15 Transformer.__init__(self) 

-

16 self.columns_to_drop: List[str] = [] 

-

17 self.columns_to_keep: List[str] = [] 

-

18 self.idx_columns_to_keep = np.array([]) 

-

19 

-

20 def transform(self, X: Union[pd.DataFrame, ks.DataFrame] 

-

21 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

22 """Transform the dataframe `X`. 

-

23 

-

24 Parameters 

-

25 ---------- 

-

26 X : Union[pd.DataFrame, ks.DataFrame] 

-

27 Input dataset. 

-

28 

-

29 Returns 

-

30 ------- 

-

31 Union[pd.DataFrame, ks.DataFrame] 

-

32 Dataset without datetime columns. 

-

33 """ 

-

34 self.check_dataframe(X) 

-

35 if len(self.columns): 

-

36 return X.drop(self.columns, axis=1) 

-

37 return X 

-

38 

-

39 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

40 """Transform the NumPy array `X`. 

-

41 

-

42 Parameters 

-

43 ---------- 

-

44 X : np.ndarray 

-

45 Input array. 

-

46 

-

47 Returns 

-

48 ------- 

-

49 np.ndarray 

-

50 Transformed array. 

-

51 """ 

-

52 self.check_array(X) 

-

53 return X[:, self.idx_columns_to_keep] 

-

54 

-

55 @ staticmethod 

-

56 def get_idx_columns_to_keep( 

-

57 columns: List[str], columns_to_drop: List[str]) -> np.array: 

-

58 """Get the column indices to keep. 

-

59 

-

60 Parameters 

-

61 ---------- 

-

62 columns : List[str] 

-

63 List of columns of a dataset. 

-

64 columns_to_drop : List[str] 

-

65 List of columns to drop. 

-

66 

-

67 Returns 

-

68 ------- 

-

69 np.array: 

-

70 Column indices to keep. 

-

71 """ 

-

72 idx_columns_to_keep = util.exclude_idx_columns( 

-

73 columns=columns, 

-

74 excluded_columns=columns_to_drop, 

-

75 ) 

-

76 return idx_columns_to_keep 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_convert_column_datatype_py.html b/cov_html/d_d9c8a9d49d9efff0_convert_column_datatype_py.html new file mode 100644 index 00000000..1ecc1f81 --- /dev/null +++ b/cov_html/d_d9c8a9d49d9efff0_convert_column_datatype_py.html @@ -0,0 +1,215 @@ + + + + + + Coverage for gators/data_cleaning/convert_column_datatype.py: 100% + + + + + +
+
+

+ Coverage for gators/data_cleaning/convert_column_datatype.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 27 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2from typing import List 

+

3 

+

4import numpy as np 

+

5 

+

6from ..transformers import Transformer 

+

7 

+

8LIST_NUMPY_NUM_DTYPES = [ 

+

9 bool, 

+

10 int, 

+

11 "np.int8", 

+

12 "np.int16", 

+

13 "np.int32", 

+

14 "np.int64", 

+

15 "np.uint8", 

+

16 "np.uint16", 

+

17 "np.uint32", 

+

18 "np.uint64", 

+

19 float, 

+

20 "np.float16", 

+

21 "np.float32", 

+

22 "np.float64", 

+

23] 

+

24 

+

25 

+

26from gators import DataFrame, Series 

+

27 

+

28 

+

29class ConvertColumnDatatype(Transformer): 

+

30 """Set the datatype of the selected columns to a given datatype. 

+

31 

+

32 Parameters 

+

33 ---------- 

+

34 theta_vec : List[float] 

+

35 List of columns. 

+

36 datatype : type 

+

37 Datatype to use. 

+

38 

+

39 Examples 

+

40 -------- 

+

41 

+

42 Imports and initialization: 

+

43 

+

44 >>> from gators.data_cleaning import ConvertColumnDatatype 

+

45 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

+

46 

+

47 The `fit`, `transform`, and `fit_transform` methods accept: 

+

48 

+

49 * `dask` dataframes: 

+

50 

+

51 >>> import dask.dataframe as dd 

+

52 >>> import pandas as pd 

+

53 >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}), npartitions=1) 

+

54 

+

55 * `koalas` dataframes: 

+

56 

+

57 >>> import databricks.koalas as ks 

+

58 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

+

59 

+

60 * and `pandas` dataframes: 

+

61 

+

62 >>> import pandas as pd 

+

63 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

+

64 

+

65 The result is a transformed dataframe belonging to the same dataframe library. 

+

66 

+

67 >>> obj.fit_transform(X) 

+

68 A B 

+

69 0 1.0 1 

+

70 1 2.0 1 

+

71 2 3.0 1 

+

72 

+

73 Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays 

+

74 and returns a transformed NumPy array. Note that this transformer should **only** be used 

+

75 when the number of rows is small *e.g.* in real-time environment. 

+

76 

+

77 >>> obj.transform_numpy(X.to_numpy()) 

+

78 array([[1., 1.], 

+

79 [2., 1.], 

+

80 [3., 1.]]) 

+

81 """ 

+

82 

+

83 def __init__(self, columns: List[str], datatype: type): 

+

84 if not isinstance(columns, (list, np.ndarray)): 

+

85 raise TypeError("`columns` should be a list.") 

+

86 if not columns: 

+

87 raise ValueError("`columns` should not be empty.") 

+

88 if type(datatype) != type and not str(datatype).startswith("datetime"): 

+

89 raise TypeError("`datatype` should be a type.") 

+

90 self.columns = columns 

+

91 self.datatype = datatype 

+

92 self.column_names = [] 

+

93 

+

94 def fit(self, X: DataFrame, y: Series = None) -> "ConvertColumnDatatype": 

+

95 """Fit the transformer on the dataframe X. 

+

96 

+

97 Parameters 

+

98 ---------- 

+

99 X : DataFrame 

+

100 Input dataframe. 

+

101 y : Series, default None. 

+

102 Target values. 

+

103 

+

104 Returns 

+

105 ------- 

+

106 self : ConvertColumnDatatype 

+

107 Instance of itself. 

+

108 """ 

+

109 self.check_dataframe(X) 

+

110 return self 

+

111 

+

112 def transform(self, X: DataFrame, y: Series = None) -> DataFrame: 

+

113 """Transform the dataframe `X`. 

+

114 

+

115 Parameters 

+

116 ---------- 

+

117 X : DataFrame 

+

118 Input dataframe. 

+

119 

+

120 Returns 

+

121 ------- 

+

122 X : DataFrame 

+

123 Transformed dataframe. 

+

124 """ 

+

125 X[self.columns] = X[self.columns].astype(self.datatype) 

+

126 

+

127 return X 

+

128 

+

129 def transform_numpy(self, X: np.ndarray, y: Series = None) -> np.ndarray: 

+

130 """Transform the array `X`. 

+

131 

+

132 Parameters 

+

133 ---------- 

+

134 X : np.ndarray 

+

135 Input array. 

+

136 

+

137 Returns 

+

138 ------- 

+

139 X : np.ndarray 

+

140 Transformed array. 

+

141 """ 

+

142 self.check_array(X) 

+

143 if self.datatype in LIST_NUMPY_NUM_DTYPES: 

+

144 return X.astype(self.datatype) 

+

145 return X.astype(object) 

+
+ + + diff --git a/cov_html/d_d9c8a9d49d9efff0_drop_columns_py.html b/cov_html/d_d9c8a9d49d9efff0_drop_columns_py.html index 9ea63c23..88c4511e 100644 --- a/cov_html/d_d9c8a9d49d9efff0_drop_columns_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_drop_columns_py.html @@ -6,162 +6,155 @@ Coverage for gators/data_cleaning/drop_columns.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_data_cleaning import _BaseDataCleaning 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropColumns(_BaseDataCleaning): 

-

10 """Drop the columns given by the user. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 columns : List[str] 

-

15 List of columns to drop. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with `pandas` 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.data_cleaning import DropColumns 

-

23 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

24 >>> obj = DropColumns(['B']) 

-

25 >>> obj.fit_transform(X) 

-

26 A 

-

27 0 1 

-

28 1 2 

-

29 2 3 

-

30 

-

31 * fit & transform with `koalas` 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.data_cleaning import DropColumns 

-

35 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

36 >>> obj = DropColumns(['B']) 

-

37 >>> obj.fit_transform(X) 

-

38 A 

-

39 0 1 

-

40 1 2 

-

41 2 3 

-

42 

-

43 * fit with `pandas` & transform with `NumPy` 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.data_cleaning import DropColumns 

-

47 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

48 >>> obj = DropColumns(['B']) 

-

49 >>> _ = obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([[1], 

-

52 [2], 

-

53 [3]]) 

-

54 

-

55 * fit with `koalas` & transform with `NumPy` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.data_cleaning import DropColumns 

-

59 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

60 >>> obj = DropColumns(['B']) 

-

61 >>> _ = obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[1], 

-

64 [2], 

-

65 [3]]) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, columns): 

-

70 if not isinstance(columns, list): 

-

71 raise TypeError('`columns` should be a list.') 

-

72 

-

73 _BaseDataCleaning.__init__(self) 

-

74 self.columns = columns 

-

75 

-

76 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y=None) -> 'DropColumns': 

-

78 """Fit the transformer on the dataframe X. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : Union[pd.Series, ks.Series], default to None. 

-

88 Labels. 

-

89 

-

90 Returns 

-

91 ------- 

-

92 DropColumns: Instance of itself. 

-

93 """ 

-

94 self.check_dataframe(X) 

-

95 self.columns_to_keep = util.exclude_columns( 

-

96 columns=X.columns, 

-

97 excluded_columns=self.columns) 

-

98 self.idx_columns_to_keep = util.exclude_idx_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns 

-

101 ) 

-

102 return self 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_drop_datatype_columns_py.html b/cov_html/d_d9c8a9d49d9efff0_drop_datatype_columns_py.html index 767b308f..dfdda0c5 100644 --- a/cov_html/d_d9c8a9d49d9efff0_drop_datatype_columns_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_drop_datatype_columns_py.html @@ -6,160 +6,154 @@ Coverage for gators/data_cleaning/drop_datatype_columns.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_data_cleaning import _BaseDataCleaning 

-

3from ..util import util 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropDatatypeColumns(_BaseDataCleaning): 

-

10 """Drop the columns belonging to a given datatype. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 dtype : type 

-

15 Colum datatype to drop. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with `pandas` 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.data_cleaning import DropDatatypeColumns 

-

23 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

24 >>> obj = DropDatatypeColumns(float) 

-

25 >>> obj.fit_transform(X) 

-

26 A 

-

27 0 1 

-

28 1 2 

-

29 2 3 

-

30 

-

31 * fit & transform with `koalas` 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.data_cleaning import DropDatatypeColumns 

-

35 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

36 >>> obj = DropDatatypeColumns(float) 

-

37 >>> obj.fit_transform(X) 

-

38 A 

-

39 0 1 

-

40 1 2 

-

41 2 3 

-

42 

-

43 * fit with `pandas` & transform with `NumPy` 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.data_cleaning import DropDatatypeColumns 

-

47 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

48 >>> obj = DropDatatypeColumns(float) 

-

49 >>> _ = obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([[1.], 

-

52 [2.], 

-

53 [3.]]) 

-

54 

-

55 * fit with `koalas` & transform with `NumPy` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.data_cleaning import DropDatatypeColumns 

-

59 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

60 >>> obj = DropDatatypeColumns(float) 

-

61 >>> _ = obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[1.], 

-

64 [2.], 

-

65 [3.]]) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, dtype: type): 

-

70 if not isinstance(dtype, type): 

-

71 raise TypeError('`dtype` should be a type.') 

-

72 _BaseDataCleaning.__init__(self) 

-

73 self.dtype = dtype 

-

74 

-

75 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

76 y=None) -> 'DropDatatypeColumns': 

-

77 """Fit the transformer on the dataframe X. 

-

78 

-

79 Get the list of column names to remove and the array of 

-

80 indices to be kept. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 X : Union[pd.DataFrame, ks.DataFrame] 

-

85 Input dataframe. 

-

86 y : None 

-

87 None 

-

88 Returns 

-

89 ------- 

-

90 DropDatatypeColumns: Instance of itself. 

-

91 """ 

-

92 self.check_dataframe(X) 

-

93 self.columns = util.get_datatype_columns(X, self.dtype) 

-

94 self.columns_to_keep = util.exclude_columns( 

-

95 columns=X.columns, 

-

96 excluded_columns=self.columns) 

-

97 self.idx_columns_to_keep = util.exclude_idx_columns( 

-

98 columns=X.columns, 

-

99 excluded_columns=self.columns) 

-

100 return self 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_drop_high_cardinality_py.html b/cov_html/d_d9c8a9d49d9efff0_drop_high_cardinality_py.html index e56feea1..bf2514e0 100644 --- a/cov_html/d_d9c8a9d49d9efff0_drop_high_cardinality_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_drop_high_cardinality_py.html @@ -6,197 +6,187 @@ Coverage for gators/data_cleaning/drop_high_cardinality.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_data_cleaning import _BaseDataCleaning 

-

3from ..util import util 

-

4from typing import List, Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropHighCardinality(_BaseDataCleaning): 

-

10 """Drop the categorical columns having a large cardinality. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 max_categories : int 

-

15 Maximum number of categories allowed. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with `pandas` 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.data_cleaning import DropHighCardinality 

-

23 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) 

-

24 >>> obj = DropHighCardinality(max_categories=2) 

-

25 >>> obj.fit_transform(X) 

-

26 B 

-

27 0 d 

-

28 1 d 

-

29 2 e 

-

30 

-

31 * fit & transform with `koalas` 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.data_cleaning import DropHighCardinality 

-

35 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) 

-

36 >>> obj = DropHighCardinality(max_categories=2) 

-

37 >>> obj.fit_transform(X) 

-

38 B 

-

39 0 d 

-

40 1 d 

-

41 2 e 

-

42 

-

43 * fit with `pandas` & transform with `NumPy` 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.data_cleaning import DropHighCardinality 

-

47 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) 

-

48 >>> obj = DropHighCardinality(max_categories=2) 

-

49 >>> _ = obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([['d'], 

-

52 ['d'], 

-

53 ['e']], dtype=object) 

-

54 

-

55 * fit with `koalas` & transform with `NumPy` 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.data_cleaning import DropHighCardinality 

-

59 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) 

-

60 >>> obj = DropHighCardinality(max_categories=2) 

-

61 >>> _ = obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([['d'], 

-

64 ['d'], 

-

65 ['e']], dtype=object) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, max_categories: int): 

-

70 if not isinstance(max_categories, int): 

-

71 raise TypeError('`max_categories` should be an int.') 

-

72 _BaseDataCleaning.__init__(self) 

-

73 self.max_categories = max_categories 

-

74 

-

75 def fit(self, 

-

76 X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y: Union[pd.Series, ks.Series] = None) -> 'DropHighCardinality': 

-

78 """Fit the transformer on the dataframe `X`. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : None 

-

88 None 

-

89 

-

90 Returns 

-

91 ------- 

-

92 DropHighCardinality: Instance of itself. 

-

93 """ 

-

94 self.check_dataframe(X) 

-

95 object_columns = util.get_datatype_columns(X, object) 

-

96 self.columns = self.get_columns_to_drop( 

-

97 X=X[object_columns], 

-

98 max_categories=self.max_categories 

-

99 ) 

-

100 self.columns_to_keep = util.exclude_columns( 

-

101 columns=X.columns, 

-

102 excluded_columns=self.columns, 

-

103 ) 

-

104 self.idx_columns_to_keep = self.get_idx_columns_to_keep( 

-

105 columns=X.columns, 

-

106 columns_to_drop=self.columns, 

-

107 ) 

-

108 return self 

-

109 

-

110 @ staticmethod 

-

111 def get_columns_to_drop( 

-

112 X: Union[pd.DataFrame, ks.DataFrame], 

-

113 max_categories: int) -> List[str]: 

-

114 """Get the column names to drop. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X_nunique : pd.DataFrame 

-

119 Input dataframe. 

-

120 max_categories : int 

-

121 Maximum number of categories allowed. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 List[str] 

-

126 List of column names to drop. 

-

127 """ 

-

128 object_columns = util.get_datatype_columns(X, object) 

-

129 if not object_columns: 

-

130 return [] 

-

131 if isinstance(X, pd.DataFrame): 

-

132 X_nunique = X[object_columns].nunique() 

-

133 else: 

-

134 X_nunique = X[object_columns].nunique(approx=True) 

-

135 mask_columns = X_nunique > max_categories 

-

136 columns_to_drop = X_nunique[mask_columns].index 

-

137 return list(columns_to_drop.to_numpy()) 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_drop_high_nan_ratio_py.html b/cov_html/d_d9c8a9d49d9efff0_drop_high_nan_ratio_py.html index 9591b529..87147a06 100644 --- a/cov_html/d_d9c8a9d49d9efff0_drop_high_nan_ratio_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_drop_high_nan_ratio_py.html @@ -6,196 +6,182 @@ Coverage for gators/data_cleaning/drop_high_nan_ratio.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ..util import util 

-

6from ._base_data_cleaning import _BaseDataCleaning 

-

7 

-

8 

-

9class DropHighNaNRatio(_BaseDataCleaning): 

-

10 """Drop the columns having a large NaN values ratio. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 max_ratio : float 

-

15 Max nan ratio allowed. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * fit & transform with `pandas` 

-

21 

-

22 >>> import numpy as np 

-

23 >>> import pandas as pd 

-

24 >>> from gators.data_cleaning import DropHighNaNRatio 

-

25 >>> X = pd.DataFrame( 

-

26 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

27 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

28 >>> obj.fit_transform(X) 

-

29 A 

-

30 0 1 

-

31 1 2 

-

32 2 3 

-

33 

-

34 * fit & transform with `koalas` 

-

35 

-

36 >>> import numpy as np 

-

37 >>> import databricks.koalas as ks 

-

38 >>> from gators.data_cleaning import DropHighNaNRatio 

-

39 >>> X = ks.DataFrame( 

-

40 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

41 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

42 >>> obj.fit_transform(X) 

-

43 A 

-

44 0 1 

-

45 1 2 

-

46 2 3 

-

47 

-

48 * fit with `pandas` & transform with `NumPy` 

-

49 

-

50 >>> import numpy as np 

-

51 >>> import pandas as pd 

-

52 >>> from gators.data_cleaning import DropHighNaNRatio 

-

53 >>> X = pd.DataFrame( 

-

54 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

55 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

56 >>> _ = obj.fit(X) 

-

57 >>> obj.transform_numpy(X.to_numpy()) 

-

58 array([[1], 

-

59 [2], 

-

60 [3]], dtype=object) 

-

61 

-

62 * fit with `koalas` & transform with `NumPy` 

-

63 

-

64 >>> import numpy as np 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.data_cleaning import DropHighNaNRatio 

-

67 >>> X = ks.DataFrame( 

-

68 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

69 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

70 >>> _ = obj.fit(X) 

-

71 >>> obj.transform_numpy(X.to_numpy()) 

-

72 array([[1], 

-

73 [2], 

-

74 [3]], dtype=object) 

-

75 

-

76 """ 

-

77 

-

78 def __init__(self, max_ratio: float): 

-

79 if not isinstance(max_ratio, float): 

-

80 raise TypeError('`max_ratio` should be a float.') 

-

81 _BaseDataCleaning.__init__(self) 

-

82 self.max_ratio = max_ratio 

-

83 

-

84 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

85 y=None) -> 'DropHighNaNRatio': 

-

86 """Fit the transformer on the dataframe X. 

-

87 

-

88 Get the list of column names to remove and the array of 

-

89 indices to be kept. 

-

90 

-

91 Parameters 

-

92 ---------- 

-

93 X : Union[pd.DataFrame, ks.DataFrame] 

-

94 Input dataframe. 

-

95 y : None 

-

96 None 

-

97 

-

98 Returns 

-

99 ------- 

-

100 DropHighNaNRatio: Instance of itself. 

-

101 """ 

-

102 self.check_dataframe(X) 

-

103 self.columns = self.get_columns_to_drop( 

-

104 X=X, 

-

105 max_ratio=self.max_ratio) 

-

106 self.columns_to_keep = util.exclude_columns( 

-

107 columns=list(X.columns), 

-

108 excluded_columns=self.columns) 

-

109 self.idx_columns_to_keep = self.get_idx_columns_to_keep( 

-

110 columns=X.columns, 

-

111 columns_to_drop=self.columns) 

-

112 return self 

-

113 

-

114 @staticmethod 

-

115 def get_columns_to_drop( 

-

116 X: Union[pd.DataFrame, ks.DataFrame], 

-

117 max_ratio: float) -> List[str]: 

-

118 """Get the list of column names to drop. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 X : pd.DataFrame 

-

123 Input dataset. 

-

124 max_ratio : float 

-

125 Max nan ratio allowed. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 List[str] 

-

130 List of column names to drop. 

-

131 """ 

-

132 mask_columns = X.isnull().mean() > max_ratio 

-

133 columns_to_drop = mask_columns[mask_columns].index 

-

134 if isinstance(columns_to_drop, ks.indexes.Index): 

-

135 columns_to_drop = columns_to_drop.to_pandas() 

-

136 return columns_to_drop 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_drop_low_cardinality_py.html b/cov_html/d_d9c8a9d49d9efff0_drop_low_cardinality_py.html index 63352b18..162251bb 100644 --- a/cov_html/d_d9c8a9d49d9efff0_drop_low_cardinality_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_drop_low_cardinality_py.html @@ -6,195 +6,182 @@ Coverage for gators/data_cleaning/drop_low_cardinality.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_data_cleaning import _BaseDataCleaning 

-

4from typing import List, Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropLowCardinality(_BaseDataCleaning): 

-

10 """Drop the catgorical columns having a low cardinality. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 min_categories : int 

-

15 Min categories allowed. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * fit & transform with `pandas` 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.data_cleaning import DropLowCardinality 

-

24 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) 

-

25 >>> obj = DropLowCardinality(min_categories=2) 

-

26 >>> obj.fit_transform(X) 

-

27 A 

-

28 0 a 

-

29 1 b 

-

30 2 c 

-

31 

-

32 * fit & transform with `koalas` 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.data_cleaning import DropLowCardinality 

-

36 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) 

-

37 >>> obj = DropLowCardinality(min_categories=2) 

-

38 >>> obj.fit_transform(X) 

-

39 A 

-

40 0 a 

-

41 1 b 

-

42 2 c 

-

43 

-

44 * fit with `pandas` & transform with `NumPy` 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.data_cleaning import DropLowCardinality 

-

48 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) 

-

49 >>> obj = DropLowCardinality(min_categories=2) 

-

50 >>> _ = obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([['a'], 

-

53 ['b'], 

-

54 ['c']], dtype=object) 

-

55 

-

56 * fit with `koalas` & transform with `NumPy` 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.data_cleaning import DropLowCardinality 

-

60 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) 

-

61 >>> obj = DropLowCardinality(min_categories=2) 

-

62 >>> _ = obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([['a'], 

-

65 ['b'], 

-

66 ['c']], dtype=object) 

-

67 

-

68 """ 

-

69 

-

70 def __init__(self, min_categories: int): 

-

71 if not isinstance(min_categories, int): 

-

72 raise TypeError('`min_categories` should be an int.') 

-

73 _BaseDataCleaning.__init__(self) 

-

74 self.min_categories: int = min_categories 

-

75 

-

76 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y=None) -> 'DropLowCardinality': 

-

78 """Fit the transformer on the dataframe X. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : None 

-

88 None 

-

89 Returns 

-

90 ------- 

-

91 DropLowCardinality: Instance of itself. 

-

92 """ 

-

93 self.check_dataframe(X) 

-

94 self.columns = self.get_columns_to_drop( 

-

95 X=X, 

-

96 min_categories=self.min_categories 

-

97 ) 

-

98 self.columns_to_keep = util.exclude_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns, 

-

101 ) 

-

102 self.idx_columns_to_keep = self.get_idx_columns_to_keep( 

-

103 columns=X.columns, 

-

104 columns_to_drop=self.columns) 

-

105 return self 

-

106 

-

107 @staticmethod 

-

108 def get_columns_to_drop( 

-

109 X: Union[pd.DataFrame, ks.DataFrame], 

-

110 min_categories: float) -> List[str]: 

-

111 """Get the list of column names to remove. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : pd.DataFrame 

-

116 Input dataset. 

-

117 min_categories : int 

-

118 Min categories allowed. 

-

119 

-

120 Returns 

-

121 ------- 

-

122 List[str] 

-

123 List of column names to drop. 

-

124 """ 

-

125 object_columns = util.get_datatype_columns(X, 'object') 

-

126 if not object_columns: 

-

127 return [] 

-

128 if isinstance(X, pd.DataFrame): 

-

129 X_nunique = X[object_columns].nunique() 

-

130 else: 

-

131 X_nunique = X[object_columns].nunique().to_pandas() 

-

132 X_nunique = X[object_columns].nunique(approx=True).to_pandas() 

-

133 mask_columns = X_nunique < min_categories 

-

134 columns_to_drop = mask_columns[mask_columns].index 

-

135 return list(columns_to_drop.to_numpy()) 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_keep_columns_py.html b/cov_html/d_d9c8a9d49d9efff0_keep_columns_py.html index 83cc8f68..e20a1fb4 100644 --- a/cov_html/d_d9c8a9d49d9efff0_keep_columns_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_keep_columns_py.html @@ -6,162 +6,157 @@ Coverage for gators/data_cleaning/keep_columns.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_data_cleaning import _BaseDataCleaning 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class KeepColumns(_BaseDataCleaning): 

-

10 """Drop the columns which are not given by the user. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 columns_to_keep : List[str] 

-

15 List of columns. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * fit & transform with `pandas` 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.data_cleaning import KeepColumns 

-

24 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

25 >>> obj = KeepColumns(['A']) 

-

26 >>> obj.fit_transform(X) 

-

27 A 

-

28 0 1 

-

29 1 2 

-

30 2 3 

-

31 

-

32 * fit & transform with `koalas` 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.data_cleaning import KeepColumns 

-

36 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

37 >>> obj = KeepColumns(['A']) 

-

38 >>> obj.fit_transform(X) 

-

39 A 

-

40 0 1 

-

41 1 2 

-

42 2 3 

-

43 

-

44 * fit with `pandas` & transform with `NumPy` 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.data_cleaning import KeepColumns 

-

48 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

49 >>> obj = KeepColumns(['A']) 

-

50 >>> _ = obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([[1], 

-

53 [2], 

-

54 [3]]) 

-

55 

-

56 * fit with `koalas` & transform with `NumPy` 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.data_cleaning import KeepColumns 

-

60 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

61 >>> obj = KeepColumns(['A']) 

-

62 >>> _ = obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([[1], 

-

65 [2], 

-

66 [3]]) 

-

67 

-

68 """ 

-

69 

-

70 def __init__(self, columns_to_keep): 

-

71 if not isinstance(columns_to_keep, list): 

-

72 raise TypeError('`columns_to_keep` should be a list.') 

-

73 _BaseDataCleaning.__init__(self) 

-

74 self.columns_to_keep = columns_to_keep 

-

75 

-

76 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y=None) -> 'KeepColumns': 

-

78 """Fit the transformer on the dataframe X. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : Union[pd.Series, ks.Series], default to None. 

-

88 Labels. 

-

89 

-

90 Returns 

-

91 ------- 

-

92 KeepColumns: Instance of itself. 

-

93 """ 

-

94 self.check_dataframe(X) 

-

95 self.columns = util.exclude_columns( 

-

96 columns=X.columns, 

-

97 excluded_columns=self.columns_to_keep) 

-

98 self.idx_columns_to_keep = util.exclude_idx_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns 

-

101 ) 

-

102 return self 

-
- + diff --git a/cov_html/d_d9c8a9d49d9efff0_rename_columns_py.html b/cov_html/d_d9c8a9d49d9efff0_rename_columns_py.html new file mode 100644 index 00000000..f5067434 --- /dev/null +++ b/cov_html/d_d9c8a9d49d9efff0_rename_columns_py.html @@ -0,0 +1,195 @@ + + + + + + Coverage for gators/data_cleaning/rename_columns.py: 100% + + + + + +
+
+

+ Coverage for gators/data_cleaning/rename_columns.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 21 statements   + + + +

+
+ + + + +
+
+
+
+

1# License: Apache-2.0 

+

2import numpy as np 

+

3 

+

4from typing import Dict 

+

5 

+

6from ..transformers.transformer import Transformer 

+

7from ..util import util 

+

8 

+

9from gators import DataFrame, Series 

+

10 

+

11 

+

12class RenameColumns(Transformer): 

+

13 """Rename the columns. 

+

14 

+

15 Parameters 

+

16 ---------- 

+

17 to_rename_dict : Dict[str, Dict[str, str]] 

+

18 The dictionary keys are the columns and its values 

+

19 are the new columns. 

+

20 

+

21 Examples 

+

22 --------- 

+

23 Imports and initialization: 

+

24 

+

25 >>> from gators.data_cleaning import RenameColumns 

+

26 >>> to_rename_dict = {'A': 'A_f', 'B': 'B_f'} 

+

27 >>> obj = RenameColumns(to_rename_dict=to_rename_dict) 

+

28 

+

29 The `fit`, `transform`, and `fit_transform` methods accept: 

+

30 

+

31 * `dask` dataframes: 

+

32 

+

33 >>> import dask.dataframe as dd 

+

34 >>> import pandas as pd 

+

35 >>> X = dd.from_pandas(pd.DataFrame( 

+

36 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}), npartitions=1) 

+

37 

+

38 * `koalas` dataframes: 

+

39 

+

40 >>> import databricks.koalas as ks 

+

41 >>> X = ks.DataFrame( 

+

42 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) 

+

43 

+

44 * and `pandas` dataframes: 

+

45 

+

46 >>> import pandas as pd 

+

47 >>> X = pd.DataFrame( 

+

48 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) 

+

49 

+

50 The result is a transformed dataframe belonging to the same dataframe library. 

+

51 

+

52 >>> obj.fit_transform(X) 

+

53 A_f B_f C 

+

54 0 a d 1 

+

55 1 b e 2 

+

56 2 c f 3 

+

57 

+

58 >>> X = pd.DataFrame( 

+

59 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) 

+

60 >>> _ = obj.fit(X) 

+

61 >>> obj.transform_numpy(X.to_numpy()) 

+

62 array([['a', 'd', 1], 

+

63 ['b', 'e', 2], 

+

64 ['c', 'f', 3]], dtype=object) 

+

65 """ 

+

66 

+

67 def __init__(self, to_rename_dict: Dict[str, Dict[str, str]]): 

+

68 if not isinstance(to_rename_dict, dict): 

+

69 raise TypeError("`to_rename_dict` should be a dict.") 

+

70 Transformer.__init__(self) 

+

71 self.to_rename_dict = to_rename_dict 

+

72 self.columns = list(to_rename_dict.keys()) 

+

73 

+

74 def fit(self, X: DataFrame, y: Series = None) -> "Rename": 

+

75 """Fit the transformer on the dataframe X. 

+

76 

+

77 Get the list of column names to remove and the array of 

+

78 indices to be kept. 

+

79 

+

80 Parameters 

+

81 ---------- 

+

82 X : DataFrame 

+

83 Input dataframe. 

+

84 y : Series, default None. 

+

85 Target values. 

+

86 

+

87 Returns 

+

88 ------- 

+

89 self : Rename 

+

90 Instance of itself. 

+

91 """ 

+

92 self.check_dataframe(X) 

+

93 return self 

+

94 

+

95 def transform(self, X: DataFrame) -> DataFrame: 

+

96 """Transform the dataframe `X`. 

+

97 

+

98 Parameters 

+

99 ---------- 

+

100 X : DataFrame. 

+

101 Input dataframe. 

+

102 

+

103 Returns 

+

104 ------- 

+

105 X : DataFrame 

+

106 Transformed dataframe. 

+

107 """ 

+

108 self.check_dataframe(X) 

+

109 return X.rename(columns=self.to_rename_dict) 

+

110 

+

111 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

+

112 """Transform the array `X`. 

+

113 

+

114 Parameters 

+

115 ---------- 

+

116 X : np.ndarray 

+

117 Input array. 

+

118 

+

119 Returns 

+

120 ------- 

+

121 X : np.ndarray 

+

122 Transformed array. 

+

123 """ 

+

124 self.check_array(X) 

+

125 return X 

+
+ + + diff --git a/cov_html/d_d9c8a9d49d9efff0_replace_py.html b/cov_html/d_d9c8a9d49d9efff0_replace_py.html index 00108c90..3a6ae921 100644 --- a/cov_html/d_d9c8a9d49d9efff0_replace_py.html +++ b/cov_html/d_d9c8a9d49d9efff0_replace_py.html @@ -6,226 +6,241 @@ Coverage for gators/data_cleaning/replace.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ..transformers.transformer import Transformer 

-

4from typing import Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from data_cleaning import replace 

-

9 

-

10 

-

11class Replace(Transformer): 

-

12 """Replace the categorical values by the ones given by the user. 

-

13 

-

14 The transformer only accepts categorical columns. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 to_replace_dict: Dict[str, Dict[str, str]] 

-

19 The dictionary keys are the columns and the dictionary values 

-

20 are the `to_replace` dictionary. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 * fit & transform with `pandas` 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.data_cleaning import Replace 

-

28 >>> X = pd.DataFrame( 

-

29 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

30 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

31 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

32 >>> obj.fit_transform(X) 

-

33 A B C 

-

34 0 X Y 1 

-

35 1 Z e 2 

-

36 2 c f 3 

-

37 

-

38 * fit & transform with `koalas` 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.data_cleaning import Replace 

-

42 >>> X = ks.DataFrame( 

-

43 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

44 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

45 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

46 >>> obj.fit_transform(X) 

-

47 A B C 

-

48 0 X Y 1 

-

49 1 Z e 2 

-

50 2 c f 3 

-

51 

-

52 * fit with `pandas` & transform with `NumPy` 

-

53 

-

54 >>> import pandas as pd 

-

55 >>> from gators.data_cleaning import Replace 

-

56 >>> X = pd.DataFrame( 

-

57 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

58 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

59 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

60 >>> _ = obj.fit(X) 

-

61 >>> obj.transform_numpy(X.to_numpy()) 

-

62 array([['X', 'Y', 1], 

-

63 ['Z', 'e', 2], 

-

64 ['c', 'f', 3]], dtype=object) 

-

65 

-

66 * fit with `koalas` & transform with `NumPy` 

-

67 

-

68 >>> import databricks.koalas as ks 

-

69 >>> from gators.data_cleaning import Replace 

-

70 >>> X = ks.DataFrame( 

-

71 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

72 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

73 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

74 >>> _ = obj.fit(X) 

-

75 >>> obj.transform_numpy(X.to_numpy()) 

-

76 array([['X', 'Y', 1], 

-

77 ['Z', 'e', 2], 

-

78 ['c', 'f', 3]], dtype=object) 

-

79 

-

80 

-

81 """ 

-

82 

-

83 def __init__(self, to_replace_dict: Dict[str, Dict[str, str]]): 

-

84 if not isinstance(to_replace_dict, dict): 

-

85 raise TypeError('`to_replace_dict` should be a dict.') 

-

86 Transformer.__init__(self) 

-

87 self.to_replace_dict = to_replace_dict 

-

88 self.columns = list(to_replace_dict.keys()) 

-

89 n_cols = len(self.columns) 

-

90 n_rows = max([len(v) for v in self.to_replace_dict.values()]) 

-

91 self.to_replace_np_keys = np.empty((n_cols, n_rows), object) 

-

92 self.to_replace_np_vals = np.empty((n_cols, n_rows), object) 

-

93 self.n_elements_vec = np.empty(n_cols, int) 

-

94 for i, col in enumerate(self.to_replace_dict): 

-

95 n_elements = len(self.to_replace_dict[col]) 

-

96 self.n_elements_vec[i] = n_elements 

-

97 self.to_replace_np_keys[i, :n_elements] = list( 

-

98 self.to_replace_dict[col].keys())[:n_elements] 

-

99 self.to_replace_np_vals[i, :n_elements] = list( 

-

100 self.to_replace_dict[col].values())[:n_elements] 

-

101 

-

102 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

103 y=None) -> 'Replace': 

-

104 """Fit the transformer on the dataframe X. 

-

105 

-

106 Get the list of column names to remove and the array of 

-

107 indices to be kept. 

-

108 

-

109 Parameters 

-

110 ---------- 

-

111 X : Union[pd.DataFrame, ks.DataFrame] 

-

112 Input dataframe. 

-

113 y : Union[pd.Series, ks.Series], default to None. 

-

114 Labels. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 Replace: Instance of itself. 

-

119 """ 

-

120 self.check_dataframe(X) 

-

121 self.check_nans(X, self.columns) 

-

122 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

123 return self 

-

124 

-

125 def transform(self, X: Union[pd.DataFrame, ks.DataFrame] 

-

126 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

127 """Transform the dataframe `X`. 

-

128 

-

129 Parameters 

-

130 ---------- 

-

131 X : Union[pd.DataFrame, ks.DataFrame]. 

-

132 Input dataframe. 

-

133 

-

134 Returns 

-

135 ------- 

-

136 Union[pd.DataFrame, ks.DataFrame] 

-

137 Transformed dataframe. 

-

138 """ 

-

139 self.check_dataframe(X) 

-

140 

-

141 def f(x, to_replace_dict, columns): 

-

142 name = x.name 

-

143 if name not in columns: 

-

144 return x 

-

145 return x.replace(to_replace_dict[name]) 

-

146 return X.apply(f, args=(self.to_replace_dict, self.columns)) 

-

147 

-

148 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

149 """Transform the NumPy array `X`. 

-

150 

-

151 Parameters 

-

152 ---------- 

-

153 X : np.ndarray 

-

154 Input array. 

-

155 

-

156 Returns 

-

157 ------- 

-

158 np.ndarray 

-

159 Transformed array. 

-

160 """ 

-

161 self.check_array(X) 

-

162 return replace( 

-

163 X, self.idx_columns, 

-

164 self.to_replace_np_keys, 

-

165 self.to_replace_np_vals, 

-

166 self.n_elements_vec) 

-
- + diff --git a/cov_html/d_e907b401e10b8f1d_convert_column_datatype_py.html b/cov_html/d_e907b401e10b8f1d_convert_column_datatype_py.html deleted file mode 100644 index 371331b3..00000000 --- a/cov_html/d_e907b401e10b8f1d_convert_column_datatype_py.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - Coverage for gators/converter/convert_column_datatype.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers import Transformer 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8LIST_NUMPY_NUM_DTYPES = [ 

-

9 bool, 

-

10 int, 

-

11 'np.int8', 

-

12 'np.int16', 

-

13 'np.int32', 

-

14 'np.int64', 

-

15 'np.uint8', 

-

16 'np.uint16', 

-

17 'np.uint32', 

-

18 'np.uint64', 

-

19 float, 

-

20 'np.float16', 

-

21 'np.float32', 

-

22 'np.float64', 

-

23] 

-

24 

-

25 

-

26class ConvertColumnDatatype(Transformer): 

-

27 """Set the datatype of the selected columns to a given datatype. 

-

28 

-

29 Parameters 

-

30 ---------- 

-

31 columns : List[str] 

-

32 List of columns. 

-

33 datatype: type 

-

34 Datatype to use. 

-

35 

-

36 Examples 

-

37 -------- 

-

38 

-

39 * fit & transform with `pandas` 

-

40 

-

41 >>> import pandas as pd 

-

42 >>> from gators.converter import ConvertColumnDatatype 

-

43 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

44 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

45 >>> obj.fit_transform(X) 

-

46 A B 

-

47 0 1.0 1 

-

48 1 2.0 1 

-

49 2 3.0 1 

-

50 

-

51 * fit & transform with `koalas` 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> from gators.converter import ConvertColumnDatatype 

-

55 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

56 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

57 >>> obj.fit_transform(X) 

-

58 A B 

-

59 0 1.0 1 

-

60 1 2.0 1 

-

61 2 3.0 1 

-

62 

-

63 * fit with `pandas` & transform with `NumPy` 

-

64 

-

65 >>> import pandas as pd 

-

66 >>> from gators.converter import ConvertColumnDatatype 

-

67 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

68 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[1., 1.], 

-

72 [2., 1.], 

-

73 [3., 1.]]) 

-

74 

-

75 * fit with `koalas` & transform with `NumPy` 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.converter import ConvertColumnDatatype 

-

79 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

80 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

81 >>> _ = obj.fit(X) 

-

82 >>> obj.transform_numpy(X.to_numpy()) 

-

83 array([[1., 1.], 

-

84 [2., 1.], 

-

85 [3., 1.]]) 

-

86 

-

87 """ 

-

88 

-

89 def __init__(self, columns: List[str], datatype: type): 

-

90 if not isinstance(columns, list): 

-

91 raise TypeError('`columns` should be a list.') 

-

92 if not columns: 

-

93 raise ValueError('`columns` should not be empty.') 

-

94 if type(datatype) != type and not str(datatype).startswith('datetime'): 

-

95 raise TypeError('`datatype` should be a type.') 

-

96 self.columns = columns 

-

97 self.datatype = datatype 

-

98 

-

99 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

100 y=None) -> 'ConvertColumnDatatype': 

-

101 """Fit the transformer on the dataframe X. 

-

102 

-

103 Parameters 

-

104 ---------- 

-

105 X : Union[pd.DataFrame, ks.DataFrame] 

-

106 Input dataframe. 

-

107 y : Union[pd.Series, ks.Series], default to None. 

-

108 Labels. 

-

109 

-

110 Returns 

-

111 ------- 

-

112 SetDatatype: Instance of itself. 

-

113 """ 

-

114 self.check_dataframe(X) 

-

115 return self 

-

116 

-

117 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

118 y=None) -> Union[pd.DataFrame, ks.DataFrame]: 

-

119 """Transform the dataframe `X`. 

-

120 

-

121 Parameters 

-

122 ---------- 

-

123 X : Union[pd.DataFrame, ks.DataFrame] 

-

124 Input dataframe. 

-

125 

-

126 Returns 

-

127 ------- 

-

128 Union[pd.DataFrame, ks.DataFrame] 

-

129 Transformed dataframe. 

-

130 """ 

-

131 X[self.columns] = X[self.columns].astype(self.datatype) 

-

132 return X 

-

133 

-

134 def transform_numpy(self, X: np.ndarray, 

-

135 y=None) -> np.ndarray: 

-

136 """Transform the array `X`. 

-

137 

-

138 Parameters 

-

139 ---------- 

-

140 X : np.ndarray 

-

141 Input array. 

-

142 

-

143 Returns 

-

144 ------- 

-

145 np.ndarray 

-

146 Transformed array. 

-

147 """ 

-

148 self.check_array(X) 

-

149 if self.datatype in LIST_NUMPY_NUM_DTYPES: 

-

150 return X.astype(self.datatype) 

-

151 return X.astype(object) 

-
- - - diff --git a/cov_html/d_e907b401e10b8f1d_koalas_to_pandas_py.html b/cov_html/d_e907b401e10b8f1d_koalas_to_pandas_py.html deleted file mode 100644 index 1e73f743..00000000 --- a/cov_html/d_e907b401e10b8f1d_koalas_to_pandas_py.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - Coverage for gators/converter/koalas_to_pandas.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers.transformer_xy import TransformerXY 

-

2from typing import Tuple, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class KoalasToPandas(TransformerXY): 

-

9 """Convert koalas dataframe and series to a pandas dataframe and series. 

-

10 

-

11 Examples 

-

12 --------- 

-

13 * transform with pandas 

-

14 

-

15 >>> import databricks.koalas as ks 

-

16 >>> from gators.converter import KoalasToPandas 

-

17 >>> X = ks.DataFrame({ 

-

18 ... 'q': {0: 0.0, 1: 3.0, 2: 6.0}, 

-

19 ... 'w': {0: 1.0, 1: 4.0, 2: 7.0}, 

-

20 ... 'e': {0: 2.0, 1: 5.0, 2: 8.0}}) 

-

21 >>> y = ks.Series([0, 0, 1], name='TARGET') 

-

22 >>> obj = KoalasToPandas() 

-

23 >>> X, y = obj.transform(X, y) 

-

24 >>> X 

-

25 q w e 

-

26 0 0.0 1.0 2.0 

-

27 1 3.0 4.0 5.0 

-

28 2 6.0 7.0 8.0 

-

29 >>> y 

-

30 0 0 

-

31 1 0 

-

32 2 1 

-

33 Name: TARGET, dtype: int64 

-

34 """ 

-

35 

-

36 def __init__(self): 

-

37 TransformerXY.__init__(self) 

-

38 

-

39 def transform(self, 

-

40 X: Union[pd.DataFrame, ks.DataFrame], 

-

41 y: Union[pd.Series, ks.Series], 

-

42 ) -> Tuple[np.ndarray, np.ndarray]: 

-

43 """Fit the transformer on the dataframe `X`. 

-

44 

-

45 Parameters 

-

46 ---------- 

-

47 X : Union[pd.DataFrame, ks.DataFrame]. 

-

48 Input dataframe. 

-

49 y : [pd.Series, ks.Series]: 

-

50 Target values. 

-

51 

-

52 Returns 

-

53 ------- 

-

54 X : pd.DataFrame 

-

55 Dataframe. 

-

56 y : np.ndarray 

-

57 Target values. 

-

58 """ 

-

59 if not isinstance(X, ks.DataFrame): 

-

60 raise TypeError('`X` should be a koalas dataframe') 

-

61 self.check_dataframe(X) 

-

62 self.check_y(X, y) 

-

63 return X.to_pandas(), y.to_pandas() 

-
- - - diff --git a/cov_html/d_e907b401e10b8f1d_to_numpy_py.html b/cov_html/d_e907b401e10b8f1d_to_numpy_py.html index b504e22d..50031595 100644 --- a/cov_html/d_e907b401e10b8f1d_to_numpy_py.html +++ b/cov_html/d_e907b401e10b8f1d_to_numpy_py.html @@ -6,136 +6,153 @@ Coverage for gators/converter/to_numpy.py: 100% - - - - - + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers.transformer_xy import TransformerXY 

-

2from typing import Tuple, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class ToNumpy(TransformerXY): 

-

9 """Convert dataframe and series to NumPy arrays. 

-

10 

-

11 Examples 

-

12 --------- 

-

13 * transform with pandas 

-

14 

-

15 >>> import pandas as pd 

-

16 >>> from gators.converter import ToNumpy 

-

17 >>> X = pd.DataFrame({ 

-

18 ... 'q': [0.0, 3.0, 6.0], 

-

19 ... 'w': [1.0, 4.0, 7.0], 

-

20 ... 'e': [2.0, 5.0, 8.0]}) 

-

21 >>> y = pd.Series([0, 0, 1], name='TARGET') 

-

22 >>> obj = ToNumpy() 

-

23 >>> X, y = obj.transform(X, y) 

-

24 >>> X 

-

25 array([[0., 1., 2.], 

-

26 [3., 4., 5.], 

-

27 [6., 7., 8.]]) 

-

28 >>> y 

-

29 array([0, 0, 1]) 

-

30 

-

31 * transform with `koalas` 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.converter.to_numpy import ToNumpy 

-

35 >>> X = ks.DataFrame({ 

-

36 ... 'q': [0.0, 3.0, 6.0], 

-

37 ... 'w': [1.0, 4.0, 7.0], 

-

38 ... 'e': [2.0, 5.0, 8.0]}) 

-

39 >>> y = ks.Series([0, 0, 1], name='TARGET') 

-

40 >>> obj = ToNumpy() 

-

41 >>> X, y = obj.transform(X, y) 

-

42 >>> X  

-

43 array([[0., 1., 2.], 

-

44 [3., 4., 5.], 

-

45 [6., 7., 8.]]) 

-

46 >>> y 

-

47 array([0, 0, 1]) 

-

48 

-

49 """ 

-

50 

-

51 def __init__(self): 

-

52 TransformerXY.__init__(self) 

-

53 

-

54 def transform(self, 

-

55 X: Union[pd.DataFrame, ks.DataFrame], 

-

56 y: Union[pd.Series, ks.Series], 

-

57 ) -> Tuple[np.ndarray, np.ndarray]: 

-

58 """Fit the transformer on the dataframe `X`. 

-

59 

-

60 Parameters 

-

61 ---------- 

-

62 X : Union[pd.DataFrame, ks.DataFrame]. 

-

63 Dataframe. 

-

64 y : [pd.Series, ks.Series]: 

-

65 Target values. 

-

66 

-

67 Returns 

-

68 ------- 

-

69 X : np.ndarray 

-

70 Array. 

-

71 y : np.ndarray 

-

72 Target values. 

-

73 """ 

-

74 self.check_dataframe(X) 

-

75 self.check_y(X, y) 

-

76 return X.to_numpy(), y.to_numpy() 

-
- + diff --git a/cov_html/d_e907b401e10b8f1d_to_pandas_py.html b/cov_html/d_e907b401e10b8f1d_to_pandas_py.html new file mode 100644 index 00000000..ba9f8062 --- /dev/null +++ b/cov_html/d_e907b401e10b8f1d_to_pandas_py.html @@ -0,0 +1,162 @@ + + + + + + Coverage for gators/converter/to_pandas.py: 100% + + + + + +
+
+

+ Coverage for gators/converter/to_pandas.py: + 100% +

+
+ + +
+

Shortcuts on this page

+
+

+ r + m + x +   toggle line displays +

+

+ j + k   next/prev highlighted chunk +

+

+ 0   (zero) top of page +

+

+ 1   (one) first highlighted chunk +

+
+
+
+

+ 12 statements   + + + +

+
+ + + + +
+
+
+
+

1from typing import Tuple 

+

2 

+

3import numpy as np 

+

4 

+

5from ..transformers.transformer_xy import TransformerXY 

+

6from ..util import util 

+

7 

+

8from gators import DataFrame, Series 

+

9 

+

10 

+

11class ToPandas(TransformerXY): 

+

12 """Convert dataframe and series to a pandas dataframe and series. 

+

13 

+

14 Examples 

+

15 --------- 

+

16 Imports and initialization: 

+

17 

+

18 >>> from gators.converter import ToPandas 

+

19 >>> obj = ToPandas() 

+

20 

+

21 The `fit`, `transform`, and `fit_transform` methods accept: 

+

22 

+

23 * `dask` dataframes: 

+

24 

+

25 >>> import dask.dataframe as dd 

+

26 >>> import pandas as pd 

+

27 >>> X = dd.from_pandas(pd.DataFrame({ 

+

28 ... 'A': [0.0, 3.0, 6.0], 

+

29 ... 'B': [1.0, 4.0, 7.0], 

+

30 ... 'C': [2.0, 5.0, 8.0]}), npartitions=1) 

+

31 >>> y = dd.from_pandas(pd.Series([0, 0, 1], name='TARGET'), npartitions=1) 

+

32 

+

33 * `koalas` dataframes: 

+

34 

+

35 >>> import databricks.koalas as ks 

+

36 >>> X = ks.DataFrame({ 

+

37 ... 'A': [0.0, 3.0, 6.0], 

+

38 ... 'B': [1.0, 4.0, 7.0], 

+

39 ... 'C': [2.0, 5.0, 8.0]}) 

+

40 >>> y = ks.Series([0, 0, 1], name='TARGET') 

+

41 

+

42 * and `pandas` dataframes: 

+

43 

+

44 >>> import pandas as pd 

+

45 >>> X = pd.DataFrame({ 

+

46 ... 'A': [0.0, 3.0, 6.0], 

+

47 ... 'B': [1.0, 4.0, 7.0], 

+

48 ... 'C': [2.0, 5.0, 8.0]}) 

+

49 >>> y = pd.Series([0, 0, 1], name='TARGET') 

+

50 

+

51 The result is a Pandas dataframe and Pandas series. 

+

52 

+

53 >>> X, y = obj.transform(X, y) 

+

54 >>> X 

+

55 A B C 

+

56 0 0.0 1.0 2.0 

+

57 1 3.0 4.0 5.0 

+

58 2 6.0 7.0 8.0 

+

59 >>> y 

+

60 0 0 

+

61 1 0 

+

62 2 1 

+

63 Name: TARGET, dtype: int64 

+

64 """ 

+

65 

+

66 def __init__(self): 

+

67 TransformerXY.__init__(self) 

+

68 

+

69 def transform( 

+

70 self, 

+

71 X: DataFrame, 

+

72 y: Series, 

+

73 ) -> Tuple[np.ndarray, np.ndarray]: 

+

74 """Fit the transformer on the dataframe `X`. 

+

75 

+

76 Parameters 

+

77 ---------- 

+

78 X : DataFrame. 

+

79 Input dataframe. 

+

80 y : [pd.Series, ks.Series]: 

+

81 Target values. 

+

82 

+

83 Returns 

+

84 ------- 

+

85 X : pd.DataFrame 

+

86 Dataframe. 

+

87 y : np.ndarray 

+

88 Target values. 

+

89 """ 

+

90 self.check_dataframe(X) 

+

91 self.check_target(X, y) 

+

92 return util.get_function(X).to_pandas(X), util.get_function(X).to_pandas(y) 

+
+ + + diff --git a/cov_html/gators_binning__base_discretizer_py.html b/cov_html/gators_binning__base_discretizer_py.html deleted file mode 100644 index c78d8ac2..00000000 --- a/cov_html/gators_binning__base_discretizer_py.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - Coverage for gators/binning/_base_discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from binning import discretizer, discretizer_inplace 

-

3from ..util import util 

-

4from ..transformers.transformer import Transformer 

-

5from pyspark.ml.feature import Bucketizer 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10 

-

11 

-

12EPSILON = 1e-10 

-

13 

-

14 

-

15class _BaseDiscretizer(Transformer): 

-

16 """Base discretizer transformer class. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 n_bins : int 

-

21 Number of bins to use. 

-

22 inplace : bool 

-

23 If False, return the dataframe with the new discretized columns 

-

24 with the names '`column_name`__bin'). Otherwise, 

-

25 return the dataframe with the existing binned columns. 

-

26 

-

27 """ 

-

28 

-

29 def __init__(self, n_bins: int, inplace): 

-

30 if not isinstance(n_bins, int): 

-

31 raise TypeError('`n_bins` should be an int.') 

-

32 if not isinstance(inplace, bool): 

-

33 raise TypeError('`inplace` should be a bool.') 

-

34 Transformer.__init__(self) 

-

35 self.n_bins = n_bins 

-

36 self.inplace = inplace 

-

37 self.columns = [] 

-

38 self.output_columns = [] 

-

39 self.idx_columns: np.ndarray = None 

-

40 self.bins = {} 

-

41 self.bins_np = np.array([]) 

-

42 self.bins_ks: List[List[float]] = [[]] 

-

43 

-

44 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

45 y=None) -> '_BaseDiscretizer': 

-

46 """Fit the transformer on the dataframe `X`. 

-

47 

-

48 Parameters 

-

49 ---------- 

-

50 X : Union[pd.DataFrame, ks.DataFrame] 

-

51 Input dataframe. 

-

52 y : Union[pd.Series, ks.Series], default to None. 

-

53 Labels. 

-

54 

-

55 Returns 

-

56 ------- 

-

57 'Discretizer' 

-

58 Instance of itself. 

-

59 """ 

-

60 self.check_dataframe(X) 

-

61 self.columns = util.get_numerical_columns(X) 

-

62 self.output_columns = [f'{c}__bin' for c in self.columns] 

-

63 self.idx_columns = util.get_idx_columns( 

-

64 X.columns, self.columns 

-

65 ) 

-

66 n_cols = len(self.idx_columns) 

-

67 if n_cols == 0: 

-

68 return self 

-

69 self.bins, self.bins_np = self.compute_bins( 

-

70 X[self.columns], self.n_bins) 

-

71 return self 

-

72 

-

73 def transform(self, 

-

74 X: Union[pd.DataFrame, ks.DataFrame] 

-

75 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

76 """Transform the dataframe `X`. 

-

77 

-

78 Parameters 

-

79 ---------- 

-

80 X : Union[pd.DataFrame, ks.DataFrame] 

-

81 Input dataframe. 

-

82 

-

83 Returns 

-

84 ------- 

-

85 Union[pd.DataFrame, ks.DataFrame] 

-

86 Transformed dataframe. 

-

87 """ 

-

88 self.check_dataframe(X) 

-

89 if self.idx_columns.size == 0: 

-

90 return X 

-

91 if isinstance(X, pd.DataFrame): 

-

92 if self.inplace: 

-

93 return self.bin_pd_inplace( 

-

94 X, self.columns, self.output_columns, 

-

95 self.bins) 

-

96 return self.bin_pd( 

-

97 X, self.columns, self.output_columns, 

-

98 self.bins) 

-

99 if self.inplace: 

-

100 return self.bin_ks_inplace( 

-

101 X, self.columns, self.output_columns, 

-

102 self.bins)[X.columns] 

-

103 

-

104 return self.bin_ks( 

-

105 X, self.columns, self.output_columns, 

-

106 self.bins) 

-

107 

-

108 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

109 """Transform the NumPy array. 

-

110 

-

111 Parameters 

-

112 ---------- 

-

113 X : np.ndarray 

-

114 NumPy array. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 np.ndarray 

-

119 Transformed NumPy array. 

-

120 """ 

-

121 self.check_array(X) 

-

122 if self.idx_columns.size == 0: 

-

123 return X 

-

124 if self.inplace: 

-

125 if X.dtype == object: 

-

126 return discretizer_inplace( 

-

127 X, 

-

128 self.bins_np, 

-

129 self.idx_columns 

-

130 ) 

-

131 return discretizer_inplace( 

-

132 X.astype(object), 

-

133 self.bins_np, 

-

134 self.idx_columns 

-

135 ) 

-

136 if X.dtype == object: 

-

137 return discretizer( 

-

138 X, 

-

139 self.bins_np, 

-

140 self.idx_columns 

-

141 ) 

-

142 return discretizer( 

-

143 X.astype(object), 

-

144 self.bins_np, 

-

145 self.idx_columns 

-

146 ) 

-

147 

-

148 @staticmethod 

-

149 def bin_pd_inplace(X: pd.DataFrame, columns: List[str], 

-

150 output_columns: List[str], bins): 

-

151 """Perform the binning inplace for pandas dataframes. 

-

152 

-

153 Parameters 

-

154 ---------- 

-

155 X : pd.DataFrame 

-

156 Dataframe. 

-

157 columns : List[str] 

-

158 Columns to be binnned. 

-

159 output_columns : List[str] 

-

160 Binnned column names. 

-

161 bins : [type] 

-

162 [description] 

-

163 

-

164 Returns 

-

165 ------- 

-

166 pd.DataFrame 

-

167 Dataframe. 

-

168 """ 

-

169 def f(x, bins, columns): 

-

170 name = x.name 

-

171 if name not in columns: 

-

172 return x 

-

173 return pd.cut( 

-

174 x, 

-

175 bins[name], 

-

176 labels=np.arange(len(bins[name]) - 1), 

-

177 duplicates='drop').fillna(0).astype(float).astype(str) 

-

178 return X.apply(f, args=(bins, columns)) 

-

179 

-

180 @staticmethod 

-

181 def bin_pd(X, columns, output_columns, bins): 

-

182 """Perform the binning not inplace for pandas dataframes. 

-

183 

-

184 Parameters 

-

185 ---------- 

-

186 X : pd.DataFrame 

-

187 Dataframe. 

-

188 columns : List[str] 

-

189 Columns to be binnned. 

-

190 output_columns : List[str] 

-

191 Binnned column names. 

-

192 bins : [type] 

-

193 [description] 

-

194 

-

195 Returns 

-

196 ------- 

-

197 pd.DataFrame 

-

198 Dataframe. 

-

199 """ 

-

200 def f(x, bins, columns): 

-

201 name = x.name 

-

202 return pd.cut( 

-

203 x, 

-

204 bins[name], 

-

205 labels=np.arange(len(bins[name]) - 1), 

-

206 duplicates='drop').fillna(0).astype(float).astype(str) 

-

207 return X.join( 

-

208 X[columns].apply( 

-

209 f, args=(bins, columns)).astype(object).rename( 

-

210 columns=dict(zip(columns, output_columns)))) 

-

211 

-

212 @staticmethod 

-

213 def bin_ks_inplace(X, columns, output_columns, bins): 

-

214 """Perform the binning not inplace for kolas dataframes. 

-

215 

-

216 Parameters 

-

217 ---------- 

-

218 X : pd.DataFrame 

-

219 Dataframe. 

-

220 columns : List[str] 

-

221 Columns to be binnned. 

-

222 output_columns : List[str] 

-

223 Binnned column names. 

-

224 bins : [type] 

-

225 [description] 

-

226 

-

227 Returns 

-

228 ------- 

-

229 ks.DataFrame 

-

230 Dataframe. 

-

231 """ 

-

232 X = Bucketizer( 

-

233 splitsArray=bins, 

-

234 inputCols=columns, 

-

235 outputCols=output_columns 

-

236 ).transform(X.to_spark()).to_koalas( 

-

237 ).drop(columns, axis=1).rename( 

-

238 columns=dict(zip(output_columns, columns))) 

-

239 X[columns] = X[columns].astype(str) 

-

240 return X 

-

241 

-

242 @staticmethod 

-

243 def bin_ks(X, columns, output_columns, bins): 

-

244 """Perform the binning inplace for kolas dataframes. 

-

245 

-

246 Parameters 

-

247 ---------- 

-

248 X : pd.DataFrame 

-

249 Dataframe. 

-

250 columns : List[str] 

-

251 Columns to be binnned. 

-

252 output_columns : List[str] 

-

253 Binnned column names. 

-

254 bins : [type] 

-

255 [description] 

-

256 

-

257 Returns 

-

258 ------- 

-

259 ks.DataFrame 

-

260 Dataframe. 

-

261 """ 

-

262 X = Bucketizer( 

-

263 splitsArray=bins, 

-

264 inputCols=columns, 

-

265 outputCols=output_columns 

-

266 ).transform(X.to_spark()).to_koalas() 

-

267 X[output_columns] = X[output_columns].astype(str) 

-

268 return X 

-
- - - diff --git a/cov_html/gators_binning_bin_rare_events_py.html b/cov_html/gators_binning_bin_rare_events_py.html deleted file mode 100644 index 2ef59e83..00000000 --- a/cov_html/gators_binning_bin_rare_events_py.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - Coverage for gators/binning/bin_rare_events.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from binning import bin_rare_events 

-

3from ..util import util 

-

4from ..transformers.transformer import Transformer 

-

5from typing import List, Union, Dict 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class BinRareEvents(Transformer): 

-

12 """Replace low occurence categories by the value "OTHERS". 

-

13 

-

14 Use `BinRareEvents` to reduce the cardinality 

-

15 of high cardinal variables. This transformer is also useful 

-

16 to replace unseen categories by a value which is already 

-

17 taken it account by the encoders. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 min_ratio : float 

-

22 Min occurence ratio per category. 

-

23 

-

24 Examples 

-

25 --------- 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.binning import BinRareEvents 

-

29 >>> obj = BinRareEvents(min_ratio=0.5) 

-

30 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

31 >>> obj.fit_transform(X) 

-

32 A B 

-

33 0 a OTHERS 

-

34 1 a OTHERS 

-

35 2 OTHERS OTHERS 

-

36 

-

37 * fit & transform with koalas 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.binning import BinRareEvents 

-

41 >>> obj = BinRareEvents(min_ratio=0.5) 

-

42 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

43 >>> obj.fit_transform(X) 

-

44 A B 

-

45 0 a OTHERS 

-

46 1 a OTHERS 

-

47 2 OTHERS OTHERS 

-

48 

-

49 * fit with pandas & transform with numpy 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.binning import BinRareEvents 

-

53 >>> obj = BinRareEvents(min_ratio=0.5) 

-

54 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

55 >>> _ = obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([['a', 'OTHERS'], 

-

58 ['a', 'OTHERS'], 

-

59 ['OTHERS', 'OTHERS']], dtype=object) 

-

60 

-

61 * fit with koalas & transform with numpy 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.binning import BinRareEvents 

-

65 >>> obj = BinRareEvents(min_ratio=0.5) 

-

66 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([['a', 'OTHERS'], 

-

70 ['a', 'OTHERS'], 

-

71 ['OTHERS', 'OTHERS']], dtype=object) 

-

72 

-

73 """ 

-

74 

-

75 def __init__(self, min_ratio: float): 

-

76 if not isinstance(min_ratio, float): 

-

77 raise TypeError( 

-

78 '''`min_ratio` should be a float.''') 

-

79 Transformer.__init__(self) 

-

80 self.min_ratio = min_ratio 

-

81 self.columns = [] 

-

82 self.idx_columns: np.ndarray = np.array([]) 

-

83 self.categories_to_keep_np: np.ndarray = None 

-

84 self.n_categories_to_keep_np: np.ndarray = None 

-

85 self.categories_to_keep_dict: Dict[str, np.ndarray] = {} 

-

86 

-

87 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

88 y=None) -> 'BinRareEvents': 

-

89 """Fit the transformer on the dataframe `X`. 

-

90 

-

91 Parameters 

-

92 ---------- 

-

93 X : Union[pd.DataFrame, ks.DataFrame]. 

-

94 Input dataframe. 

-

95 y : None 

-

96 None. 

-

97 

-

98 Returns 

-

99 ------- 

-

100 BinRareEvents 

-

101 Instance of itself. 

-

102 """ 

-

103 self.check_dataframe(X) 

-

104 if object not in X.dtypes.to_numpy(): 

-

105 return self 

-

106 self.columns = util.get_datatype_columns( 

-

107 X, datatype=object) 

-

108 self.categories_to_keep_dict = self.compute_categories_to_keep_dict( 

-

109 X=X[self.columns], 

-

110 min_ratio=self.min_ratio, 

-

111 ) 

-

112 self.categories_to_keep_np = self.get_categories_to_keep_np( 

-

113 categories_to_keep_dict=self.categories_to_keep_dict, 

-

114 ) 

-

115 self.n_categories_to_keep_np = self.categories_to_keep_np.shape[0] \ 

-

116 - (self.categories_to_keep_np == None).sum(0) 

-

117 self.idx_columns = util.get_idx_columns( 

-

118 columns=X.columns, 

-

119 selected_columns=self.columns) 

-

120 return self 

-

121 

-

122 def transform(self, 

-

123 X: Union[pd.DataFrame, ks.DataFrame] 

-

124 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

125 """Transform the dataframe `X`. 

-

126 

-

127 Parameters 

-

128 ---------- 

-

129 X : Union[pd.DataFrame, ks.DataFrame]. 

-

130 Input dataframe. 

-

131 

-

132 Returns 

-

133 ------- 

-

134 Union[pd.DataFrame, ks.DataFrame] 

-

135 Transformed dataframe. 

-

136 """ 

-

137 self.check_dataframe(X) 

-

138 

-

139 def f(x): 

-

140 name = x.name 

-

141 if name not in self.categories_to_keep_dict: 

-

142 return x 

-

143 return x.mask(~ x.isin(self.categories_to_keep_dict[name]), 

-

144 'OTHERS') 

-

145 return X.apply(f) 

-

146 

-

147 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

148 """Transform the NumPy array. 

-

149 

-

150 Parameters 

-

151 ---------- 

-

152 X : np.ndarray 

-

153 NumPy array. 

-

154 

-

155 Returns 

-

156 ------- 

-

157 np.ndarray 

-

158 Transformed NumPy array. 

-

159 

-

160 """ 

-

161 self.check_array(X) 

-

162 if self.idx_columns.size == 0: 

-

163 return X 

-

164 if self.categories_to_keep_np.shape[0] == 0: 

-

165 X[:, self.idx_columns] = 'OTHERS' 

-

166 return X 

-

167 return bin_rare_events( 

-

168 X, 

-

169 self.categories_to_keep_np, 

-

170 self.n_categories_to_keep_np, 

-

171 self.idx_columns, 

-

172 ) 

-

173 

-

174 @ staticmethod 

-

175 def compute_categories_to_keep_dict( 

-

176 X: Union[pd.DataFrame, ks.DataFrame], 

-

177 min_ratio: float) -> Dict[str, List[str]]: 

-

178 """Compute the category frequency. 

-

179 

-

180 Parameters 

-

181 ---------- 

-

182 X : Union[pd.DataFrame, ks.DataFrame]. 

-

183 Input dataframe. 

-

184 min_ratio : float 

-

185 Min occurence per category. 

-

186 

-

187 Returns 

-

188 ------- 

-

189 Dict[str, List[str]]: Categories to keep. 

-

190 """ 

-

191 def f(x): 

-

192 freq = x.astype('object').value_counts( 

-

193 normalize=True).sort_values() 

-

194 freq = freq[freq >= min_ratio] 

-

195 return list(freq.index) 

-

196 

-

197 mapping = X.apply(f).to_dict() 

-

198 mapping = { 

-

199 key: val if isinstance(val, list) else list(val.values()) 

-

200 for key, val in mapping.items() 

-

201 } 

-

202 return mapping 

-

203 

-

204 @ staticmethod 

-

205 def get_categories_to_keep_np( 

-

206 categories_to_keep_dict: Dict[str, np.ndarray]) -> np.ndarray: 

-

207 """Get the categories to keep. 

-

208 

-

209 Parameters 

-

210 ---------- 

-

211 categories_to_keep_dict : Dict[str, np.ndarray]) 

-

212 Categories to keep. 

-

213 

-

214 Returns 

-

215 ------- 

-

216 np.ndarray 

-

217 Categories to keep. 

-

218 """ 

-

219 max_category = max( 

-

220 [len(val) for val in categories_to_keep_dict.values()]) 

-

221 n_columns = len(categories_to_keep_dict) 

-

222 categories_to_keep_np = np.empty( 

-

223 (max_category, n_columns), dtype='object') 

-

224 for i, val in enumerate(categories_to_keep_dict.values()): 

-

225 categories_to_keep_np[:len(val), i] = val 

-

226 return categories_to_keep_np 

-
- - - diff --git a/cov_html/gators_binning_custom_discretizer_py.html b/cov_html/gators_binning_custom_discretizer_py.html deleted file mode 100644 index b4db2161..00000000 --- a/cov_html/gators_binning_custom_discretizer_py.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - Coverage for gators/binning/custom_discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_discretizer import _BaseDiscretizer 

-

3from ..util import util 

-

4from typing import List, Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10EPSILON = 1e-10 

-

11 

-

12 

-

13class CustomDiscretizer(_BaseDiscretizer): 

-

14 """Discretize the columns using the splits given by the user. 

-

15 

-

16 The discretization can be done inplace or by adding the discretized 

-

17 variables to the existing data. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 bins : Dict[str, List[float]] 

-

22 Bin splits definition. The dictionary keys are the column names to 

-

23 discretize, its values are the split arrays. 

-

24 inplace : bool, default False 

-

25 If False, return the dataframe with the new discretized columns 

-

26 with the names '`column_name`__bin'). Otherwise, return 

-

27 the dataframe with the existing binned columns. 

-

28 

-

29 Examples 

-

30 --------- 

-

31 * fit & transform with pandas 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> import numpy as np 

-

35 >>> from gators.binning import CustomDiscretizer 

-

36 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

37 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

38 >>> obj = CustomDiscretizer(bins=bins) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A_bin B_bin 

-

41 0 -1 1 0.0 0.0 

-

42 1 0 2 0.0 1.0 

-

43 2 1 3 1.0 1.0 

-

44 

-

45 * fit & transform with koalas 

-

46 

-

47 >>> import databricks.koalas as ks 

-

48 >>> import numpy as np 

-

49 >>> from gators.binning import CustomDiscretizer 

-

50 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

51 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

52 >>> obj = CustomDiscretizer(bins=bins) 

-

53 >>> obj.fit_transform(X) 

-

54 A B A_bin B_bin 

-

55 0 -1 1 0.0 0.0 

-

56 1 0 2 0.0 1.0 

-

57 2 1 3 1.0 1.0 

-

58 

-

59 * fit with pandas & transform with numpy 

-

60 

-

61 >>> import pandas as pd 

-

62 >>> import numpy as np 

-

63 >>> from gators.binning import CustomDiscretizer 

-

64 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

65 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

66 >>> obj = CustomDiscretizer(bins=bins) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[-1., 1., 0., 0.], 

-

70 [ 0., 2., 0., 1.], 

-

71 [ 1., 3., 1., 1.]]) 

-

72 

-

73 * fit with koalas & transform with numpy 

-

74 

-

75 >>> import databricks.koalas as ks 

-

76 >>> import numpy as np 

-

77 >>> from gators.binning import CustomDiscretizer 

-

78 >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} 

-

79 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

80 >>> obj = CustomDiscretizer(bins=bins) 

-

81 >>> _ = obj.fit(X) 

-

82 >>> obj.transform_numpy(X.to_numpy()) 

-

83 array([[-1., 1., 0, 0.], 

-

84 [ 0., 2., 0., 1.], 

-

85 [ 1., 3., 1., 1.]]) 

-

86 

-

87 See Also 

-

88 -------- 

-

89 gators.binning.Discretizer 

-

90 Discretize using equal splits. 

-

91 gators.binning.QuantileDiscretizer 

-

92 Discretize using splits based on quantiles. 

-

93 

-

94 """ 

-

95 

-

96 def __init__(self, bins: Dict[str, List[float]], inplace=False): 

-

97 if not isinstance(bins, dict): 

-

98 raise TypeError('`bins` should be a dict.') 

-

99 _BaseDiscretizer.__init__(self, n_bins=0, inplace=inplace) 

-

100 self.bins = {key: np.array(val) for key, val in bins.items()} 

-

101 

-

102 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

103 y=None) -> 'CustomDiscretizer': 

-

104 """Fit the transformer on the dataframe `X`. 

-

105 

-

106 Parameters 

-

107 ---------- 

-

108 X : Union[pd.DataFrame, ks.DataFrame] 

-

109 Input dataframe. 

-

110 y : Union[pd.Series, ks.Series], default to None. 

-

111 Labels. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 'CustomDiscretizer' 

-

116 Instance of itself. 

-

117 """ 

-

118 self.check_dataframe(X) 

-

119 self.columns = list(self.bins.keys()) 

-

120 self.output_columns = [f'{c}__bin' for c in self.columns] 

-

121 self.idx_columns = util.get_idx_columns( 

-

122 X.columns, self.columns 

-

123 ) 

-

124 n_cols = len(self.idx_columns) 

-

125 if n_cols == 0: 

-

126 return self 

-

127 max_bins = max([len(v) for v in self.bins.values()]) 

-

128 self.labels = np.arange(max_bins-1) 

-

129 self.bins_np = np.inf * np.ones((max_bins, n_cols)) 

-

130 for i, b in enumerate(self.bins.values()): 

-

131 self.bins_np[:len(b), i] = b 

-

132 if isinstance(X, ks.DataFrame): 

-

133 self.bins = self.bins_np.T.tolist() 

-

134 self.bins = [np.unique(b)+EPSILON for b in self.bins] 

-

135 return self 

-
- - - diff --git a/cov_html/gators_binning_discretizer_py.html b/cov_html/gators_binning_discretizer_py.html deleted file mode 100644 index 1a4fac5f..00000000 --- a/cov_html/gators_binning_discretizer_py.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - Coverage for gators/binning/discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_discretizer import _BaseDiscretizer 

-

3from typing import List, Tuple, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ..util import util 

-

8 

-

9EPSILON = 1e-10 

-

10 

-

11 

-

12class Discretizer(_BaseDiscretizer): 

-

13 """Discretize the columns using equal distance splits. 

-

14 

-

15 The discretization can be done inplace or by adding the discretized 

-

16 variables to the existing data. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 n_bins : int 

-

21 Number of bins to use. 

-

22 inplace : bool, default False 

-

23 If False, return the dataframe with the new discretized columns 

-

24 with the names '`column_name`__bin'). Otherwise, return 

-

25 the dataframe with the existing binned columns. 

-

26 

-

27 Examples 

-

28 --------- 

-

29 * fit & transform with pandas 

-

30 

-

31 >>> import pandas as pd 

-

32 >>> from gators.binning import Discretizer 

-

33 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

34 >>> obj = Discretizer(n_bins=3) 

-

35 >>> obj.fit_transform(X) 

-

36 A B A_bin B_bin 

-

37 0 -1 1 0.0 0.0 

-

38 1 0 2 1.0 1.0 

-

39 2 1 3 2.0 2.0 

-

40 

-

41 * fit & transform with koalas 

-

42 

-

43 >>> import databricks.koalas as ks 

-

44 >>> from gators.binning import Discretizer 

-

45 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

46 >>> obj = Discretizer(n_bins=3) 

-

47 >>> obj.fit_transform(X) 

-

48 A B A_bin B_bin 

-

49 0 -1 1 0.0 0.0 

-

50 1 0 2 1.0 1.0 

-

51 2 1 3 2.0 2.0 

-

52 

-

53 * fit with pandas & transform with numpy 

-

54 

-

55 >>> import pandas as pd 

-

56 >>> from gators.binning import Discretizer 

-

57 >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) 

-

58 >>> obj = Discretizer(n_bins=3) 

-

59 >>> _ = obj.fit(X) 

-

60 >>> obj.transform_numpy(X.to_numpy()) 

-

61 array([[-1., 1., 0., 0.], 

-

62 [ 0., 2., 1., 1.], 

-

63 [ 1., 3., 2., 2.]]) 

-

64 

-

65 * fit with koalas & transform with numpy 

-

66 

-

67 >>> import databricks.koalas as ks 

-

68 >>> from gators.binning import Discretizer 

-

69 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

70 >>> obj = Discretizer(n_bins=3) 

-

71 >>> _ = obj.fit(X) 

-

72 >>> obj.transform_numpy(X.to_numpy()) 

-

73 array([[-1., 1., 0., 0.], 

-

74 [ 0., 2., 1., 1.], 

-

75 [ 1., 3., 2., 2.]]) 

-

76 

-

77 See Also 

-

78 -------- 

-

79 gators.binning.CustomDiscretizer 

-

80 Discretize using the splits given by the user. 

-

81 gators.binning.QuantileDiscretizer 

-

82 Discretize using splits based on quantiles. 

-

83 

-

84 """ 

-

85 

-

86 def __init__(self, n_bins: int, inplace=False): 

-

87 _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) 

-

88 

-

89 @staticmethod 

-

90 def compute_bins(X: Union[pd.DataFrame, ks.DataFrame], n_bins: int 

-

91 ) -> Tuple[List[List[float]], np.ndarray]: 

-

92 """Compute the bins list and the bins array. 

-

93 The bin list is used for dataframes and 

-

94 the bins array is used for arrays. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame] 

-

99 Input dataframe. 

-

100 n_bins : int 

-

101 Number of bins to use. 

-

102 

-

103 Returns 

-

104 ------- 

-

105 bins : List[List[float]] 

-

106 Bin splits definition. 

-

107 The dictionary keys are the column names to discretize, 

-

108 its values are the split arrays. 

-

109 bins_np : np.ndarray 

-

110 Bin splits definition for NumPy. 

-

111 """ 

-

112 n_cols = X.shape[1] 

-

113 X_dtype = X.dtypes.to_numpy()[0] 

-

114 if isinstance(X, pd.DataFrame): 

-

115 deltas = X.max() - X.min() 

-

116 bins_np = np.empty((n_bins+1, n_cols)) 

-

117 bins_np[0, :] = util.get_bounds(X_dtype)[0] 

-

118 bins_np[-1, :] = util.get_bounds(X_dtype)[1] 

-

119 for i in range(1, n_bins): 

-

120 bins_np[i, :] = X.min() + i * deltas / n_bins 

-

121 

-

122 bins = pd.DataFrame( 

-

123 bins_np, columns=X.columns).to_dict( 

-

124 orient='list') 

-

125 return bins, bins_np 

-

126 x_min = X.min().to_pandas() 

-

127 x_max = X.max().to_pandas() 

-

128 deltas = x_max - x_min 

-

129 bins_np = np.empty((n_bins+1, n_cols)) 

-

130 bins_np[0, :] = util.get_bounds(X_dtype)[0] 

-

131 bins_np[-1, :] = util.get_bounds(X_dtype)[1] 

-

132 for i in range(1, n_bins): 

-

133 bins_np[i, :] = x_min + i * deltas / n_bins 

-

134 bins = (bins_np.T + EPSILON).tolist() 

-

135 return bins, bins_np 

-
- - - diff --git a/cov_html/gators_binning_quantile_discretizer_py.html b/cov_html/gators_binning_quantile_discretizer_py.html deleted file mode 100644 index d5dde755..00000000 --- a/cov_html/gators_binning_quantile_discretizer_py.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - Coverage for gators/binning/quantile_discretizer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_discretizer import _BaseDiscretizer 

-

3from typing import Tuple, List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ..util import util 

-

8 

-

9EPSILON = 1e-10 

-

10 

-

11 

-

12class QuantileDiscretizer(_BaseDiscretizer): 

-

13 """Discretize the columns using quantile-based splits. 

-

14 

-

15 The discretization can be done inplace or by adding the discretized 

-

16 variables to the existing data. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 n_bins : int 

-

21 Number of bins to use. 

-

22 inplace : bool, default to False 

-

23 If False, return the dataframe with the new discretized columns 

-

24 with the names '`column_name`__bin'). Otherwise, return 

-

25 the dataframe with the existing binned columns. 

-

26 

-

27 Examples 

-

28 --------- 

-

29 * fit & transform with pandas 

-

30 

-

31 >>> import pandas as pd 

-

32 >>> from gators.binning import QuantileDiscretizer 

-

33 >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

34 >>> obj = QuantileDiscretizer(n_bins=3) 

-

35 >>> obj.fit_transform(X) 

-

36 A B A_bin B_bin 

-

37 0 -1 1 0.0 0.0 

-

38 1 0 2 1.0 1.0 

-

39 2 1 3 2.0 2.0 

-

40 

-

41 * fit & transform with koalas 

-

42 

-

43 >>> import databricks.koalas as ks 

-

44 >>> from gators.binning import QuantileDiscretizer 

-

45 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

46 >>> obj = QuantileDiscretizer(n_bins=3) 

-

47 >>> obj.fit_transform(X) 

-

48 A B A_bin B_bin 

-

49 0 -1 1 0.0 0.0 

-

50 1 0 2 1.0 1.0 

-

51 2 1 3 2.0 2.0 

-

52 

-

53 * fit with pandas & transform with numpy 

-

54 

-

55 >>> import pandas as pd 

-

56 >>> from gators.binning import QuantileDiscretizer 

-

57 >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) 

-

58 >>> obj = QuantileDiscretizer(n_bins=3) 

-

59 >>> _ = obj.fit(X) 

-

60 >>> obj.transform_numpy(X.to_numpy()) 

-

61 array([[-1., 1., 0., 0.], 

-

62 [ 0., 2., 1., 1.], 

-

63 [ 1., 3., 2., 2.]]) 

-

64 

-

65 * fit with koalas & transform with numpy 

-

66 

-

67 >>> import databricks.koalas as ks 

-

68 >>> from gators.binning import QuantileDiscretizer 

-

69 >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) 

-

70 >>> obj = QuantileDiscretizer(n_bins=3) 

-

71 >>> _ = obj.fit(X) 

-

72 >>> obj.transform_numpy(X.to_numpy()) 

-

73 array([[-1., 1., 0., 0.], 

-

74 [ 0., 2., 1., 1.], 

-

75 [ 1., 3., 2., 2.]]) 

-

76 

-

77 See Also 

-

78 -------- 

-

79 gators.binning.Discretizer 

-

80 Discretize using equal splits. 

-

81 gators.binning.CustomDiscretizer 

-

82 Discretize using the variable quantiles. 

-

83 

-

84 """ 

-

85 

-

86 def __init__(self, n_bins: int, inplace=False): 

-

87 _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) 

-

88 

-

89 @staticmethod 

-

90 def compute_bins(X: Union[pd.DataFrame, ks.DataFrame], n_bins: int 

-

91 ) -> Tuple[List[List[float]], np.ndarray]: 

-

92 """Compute the bins list and the bins array. 

-

93 The bin list is used for dataframes and 

-

94 the bins array is used for arrays. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame] 

-

99 Input dataframe. 

-

100 n_bins : int 

-

101 Number of bins to use. 

-

102 

-

103 Returns 

-

104 ------- 

-

105 bins : List[List[float]] 

-

106 Bin splits definition. 

-

107 The dictionary keys are the column names to discretize, 

-

108 its values are the split arrays. 

-

109 bins_np : np.ndarray 

-

110 Bin splits definition for NumPy. 

-

111 """ 

-

112 q = np.linspace(0, 1, n_bins+1)[1:-1].tolist() 

-

113 X_dtype = X.dtypes.to_numpy()[0] 

-

114 

-

115 def f(x): 

-

116 return x.quantile(q=q) 

-

117 

-

118 bins = X.apply(f) 

-

119 if isinstance(bins, ks.DataFrame): 

-

120 bins = bins.to_pandas() 

-

121 bins.loc[-np.inf, :] = util.get_bounds(X_dtype)[0] 

-

122 bins.loc[np.inf, :] = util.get_bounds(X_dtype)[1] 

-

123 bins = bins.sort_index() 

-

124 for c in X.columns: 

-

125 unique_bins = bins[c].iloc[1:-1].unique() 

-

126 n_unique = unique_bins.shape[0] 

-

127 bins[c].iloc[1:1+n_unique] = unique_bins 

-

128 bins[c].iloc[1+n_unique:] = util.get_bounds(X_dtype)[1] 

-

129 bins_np = bins.to_numpy() 

-

130 if isinstance(X, pd.DataFrame): 

-

131 return bins.to_dict(orient='list'), bins_np 

-

132 else: 

-

133 bins = bins_np.T.tolist() 

-

134 return [np.unique(b)+EPSILON for b in bins], bins_np 

-
- - - diff --git a/cov_html/gators_clipping_clipping_py.html b/cov_html/gators_clipping_clipping_py.html deleted file mode 100644 index 021cbbe8..00000000 --- a/cov_html/gators_clipping_clipping_py.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - Coverage for gators/clipping/clipping.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Dict, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ..util import util 

-

7from ..transformers.transformer import Transformer 

-

8from clipping import clipping 

-

9 

-

10 

-

11class Clipping(Transformer): 

-

12 """Trim values using the limits given by the user. 

-

13 

-

14 The data should be only composed of numerical columns. 

-

15 Use `gators.encoders` to replace the categorical columns by 

-

16 numerical ones before using `Clipping`. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 clip_dict : Dict[str, List[float]] 

-

21 The keys are the columns to clip, the values are lists of two elements: 

-

22 

-

23 * the first element is the lower limit 

-

24 * the second element is the upper limit 

-

25 

-

26 dtype : type, default to np.float64. 

-

27 Numerical datatype of the output data. 

-

28 

-

29 Examples 

-

30 --------- 

-

31 * fit & transform with pandas 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> from gators.clipping import Clipping 

-

35 >>> X = pd.DataFrame( 

-

36 ... {'A': {0: 1.8, 1: 2.2, 2: 1.0, 3: 0.4, 4: 0.8}, 

-

37 ... 'B': {0: 0.4, 1: 1.9, 2: -0.2, 3: 0.1, 4: 0.1}, 

-

38 ... 'C': {0: 1.0, 1: -1.0, 2: -0.1, 3: 1.5, 4: 0.4}}) 

-

39 >>> obj = Clipping({'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]}) 

-

40 >>> obj.fit_transform(X) 

-

41 A B C 

-

42 0 0.5 0.4 1.0 

-

43 1 0.5 0.5 0.0 

-

44 2 0.5 -0.2 0.0 

-

45 3 0.4 0.1 1.0 

-

46 4 0.5 0.1 0.4 

-

47 

-

48 * fit & transform with koalas 

-

49 

-

50 >>> import databricks.koalas as ks 

-

51 >>> from gators.clipping import Clipping 

-

52 >>> X = ks.DataFrame( 

-

53 ... {'A': {0: 1.8, 1: 2.2, 2: 1.0, 3: 0.4, 4: 0.8}, 

-

54 ... 'B': {0: 0.4, 1: 1.9, 2: -0.2, 3: 0.1, 4: 0.1}, 

-

55 ... 'C': {0: 1.0, 1: -1.0, 2: -0.1, 3: 1.5, 4: 0.4}}) 

-

56 >>> obj = Clipping({'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]}) 

-

57 >>> obj.fit_transform(X) 

-

58 A B C 

-

59 0 0.5 0.4 1.0 

-

60 1 0.5 0.5 0.0 

-

61 2 0.5 -0.2 0.0 

-

62 3 0.4 0.1 1.0 

-

63 4 0.5 0.1 0.4 

-

64 

-

65 * fit with pandas & transform with numpy 

-

66 

-

67 >>> import pandas as pd 

-

68 >>> from gators.clipping import Clipping 

-

69 >>> X = pd.DataFrame( 

-

70 ... {'A': {0: 1.8, 1: 2.2, 2: 1.0, 3: 0.4, 4: 0.8}, 

-

71 ... 'B': {0: 0.4, 1: 1.9, 2: -0.2, 3: 0.1, 4: 0.1}, 

-

72 ... 'C': {0: 1.0, 1: -1.0, 2: -0.1, 3: 1.5, 4: 0.4}}) 

-

73 >>> obj = Clipping({'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]}) 

-

74 >>> _ = obj.fit(X) 

-

75 >>> obj.transform_numpy(X.to_numpy()) 

-

76 array([[ 0.5, 0.4, 1. ], 

-

77 [ 0.5, 0.5, -0. ], 

-

78 [ 0.5, -0.2, -0. ], 

-

79 [ 0.4, 0.1, 1. ], 

-

80 [ 0.5, 0.1, 0.4]]) 

-

81 

-

82 * fit with koalas & transform with numpy 

-

83 

-

84 >>> import databricks.koalas as ks 

-

85 >>> from gators.clipping import Clipping 

-

86 >>> X = ks.DataFrame( 

-

87 ... {'A': {0: 1.8, 1: 2.2, 2: 1.0, 3: 0.4, 4: 0.8}, 

-

88 ... 'B': {0: 0.4, 1: 1.9, 2: -0.2, 3: 0.1, 4: 0.1}, 

-

89 ... 'C': {0: 1.0, 1: -1.0, 2: -0.1, 3: 1.5, 4: 0.4}}) 

-

90 >>> obj = Clipping({'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]}) 

-

91 >>> _ = obj.fit(X) 

-

92 >>> obj.transform_numpy(X.to_numpy()) 

-

93 array([[ 0.5, 0.4, 1. ], 

-

94 [ 0.5, 0.5, -0. ], 

-

95 [ 0.5, -0.2, -0. ], 

-

96 [ 0.4, 0.1, 1. ], 

-

97 [ 0.5, 0.1, 0.4]]) 

-

98 

-

99 """ 

-

100 

-

101 def __init__(self, clip_dict: Dict[str, List[float]], 

-

102 dtype: type = np.float64): 

-

103 if not isinstance(clip_dict, dict): 

-

104 raise TypeError('`clip_dict` should be a dictionary.') 

-

105 if len(clip_dict) == 0: 

-

106 raise ValueError('Length of `clip_dict` should be not zero.') 

-

107 self.clip_dict = clip_dict 

-

108 self.dtype = dtype 

-

109 self.clip_np = np.array(list(clip_dict.values())) 

-

110 self.columns = list(clip_dict.keys()) 

-

111 

-

112 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

113 y: Union[pd.Series, ks.Series] = None) -> 'Clipping': 

-

114 """Fit the transformer on the pandas/koalas dataframe X. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : Union[pd.DataFrame, ks.DataFrame] 

-

119 Input dataframe. 

-

120 y : Union[pd.Series, ks.Series], default to None. 

-

121 Labels. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 'Clipping': Instance of itself. 

-

126 """ 

-

127 self.check_dataframe(X) 

-

128 self.X_dtype = X.dtypes[X.columns[0]] 

-

129 self.idx_columns = util.get_idx_columns(X, self.clip_dict.keys()) 

-

130 self.clip_np = self.clip_np.astype(self.X_dtype) 

-

131 return self 

-

132 

-

133 def transform(self, X): 

-

134 """Transform the dataframe `X`. 

-

135 

-

136 Parameters 

-

137 ---------- 

-

138 X : Union[pd.DataFrame, ks.DataFrame]. 

-

139 Input dataframe. 

-

140 

-

141 Returns 

-

142 ------- 

-

143 Union[pd.DataFrame, ks.DataFrame] 

-

144 Transformed dataframe. 

-

145 """ 

-

146 self.check_dataframe(X) 

-

147 self.check_dataframe_is_numerics(X) 

-

148 

-

149 def clipping(x: ks.Series[self.dtype]) -> ks.Series[self.dtype]: 

-

150 c = x.name 

-

151 if c not in self.columns: 

-

152 return x 

-

153 return x.clip(self.clip_dict[c][0], self.clip_dict[c][1]) 

-

154 

-

155 return X.apply(clipping) 

-

156 

-

157 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

158 """Transform the array X. 

-

159 

-

160 Parameters 

-

161 ---------- 

-

162 X (np.ndarray): Input ndarray. 

-

163 

-

164 Returns 

-

165 ------- 

-

166 np.ndarray: Imputed ndarray. 

-

167 """ 

-

168 self.check_array(X) 

-

169 return clipping(X, self.idx_columns, self.clip_np) 

-
- - - diff --git a/cov_html/gators_converter_convert_column_datatype_py.html b/cov_html/gators_converter_convert_column_datatype_py.html deleted file mode 100644 index eb044980..00000000 --- a/cov_html/gators_converter_convert_column_datatype_py.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - Coverage for gators/converter/convert_column_datatype.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers import Transformer 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8LIST_NUMPY_NUM_DTYPES = [ 

-

9 bool, 

-

10 int, 

-

11 'np.int8', 

-

12 'np.int16', 

-

13 'np.int32', 

-

14 'np.int64', 

-

15 'np.uint8', 

-

16 'np.uint16', 

-

17 'np.uint32', 

-

18 'np.uint64', 

-

19 float, 

-

20 'np.float16', 

-

21 'np.float32', 

-

22 'np.float64', 

-

23] 

-

24 

-

25 

-

26class ConvertColumnDatatype(Transformer): 

-

27 """Set the datatype of the selected variables to a given datatype. 

-

28 

-

29 Parameters 

-

30 ---------- 

-

31 columns : List[str] 

-

32 List of columns. 

-

33 datatype: type 

-

34 Datatype to use. 

-

35 

-

36 Examples 

-

37 -------- 

-

38 

-

39 * fit & transform with pandas 

-

40 

-

41 >>> import pandas as pd 

-

42 >>> from gators.converter import ConvertColumnDatatype 

-

43 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

44 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

45 >>> obj.fit_transform(X) 

-

46 A B 

-

47 0 1. 1 

-

48 1 1. 1 

-

49 2 0. 1 

-

50 

-

51 * fit & transform with koalas 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> from gators.converter import ConvertColumnDatatype 

-

55 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

56 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

57 >>> obj.fit_transform(X) 

-

58 A B 

-

59 0 1. 1 

-

60 1 1. 1 

-

61 2 0. 1 

-

62 

-

63 * fit with pandas & transform with numpy 

-

64 

-

65 >>> import pandas as pd 

-

66 >>> from gators.converter import ConvertColumnDatatype 

-

67 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

68 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

69 >>> obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[1., 1], 

-

72 [1., 1], 

-

73 [0., 1]]) 

-

74 

-

75 * fit with koalas & transform with numpy 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.converter import ConvertColumnDatatype 

-

79 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

80 >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) 

-

81 >>> obj.fit(X) 

-

82 >>> obj.transform_numpy(X.to_numpy()) 

-

83 array([[1., 1], 

-

84 [1., 1], 

-

85 [0., 1]]) 

-

86 

-

87 """ 

-

88 

-

89 def __init__(self, columns: List[str], datatype: type): 

-

90 if not isinstance(columns, list): 

-

91 raise TypeError('`columns` should be a list.') 

-

92 if not columns: 

-

93 raise ValueError('`columns` should not be empty.') 

-

94 if type(datatype) != type and not str(datatype).startswith('datetime'): 

-

95 raise TypeError('`datatype` should be a type.') 

-

96 self.columns = columns 

-

97 self.datatype = datatype 

-

98 

-

99 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

100 y=None) -> 'ConvertColumnDatatype': 

-

101 """Fit the transformer on the dataframe X. 

-

102 

-

103 Parameters 

-

104 ---------- 

-

105 X : Union[pd.DataFrame, ks.DataFrame] 

-

106 Input dataframe. 

-

107 y : Union[pd.Series, ks.Series], default to None. 

-

108 Labels. 

-

109 

-

110 Returns 

-

111 ------- 

-

112 SetDatatype: Instance of itself. 

-

113 """ 

-

114 self.check_dataframe(X) 

-

115 return self 

-

116 

-

117 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

118 y=None) -> Union[pd.DataFrame, ks.DataFrame]: 

-

119 """Transform the dataframe `X`. 

-

120 

-

121 Parameters 

-

122 ---------- 

-

123 X : Union[pd.DataFrame, ks.DataFrame] 

-

124 Input dataframe. 

-

125 

-

126 Returns 

-

127 ------- 

-

128 Union[pd.DataFrame, ks.DataFrame] 

-

129 Transformed dataframe. 

-

130 """ 

-

131 X[self.columns] = X[self.columns].astype(self.datatype) 

-

132 return X 

-

133 

-

134 def transform_numpy(self, X: np.ndarray, 

-

135 y=None) -> np.ndarray: 

-

136 """Transform the array `X`. 

-

137 

-

138 Parameters 

-

139 ---------- 

-

140 X : np.ndarray 

-

141 Input array. 

-

142 

-

143 Returns 

-

144 ------- 

-

145 np.ndarray 

-

146 Transformed array. 

-

147 """ 

-

148 self.check_array(X) 

-

149 if self.datatype in LIST_NUMPY_NUM_DTYPES: 

-

150 return X.astype(self.datatype) 

-

151 return X.astype(object) 

-
- - - diff --git a/cov_html/gators_converter_koalas_to_pandas_py.html b/cov_html/gators_converter_koalas_to_pandas_py.html deleted file mode 100644 index 927d3a50..00000000 --- a/cov_html/gators_converter_koalas_to_pandas_py.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - Coverage for gators/converter/koalas_to_pandas.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers.transformer_xy import TransformerXY 

-

2from typing import Tuple, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class KoalasToPandas(TransformerXY): 

-

9 """Convert koalas dataframe and series to a pandas dataframe and series. 

-

10 

-

11 Examples 

-

12 --------- 

-

13 * transform with pandas 

-

14 

-

15 >>> import databricks.koalas as kspandas 

-

16 

-

17 >>> from gators.converter import KoalasToPandas 

-

18 >>> X = ks.DataFrame( 

-

19 ... {'q': {0: 0.0, 1: 3.0, 2: 6.0}, 

-

20 ... 'w': {0: 1.0, 1: 4.0, 2: 7.0}, 

-

21 ... 'e': {0: 2.0, 1: 5.0, 2: 8.0} 

-

22 }) 

-

23 >>> y = ks.Series([0, 0, 1], name='TARGET') 

-

24 >>> obj = KoalasToPandas() 

-

25 >>> obj.transform(X, y) 

-

26 ( q w e 

-

27 0 0.0 1.0 2.0 

-

28 1 3.0 4.0 5.0 

-

29 2 6.0 7.0 8.0, 0 0 

-

30 1 0 

-

31 2 1 

-

32 Name: TARGET, dtype: int64) 

-

33 

-

34 """ 

-

35 

-

36 def __init__(self): 

-

37 TransformerXY.__init__(self) 

-

38 

-

39 def transform(self, 

-

40 X: Union[pd.DataFrame, ks.DataFrame], 

-

41 y: Union[pd.Series, ks.Series], 

-

42 ) -> Tuple[np.ndarray, np.ndarray]: 

-

43 """Fit the transformer on the dataframe `X`. 

-

44 

-

45 Parameters 

-

46 ---------- 

-

47 X : Union[pd.DataFrame, ks.DataFrame]. 

-

48 Input dataframe. 

-

49 y : [pd.Series, ks.Series]: 

-

50 Target values. 

-

51 

-

52 Returns 

-

53 ------- 

-

54 X : pd.DataFrame 

-

55 Dataframe. 

-

56 y : np.ndarray 

-

57 Target values. 

-

58 """ 

-

59 if not isinstance(X, ks.DataFrame): 

-

60 raise TypeError('`X` should be a koalas dataframe') 

-

61 self.check_dataframe(X) 

-

62 self.check_y(X, y) 

-

63 return X.to_pandas(), y.to_pandas() 

-
- - - diff --git a/cov_html/gators_converter_set_column_datatype_py.html b/cov_html/gators_converter_set_column_datatype_py.html deleted file mode 100644 index be2ed9eb..00000000 --- a/cov_html/gators_converter_set_column_datatype_py.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - Coverage for gators/converter/set_column_datatype.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers import Transformer 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8LIST_NUMPY_NUM_DTYPES = [ 

-

9 bool, 

-

10 int, 

-

11 'np.int8', 

-

12 'np.int16', 

-

13 'np.int32', 

-

14 'np.int64', 

-

15 'np.uint8', 

-

16 'np.uint16', 

-

17 'np.uint32', 

-

18 'np.uint64', 

-

19 float, 

-

20 'np.float16', 

-

21 'np.float32', 

-

22 'np.float64', 

-

23] 

-

24 

-

25 

-

26class SetColumnDatatype(Transformer): 

-

27 """Set the datatype of the selected variables to a given datatype. 

-

28 

-

29 Parameters 

-

30 ---------- 

-

31 columns : List[str] 

-

32 List of columns. 

-

33 datatype: type 

-

34 Datatype to use. 

-

35 

-

36 Examples 

-

37 -------- 

-

38 

-

39 * fit & transform with pandas 

-

40 

-

41 >>> import pandas as pd 

-

42 >>> from gators.converter import SetColumnDatatype 

-

43 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

44 >>> obj = SetColumnDatatype(columns=['A'], datatype=float) 

-

45 >>> obj.fit_transform(X) 

-

46 A B 

-

47 0 1. 1 

-

48 1 1. 1 

-

49 2 0. 1 

-

50 

-

51 * fit & transform with koalas 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> from gators.converter import SetColumnDatatype 

-

55 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

56 >>> obj = SetColumnDatatype(columns=['A'], datatype=float) 

-

57 >>> obj.fit_transform(X) 

-

58 A B 

-

59 0 1. 1 

-

60 1 1. 1 

-

61 2 0. 1 

-

62 

-

63 * fit with pandas & transform with numpy 

-

64 

-

65 >>> import pandas as pd 

-

66 >>> from gators.converter import SetColumnDatatype 

-

67 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

68 >>> obj = SetColumnDatatype(columns=['A'], datatype=float) 

-

69 >>> obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[1., 1], 

-

72 [1., 1], 

-

73 [0., 1]]) 

-

74 

-

75 * fit with koalas & transform with numpy 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.converter import SetColumnDatatype 

-

79 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

80 >>> obj = SetColumnDatatype(columns=['A'], datatype=float) 

-

81 >>> obj.fit(X) 

-

82 >>> obj.transform_numpy(X.to_numpy()) 

-

83 array([[1., 1], 

-

84 [1., 1], 

-

85 [0., 1]]) 

-

86 

-

87 """ 

-

88 

-

89 def __init__(self, columns: List[str], datatype: type): 

-

90 if not isinstance(columns, list): 

-

91 raise TypeError('`columns` should be a list.') 

-

92 if not columns: 

-

93 raise ValueError('`columns` should not be empty.') 

-

94 if type(datatype) != type and not str(datatype).startswith('datetime'): 

-

95 raise TypeError('`datatype` should be a type.') 

-

96 self.columns = columns 

-

97 self.datatype = datatype 

-

98 

-

99 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

100 y=None) -> 'SetColumnDatatype': 

-

101 """Fit the transformer on the dataframe X. 

-

102 

-

103 Parameters 

-

104 ---------- 

-

105 X : Union[pd.DataFrame, ks.DataFrame] 

-

106 Input dataframe. 

-

107 y : Union[pd.Series, ks.Series], default to None. 

-

108 Labels. 

-

109 

-

110 Returns 

-

111 ------- 

-

112 SetDatatype: Instance of itself. 

-

113 """ 

-

114 self.check_dataframe(X) 

-

115 return self 

-

116 

-

117 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

118 y=None) -> Union[pd.DataFrame, ks.DataFrame]: 

-

119 """Transform the dataframe `X`. 

-

120 

-

121 Parameters 

-

122 ---------- 

-

123 X : Union[pd.DataFrame, ks.DataFrame] 

-

124 Input dataframe. 

-

125 

-

126 Returns 

-

127 ------- 

-

128 Union[pd.DataFrame, ks.DataFrame] 

-

129 Transformed dataframe. 

-

130 """ 

-

131 X[self.columns] = X[self.columns].astype(self.datatype) 

-

132 return X 

-

133 

-

134 def transform_numpy(self, X: np.ndarray, 

-

135 y=None) -> np.ndarray: 

-

136 """Transform the array `X`. 

-

137 

-

138 Parameters 

-

139 ---------- 

-

140 X : np.ndarray 

-

141 Input array. 

-

142 

-

143 Returns 

-

144 ------- 

-

145 np.ndarray 

-

146 Transformed array. 

-

147 """ 

-

148 self.check_array(X) 

-

149 if self.datatype in LIST_NUMPY_NUM_DTYPES: 

-

150 return X.astype(self.datatype) 

-

151 return X.astype(object) 

-
- - - diff --git a/cov_html/gators_converter_to_numpy_py.html b/cov_html/gators_converter_to_numpy_py.html deleted file mode 100644 index a9994592..00000000 --- a/cov_html/gators_converter_to_numpy_py.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - Coverage for gators/converter/to_numpy.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers.transformer_xy import TransformerXY 

-

2from typing import Tuple, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class ToNumpy(TransformerXY): 

-

9 """Convert dataframe and series to NumPy arrays. 

-

10 

-

11 Examples 

-

12 --------- 

-

13 * transform with pandas 

-

14 

-

15 >>> import pandas as pd 

-

16 >>> from gators.converter.to_numpy import ToNumPy 

-

17 

-

18 >>> X = pd.DataFrame( 

-

19 ... {'q': {0: 0.0, 1: 3.0, 2: 6.0}, 

-

20 ... 'w': {0: 1.0, 1: 4.0, 2: 7.0}, 

-

21 ... 'e': {0: 2.0, 1: 5.0, 2: 8.0}}) 

-

22 >>> y = pd.Series([0, 0, 1], name='TARGET') 

-

23 >>> obj = ToNumpy() 

-

24 >>> obj.transform(X, y) 

-

25 (array([[0., 1., 2.], 

-

26 [3., 4., 5.], 

-

27 [6., 7., 8.]]), array([0, 0, 1])) 

-

28 

-

29 * transform with koalas 

-

30 

-

31 >>> import databricks.koalas as ks 

-

32 >>> from gators.converter.to_numpy import ToNumPy 

-

33 

-

34 >>> X = ks.DataFrame( 

-

35 ... {'q': {0: 0.0, 1: 3.0, 2: 6.0}, 

-

36 ... 'w': {0: 1.0, 1: 4.0, 2: 7.0}, 

-

37 ... 'e': {0: 2.0, 1: 5.0, 2: 8.0}}) 

-

38 >>> y = ks.Series([0, 0, 1], name='TARGET') 

-

39 >>> obj = ToNumpy() 

-

40 >>> obj.transform(X, y) 

-

41 (array([[0., 1., 2.], 

-

42 [3., 4., 5.], 

-

43 [6., 7., 8.]]), array([0, 0, 1])) 

-

44 

-

45 """ 

-

46 

-

47 def __init__(self): 

-

48 TransformerXY.__init__(self) 

-

49 

-

50 def transform(self, 

-

51 X: Union[pd.DataFrame, ks.DataFrame], 

-

52 y: Union[pd.Series, ks.Series], 

-

53 ) -> Tuple[np.ndarray, np.ndarray]: 

-

54 """Fit the transformer on the dataframe `X`. 

-

55 

-

56 Parameters 

-

57 ---------- 

-

58 X : Union[pd.DataFrame, ks.DataFrame]. 

-

59 Dataframe. 

-

60 y : [pd.Series, ks.Series]: 

-

61 Target values. 

-

62 

-

63 Returns 

-

64 ------- 

-

65 X : np.ndarray 

-

66 Array. 

-

67 y : np.ndarray 

-

68 Target values. 

-

69 """ 

-

70 self.check_dataframe(X) 

-

71 self.check_y(X, y) 

-

72 return X.to_numpy(), y.to_numpy() 

-
- - - diff --git a/cov_html/gators_data_cleaning__base_data_cleaning_py.html b/cov_html/gators_data_cleaning__base_data_cleaning_py.html deleted file mode 100644 index b51b9bb9..00000000 --- a/cov_html/gators_data_cleaning__base_data_cleaning_py.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/_base_data_cleaning.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Union 

-

5from abc import ABC 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class _BaseDataCleaning(Transformer, ABC): 

-

12 """Base data cleaning transformer.""" 

-

13 

-

14 def __init__(self): 

-

15 Transformer.__init__(self) 

-

16 self.columns_to_drop: List[str] = [] 

-

17 self.columns_to_keep: List[str] = [] 

-

18 self.idx_columns_to_keep = np.array([]) 

-

19 

-

20 def transform(self, X: Union[pd.DataFrame, ks.DataFrame] 

-

21 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

22 """Transform the dataframe `X`. 

-

23 

-

24 Parameters 

-

25 ---------- 

-

26 X : Union[pd.DataFrame, ks.DataFrame] 

-

27 Input dataset. 

-

28 

-

29 Returns 

-

30 ------- 

-

31 Union[pd.DataFrame, ks.DataFrame] 

-

32 Dataset without datetime columns. 

-

33 """ 

-

34 self.check_dataframe(X) 

-

35 if len(self.columns): 

-

36 return X.drop(self.columns, axis=1) 

-

37 return X 

-

38 

-

39 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

40 """Transform the NumPy array `X`. 

-

41 

-

42 Parameters 

-

43 ---------- 

-

44 X : np.ndarray 

-

45 Input array. 

-

46 

-

47 Returns 

-

48 ------- 

-

49 np.ndarray 

-

50 Transformed array. 

-

51 """ 

-

52 self.check_array(X) 

-

53 return X[:, self.idx_columns_to_keep] 

-

54 

-

55 @ staticmethod 

-

56 def get_idx_columns_to_keep( 

-

57 columns: List[str], columns_to_drop: List[str]) -> np.array: 

-

58 """Get the column indices to keep. 

-

59 

-

60 Parameters 

-

61 ---------- 

-

62 columns : List[str] 

-

63 List of columns of a dataset. 

-

64 columns_to_drop : List[str] 

-

65 List of columns to drop. 

-

66 

-

67 Returns 

-

68 ------- 

-

69 np.array: 

-

70 Column indices to keep. 

-

71 """ 

-

72 idx_columns_to_keep = util.exclude_idx_columns( 

-

73 columns=columns, 

-

74 excluded_columns=columns_to_drop, 

-

75 ) 

-

76 return idx_columns_to_keep 

-
- - - diff --git a/cov_html/gators_data_cleaning_drop_columns_py.html b/cov_html/gators_data_cleaning_drop_columns_py.html deleted file mode 100644 index 13f3cc0f..00000000 --- a/cov_html/gators_data_cleaning_drop_columns_py.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/drop_columns.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_data_cleaning import _BaseDataCleaning 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropColumns(_BaseDataCleaning): 

-

10 """Drop the columns given by the user. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 columns : List[str] 

-

15 List of columns to drop. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with pandas 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.data_cleaning import DropColumns 

-

23 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

24 >>> obj = DropColumns(['B']) 

-

25 >>> obj.fit_transform(X) 

-

26 A 

-

27 0 1 

-

28 1 2 

-

29 2 3 

-

30 

-

31 * fit & transform with koalas 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.data_cleaning import DropColumns 

-

35 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

36 >>> obj = DropColumns(['B']) 

-

37 >>> obj.fit_transform(X) 

-

38 A 

-

39 0 1 

-

40 1 2 

-

41 2 3 

-

42 

-

43 * fit with pandas & transform with numpy 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.data_cleaning import DropColumns 

-

47 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

48 >>> obj = DropColumns(['B']) 

-

49 >>> obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([[1], 

-

52 [2], 

-

53 [3]]) 

-

54 

-

55 * fit with koalas & transform with numpy 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.data_cleaning import DropColumns 

-

59 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

60 >>> obj = DropColumns(['B']) 

-

61 >>> obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[1], 

-

64 [2], 

-

65 [3]]) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, columns): 

-

70 if not isinstance(columns, list): 

-

71 raise TypeError('`columns` should be a list.') 

-

72 

-

73 _BaseDataCleaning.__init__(self) 

-

74 self.columns = columns 

-

75 

-

76 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y=None) -> 'DropColumns': 

-

78 """Fit the transformer on the dataframe X. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : Union[pd.Series, ks.Series], default to None. 

-

88 Labels. 

-

89 

-

90 Returns 

-

91 ------- 

-

92 DropColumns: Instance of itself. 

-

93 """ 

-

94 self.check_dataframe(X) 

-

95 self.columns_to_keep = util.exclude_columns( 

-

96 columns=X.columns, 

-

97 excluded_columns=self.columns) 

-

98 self.idx_columns_to_keep = util.exclude_idx_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns 

-

101 ) 

-

102 return self 

-
- - - diff --git a/cov_html/gators_data_cleaning_drop_datatype_columns_py.html b/cov_html/gators_data_cleaning_drop_datatype_columns_py.html deleted file mode 100644 index d0875b28..00000000 --- a/cov_html/gators_data_cleaning_drop_datatype_columns_py.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/drop_datatype_columns.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_data_cleaning import _BaseDataCleaning 

-

3from ..util import util 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropDatatypeColumns(_BaseDataCleaning): 

-

10 """Drop the columns belonging to a given datatype. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 dtype : type 

-

15 Colum datatype to drop. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with pandas 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.data_cleaning import DropDatatypeColumns 

-

23 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

24 >>> obj = DropDatatypeColumns(float) 

-

25 >>> obj.fit_transform(X) 

-

26 A 

-

27 0 1 

-

28 1 2 

-

29 2 3 

-

30 

-

31 * fit & transform with koalas 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.data_cleaning import DropDatatypeColumns 

-

35 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

36 >>> obj = DropDatatypeColumns(float) 

-

37 >>> obj.fit_transform(X) 

-

38 A 

-

39 0 1 

-

40 1 2 

-

41 2 3 

-

42 

-

43 * fit with pandas & transform with numpy 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.data_cleaning import DropDatatypeColumns 

-

47 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

48 >>> obj = DropDatatypeColumns(float) 

-

49 >>> obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([[1.], 

-

52 [2.], 

-

53 [3.]]) 

-

54 

-

55 * fit with koalas & transform with numpy 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.data_cleaning import DropDatatypeColumns 

-

59 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) 

-

60 >>> obj = DropDatatypeColumns(float) 

-

61 >>> obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[1.], 

-

64 [2.], 

-

65 [3.]]) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, dtype: type): 

-

70 if not isinstance(dtype, type): 

-

71 raise TypeError('`dtype` should be a type.') 

-

72 _BaseDataCleaning.__init__(self) 

-

73 self.dtype = dtype 

-

74 

-

75 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

76 y=None) -> 'DropDatatypeColumns': 

-

77 """Fit the transformer on the dataframe X. 

-

78 

-

79 Get the list of column names to remove and the array of 

-

80 indices to be kept. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 X : Union[pd.DataFrame, ks.DataFrame] 

-

85 Input dataframe. 

-

86 y : None 

-

87 None 

-

88 Returns 

-

89 ------- 

-

90 DropDatatypeColumns: Instance of itself. 

-

91 """ 

-

92 self.check_dataframe(X) 

-

93 self.columns = util.get_datatype_columns(X, self.dtype) 

-

94 self.columns_to_keep = util.exclude_columns( 

-

95 columns=X.columns, 

-

96 excluded_columns=self.columns) 

-

97 self.idx_columns_to_keep = util.exclude_idx_columns( 

-

98 columns=X.columns, 

-

99 excluded_columns=self.columns) 

-

100 return self 

-
- - - diff --git a/cov_html/gators_data_cleaning_drop_high_cardinality_py.html b/cov_html/gators_data_cleaning_drop_high_cardinality_py.html deleted file mode 100644 index 3a99916a..00000000 --- a/cov_html/gators_data_cleaning_drop_high_cardinality_py.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/drop_high_cardinality.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_data_cleaning import _BaseDataCleaning 

-

3from ..util import util 

-

4from typing import List, Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropHighCardinality(_BaseDataCleaning): 

-

10 """Drop the categorical columns having a large cardinality. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 max_categories : int 

-

15 Maximum number of categories allowed. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with pandas 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.data_cleaning import DropColumns 

-

23 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

24 >>> obj = DropColumns(['B']) 

-

25 >>> obj.fit_transform(X) 

-

26 A 

-

27 0 1 

-

28 1 2 

-

29 2 3 

-

30 

-

31 * fit & transform with koalas 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.data_cleaning import DropColumns 

-

35 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

36 >>> obj = DropColumns(['B']) 

-

37 >>> obj.fit_transform(X) 

-

38 A 

-

39 0 1 

-

40 1 2 

-

41 2 3 

-

42 

-

43 * fit with pandas & transform with numpy 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.data_cleaning import DropColumns 

-

47 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

48 >>> obj = DropColumns(['B']) 

-

49 >>> obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([[1], 

-

52 [2], 

-

53 [3]]) 

-

54 

-

55 * fit with koalas & transform with numpy 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.data_cleaning import DropColumns 

-

59 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

60 >>> obj = DropColumns(['B']) 

-

61 >>> obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[1], 

-

64 [2], 

-

65 [3]]) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, max_categories: int): 

-

70 if not isinstance(max_categories, int): 

-

71 raise TypeError('`max_categories` should be an int.') 

-

72 _BaseDataCleaning.__init__(self) 

-

73 self.max_categories = max_categories 

-

74 

-

75 def fit(self, 

-

76 X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y: Union[pd.Series, ks.Series] = None) -> 'DropHighCardinality': 

-

78 """Fit the transformer on the dataframe `X`. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : None 

-

88 None 

-

89 Returns 

-

90 ------- 

-

91 DropHighCardinality: Instance of itself. 

-

92 """ 

-

93 self.check_dataframe(X) 

-

94 self.columns = self.get_columns_to_drop( 

-

95 X=X, 

-

96 max_categories=self.max_categories 

-

97 ) 

-

98 self.columns_to_keep = util.exclude_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns, 

-

101 ) 

-

102 self.idx_columns_to_keep = self.get_idx_columns_to_keep( 

-

103 columns=X.columns, 

-

104 columns_to_drop=self.columns, 

-

105 ) 

-

106 return self 

-

107 

-

108 @ staticmethod 

-

109 def get_columns_to_drop( 

-

110 X: Union[pd.DataFrame, ks.DataFrame], 

-

111 max_categories: int) -> List[str]: 

-

112 """Get the column names to drop. 

-

113 

-

114 Parameters 

-

115 ---------- 

-

116 X_nunique : pd.DataFrame 

-

117 Input dataframe. 

-

118 max_categories : int 

-

119 Maximum number of categories allowed. 

-

120 

-

121 Returns 

-

122 ------- 

-

123 List[str] 

-

124 List of column names to drop. 

-

125 """ 

-

126 object_columns = util.get_datatype_columns(X, object) 

-

127 if not object_columns: 

-

128 return [] 

-

129 if isinstance(X, pd.DataFrame): 

-

130 X_nunique = X[object_columns].nunique() 

-

131 else: 

-

132 X_nunique = X[object_columns].nunique(approx=True) 

-

133 mask_columns = X_nunique > max_categories 

-

134 columns_to_drop = X_nunique[mask_columns].index 

-

135 return list(columns_to_drop.to_numpy()) 

-
- - - diff --git a/cov_html/gators_data_cleaning_drop_high_nan_ratio_py.html b/cov_html/gators_data_cleaning_drop_high_nan_ratio_py.html deleted file mode 100644 index 442019df..00000000 --- a/cov_html/gators_data_cleaning_drop_high_nan_ratio_py.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/drop_high_nan_ratio.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ..util import util 

-

6from ._base_data_cleaning import _BaseDataCleaning 

-

7 

-

8 

-

9class DropHighNaNRatio(_BaseDataCleaning): 

-

10 """Drop the columns having a large NaN values ratio. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 max_ratio : float 

-

15 Max nan ratio allowed. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * fit & transform with pandas 

-

21 

-

22 >>> import numpy as np 

-

23 >>> import pandas as pd 

-

24 >>> from gators.data_cleaning import DropHighNaNRatio 

-

25 >>> X = pd.DataFrame( 

-

26 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

27 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

28 >>> obj.fit_transform(X) 

-

29 A 

-

30 0 1 

-

31 1 2 

-

32 2 3 

-

33 

-

34 * fit & transform with koalas 

-

35 

-

36 >>> import numpy as np 

-

37 >>> import databricks.koalas as ks 

-

38 >>> from gators.data_cleaning import DropHighNaNRatio 

-

39 >>> X = ks.DataFrame( 

-

40 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

41 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

42 >>> obj.fit_transform(X) 

-

43 A 

-

44 0 1 

-

45 1 2 

-

46 2 3 

-

47 

-

48 * fit with pandas & transform with numpy 

-

49 

-

50 >>> import numpy as np 

-

51 >>> import pandas as pd 

-

52 >>> from gators.data_cleaning import DropHighNaNRatio 

-

53 >>> X = pd.DataFrame( 

-

54 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

55 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

56 >>> obj.fit(X) 

-

57 >>> obj.transform_numpy(X.to_numpy()) 

-

58 array([[1], 

-

59 [2], 

-

60 [3]], dtype=object) 

-

61 

-

62 * fit with koalas & transform with numpy 

-

63 

-

64 >>> import numpy as np 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.data_cleaning import DropHighNaNRatio 

-

67 >>> X = ks.DataFrame( 

-

68 ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) 

-

69 >>> obj = DropHighNaNRatio(max_ratio=0.5) 

-

70 >>> obj.fit(X) 

-

71 >>> obj.transform_numpy(X.to_numpy()) 

-

72 array([[1], 

-

73 [2], 

-

74 [3]], dtype=object) 

-

75 

-

76 """ 

-

77 

-

78 def __init__(self, max_ratio: float): 

-

79 if not isinstance(max_ratio, float): 

-

80 raise TypeError('`max_ratio` should be a float.') 

-

81 _BaseDataCleaning.__init__(self) 

-

82 self.max_ratio = max_ratio 

-

83 

-

84 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

85 y=None) -> 'DropHighNaNRatio': 

-

86 """Fit the transformer on the dataframe X. 

-

87 

-

88 Get the list of column names to remove and the array of 

-

89 indices to be kept. 

-

90 

-

91 Parameters 

-

92 ---------- 

-

93 X : Union[pd.DataFrame, ks.DataFrame] 

-

94 Input dataframe. 

-

95 y : None 

-

96 None 

-

97 

-

98 Returns 

-

99 ------- 

-

100 DropHighNaNRatio: Instance of itself. 

-

101 """ 

-

102 self.check_dataframe(X) 

-

103 self.columns = self.get_columns_to_drop( 

-

104 X=X, 

-

105 max_ratio=self.max_ratio) 

-

106 self.columns_to_keep = util.exclude_columns( 

-

107 columns=list(X.columns), 

-

108 excluded_columns=self.columns) 

-

109 self.idx_columns_to_keep = self.get_idx_columns_to_keep( 

-

110 columns=X.columns, 

-

111 columns_to_drop=self.columns) 

-

112 return self 

-

113 

-

114 @staticmethod 

-

115 def get_columns_to_drop( 

-

116 X: Union[pd.DataFrame, ks.DataFrame], 

-

117 max_ratio: float) -> List[str]: 

-

118 """Get the list of column names to drop. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 X : pd.DataFrame 

-

123 Input dataset. 

-

124 max_ratio : float 

-

125 Max nan ratio allowed. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 List[str] 

-

130 List of column names to drop. 

-

131 """ 

-

132 mask_columns = X.isnull().mean() > max_ratio 

-

133 columns_to_drop = mask_columns[mask_columns].index 

-

134 if isinstance(columns_to_drop, ks.indexes.Index): 

-

135 columns_to_drop = columns_to_drop.to_pandas() 

-

136 return columns_to_drop 

-
- - - diff --git a/cov_html/gators_data_cleaning_drop_low_cardinality_py.html b/cov_html/gators_data_cleaning_drop_low_cardinality_py.html deleted file mode 100644 index ef0e67ec..00000000 --- a/cov_html/gators_data_cleaning_drop_low_cardinality_py.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/drop_low_cardinality.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_data_cleaning import _BaseDataCleaning 

-

4from typing import List, Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class DropLowCardinality(_BaseDataCleaning): 

-

10 """Drop the catgorical columns having a low cardinality. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 min_categories : int 

-

15 Min categories allowed. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * fit & transform with pandas 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.data_cleaning import DropLowCardinality 

-

24 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}, dtype=object) 

-

25 >>> obj = DropLowCardinality(max_categories=2) 

-

26 >>> obj.fit_transform(X) 

-

27 B 

-

28 0 1 

-

29 1 1 

-

30 2 1 

-

31 

-

32 * fit & transform with koalas 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.data_cleaning import DropLowCardinality 

-

36 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}, dtype=object) 

-

37 >>> obj = DropLowCardinality(max_categories=2) 

-

38 >>> obj.fit_transform(X) 

-

39 B 

-

40 0 1 

-

41 1 1 

-

42 2 1 

-

43 

-

44 * fit with pandas & transform with numpy 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.data_cleaning import DropLowCardinality 

-

48 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}, dtype=object) 

-

49 >>> obj = DropLowCardinality(max_categories=2) 

-

50 >>> obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([[1], 

-

53 [1], 

-

54 [1]]) 

-

55 

-

56 * fit with koalas & transform with numpy 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.data_cleaning import DropLowCardinality 

-

60 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}, dtype=object) 

-

61 >>> obj = DropLowCardinality(max_categories=2) 

-

62 >>> obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([[1], 

-

65 [1], 

-

66 [1]]) 

-

67 

-

68 """ 

-

69 

-

70 def __init__(self, min_categories: int): 

-

71 if not isinstance(min_categories, int): 

-

72 raise TypeError('`min_categories` should be an int.') 

-

73 _BaseDataCleaning.__init__(self) 

-

74 self.min_categories: int = min_categories 

-

75 

-

76 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y=None) -> 'DropLowCardinality': 

-

78 """Fit the transformer on the dataframe X. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : None 

-

88 None 

-

89 Returns 

-

90 ------- 

-

91 DropLowCardinality: Instance of itself. 

-

92 """ 

-

93 self.check_dataframe(X) 

-

94 self.columns = self.get_columns_to_drop( 

-

95 X=X, 

-

96 min_categories=self.min_categories 

-

97 ) 

-

98 self.columns_to_keep = util.exclude_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns, 

-

101 ) 

-

102 self.idx_columns_to_keep = self.get_idx_columns_to_keep( 

-

103 columns=X.columns, 

-

104 columns_to_drop=self.columns) 

-

105 return self 

-

106 

-

107 @staticmethod 

-

108 def get_columns_to_drop( 

-

109 X: Union[pd.DataFrame, ks.DataFrame], 

-

110 min_categories: float) -> List[str]: 

-

111 """Get the list of column names to remove. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : pd.DataFrame 

-

116 Input dataset. 

-

117 min_categories : int 

-

118 Min categories allowed. 

-

119 

-

120 Returns 

-

121 ------- 

-

122 List[str] 

-

123 List of column names to drop. 

-

124 """ 

-

125 object_columns = util.get_datatype_columns(X, 'object') 

-

126 if isinstance(X, pd.DataFrame): 

-

127 X_nunique = X[object_columns].nunique() 

-

128 else: 

-

129 X_nunique = X[object_columns].nunique(approx=True) 

-

130 mask_columns = X_nunique < min_categories 

-

131 columns_to_drop = mask_columns[mask_columns].index 

-

132 return list(columns_to_drop.to_numpy()) 

-
- - - diff --git a/cov_html/gators_data_cleaning_keep_columns_py.html b/cov_html/gators_data_cleaning_keep_columns_py.html deleted file mode 100644 index 48f24ef7..00000000 --- a/cov_html/gators_data_cleaning_keep_columns_py.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/keep_columns.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_data_cleaning import _BaseDataCleaning 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class KeepColumns(_BaseDataCleaning): 

-

10 """Drop the columns which are not given by the user. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 columns_to_keep : List[str] 

-

15 List of columns. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * fit & transform with pandas 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.data_cleaning import KeepColumns 

-

24 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

25 >>> obj = KeepColumns(['A']) 

-

26 >>> obj.fit_transform(X) 

-

27 A 

-

28 0 1 

-

29 1 2 

-

30 2 3 

-

31 

-

32 * fit & transform with koalas 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.data_cleaning import KeepColumns 

-

36 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

37 >>> obj = KeepColumns(['A']) 

-

38 >>> obj.fit_transform(X) 

-

39 A 

-

40 0 1 

-

41 1 2 

-

42 2 3 

-

43 

-

44 * fit with pandas & transform with numpy 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.data_cleaning import KeepColumns 

-

48 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

49 >>> obj = KeepColumns(['A']) 

-

50 >>> obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([[1], 

-

53 [2], 

-

54 [3]]) 

-

55 

-

56 * fit with koalas & transform with numpy 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.data_cleaning import KeepColumns 

-

60 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

61 >>> obj = KeepColumns(['A']) 

-

62 >>> obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([[1], 

-

65 [2], 

-

66 [3]]) 

-

67 

-

68 """ 

-

69 

-

70 def __init__(self, columns_to_keep): 

-

71 if not isinstance(columns_to_keep, list): 

-

72 raise TypeError('`columns_to_keep` should be a list.') 

-

73 _BaseDataCleaning.__init__(self) 

-

74 self.columns_to_keep = columns_to_keep 

-

75 

-

76 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y=None) -> 'KeepColumns': 

-

78 """Fit the transformer on the dataframe X. 

-

79 

-

80 Get the list of column names to remove and the array of 

-

81 indices to be kept. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : Union[pd.Series, ks.Series], default to None. 

-

88 Labels. 

-

89 

-

90 Returns 

-

91 ------- 

-

92 KeepColumns: Instance of itself. 

-

93 """ 

-

94 self.check_dataframe(X) 

-

95 self.columns = util.exclude_columns( 

-

96 columns=X.columns, 

-

97 excluded_columns=self.columns_to_keep) 

-

98 self.idx_columns_to_keep = util.exclude_idx_columns( 

-

99 columns=X.columns, 

-

100 excluded_columns=self.columns 

-

101 ) 

-

102 return self 

-
- - - diff --git a/cov_html/gators_data_cleaning_replace_py.html b/cov_html/gators_data_cleaning_replace_py.html deleted file mode 100644 index 91831758..00000000 --- a/cov_html/gators_data_cleaning_replace_py.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - Coverage for gators/data_cleaning/replace.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ..transformers.transformer import Transformer 

-

4from typing import Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from data_cleaning import replace 

-

9 

-

10 

-

11class Replace(Transformer): 

-

12 """Replace the categorical values by the ones given by the user. 

-

13 

-

14 The transformer only accepts categorical columns. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 to_replace_dict: Dict[str, Dict[str, str]] 

-

19 The dictionary keys are the columns and the dictionary values 

-

20 are the `to_replace` dictionary. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 * fit & transform with pandas 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.data_cleaning import Replace 

-

28 >>> X = pd.DataFrame( 

-

29 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

30 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

31 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

32 >>> obj.fit_transform(X) 

-

33 A B C 

-

34 0 X Y 1 

-

35 1 Z e 2 

-

36 2 c f 3 

-

37 

-

38 * fit & transform with koalas 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.data_cleaning import Replace 

-

42 >>> X = ks.DataFrame( 

-

43 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

44 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

45 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

46 >>> obj.fit_transform(X) 

-

47 A B C 

-

48 0 X Y 1 

-

49 1 Z e 2 

-

50 2 c f 3 

-

51 

-

52 * fit with pandas & transform with numpy 

-

53 

-

54 >>> import pandas as pd 

-

55 >>> from gators.data_cleaning import Replace 

-

56 >>> X = pd.DataFrame( 

-

57 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

58 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

59 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

60 >>> obj.fit(X) 

-

61 >>> obj.transform_numpy(X.to_numpy()) 

-

62 array([['X', 'Y', 1], 

-

63 ['Z', 'e', 2], 

-

64 ['c', 'f', 3]], dtype=object) 

-

65 

-

66 * fit with koalas & transform with numpy 

-

67 

-

68 >>> import databricks.koalas as ks 

-

69 >>> from gators.data_cleaning import Replace 

-

70 >>> X = ks.DataFrame( 

-

71 ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) 

-

72 >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} 

-

73 >>> obj = Replace(to_replace_dict=to_replace_dict) 

-

74 >>> obj.fit(X) 

-

75 >>> obj.transform_numpy(X.to_numpy()) 

-

76 array([['X', 'Y', 1], 

-

77 ['Z', 'e', 2], 

-

78 ['c', 'f', 3]], dtype=object) 

-

79 

-

80 

-

81 """ 

-

82 

-

83 def __init__(self, to_replace_dict: Dict[str, Dict[str, str]]): 

-

84 if not isinstance(to_replace_dict, dict): 

-

85 raise TypeError('`to_replace_dict` should be a dict.') 

-

86 Transformer.__init__(self) 

-

87 self.to_replace_dict = to_replace_dict 

-

88 self.columns = list(to_replace_dict.keys()) 

-

89 n_cols = len(self.columns) 

-

90 n_rows = max([len(v) for v in self.to_replace_dict.values()]) 

-

91 self.to_replace_np_keys = np.empty((n_cols, n_rows), object) 

-

92 self.to_replace_np_vals = np.empty((n_cols, n_rows), object) 

-

93 self.n_elements_vec = np.empty(n_cols, int) 

-

94 for i, col in enumerate(self.to_replace_dict): 

-

95 n_elements = len(self.to_replace_dict[col]) 

-

96 self.n_elements_vec[i] = n_elements 

-

97 self.to_replace_np_keys[i, :n_elements] = list( 

-

98 self.to_replace_dict[col].keys())[:n_elements] 

-

99 self.to_replace_np_vals[i, :n_elements] = list( 

-

100 self.to_replace_dict[col].values())[:n_elements] 

-

101 

-

102 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

103 y=None) -> 'Replace': 

-

104 """Fit the transformer on the dataframe X. 

-

105 

-

106 Get the list of column names to remove and the array of 

-

107 indices to be kept. 

-

108 

-

109 Parameters 

-

110 ---------- 

-

111 X : Union[pd.DataFrame, ks.DataFrame] 

-

112 Input dataframe. 

-

113 y : Union[pd.Series, ks.Series], default to None. 

-

114 Labels. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 Replace: Instance of itself. 

-

119 """ 

-

120 self.check_dataframe(X) 

-

121 self.check_nans(X, self.columns) 

-

122 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

123 return self 

-

124 

-

125 def transform(self, X: Union[pd.DataFrame, ks.DataFrame] 

-

126 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

127 """Transform the dataframe `X`. 

-

128 

-

129 Parameters 

-

130 ---------- 

-

131 X : Union[pd.DataFrame, ks.DataFrame]. 

-

132 Input dataframe. 

-

133 

-

134 Returns 

-

135 ------- 

-

136 Union[pd.DataFrame, ks.DataFrame] 

-

137 Transformed dataframe. 

-

138 """ 

-

139 self.check_dataframe(X) 

-

140 

-

141 def f(x, to_replace_dict, columns): 

-

142 name = x.name 

-

143 if name not in columns: 

-

144 return x 

-

145 return x.replace(to_replace_dict[name]) 

-

146 return X.apply(f, args=(self.to_replace_dict, self.columns)) 

-

147 

-

148 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

149 """Transform the NumPy array `X`. 

-

150 

-

151 Parameters 

-

152 ---------- 

-

153 X : np.ndarray 

-

154 Input array. 

-

155 

-

156 Returns 

-

157 ------- 

-

158 np.ndarray 

-

159 Transformed array. 

-

160 """ 

-

161 self.check_array(X) 

-

162 return replace( 

-

163 X, self.idx_columns, 

-

164 self.to_replace_np_keys, 

-

165 self.to_replace_np_vals, 

-

166 self.n_elements_vec) 

-
- - - diff --git a/cov_html/gators_encoders__base_encoder_py.html b/cov_html/gators_encoders__base_encoder_py.html deleted file mode 100644 index 3dfc22a4..00000000 --- a/cov_html/gators_encoders__base_encoder_py.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - Coverage for gators/encoders/_base_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from encoder import encoder 

-

3from ..transformers.transformer import Transformer 

-

4from typing import List, Tuple, Union, Dict, Collection, Any 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from ..transformers.transformer import NUMERICS_DTYPES 

-

9from ..transformers.transformer import PRINT_NUMERICS_DTYPES 

-

10 

-

11 

-

12class _BaseEncoder(Transformer): 

-

13 """Base encoder transformer class. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 dtype : type, default to np.float64. 

-

18 Numerical datatype of the output data. 

-

19 

-

20 """ 

-

21 

-

22 def __init__(self, dtype=np.float64): 

-

23 if dtype not in NUMERICS_DTYPES: 

-

24 raise TypeError( 

-

25 f'`dtype` should be a dtype from {PRINT_NUMERICS_DTYPES}.') 

-

26 Transformer.__init__(self) 

-

27 self.dtype = dtype 

-

28 self.columns = [] 

-

29 self.idx_columns: np.ndarray = None 

-

30 self.num_categories_vec = np.array([]) 

-

31 self.values_vec = np.array([]) 

-

32 self.encoded_values_vec = np.array([]) 

-

33 self.mapping: Dict[str, Collection[Any]] = {} 

-

34 self.X_dtypes: Union[pd.DataFrame, ks.DataFrame] = None 

-

35 

-

36 def transform(self, 

-

37 X: Union[pd.DataFrame, ks.DataFrame] 

-

38 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

39 """Transform the dataframe `X`. 

-

40 

-

41 Parameters 

-

42 ---------- 

-

43 X : Union[pd.DataFrame, ks.DataFrame]. 

-

44 Input dataframe. 

-

45 

-

46 Returns 

-

47 ------- 

-

48 Union[pd.DataFrame, ks.DataFrame] 

-

49 Transformed dataframe. 

-

50 """ 

-

51 self.check_dataframe(X) 

-

52 

-

53 def f(x) -> ks.Series[self.dtype]: 

-

54 x_name = x.name 

-

55 if x_name not in self.mapping: 

-

56 return x.astype(self.dtype) 

-

57 return x.replace(self.mapping[x_name]).astype(self.dtype) 

-

58 return X.apply(f) 

-

59 

-

60 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

61 """Transform the input array. 

-

62 

-

63 Parameters 

-

64 ---------- 

-

65 X : np.ndarray 

-

66 Input array. 

-

67 

-

68 Returns 

-

69 ------- 

-

70 np.ndarray: Encoded array. 

-

71 """ 

-

72 self.check_array(X) 

-

73 if len(self.idx_columns) == 0: 

-

74 return X.astype(self.dtype) 

-

75 return encoder( 

-

76 X, 

-

77 self.num_categories_vec, 

-

78 self.values_vec, 

-

79 self.encoded_values_vec, 

-

80 self.idx_columns, 

-

81 ).astype(self.dtype) 

-

82 

-

83 @ staticmethod 

-

84 def decompose_mapping( 

-

85 mapping: List[Dict[str, Collection[Any]]], 

-

86 ) -> Tuple[List[str], np.ndarray, np.ndarray]: 

-

87 """Decompose the mapping. 

-

88 

-

89 Parameters 

-

90 ---------- 

-

91 mapping List[Dict[str, Collection[Any]]]: 

-

92 Mapping obtained from the categorical encoder package. 

-

93 

-

94 Returns 

-

95 ------- 

-

96 Tuple[List[str], np.ndarray, np.ndarray] 

-

97 Decomposed mapping. 

-

98 """ 

-

99 columns = list(mapping.keys()) 

-

100 n_columns = len(columns) 

-

101 max_categories = max([len(m) for m in mapping.values()]) 

-

102 encoded_values_vec = np.zeros((n_columns, max_categories)) 

-

103 values_vec = np.zeros( 

-

104 (n_columns, max_categories), dtype=object 

-

105 ) 

-

106 for i, c in enumerate(columns): 

-

107 mapping_col = mapping[c] 

-

108 n_values = len(mapping_col) 

-

109 encoded_values_vec[i, :n_values] = np.array( 

-

110 list(mapping_col.values())) 

-

111 values_vec[i, :n_values] = np.array( 

-

112 list(mapping_col.keys())) 

-

113 return columns, values_vec, encoded_values_vec 

-

114 

-

115 @staticmethod 

-

116 def check_y_dtype(y: Union[pd.Series, ks.Series], 

-

117 dtype: type): 

-

118 """Raise an error if the target datatype is not expected. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 y : Union[pd.Series, ks.Series] 

-

123 Target values. 

-

124 dtype : type, default to np.float64 

-

125 Datatype. 

-

126 """ 

-

127 if y.dtype != dtype: 

-

128 raise TypeError(f'`y` should be a Series of {dtype}.') 

-

129 

-

130 @staticmethod 

-

131 def check_if_y_is_binary(y: Union[pd.Series, ks.Series]): 

-

132 """Raise an error if the target datatype is not expected. 

-

133 

-

134 Parameters 

-

135 ---------- 

-

136 y : Union[pd.Series, ks.Series] 

-

137 Target values. 

-

138 """ 

-

139 if y.nunique() != 2: 

-

140 raise ValueError('`y` should be binary.') 

-
- - - diff --git a/cov_html/gators_encoders_multiclass_encoder_py.html b/cov_html/gators_encoders_multiclass_encoder_py.html deleted file mode 100644 index 4a5326e2..00000000 --- a/cov_html/gators_encoders_multiclass_encoder_py.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - Coverage for gators/encoders/multiclass_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import copy 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from ._base_encoder import _BaseEncoder 

-

8from ..util import util 

-

9from ..data_cleaning.drop_columns import DropColumns 

-

10from ..transformers.transformer import Transformer 

-

11 

-

12 

-

13class MultiClassEncoder(_BaseEncoder): 

-

14 """Encode the categorical columns with a binary encoder passed by the user. 

-

15 

-

16 *N* categorical columns are mapped into *N * (n - 1)* numerical columns 

-

17 where *n* is the number of classes. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 encoder : Transformer 

-

22 Binary Encoder. 

-

23 dtype : type, default to np.float64. 

-

24 Numerical datatype of the output data. 

-

25 

-

26 Examples 

-

27 -------- 

-

28 

-

29 * fit & transform with pandas 

-

30 

-

31 >>> import pandas as pd 

-

32 >>> from gators.encoders import MultiClassEncoder 

-

33 >>> from gators.encoders import WOEEncoder 

-

34 >>> X = pd.DataFrame({ 

-

35 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

36 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

37 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

38 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

39 >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

40 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

41 >>> obj.fit_transform(X, y) 

-

42 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

43 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

44 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

45 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

46 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

47 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

48 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

49 

-

50 * fit & transform with koalas 

-

51 

-

52 >>> import databricks.koalas as ks 

-

53 >>> from gators.encoders import MultiClassEncoder 

-

54 >>> from gators.encoders import WOEEncoder 

-

55 >>> X = ks.DataFrame({ 

-

56 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

57 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

58 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

59 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

60 >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

61 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

62 >>> obj.fit_transform(X, y) 

-

63 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

64 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

65 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

66 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

67 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

68 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

69 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

70 

-

71 * fit with pandas & transform with numpy 

-

72 

-

73 >>> import pandas as pd 

-

74 >>> from gators.encoders import MultiClassEncoder 

-

75 >>> from gators.encoders import WOEEncoder 

-

76 >>> X = pd.DataFrame({ 

-

77 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

78 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

79 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

80 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

81 >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

82 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

83 >>> obj.fit(X, y) 

-

84 >>> obj.transform_numpy(X.to_numpy()) 

-

85 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

86 0. , -0.40546511], 

-

87 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

88 0. , -0.40546511], 

-

89 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

90 0.69314718, -0.40546511], 

-

91 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

92 0.69314718, -0.40546511], 

-

93 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

94 0.69314718, 0.69314718], 

-

95 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

96 0.69314718, 0.69314718]]) 

-

97 

-

98 * fit with koalas & transform with numpy 

-

99 

-

100 >>> import databricks.koalas as ks 

-

101 >>> from gators.encoders import MultiClassEncoder 

-

102 >>> from gators.encoders import WOEEncoder 

-

103 >>> X = ks.DataFrame({ 

-

104 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

105 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

106 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

107 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

108 >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') 

-

109 >>> obj = MultiClassEncoder(WOEEncoder()) 

-

110 >>> obj.fit(X, y) 

-

111 >>> obj.transform(X.to_numpy()) 

-

112 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

113 0. , -0.40546511], 

-

114 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

115 0. , -0.40546511], 

-

116 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

117 0.69314718, -0.40546511], 

-

118 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

119 0.69314718, -0.40546511], 

-

120 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

121 0.69314718, 0.69314718], 

-

122 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

123 0.69314718, 0.69314718]]) 

-

124 

-

125 """ 

-

126 

-

127 def __init__(self, encoder: Transformer, dtype: type = np.float64): 

-

128 if not isinstance(encoder, Transformer): 

-

129 raise TypeError('`encoder` should be a transformer.') 

-

130 _BaseEncoder.__init__(self, dtype=dtype) 

-

131 self.encoder = encoder 

-

132 self.drop_columns = None 

-

133 self.label_names = [] 

-

134 self.encoder_dict = {} 

-

135 self.columns = [] 

-

136 self.idx_columns = np.ndarray([]) 

-

137 self.column_names = [] 

-

138 self.column_mapping = {} 

-

139 self.name = type(encoder).__name__ 

-

140 

-

141 def fit(self, 

-

142 X: Union[pd.DataFrame, ks.DataFrame], 

-

143 y: Union[pd.Series, ks.Series]) -> 'MultiClassEncoder': 

-

144 """Fit the transformer on the dataframe `X`. 

-

145 Parameters 

-

146 ---------- 

-

147 X : Union[pd.DataFrame, ks.DataFrame]. 

-

148 Input dataframe. 

-

149 y : Union[pd.Series, ks.Series], default to None. 

-

150 Labels. 

-

151 

-

152 Returns 

-

153 ------- 

-

154 MultiClassEncoder 

-

155 Instance of itself. 

-

156 """ 

-

157 self.check_dataframe(X) 

-

158 self.check_y(X, y) 

-

159 self.check_y_dtype(y, int) 

-

160 self.columns = util.get_datatype_columns(X, object) 

-

161 self.check_nans(X, self.columns) 

-

162 self.drop_columns = DropColumns(self.columns).fit(X) 

-

163 if not self.columns: 

-

164 return self 

-

165 self.idx_columns = util.get_idx_columns( 

-

166 columns=X.columns, 

-

167 selected_columns=self.columns, 

-

168 ) 

-

169 y_name = y.name 

-

170 if isinstance(X, pd.DataFrame): 

-

171 y_one_hot = pd.get_dummies(y, prefix=y_name) 

-

172 else: 

-

173 y_one_hot = ks.get_dummies(y, prefix=y_name) 

-

174 y_one_hot = y_one_hot.drop(y_one_hot.columns[0], axis=1) 

-

175 self.label_names = y_one_hot.columns 

-

176 for label_name in self.label_names: 

-

177 self.encoder_dict[label_name] = copy.copy(self.encoder) 

-

178 self.encoder_dict[label_name].fit( 

-

179 X[self.columns], y_one_hot[label_name]) 

-

180 return self 

-

181 

-

182 def transform(self, 

-

183 X: Union[pd.DataFrame, ks.DataFrame] 

-

184 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

185 """Transform the dataframe `X`. 

-

186 

-

187 Parameters 

-

188 ---------- 

-

189 X : Union[pd.DataFrame, ks.DataFrame]. 

-

190 Input dataframe. 

-

191 

-

192 Returns 

-

193 ------- 

-

194 Union[pd.DataFrame, ks.DataFrame] 

-

195 Transformed dataframe. 

-

196 """ 

-

197 self.check_dataframe(X) 

-

198 if not self.columns: 

-

199 self.idx_columns = np.array([]) 

-

200 return X 

-

201 for i, label_name in enumerate(self.label_names): 

-

202 dummy = self.encoder_dict[label_name].transform( 

-

203 X[self.columns].copy())[self.encoder_dict[label_name].columns] 

-

204 column_names = [ 

-

205 f'{col}__{label_name}_{self.name}' for col in dummy.columns] 

-

206 dummy.columns = column_names 

-

207 self.column_names.extend(column_names) 

-

208 for name, col in zip(column_names, self.columns): 

-

209 self.column_mapping[name] = col 

-

210 X = X.join(dummy, how='inner').sort_index() 

-

211 return self.drop_columns.transform(X).astype(self.dtype) 

-

212 

-

213 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

214 """Transform the NumPy array `X`. 

-

215 Parameters 

-

216 ---------- 

-

217 X : np.ndarray 

-

218 Input array. 

-

219 

-

220 Returns 

-

221 ------- 

-

222 np.ndarray 

-

223 Transformed array. 

-

224 """ 

-

225 self.check_array(X) 

-

226 if not self.columns: 

-

227 return X 

-

228 X_encoded_list = [] 

-

229 for i, label_name in enumerate(self.label_names): 

-

230 dummy = self.encoder_dict[label_name].transform_numpy( 

-

231 X[:, self.idx_columns].copy()) 

-

232 X_encoded_list.append(dummy) 

-

233 X_new = np.concatenate( 

-

234 [self.drop_columns.transform_numpy(X)] + X_encoded_list, axis=1) 

-

235 return X_new.astype(self.dtype) 

-
- - - diff --git a/cov_html/gators_encoders_onehot_encoder_py.html b/cov_html/gators_encoders_onehot_encoder_py.html deleted file mode 100644 index 69885c6f..00000000 --- a/cov_html/gators_encoders_onehot_encoder_py.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - Coverage for gators/encoders/onehot_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ..util import util 

-

7from ._base_encoder import _BaseEncoder 

-

8from . import OrdinalEncoder 

-

9from encoder import onehot_encoder 

-

10 

-

11 

-

12class OneHotEncoder(_BaseEncoder): 

-

13 """Encode the categorical columns as one-hot numeric variables. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 dtype : type, default to np.float64. 

-

18 Numerical datatype of the output data. 

-

19 

-

20 Examples 

-

21 --------- 

-

22 * fit & transform with pandas 

-

23 

-

24 >>> import pandas as pd 

-

25 >>> from gators.encoders import OneHotEncoder 

-

26 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

27 >>> obj = OneHotEncoder() 

-

28 >>> obj.fit_transform(X) 

-

29 A__a A__b B__c B__d 

-

30 0 1.0 0.0 1.0 0.0 

-

31 1 1.0 0.0 0.0 1.0 

-

32 2 0.0 1.0 0.0 1.0 

-

33 

-

34 * fit & transform with koalas 

-

35 

-

36 >>> import databricks.koalas as ks 

-

37 >>> from gators.encoders import OneHotEncoder 

-

38 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['c', 'd', 'd']}) 

-

39 >>> obj = OneHotEncoder() 

-

40 >>> obj.fit_transform(X) 

-

41 A__a A__b B__c B__d 

-

42 0 1.0 0.0 1.0 0.0 

-

43 1 1.0 0.0 0.0 1.0 

-

44 2 0.0 1.0 0.0 1.0 

-

45 

-

46 * fit with pandas & transform with numpy 

-

47 

-

48 >>> import pandas as pd 

-

49 >>> from gators.encoders import OneHotEncoder 

-

50 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

51 >>> obj = OneHotEncoder() 

-

52 >>> obj.fit(X) 

-

53 >>> obj.transform_numpy(X.to_numpy()) 

-

54 array([[1, 0, 1, 0], 

-

55 [1, 0, 0, 1], 

-

56 [0, 1, 0, 1]], dtype=object) 

-

57 

-

58 * fit with koalas & transform with numpy 

-

59 

-

60 >>> import databricks.koalas as ks 

-

61 >>> from gators.encoders import OneHotEncoder 

-

62 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

63 >>> obj = OneHotEncoder() 

-

64 >>> obj.fit(X) 

-

65 >>> obj.transform_numpy(X.to_numpy()) 

-

66 array([[1, 0, 1, 0], 

-

67 [1, 0, 0, 1], 

-

68 [0, 1, 0, 1]], dtype=object) 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, dtype: type = np.float64): 

-

73 _BaseEncoder.__init__(self, dtype=dtype) 

-

74 self.ordinal_encoder = OrdinalEncoder() 

-

75 self.idx_other_columns = np.array([]) 

-

76 self.onehot_columns = [] 

-

77 self.other_columns = [] 

-

78 self.column_mapping = {} 

-

79 

-

80 def fit(self, 

-

81 X: Union[pd.DataFrame, ks.DataFrame], 

-

82 y: Union[pd.Series, ks.Series] = None) -> 'OneHotEncoder': 

-

83 """Fit the transformer on the dataframe `X`. 

-

84 

-

85 Parameters 

-

86 ---------- 

-

87 X : Union[pd.DataFrame, ks.DataFrame]. 

-

88 Input dataframe. 

-

89 y : None 

-

90 None. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 OneHotEncoder: Instance of itself. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 self.columns = util.get_datatype_columns(X, object) 

-

98 if not self.columns: 

-

99 self.idx_columns = np.array([]) 

-

100 return self 

-

101 self.check_nans(X, self.columns) 

-

102 self.other_columns = util.exclude_columns( 

-

103 X.columns, self.columns) 

-

104 _ = self.ordinal_encoder.fit(X) 

-

105 self.onehot_columns = [] 

-

106 for key, val in self.ordinal_encoder.mapping.items(): 

-

107 self.onehot_columns.extend( 

-

108 [f'{key}__{float(c)}' 

-

109 for c in sorted(val.values(), key=int)]) 

-

110 for key, val in self.ordinal_encoder.mapping.items(): 

-

111 for k, v in val.items(): 

-

112 self.column_mapping[f'{key}__{float(v)}'] = \ 

-

113 f'{key}__{k}' 

-

114 self.all_columns = self.other_columns + self.onehot_columns 

-

115 self.idx_other_columns = util.get_idx_columns( 

-

116 X.columns, self.other_columns) 

-

117 self.idx_columns = np.arange( 

-

118 len(self.other_columns), 

-

119 len(self.other_columns)+len(self.onehot_columns), 

-

120 dtype=int) 

-

121 self.n_categories_vec = np.empty( 

-

122 len(self.ordinal_encoder.columns), int) 

-

123 for i, c in enumerate(self.columns): 

-

124 self.n_categories_vec[i] = \ 

-

125 len(self.ordinal_encoder.mapping[c]) 

-

126 

-

127 self.columns_flatten = np.array([ 

-

128 col 

-

129 for col, mapping in self.ordinal_encoder.mapping.items() 

-

130 for v in range(len(mapping))]) 

-

131 self.idx_columns = util.get_idx_columns(X, self.columns_flatten) 

-

132 self.idx_columns_to_keep = [ 

-

133 i for i in range(X.shape[1] + self.idx_columns.shape[0]) 

-

134 if i not in util.get_idx_columns(X, self.columns)] 

-

135 self.cats = np.array([ 

-

136 v 

-

137 for col, mapping in self.ordinal_encoder.mapping.items() 

-

138 for v in dict( 

-

139 sorted(mapping.items(), key=lambda item: item[1])).keys() 

-

140 ]).astype(object) 

-

141 return self 

-

142 

-

143 def transform(self, 

-

144 X: Union[pd.DataFrame, ks.DataFrame], 

-

145 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

146 """Transform the dataframe `X`. 

-

147 

-

148 Parameters 

-

149 ---------- 

-

150 X : Union[pd.DataFrame, ks.DataFrame]. 

-

151 Input dataframe. 

-

152 

-

153 Returns 

-

154 ------- 

-

155 Union[pd.DataFrame, ks.DataFrame] 

-

156 Transformed dataframe. 

-

157 """ 

-

158 self.check_dataframe(X) 

-

159 if not self.columns: 

-

160 return X 

-

161 dummy = X[self.columns].copy() 

-

162 X_new = self.ordinal_encoder.transform(X) 

-

163 X[self.columns] = dummy 

-

164 if isinstance(X, pd.DataFrame): 

-

165 X_new = pd.get_dummies( 

-

166 X_new, 

-

167 prefix_sep='__', 

-

168 columns=self.columns) 

-

169 else: 

-

170 X_new = ks.get_dummies( 

-

171 X_new, 

-

172 prefix_sep='__', 

-

173 columns=self.columns) 

-

174 X_new = X_new.reindex(columns=self.all_columns, fill_value=0.) 

-

175 return X_new.rename(columns=self.column_mapping).astype(self.dtype) 

-

176 

-

177 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

178 """Transform the input array. 

-

179 

-

180 Parameters 

-

181 ---------- 

-

182 X : np.ndarray 

-

183 Input array. 

-

184 

-

185 Returns 

-

186 ------- 

-

187 np.ndarray: Encoded array. 

-

188 """ 

-

189 self.check_array(X) 

-

190 if len(self.idx_columns) == 0: 

-

191 return X 

-

192 return onehot_encoder( 

-

193 X, 

-

194 self.idx_columns, 

-

195 self.cats 

-

196 )[:, self.idx_columns_to_keep].astype(self.dtype) 

-
- - - diff --git a/cov_html/gators_encoders_ordinal_encoder_py.html b/cov_html/gators_encoders_ordinal_encoder_py.html deleted file mode 100644 index 62330375..00000000 --- a/cov_html/gators_encoders_ordinal_encoder_py.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Coverage for gators/encoders/ordinal_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ..util import util 

-

7from ._base_encoder import _BaseEncoder 

-

8 

-

9 

-

10class OrdinalEncoder(_BaseEncoder): 

-

11 """Encode the categorical columns as integer variables. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 dtype : type, default to np.float64. 

-

16 Numerical datatype of the output data. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 * fit & transform with pandas 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.encoders import OrdinalEncoder 

-

24 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

25 >>> obj = OrdinalEncoder() 

-

26 >>> obj.fit_transform(X) 

-

27 A B 

-

28 0 2.0 2.0 

-

29 1 2.0 1.0 

-

30 2 1.0 1.0 

-

31 

-

32 * fit & transform with koalas 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.encoders import OrdinalEncoder 

-

36 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

37 >>> obj = OrdinalEncoder() 

-

38 >>> obj.fit_transform(X) 

-

39 A B 

-

40 0 2.0 2.0 

-

41 1 2.0 1.0 

-

42 2 1.0 1.0 

-

43 

-

44 * fit with pandas & transform with numpy 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.encoders import OrdinalEncoder 

-

48 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

49 >>> obj = OrdinalEncoder() 

-

50 >>> obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([[2.0, 2.0], 

-

53 [2.0, 1.0], 

-

54 [1.0, 1.0]], dtype=object) 

-

55 

-

56 * fit with koalas & transform with numpy 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.encoders import OrdinalEncoder 

-

60 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

61 >>> obj = OrdinalEncoder() 

-

62 >>> obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([[2.0, 2.0], 

-

65 [2.0, 1.0], 

-

66 [1.0, 1.0]], dtype=object) 

-

67 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, dtype: type = np.float64): 

-

72 _BaseEncoder.__init__(self, dtype=dtype) 

-

73 

-

74 def fit(self, 

-

75 X: Union[pd.DataFrame, ks.DataFrame], 

-

76 y: Union[pd.Series, ks.Series] = None) -> 'OrdinalEncoder': 

-

77 """Fit the transformer on the dataframe `X`. 

-

78 

-

79 Parameters 

-

80 ---------- 

-

81 X : Union[pd.DataFrame, ks.DataFrame]. 

-

82 Input dataframe. 

-

83 y : Union[pd.Series, ks.Series], default to None. 

-

84 Labels. 

-

85 

-

86 Returns 

-

87 ------- 

-

88 OrdinalEncoder: Instance of itself. 

-

89 """ 

-

90 self.check_dataframe(X) 

-

91 self.columns = util.get_datatype_columns(X, object) 

-

92 self.check_nans(X, self.columns) 

-

93 if not self.columns: 

-

94 self.idx_columns = np.array([]) 

-

95 return self 

-

96 self.mapping = self.generate_mapping(X, self.columns) 

-

97 self.num_categories_vec = np.array( 

-

98 [len(m) for m in self.mapping.values()] 

-

99 ) 

-

100 columns, self.values_vec, self.encoded_values_vec = \ 

-

101 self.decompose_mapping( 

-

102 mapping=self.mapping, 

-

103 ) 

-

104 self.idx_columns = util.get_idx_columns( 

-

105 columns=X.columns, selected_columns=columns 

-

106 ) 

-

107 return self 

-

108 

-

109 @staticmethod 

-

110 def generate_mapping( 

-

111 X: Union[pd.DataFrame, ks.DataFrame], 

-

112 columns: List[str]) -> Dict[str, Dict[str, float]]: 

-

113 """Generate the mapping to perform the encoding. 

-

114 

-

115 Parameters 

-

116 ---------- 

-

117 X : Union[pd.DataFrame, ks.DataFrame] 

-

118 Input dataframe. 

-

119 self.columns : List[str] 

-

120 List of columns. 

-

121 

-

122 Returns 

-

123 ------- 

-

124 Dict[str, Dict[str, float]] 

-

125 Mapping. 

-

126 """ 

-

127 mapping = {} 

-

128 for c in columns: 

-

129 categories = X[c].value_counts().to_dict() 

-

130 n_categories = len(categories) 

-

131 category_names = list(categories.keys()) 

-

132 category_names = sorted(category_names) 

-

133 category_mapping = dict(zip( 

-

134 category_names, 

-

135 np.arange(n_categories-1, -1, -1).astype(str) 

-

136 )) 

-

137 if 'MISSING' not in category_mapping: 

-

138 category_mapping['MISSING'] = str(len(category_mapping)) 

-

139 if 'OTHERS' not in category_mapping: 

-

140 category_mapping['OTHERS'] = str(len(category_mapping)) 

-

141 mapping[c] = category_mapping 

-

142 

-

143 return mapping 

-
- - - diff --git a/cov_html/gators_encoders_regression_encoder_py.html b/cov_html/gators_encoders_regression_encoder_py.html deleted file mode 100644 index aaaee233..00000000 --- a/cov_html/gators_encoders_regression_encoder_py.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - Coverage for gators/encoders/regression_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2import numpy as np 

-

3from typing import Union 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from .multiclass_encoder import MultiClassEncoder 

-

7from ._base_encoder import _BaseEncoder 

-

8from ..transformers import Transformer 

-

9 

-

10 

-

11class RegressionEncoder(_BaseEncoder): 

-

12 """Encode the categorical columns with a binary encoder given by the user. 

-

13 

-

14 The encoding is composed in 2 steps: 

-

15 

-

16 * bin the target values using the discretizer passed as argument. 

-

17 * apply the `MultiClassEncoder` on the discretized target values. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 encoder : Transformer. 

-

22 Encoder. 

-

23 discretizer: Transformer. 

-

24 Discretizer. 

-

25 dtype : type, default to np.float64. 

-

26 Numerical datatype of the output data. 

-

27 

-

28 Examples 

-

29 -------- 

-

30 * fit & transform with pandas 

-

31 

-

32 >>> import pandas as pd 

-

33 >>> from gators.binning import QuantileDiscretizer 

-

34 >>> from gators.encoders import WOEEncoder 

-

35 >>> from gators.encoders import RegressionEncoder 

-

36 >>> X = pd.DataFrame({ 

-

37 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

38 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

39 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

40 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

41 >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') 

-

42 >>> obj = RegressionEncoder( 

-

43 ... encoder=WOEEncoder(), 

-

44 ... discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True))) 

-

45 >>> obj.fit_transform(X) 

-

46 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

47 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

48 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

49 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

50 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

51 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

52 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

53 * fit & transform with koalas 

-

54 

-

55 >>> import databricks.koalas as ks 

-

56 >>> from gators.binning import QuantileDiscretizer 

-

57 >>> from gators.encoders import WOEEncoder 

-

58 >>> from gators.encoders import RegressionEncoder 

-

59 >>> X = ks.DataFrame({ 

-

60 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

61 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

62 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

63 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

64 >>> obj = RegressionEncoder( 

-

65 ... encoder=WOEEncoder(), 

-

66 ... discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True)) 

-

67 >>> obj.fit_transform(X) 

-

68 D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder 

-

69 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

70 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 

-

71 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 

-

72 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 

-

73 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

74 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 

-

75 

-

76 * fit with pandas & transform with numpy 

-

77 

-

78 >>> import pandas as pd 

-

79 >>> from gators.binning import QuantileDiscretizer 

-

80 >>> from gators.encoders import WOEEncoder 

-

81 >>> from gators.encoders import RegressionEncoder 

-

82 >>> X = pd.DataFrame({ 

-

83 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

84 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

85 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

86 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

87 >>> obj = RegressionEncoder( 

-

88 ... encoder=WOEEncoder(), 

-

89 ... discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True)) 

-

90 >>> obj.fit(X) 

-

91 >>> obj.transform_numpy(X.to_numpy()) 

-

92 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

93 0. , -0.40546511], 

-

94 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

95 0. , -0.40546511], 

-

96 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

97 0.69314718, -0.40546511], 

-

98 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

99 0.69314718, -0.40546511], 

-

100 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

101 0.69314718, 0.69314718], 

-

102 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

103 0.69314718, 0.69314718]]) 

-

104 

-

105 * fit with koalas & transform with numpy 

-

106 

-

107 >>> import databricks.koalas as ks 

-

108 >>> from gators.binning import QuantileDiscretizer 

-

109 >>> from gators.encoders import WOEEncoder 

-

110 >>> from gators.encoders import RegressionEncoder 

-

111 >>> X = ks.DataFrame({ 

-

112 ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], 

-

113 ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], 

-

114 ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], 

-

115 ... 'D': [1, 2, 3, 4, 5, 6]}) 

-

116 >>> obj = RegressionEncoder( 

-

117 ... encoder=WOEEncoder(), 

-

118 ... discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True)) 

-

119 >>> obj.transform_numpy(X.to_numpy()) 

-

120 array([[ 1. , 0. , 0. , -0.40546511, 0. , 

-

121 0. , -0.40546511], 

-

122 [ 2. , 0. , 0. , -0.40546511, 0. , 

-

123 0. , -0.40546511], 

-

124 [ 3. , 0. , 0.69314718, -0.40546511, 0. , 

-

125 0.69314718, -0.40546511], 

-

126 [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, 

-

127 0.69314718, -0.40546511], 

-

128 [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

129 0.69314718, 0.69314718], 

-

130 [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, 

-

131 0.69314718, 0.69314718]]) 

-

132 

-

133 

-

134 """ 

-

135 

-

136 def __init__(self, encoder: Transformer, discretizer: Transformer, 

-

137 dtype: type = np.float64): 

-

138 _BaseEncoder.__init__(self, dtype=dtype) 

-

139 if not isinstance(discretizer, Transformer): 

-

140 raise TypeError( 

-

141 '`discretizer` should inherit from _BaseDiscretizer.') 

-

142 if not isinstance(encoder, Transformer): 

-

143 raise TypeError('`encoder` should be a transformer.') 

-

144 

-

145 self.discretizer = discretizer 

-

146 self.multiclass_encoder = MultiClassEncoder( 

-

147 encoder=encoder, dtype=dtype) 

-

148 

-

149 def fit(self, 

-

150 X: Union[pd.DataFrame, ks.DataFrame], 

-

151 y: Union[pd.Series, ks.Series]) -> 'RegressionEncoder': 

-

152 """Fit the transformer on the dataframe `X`. 

-

153 Parameters 

-

154 ---------- 

-

155 X : Union[pd.DataFrame, ks.DataFrame]. 

-

156 Input dataframe. 

-

157 y : Union[pd.Series, ks.Series], default to None. 

-

158 Labels. 

-

159 

-

160 Returns 

-

161 ------- 

-

162 RegressionEncoder 

-

163 Instance of itself. 

-

164 """ 

-

165 y_binned = self.discretizer.fit_transform(y.to_frame()) 

-

166 self.multiclass_encoder.fit( 

-

167 X, y_binned[y.name].astype(float).astype(int)) 

-

168 return self 

-

169 

-

170 def transform(self, 

-

171 X: Union[pd.DataFrame, ks.DataFrame] 

-

172 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

173 """Transform the dataframe `X`. 

-

174 Parameters 

-

175 ---------- 

-

176 X : Union[pd.DataFrame, ks.DataFrame]. 

-

177 Input dataframe. 

-

178 

-

179 Returns 

-

180 ------- 

-

181 Union[pd.DataFrame, ks.DataFrame] 

-

182 Transformed dataframe. 

-

183 """ 

-

184 return self.multiclass_encoder.transform(X) 

-

185 

-

186 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

187 """Transform the NumPy array `X`. 

-

188 Parameters 

-

189 ---------- 

-

190 X : np.ndarray 

-

191 Input array. 

-

192 

-

193 Returns 

-

194 ------- 

-

195 np.ndarray 

-

196 Transformed array. 

-

197 """ 

-

198 return self.multiclass_encoder.transform_numpy(X) 

-
- - - diff --git a/cov_html/gators_encoders_target_encoder_py.html b/cov_html/gators_encoders_target_encoder_py.html deleted file mode 100644 index 2f01deb1..00000000 --- a/cov_html/gators_encoders_target_encoder_py.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - Coverage for gators/encoders/target_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ._base_encoder import _BaseEncoder 

-

7from ..util import util 

-

8 

-

9 

-

10def clean_mapping(mapping: Dict[str, Dict[str, List[float]]] 

-

11 ) -> Dict[str, Dict[str, List[float]]]: 

-

12 mapping = { 

-

13 col: {k: v for k, v in mapping[col].items() if v == v} 

-

14 for col in mapping.keys() 

-

15 } 

-

16 for m in mapping.values(): 

-

17 if 'OTHERS' not in m: 

-

18 m['OTHERS'] = 0. 

-

19 if 'MISSING' not in m: 

-

20 m['MISSING'] = 0. 

-

21 return mapping 

-

22 

-

23 

-

24class TargetEncoder(_BaseEncoder): 

-

25 """Encode the categorical variable using the target encoding technique. 

-

26 

-

27 Parameters 

-

28 ---------- 

-

29 dtype : type, default to np.float64. 

-

30 Numerical datatype of the output data. 

-

31 

-

32 Examples 

-

33 --------- 

-

34 

-

35 * fit & transform with pandas 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> from gators.encoders import TargetEncoder 

-

39 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

40 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

41 >>> obj = TargetEncoder() 

-

42 >>> obj.fit_transform(X, y) 

-

43 A B 

-

44 0 1.098612 0.693147 

-

45 1 1.098612 -0.405465 

-

46 2 -1.098612 -0.405465 

-

47 

-

48 * fit & transform with koalas 

-

49 

-

50 >>> import databricks.koalas as ks 

-

51 >>> from gators.encoders import TargetEncoder 

-

52 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

53 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

54 >>> obj = TargetEncoder() 

-

55 >>> obj.fit_transform(X, y) 

-

56 A B 

-

57 0 1.098612 0.693147 

-

58 1 1.098612 -0.405465 

-

59 2 -1.098612 -0.405465 

-

60 

-

61 * fit with pandas & transform with numpy 

-

62 

-

63 >>> import pandas as pd 

-

64 >>> from gators.encoders import TargetEncoder 

-

65 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

66 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

67 >>> obj = TargetEncoder() 

-

68 >>> obj.fit(X, y) 

-

69 >>> obj.transform_numpy(X.to_numpy()) 

-

70 array([[1.0986122886681098, 0.6931471805599453], 

-

71 [1.0986122886681098, -0.40546510810816444], 

-

72 [-1.0986122886681098, -0.40546510810816444]], dtype=object) 

-

73 

-

74 * fit with koalas & transform with numpy 

-

75 

-

76 >>> import databricks.koalas as ks 

-

77 >>> from gators.encoders import TargetEncoder 

-

78 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

79 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

80 >>> obj = TargetEncoder() 

-

81 >>> obj.fit(X, y) 

-

82 >>> obj.transform(X.to_numpy()) 

-

83 array([[1.0986122886681098, 0.6931471805599453], 

-

84 [1.0986122886681098, -0.40546510810816444], 

-

85 [-1.0986122886681098, -0.40546510810816444]], dtype=object) 

-

86 

-

87 

-

88 """ 

-

89 

-

90 def __init__(self, dtype: type = np.float64): 

-

91 _BaseEncoder.__init__(self, dtype=dtype) 

-

92 

-

93 def fit(self, 

-

94 X: Union[pd.DataFrame, ks.DataFrame], 

-

95 y: Union[pd.Series, ks.Series]) -> 'TargetEncoder': 

-

96 """Fit the encoder. 

-

97 

-

98 Parameters 

-

99 ---------- 

-

100 X : Union[pd.DataFrame, ks.DataFrame]: 

-

101 Input dataframe. 

-

102 y : Union[pd.Series, ks.Series], default to None. 

-

103 Labels. 

-

104 

-

105 Returns 

-

106 ------- 

-

107 TargetEncoder: 

-

108 Instance of itself. 

-

109 """ 

-

110 self.check_dataframe(X) 

-

111 self.check_y(X, y) 

-

112 self.check_y_dtype(y, int) 

-

113 self.columns = util.get_datatype_columns(X, object) 

-

114 if not self.columns: 

-

115 self.idx_columns = np.array([]) 

-

116 return self 

-

117 self.check_nans(X, self.columns) 

-

118 self.mapping = self.generate_mapping( 

-

119 X[self.columns], y) 

-

120 self.num_categories_vec = np.array( 

-

121 [len(m) for m in self.mapping.values()] 

-

122 ) 

-

123 columns, self.values_vec, self.encoded_values_vec = \ 

-

124 self.decompose_mapping(mapping=self.mapping) 

-

125 self.idx_columns = util.get_idx_columns( 

-

126 columns=X.columns, selected_columns=columns 

-

127 ) 

-

128 return self 

-

129 

-

130 @staticmethod 

-

131 def generate_mapping( 

-

132 X: Union[pd.DataFrame, ks.DataFrame], 

-

133 y: Union[pd.Series, ks.Series], 

-

134 

-

135 ) -> Dict[str, Dict[str, float]]: 

-

136 """Generate the mapping to perform the encoding. 

-

137 

-

138 Parameters 

-

139 ---------- 

-

140 X : Union[pd.DataFrame, ks.DataFrame] 

-

141 Input dataframe. 

-

142 y : Union[pd.Series, ks.Series]: 

-

143 Labels. 

-

144 

-

145 Returns 

-

146 ------- 

-

147 Dict[str, Dict[str, float]] 

-

148 Mapping. 

-

149 """ 

-

150 y_name = y.name 

-

151 if isinstance(X, pd.DataFrame): 

-

152 def f(x) -> ks.Series[np.float64]: 

-

153 return pd.DataFrame(x).join(y).groupby(x.name).mean()[y_name] 

-

154 

-

155 mapping = X.apply(f).to_dict() 

-

156 return clean_mapping(mapping) 

-

157 

-

158 mapping_list = [] 

-

159 for name in X.columns: 

-

160 dummy = ks.DataFrame(X[name]).join(y).groupby( 

-

161 name).mean()[y_name].to_pandas() 

-

162 dummy.name = name 

-

163 mapping_list.append(dummy) 

-

164 

-

165 mapping = pd.concat(mapping_list, axis=1).to_dict() 

-

166 return clean_mapping(mapping) 

-
- - - diff --git a/cov_html/gators_encoders_woe_encoder_py.html b/cov_html/gators_encoders_woe_encoder_py.html deleted file mode 100644 index 59b05833..00000000 --- a/cov_html/gators_encoders_woe_encoder_py.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - Coverage for gators/encoders/woe_encoder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ._base_encoder import _BaseEncoder 

-

7from ..util import util 

-

8 

-

9 

-

10def clean_mapping(mapping: Dict[str, Dict[str, List[float]]] 

-

11 ) -> Dict[str, Dict[str, List[float]]]: 

-

12 mapping = { 

-

13 col: {k: v for k, v in mapping[col].items() if v == v} 

-

14 for col in mapping.keys() 

-

15 } 

-

16 for m in mapping.values(): 

-

17 if 'OTHERS' not in m: 

-

18 m['OTHERS'] = 0. 

-

19 if 'MISSING' not in m: 

-

20 m['MISSING'] = 0. 

-

21 return mapping 

-

22 

-

23 

-

24class WOEEncoder(_BaseEncoder): 

-

25 """Encode all categorical variable using the weight of evidence technique. 

-

26 

-

27 Parameters 

-

28 ---------- 

-

29 dtype : type, default to np.float64. 

-

30 Numerical datatype of the output data. 

-

31 

-

32 Examples 

-

33 --------- 

-

34 * fit & transform with pandas 

-

35 

-

36 >>> import pandas as pd 

-

37 >>> from gators.encoders import WOEEncoder 

-

38 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

39 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

40 >>> obj = WOEEncoder() 

-

41 >>> obj.fit_transform(X, y) 

-

42 A B 

-

43 0 0.0 0.000000 

-

44 1 0.0 -0.693147 

-

45 2 0.0 -0.693147 

-

46 

-

47 * fit & transform with koalas 

-

48 

-

49 >>> import databricks.koalas as ks 

-

50 >>> from gators.encoders import WOEEncoder 

-

51 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

52 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

53 >>> obj = WOEEncoder() 

-

54 >>> obj.fit_transform(X, y) 

-

55 A B 

-

56 0 0.0 0.000000 

-

57 1 0.0 -0.693147 

-

58 2 0.0 -0.693147 

-

59 

-

60 * fit with pandas & transform with numpy 

-

61 

-

62 >>> import pandas as pd 

-

63 >>> from gators.encoders import WOEEncoder 

-

64 >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

65 >>> y = pd.Series([1, 1, 0], name='TARGET') 

-

66 >>> obj = WOEEncoder() 

-

67 >>> obj.fit(X, y) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[ 0. , 0. ], 

-

70 [ 0. , -0.69314718], 

-

71 [ 0. , -0.69314718]]) 

-

72 

-

73 * fit with koalas & transform with numpy 

-

74 

-

75 >>> import databricks.koalas as ks 

-

76 >>> from gators.encoders import WOEEncoder 

-

77 >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) 

-

78 >>> y = ks.Series([1, 1, 0], name='TARGET') 

-

79 >>> obj = WOEEncoder() 

-

80 >>> obj.fit(X, y) 

-

81 >>> obj.transform(X.to_numpy()) 

-

82 array([[ 0. , 0. ], 

-

83 [ 0. , -0.69314718], 

-

84 [ 0. , -0.69314718]]) 

-

85 

-

86 """ 

-

87 

-

88 def __init__(self, dtype: type = np.float64): 

-

89 _BaseEncoder.__init__(self, dtype=dtype) 

-

90 

-

91 def fit(self, 

-

92 X: Union[pd.DataFrame, ks.DataFrame], 

-

93 y: Union[pd.Series, ks.Series]) -> 'WOEEncoder': 

-

94 """Fit the encoder. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame]: 

-

99 Input dataframe. 

-

100 y : Union[pd.Series, ks.Series], default to None. 

-

101 Labels. 

-

102 

-

103 Returns 

-

104 ------- 

-

105 WOEEncoder: 

-

106 Instance of itself. 

-

107 """ 

-

108 self.check_dataframe(X) 

-

109 self.check_y(X, y) 

-

110 self.columns = util.get_datatype_columns(X, object) 

-

111 if not self.columns: 

-

112 self.idx_columns = np.array([]) 

-

113 return self 

-

114 self.check_if_y_is_binary(y) 

-

115 self.check_nans(X, self.columns) 

-

116 self.mapping = self.generate_mapping( 

-

117 X[self.columns], y) 

-

118 self.num_categories_vec = np.array( 

-

119 [len(m) for m in self.mapping.values()] 

-

120 ) 

-

121 columns, self.values_vec, self.encoded_values_vec = \ 

-

122 self.decompose_mapping(mapping=self.mapping) 

-

123 self.idx_columns = util.get_idx_columns( 

-

124 columns=X.columns, selected_columns=columns 

-

125 ) 

-

126 return self 

-

127 

-

128 @staticmethod 

-

129 def generate_mapping( 

-

130 X: Union[pd.DataFrame, ks.DataFrame], 

-

131 y: Union[pd.Series, ks.Series], 

-

132 

-

133 ) -> Dict[str, Dict[str, float]]: 

-

134 """Generate the mapping to perform the encoding. 

-

135 

-

136 Parameters 

-

137 ---------- 

-

138 X : Union[pd.DataFrame, ks.DataFrame] 

-

139 Input dataframe. 

-

140 y : Union[pd.Series, ks.Series]: 

-

141 Labels. 

-

142 

-

143 Returns 

-

144 ------- 

-

145 Dict[str, Dict[str, float]] 

-

146 Mapping. 

-

147 """ 

-

148 mapping_list = [] 

-

149 y_name = y.name 

-

150 X = X.join(y) 

-

151 for col in X.columns: 

-

152 if isinstance(X, pd.DataFrame): 

-

153 tab = X.groupby( 

-

154 [col, y_name])[y_name].count().unstack( 

-

155 ).fillna(0) 

-

156 else: 

-

157 tab = X.groupby( 

-

158 [col, y_name])[y_name].count().unstack( 

-

159 ).to_pandas().fillna(0) 

-

160 tab /= tab.sum() 

-

161 tab.columns = [int(c) for c in tab.columns] 

-

162 # if tab.shape[1] == 1: 

-

163 # continue 

-

164 with np.errstate(divide='ignore'): 

-

165 woe = pd.Series(np.log(tab[1] / tab[0])) 

-

166 woe[(woe == np.inf) | (woe == -np.inf)] = 0. 

-

167 mapping_list.append(pd.Series(woe, name=col)) 

-

168 mapping = pd.concat(mapping_list, axis=1).to_dict() 

-

169 X = X.drop(y_name, axis=1) 

-

170 return clean_mapping(mapping) 

-
- - - diff --git a/cov_html/gators_feature_generation__base_feature_generation_py.html b/cov_html/gators_feature_generation__base_feature_generation_py.html deleted file mode 100644 index 67df2635..00000000 --- a/cov_html/gators_feature_generation__base_feature_generation_py.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - Coverage for gators/feature_generation/_base_feature_generation.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ..transformers.transformer import Transformer 

-

4import numpy as np 

-

5from typing import List, Union 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseFeatureGeneration(Transformer): 

-

11 """Base feature generation transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of generated columns. 

-

19 patterns : List[str] 

-

20 List of patterns. 

-

21 column_mapping: Dict[str, List[str]] 

-

22 Mapping between generated features and base features. 

-

23 

-

24 """ 

-

25 

-

26 def __init__(self, columns: List[str], 

-

27 column_names: List[str], column_mapping: List[str], 

-

28 dtype: type = None): 

-

29 Transformer.__init__(self) 

-

30 self.column_names = column_names 

-

31 self.columns = columns 

-

32 self.column_mapping = column_mapping 

-

33 self.idx_columns: np.ndarray = np.array([]) 

-

34 self.dtype = dtype 

-
- - - diff --git a/cov_html/gators_feature_generation_cluster_statistics_py.html b/cov_html/gators_feature_generation_cluster_statistics_py.html deleted file mode 100644 index 2f02148b..00000000 --- a/cov_html/gators_feature_generation_cluster_statistics_py.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - Coverage for gators/feature_generation/cluster_statistics.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union, Dict 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from feature_gen import cluster_statistics 

-

7from ._base_feature_generation import _BaseFeatureGeneration 

-

8 

-

9 

-

10class ClusterStatistics(_BaseFeatureGeneration): 

-

11 """Create new columns based on statistics done at the row level. 

-

12 

-

13 The data should be composed of numerical columns only. 

-

14 Use `gators.encoders` to replace the categorical columns by 

-

15 numerical ones before using `ClusterStatistics`. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 clusters_dict :Dict[str, List[str]] 

-

20 Dictionary of clusters of features. 

-

21 column_names : List[str], default to None. 

-

22 List of new column names 

-

23 dtype : type, default to np.float64. 

-

24 Numerical datatype of the output data. 

-

25 

-

26 Examples 

-

27 --------- 

-

28 * fit & transform with pandas 

-

29 

-

30 >>> import pandas as pd 

-

31 >>> from gators.feature_generation import ClusterStatistics 

-

32 >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) 

-

33 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

34 >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) 

-

35 >>> obj.fit_transform(X) 

-

36 A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std 

-

37 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 

-

38 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 

-

39 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 

-

40 

-

41 * fit & transform with koalas 

-

42 

-

43 >>> import databricks.koalas as ks 

-

44 >>> from gators.feature_generation import ClusterStatistics 

-

45 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

46 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

47 >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) 

-

48 >>> obj.fit_transform(X) 

-

49 A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std 

-

50 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 

-

51 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 

-

52 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 

-

53 

-

54 * fit with pandas & transform with numpy 

-

55 

-

56 >>> import pandas as pd 

-

57 >>> from gators.feature_generation import ClusterStatistics 

-

58 >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) 

-

59 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

60 >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) 

-

61 >>> obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy()) 

-

63 array([[9. , 3. , 6. , 6. , 4.24264069, 7.5 , 2.12132034], 

-

64 [9. , 4. , 7. , 6.5 , 3.53553391, 8. , 1.41421356], 

-

65 [7. , 5. , 8. , 6. , 1.41421356, 7.5 , 0.70710678]]) 

-

66 

-

67 * fit with koalas & transform with numpy 

-

68 

-

69 >>> import databricks.koalas as ks 

-

70 >>> from gators.feature_generation import ClusterStatistics 

-

71 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

72 >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} 

-

73 >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) 

-

74 >>> obj.fit(X) 

-

75 >>> obj.transform_numpy(X.to_numpy()) 

-

76 array([[9. , 3. , 6. , 6. , 4.24264069, 7.5 , 2.12132034], 

-

77 [9. , 4. , 7. , 6.5 , 3.53553391, 8. , 1.41421356], 

-

78 [7. , 5. , 8. , 6. , 1.41421356, 7.5 , 0.70710678]]) 

-

79 

-

80 """ 

-

81 

-

82 def __init__(self, clusters_dict: Dict[str, List[str]], 

-

83 column_names: List[str] = None, 

-

84 dtype: type = np.float64): 

-

85 if not isinstance(clusters_dict, dict): 

-

86 raise TypeError('`clusters_dict` should be a dict.') 

-

87 for key, val in clusters_dict.items(): 

-

88 if not isinstance(val, list): 

-

89 raise TypeError('`clusters_dict` values should be a list.') 

-

90 if len(val) == 0: 

-

91 raise ValueError( 

-

92 '`clusters_dict` values should be a not empty list.') 

-

93 cluster_length = [len(v) for v in clusters_dict.values()] 

-

94 if min(cluster_length) != max(cluster_length): 

-

95 raise ValueError( 

-

96 '`clusters_dict` values should be lists with same length.') 

-

97 if cluster_length[0] == 1: 

-

98 raise ValueError( 

-

99 '''`clusters_dict` values should be 

-

100 lists with a length larger than 1.''') 

-

101 if column_names is not None and not isinstance(column_names, list): 

-

102 raise TypeError('`column_names` should be None or a list.') 

-

103 if not column_names: 

-

104 column_names = self.get_column_names(clusters_dict) 

-

105 column_mapping = { 

-

106 **{f'{key}__mean': val for ( 

-

107 key, val) in clusters_dict.items()}, 

-

108 **{f'{key}__std': val for (key, val) 

-

109 in clusters_dict.items()} 

-

110 } 

-

111 else: 

-

112 column_mapping = dict(zip(column_names, clusters_dict.values())) 

-

113 columns = list( 

-

114 set( 

-

115 [c for s in list(clusters_dict.values()) for c in s] 

-

116 ) 

-

117 ) 

-

118 if column_names and 2 * len(clusters_dict) != len(column_names): 

-

119 raise ValueError( 

-

120 '''Length of `column_names` should be 

-

121 two times the length of `clusters_dict`.''') 

-

122 self.check_datatype(dtype, [np.float32, np.float64]) 

-

123 _BaseFeatureGeneration.__init__( 

-

124 self, columns=columns, column_names=column_names, 

-

125 column_mapping=column_mapping, dtype=dtype) 

-

126 self.clusters_dict = clusters_dict 

-

127 self.n_clusters = len(self.clusters_dict) 

-

128 

-

129 def fit(self, 

-

130 X: Union[pd.DataFrame, ks.DataFrame], 

-

131 y: Union[pd.Series, ks.Series] = None) -> 'ClusterStatistics': 

-

132 """Fit the transformer on the dataframe `X`. 

-

133 

-

134 Parameters 

-

135 ---------- 

-

136 X : Union[pd.DataFrame, ks.DataFrame]. 

-

137 Input dataframe. 

-

138 y : None 

-

139 None. 

-

140 

-

141 Returns 

-

142 ------- 

-

143 ClusterStatistics 

-

144 Instance of itself. 

-

145 """ 

-

146 self.check_dataframe(X) 

-

147 self.check_dataframe_is_numerics(X) 

-

148 self.idx_columns = self.get_idx_columns( 

-

149 X, self.clusters_dict) 

-

150 return self 

-

151 

-

152 def transform(self, 

-

153 X: Union[pd.DataFrame, ks.DataFrame], 

-

154 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

155 """Transform the dataframe X. 

-

156 

-

157 Parameters 

-

158 ---------- 

-

159 X : Union[pd.DataFrame, ks.DataFrame]. 

-

160 Input dataframe. 

-

161 

-

162 Returns 

-

163 ------- 

-

164 Union[pd.DataFrame, ks.DataFrame] 

-

165 Dataframe with statistics cluster features. 

-

166 """ 

-

167 for i, cols in enumerate(self.clusters_dict.values()): 

-

168 X = X.join(X[cols].mean(axis=1).rename( 

-

169 self.column_names[2*i])) 

-

170 X = X.join(X[cols].std(axis=1).rename( 

-

171 self.column_names[2*i+1])) 

-

172 if isinstance(X, ks.DataFrame): 

-

173 return X.astype(self.dtype).sort_index() 

-

174 return X.astype(self.dtype) 

-

175 

-

176 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

177 """Transform the NumPy array `X`. 

-

178 

-

179 Parameters 

-

180 ---------- 

-

181 X : np.ndarray 

-

182 Input array. 

-

183 

-

184 Returns 

-

185 ------- 

-

186 np.ndarray 

-

187 Transformed array. 

-

188 """ 

-

189 self.check_array(X) 

-

190 return cluster_statistics( 

-

191 X.astype(self.dtype), self.idx_columns, self.dtype) 

-

192 

-

193 @ staticmethod 

-

194 def get_idx_columns( 

-

195 X: Union[pd.DataFrame, ks.DataFrame], 

-

196 clusters_dict: Dict[str, List[str]]) -> np.ndarray: 

-

197 """Get the column indices of the clusters. 

-

198 Parameters 

-

199 ---------- 

-

200 X : Union[pd.DataFrame, ks.DataFrame] 

-

201 Input data. 

-

202 clusters_dict : Dict[str, List[str]] 

-

203 Clusters. 

-

204 

-

205 Returns 

-

206 ------- 

-

207 Dict[str, List[str]] 

-

208 Column indices of the clusters. 

-

209 """ 

-

210 columns = X.columns 

-

211 n_columns = len(columns) 

-

212 idx_columns = np.array([ 

-

213 [i for i in range(n_columns) 

-

214 if columns[i] in cluster_columns 

-

215 ] 

-

216 for cluster_columns in list(clusters_dict.values()) 

-

217 ]) 

-

218 return idx_columns 

-

219 

-

220 @ staticmethod 

-

221 def get_column_names( 

-

222 clusters_dict: Dict[str, List[str]]) -> List[str]: 

-

223 """Get statistics cluster column names. 

-

224 Parameters 

-

225 ---------- 

-

226 X : Union[pd.DataFrame, ks.DataFrame]. 

-

227 Input dataframe. 

-

228 

-

229 Returns 

-

230 ------- 

-

231 List[str] 

-

232 List of columns. 

-

233 """ 

-

234 column_names = [] 

-

235 for name in clusters_dict.keys(): 

-

236 column_names.append(name + '__mean') 

-

237 column_names.append(name + '__std') 

-

238 return column_names 

-
- - - diff --git a/cov_html/gators_feature_generation_dt__base_datetime_feature_py.html b/cov_html/gators_feature_generation_dt__base_datetime_feature_py.html deleted file mode 100644 index c8fdef7d..00000000 --- a/cov_html/gators_feature_generation_dt__base_datetime_feature_py.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/_base_datetime_feature.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseDatetimeFeature(Transformer): 

-

11 """Base datetime transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of column names. 

-

19 column_mapping: Dict[str, List[str]] 

-

20 Mapping between generated features and base features. 

-

21 

-

22 """ 

-

23 

-

24 def __init__(self, columns: List[str], column_names: List[str], 

-

25 column_mapping: Dict[str, str]): 

-

26 Transformer.__init__(self) 

-

27 self.columns = columns 

-

28 self.column_names = column_names 

-

29 self.column_mapping = column_mapping 

-

30 self.idx_columns: np.ndarray = np.array([]) 

-

31 self.n_columns = len(self.columns) 

-

32 

-

33 def fit(self, 

-

34 X: Union[pd.DataFrame, ks.DataFrame], 

-

35 y: Union[pd.Series, ks.Series] = None) -> '_BaseDatetimeFeature': 

-

36 """Fit the transformer on the dataframe `X`. 

-

37 

-

38 Parameters 

-

39 ---------- 

-

40 X : pd.DataFrame 

-

41 Input dataframe. 

-

42 y : Union[pd.Series, ks.Series], default to None. 

-

43 Target values. 

-

44 

-

45 Returns 

-

46 ------- 

-

47 _BaseDatetimeFeature 

-

48 Instance of itself. 

-

49 """ 

-

50 self.check_dataframe(X) 

-

51 X_datetime_dtype = X.iloc[:100][self.columns].dtypes 

-

52 for column in self.columns: 

-

53 if not np.issubdtype(X_datetime_dtype[column], np.datetime64): 

-

54 raise TypeError( 

-

55 """ 

-

56 Datetime columns should be of subtype np.datetime64. 

-

57 Use `ConvertColumnDatatype` to convert the dtype. 

-

58 """) 

-

59 self.idx_columns = util.get_idx_columns( 

-

60 columns=X.columns, 

-

61 selected_columns=self.columns, 

-

62 ) 

-

63 return self 

-

64 

-

65 @staticmethod 

-

66 def get_cyclic_column_names(columns: List[str], pattern: str): 

-

67 """Get the column names. 

-

68 

-

69 Parameters 

-

70 ---------- 

-

71 columns : List[str] 

-

72 List of datetime features. 

-

73 pattern: str 

-

74 Pattern. 

-

75 """ 

-

76 column_names = [] 

-

77 for c in columns: 

-

78 column_names.append(f'{c}__{pattern}_cos') 

-

79 column_names.append(f'{c}__{pattern}_sin') 

-

80 return column_names 

-
- - - diff --git a/cov_html/gators_feature_generation_dt__base_datetime_features_py.html b/cov_html/gators_feature_generation_dt__base_datetime_features_py.html deleted file mode 100644 index 48df3ef7..00000000 --- a/cov_html/gators_feature_generation_dt__base_datetime_features_py.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/_base_datetime_features.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Dict, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseDatetimeFeatures(Transformer): 

-

11 """Cyclic Datetime Transformer. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of column names. 

-

19 column_mapping: Dict[str, List[str]] 

-

20 Mapping between generated features and base features. 

-

21 

-

22 """ 

-

23 

-

24 def __init__(self, columns: List[str], column_names: List[str], 

-

25 column_mapping: Dict[str, str]): 

-

26 Transformer.__init__(self) 

-

27 self.columns = columns 

-

28 self.column_names = column_names 

-

29 self.column_mapping = column_mapping 

-

30 self.idx_columns: np.ndarray = np.array([]) 

-

31 self.n_columns = len(self.columns) 

-

32 

-

33 def fit(self, 

-

34 X: Union[pd.DataFrame, ks.DataFrame], 

-

35 y: Union[pd.Series, ks.Series] = None) -> '_BaseDatetimeFeatures': 

-

36 """Fit the transformer on the dataframe `X`. 

-

37 

-

38 Parameters 

-

39 ---------- 

-

40 X : pd.DataFrame 

-

41 Input dataframe. 

-

42 y : Union[pd.Series, ks.Series], default to None. 

-

43 Target values. 

-

44 

-

45 Returns 

-

46 ------- 

-

47 _BaseDatetimeFeatures 

-

48 Instance of itself. 

-

49 """ 

-

50 self.check_dataframe(X) 

-

51 X_datetime_dtype = X.iloc[:100][self.columns].dtypes 

-

52 for column in self.columns: 

-

53 if not np.issubdtype(X_datetime_dtype[column], np.datetime64): 

-

54 raise TypeError( 

-

55 """ 

-

56 Datetime columns should be of subtype np.datetime64. 

-

57 Use `SetColumnDatatype` to convert the dtype. 

-

58 """) 

-

59 self.idx_columns = util.get_idx_columns( 

-

60 columns=X.columns, 

-

61 selected_columns=self.columns, 

-

62 ) 

-

63 return self 

-

64 

-

65 @staticmethod 

-

66 def get_cyclic_column_names(columns: List[str], pattern: str): 

-

67 """Get the column names. 

-

68 

-

69 Parameters 

-

70 ---------- 

-

71 columns : List[str] 

-

72 List of datetime features. 

-

73 pattern: str 

-

74 Pattern. 

-

75 """ 

-

76 column_names = [] 

-

77 for c in columns: 

-

78 column_names.append(f'{c}__{pattern}_cos') 

-

79 column_names.append(f'{c}__{pattern}_sin') 

-

80 return column_names 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_cyclic_day_of_month_py.html b/cov_html/gators_feature_generation_dt_cyclic_day_of_month_py.html deleted file mode 100644 index 38856e32..00000000 --- a/cov_html/gators_feature_generation_dt_cyclic_day_of_month_py.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/cyclic_day_of_month.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10TWO_PI = 2 * pi 

-

11 

-

12 

-

13class CyclicDayOfMonth(_BaseDatetimeFeature): 

-

14 """Create new columns based on the cyclic mapping of the day of the month. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 columns: List[str] 

-

19 List of columns. 

-

20 

-

21 Examples 

-

22 --------- 

-

23 

-

24 * fit & transform with pandas 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

28 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

29 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B A__day_of_month_cos A__day_of_month_sin 

-

32 0 2020-01-01 23:00:00 0 1.000000 0.000000 

-

33 1 2020-12-15 18:00:00 1 -0.978148 0.207912 

-

34 2 NaT 0 NaN NaN 

-

35 

-

36 * fit & transform with koalas 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

40 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

41 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__day_of_month_cos A__day_of_month_sin 

-

44 0 2020-01-01 23:00:00 0 1.000000 0.000000 

-

45 1 2020-12-15 18:00:00 1 -0.978148 0.207912 

-

46 2 NaT 0 NaN NaN 

-

47 

-

48 * fit & transform with pandas 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

52 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

53 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

57 [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338056, 

-

58 0.20791169081775973], 

-

59 [NaT, 0, nan, nan]], dtype=object) 

-

60 

-

61 * fit with koalas & transform with numpy 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.feature_generation_dt import CyclicDayOfMonth 

-

65 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

66 >>> obj = CyclicDayOfMonth(columns=['A']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

70 [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338056, 

-

71 0.20791169081775973], 

-

72 [NaT, 0, nan, nan]], dtype=object) 

-

73 

-

74 

-

75 """ 

-

76 

-

77 def __init__(self, columns: List[str]): 

-

78 if not isinstance(columns, list): 

-

79 raise TypeError('`columns` should be a list.') 

-

80 if not columns: 

-

81 raise ValueError('`columns` should not be empty.') 

-

82 column_names = self.get_cyclic_column_names(columns, 'day_of_month') 

-

83 column_mapping = { 

-

84 name: col for name, col in zip(column_names, columns + columns)} 

-

85 _BaseDatetimeFeature.__init__( 

-

86 self, columns, column_names, column_mapping) 

-

87 

-

88 def transform( 

-

89 self, X: Union[pd.DataFrame, ks.DataFrame]) -> Union[pd.DataFrame, ks.DataFrame]: 

-

90 """Transform the dataframe `X`. 

-

91 

-

92 Parameters 

-

93 ---------- 

-

94 X : Union[pd.DataFrame, ks.DataFrame] 

-

95 Input dataframe. 

-

96 

-

97 Returns 

-

98 ------- 

-

99 Union[pd.DataFrame, ks.DataFrame] 

-

100 Transformed dataframe. 

-

101 """ 

-

102 self.check_dataframe(X) 

-

103 return self.compute_cyclic_day_of_month( 

-

104 X, self.columns, self.column_names) 

-

105 

-

106 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

107 """Transform the NumPy array `X`. 

-

108 

-

109 Parameters 

-

110 ---------- 

-

111 X : np.ndarray 

-

112 Input array. 

-

113 

-

114 Returns 

-

115 ------- 

-

116 np.ndarray 

-

117 Transformed array. 

-

118 """ 

-

119 

-

120 self.check_array(X) 

-

121 return feature_gen_dt.cyclic_day_of_month( 

-

122 X, self.idx_columns) 

-

123 

-

124 @ staticmethod 

-

125 def compute_cyclic_day_of_month( 

-

126 X: Union[pd.DataFrame, ks.DataFrame], 

-

127 columns: List[str], 

-

128 column_names: List[str] 

-

129 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

130 """Compute the cyclic day of the month features. 

-

131 

-

132 Parameters 

-

133 ---------- 

-

134 X : Union[pd.DataFrame, ks.DataFrame] 

-

135 Dataframe of datetime columns. 

-

136 

-

137 Returns 

-

138 ------- 

-

139 Union[pd.DataFrame, ks.DataFrame] 

-

140 Dataframe of cyclic day of the month features. 

-

141 """ 

-

142 

-

143 def f_cos(x): 

-

144 day_of_month = x.dt.day - 1 

-

145 n_days_in_month = x.dt.daysinmonth - 1 

-

146 prefactors = 2 * np.pi / n_days_in_month 

-

147 return np.cos(prefactors * day_of_month) 

-

148 

-

149 def f_sin(x): 

-

150 day_of_month = x.dt.day - 1 

-

151 n_days_in_month = x.dt.daysinmonth - 1 

-

152 prefactors = 2 * np.pi / n_days_in_month 

-

153 return np.sin(prefactors * day_of_month) 

-

154 

-

155 if isinstance(X, pd.DataFrame): 

-

156 for i, col in enumerate(columns): 

-

157 X_cos = X[[col]].apply(f_cos) 

-

158 X_cos.columns = [column_names[2*i]] 

-

159 X_sin = X[[col]].apply(f_sin) 

-

160 X_sin.columns = [column_names[2*i+1]] 

-

161 X = X.join(X_cos.join(X_sin)) 

-

162 return X 

-

163 

-

164 for i, col in enumerate(columns): 

-

165 n_days_in_month = X[col].dt.daysinmonth - 1 

-

166 prefactors = 2 * np.pi / n_days_in_month 

-

167 X = X.assign( 

-

168 dummy_cos=np.cos(prefactors * (X[col].dt.day - 1.)), 

-

169 dummy_sin=np.sin(prefactors * (X[col].dt.day - 1.)) 

-

170 ).rename( 

-

171 columns={ 

-

172 'dummy_cos': column_names[2*i], 

-

173 'dummy_sin': column_names[2*i+1]} 

-

174 ) 

-

175 return X 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_cyclic_day_of_week_py.html b/cov_html/gators_feature_generation_dt_cyclic_day_of_week_py.html deleted file mode 100644 index 5c9ed66f..00000000 --- a/cov_html/gators_feature_generation_dt_cyclic_day_of_week_py.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/cyclic_day_of_week.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4import numpy as np 

-

5from typing import List, Union 

-

6from math import pi 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 6. 

-

12 

-

13 

-

14class CyclicDayOfWeek(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the day of the week. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with pandas 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

29 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

30 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

31 >>> obj.fit_transform(X) 

-

32 A B A__day_of_week_cos A__day_of_week_sin 

-

33 0 2020-01-01 23:00:00 0 -0.5 0.866025 

-

34 1 2020-12-15 18:00:00 1 0.5 0.866025 

-

35 2 NaT 0 NaN NaN 

-

36 

-

37 * fit & transform with koalas 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

41 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

42 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

43 >>> obj.fit_transform(X) 

-

44 A B A__day_of_week_cos A__day_of_week_sin 

-

45 0 2020-01-01 23:00:00 0 -0.5 0.866025 

-

46 1 2020-12-15 18:00:00 1 0.5 0.866025 

-

47 2 NaT 0 NaN NaN 

-

48 

-

49 * fit & transform with pandas 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

53 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

54 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

55 >>> _ = obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, 

-

58 0.8660254037844388], 

-

59 [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, 

-

60 0.8660254037844386], 

-

61 [NaT, 0, nan, nan]], dtype=object) 

-

62 

-

63 * fit with koalas & transform with numpy 

-

64 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.feature_generation_dt import CyclicDayOfWeek 

-

67 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

68 >>> obj = CyclicDayOfWeek(columns=['A']) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, 

-

72 0.8660254037844388], 

-

73 [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, 

-

74 0.8660254037844386], 

-

75 [NaT, 0, nan, nan]], dtype=object) 

-

76 

-

77 

-

78 """ 

-

79 

-

80 def __init__(self, columns: List[str]): 

-

81 if not isinstance(columns, list): 

-

82 raise TypeError('`columns` should be a list.') 

-

83 if not columns: 

-

84 raise ValueError('`columns` should not be empty.') 

-

85 column_names = self.get_cyclic_column_names(columns, 'day_of_week') 

-

86 column_mapping = { 

-

87 name: col for name, col in zip(column_names, columns + columns)} 

-

88 _BaseDatetimeFeature.__init__( 

-

89 self, columns, column_names, column_mapping) 

-

90 

-

91 def transform( 

-

92 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

93 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

94 """Transform the dataframe `X`. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame]. 

-

99 Input dataframe. 

-

100 

-

101 Returns 

-

102 ------- 

-

103 Union[pd.DataFrame, ks.DataFrame] 

-

104 Transformed dataframe. 

-

105 """ 

-

106 self.check_dataframe(X) 

-

107 return self.compute_cyclic_day_of_week( 

-

108 X, self.columns, self.column_names) 

-

109 

-

110 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

111 """Transform the NumPy array `X`. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : np.ndarray 

-

116 Input array. 

-

117 

-

118 Returns 

-

119 ------- 

-

120 np.ndarray 

-

121 Transformed array. 

-

122 """ 

-

123 self.check_array(X) 

-

124 return feature_gen_dt.cyclic_day_of_week( 

-

125 X, self.idx_columns, PREFACTOR) 

-

126 

-

127 @ staticmethod 

-

128 def compute_cyclic_day_of_week( 

-

129 X: Union[pd.DataFrame, ks.DataFrame], 

-

130 columns: List[str], 

-

131 column_names: List[str]) -> Union[pd.DataFrame, ks.DataFrame]: 

-

132 """Compute the cyclic day of the week features. 

-

133 

-

134 Parameters 

-

135 ---------- 

-

136 X : Union[pd.DataFrame, ks.DataFrame] 

-

137 Dataframe of datetime columns. 

-

138 columns: str 

-

139 List of datetime columns. 

-

140 column_names: str 

-

141 List of datetime column names. 

-

142 

-

143 Returns 

-

144 ------- 

-

145 Union[pd.DataFrame, ks.DataFrame] 

-

146 Dataframe of cyclic day of the week features. 

-

147 """ 

-

148 if isinstance(X, pd.DataFrame): 

-

149 dummy = X[columns].apply( 

-

150 lambda x: PREFACTOR * x.dt.dayofweek) 

-

151 X_cyclic = dummy.agg(['cos', 'sin']) 

-

152 X_cyclic.columns = column_names 

-

153 return X.join(X_cyclic) 

-

154 

-

155 for i, col in enumerate(columns): 

-

156 X = X.assign( 

-

157 dummy_cos=np.cos(PREFACTOR * X[col].dt.dayofweek), 

-

158 dummy_sin=np.sin(PREFACTOR * X[col].dt.dayofweek) 

-

159 ).rename( 

-

160 columns={ 

-

161 'dummy_cos': column_names[2*i], 

-

162 'dummy_sin': column_names[2*i+1]} 

-

163 ) 

-

164 return X 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_cyclic_hour_of_day_py.html b/cov_html/gators_feature_generation_dt_cyclic_hour_of_day_py.html deleted file mode 100644 index 05b721ce..00000000 --- a/cov_html/gators_feature_generation_dt_cyclic_hour_of_day_py.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/cyclic_hour_of_day.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 23. 

-

12 

-

13 

-

14class CyclicHourOfDay(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the hour of the day. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with pandas 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

29 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

30 >>> obj = CyclicHourOfDay(columns=['A']) 

-

31 >>> obj.fit_transform(X) 

-

32 A B A__hour_of_day_cos A__hour_of_day_sin 

-

33 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 

-

34 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 

-

35 2 NaT 0 NaN NaN 

-

36 

-

37 * fit & transform with koalas 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

41 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

42 >>> obj = CyclicHourOfDay(columns=['A']) 

-

43 >>> obj.fit_transform(X) 

-

44 A B A__hour_of_day_cos A__hour_of_day_sin 

-

45 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 

-

46 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 

-

47 2 NaT 0 NaN NaN 

-

48 

-

49 * fit with pandas & transform with numpy 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

53 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

54 >>> obj = CyclicHourOfDay(columns=['A']) 

-

55 >>> _ = obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 

-

58 -2.4492935982947064e-16], 

-

59 [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, 

-

60 -0.979084087682323], 

-

61 [NaT, 0, nan, nan]], dtype=object) 

-

62 

-

63 * fit with koalas & transform with numpy 

-

64 

-

65 >>> import databricks.koalas as ks 

-

66 >>> from gators.feature_generation_dt import CyclicHourOfDay 

-

67 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

68 >>> obj = CyclicHourOfDay(columns=['A']) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 

-

72 -2.4492935982947064e-16], 

-

73 [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, 

-

74 -0.979084087682323], 

-

75 [NaT, 0, nan, nan]], dtype=object) 

-

76 

-

77 

-

78 """ 

-

79 

-

80 def __init__(self, columns: List[str]): 

-

81 if not isinstance(columns, list): 

-

82 raise TypeError('`columns` should be a list.') 

-

83 if not columns: 

-

84 raise ValueError('`columns` should not be empty.') 

-

85 column_names = self.get_cyclic_column_names(columns, 'hour_of_day') 

-

86 column_mapping = { 

-

87 name: col for name, col in zip(column_names, columns + columns)} 

-

88 _BaseDatetimeFeature.__init__( 

-

89 self, columns, column_names, column_mapping) 

-

90 

-

91 def transform( 

-

92 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

93 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

94 """Transform the dataframe `X`. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame]. 

-

99 Input dataframe. 

-

100 

-

101 Returns 

-

102 ------- 

-

103 Union[pd.DataFrame, ks.DataFrame] 

-

104 Transformed dataframe. 

-

105 """ 

-

106 self.check_dataframe(X) 

-

107 return self.compute_cyclic_hour_of_day( 

-

108 X, self.columns, self.column_names) 

-

109 

-

110 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

111 """Transform the NumPy array `X`. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : np.ndarray 

-

116 Input array. 

-

117 

-

118 Returns 

-

119 ------- 

-

120 np.ndarray 

-

121 Transformed array. 

-

122 """ 

-

123 self.check_array(X) 

-

124 return feature_gen_dt.cyclic_hour_of_day( 

-

125 X, self.idx_columns, PREFACTOR) 

-

126 

-

127 @ staticmethod 

-

128 def compute_cyclic_hour_of_day( 

-

129 X: Union[pd.DataFrame, ks.DataFrame], 

-

130 columns: List[str], 

-

131 column_names: List[str], 

-

132 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

133 """Compute the cyclic hours of the day features. 

-

134 

-

135 Parameters 

-

136 ---------- 

-

137 X_datetime : Union[pd.DataFrame, ks.DataFrame] 

-

138 Dataframe of datetime columns. 

-

139 

-

140 Returns 

-

141 ------- 

-

142 Union[pd.DataFrame, ks.DataFrame] 

-

143 Dataframe of cyclic hours of the day features. 

-

144 """ 

-

145 if isinstance(X, pd.DataFrame): 

-

146 X_cyclic = X[columns].apply( 

-

147 lambda x: PREFACTOR * x.dt.hour 

-

148 ).agg(['cos', 'sin']) 

-

149 X_cyclic.columns = column_names 

-

150 return X.join(X_cyclic) 

-

151 

-

152 for i, col in enumerate(columns): 

-

153 X = X.assign( 

-

154 dummy_cos=np.cos(PREFACTOR * X[col].dt.hour), 

-

155 dummy_sin=np.sin(PREFACTOR * X[col].dt.hour) 

-

156 ).rename( 

-

157 columns={ 

-

158 'dummy_cos': column_names[2*i], 

-

159 'dummy_sin': column_names[2*i+1]} 

-

160 ) 

-

161 return X 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_cyclic_minute_of_hour_py.html b/cov_html/gators_feature_generation_dt_cyclic_minute_of_hour_py.html deleted file mode 100644 index 89d91f4c..00000000 --- a/cov_html/gators_feature_generation_dt_cyclic_minute_of_hour_py.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/cyclic_minute_of_hour.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 59. 

-

12 

-

13 

-

14class CyclicMinuteOfHour(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the minute of the hour. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with pandas 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

29 >>> X = pd.DataFrame( 

-

30 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

31 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

32 >>> obj.fit_transform(X) 

-

33 A B A__minute_of_hour_cos A__minute_of_hour_sin 

-

34 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

35 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 

-

36 2 NaT 0 NaN NaN 

-

37 

-

38 * fit & transform with koalas 

-

39 

-

40 >>> import databricks.koalas as ks 

-

41 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

42 >>> X = ks.DataFrame( 

-

43 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

44 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

45 >>> obj.fit_transform(X) 

-

46 A B A__minute_of_hour_cos A__minute_of_hour_sin 

-

47 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

48 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 

-

49 2 NaT 0 NaN NaN 

-

50 

-

51 * fit with pandas & transform with numpy 

-

52 

-

53 >>> import pandas as pd 

-

54 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

55 >>> X = pd.DataFrame( 

-

56 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

57 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

58 >>> _ = obj.fit(X) 

-

59 >>> obj.transform_numpy(X.to_numpy()) 

-

60 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

61 [Timestamp('2020-12-15 18:59:00'), 1, 1.0, 

-

62 -2.4492935982947064e-16], 

-

63 [NaT, 0, nan, nan]], dtype=object) 

-

64 

-

65 * fit with koalas & transform with numpy 

-

66 

-

67 >>> import databricks.koalas as ks 

-

68 >>> from gators.feature_generation_dt import CyclicMinuteOfHour 

-

69 >>> X = ks.DataFrame( 

-

70 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

71 >>> obj = CyclicMinuteOfHour(columns=['A']) 

-

72 >>> _ = obj.fit(X) 

-

73 >>> obj.transform_numpy(X.to_numpy()) 

-

74 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

75 [Timestamp('2020-12-15 18:59:00'), 1, 1.0, 

-

76 -2.4492935982947064e-16], 

-

77 [NaT, 0, nan, nan]], dtype=object) 

-

78 

-

79 

-

80 """ 

-

81 

-

82 def __init__(self, columns: List[str]): 

-

83 if not isinstance(columns, list): 

-

84 raise TypeError('`columns` should be a list.') 

-

85 if not columns: 

-

86 raise ValueError('`columns` should not be empty.') 

-

87 column_names = self.get_cyclic_column_names(columns, 'minute_of_hour') 

-

88 column_mapping = { 

-

89 name: col for name, col in zip(column_names, columns + columns)} 

-

90 _BaseDatetimeFeature.__init__( 

-

91 self, columns, column_names, column_mapping) 

-

92 

-

93 def transform( 

-

94 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

95 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

96 """Transform the dataframe `X`. 

-

97 

-

98 Parameters 

-

99 ---------- 

-

100 X : Union[pd.DataFrame, ks.DataFrame]. 

-

101 Input dataframe. 

-

102 

-

103 Returns 

-

104 ------- 

-

105 Union[pd.DataFrame, ks.DataFrame] 

-

106 Transformed dataframe. 

-

107 """ 

-

108 self.check_dataframe(X) 

-

109 return self.compute_cyclic_minute_of_hour( 

-

110 X, self.columns, self.column_names) 

-

111 

-

112 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

113 """Transform the NumPy array `X`. 

-

114 

-

115 Parameters 

-

116 ---------- 

-

117 X : np.ndarray 

-

118 Input array. 

-

119 

-

120 Returns 

-

121 ------- 

-

122 np.ndarray 

-

123 Transformed array. 

-

124 """ 

-

125 self.check_array(X) 

-

126 return feature_gen_dt.cyclic_minute_of_hour( 

-

127 X, self.idx_columns, PREFACTOR) 

-

128 

-

129 @ staticmethod 

-

130 def compute_cyclic_minute_of_hour( 

-

131 X: Union[pd.DataFrame, ks.DataFrame], 

-

132 columns: List[str], 

-

133 column_names: List[str], 

-

134 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

135 """Compute the cyclic hours of the day features. 

-

136 

-

137 Parameters 

-

138 ---------- 

-

139 X_datetime : Union[pd.DataFrame, ks.DataFrame] 

-

140 Dataframe of datetime columns. 

-

141 

-

142 Returns 

-

143 ------- 

-

144 Union[pd.DataFrame, ks.DataFrame] 

-

145 Dataframe of cyclic hours of the day features. 

-

146 """ 

-

147 if isinstance(X, pd.DataFrame): 

-

148 X_cyclic = X[columns].apply( 

-

149 lambda x: PREFACTOR * x.dt.minute 

-

150 ).agg(['cos', 'sin']) 

-

151 X_cyclic.columns = column_names 

-

152 return X.join(X_cyclic) 

-

153 

-

154 for i, col in enumerate(columns): 

-

155 X = X.assign( 

-

156 dummy_cos=np.cos(PREFACTOR * X[col].dt.minute), 

-

157 dummy_sin=np.sin(PREFACTOR * X[col].dt.minute) 

-

158 ).rename( 

-

159 columns={ 

-

160 'dummy_cos': column_names[2*i], 

-

161 'dummy_sin': column_names[2*i+1]} 

-

162 ) 

-

163 return X 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_cyclic_month_of_year_py.html b/cov_html/gators_feature_generation_dt_cyclic_month_of_year_py.html deleted file mode 100644 index 6f928684..00000000 --- a/cov_html/gators_feature_generation_dt_cyclic_month_of_year_py.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/cyclic_month_of_year.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ._base_datetime_feature import _BaseDatetimeFeature 

-

3import feature_gen_dt 

-

4from typing import List, Union 

-

5from math import pi 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11PREFACTOR = 2 * pi / 11. 

-

12 

-

13 

-

14class CyclicMonthOfYear(_BaseDatetimeFeature): 

-

15 """Create new columns based on the cyclic mapping of the month of the year. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 columns : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 * fit & transform with pandas 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

28 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

29 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B A__month_of_year_cos A__month_of_year_sin 

-

32 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

33 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 

-

34 2 NaT 0 NaN NaN 

-

35 

-

36 * fit & transform with koalas 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

40 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

41 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__month_of_year_cos A__month_of_year_sin 

-

44 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 

-

45 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 

-

46 2 NaT 0 NaN NaN 

-

47 

-

48 * fit with pandas & transform with numpy 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

52 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

53 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

57 [Timestamp('2020-12-15 18:00:00'), 1, 1.0, 

-

58 -2.4492935982947064e-16], 

-

59 [NaT, 0, nan, nan]], dtype=object) 

-

60 

-

61 * fit with koalas & transform with numpy 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.feature_generation_dt import CyclicMonthOfYear 

-

65 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

66 >>> obj = CyclicMonthOfYear(columns=['A']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], 

-

70 [Timestamp('2020-12-15 18:00:00'), 1, 1.0, 

-

71 -2.4492935982947064e-16], 

-

72 [NaT, 0, nan, nan]], dtype=object) 

-

73 

-

74 

-

75 """ 

-

76 

-

77 def __init__(self, columns: List[str]): 

-

78 if not isinstance(columns, list): 

-

79 raise TypeError('`columns` should be a list.') 

-

80 if not columns: 

-

81 raise ValueError('`columns` should not be empty.') 

-

82 column_names = self.get_cyclic_column_names(columns, 'month_of_year') 

-

83 column_mapping = { 

-

84 name: col for name, col in zip(column_names, columns + columns)} 

-

85 _BaseDatetimeFeature.__init__( 

-

86 self, columns, column_names, column_mapping) 

-

87 

-

88 def transform( 

-

89 self, 

-

90 X: Union[pd.DataFrame, ks.DataFrame] 

-

91 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

92 """Transform the dataframe `X`. 

-

93 

-

94 Parameters 

-

95 ---------- 

-

96 X : Union[pd.DataFrame, ks.DataFrame]. 

-

97 Input dataframe. 

-

98 

-

99 Returns 

-

100 ------- 

-

101 Union[pd.DataFrame, ks.DataFrame] 

-

102 Transformed dataframe. 

-

103 """ 

-

104 self.check_dataframe(X) 

-

105 return self.compute_cyclic_month_of_year( 

-

106 X, self.columns, self.column_names) 

-

107 

-

108 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

109 """Transform the NumPy array `X`. 

-

110 

-

111 Parameters 

-

112 ---------- 

-

113 X : np.ndarray 

-

114 Input array. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 np.ndarray 

-

119 Transformed array. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.cyclic_month_of_year( 

-

123 X, self.idx_columns, PREFACTOR) 

-

124 

-

125 @ staticmethod 

-

126 def compute_cyclic_month_of_year( 

-

127 X: Union[pd.DataFrame, ks.DataFrame], 

-

128 columns: List[str], 

-

129 column_names: List[str] 

-

130 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

131 """Compute the cyclic hours of the day features. 

-

132 

-

133 Parameters 

-

134 ---------- 

-

135 X : Union[pd.DataFrame, ks.DataFrame] 

-

136 Dataframe of datetime columns. 

-

137 

-

138 column_names : List[str], default to None. 

-

139 List of column names. 

-

140 

-

141 Returns 

-

142 ------- 

-

143 Union[pd.DataFrame, ks.DataFrame] 

-

144 Dataframe of cyclic hours of the day features. 

-

145 """ 

-

146 if isinstance(X, pd.DataFrame): 

-

147 dummy = X[columns].apply(lambda x: PREFACTOR * (x.dt.month - 1.)) 

-

148 X_cyclic = dummy.agg(['cos', 'sin']) 

-

149 X_cyclic.columns = column_names 

-

150 return X.join(X_cyclic) 

-

151 

-

152 for i, col in enumerate(columns): 

-

153 X = X.assign( 

-

154 dummy_cos=np.cos(PREFACTOR * (X[col].dt.month - 1.)), 

-

155 dummy_sin=np.sin(PREFACTOR * (X[col].dt.month - 1.)) 

-

156 ).rename( 

-

157 columns={ 

-

158 'dummy_cos': column_names[2*i], 

-

159 'dummy_sin': column_names[2*i+1]} 

-

160 ) 

-

161 return X 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_delta_time_py.html b/cov_html/gators_feature_generation_dt_delta_time_py.html deleted file mode 100644 index cee9a143..00000000 --- a/cov_html/gators_feature_generation_dt_delta_time_py.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/delta_time.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ..util import util 

-

4from ..transformers import Transformer 

-

5from typing import List, Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class DeltaTime(Transformer): 

-

12 """Create new columns based on the time difference in sec. between two columns. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import DeltaTime 

-

25 >>> X = pd.DataFrame( 

-

26 >>> { 

-

27 >>> 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

28 >>> 'B': [0, 1, 0], 

-

29 >>> 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT], 

-

30 >>> } 

-

31 >>> ) 

-

32 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

33 >>> obj.fit_transform(X) 

-

34 A B C C__A__Deltatime[s] 

-

35 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 

-

36 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 

-

37 2 NaT 0 NaT NaN 

-

38 

-

39 * fit & transform with koalas 

-

40 

-

41 >>> import databricks.koalas as ks 

-

42 >>> from gators.feature_generation_dt import DeltaTime 

-

43 >>> X = ks.DataFrame( 

-

44 >>> { 

-

45 >>> 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

46 >>> 'B': [0, 1, 0], 

-

47 >>> 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT], 

-

48 >>> } 

-

49 >>> ) 

-

50 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

51 >>> obj.fit_transform(X) 

-

52 A B C C__A__Deltatime[s] 

-

53 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 

-

54 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 

-

55 2 NaT 0 NaT NaN 

-

56 

-

57 * fit with pandas & transform with numpy 

-

58 

-

59 >>> import pandas as pd 

-

60 >>> from gators.feature_generation_dt import DeltaTime 

-

61 >>> X = pd.DataFrame( 

-

62 >>> { 

-

63 >>> 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

64 >>> 'B': [0, 1, 0], 

-

65 >>> 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT], 

-

66 >>> } 

-

67 >>> ) 

-

68 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([[Timestamp('2020-01-01 23:00:00'), 0, 

-

72 Timestamp('2020-01-02 05:00:00'), 21600.0], 

-

73 [Timestamp('2020-01-15 18:00:00'), 1, 

-

74 Timestamp('2020-01-15 23:00:00'), 18000.0], 

-

75 [NaT, 0, NaT, nan]], dtype=object) 

-

76 

-

77 * fit with koalas & transform with numpy 

-

78 

-

79 >>> import databricks.koalas as ks 

-

80 >>> from gators.feature_generation_dt import DeltaTime 

-

81 >>> X = ks.DataFrame( 

-

82 >>> { 

-

83 >>> 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], 

-

84 >>> 'B': [0, 1, 0], 

-

85 >>> 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT], 

-

86 >>> } 

-

87 >>> ) 

-

88 >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) 

-

89 >>> _ = obj.fit(X) 

-

90 >>> obj.transform_numpy(X.to_numpy()) 

-

91 array([[Timestamp('2020-01-01 23:00:00'), 0, 

-

92 Timestamp('2020-01-02 05:00:00'), 21600.0], 

-

93 [Timestamp('2020-01-15 18:00:00'), 1, 

-

94 Timestamp('2020-01-15 23:00:00'), 18000.0], 

-

95 [NaT, 0, NaT, nan]], dtype=object) 

-

96 

-

97 

-

98 """ 

-

99 

-

100 def __init__(self, columns_a: List[str], columns_b: List[str]): 

-

101 Transformer.__init__(self) 

-

102 if not isinstance(columns_a, list): 

-

103 raise TypeError('`columns_a` should be a list.') 

-

104 if not columns_a: 

-

105 raise ValueError('`columns_a` should not be empty.') 

-

106 if not isinstance(columns_b, list): 

-

107 raise TypeError('`columns_b` should be a list.') 

-

108 if not columns_b: 

-

109 raise ValueError('`columns_b` should not be empty.') 

-

110 if len(columns_b) != len(columns_a): 

-

111 raise ValueError( 

-

112 '`columns_a` and `columns_b` should have the same length.') 

-

113 self.unit = 's' 

-

114 self.columns_a = columns_a 

-

115 self.columns_b = columns_b 

-

116 self.deltatime_dtype = f'timedelta64[{self.unit}]' 

-

117 self.column_names = [ 

-

118 f'{c_a}__{c_b}__Deltatime[{self.unit}]' 

-

119 for c_a, c_b in zip(columns_a, columns_b) 

-

120 ] 

-

121 self.column_mapping = { 

-

122 name: [c_a, c_b] for name, c_a, c_b 

-

123 in zip(self.column_names, columns_a, columns_b) 

-

124 } 

-

125 

-

126 def fit(self, 

-

127 X: Union[pd.DataFrame, ks.DataFrame], 

-

128 y: Union[pd.Series, ks.Series] = None) -> 'DeltaTime': 

-

129 """Fit the transformer on the dataframe `X`. 

-

130 

-

131 Parameters 

-

132 ---------- 

-

133 X : pd.DataFrame 

-

134 Input dataframe. 

-

135 y : Union[pd.Series, ks.Series], default to None. 

-

136 Target values. 

-

137 

-

138 Returns 

-

139 ------- 

-

140 DeltaTime 

-

141 Instance of itself. 

-

142 """ 

-

143 self.check_dataframe(X) 

-

144 columns = list(set(self.columns_a+self.columns_b)) 

-

145 X_datetime_dtype = X.iloc[:5000][columns].dtypes 

-

146 for column in columns: 

-

147 if not np.issubdtype(X_datetime_dtype[column], np.datetime64): 

-

148 raise TypeError( 

-

149 """ 

-

150 Datetime columns should be of subtype np.datetime64. 

-

151 Use `ConvertColumnDatatype` to convert the dtype. 

-

152 """) 

-

153 self.idx_columns_a = util.get_idx_columns( 

-

154 columns=X.columns, 

-

155 selected_columns=self.columns_a, 

-

156 ) 

-

157 self.idx_columns_b = util.get_idx_columns( 

-

158 columns=X.columns, 

-

159 selected_columns=self.columns_b, 

-

160 ) 

-

161 return self 

-

162 

-

163 def transform( 

-

164 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

165 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

166 """Transform the dataframe `X`. 

-

167 

-

168 Parameters 

-

169 ---------- 

-

170 X : Union[pd.DataFrame, ks.DataFrame]. 

-

171 Input dataframe. 

-

172 

-

173 Returns 

-

174 ------- 

-

175 Union[pd.DataFrame, ks.DataFrame] 

-

176 Transformed dataframe. 

-

177 """ 

-

178 self.check_dataframe(X) 

-

179 if isinstance(X, pd.DataFrame): 

-

180 for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): 

-

181 X.loc[:, name] = (X[c_a] - X[c_b]).astype(self.deltatime_dtype) 

-

182 return X 

-

183 for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): 

-

184 X = X.assign( 

-

185 dummy=(X[c_a].astype(float) - X[c_b].astype(float))).rename( 

-

186 columns={'dummy': name}) 

-

187 return X 

-

188 

-

189 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

190 """Transform the array X. 

-

191 

-

192 Parameters 

-

193 ---------- 

-

194 X : np.ndarray 

-

195 Input array. 

-

196 

-

197 Returns 

-

198 ------- 

-

199 np.ndarray: 

-

200 Array with the datetime features added. 

-

201 """ 

-

202 self.check_array(X) 

-

203 return feature_gen_dt.deltatime( 

-

204 X, self.idx_columns_a, self.idx_columns_b) 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_ordinal_day_of_month_py.html b/cov_html/gators_feature_generation_dt_ordinal_day_of_month_py.html deleted file mode 100644 index a01568a3..00000000 --- a/cov_html/gators_feature_generation_dt_ordinal_day_of_month_py.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/ordinal_day_of_month.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalDayOfMonth(_BaseDatetimeFeature): 

-

11 """Create new columns based on the day of the month. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 * fit & transform with pandas 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

24 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

25 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

26 >>> obj.fit_transform(X) 

-

27 A B A__day_of_month 

-

28 0 2020-01-01 23:00:00 0 1.0 

-

29 1 2020-12-15 18:00:00 1 15.0 

-

30 2 NaT 0 nan 

-

31 

-

32 * fit & transform with koalas 

-

33 

-

34 >>> import databricks.koalas as ks 

-

35 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

36 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

37 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

38 >>> obj.fit_transform(X) 

-

39 A B A__day_of_month 

-

40 0 2020-01-01 23:00:00 0 1.0 

-

41 1 2020-12-15 18:00:00 1 15.0 

-

42 2 NaT 0 nan 

-

43 

-

44 * fit with pandas & transform with numpy 

-

45 

-

46 >>> import pandas as pd 

-

47 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

48 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

49 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

50 >>> _ = obj.fit(X) 

-

51 >>> obj.transform_numpy(X.to_numpy()) 

-

52 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

53 [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], 

-

54 [NaT, 0, 'nan']], dtype=object) 

-

55 

-

56 * fit with koalas & transform with numpy 

-

57 

-

58 >>> import databricks.koalas as ks 

-

59 >>> from gators.feature_generation_dt import OrdinalDayOfMonth 

-

60 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

61 >>> obj = OrdinalDayOfMonth(columns=['A']) 

-

62 >>> _ = obj.fit(X) 

-

63 >>> obj.transform_numpy(X.to_numpy()) 

-

64 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

65 [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], 

-

66 [NaT, 0, 'nan']], dtype=object) 

-

67 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, columns: List[str]): 

-

72 if not isinstance(columns, list): 

-

73 raise TypeError('`columns` should be a list.') 

-

74 if not columns: 

-

75 raise ValueError('`columns` should not be empty.') 

-

76 column_names = [f'{c}__day_of_month' for c in columns] 

-

77 column_mapping = dict(zip(column_names, columns)) 

-

78 _BaseDatetimeFeature.__init__( 

-

79 self, columns, column_names, column_mapping) 

-

80 

-

81 def transform( 

-

82 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

83 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

84 """Transform the dataframe `X`. 

-

85 

-

86 Parameters 

-

87 ---------- 

-

88 X : Union[pd.DataFrame, ks.DataFrame]. 

-

89 Input dataframe. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 Union[pd.DataFrame, ks.DataFrame] 

-

94 Transformed dataframe. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 if isinstance(X, pd.DataFrame): 

-

98 X_ordinal = X[self.columns].apply( 

-

99 lambda x: x.dt.day.astype(np.float64).astype(str)) 

-

100 X_ordinal.columns = self.column_names 

-

101 return X.join(X_ordinal) 

-

102 

-

103 for col, name in zip(self.columns, self.column_names): 

-

104 X = X.assign( 

-

105 dummy=X[col].dt.day.astype(np.float64).astype(str) 

-

106 ).rename(columns={'dummy': name}) 

-

107 return X 

-

108 

-

109 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

110 """Transform the array X. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : np.ndarray 

-

115 Input array. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 np.ndarray: Dataset with the Tree features. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.ordinal_day_of_month( 

-

123 X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_ordinal_day_of_week_py.html b/cov_html/gators_feature_generation_dt_ordinal_day_of_week_py.html deleted file mode 100644 index fc021ea2..00000000 --- a/cov_html/gators_feature_generation_dt_ordinal_day_of_week_py.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/ordinal_day_of_week.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalDayOfWeek(_BaseDatetimeFeature): 

-

11 """Create new columns based on the day of the week. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

25 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

26 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__day_of_week 

-

29 0 2020-01-01 23:00:00 0 2.0 

-

30 1 2020-12-15 18:00:00 1 1.0 

-

31 2 NaT 0 nan 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

37 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

38 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__day_of_week  

-

41 0 2020-01-01 23:00:00 0 2.0 

-

42 1 2020-12-15 18:00:00 1 1.0 

-

43 2 NaT 0 nan 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

49 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

50 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], 

-

54 [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], 

-

55 [NaT, 0, 'nan']], dtype=object) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_dt import OrdinalDayOfWeek 

-

61 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

62 >>> obj = OrdinalDayOfWeek(columns=['A']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], 

-

66 [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], 

-

67 [NaT, 0, 'nan']], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 column_names = [f'{c}__day_of_week' for c in columns] 

-

78 column_mapping = dict(zip(column_names, columns)) 

-

79 _BaseDatetimeFeature.__init__( 

-

80 self, columns, column_names, column_mapping) 

-

81 

-

82 def transform( 

-

83 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

84 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

85 """Transform the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Union[pd.DataFrame, ks.DataFrame] 

-

95 Transformed dataframe. 

-

96 """ 

-

97 self.check_dataframe(X) 

-

98 if isinstance(X, pd.DataFrame): 

-

99 X_ordinal = X[self.columns].apply( 

-

100 lambda x: x.dt.dayofweek.astype(np.float64).astype(str)) 

-

101 X_ordinal.columns = self.column_names 

-

102 return X.join(X_ordinal) 

-

103 

-

104 for col, name in zip(self.columns, self.column_names): 

-

105 X = X.assign( 

-

106 dummy=X[col].dt.dayofweek.astype(np.float64).astype(str) 

-

107 ).rename(columns={'dummy': name}) 

-

108 return X 

-

109 

-

110 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

111 """Transform the array X. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : np.ndarray 

-

116 Input array. 

-

117 

-

118 Returns 

-

119 ------- 

-

120 np.ndarray: 

-

121 Transformed array. 

-

122 """ 

-

123 self.check_array(X) 

-

124 return feature_gen_dt.ordinal_day_of_week( 

-

125 X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_ordinal_hour_of_day_py.html b/cov_html/gators_feature_generation_dt_ordinal_hour_of_day_py.html deleted file mode 100644 index cfbb58d1..00000000 --- a/cov_html/gators_feature_generation_dt_ordinal_hour_of_day_py.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/ordinal_hour_of_day.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalHourOfDay(_BaseDatetimeFeature): 

-

11 """Create new columns based on the hour of the day. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

25 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

26 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__hour_of_day 

-

29 0 2020-01-01 23:00:00 0 23.0 

-

30 1 2020-12-15 18:00:00 1 18.0 

-

31 2 NaT 0 nan 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

37 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

38 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__hour_of_day 

-

41 0 2020-01-01 23:00:00 0 23.0 

-

42 1 2020-12-15 18:00:00 1 18.0 

-

43 2 NaT 0 nan 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

49 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

50 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], 

-

54 [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], 

-

55 [NaT, 0, 'nan']], dtype=object) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_dt import OrdinalHourOfDay 

-

61 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

62 >>> obj = OrdinalHourOfDay(columns=['A']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], 

-

66 [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], 

-

67 [NaT, 0, 'nan']], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 column_names = [f'{c}__hour_of_day' for c in columns] 

-

78 column_mapping = dict(zip(column_names, columns)) 

-

79 _BaseDatetimeFeature.__init__( 

-

80 self, columns, column_names, column_mapping) 

-

81 

-

82 def transform( 

-

83 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

84 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

85 """Transform the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Union[pd.DataFrame, ks.DataFrame] 

-

95 Transformed dataframe. 

-

96 """ 

-

97 if isinstance(X, pd.DataFrame): 

-

98 X_ordinal = X[self.columns].apply( 

-

99 lambda x: x.dt.hour.astype(np.float64).astype(str)) 

-

100 X_ordinal.columns = self.column_names 

-

101 return X.join(X_ordinal) 

-

102 

-

103 for col, name in zip(self.columns, self.column_names): 

-

104 X = X.assign( 

-

105 dummy=X[col].dt.hour.astype(np.float64).astype(str) 

-

106 ).rename(columns={'dummy': name}) 

-

107 return X 

-

108 

-

109 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

110 """Transform the array X. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : np.ndarray 

-

115 Input array. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 np.ndarray: 

-

120 Array with the datetime features added. 

-

121 """ 

-

122 self.check_array(X) 

-

123 return feature_gen_dt.ordinal_hour_of_day( 

-

124 X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_ordinal_minute_of_hour_py.html b/cov_html/gators_feature_generation_dt_ordinal_minute_of_hour_py.html deleted file mode 100644 index c57b991e..00000000 --- a/cov_html/gators_feature_generation_dt_ordinal_minute_of_hour_py.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/ordinal_minute_of_hour.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalMinuteOfHour(_BaseDatetimeFeature): 

-

11 """Create new columns based on the minute of the hour. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

25 >>> X = ks.DataFrame( 

-

26 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

27 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

28 >>> obj.fit_transform(X) 

-

29 A B A__minute_of_hour 

-

30 0 2020-01-01 23:00:00 0 23.0 

-

31 1 2020-12-15 18:00:00 1 18.0 

-

32 2 NaT 0 nan 

-

33 

-

34 * fit & transform with koalas 

-

35 

-

36 >>> import databricks.koalas as ks 

-

37 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

38 >>> X = ks.DataFrame( 

-

39 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

40 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

41 >>> obj.fit_transform(X) 

-

42 A B A__minute_of_hour 

-

43 0 2020-01-01 23:00:00 0 23.0 

-

44 1 2020-12-15 18:00:00 1 18.0 

-

45 2 NaT 0 nan 

-

46 

-

47 * fit with pandas & transform with numpy 

-

48 

-

49 >>> import pandas as pd 

-

50 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

51 >>> X = ks.DataFrame( 

-

52 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

53 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

54 >>> _ = obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], 

-

57 [Timestamp('2020-12-15 18:00:00'), 1, '59.0'], 

-

58 [NaT, 0, 'nan']], dtype=object) 

-

59 

-

60 * fit with koalas & transform with numpy 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> from gators.feature_generation_dt import OrdinalMinuteOfHour 

-

64 >>> X = ks.DataFrame( 

-

65 ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) 

-

66 >>> obj = OrdinalMinuteOfHour(columns=['A']) 

-

67 >>> _ = obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], 

-

70 [Timestamp('2020-12-15 18:00:00'), 1, '59.0'], 

-

71 [NaT, 0, 'nan']], dtype=object) 

-

72 

-

73 

-

74 """ 

-

75 

-

76 def __init__(self, columns: List[str]): 

-

77 if not isinstance(columns, list): 

-

78 raise TypeError('`columns` should be a list.') 

-

79 if not columns: 

-

80 raise ValueError('`columns` should not be empty.') 

-

81 column_names = [f'{c}__minute_of_hour' for c in columns] 

-

82 column_mapping = dict(zip(column_names, columns)) 

-

83 _BaseDatetimeFeature.__init__( 

-

84 self, columns, column_names, column_mapping) 

-

85 

-

86 def transform( 

-

87 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

88 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

89 """Transform the dataframe `X`. 

-

90 

-

91 Parameters 

-

92 ---------- 

-

93 X : Union[pd.DataFrame, ks.DataFrame]. 

-

94 Input dataframe. 

-

95 

-

96 Returns 

-

97 ------- 

-

98 Union[pd.DataFrame, ks.DataFrame] 

-

99 Transformed dataframe. 

-

100 """ 

-

101 if isinstance(X, pd.DataFrame): 

-

102 X_ordinal = X[self.columns].apply( 

-

103 lambda x: x.dt.minute.astype(np.float64).astype(str)) 

-

104 X_ordinal.columns = self.column_names 

-

105 return X.join(X_ordinal) 

-

106 

-

107 for col, name in zip(self.columns, self.column_names): 

-

108 X = X.assign( 

-

109 dummy=X[col].dt.minute.astype(np.float64).astype(str) 

-

110 ).rename(columns={'dummy': name}) 

-

111 return X 

-

112 

-

113 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

114 """Transform the array X. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : np.ndarray 

-

119 Input array. 

-

120 

-

121 Returns 

-

122 ------- 

-

123 np.ndarray: 

-

124 Array with the datetime features added. 

-

125 """ 

-

126 self.check_array(X) 

-

127 return feature_gen_dt.ordinal_minute_of_hour( 

-

128 X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_dt_ordinal_month_of_year_py.html b/cov_html/gators_feature_generation_dt_ordinal_month_of_year_py.html deleted file mode 100644 index 45ad962f..00000000 --- a/cov_html/gators_feature_generation_dt_ordinal_month_of_year_py.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - Coverage for gators/feature_generation_dt/ordinal_month_of_year.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2import feature_gen_dt 

-

3from ._base_datetime_feature import _BaseDatetimeFeature 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class OrdinalMonthOfYear(_BaseDatetimeFeature): 

-

11 """Create new columns based on the month of the year. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

25 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

26 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__month_of_year 

-

29 0 2020-01-01 23:00:00 0 1.0 

-

30 1 2020-12-15 18:00:00 1 12.0 

-

31 2 NaT 0 nan 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

37 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

38 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__month_of_year 

-

41 0 2020-01-01 23:00:00 0 1.0 

-

42 1 2020-12-15 18:00:00 1 12.0 

-

43 2 NaT 0 nan 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

49 >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

50 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

54 [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], 

-

55 [NaT, 0, 'nan']], dtype=object) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_dt import OrdinalMonthOfYear 

-

61 >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) 

-

62 >>> obj = OrdinalMonthOfYear(columns=['A']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], 

-

66 [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], 

-

67 [NaT, 0, 'nan']], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 column_names = [f'{c}__month_of_year' for c in columns] 

-

78 column_mapping = dict(zip(column_names, columns)) 

-

79 _BaseDatetimeFeature.__init__( 

-

80 self, columns, column_names, column_mapping) 

-

81 

-

82 def transform( 

-

83 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

84 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

85 """Transform the dataframe `X`. 

-

86 

-

87 Parameters 

-

88 ---------- 

-

89 X : Union[pd.DataFrame, ks.DataFrame]. 

-

90 Input dataframe. 

-

91 

-

92 Returns 

-

93 ------- 

-

94 Union[pd.DataFrame, ks.DataFrame] 

-

95 Transformed dataframe. 

-

96 """ 

-

97 if isinstance(X, pd.DataFrame): 

-

98 X_ordinal = X[self.columns].apply( 

-

99 lambda x: x.dt.month.astype(np.float64).astype(str)) 

-

100 X_ordinal.columns = self.column_names 

-

101 return X.join(X_ordinal) 

-

102 

-

103 for col, name in zip(self.columns, self.column_names): 

-

104 X = X.assign( 

-

105 dummy=X[col].dt.month.astype(np.float64).astype(str) 

-

106 ).rename(columns={'dummy': name}) 

-

107 return X 

-

108 

-

109 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

110 """Transform the array X. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : np.ndarray 

-

115 Input array. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 np.ndarray: Dataset with the Tree features. 

-

120 """ 

-

121 self.check_array(X) 

-

122 return feature_gen_dt.ordinal_month_of_year( 

-

123 X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_elementary_arithmethics_py.html b/cov_html/gators_feature_generation_elementary_arithmethics_py.html deleted file mode 100644 index fe26b768..00000000 --- a/cov_html/gators_feature_generation_elementary_arithmethics_py.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - Coverage for gators/feature_generation/elementary_arithmethics.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from gators.feature_generation._base_feature_generation import _BaseFeatureGeneration 

-

7from feature_gen import elementary_arithmetics, elementary_arithmetics_object 

-

8 

-

9EPSILON = 1e-10 

-

10 

-

11 

-

12class ElementaryArithmetics(_BaseFeatureGeneration): 

-

13 """Create new columns based on elementary arithmetics. 

-

14 

-

15 The data should be composed of numerical columns only. 

-

16 Use `gators.encoders` to replace the categorical columns by 

-

17 numerical ones before using `ElementaryArithmetics`. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 columns_a : List[str] 

-

22 List of columns. 

-

23 columns_b : List[str] 

-

24 List of columns. 

-

25 operator : str 

-

26 Arithmetic perator. 

-

27 column_names : List[str], default to None. 

-

28 List of new column names. 

-

29 coef : float, default to 1. 

-

30 Coefficient value. Defaults to 1. 

-

31 dtype : type, default to np.float64. 

-

32 Numerical datatype of the output data. 

-

33 

-

34 Examples 

-

35 --------- 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> from gators.feature_generation import ElementaryArithmetics 

-

39 >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) 

-

40 >>> obj = ElementaryArithmetics( 

-

41 ... columns_a=['A'], columns_b=['B'], operator='+', coef=0.1) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__+__B 

-

44 0 1.0 1.0 1.1 

-

45 1 1.0 2.0 1.2 

-

46 2 1.0 3.0 1.3 

-

47 

-

48 >>> import pandas as pd 

-

49 >>> from gators.feature_generation import ElementaryArithmetics 

-

50 >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

51 >>> obj = ElementaryArithmetics( 

-

52 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

53 >>> obj.fit_transform(X) 

-

54 A B A__/__B 

-

55 0 1.0 1.0 0.999999 

-

56 1 1.0 2.0 0.500000 

-

57 2 1.0 3.0 0.333333 

-

58 

-

59 >>> import pandas as pd 

-

60 >>> from gators.feature_generation import ElementaryArithmetics 

-

61 >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) 

-

62 >>> obj = ElementaryArithmetics( 

-

63 ... columns_a=['A'], columns_b=['B'], 

-

64 ... operator='/', column_names=['ratios']) 

-

65 >>> obj.fit_transform(X) 

-

66 A B ratios 

-

67 0 1.0 1.0 0.999999 

-

68 1 1.0 2.0 0.500000 

-

69 2 1.0 3.0 0.333333 

-

70 

-

71 >>> import databricks.koalas as ks 

-

72 >>> from gators.feature_generation import ElementaryArithmetics 

-

73 >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

74 >>> obj = ElementaryArithmetics( 

-

75 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

76 >>> obj.fit_transform(X) 

-

77 A B A__/__B 

-

78 0 1.0 1.0 0.999999 

-

79 1 1.0 2.0 0.500000 

-

80 2 1.0 3.0 0.333333 

-

81 

-

82 >>> import pandas as pd 

-

83 >>> from gators.feature_generation import ElementaryArithmetics 

-

84 >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

85 >>> obj = ElementaryArithmetics( 

-

86 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

87 >>> _ = obj.fit(X) 

-

88 >>> obj.transform_numpy(X.to_numpy()) 

-

89 array([[1. , 1. , 0.999999 ], 

-

90 [1. , 2. , 0.49999975], 

-

91 [1. , 3. , 0.33333322]]) 

-

92 

-

93 >>> import databricks.koalas as ks 

-

94 >>> from gators.feature_generation import ElementaryArithmetics 

-

95 >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) 

-

96 >>> obj = ElementaryArithmetics( 

-

97 ... columns_a=['A'], columns_b=['B'], operator='/') 

-

98 >>> _ = obj.fit(X) 

-

99 >>> obj.transform_numpy(X.to_numpy()) 

-

100 array([[1. , 1. , 0.999999 ], 

-

101 [1. , 2. , 0.49999975], 

-

102 [1. , 3. , 0.33333322]]) 

-

103 

-

104 """ 

-

105 

-

106 def __init__(self, columns_a: List[str], columns_b: List[str], 

-

107 operator: str, column_names: List[str] = None, 

-

108 coef: float = 1., dtype: type = np.float64): 

-

109 if not isinstance(columns_a, list): 

-

110 raise TypeError('`columns_a` should be a list.') 

-

111 if not isinstance(columns_b, list): 

-

112 raise TypeError('`columns_b` should be a list.') 

-

113 if len(columns_a) == 0: 

-

114 raise ValueError('`columns_a` should not be empty.') 

-

115 if not isinstance(operator, str): 

-

116 raise TypeError('`operator` should be a str.') 

-

117 if not isinstance(coef, float): 

-

118 raise TypeError('`coef` should be a float.') 

-

119 if column_names and not isinstance(column_names, list): 

-

120 raise TypeError('`column_names` should be a list.') 

-

121 if len(columns_a) != len(columns_b): 

-

122 raise ValueError( 

-

123 'Length of `columns_a` and `columns_a` should match.') 

-

124 if operator not in ['+', '*', '/']: 

-

125 raise ValueError( 

-

126 '`operator` should be "+", "*", or "/".') 

-

127 if not column_names: 

-

128 str_operator = operator 

-

129 if coef < 0: 

-

130 str_operator = '-' 

-

131 column_names = [ 

-

132 f'{c_a}__{str_operator}__{c_b}' 

-

133 for c_a, c_b in zip(columns_a, columns_b) 

-

134 ] 

-

135 column_mapping = { 

-

136 f'{c_a}__{str_operator}__{c_b}': [c_a, c_b] 

-

137 for c_a, c_b in zip(columns_a, columns_b) 

-

138 } 

-

139 else: 

-

140 column_mapping = { 

-

141 c: [c_a, c_b] 

-

142 for c, c_a, c_b 

-

143 in zip(column_names, columns_a, columns_b) 

-

144 } 

-

145 if len(column_names) != len(columns_a): 

-

146 raise ValueError( 

-

147 '''Length of `columns_a`, `columns_b`, 

-

148 and `column_names` should match.''') 

-

149 self.check_datatype(dtype, [np.float32, np.float64]) 

-

150 columns = list(set(columns_a + columns_b)) 

-

151 _BaseFeatureGeneration.__init__( 

-

152 self, columns=columns, column_names=column_names, 

-

153 column_mapping=column_mapping, dtype=dtype) 

-

154 self.columns = list(set(columns_a+columns_b)) 

-

155 self.columns_a = columns_a 

-

156 self.columns_b = columns_b 

-

157 self.idx_columns_a: np.ndarray = np.array([]) 

-

158 self.idx_columns_b: np.ndarray = np.array([]) 

-

159 self.operator = operator 

-

160 self.coef = coef 

-

161 

-

162 def fit(self, 

-

163 X: Union[pd.DataFrame, ks.DataFrame], 

-

164 y: Union[pd.Series, ks.Series] = None) -> 'ElementaryArithmetics': 

-

165 """Fit the transformer on the dataframe `X`. 

-

166 

-

167 Parameters 

-

168 ---------- 

-

169 X : Union[pd.DataFrame, ks.DataFrame]. 

-

170 Input dataframe. 

-

171 y : None 

-

172 None. 

-

173 

-

174 Returns 

-

175 ------- 

-

176 ElementaryArithmetics 

-

177 Instance of itself. 

-

178 """ 

-

179 self.check_dataframe(X) 

-

180 self.check_dataframe_is_numerics(X) 

-

181 self.idx_columns_a = self.get_idx_columns( 

-

182 columns=X.columns, 

-

183 selected_columns=self.columns_a 

-

184 ) 

-

185 self.idx_columns_b = self.get_idx_columns( 

-

186 columns=X.columns, 

-

187 selected_columns=self.columns_b 

-

188 ) 

-

189 return self 

-

190 

-

191 def transform( 

-

192 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

193 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

194 """Transform the dataframe `X`. 

-

195 

-

196 Parameters 

-

197 ---------- 

-

198 X : Union[pd.DataFrame, ks.DataFrame]. 

-

199 Input dataframe. 

-

200 

-

201 Returns 

-

202 ------- 

-

203 Union[pd.DataFrame, ks.DataFrame] 

-

204 Transformed dataframe. 

-

205 """ 

-

206 self.check_dataframe(X) 

-

207 self.check_dataframe_is_numerics(X) 

-

208 for c_a, c_b, c in zip( 

-

209 self.columns_a, self.columns_b, self.column_names): 

-

210 if self.operator == '+': 

-

211 X[c] = X[c_a] + self.coef * X[c_b] 

-

212 elif self.operator == '*': 

-

213 X[c] = X[c_a] * X[c_b] 

-

214 else: 

-

215 X[c] = X[c_a] / (X[c_b] + EPSILON) 

-

216 X[c] = X[c] 

-

217 X = X.astype(self.dtype) 

-

218 return X 

-

219 

-

220 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

221 """Transform the NumPy array `X`. 

-

222 

-

223 Parameters 

-

224 ---------- 

-

225 X : np.ndarray 

-

226 Input array. 

-

227 

-

228 Returns 

-

229 ------- 

-

230 np.ndarray 

-

231 Transformed array. 

-

232 """ 

-

233 self.check_array(X) 

-

234 return elementary_arithmetics( 

-

235 X.astype(self.dtype), self.idx_columns_a, self.idx_columns_b, 

-

236 self.operator, self.coef, EPSILON, self.dtype 

-

237 ) 

-

238 

-

239 @staticmethod 

-

240 def get_idx_columns( 

-

241 columns: List[str], 

-

242 selected_columns: List[str]) -> np.ndarray: 

-

243 """Get the indices of the columns used for the combination. 

-

244 

-

245 Parameters 

-

246 ---------- 

-

247 columns : List[str] 

-

248 List of columns. 

-

249 selected_columns : List[str] 

-

250 List of columns. 

-

251 

-

252 Returns: 

-

253 np.ndarray 

-

254 Array of indices. 

-

255 """ 

-

256 idx = [] 

-

257 for selected_column in selected_columns: 

-

258 for i, column in enumerate(columns): 

-

259 if column == selected_column: 

-

260 idx.append(i) 

-

261 break 

-

262 return np.array(idx) 

-
- - - diff --git a/cov_html/gators_feature_generation_is_equal_py.html b/cov_html/gators_feature_generation_is_equal_py.html deleted file mode 100644 index caecea5a..00000000 --- a/cov_html/gators_feature_generation_is_equal_py.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - Coverage for gators/feature_generation/is_equal.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen import is_equal_object 

-

3from feature_gen import is_equal 

-

4from ._base_feature_generation import _BaseFeatureGeneration 

-

5from ..util import util 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10 

-

11 

-

12class IsEqual(_BaseFeatureGeneration): 

-

13 """Create new columns based on value matching. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns_a : List[str] 

-

18 List of columns. 

-

19 columns_b : List[str] 

-

20 List of columns. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 * fit & transform with pandas 

-

25 

-

26 >>> import pandas as pd 

-

27 >>> from gators.feature_generation import IsEqual 

-

28 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

29 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

30 >>> obj.fit_transform(X) 

-

31 A B A__is__B 

-

32 0 1 1 1.0 

-

33 1 2 1 0.0 

-

34 2 3 1 0.0 

-

35 

-

36 * fit & transform with koalas 

-

37 

-

38 >>> import databricks.koalas as ks 

-

39 >>> from gators.feature_generation import IsEqual 

-

40 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

41 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__is__B 

-

44 0 1 1 1.0 

-

45 1 2 1 0.0 

-

46 2 3 1 0.0 

-

47 

-

48 * fit with pandas & transform with numpy 

-

49 

-

50 >>> import pandas as pd 

-

51 >>> from gators.feature_generation import IsEqual 

-

52 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

53 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

54 >>> obj.fit(X) 

-

55 >>> obj.transform_numpy(X.to_numpy()) 

-

56 array([[1, 1, 1], 

-

57 [2, 1, 0], 

-

58 [3, 1, 0]]) 

-

59 

-

60 * fit with koalas & transform with numpy 

-

61 

-

62 >>> import databricks.koalas as ks 

-

63 >>> from gators.feature_generation import IsEqual 

-

64 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) 

-

65 >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) 

-

66 >>> obj.fit(X) 

-

67 >>> obj.transform_numpy(X.to_numpy()) 

-

68 array([[1, 1, 1], 

-

69 [2, 1, 0], 

-

70 [3, 1, 0]]) 

-

71 

-

72 """ 

-

73 

-

74 def __init__(self, columns_a: List[str], columns_b: List[str], 

-

75 column_names: List[str] = None): 

-

76 if not isinstance(columns_a, list): 

-

77 raise TypeError('`columns_a` should be a list.') 

-

78 if not isinstance(columns_b, list): 

-

79 raise TypeError('`columns_b` should be a list.') 

-

80 if column_names is not None and not isinstance(column_names, list): 

-

81 raise TypeError('`columns_a` should be a list.') 

-

82 if len(columns_a) != len(columns_b): 

-

83 raise ValueError( 

-

84 'Length of `columns_a` and `columns_b` should match.') 

-

85 if len(columns_a) == 0: 

-

86 raise ValueError( 

-

87 '`columns_a` and `columns_b` should not be empty.') 

-

88 if not column_names: 

-

89 column_names = [ 

-

90 f'{c_a}__is__{c_b}' 

-

91 for c_a, c_b in zip(columns_a, columns_b) 

-

92 ] 

-

93 if len(columns_a) != len(column_names): 

-

94 raise ValueError( 

-

95 '''Length of `columns_a`, `columns_b` and `column_names` 

-

96 should match.''') 

-

97 column_mapping = { 

-

98 name: [c_a, c_b] 

-

99 for name, c_a, c_b 

-

100 in zip(column_names, columns_a, columns_b) 

-

101 } 

-

102 columns = list(set(columns_a + columns_b)) 

-

103 _BaseFeatureGeneration.__init__( 

-

104 self, columns=columns, column_names=column_names, 

-

105 column_mapping=column_mapping, dtype=None) 

-

106 self.columns_a = columns_a 

-

107 self.columns_b = columns_b 

-

108 self.idx_columns_a: List[int] = [] 

-

109 self.idx_columns_b: List[int] = [] 

-

110 

-

111 def fit(self, 

-

112 X: Union[pd.DataFrame, ks.DataFrame], 

-

113 y: Union[pd.Series, ks.Series] = None): 

-

114 """Fit the transformer on the dataframe `X`. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : Union[pd.DataFrame, ks.DataFrame]. 

-

119 Input dataframe. 

-

120 y : None 

-

121 None. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 IsEqual 

-

126 Instance of itself. 

-

127 """ 

-

128 self.check_dataframe(X) 

-

129 self.idx_columns_a = util.get_idx_columns( 

-

130 columns=X.columns, 

-

131 selected_columns=self.columns_a 

-

132 ) 

-

133 self.idx_columns_b = util.get_idx_columns( 

-

134 columns=X.columns, 

-

135 selected_columns=self.columns_b 

-

136 ) 

-

137 return self 

-

138 

-

139 def transform( 

-

140 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

141 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

142 """Transform the dataframe `X`. 

-

143 

-

144 Parameters 

-

145 ---------- 

-

146 X : Union[pd.DataFrame, ks.DataFrame]. 

-

147 Input dataframe. 

-

148 

-

149 Returns 

-

150 ------- 

-

151 Union[pd.DataFrame, ks.DataFrame] 

-

152 Transformed dataframe. 

-

153 """ 

-

154 self.check_dataframe(X) 

-

155 if isinstance(X, pd.DataFrame): 

-

156 for a, b, name in zip( 

-

157 self.columns_a, self.columns_b, self.column_names): 

-

158 x_dtype = X[a].dtype 

-

159 x_dtype = x_dtype if (x_dtype != object) and ( 

-

160 x_dtype != bool) else np.float64 

-

161 X.loc[:, name] = (X[a] == X[b]).astype(x_dtype) 

-

162 return X 

-

163 

-

164 for a, b, name in zip( 

-

165 self.columns_a, self.columns_b, self.column_names): 

-

166 x_dtype = X[a].dtype 

-

167 x_dtype = x_dtype if (x_dtype != object) and ( 

-

168 x_dtype != bool) else np.float64 

-

169 X = X.assign( 

-

170 dummy=(X[a] == X[b]).astype(x_dtype) 

-

171 ).rename(columns={'dummy': name}) 

-

172 return X 

-

173 

-

174 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

175 """Transform the NumPy array `X`. 

-

176 

-

177 Parameters 

-

178 ---------- 

-

179 X : np.ndarray 

-

180 Input array. 

-

181 

-

182 Returns 

-

183 ------- 

-

184 np.ndarray 

-

185 Transformed array. 

-

186 """ 

-

187 self.check_array(X) 

-

188 if X.dtype == object: 

-

189 return is_equal_object( 

-

190 X, self.idx_columns_a, self.idx_columns_b) 

-

191 return is_equal( 

-

192 X, self.idx_columns_a, self.idx_columns_b) 

-
- - - diff --git a/cov_html/gators_feature_generation_is_null_py.html b/cov_html/gators_feature_generation_is_null_py.html deleted file mode 100644 index 0a5e57d5..00000000 --- a/cov_html/gators_feature_generation_is_null_py.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Coverage for gators/feature_generation/is_null.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen import is_null_object 

-

3from feature_gen import is_null 

-

4from ._base_feature_generation import _BaseFeatureGeneration 

-

5from ..util import util 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10 

-

11 

-

12class IsNull(_BaseFeatureGeneration): 

-

13 """Create new columns based on missing values. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 dtype : type, default to np.float64 

-

20 Numpy dtype of the output variables. 

-

21 

-

22 Examples 

-

23 --------- 

-

24 

-

25 * fit & transform with pandas 

-

26 

-

27 >>> import pandas as pd 

-

28 >>> from gators.feature_generation import IsNull 

-

29 >>> X = pd.DataFrame({'A': [None, 2, 3], 'B': [np.nan, 1, 1]}) 

-

30 >>> obj = IsNull(columns=['A', 'B']) 

-

31 >>> obj.fit_transform(X) 

-

32 A B A__is_null B__is_null 

-

33 0 NaN NaN 1.0 1.0 

-

34 1 2.0 1.0 0.0 0.0 

-

35 2 3.0 1.0 0.0 0.0 

-

36 

-

37 * fit & transform with koalas 

-

38 

-

39 >>> import databricks.koalas as ks 

-

40 >>> from gators.feature_generation import IsNull 

-

41 >>> X = ks.DataFrame({'A': [None, 2, 3], 'B': [np.nan, 1, 1]}) 

-

42 >>> obj = IsNull(columns=['A', 'B']) 

-

43 >>> obj.fit_transform(X) 

-

44 A B A__is_null B__is_null 

-

45 0 NaN NaN 1.0 1.0 

-

46 1 2.0 1.0 0.0 0.0 

-

47 2 3.0 1.0 0.0 0.0 

-

48 

-

49 * fit with pandas & transform with numpy 

-

50 

-

51 >>> import pandas as pd 

-

52 >>> from gators.feature_generation import IsNull 

-

53 >>> X = pd.DataFrame({'A': [None, 2, 3], 'B': [np.nan, 1, 1]}) 

-

54 >>> obj = IsNull(columns=['A', 'B']) 

-

55 >>> obj.fit(X) 

-

56 >>> obj.transform_numpy(X.to_numpy()) 

-

57 array([[nan, nan, 1., 1.], 

-

58 [ 2., 1., 0., 0.], 

-

59 [ 3., 1., 0., 0.]]) 

-

60 

-

61 * fit with koalas & transform with numpy 

-

62 

-

63 >>> import databricks.koalas as ks 

-

64 >>> from gators.feature_generation import IsNull 

-

65 >>> X = ks.DataFrame({'A': [None, 2, 3], 'B': [np.nan, 1, 1]}) 

-

66 >>> obj = IsNull(columns=['A', 'B']) 

-

67 >>> obj.fit(X) 

-

68 >>> obj.transform_numpy(X.to_numpy()) 

-

69 array([[nan, nan, 1., 1.], 

-

70 [ 2., 1., 0., 0.], 

-

71 [ 3., 1., 0., 0.]]) 

-

72 

-

73 """ 

-

74 

-

75 def __init__(self, columns: List[str], 

-

76 column_names: List[str] = None, dtype: type = np.float64): 

-

77 if not isinstance(columns, list): 

-

78 raise TypeError('`columns` should be a list.') 

-

79 if not columns: 

-

80 raise ValueError('`columns` should not be empty.') 

-

81 if column_names is not None and not isinstance(column_names, list): 

-

82 raise TypeError('`column_names` should be a list.') 

-

83 if not column_names: 

-

84 column_names = [f'{c}__is_null' for c in columns] 

-

85 if len(column_names) != len(columns): 

-

86 raise ValueError( 

-

87 'Length of `columns` and `column_names` should match.') 

-

88 column_mapping = dict(zip(column_names, columns)) 

-

89 _BaseFeatureGeneration.__init__( 

-

90 self, columns=columns, column_names=column_names, 

-

91 column_mapping=column_mapping, dtype=dtype) 

-

92 

-

93 def fit(self, 

-

94 X: Union[pd.DataFrame, ks.DataFrame], 

-

95 y: Union[pd.Series, ks.Series] = None): 

-

96 """ 

-

97 Fit the dataframe X. 

-

98 

-

99 Parameters 

-

100 ---------- 

-

101 X : Union[pd.DataFrame, ks.DataFrame]. 

-

102 Input dataframe. 

-

103 y (np.ndarray, optional): labels. Defaults to None. 

-

104 

-

105 Returns 

-

106 ------- 

-

107 IsNull: 

-

108 Instance of itself. 

-

109 """ 

-

110 self.check_dataframe(X) 

-

111 self.idx_columns = util.get_idx_columns( 

-

112 columns=X.columns, 

-

113 selected_columns=self.columns 

-

114 ) 

-

115 return self 

-

116 

-

117 def transform( 

-

118 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

119 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

120 """Transform the dataframe `X`. 

-

121 

-

122 Parameters 

-

123 ---------- 

-

124 X : Union[pd.DataFrame, ks.DataFrame]. 

-

125 Input dataframe. 

-

126 

-

127 Returns 

-

128 ------- 

-

129 Union[pd.DataFrame, ks.DataFrame] 

-

130 Transformed dataframe. 

-

131 """ 

-

132 self.check_dataframe(X) 

-

133 if isinstance(X, pd.DataFrame): 

-

134 X[self.column_names] = X[self.columns].isnull().astype(self.dtype) 

-

135 return X 

-

136 for col, name in zip(self.columns, self.column_names): 

-

137 X = X.assign( 

-

138 dummy=X[col].isnull().astype(self.dtype) 

-

139 ).rename(columns={'dummy': name}) 

-

140 return X 

-

141 

-

142 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

143 """Transform the NumPy array `X`. 

-

144 

-

145 Parameters 

-

146 ---------- 

-

147 X : np.ndarray 

-

148 Input array. 

-

149 

-

150 Returns 

-

151 ------- 

-

152 np.ndarray 

-

153 Transformed array. 

-

154 """ 

-

155 self.check_array(X) 

-

156 if X.dtype == object: 

-

157 return is_null_object(X, self.idx_columns) 

-

158 return is_null(X, self.idx_columns, self.dtype) 

-
- - - diff --git a/cov_html/gators_feature_generation_one_hot_py.html b/cov_html/gators_feature_generation_one_hot_py.html deleted file mode 100644 index 0ffbcd72..00000000 --- a/cov_html/gators_feature_generation_one_hot_py.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - Coverage for gators/feature_generation/one_hot.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen import one_hot 

-

3from ._base_feature_generation import _BaseFeatureGeneration 

-

4from ..util import util 

-

5from typing import List, Dict, Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9 

-

10 

-

11class OneHot(_BaseFeatureGeneration): 

-

12 """Create new columns based on the one-hot technique. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 categories_dict : Dict[str: List[str]]. 

-

17 keys: columns, values: list of category name. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation import OneHot 

-

25 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

26 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

27 >>> obj.fit_transform(X) 

-

28 A B A__onehot__w A__onehot__e B__onehot__z 

-

29 0 a z 0.0 0.0 1.0 

-

30 1 b a 1.0 0.0 0.0 

-

31 2 c a 0.0 1.0 0.0 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation import OneHot 

-

37 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

38 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

39 >>> obj.fit_transform(X) 

-

40 A B A__onehot__w A__onehot__e B__onehot__z 

-

41 0 a z 0.0 0.0 1.0 

-

42 1 b a 1.0 0.0 0.0 

-

43 2 c a 0.0 1.0 0.0 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation import OneHot 

-

49 >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

50 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

51 >>> obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([['a', 'z', 0.0, 0.0, 1.0], 

-

54 ['b', 'a', 1.0, 0.0, 0.0], 

-

55 ['c', 'a', 0.0, 1.0, 0.0]], dtype=object) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation import OneHot 

-

61 >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) 

-

62 >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) 

-

63 >>> obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([['a', 'z', 0.0, 0.0, 1.0], 

-

66 ['b', 'a', 1.0, 0.0, 0.0], 

-

67 ['c', 'a', 0.0, 1.0, 0.0]], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, categories_dict: Dict[str, List[str]], 

-

73 column_names: List[str] = None): 

-

74 if not isinstance(categories_dict, dict): 

-

75 raise TypeError('`categories_dict` should be a dict.') 

-

76 if column_names is not None and not isinstance(column_names, list): 

-

77 raise TypeError('`column_names` should be None or a list.') 

-

78 self.categories_dict = categories_dict 

-

79 columns = list(set(categories_dict.keys())) 

-

80 if not column_names: 

-

81 column_names = [ 

-

82 f'{col}__onehot__{cat}' 

-

83 for col, cats in categories_dict.items() 

-

84 for cat in cats 

-

85 ] 

-

86 column_mapping = { 

-

87 f'{col}__onehot__{cat}': col 

-

88 for col, cats in categories_dict.items() 

-

89 for cat in cats 

-

90 } 

-

91 else: 

-

92 column_mapping = { 

-

93 name: col 

-

94 for name, col in zip(column_names, categories_dict.keys()) 

-

95 } 

-

96 columns = [ 

-

97 col 

-

98 for col, cats in categories_dict.items() 

-

99 for cat in cats 

-

100 ] 

-

101 n_cats = sum([len(cat) for cat in categories_dict.values()]) 

-

102 if column_names and n_cats != len(column_names): 

-

103 raise ValueError( 

-

104 'Length of `clusters_dict` and `column_names` should match.') 

-

105 

-

106 _BaseFeatureGeneration.__init__( 

-

107 self, columns=columns, column_names=column_names, 

-

108 column_mapping=column_mapping, dtype=None) 

-

109 self.mapping = dict(zip(self.column_names, self.columns)) 

-

110 

-

111 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

112 y: Union[pd.Series, ks.Series] = None): 

-

113 """ 

-

114 Fit the dataframe X. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : Union[pd.DataFrame, ks.DataFrame]. 

-

119 Input dataframe. 

-

120 y (np.ndarray, optional): labels. Defaults to None. 

-

121 

-

122 Returns 

-

123 ------- 

-

124 OneHot: Instance of itself. 

-

125 """ 

-

126 self.check_dataframe(X) 

-

127 self.cats = np.array( 

-

128 [cat 

-

129 for cats in self.categories_dict.values() 

-

130 for cat in cats] 

-

131 ).astype(object) 

-

132 cols_flatten = np.array( 

-

133 [col 

-

134 for col, cats in self.categories_dict.items() 

-

135 for cat in cats] 

-

136 ) 

-

137 self.idx_columns = util.get_idx_columns(X, cols_flatten) 

-

138 return self 

-

139 

-

140 def transform(self, 

-

141 X: Union[pd.DataFrame, ks.DataFrame] 

-

142 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

143 """Transform the dataframe `X`. 

-

144 

-

145 Parameters 

-

146 ---------- 

-

147 X : Union[pd.DataFrame, ks.DataFrame]. 

-

148 Input dataframe. 

-

149 

-

150 Returns 

-

151 ------- 

-

152 Union[pd.DataFrame, ks.DataFrame] 

-

153 Transformed dataframe. 

-

154 """ 

-

155 self.check_dataframe(X) 

-

156 if isinstance(X, pd.DataFrame): 

-

157 for name, col, cat in zip( 

-

158 self.column_names, self.columns, self.cats): 

-

159 X.loc[:, name] = (X[col] == cat) 

-

160 return X 

-

161 

-

162 for name, col, cat in zip( 

-

163 self.column_names, self.columns, self.cats): 

-

164 X = X.assign( 

-

165 dummy=(X[col] == cat) 

-

166 ).rename(columns={'dummy': name}) 

-

167 return X 

-

168 

-

169 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

170 """Transform the NumPy array `X`. 

-

171 

-

172 Parameters 

-

173 ---------- 

-

174 X : np.ndarray 

-

175 Input array. 

-

176 

-

177 Returns 

-

178 ------- 

-

179 np.ndarray 

-

180 Transformed array. 

-

181 """ 

-

182 self.check_array(X) 

-

183 return one_hot(X, self.idx_columns, self.cats) 

-
- - - diff --git a/cov_html/gators_feature_generation_plane_rotation_py.html b/cov_html/gators_feature_generation_plane_rotation_py.html deleted file mode 100644 index c2358579..00000000 --- a/cov_html/gators_feature_generation_plane_rotation_py.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - Coverage for gators/feature_generation/plane_rotation.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3from math import cos, sin 

-

4from math import pi as PI 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from gators.util import util 

-

9from gators.transformers import Transformer 

-

10from feature_gen import plan_rotation 

-

11from ._base_feature_generation import _BaseFeatureGeneration 

-

12 

-

13 

-

14class PlaneRotation(Transformer): 

-

15 """Create new columns based on the plane rotation mapping. 

-

16 

-

17 The data should be composed of numerical columns only. 

-

18 Use `gators.encoders` to replace the categorical columns by 

-

19 numerical ones before using `PlaneRotation`. 

-

20 

-

21 Parameters 

-

22 ---------- 

-

23 columns : List[str] 

-

24 List of columns. 

-

25 theta_vec: List[float] 

-

26 List of rotation angles. 

-

27 dtype : type, default to np.float64 

-

28 Numpy dtype of the output data. 

-

29 

-

30 Examples 

-

31 --------- 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> import numpy as np 

-

35 >>> from gators.feature_generation import PlaneRotation 

-

36 >>> X = pd.DataFrame({'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) 

-

37 >>> obj = PlaneRotation(columns = [['X', 'Y'], ['X', 'Z'] , theta_vec = [45.0, 60.0]) 

-

38 >>> obj.fit_transform(X) 

-

39 X Y Z X_45.0deg Y_45.0deg X_60.0deg Z_60.0deg 

-

40 0 200.0 140.0 100.0 42.426407 240.416306 13.397460 223.205081 

-

41 1 210.0 160.0 125.0 35.355339 261.629509 -3.253175 244.365335 

-

42 

-

43 >>> import databricks.koalas as ks 

-

44 >>> from gators.feature_generation import RotationInPlane 

-

45 >>> X = ks.DataFrame({'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'A': [125.0, 175.0]}) 

-

46 >>> obj = PlaneRotation(columns = [['X', 'Y']] , theta_vec = [45.0]) 

-

47 >>> obj.fit_transform(X) 

-

48 X Y Z X_45.0deg Y_45.0deg X_60.0deg Z_60.0deg 

-

49 0 200.0 140.0 100.0 42.426407 240.416306 13.397460 223.205081 

-

50 1 210.0 160.0 125.0 35.355339 261.629509 -3.253175 244.365335 

-

51 

-

52 >>> import pandas as pd 

-

53 >>> from gators.feature_generation import PlaneRotation 

-

54 >>> X = pd.DataFrame({'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'A': [125.0, 175.0]}) 

-

55 >>> obj = PlaneRotation(columns = [['X', 'Y']] , theta_vec = [45.0]) 

-

56 >>> obj.fit(X) 

-

57 >>> obj.transform_numpy(X.to_numpy()) 

-

58 array([[200. , 140. , 100. , 42.42640687, 

-

59 240.4163056 , 13.39745962, 223.20508076], 

-

60 [210. , 160. , 125. , 35.35533906, 

-

61 261.62950904, -3.25317547, 244.36533479]], dtype= float64) 

-

62 

-

63 """ 

-

64 

-

65 def __init__(self, columns: List[List[str]], theta_vec: List[float], 

-

66 dtype: type = np.float64): 

-

67 if not isinstance(columns, list): 

-

68 raise TypeError('`columns` should be a list.') 

-

69 if not isinstance(theta_vec, list): 

-

70 raise TypeError('`theta_vec` should be a list.') 

-

71 if not columns: 

-

72 raise ValueError('`columns` should not be empty.') 

-

73 if not any(isinstance(cols, list) for cols in columns): 

-

74 raise TypeError('`columns` should be a list of lists.') 

-

75 if not all(isinstance(theta, (float, int)) for theta in theta_vec): 

-

76 raise TypeError( 

-

77 '`theta_vec` should be a list of ints or floats.') 

-

78 self.check_datatype(dtype, [np.float32, np.float64]) 

-

79 

-

80 column_names = [ 

-

81 [f'{x}{y}_x_{t}deg', f'{x}{y}_y_{t}deg'] 

-

82 for (x, y) in columns for t in theta_vec] 

-

83 column_names = [c for cols in column_names for c in cols] 

-

84 column_mapping = { 

-

85 **{f'{x}{y}_x_{t}deg': [x, y] 

-

86 for (x, y) in columns for t in theta_vec}, 

-

87 **{f'{x}{y}_y_{t}deg': [x, y] 

-

88 for (x, y) in columns for t in theta_vec} 

-

89 } 

-

90 columns = [c for cols in columns for c in cols] 

-

91 _BaseFeatureGeneration.__init__( 

-

92 self, columns=columns, column_names=column_names, 

-

93 column_mapping=column_mapping, dtype=dtype) 

-

94 self.theta_vec = np.array(theta_vec) 

-

95 self.cos_theta_vec = np.cos(self.theta_vec * np.pi / 180) 

-

96 self.sin_theta_vec = np.sin(self.theta_vec * np.pi / 180) 

-

97 

-

98 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

99 y: Union[pd.Series, ks.Series] = None) -> 'PlaneRotation': 

-

100 """Fit the transformer on the dataframe `X`. 

-

101 

-

102 Parameters 

-

103 ---------- 

-

104 X : Union[pd.DataFrame, ks.DataFrame]. 

-

105 Input dataframe. 

-

106 y : None 

-

107 None. 

-

108 

-

109 Returns 

-

110 ------- 

-

111 PlaneRotation 

-

112 Instance of itself. 

-

113 """ 

-

114 self.check_dataframe(X) 

-

115 self.check_dataframe_is_numerics(X) 

-

116 self.idx_columns_x = util.get_idx_columns(X, self.columns[::2]) 

-

117 self.idx_columns_y = util.get_idx_columns(X, self.columns[1::2]) 

-

118 return self 

-

119 

-

120 def transform(self, X: Union[pd.DataFrame, ks.DataFrame] 

-

121 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

122 """Transform the dataframe `X`. 

-

123 

-

124 Parameters 

-

125 ---------- 

-

126 X : Union[pd.DataFrame, ks.DataFrame]. 

-

127 Input dataframe. 

-

128 

-

129 Returns 

-

130 ------- 

-

131 Union[pd.DataFrame, ks.DataFrame] 

-

132 Transformed dataframe. 

-

133 """ 

-

134 self.check_dataframe(X) 

-

135 for x, y in zip(self.columns[::2], self.columns[1::2]): 

-

136 for theta in self.theta_vec: 

-

137 cos_theta = cos(theta * PI / 180) 

-

138 sin_theta = sin(theta * PI / 180) 

-

139 X.loc[:, f'{x}{y}_x_{theta}deg'] = X[x] * \ 

-

140 cos_theta - X[y] * sin_theta 

-

141 X.loc[:, f'{x}{y}_y_{theta}deg'] = X[x] * \ 

-

142 sin_theta + X[y] * cos_theta 

-

143 X[self.column_names] = X[self.column_names].astype(self.dtype) 

-

144 return X 

-

145 

-

146 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

147 """Transform the NumPy array `X`. 

-

148 

-

149 Parameters 

-

150 ---------- 

-

151 X : np.ndarray 

-

152 Input array. 

-

153 

-

154 Returns 

-

155 ------- 

-

156 np.ndarray 

-

157 Transformed array. 

-

158 """ 

-

159 self.check_array(X) 

-

160 return plan_rotation( 

-

161 X.astype(self.dtype), self.idx_columns_x, self.idx_columns_y, 

-

162 self.cos_theta_vec, self.sin_theta_vec) 

-
- - - diff --git a/cov_html/gators_feature_generation_polynomial_features_py.html b/cov_html/gators_feature_generation_polynomial_features_py.html deleted file mode 100644 index f72d6da6..00000000 --- a/cov_html/gators_feature_generation_polynomial_features_py.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - Coverage for gators/feature_generation/polynomial_features.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1import numpy as np 

-

2import pandas as pd 

-

3from typing import List, Union 

-

4import databricks.koalas as ks 

-

5from ..util import util 

-

6from gators.transformers import Transformer 

-

7from itertools import combinations, combinations_with_replacement, chain 

-

8from feature_gen import polynomial 

-

9from ._base_feature_generation import _BaseFeatureGeneration 

-

10 

-

11 

-

12class PolynomialFeatures(Transformer): 

-

13 """Create new columns based on columns multiplication. 

-

14 

-

15 The data should be composed of numerical columns only. 

-

16 Use `gators.encoders` to replace the categorical columns by 

-

17 numerical ones before using `PolynomialFeatures`. 

-

18 

-

19 Parameters 

-

20 ---------- 

-

21 columns : List[str] 

-

22 List of columns. 

-

23 degree : int, default = 2 

-

24 The degree of polynomial. The default of degree of 2 

-

25 will produce A * A, B * B, and A * B from features A and B. 

-

26 interaction_only : bool, default = False 

-

27 Allows to keep only interaction terms. 

-

28 If true, only A * B will be produced from features A and B. 

-

29 dtype : type, default to np.float64 

-

30 Numpy dtype of the output data. 

-

31 

-

32 Examples 

-

33 --------- 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> from gators.feature_generation import PolynomialFeatures 

-

37 >>> X = pd.DataFrame( 

-

38 ... np.arange(9).reshape(3, 3), columns=list('ABC'), dtype=np.float64) 

-

39 >>> obj = PolynomialFeatures(columns=['A', 'B']) 

-

40 >>> obj.fit_transform(X) 

-

41 A B C A__x__A A__x__B B__x__B 

-

42 0 0.0 1.0 2.0 0.0 0.0 1.0 

-

43 1 3.0 4.0 5.0 9.0 12.0 16.0 

-

44 2 6.0 7.0 8.0 36.0 42.0 49.0 

-

45 

-

46 >>> import databricks.koalas as ks 

-

47 >>> from gators.feature_generation import PolynomialFeatures 

-

48 >>> X = ks.DataFrame( 

-

49 ... np.arange(9).reshape(3, 3), columns=list('ABC')).astype(float) 

-

50 >>> columns = util.get_numerical_columns(X) 

-

51 >>> obj = PolynomialFeatures(columns, degree = 3, interaction_only=True) 

-

52 >>> obj.fit_transform(X) 

-

53 A B C A__x__B A__x__C B__x__C A__x__B__x__C 

-

54 0 0.0 1.0 2.0 0.0 0.0 2.0 0.0 

-

55 1 3.0 4.0 5.0 12.0 15.0 20.0 60.0 

-

56 2 6.0 7.0 8.0 42.0 48.0 56.0 336.0 

-

57 

-

58 >>> import pandas as pd 

-

59 >>> import numpy as np 

-

60 >>> from gators.feature_generation import PolynomialFeatures 

-

61 >>> X = pd.DataFrame( 

-

62 ... np.arange(9).reshape(3, 3), columns=list('ABC'), dtype=np.float64) 

-

63 >>> columns = util.get_numerical_columns(X) 

-

64 >>> obj = PolynomialFeatures(columns, degree=2, interaction_only=True) 

-

65 >>> _ = obj.fit(X) 

-

66 >>> obj.transform_numpy(X.to_numpy()) 

-

67 array([[ 0., 1., 2., 0., 0., 2.], 

-

68 [ 3., 4., 5., 12., 15., 20.], 

-

69 [ 6., 7., 8., 42., 48., 56.]]) 

-

70 

-

71 >>> import databricks.koalas as ks 

-

72 >>> import numpy as np 

-

73 >>> from gators.feature_generation import PolynomialFeatures 

-

74 >>> X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list('ABC'), dtype=np.float64) 

-

75 >>> columns = util.get_numerical_columns(X) 

-

76 >>> obj = PolynomialFeatures(columns, degree=2, interaction_only=True) 

-

77 >>> _ = obj.fit(X) 

-

78 >>> obj.transform_numpy(X.to_numpy()) 

-

79 array([[ 0., 1., 2., 0., 0., 2.], 

-

80 [ 3., 4., 5., 12., 15., 20.], 

-

81 [ 6., 7., 8., 42., 48., 56.]]) 

-

82 

-

83 """ 

-

84 

-

85 def __init__(self, columns: List[str], degree=2, interaction_only=False, 

-

86 dtype: type = np.float64): 

-

87 if not isinstance(columns, list): 

-

88 raise TypeError('`columns` should be a list.') 

-

89 if not columns: 

-

90 raise ValueError('`columns` should not be empty.') 

-

91 if not isinstance(degree, int): 

-

92 raise TypeError('`degree` should be an int.') 

-

93 if degree < 2: 

-

94 raise ValueError('`degree` should be at least 2.') 

-

95 if not isinstance(interaction_only, bool): 

-

96 raise TypeError('`interaction_only` should be a bool.') 

-

97 if interaction_only == True and len(columns) == 1: 

-

98 raise ValueError( 

-

99 'Cannot create interaction only terms from single feature.') 

-

100 self.check_datatype(dtype, [np.float32, np.float64]) 

-

101 

-

102 self.degree = degree 

-

103 self.method = ( 

-

104 combinations if interaction_only else combinations_with_replacement 

-

105 ) 

-

106 self.combinations = list( 

-

107 map(list, chain.from_iterable( 

-

108 self.method(columns, self.degree) 

-

109 for self.degree in range(self.degree + 1))) 

-

110 ) 

-

111 self.combinations = [c for c in self.combinations if len(c) >= 2] 

-

112 column_names = ['__x__'.join(map(str, combination)) 

-

113 for combination in self.combinations] 

-

114 column_mapping = dict( 

-

115 zip(column_names, map(list, self.combinations))) 

-

116 _BaseFeatureGeneration.__init__( 

-

117 self, columns=columns, column_names=column_names, 

-

118 column_mapping=column_mapping, dtype=dtype) 

-

119 

-

120 def fit(self, 

-

121 X: Union[pd.DataFrame, ks.DataFrame], 

-

122 y: Union[pd.Series, ks.Series] = None) -> 'PolynomialFeatures': 

-

123 """ 

-

124 Fit the dataframe X. 

-

125 

-

126 Parameters 

-

127 ---------- 

-

128 X : Union[pd.DataFrame, ks.DataFrame]. 

-

129 Input dataframe. 

-

130 y (np.ndarray, optional): labels. Defaults to None. 

-

131 

-

132 Returns 

-

133 ------- 

-

134 PolynomialFeatures: Instance of itself. 

-

135 """ 

-

136 self.check_dataframe(X) 

-

137 self.check_dataframe_is_numerics(X) 

-

138 self.dtype = X[self.columns].dtypes.unique()[0] 

-

139 self.idx_columns = util.get_idx_columns( 

-

140 columns=X.columns, 

-

141 selected_columns=self.columns 

-

142 ) 

-

143 self.n_rows = X[self.columns].shape[0] 

-

144 self.n_cols = X[self.columns].shape[1] 

-

145 self.combinations_np = list( 

-

146 map(list, chain.from_iterable( 

-

147 self.method(self.idx_columns, self.degree) 

-

148 for self.degree in range(self.degree + 1))) 

-

149 ) 

-

150 self.combinations_np = [c for c in self.combinations_np if len(c) >= 2] 

-

151 for combo in self.combinations_np: 

-

152 combo.extend([-1 for _ in range(self.degree - len(combo))]) 

-

153 self.combinations_np = np.array(self.combinations_np) 

-

154 return self 

-

155 

-

156 def transform( 

-

157 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

158 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

159 """Transform the dataframe `X`. 

-

160 

-

161 Parameters 

-

162 ---------- 

-

163 X : Union[pd.DataFrame, ks.DataFrame]. 

-

164 Input dataframe. 

-

165 

-

166 Returns 

-

167 ------- 

-

168 Union[pd.DataFrame, ks.DataFrame] 

-

169 Transformed dataframe. 

-

170 """ 

-

171 self.check_dataframe(X) 

-

172 if isinstance(X, pd.DataFrame): 

-

173 for combi, name in zip(self.combinations, self.column_names): 

-

174 X[name] = X[combi].prod(axis=1) 

-

175 X[self.column_names] = X[self.column_names].astype(self.dtype) 

-

176 return X 

-

177 for combi, name in zip(self.combinations, self.column_names): 

-

178 dummy = X[combi[0]] * X["__x__".join(combi[1:])] 

-

179 X = X.assign( 

-

180 dummy=dummy 

-

181 ).rename(columns={'dummy': name}) 

-

182 X[self.column_names] = X[self.column_names].astype(self.dtype) 

-

183 return X 

-

184 

-

185 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

186 """Transform the NumPy array `X`. 

-

187 

-

188 Parameters 

-

189 ---------- 

-

190 X : np.ndarray 

-

191 Input array. 

-

192 

-

193 Returns 

-

194 ------- 

-

195 np.ndarray 

-

196 Transformed array. 

-

197 """ 

-

198 self.check_array(X) 

-

199 return polynomial( 

-

200 X, self.combinations_np, self.degree, self.dtype) 

-
- - - diff --git a/cov_html/gators_feature_generation_str__base_string_feature_py.html b/cov_html/gators_feature_generation_str__base_string_feature_py.html deleted file mode 100644 index 95dc124a..00000000 --- a/cov_html/gators_feature_generation_str__base_string_feature_py.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/_base_string_feature.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# Licence Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseStringFeature(Transformer): 

-

11 """Base string feature transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns : List[str] 

-

16 List of columns. 

-

17 column_names : List[str], default to None. 

-

18 List of column names. 

-

19 

-

20 """ 

-

21 

-

22 def __init__(self, columns: List[str], column_names: List[str]): 

-

23 if not isinstance(columns, list): 

-

24 raise TypeError('`columns` should be a list.') 

-

25 if not columns: 

-

26 raise ValueError('`columns` should not be empty.') 

-

27 if column_names and not isinstance(column_names, list): 

-

28 raise TypeError('`column_names` should be a list.') 

-

29 if column_names and len(column_names) != len(columns): 

-

30 raise ValueError( 

-

31 'Length of `columns` and `column_names` should match.') 

-

32 Transformer.__init__(self) 

-

33 self.columns = columns 

-

34 self.column_names: List[str] = column_names 

-

35 self.column_mapping = dict(zip(column_names, columns)) 

-

36 self.idx_columns: np.ndarray = np.array([]) 

-

37 

-

38 def fit(self, 

-

39 X: Union[pd.DataFrame, ks.DataFrame], 

-

40 y: Union[pd.Series, ks.Series] = None) -> '_BaseStringFeature': 

-

41 """Fit the transformer on the dataframe `X`. 

-

42 

-

43 Parameters 

-

44 ---------- 

-

45 X : pd.DataFrame 

-

46 Input dataframe. 

-

47 y : Union[pd.Series, ks.Series], default to None. 

-

48 Target values. 

-

49 

-

50 Returns 

-

51 ------- 

-

52 _BaseStringFeature 

-

53 Instance of itself. 

-

54 """ 

-

55 self.check_dataframe(X) 

-

56 self.idx_columns = util.get_idx_columns( 

-

57 columns=X.columns, 

-

58 selected_columns=self.columns, 

-

59 ) 

-

60 return self 

-
- - - diff --git a/cov_html/gators_feature_generation_str_extract_py.html b/cov_html/gators_feature_generation_str_extract_py.html deleted file mode 100644 index 0bc0bae9..00000000 --- a/cov_html/gators_feature_generation_str_extract_py.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/extract.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from feature_gen_str import extract_str 

-

5from typing import List, Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9from._base_string_feature import _BaseStringFeature 

-

10 

-

11 

-

12class Extract(_BaseStringFeature): 

-

13 """Create new object columns based on substrings. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 i_min_vec : List[int] 

-

20 List of indices. 

-

21 i_max_vec : List[int] 

-

22 List of indices. 

-

23 column_names : List[int] 

-

24 List of column names. 

-

25 

-

26 Examples 

-

27 --------- 

-

28 * fit & transform with pandas 

-

29 

-

30 >>> import pandas as pd 

-

31 >>> from gators.feature_generation_str import Extract 

-

32 >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

33 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

34 >>> obj.fit_transform(X) 

-

35 A B A__substring_0_to_1 A__substring_2_to_3 

-

36 0 qwe 1 q e 

-

37 1 asd 2 a d 

-

38 2 zxc 3 z c 

-

39 

-

40 * fit with pandas & transform with numpy 

-

41 

-

42 >>> import pandas as pd 

-

43 >>> from gators.feature_generation_str import Extract 

-

44 >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

45 >>> obj = Extract( 

-

46 ... columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3], 

-

47 ... column_names=['A_first_letter', 'A_third_letter']) 

-

48 >>> obj.fit_transform(X) 

-

49 A B A_first_letter A_third_letter 

-

50 0 qwe 1 q e 

-

51 1 asd 2 a d 

-

52 2 zxc 3 z c 

-

53 

-

54 * fit with koalas & transform with numpy 

-

55 

-

56 >>> import databricks.koalas as ks 

-

57 >>> from gators.feature_generation_str import Extract 

-

58 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

59 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

60 >>> obj.fit_transform(X) 

-

61 A B A__substring_0_to_1 A__substring_2_to_3  

-

62 0 qwe 1 q e 

-

63 1 asd 2 a d 

-

64 2 zxc 3 z c 

-

65 

-

66 * fit with pandas & transform with numpy 

-

67 

-

68 >>> import pandas as pd 

-

69 >>> from gators.feature_generation_str import Extract 

-

70 >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

71 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

72 >>> _ = obj.fit(X) 

-

73 >>> obj.transform_numpy(X.to_numpy()) 

-

74 array([['qwe', 1, 'q', 'e'], 

-

75 ['asd', 2, 'a', 'd'], 

-

76 ['zxc', 3, 'z', 'c']], dtype=object) 

-

77 

-

78 * fit with koalas & transform with numpy 

-

79 

-

80 >>> import databricks.koalas as ks 

-

81 >>> from gators.feature_generation_str import Extract 

-

82 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

83 >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) 

-

84 >>> _ = obj.fit(X) 

-

85 >>> obj.transform_numpy(X.to_numpy()) 

-

86 array([['qwe', 1, 'q', 'e'], 

-

87 ['asd', 2, 'a', 'd'], 

-

88 ['zxc', 3, 'z', 'c']], dtype=object) 

-

89 

-

90 

-

91 """ 

-

92 

-

93 def __init__(self, columns: List[str], i_min_vec: List[int], i_max_vec: List[int], 

-

94 column_names: List[int] = None): 

-

95 if not isinstance(columns, list): 

-

96 raise TypeError('`columns` should be a list.') 

-

97 if not isinstance(i_min_vec, list): 

-

98 raise TypeError('`i_min_vec` should be a list.') 

-

99 if len(columns) != len(i_min_vec): 

-

100 raise ValueError( 

-

101 'Length of `columns` and `i_min_vec` should match.') 

-

102 if not isinstance(i_max_vec, list): 

-

103 raise TypeError('`i_max_vec` should be a list.') 

-

104 if len(columns) != len(i_max_vec): 

-

105 raise ValueError( 

-

106 'Length of `columns` and `i_max_vec` should match.') 

-

107 if not column_names: 

-

108 column_names = [ 

-

109 f'{c}__substring_{i_min}_to_{i_max}' 

-

110 for c, i_min, i_max in zip(columns, i_min_vec, i_max_vec) 

-

111 ] 

-

112 _BaseStringFeature.__init__(self, columns, column_names) 

-

113 self.i_min_vec = np.array(i_min_vec, int) 

-

114 self.i_max_vec = np.array(i_max_vec, int) 

-

115 

-

116 def fit(self, 

-

117 X: Union[pd.DataFrame, ks.DataFrame], 

-

118 y: Union[pd.Series, ks.Series] = None) -> 'Extract': 

-

119 """Fit the transformer on the dataframe `X`. 

-

120 

-

121 Parameters 

-

122 ---------- 

-

123 X : Union[pd.DataFrame, ks.DataFrame]. 

-

124 Input dataframe. 

-

125 y : None 

-

126 None. 

-

127 

-

128 Returns 

-

129 ------- 

-

130 Extract 

-

131 Instance of itself. 

-

132 """ 

-

133 self.check_dataframe(X) 

-

134 self.idx_columns = util.get_idx_columns( 

-

135 columns=X.columns, 

-

136 selected_columns=self.columns 

-

137 ) 

-

138 return self 

-

139 

-

140 def transform( 

-

141 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

142 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

143 """Transform the dataframe `X`. 

-

144 

-

145 Parameters 

-

146 ---------- 

-

147 X : Union[pd.DataFrame, ks.DataFrame]. 

-

148 Input dataframe. 

-

149 

-

150 Returns 

-

151 ------- 

-

152 Union[pd.DataFrame, ks.DataFrame] 

-

153 Transformed dataframe. 

-

154 """ 

-

155 self.check_dataframe(X) 

-

156 

-

157 for col, i_min, i_max, name in zip( 

-

158 self.columns, self.i_min_vec, 

-

159 self.i_max_vec, self.column_names): 

-

160 X.loc[:, name] = X[col].str.slice( 

-

161 start=i_min, stop=i_max).replace({'': 'MISSING'}) 

-

162 return X 

-

163 

-

164 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

165 """Transform the NumPy array `X`. 

-

166 

-

167 Parameters 

-

168 ---------- 

-

169 X : np.ndarray 

-

170 Input array. 

-

171 

-

172 Returns 

-

173 ------- 

-

174 np.ndarray 

-

175 Transformed array. 

-

176 """ 

-

177 self.check_array(X) 

-

178 return extract_str( 

-

179 X, self.idx_columns, self.i_min_vec, self.i_max_vec 

-

180 ) 

-
- - - diff --git a/cov_html/gators_feature_generation_str_lower_case_py.html b/cov_html/gators_feature_generation_str_lower_case_py.html deleted file mode 100644 index 66edc455..00000000 --- a/cov_html/gators_feature_generation_str_lower_case_py.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/lower_case.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import lower_case 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9 

-

10 

-

11class LowerCase(_BaseStringFeature): 

-

12 """Convert the selected columns to lower case. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_str import LowerCase 

-

25 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

26 >>> obj = LowerCase(columns=['A','B']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B 

-

29 0 abc abc 

-

30 1 ab ab 

-

31 2 None 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_str import LowerCase 

-

37 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

38 >>> obj = LowerCase(columns=['A','B']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B 

-

41 0 abc abc 

-

42 1 ab ab 

-

43 2 None 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_str import LowerCase 

-

49 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

50 >>> obj = LowerCase(columns=['A','B']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([['abc', 'abc'], 

-

54 ['ab', 'ab'], 

-

55 ['', None]], dtype=object) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_str import LowerCase 

-

61 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

62 >>> obj = LowerCase(columns=['A','B']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([['abc', 'abc'], 

-

66 ['ab', 'ab'], 

-

67 ['', None]], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str]): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 self.columns = columns 

-

78 

-

79 def fit(self, 

-

80 X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'LowerCase': 

-

82 """Fit the transformer on the dataframe `X`. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 LowerCase 

-

94 Instance of itself. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 self.idx_columns = util.get_idx_columns( 

-

98 columns=X.columns, 

-

99 selected_columns=self.columns 

-

100 ) 

-

101 return self 

-

102 

-

103 def transform( 

-

104 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

105 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

106 """Transform the dataframe `X`. 

-

107 

-

108 Parameters 

-

109 ---------- 

-

110 X : Union[pd.DataFrame, ks.DataFrame]. 

-

111 Input dataframe. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 Union[pd.DataFrame, ks.DataFrame] 

-

116 Transformed dataframe. 

-

117 """ 

-

118 def f(x): 

-

119 if x.name in self.columns: 

-

120 return x.astype(str).str.lower().replace( 

-

121 {'none': None}) 

-

122 return x 

-

123 return X.apply(f) 

-

124 

-

125 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

126 """Transform the NumPy array `X`. 

-

127 

-

128 Parameters 

-

129 ---------- 

-

130 X : np.ndarray 

-

131 Input array. 

-

132 

-

133 Returns 

-

134 ------- 

-

135 np.ndarray 

-

136 Transformed array. 

-

137 """ 

-

138 self.check_array(X) 

-

139 return lower_case(X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_str_split_extract_py.html b/cov_html/gators_feature_generation_str_split_extract_py.html deleted file mode 100644 index 426438a8..00000000 --- a/cov_html/gators_feature_generation_str_split_extract_py.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/split_extract.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen_str import split_and_extract_str 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from._base_string_feature import _BaseStringFeature 

-

8 

-

9 

-

10class SplitExtract(_BaseStringFeature): 

-

11 """Create new columns based on split strings. 

-

12 

-

13 The transformer applies two steps: 

-

14 

-

15 * split each string element using the given value. 

-

16 * extract the string of the given split list element. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 columns : List[str] 

-

21 List of columns. 

-

22 

-

23 str_split_vec : List[int] 

-

24 List of separators. 

-

25 

-

26 idx_split_vec : List[int] 

-

27 List of split indices. 

-

28 

-

29 column_names : List[int] 

-

30 List of new column names. 

-

31 

-

32 Examples 

-

33 --------- 

-

34 

-

35 * fit & transform with pandas 

-

36 

-

37 >>> import pandas as pd 

-

38 >>> from gators.feature_generation_str import SplitExtract 

-

39 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

40 >>> obj = SplitExtract( 

-

41 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

42 >>> obj.fit_transform(X) 

-

43 A B A__split_by_*_idx_0 A__split_by_*_idx_1 

-

44 0 qw*e 1 qw e 

-

45 1 a*qd 2 a qd 

-

46 2 zxq* 3 zxq  

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_str import SplitExtract 

-

49 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

50 >>> obj = SplitExtract( 

-

51 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1], 

-

52 ... column_names=['A_before_star', 'A_after_star']) 

-

53 >>> obj.fit_transform(X) 

-

54 A B A_before_star A_after_star 

-

55 0 qw*e 1 qw e 

-

56 1 a*qd 2 a qd 

-

57 2 zxq* 3 zxq  

-

58 

-

59 * fit & transform with koalas 

-

60 

-

61 >>> import databricks.koalas as ks 

-

62 >>> from gators.feature_generation_str import SplitExtract 

-

63 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

64 >>> obj = SplitExtract( 

-

65 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

66 >>> obj.fit_transform(X) 

-

67 A B A__split_by_*_idx_0 A__split_by_*_idx_1 

-

68 0 qw*e 1 qw e 

-

69 1 a*qd 2 a qd 

-

70 2 zxq* 3 zxq  

-

71 

-

72 * fit with pandas & transform with numpy 

-

73 

-

74 >>> import pandas as pd 

-

75 >>> from gators.feature_generation_str import SplitExtract 

-

76 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

77 >>> obj = SplitExtract( 

-

78 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

79 >>> _ = obj.fit(X) 

-

80 >>> obj.transform_numpy(X.to_numpy()) 

-

81 array([['qw*e', 1, 'qw', 'e'], 

-

82 ['a*qd', 2, 'a', 'qd'], 

-

83 ['zxq*', 3, 'zxq', '']], dtype=object) 

-

84 

-

85 * fit with koalas & transform with numpy 

-

86 

-

87 >>> import databricks.koalas as ks 

-

88 >>> from gators.feature_generation_str import SplitExtract 

-

89 >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) 

-

90 >>> obj = SplitExtract( 

-

91 ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) 

-

92 >>> _ = obj.fit(X) 

-

93 >>> obj.transform_numpy(X.to_numpy()) 

-

94 array([['qw*e', 1, 'qw', 'e'], 

-

95 ['a*qd', 2, 'a', 'qd'], 

-

96 ['zxq*', 3, 'zxq', '']], dtype=object) 

-

97 

-

98 

-

99 """ 

-

100 

-

101 def __init__(self, columns: List[str], 

-

102 str_split_vec: List[int], idx_split_vec: List[int], 

-

103 column_names: List[str] = None): 

-

104 if not isinstance(columns, list): 

-

105 raise TypeError('`columns` should be a list.') 

-

106 if not isinstance(str_split_vec, list): 

-

107 raise TypeError('`str_split_vec` should be a list.') 

-

108 if len(columns) != len(str_split_vec): 

-

109 raise ValueError( 

-

110 'Length of `columns` and `str_split_vec` should match.') 

-

111 if not isinstance(idx_split_vec, list): 

-

112 raise TypeError('`idx_split_vec` should be a list.') 

-

113 if len(columns) != len(idx_split_vec): 

-

114 raise ValueError( 

-

115 'Length of `columns` and `idx_split_vec` should match.') 

-

116 if not column_names: 

-

117 column_names = [ 

-

118 f'{col}__split_by_{split}_idx_{idx}' for 

-

119 col, split, idx in zip(columns, str_split_vec, idx_split_vec) 

-

120 ] 

-

121 _BaseStringFeature.__init__(self, columns, column_names) 

-

122 self.str_split_vec = np.array(str_split_vec, object) 

-

123 self.idx_split_vec = np.array(idx_split_vec, int) 

-

124 

-

125 def transform( 

-

126 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

127 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

128 """Transform the dataframe `X`. 

-

129 

-

130 Parameters 

-

131 ---------- 

-

132 X : Union[pd.DataFrame, ks.DataFrame]. 

-

133 Input dataframe. 

-

134 

-

135 Returns 

-

136 ------- 

-

137 Union[pd.DataFrame, ks.DataFrame] 

-

138 Transformed dataframe. 

-

139 """ 

-

140 self.check_dataframe(X) 

-

141 for col, idx, str_split, name in zip( 

-

142 self.columns, self.idx_split_vec, 

-

143 self.str_split_vec, self.column_names): 

-

144 n = idx if idx > 0 else 1 

-

145 X.loc[:, name] = X[col].str.split(str_split, n=n, expand=True)[ 

-

146 idx].fillna('MISSING') 

-

147 return X 

-

148 

-

149 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

150 """Transform the NumPy array `X`. 

-

151 

-

152 Parameters 

-

153 ---------- 

-

154 X : np.ndarray 

-

155 Input array. 

-

156 

-

157 Returns 

-

158 ------- 

-

159 np.ndarray 

-

160 Transformed array. 

-

161 """ 

-

162 self.check_array(X) 

-

163 return split_and_extract_str( 

-

164 X, self.idx_columns, self.str_split_vec, self.idx_split_vec 

-

165 ) 

-
- - - diff --git a/cov_html/gators_feature_generation_str_string_contains_py.html b/cov_html/gators_feature_generation_str_string_contains_py.html deleted file mode 100644 index 0921de11..00000000 --- a/cov_html/gators_feature_generation_str_string_contains_py.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/string_contains.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from feature_gen_str import contains 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7from._base_string_feature import _BaseStringFeature 

-

8 

-

9 

-

10class StringContains(_BaseStringFeature): 

-

11 """Create new binary columns. 

-

12 

-

13 The value is 1 if the element contains the given substring and 0 otherwise. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 contains_vec : List[int] 

-

20 List of substrings. 

-

21 column_names : List[int], default to None. 

-

22 List new column names. 

-

23 

-

24 Examples 

-

25 --------- 

-

26 * fit & transform with pandas 

-

27 

-

28 >>> import pandas as pd 

-

29 >>> from gators.feature_generation_str import StringContains 

-

30 >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) 

-

31 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

32 >>> obj.fit_transform(X) 

-

33 A B A__contains_qw A__contains_we 

-

34 0 qwe 1 1.0 1.0 

-

35 1 qwd 2 1.0 0.0 

-

36 2 zwe 3 0.0 1.0 

-

37 

-

38 * fit & transform with pandas 

-

39 

-

40 >>> import pandas as pd 

-

41 >>> from gators.feature_generation_str import StringContains 

-

42 >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) 

-

43 >>> obj = StringContains( 

-

44 ... columns=['A', 'A'], contains_vec=['qw', 'we'], column_names=['with_qw', 'qith_we']) 

-

45 >>> obj.fit_transform(X) 

-

46 A B with_qw qith_we 

-

47 0 qwe 1 1.0 1.0 

-

48 1 qwd 2 1.0 0.0 

-

49 2 zwe 3 0.0 1.0 

-

50 

-

51 * fit & transform with koalas 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> from gators.feature_generation_str import StringLength 

-

55 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

56 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

57 >>> obj.fit_transform(X) 

-

58 A B A__contains_qw A__contains_we  

-

59 0 qwe 1 1.0 1.0 

-

60 1 asd 2 0.0 0.0 

-

61 2 zxc 3 0.0 0.0 

-

62 

-

63 * fit with pandas & transform with numpy 

-

64 

-

65 >>> import pandas as pd 

-

66 >>> from gators.feature_generation_str import StringLength 

-

67 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

68 >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

69 >>> _ = obj.fit(X) 

-

70 >>> obj.transform_numpy(X.to_numpy()) 

-

71 array([['qwe', 1, 1.0, 1.0], 

-

72 ['asd', 2, 0.0, 0.0], 

-

73 ['zxc', 3, 0.0, 0.0]], dtype=object) 

-

74 

-

75 * fit with koalas & transform with numpy 

-

76 

-

77 >>> import databricks.koalas as ks 

-

78 >>> from gators.feature_generation_str import StringLength 

-

79 >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) 

-

80 obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) 

-

81 _ = obj.fit(X) 

-

82 obj.transform_numpy(X.to_numpy()) 

-

83 array([['qwe', 1, 1.0, 1.0], 

-

84 ['asd', 2, 0.0, 0.0], 

-

85 ['zxc', 3, 0.0, 0.0]], dtype=object) 

-

86 

-

87 """ 

-

88 

-

89 def __init__(self, columns: List[str], contains_vec: List[str], 

-

90 column_names: List[str] = None): 

-

91 if not isinstance(columns, list): 

-

92 raise TypeError('`columns` should be a list.') 

-

93 if not isinstance(contains_vec, list): 

-

94 raise TypeError('`contains_vec` should be a list.') 

-

95 if len(columns) != len(contains_vec): 

-

96 raise ValueError( 

-

97 'Length of `columns` and `contains_vec` should match.') 

-

98 if not column_names: 

-

99 column_names = [ 

-

100 f'{col}__contains_{val}' 

-

101 for col, val in zip(columns, contains_vec) 

-

102 ] 

-

103 _BaseStringFeature.__init__( 

-

104 self, columns, column_names) 

-

105 self.contains_vec = np.array(contains_vec, str).astype(object) 

-

106 

-

107 def transform( 

-

108 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

109 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

110 """Transform the dataframe `X`. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 X : Union[pd.DataFrame, ks.DataFrame]. 

-

115 Input dataframe. 

-

116 

-

117 Returns 

-

118 ------- 

-

119 Union[pd.DataFrame, ks.DataFrame] 

-

120 Transformed dataframe. 

-

121 """ 

-

122 self.check_dataframe(X) 

-

123 for col, val, name in zip( 

-

124 self.columns, self.contains_vec, self.column_names): 

-

125 X.loc[:, name] = X[col].str.contains( 

-

126 val, regex=False).astype(np.float64) 

-

127 return X 

-

128 

-

129 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

130 """Transform the NumPy array `X`. 

-

131 

-

132 Parameters 

-

133 ---------- 

-

134 X : np.ndarray 

-

135 Input array. 

-

136 

-

137 Returns 

-

138 ------- 

-

139 np.ndarray 

-

140 Transformed array. 

-

141 """ 

-

142 self.check_array(X) 

-

143 return contains(X, self.idx_columns, self.contains_vec) 

-
- - - diff --git a/cov_html/gators_feature_generation_str_string_length_py.html b/cov_html/gators_feature_generation_str_string_length_py.html deleted file mode 100644 index 334f9c03..00000000 --- a/cov_html/gators_feature_generation_str_string_length_py.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/string_length.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import string_length 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9pd.options.mode.chained_assignment = None 

-

10 

-

11 

-

12class StringLength(_BaseStringFeature): 

-

13 """Create new columns based on the length of its elements. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 columns : List[str] 

-

18 List of columns. 

-

19 

-

20 Examples 

-

21 --------- 

-

22 * fit & transform with pandas 

-

23 

-

24 >>> import pandas as pd 

-

25 >>> from gators.feature_generation_str import StringLength 

-

26 >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

27 >>> obj = StringLength(columns=['A','B']) 

-

28 >>> obj.fit_transform(X) 

-

29 A B A__length B__length 

-

30 0 qwe 1 3.0 1.0 

-

31 1 as 22 2.0 2.0 

-

32 2 333 0.0 3.0 

-

33 

-

34 * fit & transform with pandas 

-

35 

-

36 >>> import pandas as pd 

-

37 >>> from gators.feature_generation_str import StringLength 

-

38 >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

39 >>> obj = StringLength(columns=['A','B'], column_names=['length_A', 'num_digits_B']) 

-

40 >>> obj.fit_transform(X) 

-

41 A B length_A num_digits_B 

-

42 0 qwe 1 3.0 1.0 

-

43 1 as 22 2.0 2.0 

-

44 2 333 0.0 3.0 

-

45 

-

46 * fit & transform with koalas 

-

47 

-

48 >>> import databricks.koalas as ks 

-

49 >>> from gators.feature_generation_str import StringLength 

-

50 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

51 >>> obj = StringLength(columns=['A','B']) 

-

52 >>> obj.fit_transform(X) 

-

53 A B A__length B__length 

-

54 0 qwe 1 3.0 1.0 

-

55 1 as 22 2.0 2.0 

-

56 2 333 0.0 3.0 

-

57 

-

58 * fit with pandas & transform with numpy 

-

59 

-

60 >>> import pandas as pd 

-

61 >>> from gators.feature_generation_str import StringLength 

-

62 >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

63 >>> obj = StringLength(columns=['A','B']) 

-

64 >>> _ = obj.fit(X) 

-

65 >>> obj.transform_numpy(X.to_numpy()) 

-

66 array([['qwe', 1, 3.0, 1.0], 

-

67 ['as', 22, 2.0, 2.0], 

-

68 ['', 333, 0.0, 3.0]], dtype=object) 

-

69 

-

70 * fit with koalas & transform with numpy 

-

71 

-

72 >>> import databricks.koalas as ks 

-

73 >>> from gators.feature_generation_str import StringLength 

-

74 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

75 >>> obj = StringLength(columns=['A','B']) 

-

76 >>> _ = obj.fit(X) 

-

77 >>> obj.transform_numpy(X.to_numpy()) 

-

78 array([['qwe', 1, 3.0, 1.0], 

-

79 ['as', 22, 2.0, 2.0], 

-

80 ['', 333, 0.0, 3.0]], dtype=object) 

-

81 

-

82 

-

83 """ 

-

84 

-

85 def __init__(self, columns: List[str], column_names: List[str] = None): 

-

86 if not column_names: 

-

87 column_names = [f'{col}__length' for col in columns] 

-

88 _BaseStringFeature.__init__( 

-

89 self, columns, column_names) 

-

90 

-

91 def fit(self, 

-

92 X: Union[pd.DataFrame, ks.DataFrame], 

-

93 y: Union[pd.Series, ks.Series] = None) -> 'StringLength': 

-

94 """Fit the transformer on the dataframe `X`. 

-

95 

-

96 Parameters 

-

97 ---------- 

-

98 X : Union[pd.DataFrame, ks.DataFrame]. 

-

99 Input dataframe. 

-

100 y : None 

-

101 None. 

-

102 

-

103 Returns 

-

104 ------- 

-

105 StringLength 

-

106 Instance of itself. 

-

107 """ 

-

108 self.check_dataframe(X) 

-

109 self.idx_columns = util.get_idx_columns( 

-

110 columns=X.columns, 

-

111 selected_columns=self.columns 

-

112 ) 

-

113 return self 

-

114 

-

115 def transform( 

-

116 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

117 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

118 """Transform the dataframe `X`. 

-

119 

-

120 Parameters 

-

121 ---------- 

-

122 X : Union[pd.DataFrame, ks.DataFrame]. 

-

123 Input dataframe. 

-

124 

-

125 Returns 

-

126 ------- 

-

127 Union[pd.DataFrame, ks.DataFrame] 

-

128 Transformed dataframe. 

-

129 """ 

-

130 self.check_dataframe(X) 

-

131 for col, name in zip(self.columns, self.column_names): 

-

132 X.loc[:, name] = X.loc[:, col].fillna('').astype(str).replace( 

-

133 {'nan': ''}).str.len().astype(np.float64) 

-

134 pass 

-

135 return X 

-

136 

-

137 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

138 """Transform the NumPy array `X`. 

-

139 

-

140 Parameters 

-

141 ---------- 

-

142 X : np.ndarray 

-

143 Input array. 

-

144 

-

145 Returns 

-

146 ------- 

-

147 np.ndarray 

-

148 Transformed array. 

-

149 """ 

-

150 self.check_array(X) 

-

151 return string_length(X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_generation_str_upper_case_py.html b/cov_html/gators_feature_generation_str_upper_case_py.html deleted file mode 100644 index 04a7e2d0..00000000 --- a/cov_html/gators_feature_generation_str_upper_case_py.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - Coverage for gators/feature_generation_str/upper_case.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from feature_gen_str import upper_case 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8from._base_string_feature import _BaseStringFeature 

-

9 

-

10 

-

11class UpperCase(_BaseStringFeature): 

-

12 """Convert the selected columns to upper case. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 columns : List[str] 

-

17 List of columns. 

-

18 

-

19 Examples 

-

20 --------- 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_generation_str import UpperCase 

-

25 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

26 >>> obj = UpperCase(columns=['A','B']) 

-

27 >>> obj.fit_transform(X) 

-

28 A B 

-

29 0 ABC ABC 

-

30 1 AB AB 

-

31 2 None 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_generation_str import UpperCase 

-

37 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

38 >>> obj = UpperCase(columns=['A','B']) 

-

39 >>> obj.fit_transform(X) 

-

40 A B 

-

41 0 ABC ABC 

-

42 1 AB AB 

-

43 2 None 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_generation_str import UpperCase 

-

49 >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) 

-

50 >>> obj = UpperCase(columns=['A','B']) 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([['ABC', 'ABC'], 

-

54 ['AB', 'AB'], 

-

55 ['', None]], dtype=object) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_generation_str import UpperCase 

-

61 >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) 

-

62 >>> obj = UpperCase(columns=['A','B']) 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([['ABC', 'ABC'], 

-

66 ['AB', 'AB'], 

-

67 ['', None]], dtype=object) 

-

68 

-

69 

-

70 """ 

-

71 

-

72 def __init__(self, columns: List[str], column_names: List[str] = None): 

-

73 if not isinstance(columns, list): 

-

74 raise TypeError('`columns` should be a list.') 

-

75 if not columns: 

-

76 raise ValueError('`columns` should not be empty.') 

-

77 self.columns = columns 

-

78 

-

79 def fit(self, 

-

80 X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'StringLength': 

-

82 """Fit the transformer on the dataframe `X`. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 StringLength 

-

94 Instance of itself. 

-

95 """ 

-

96 self.check_dataframe(X) 

-

97 self.idx_columns = util.get_idx_columns( 

-

98 columns=X.columns, 

-

99 selected_columns=self.columns 

-

100 ) 

-

101 return self 

-

102 

-

103 def transform( 

-

104 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

105 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

106 """Transform the dataframe `X`. 

-

107 

-

108 Parameters 

-

109 ---------- 

-

110 X : Union[pd.DataFrame, ks.DataFrame]. 

-

111 Input dataframe. 

-

112 

-

113 Returns 

-

114 ------- 

-

115 Union[pd.DataFrame, ks.DataFrame] 

-

116 Transformed dataframe. 

-

117 """ 

-

118 self.check_dataframe(X) 

-

119 

-

120 def f(x): # -> ks.Series[str]: 

-

121 if x.name in self.columns: 

-

122 return x.astype(str).str.upper().replace( 

-

123 {'NAN': 'nan', 'NONE': None}) 

-

124 return x 

-

125 # X[self.columns] = X[self.columns] 

-

126 return X.apply(f) 

-

127 

-

128 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

129 """Transform the NumPy array `X`. 

-

130 

-

131 Parameters 

-

132 ---------- 

-

133 X: np.ndarray 

-

134 Input array. 

-

135 

-

136 Returns 

-

137 ------- 

-

138 np.ndarray 

-

139 Transformed array. 

-

140 """ 

-

141 self.check_array(X) 

-

142 return upper_case(X, self.idx_columns) 

-
- - - diff --git a/cov_html/gators_feature_selection__base_feature_selection_py.html b/cov_html/gators_feature_selection__base_feature_selection_py.html deleted file mode 100644 index 7fcc3a2a..00000000 --- a/cov_html/gators_feature_selection__base_feature_selection_py.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Coverage for gators/feature_selection/_base_feature_selection.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from ..util import util 

-

4from typing import List, Union 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class _BaseFeatureSelection(Transformer): 

-

11 """Base feature selection transformer class. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 columns: List[str] 

-

16 List of columns to drop. 

-

17 selected_columns : List[str] 

-

18 List of selected columns. 

-

19 feature_importances_ : pd.Series 

-

20 Feature importance. 

-

21 

-

22 """ 

-

23 

-

24 def __init__(self): 

-

25 self.feature_importances_ = pd.Series([], dtype=np.float64) 

-

26 self.selected_columns: List[str] = [] 

-

27 self.idx_selected_columns: List[str] = [] 

-

28 self.columns_to_drop: List[str] = [] 

-

29 

-

30 def transform( 

-

31 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

32 y: Union[pd.Series, ks.Series] = None) -> Union[pd.DataFrame, ks.DataFrame]: 

-

33 """Transform the dataframe `X`. 

-

34 

-

35 Parameters 

-

36 ---------- 

-

37 X : Union[pd.DataFrame, ks.DataFrame]. 

-

38 Input dataframe. 

-

39 y : np.ndarray 

-

40 Labels. 

-

41 

-

42 Returns 

-

43 ------- 

-

44 Union[pd.DataFrame, ks.DataFrame] 

-

45 Transformed dataframe. 

-

46 """ 

-

47 self.check_dataframe(X) 

-

48 if len(self.columns_to_drop): 

-

49 return X.drop(self.columns_to_drop, axis=1) 

-

50 else: 

-

51 return X 

-

52 

-

53 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

54 """Transform the NumPy array `X`. 

-

55 

-

56 Parameters 

-

57 ---------- 

-

58 X : np.ndarray 

-

59 Input array. 

-

60 

-

61 Returns 

-

62 ------- 

-

63 np.ndarray 

-

64 Transformed array. 

-

65 """ 

-

66 self.check_array(X) 

-

67 self.idx_selected_columns.sort() 

-

68 return X[:, self.idx_selected_columns] 

-
- - - diff --git a/cov_html/gators_feature_selection_correlation_filter_py.html b/cov_html/gators_feature_selection_correlation_filter_py.html deleted file mode 100644 index 2d7fdf83..00000000 --- a/cov_html/gators_feature_selection_correlation_filter_py.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - Coverage for gators/feature_selection/correlation_filter.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ._base_feature_selection import _BaseFeatureSelection 

-

7from ..util import util 

-

8 

-

9 

-

10class CorrelationFilter(_BaseFeatureSelection): 

-

11 """Remove highly correlated columns. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 max_corr : float 

-

16 Max correlation value tolerated between two columns. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.feature_selection import CorrelationFilter 

-

25 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

26 >>> obj = CorrelationFilter(max_corr=0.9) 

-

27 >>> obj.fit_transform(X, y) 

-

28 B C 

-

29 0 1.0 0.00 

-

30 1 2.0 0.00 

-

31 2 3.0 0.15 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.feature_selection import CorrelationFilter 

-

37 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

38 >>> obj = CorrelationFilter(max_corr=0.9) 

-

39 >>> obj.fit_transform(X, y) 

-

40 B C 

-

41 0 1.0 0.00 

-

42 1 2.0 0.00 

-

43 2 3.0 0.15 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.feature_selection import CorrelationFilter 

-

49 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

50 >>> obj = CorrelationFilter(max_corr=0.9) 

-

51 >>> _ = obj.fit(X, y) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[1. , 0. ], 

-

54 [2. , 0. ], 

-

55 [3. , 0.15]]) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.feature_selection import CorrelationFilter 

-

61 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

62 >>> obj = CorrelationFilter(max_corr=0.9) 

-

63 >>> _ = obj.fit(X, y) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[1. , 0. ], 

-

66 [2. , 0. ], 

-

67 [3. , 0.15]]) 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, max_corr: float): 

-

72 if not isinstance(max_corr, float): 

-

73 raise TypeError('`max_corr` should be a float.') 

-

74 _BaseFeatureSelection.__init__(self) 

-

75 self.max_corr = max_corr 

-

76 

-

77 def fit(self, 

-

78 X: Union[pd.DataFrame, ks.DataFrame], 

-

79 y: Union[pd.Series, ks.Series] = None) -> 'CorrelationFilter': 

-

80 """Fit the transformer on the dataframe `X`. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 X : Union[pd.DataFrame, ks.DataFrame]. 

-

85 Input dataframe. 

-

86 y : None 

-

87 None. 

-

88 

-

89 Returns 

-

90 ------- 

-

91 CorrelationFilter: Instance of itself. 

-

92 """ 

-

93 self.check_dataframe(X) 

-

94 columns = X.columns 

-

95 corr = X.corr().abs() 

-

96 if isinstance(X, ks.DataFrame): 

-

97 corr = corr.to_pandas() 

-

98 stacked_corr = (corr.where(np.tril(np.ones(corr.shape), k=-1).astype(np.bool)) 

-

99 .stack() 

-

100 .sort_values(ascending=False)) 

-

101 stacked_corr = stacked_corr.sort_values(ascending=False) 

-

102 mask = (stacked_corr >= self.max_corr) 

-

103 self.columns_to_drop = stacked_corr[mask].sort_index( 

-

104 ).index.get_level_values(1) 

-

105 self.columns_to_drop = list(set(self.columns_to_drop)) 

-

106 self.selected_columns = [ 

-

107 c for c in columns if c not in self.columns_to_drop] 

-

108 self.feature_importances_ = pd.Series( 

-

109 1., index=self.selected_columns, dtype=float) 

-

110 self.idx_selected_columns = util.get_idx_columns( 

-

111 X.columns, self.selected_columns) 

-

112 return self 

-
- - - diff --git a/cov_html/gators_feature_selection_information_value_py.html b/cov_html/gators_feature_selection_information_value_py.html deleted file mode 100644 index 9fc3b6c1..00000000 --- a/cov_html/gators_feature_selection_information_value_py.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - Coverage for gators/feature_selection/information_value.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import databricks.koalas as ks 

-

5import pandas as pd 

-

6from ._base_feature_selection import _BaseFeatureSelection 

-

7from ..util import util 

-

8from ..binning._base_discretizer import _BaseDiscretizer 

-

9 

-

10 

-

11class InformationValue(_BaseFeatureSelection): 

-

12 """Feature selection based on the information value. 

-

13 

-

14 `InformationValue` accepts only binary variable targets. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 k : int 

-

19 Number of features to keep. 

-

20 discretizer : _BaseDiscretizer 

-

21 Discretizer transformer. 

-

22 

-

23 See Also 

-

24 -------- 

-

25 gators.feature_selection.MultiClassInformationValue 

-

26 Information value for muti-class classification problems. 

-

27 gators.feature_selection.RegressionInformationValue 

-

28 Information value for regression problems. 

-

29 

-

30 Examples 

-

31 --------- 

-

32 

-

33 * fit & transform with pandas 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> from gators.feature_selection import InformationValue 

-

37 >>> X = pd.DataFrame({ 

-

38 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

39 ... 'B': [1, 1, 0, 1, 0, 0], 

-

40 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

41 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

42 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

43 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

44 >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

45 >>> InformationValue(k=3, n_bins=4).fit_transform(X, y) 

-

46 A B C 

-

47 0 87.25 1 a 

-

48 1 5.25 1 b 

-

49 2 70.25 0 b 

-

50 3 5.25 1 b 

-

51 4 0.25 0 a 

-

52 5 7.25 0 a 

-

53 

-

54 * fit & transform with koalas 

-

55 

-

56 >>> import databricks.koalas as ks 

-

57 >>> from gators.feature_selection import InformationValue 

-

58 >>> X = ks.DataFrame({ 

-

59 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

60 ... 'B': [1, 1, 0, 1, 0, 0], 

-

61 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

62 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

63 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

64 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

65 >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

66 >>> InformationValue(k=3, n_bins=4).fit_transform(X, y) 

-

67 A B C 

-

68 0 87.25 1 a 

-

69 1 5.25 1 b 

-

70 2 70.25 0 b 

-

71 3 5.25 1 b 

-

72 4 0.25 0 a 

-

73 5 7.25 0 a 

-

74 

-

75 * fit with pandas & transform with numpy 

-

76 

-

77 >>> X = pd.DataFrame({ 

-

78 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

79 ... 'B': [1, 1, 0, 1, 0, 0], 

-

80 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

81 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

82 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

83 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

84 >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

85 >>> obj = InformationValue(k=3, n_bins=4).fit(X, y) 

-

86 >>> obj.transform_numpy(X.to_numpy()) 

-

87 array([[87.25, 1, 'a'], 

-

88 [5.25, 1, 'b'], 

-

89 [70.25, 0, 'b'], 

-

90 [5.25, 1, 'b'], 

-

91 [0.25, 0, 'a'], 

-

92 [7.25, 0, 'a']], dtype=object) 

-

93 

-

94 * fit with koalas & transform with numpy 

-

95 

-

96 >>> import databricks.koalas as ks 

-

97 >>> from gators.feature_selection import InformationValue 

-

98 >>> X = ks.DataFrame({ 

-

99 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

100 ... 'B': [1, 1, 0, 1, 0, 0], 

-

101 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

102 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

103 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

104 >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') 

-

105 >>> obj = InformationValue(k=3, n_bins=4).fit(X, y) 

-

106 >>> obj.transform_numpy(X.to_numpy()) 

-

107 array([[87.25, 1, 'a'], 

-

108 [5.25, 1, 'b'], 

-

109 [70.25, 0, 'b'], 

-

110 [5.25, 1, 'b'], 

-

111 [0.25, 0, 'a'], 

-

112 [7.25, 0, 'a']], dtype=object) 

-

113 

-

114 

-

115 """ 

-

116 

-

117 def __init__(self, k: int, discretizer: _BaseDiscretizer): 

-

118 if not isinstance(k, int): 

-

119 raise TypeError('`k` should be an int.') 

-

120 if not isinstance(discretizer, _BaseDiscretizer): 

-

121 raise TypeError( 

-

122 '`discretizer` should derive from _BaseDiscretizer.') 

-

123 _BaseFeatureSelection.__init__(self) 

-

124 self.k = k 

-

125 self.discretizer = discretizer 

-

126 

-

127 def fit(self, 

-

128 X: Union[pd.DataFrame, ks.DataFrame], 

-

129 y: Union[pd.Series, ks.Series] = None) -> 'InformationValue': 

-

130 """Fit the transformer on the dataframe `X`. 

-

131 

-

132 Parameters 

-

133 ---------- 

-

134 X: Union[pd.DataFrame, ks.DataFrame] 

-

135 Input dataframe. 

-

136 y: Union[pd.Series, ks.Series], default to None. 

-

137 Labels. 

-

138 

-

139 Returns 

-

140 ------- 

-

141 InformationValue: Instance of itself. 

-

142 """ 

-

143 self.check_dataframe(X) 

-

144 self.check_y(X, y) 

-

145 columns = X.columns 

-

146 self.feature_importances_ = self.compute_information_value( 

-

147 X, y, self.discretizer 

-

148 ) 

-

149 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

150 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

151 self.columns_to_drop = [ 

-

152 c for c in columns if c not in self.selected_columns 

-

153 ] 

-

154 self.idx_selected_columns = util.get_idx_columns( 

-

155 X.columns, self.selected_columns) 

-

156 return self 

-

157 

-

158 @staticmethod 

-

159 def compute_information_value( 

-

160 X: Union[pd.DataFrame, ks.DataFrame], 

-

161 y: Union[pd.Series, ks.Series], 

-

162 discretizer: _BaseDiscretizer) -> pd.Series: 

-

163 """Compute information value. 

-

164 

-

165 Parameters 

-

166 ---------- 

-

167 X: Union[pd.DataFrame, ks.DataFrame] 

-

168 Input dataframe. 

-

169 y: np.ndarray 

-

170 Target values. 

-

171 discretizer: _BaseDiscretizer 

-

172 Discretizer. 

-

173 

-

174 Returns 

-

175 ------- 

-

176 pd.Series 

-

177 Information value. 

-

178 """ 

-

179 object_columns = util.get_datatype_columns(X, object) 

-

180 numerical_columns = util.get_numerical_columns(X) 

-

181 binned_columns = [ 

-

182 f'{c}__bin' for c in numerical_columns] 

-

183 iv_columns = object_columns.copy() + binned_columns.copy() 

-

184 y_name = y.name 

-

185 X = discretizer.fit_transform(X) 

-

186 iv = pd.Series(0, index=iv_columns) 

-

187 X = X.join(y) 

-

188 y_name = y.name 

-

189 for col in iv_columns: 

-

190 if isinstance(X, pd.DataFrame): 

-

191 tab = X.groupby( 

-

192 [col, y_name])[y_name].count().unstack( 

-

193 ).fillna(0) 

-

194 else: 

-

195 tab = X[[col, y_name]].groupby( 

-

196 [col, y_name])[y_name].count().to_pandas().unstack( 

-

197 ).fillna(0) 

-

198 tab /= tab.sum() 

-

199 tab = tab.to_numpy() 

-

200 # if tab.shape[1] == 1: 

-

201 # continue 

-

202 with np.errstate(divide='ignore'): 

-

203 woe = pd.Series(np.log(tab[:, 1] / tab[:, 0])) 

-

204 woe[(woe == np.inf) | (woe == -np.inf)] = 0. 

-

205 iv.loc[col] = np.sum(woe * (tab[:, 1] - tab[:, 0])) 

-

206 

-

207 X = X.drop(binned_columns + [y_name], axis=1) 

-

208 iv.index = [ 

-

209 c.split('__bin')[0] for c in iv.index] 

-

210 return iv.sort_values(ascending=False).fillna(0) 

-
- - - diff --git a/cov_html/gators_feature_selection_multiclass_information_value_py.html b/cov_html/gators_feature_selection_multiclass_information_value_py.html deleted file mode 100644 index cf2ad57d..00000000 --- a/cov_html/gators_feature_selection_multiclass_information_value_py.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - Coverage for gators/feature_selection/multiclass_information_value.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ._base_feature_selection import _BaseFeatureSelection 

-

6from .information_value import InformationValue 

-

7from ..util import util 

-

8from ..binning._base_discretizer import _BaseDiscretizer 

-

9 

-

10 

-

11class MultiClassInformationValue(_BaseFeatureSelection): 

-

12 """Feature selection based on the information value. 

-

13 

-

14 `MultiClassInformationValue` accepts only for muti-class variable targets. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 k : int 

-

19 Number of features to keep. 

-

20 discretizer : _BaseDiscretizer 

-

21 Discretizer Transformer. 

-

22 

-

23 See Also 

-

24 -------- 

-

25 gators.feature_selection.InformationValue 

-

26 Information value for binary classification problems. 

-

27 gators.feature_selection.RegressionInformationValue 

-

28 Information value for regression problems. 

-

29 

-

30 Examples 

-

31 -------- 

-

32 * fit & transform with pandas 

-

33 

-

34 >>> import pandas as pd 

-

35 >>> from binning import Discretizer 

-

36 >>> from gators.feature_selection import MultiClassInformationValue 

-

37 >>> X = pd.DataFrame({ 

-

38 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

39 ... 'B': [1, 1, 0, 1, 0, 0], 

-

40 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

41 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

42 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

43 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

44 >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

45 >>> discretizer = Discretizer(n_bins=4) 

-

46 >>> MultiClassInformationValue(k=3, discretizer=discretizer).fit_transform(X, y) 

-

47 B C F 

-

48 0 1 a 1 

-

49 1 1 b 2 

-

50 2 0 b 3 

-

51 3 1 b 1 

-

52 4 0 a 2 

-

53 5 0 a 4 

-

54 

-

55 * fit & transform with koalas 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from binning import Discretizer 

-

59 >>> from gators.feature_selection import InformationValue 

-

60 >>> X = ks.DataFrame({ 

-

61 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

62 ... 'B': [1, 1, 0, 1, 0, 0], 

-

63 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

64 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

65 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

66 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

67 >>> discretizer = Discretizer(n_bins=4) 

-

68 >>> MultiClassInformationValue(k=3, discretizer=discretizer).fit_transform(X, y) 

-

69 B C F 

-

70 0 1 a 1 

-

71 1 1 b 2 

-

72 2 0 b 3 

-

73 3 1 b 1 

-

74 4 0 a 2 

-

75 5 0 a 4 

-

76 

-

77 * fit with pandas & transform with numpy 

-

78 

-

79 >>> import pandas as pd 

-

80 >>> from binning import Discretizer 

-

81 >>> from gators.feature_selection import InformationValue 

-

82 >>> X = pd.DataFrame({ 

-

83 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

84 ... 'B': [1, 1, 0, 1, 0, 0], 

-

85 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

86 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

87 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

88 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

89 >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

90 >>> discretizer = Discretizer(n_bins=4) 

-

91 >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer).fit(X, y) 

-

92 >>> obj.transform_numpy(X.to_numpy()) 

-

93 array([[1, 'a', 1], 

-

94 [1, 'b', 2], 

-

95 [0, 'b', 3], 

-

96 [1, 'b', 1], 

-

97 [0, 'a', 2], 

-

98 [0, 'a', 4]], dtype=object) 

-

99 

-

100 * fit with koalas & transform with numpy 

-

101 

-

102 >>> import databricks.koalas as ks 

-

103 >>> from binning import Discretizer 

-

104 >>> from gators.feature_selection import InformationValue 

-

105 >>> X = ks.DataFrame({ 

-

106 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

107 ... 'B': [1, 1, 0, 1, 0, 0], 

-

108 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

109 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

110 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

111 >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') 

-

112 >>> discretizer = Discretizer(n_bins=4) 

-

113 >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer).fit(X, y) 

-

114 >>> obj.transform_numpy(X.to_numpy()) 

-

115 array([[1, 'a', 1], 

-

116 [1, 'b', 2], 

-

117 [0, 'b', 3], 

-

118 [1, 'b', 1], 

-

119 [0, 'a', 2], 

-

120 [0, 'a', 4]], dtype=object) 

-

121 

-

122 """ 

-

123 

-

124 def __init__(self, k: int, discretizer: _BaseDiscretizer): 

-

125 if not isinstance(k, int): 

-

126 raise TypeError('`k` should be an int.') 

-

127 if not isinstance(discretizer, _BaseDiscretizer): 

-

128 raise TypeError( 

-

129 '`discretizer` should inherite from _BaseDiscretizer.') 

-

130 _BaseFeatureSelection.__init__(self) 

-

131 self.k = k 

-

132 self.discretizer = discretizer 

-

133 

-

134 def fit(self, 

-

135 X: Union[pd.DataFrame, ks.DataFrame], 

-

136 y: Union[pd.Series, ks.Series] = None 

-

137 ) -> 'MultiClassInformationValue': 

-

138 """Fit the transformer on the dataframe `X`. 

-

139 

-

140 Parameters 

-

141 ---------- 

-

142 X : Union[pd.DataFrame, ks.DataFrame] 

-

143 Input dataframe. 

-

144 y : Union[pd.Series, ks.Series], default to None. 

-

145 Labels. 

-

146 

-

147 Returns 

-

148 ------- 

-

149 InformationValue: Instance of itself. 

-

150 """ 

-

151 self.check_dataframe(X) 

-

152 self.check_y(X, y) 

-

153 columns = X.columns 

-

154 self.feature_importances_ = self.compute_information_value( 

-

155 X, y, self.discretizer 

-

156 ) 

-

157 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

158 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

159 self.columns_to_drop = [ 

-

160 c for c in columns if c not in self.selected_columns 

-

161 ] 

-

162 self.idx_selected_columns = util.get_idx_columns( 

-

163 X.columns, self.selected_columns) 

-

164 return self 

-

165 

-

166 @staticmethod 

-

167 def compute_information_value( 

-

168 X: Union[pd.DataFrame, ks.DataFrame], 

-

169 y: Union[pd.Series, ks.Series], 

-

170 discretizer: _BaseDiscretizer) -> pd.Series: 

-

171 """Compute information value. 

-

172 

-

173 Parameters 

-

174 ---------- 

-

175 X : Union[pd.DataFrame, ks.DataFrame] 

-

176 Input dataframe. 

-

177 y : Union[pd.Series, ks.Series], default to None. 

-

178 Labels. 

-

179 discretizer : _BaseDiscretizer 

-

180 Discretizer Transformer. 

-

181 

-

182 Returns 

-

183 ------- 

-

184 pd.Series 

-

185 Information value. 

-

186 """ 

-

187 if isinstance(X, pd.DataFrame): 

-

188 y_onehot = pd.get_dummies(y, prefix=y.name) 

-

189 else: 

-

190 y_onehot = ks.get_dummies(y, prefix=y.name) 

-

191 information_values = pd.DataFrame( 

-

192 index=X.columns, columns=y_onehot.columns[1:]) 

-

193 iv = InformationValue(discretizer=discretizer, k=X.shape[1]) 

-

194 object_columns = util.get_datatype_columns(X, object) 

-

195 X = discretizer.fit_transform(X) 

-

196 columns = X.columns 

-

197 columns = object_columns + discretizer.output_columns 

-

198 for col in y_onehot.columns[1:]: 

-

199 _ = iv.fit(X[columns], y_onehot.loc[:, col]) 

-

200 information_values.loc[:, col] = iv.feature_importances_ 

-

201 return information_values.fillna(0).max(1).sort_values( 

-

202 ascending=False) 

-
- - - diff --git a/cov_html/gators_feature_selection_regression_information_value_py.html b/cov_html/gators_feature_selection_regression_information_value_py.html deleted file mode 100644 index 0283a763..00000000 --- a/cov_html/gators_feature_selection_regression_information_value_py.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - Coverage for gators/feature_selection/regression_information_value.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ._base_feature_selection import _BaseFeatureSelection 

-

6from .multiclass_information_value import MultiClassInformationValue 

-

7from ..util import util 

-

8from ..binning._base_discretizer import _BaseDiscretizer 

-

9 

-

10 

-

11class RegressionInformationValue(_BaseFeatureSelection): 

-

12 """Regression Information Value Transformer. 

-

13 

-

14 `RegressionInformationValue` accepts only continuous variable targets. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 k : int 

-

19 Number of features to keep. 

-

20 discretizer : _BaseDiscretizer 

-

21 Discretizer Transformer. 

-

22 

-

23 See Also 

-

24 -------- 

-

25 gators.feature_selection.InformationValue 

-

26 Information value for binary classification problems. 

-

27 gators.feature_selection.MultiClassInformationValue 

-

28 Information value for multi-class classification problems. 

-

29 

-

30 Examples 

-

31 -------- 

-

32 * fit & transform with pandas 

-

33 

-

34 >>> import pandas as pd 

-

35 >>> from binning import Discretizer 

-

36 >>> from gators.feature_selection import RegressionInformationValue 

-

37 >>> X = pd.DataFrame({ 

-

38 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

39 ... 'B': [1, 1, 0, 1, 0, 0], 

-

40 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

41 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

42 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

43 >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

44 >>> discretizer = Discretizer(n_bins=4) 

-

45 >>> RegressionInformationValue(k=3, discretizer=discretizer).fit_transform(X, y) 

-

46 A D F 

-

47 0 87.25 11.0 1 

-

48 1 5.25 22.0 2 

-

49 2 70.25 33.0 3 

-

50 3 5.25 44.0 1 

-

51 4 0.25 55.0 2 

-

52 5 7.25 66.2 4 

-

53 

-

54 * fit & transform with koalas 

-

55 

-

56 >>> import databricks.koalas as ks 

-

57 >>> from gators.feature_selection import InformationValue 

-

58 >>> X = ks.DataFrame({ 

-

59 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

60 ... 'B': [1, 1, 0, 1, 0, 0], 

-

61 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

62 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

63 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

64 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

65 >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

66 >>> discretizer = Discretizer(n_bins=4) 

-

67 >>> RegressionInformationValue(k=3, discretizer=discretizer).fit_transform(X, y) 

-

68 A D F 

-

69 0 87.25 11.0 1 

-

70 1 5.25 22.0 2 

-

71 2 70.25 33.0 3 

-

72 3 5.25 44.0 1 

-

73 4 0.25 55.0 2 

-

74 5 7.25 66.2 4 

-

75 

-

76 * fit with pandas & transform with numpy 

-

77 

-

78 >>> X = pd.DataFrame({ 

-

79 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

80 ... 'B': [1, 1, 0, 1, 0, 0], 

-

81 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

82 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

83 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

84 >>> X_expected = X[['A', 'B', 'C']].copy() 

-

85 >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

86 >>> discretizer = Discretizer(n_bins=4) 

-

87 >>> obj = RegressionInformationValue(k=3, discretizer=discretizer).fit(X, y) 

-

88 >>> obj.transform_numpy(X.to_numpy()) 

-

89 array([[87.25, 11. , 1. ], 

-

90 [ 5.25, 22. , 2. ], 

-

91 [70.25, 33. , 3. ], 

-

92 [ 5.25, 44. , 1. ], 

-

93 [ 0.25, 55. , 2. ], 

-

94 [ 7.25, 66.2 , 4. ]]) 

-

95 

-

96 * fit with koalas & transform with numpy 

-

97 

-

98 >>> import databricks.koalas as ks 

-

99 >>> from gators.feature_selection import InformationValue 

-

100 >>> X = ks.DataFrame({ 

-

101 ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], 

-

102 ... 'B': [1, 1, 0, 1, 0, 0], 

-

103 ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], 

-

104 ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], 

-

105 ... 'F': [1, 2, 3, 1, 2, 4]}) 

-

106 >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') 

-

107 >>> discretizer = Discretizer(n_bins=4) 

-

108 >>> obj = RegressionInformationValue(k=3, discretizer=discretizer).fit(X, y) 

-

109 >>> obj.transform_numpy(X.to_numpy()) 

-

110 array([[87.25, 11. , 1. ], 

-

111 [ 5.25, 22. , 2. ], 

-

112 [70.25, 33. , 3. ], 

-

113 [ 5.25, 44. , 1. ], 

-

114 [ 0.25, 55. , 2. ], 

-

115 [ 7.25, 66.2 , 4. ]]) 

-

116 

-

117 

-

118 """ 

-

119 

-

120 def __init__(self, k: int, discretizer: _BaseDiscretizer): 

-

121 if not isinstance(k, int): 

-

122 raise TypeError('`k` should be an int.') 

-

123 if not isinstance(discretizer, _BaseDiscretizer): 

-

124 raise TypeError( 

-

125 '`discretizer` should inherite from _BaseDiscretizer.') 

-

126 _BaseFeatureSelection.__init__(self) 

-

127 self.k = k 

-

128 self.discretizer = discretizer 

-

129 

-

130 def fit(self, 

-

131 X: Union[pd.DataFrame, ks.DataFrame], 

-

132 y: Union[pd.Series, ks.Series] = None 

-

133 ) -> 'RegressionInformationValue': 

-

134 """Fit the transformer on the dataframe `X`. 

-

135 

-

136 Parameters 

-

137 ---------- 

-

138 X : Union[pd.DataFrame, ks.DataFrame] 

-

139 Input dataframe. 

-

140 y : Union[pd.Series, ks.Series], default to None. 

-

141 Labels. 

-

142 

-

143 Returns 

-

144 ------- 

-

145 InformationValue: Instance of itself. 

-

146 """ 

-

147 self.check_dataframe(X) 

-

148 self.check_y(X, y) 

-

149 columns = X.columns 

-

150 self.feature_importances_ = self.compute_information_value( 

-

151 X, y, self.discretizer 

-

152 ) 

-

153 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

154 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

155 self.columns_to_drop = [ 

-

156 c for c in columns if c not in self.selected_columns 

-

157 ] 

-

158 self.idx_selected_columns = util.get_idx_columns( 

-

159 X.columns, self.selected_columns) 

-

160 return self 

-

161 

-

162 @staticmethod 

-

163 def compute_information_value( 

-

164 X: Union[pd.DataFrame, ks.DataFrame], 

-

165 y: Union[pd.Series, ks.Series], 

-

166 discretizer: _BaseDiscretizer) -> pd.Series: 

-

167 """Compute information value. 

-

168 

-

169 Parameters 

-

170 ---------- 

-

171 X : Union[pd.DataFrame, ks.DataFrame] 

-

172 Input dataframe. 

-

173 y : Union[pd.Series, ks.Series], default to None. 

-

174 Labels. 

-

175 discretizer : _BaseDiscretizer 

-

176 Discretizer Transformer. 

-

177 

-

178 Returns 

-

179 ------- 

-

180 pd.Series 

-

181 Information value. 

-

182 """ 

-

183 y_name = y.name 

-

184 y_onehot = discretizer.fit_transform(y.to_frame()) 

-

185 discretizer.inplace = False 

-

186 return MultiClassInformationValue.compute_information_value( 

-

187 X, 

-

188 y_onehot[y_name].astype(float).astype(int), 

-

189 discretizer=discretizer) 

-
- - - diff --git a/cov_html/gators_feature_selection_select_from_model_py.html b/cov_html/gators_feature_selection_select_from_model_py.html deleted file mode 100644 index e7a31fa6..00000000 --- a/cov_html/gators_feature_selection_select_from_model_py.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - Coverage for gators/feature_selection/select_from_model.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import pandas as pd 

-

4import databricks.koalas as ks 

-

5from ._base_feature_selection import _BaseFeatureSelection 

-

6from ..converter import KoalasToPandas 

-

7from ..util import util 

-

8 

-

9 

-

10class SelectFromModel(_BaseFeatureSelection): 

-

11 """Select From Model Transformer. 

-

12 

-

13 Select the top *k* features based on the feature importance 

-

14 of the given machine learning model. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 model : model 

-

19 Machine learning model. 

-

20 k : int 

-

21 Number of features to keep. 

-

22 

-

23 Examples 

-

24 --------- 

-

25 * fit & transform with koalas 

-

26 

-

27 

-

28 >>> import pandas as pd 

-

29 >>> from sklearn.ensemble import RandomForestClassifier as RFC 

-

30 >>> from gators.feature_selection import SelectFromModel 

-

31 >>> X = pd.DataFrame( 

-

32 ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

33 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

34 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

35 >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

36 >>> model = RFC(n_estimators=1, max_depth=2, random_state=0) 

-

37 >>> obj = SelectFromModel(model=model, k=2) 

-

38 >>> obj.fit_transform(X, y) 

-

39 A C 

-

40 0 22.00 3.0 

-

41 1 38.00 1.0 

-

42 2 26.00 3.0 

-

43 3 35.00 1.0 

-

44 4 35.00 3.0 

-

45 5 28.11 3.0 

-

46 6 54.00 1.0 

-

47 7 2.00 3.0 

-

48 8 27.00 3.0 

-

49 9 14.00 2.0 

-

50 

-

51 * fit & transform with koalas 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark 

-

55 >>> from gators.feature_selection import SelectFromModel 

-

56 >>> X = ks.DataFrame( 

-

57 ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

58 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

59 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

60 >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

61 >>> model = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) 

-

62 >>> obj = SelectFromModel(model=model, k=2) 

-

63 >>> obj.fit_transform(X, y) 

-

64 A C 

-

65 0 22.00 3.0 

-

66 1 38.00 1.0 

-

67 2 26.00 3.0 

-

68 3 35.00 1.0 

-

69 4 35.00 3.0 

-

70 5 28.11 3.0 

-

71 6 54.00 1.0 

-

72 7 2.00 3.0 

-

73 8 27.00 3.0 

-

74 9 14.00 2.0 

-

75 

-

76 See Also 

-

77 -------- 

-

78 gators.feature_selection.SelectFromModels 

-

79 Similar method using multiple models. 

-

80 

-

81 """ 

-

82 

-

83 def __init__(self, model, k: int): 

-

84 if not isinstance(k, int): 

-

85 raise TypeError('`k` should be an int.') 

-

86 if not hasattr(model, 'fit'): 

-

87 raise TypeError( 

-

88 '`model` should have the attribute `fit`.' 

-

89 ) 

-

90 _BaseFeatureSelection.__init__(self) 

-

91 self.model = model 

-

92 self.k = k 

-

93 

-

94 def fit(self, 

-

95 X: Union[pd.DataFrame, ks.DataFrame], 

-

96 y: Union[pd.Series, ks.Series] = None) -> 'SelectFromModel': 

-

97 """Fit the transformer on the dataframe `X`. 

-

98 

-

99 Parameters 

-

100 ---------- 

-

101 X : Union[pd.DataFrame, ks.DataFrame] 

-

102 Input dataframe. 

-

103 y : Union[pd.Series, ks.Series], default to None. 

-

104 Labels. 

-

105 

-

106 Returns 

-

107 ------- 

-

108 SelectFromModel: Instance of itself. 

-

109 """ 

-

110 self.check_dataframe(X) 

-

111 self.check_y(X, y) 

-

112 columns = list(X.columns) 

-

113 if isinstance(X, pd.DataFrame): 

-

114 self.feature_importances_ = self.calculate_feature_importances_pd( 

-

115 model=self.model, X=X, y=y, columns=columns) 

-

116 else: 

-

117 if hasattr(self.model, 'labelCol'): 

-

118 self.feature_importances_ = \ 

-

119 self.calculate_feature_importances_ks( 

-

120 model=self.model, X=X, y=y, columns=columns) 

-

121 else: 

-

122 X_, y_ = KoalasToPandas().transform(X, y) 

-

123 self.feature_importances_ = \ 

-

124 self.calculate_feature_importances_pd( 

-

125 model=self.model, X=X_, y=y_, columns=columns) 

-

126 mask = self.feature_importances_ != 0 

-

127 self.feature_importances_ = self.feature_importances_[mask] 

-

128 self.feature_importances_.sort_values(ascending=False, inplace=True) 

-

129 self.selected_columns = list(self.feature_importances_.index[:self.k]) 

-

130 self.columns_to_drop = [ 

-

131 c for c in columns if c not in self.selected_columns] 

-

132 self.idx_selected_columns = util.get_idx_columns( 

-

133 X.columns, self.selected_columns) 

-

134 return self 

-

135 

-

136 @staticmethod 

-

137 def calculate_feature_importances_pd( 

-

138 model: object, X: pd.DataFrame, 

-

139 y: Union[pd.Series, ks.Series], columns: list) -> pd.Series: 

-

140 model.fit(X.to_numpy(), y) 

-

141 feature_importances_ = pd.Series( 

-

142 model.feature_importances_, 

-

143 index=columns, 

-

144 ) 

-

145 return feature_importances_ 

-

146 

-

147 @staticmethod 

-

148 def calculate_feature_importances_ks( 

-

149 model: object, X: ks.DataFrame, 

-

150 y: ks.Series, columns: list) -> pd.Series: 

-

151 spark_df = util.generate_spark_dataframe(X=X, y=y) 

-

152 trained_model = model.fit(spark_df) 

-

153 feature_importances_ = pd.Series( 

-

154 trained_model.featureImportances.toArray(), 

-

155 index=columns 

-

156 ) 

-

157 return feature_importances_ 

-
- - - diff --git a/cov_html/gators_feature_selection_select_from_models_py.html b/cov_html/gators_feature_selection_select_from_models_py.html deleted file mode 100644 index 4e9d8167..00000000 --- a/cov_html/gators_feature_selection_select_from_models_py.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - Coverage for gators/feature_selection/select_from_models.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6import pyspark.sql.dataframe as ps 

-

7from ._base_feature_selection import _BaseFeatureSelection 

-

8from ..scalers.minmax_scaler import MinMaxScaler 

-

9from ..util import util 

-

10 

-

11 

-

12class SelectFromModels(_BaseFeatureSelection): 

-

13 """Select From Models By Vote Transformer. 

-

14 

-

15 Select the top *k* features based on the feature importance 

-

16 of the given machine learning models. 

-

17 

-

18 Parameters 

-

19 ---------- 

-

20 models : List[model] 

-

21 List of machine learning models. 

-

22 k : int 

-

23 Number of features to keep. 

-

24 

-

25 Examples 

-

26 --------- 

-

27 * fit & transform with koalas 

-

28 

-

29 >>> import pandas as pd 

-

30 >>> from sklearn.ensemble import RandomForestClassifier 

-

31 >>> from gators.feature_selection import SelectFromModels 

-

32 >>> X = pd.DataFrame( 

-

33 ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

34 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

35 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

36 >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

37 >>> models = [RFC(n_estimators=1, max_depth=1, random_state=0), 

-

38 ... RFC(n_estimators=1, max_depth=2, random_state=1)] 

-

39 >>> obj = SelectFromModels(models=models, k=2) 

-

40 >>> obj.fit_transform(X, y) 

-

41 B C 

-

42 0 7.25 3.0 

-

43 1 71.28 1.0 

-

44 2 7.92 3.0 

-

45 3 53.10 1.0 

-

46 4 8.05 3.0 

-

47 5 8.46 3.0 

-

48 6 51.86 1.0 

-

49 7 21.08 3.0 

-

50 8 11.13 3.0 

-

51 9 30.07 2.0 

-

52 

-

53 * fit & transform with koalas 

-

54 

-

55 >>> import databricks.koalas as ks 

-

56 >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark 

-

57 >>> from gators.feature_selection import SelectFromModels 

-

58 >>> X = ks.DataFrame( 

-

59 ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], 

-

60 ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], 

-

61 ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) 

-

62 >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') 

-

63 >>> models = [RFCSpark(numTrees=1, maxDepth=1, labelCol=y.name, seed=0), 

-

64 ... RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=1)] 

-

65 >>> obj = SelectFromModels(models=models, k=2) 

-

66 >>> obj.fit_transform(X, y) 

-

67 A B 

-

68 0 22.00 7.25 

-

69 1 38.00 71.28 

-

70 2 26.00 7.92 

-

71 3 35.00 53.10 

-

72 4 35.00 8.05 

-

73 5 28.11 8.46 

-

74 6 54.00 51.86 

-

75 7 2.00 21.08 

-

76 8 27.00 11.13 

-

77 9 14.00 30.07 

-

78 

-

79 See Also 

-

80 -------- 

-

81 gators.feature_selection.SelectFromMode 

-

82 Similar method using one model. 

-

83 

-

84 """ 

-

85 

-

86 def __init__(self, models: List[object], k: int): 

-

87 if not isinstance(models, list): 

-

88 raise TypeError('`models` should be a list.') 

-

89 if not isinstance(k, int): 

-

90 raise TypeError('`k` should be an int.') 

-

91 for model in models: 

-

92 if not hasattr(model, 'fit'): 

-

93 raise TypeError( 

-

94 'All the elements of `models` should have the attribute `fit`.' 

-

95 ) 

-

96 _BaseFeatureSelection.__init__(self) 

-

97 self.models = models 

-

98 self.k = k 

-

99 

-

100 def fit(self, 

-

101 X: Union[pd.DataFrame, ks.DataFrame], 

-

102 y: Union[pd.Series, ks.Series] = None) -> 'SelectFromModels': 

-

103 """Fit the transformer on the dataframe `X`. 

-

104 

-

105 Parameters 

-

106 ---------- 

-

107 X : Union[pd.DataFrame, ks.DataFrame] 

-

108 Input dataframe. 

-

109 y : Union[pd.Series, ks.Series], default to None. 

-

110 Labels. 

-

111 

-

112 Returns 

-

113 ------- 

-

114 SelectFromModels: Instance of itself. 

-

115 """ 

-

116 self.check_dataframe(X) 

-

117 self.check_y(X, y) 

-

118 self.feature_importances_ = self.get_feature_importances_frame( 

-

119 X, self.models) 

-

120 if isinstance(X, pd.DataFrame): 

-

121 for col, model in zip( 

-

122 self.feature_importances_.columns, self.models): 

-

123 model_feature_importances_ = self.get_feature_importances_pd( 

-

124 model=model, X=X, y=y) 

-

125 self.feature_importances_[col] = model_feature_importances_ 

-

126 else: 

-

127 spark_df = util.generate_spark_dataframe(X=X, y=y) 

-

128 for col, model in zip( 

-

129 self.feature_importances_.columns, self.models): 

-

130 model_feature_importances_ = self.get_feature_importances_sk( 

-

131 model=model, spark_df=spark_df) 

-

132 self.feature_importances_[col] = model_feature_importances_ 

-

133 self.feature_importances_ = self.clean_feature_importances_frame( 

-

134 self.feature_importances_) 

-

135 self.selected_columns = list( 

-

136 self.feature_importances_['count'].iloc[:self.k].index) 

-

137 self.columns_to_drop = [ 

-

138 c for c in self.feature_importances_.index 

-

139 if c not in self.selected_columns 

-

140 ] 

-

141 self.idx_selected_columns = util.get_idx_columns( 

-

142 X.columns, self.selected_columns) 

-

143 return self 

-

144 

-

145 @staticmethod 

-

146 def get_feature_importances_pd( 

-

147 model: object, X: pd.DataFrame, y: Union[pd.Series, ks.Series]): 

-

148 model.fit(X, y) 

-

149 feature_importances_ = model.feature_importances_ 

-

150 return feature_importances_ 

-

151 

-

152 @staticmethod 

-

153 def get_feature_importances_sk( 

-

154 model: object, spark_df: ps.DataFrame): 

-

155 trained_model = model.fit(spark_df) 

-

156 feature_importances_ = trained_model.featureImportances.toArray() 

-

157 return feature_importances_ 

-

158 

-

159 @staticmethod 

-

160 def get_feature_importances_frame(X, models): 

-

161 index = np.array(list(X.columns)) 

-

162 columns = [] 

-

163 for i, model in enumerate(models): 

-

164 col = str(model).split('(')[0] 

-

165 columns.append(col + '_' + str(i)) 

-

166 return pd.DataFrame( 

-

167 columns=columns, index=index, dtype=np.float64) 

-

168 

-

169 @staticmethod 

-

170 def clean_feature_importances_frame(feature_importances): 

-

171 feature_importances = MinMaxScaler( 

-

172 ).fit_transform(feature_importances) 

-

173 feature_importances_sum = feature_importances.sum(1) 

-

174 feature_importances_count = (feature_importances != 0).sum(1) 

-

175 feature_importances['sum'] = feature_importances_sum 

-

176 feature_importances['count'] = feature_importances_count 

-

177 feature_importances.sort_values( 

-

178 by=['count', 'sum'], ascending=False, inplace=True) 

-

179 return feature_importances 

-
- - - diff --git a/cov_html/gators_feature_selection_variance_filter_py.html b/cov_html/gators_feature_selection_variance_filter_py.html deleted file mode 100644 index 086deff6..00000000 --- a/cov_html/gators_feature_selection_variance_filter_py.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - Coverage for gators/feature_selection/variance_filter.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..util import util 

-

3from ._base_feature_selection import _BaseFeatureSelection 

-

4from typing import Union 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class VarianceFilter(_BaseFeatureSelection): 

-

10 """Remove low variance columns. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 min_var : float 

-

15 Variance threshold. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 * fit & transform with pandas 

-

20 

-

21 >>> import pandas as pd 

-

22 >>> from gators.feature_selection import VarianceFilter 

-

23 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

24 >>> obj = VarianceFilter(min_var=0.9) 

-

25 >>> obj.fit_transform(X) 

-

26 B 

-

27 0 1.0 

-

28 1 2.0 

-

29 2 3.0 

-

30 

-

31 * fit & transform with koalas 

-

32 

-

33 >>> import databricks.koalas as ks 

-

34 >>> from gators.feature_selection import VarianceFilter 

-

35 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

36 >>> obj = VarianceFilter(min_var=0.9) 

-

37 >>> obj.fit_transform(X) 

-

38 B 

-

39 0 1.0 

-

40 1 2.0 

-

41 2 3.0 

-

42 

-

43 * fit with pandas & transform with numpy 

-

44 

-

45 >>> import pandas as pd 

-

46 >>> from gators.feature_selection import VarianceFilter 

-

47 >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

48 >>> obj = VarianceFilter(min_var=0.9) 

-

49 >>> _ = obj.fit(X) 

-

50 >>> obj.transform_numpy(X.to_numpy()) 

-

51 array([[1.], 

-

52 [2.], 

-

53 [3.]]) 

-

54 

-

55 * fit with koalas & transform with numpy 

-

56 

-

57 >>> import databricks.koalas as ks 

-

58 >>> from gators.feature_selection import VarianceFilter 

-

59 >>> X = ks.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) 

-

60 >>> obj = VarianceFilter(min_var=0.9) 

-

61 >>> _ = obj.fit(X) 

-

62 >>> obj.transform_numpy(X.to_numpy())  

-

63 array([[1.], 

-

64 [2.], 

-

65 [3.]]) 

-

66 

-

67 """ 

-

68 

-

69 def __init__(self, min_var: float): 

-

70 if not isinstance(min_var, float): 

-

71 raise TypeError('`min_var` should be a float.') 

-

72 _BaseFeatureSelection.__init__(self) 

-

73 self.min_var = min_var 

-

74 

-

75 def fit(self, 

-

76 X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y: Union[pd.Series, ks.Series] = None) -> 'VarianceFilter': 

-

78 """Fit the transformer on the dataframe `X`. 

-

79 

-

80 Parameters 

-

81 ---------- 

-

82 X : Union[pd.DataFrame, ks.DataFrame]. 

-

83 Input dataframe. 

-

84 y : None 

-

85 None. 

-

86 

-

87 Returns 

-

88 ------- 

-

89 VarianceFilter: Instance of itself. 

-

90 """ 

-

91 self.check_dataframe(X) 

-

92 numerical_columns = util.get_numerical_columns(X) 

-

93 self.feature_importances_ = X[numerical_columns].var() 

-

94 if isinstance(self.feature_importances_, ks.Series): 

-

95 self.feature_importances_ = self.feature_importances_.to_pandas() 

-

96 mask = self.feature_importances_ < self.min_var 

-

97 self.columns_to_drop = list(self.feature_importances_.index[mask]) 

-

98 self.selected_columns = util.exclude_columns( 

-

99 X.columns, self.columns_to_drop 

-

100 ) 

-

101 self.idx_selected_columns = util.get_idx_columns( 

-

102 X.columns, self.selected_columns) 

-

103 return self 

-
- - - diff --git a/cov_html/gators_imputers__base_imputer_py.html b/cov_html/gators_imputers__base_imputer_py.html deleted file mode 100644 index 6ce7b367..00000000 --- a/cov_html/gators_imputers__base_imputer_py.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - Coverage for gators/imputers/_base_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ..transformers.transformer import Transformer 

-

3from typing import List, Dict, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class _BaseImputer(Transformer): 

-

10 """Base imputer transformer class. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 strategy : str 

-

15 Imputation strategy. The possible values are: 

-

16 * constant 

-

17 * most_frequent (only for the FloatImputer class) 

-

18 * mean (only for the FloatImputer class) 

-

19 * median (only for the FloatImputer class) 

-

20 

-

21 value (Union[float, str, None]): Imputation value, default to None. 

-

22 used for `strategy=constant`. 

-

23 columns: List[str], default to None. 

-

24 List of columns. 

-

25 

-

26 """ 

-

27 

-

28 def __init__(self, strategy: str, 

-

29 value: Union[float, str, None], 

-

30 columns: List[str]): 

-

31 if not isinstance(strategy, str): 

-

32 raise TypeError('`strategy` should be a string.') 

-

33 if strategy == 'constant' and value is None: 

-

34 raise ValueError( 

-

35 'if `strategy` is "constant", `value` should not be None.') 

-

36 if strategy not in ['constant', 'mean', 'median', 'most_frequent']: 

-

37 raise ValueError('Imputation `strategy` not implemented.') 

-

38 if not isinstance(columns, list) and columns is not None: 

-

39 raise TypeError('`columns` should be a list or None.') 

-

40 

-

41 Transformer.__init__(self) 

-

42 self.strategy = strategy 

-

43 self.value = value 

-

44 self.columns = columns 

-

45 self.statistics: Dict = {} 

-

46 self.statistics_values: np.ndarray = None 

-

47 self.idx_columns: np.ndarray = None 

-

48 self.X_dtypes: Union[pd.Series, ks.Series] = None 

-

49 

-

50 def transform( 

-

51 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

52 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

53 """Transform the dataframe `X`. 

-

54 

-

55 Parameters 

-

56 ---------- 

-

57 X : Union[pd.DataFrame, ks.DataFrame]. 

-

58 Input dataframe. 

-

59 

-

60 Returns 

-

61 ------- 

-

62 Union[pd.DataFrame, ks.DataFrame] 

-

63 Transformed dataframe. 

-

64 """ 

-

65 self.check_dataframe(X) 

-

66 # if len(self.idx_columns) == 0: 

-

67 # return X 

-

68 if isinstance(X, pd.DataFrame): 

-

69 return X.fillna(self.statistics) 

-

70 for col, val in self.statistics.items(): 

-

71 X[col] = X[col].fillna(val) 

-

72 return X 

-

73 

-

74 @staticmethod 

-

75 def compute_statistics( 

-

76 X: Union[pd.DataFrame, ks.DataFrame], columns: List[str], 

-

77 strategy: str, 

-

78 value: Union[float, int, str, None] 

-

79 ) -> Dict[str, Union[float, int, str]]: 

-

80 """Compute the imputation values. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 X : Union[pd.DataFrame, ks.DataFrame] 

-

85 Dataframe used to compute the imputation values. 

-

86 columns : List[str] 

-

87 Columns to consider. 

-

88 strategy : str 

-

89 Imputation strategy. 

-

90 value : Union[float, int, str, None] 

-

91 Value used for imputation. 

-

92 

-

93 Returns 

-

94 ------- 

-

95 Dict[str, Union[float, int, str]] 

-

96 Imputation value mapping. 

-

97 """ 

-

98 # if not columns: 

-

99 # return {} 

-

100 if strategy == 'mean': 

-

101 statistics = X[columns].astype(np.float64).mean().to_dict() 

-

102 elif strategy == 'median': 

-

103 statistics = X[columns].astype(np.float64).median().to_dict() 

-

104 elif strategy == 'most_frequent': 

-

105 values = [ 

-

106 X[c].value_counts().index.to_numpy()[0] 

-

107 for c in columns 

-

108 ] 

-

109 statistics = dict(zip(columns, values)) 

-

110 else: # strategy == 'constant' 

-

111 values = len(columns) * [value] 

-

112 statistics = dict(zip(columns, values)) 

-

113 if pd.Series(statistics).isnull().sum(): 

-

114 raise ValueError( 

-

115 '''Some columns contains only NaN values and the 

-

116 imputation values cannot be calculated. 

-

117 Remove these columns 

-

118 before performing the imputation 

-

119 (e.g. with `gators.data_cleaning.drop_high_nan_ratio()`).''') 

-

120 return statistics 

-
- - - diff --git a/cov_html/gators_imputers_float_imputer_py.html b/cov_html/gators_imputers_float_imputer_py.html deleted file mode 100644 index c29e709a..00000000 --- a/cov_html/gators_imputers_float_imputer_py.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - Coverage for gators/imputers/float_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import float_imputer_object 

-

4from imputer import float_imputer 

-

5from ..util import util 

-

6import numpy as np 

-

7from typing import List, Union 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10import warnings 

-

11 

-

12 

-

13class FloatImputer(_BaseImputer): 

-

14 """Impute the numerical columns satisfying the condition X != X.round() 

-

15 using the strategy passed by the user. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 strategy : str 

-

20 Imputation strategy. 

-

21 

-

22 Supported imputation strategies are: 

-

23 

-

24 - 'constant' 

-

25 - 'mean' 

-

26 - 'median' 

-

27 

-

28 value : str, default to None. 

-

29 Imputation value used for `strategy=constant`. 

-

30 

-

31 columns: List[str], default to None. 

-

32 List of columns. 

-

33 

-

34 Examples 

-

35 --------- 

-

36 

-

37 * fit & transform with pandas 

-

38 

-

39 >>> import pandas as pd 

-

40 >>> import numpy as np 

-

41 >>> from gators.imputers import FloatImputer 

-

42 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

43 >>> obj = FloatImputer(strategy='median') 

-

44 >>> obj.fit_transform(X) 

-

45 A B 

-

46 0 0.10 z 

-

47 1 0.20 a 

-

48 2 0.15 a 

-

49 

-

50 * fit & transform with koalas 

-

51 

-

52 >>> import databricks.koalas as ks 

-

53 >>> import numpy as np 

-

54 >>> from gators.imputers import FloatImputer 

-

55 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

56 >>> obj = FloatImputer(strategy='mean') 

-

57 >>> obj.fit_transform(X) 

-

58 A B 

-

59 0 0.10 z 

-

60 1 0.20 a 

-

61 2 0.15 a 

-

62 

-

63 * fit & transform with pandas 

-

64 

-

65 >>> import pandas as pd 

-

66 >>> import numpy as np 

-

67 >>> from gators.imputers import FloatImputer 

-

68 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

69 >>> obj = FloatImputer(strategy='mean') 

-

70 >>> obj.fit(X) 

-

71 obj.transform_numpy(X.to_numpy()) 

-

72 array([[0.1, 'z'], 

-

73 [0.2, 'a'], 

-

74 [0.15000000000000002, 'a']], dtype=object) 

-

75 

-

76 * fit with koalas & transform with numpy 

-

77 

-

78 >>> import databricks.koalas as ks 

-

79 >>> import numpy as np 

-

80 >>> from gators.imputers import FloatImputer 

-

81 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

82 >>> obj = FloatImputer(strategy='mean') 

-

83 >>> obj.fit(X) 

-

84 >>> obj.transform_numpy(X.to_numpy()) 

-

85 array([[0.1, 'z'], 

-

86 [0.2, 'a'], 

-

87 [0.15000000000000002, 'a']], dtype=object) 

-

88 

-

89 See Also 

-

90 -------- 

-

91 gators.imputers.IntImputer 

-

92 Impute integer columns. 

-

93 gators.imputers.NumericsImputer 

-

94 Impute numerical columns. 

-

95 gators.imputers.ObjectImputer 

-

96 Impute categorical columns. 

-

97 

-

98 """ 

-

99 

-

100 def __init__(self, strategy: str, 

-

101 value: float = None, 

-

102 columns: List[str] = None): 

-

103 _BaseImputer.__init__(self, strategy, value, columns) 

-

104 if strategy not in ['constant', 'mean', 'median']: 

-

105 raise ValueError( 

-

106 '''`strategy` should be "constant", ,"mean" 

-

107 or "median" for FloatImputer Transformer.''') 

-

108 if strategy == 'constant' and not isinstance(value, float): 

-

109 raise TypeError( 

-

110 '''`value` should be a float 

-

111 for the FloatImputer class''') 

-

112 

-

113 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

114 y: Union[pd.Series, ks.Series] = None) -> 'FloatImputer': 

-

115 """Fit the transformer on the pandas/koalas dataframe X. 

-

116 

-

117 Parameters 

-

118 ---------- 

-

119 X : Union[pd.DataFrame, ks.DataFrame]. 

-

120 Input dataframe. 

-

121 y : None 

-

122 None. 

-

123 

-

124 Returns 

-

125 ------- 

-

126 'FloatImputer': Instance of itself. 

-

127 """ 

-

128 self.check_dataframe(X) 

-

129 if not self.columns: 

-

130 self.columns = util.get_float_only_columns(X=X) 

-

131 if not self.columns: 

-

132 warnings.warn( 

-

133 '''`X` does not contain columns satisfying: 

-

134 X[column] != X[column].round(), 

-

135 `FloatImputer` is not needed''') 

-

136 self.idx_columns = np.array([]) 

-

137 return self 

-

138 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

139 self.statistics = self.compute_statistics( 

-

140 X=X, 

-

141 columns=self.columns, 

-

142 strategy=self.strategy, 

-

143 value=self.value, 

-

144 ) 

-

145 self.statistics_values = np.array( 

-

146 list(self.statistics.values())) 

-

147 return self 

-

148 

-

149 def transform( 

-

150 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

151 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

152 """Transform the dataframe `X`. 

-

153 

-

154 Parameters 

-

155 ---------- 

-

156 X : Union[pd.DataFrame, ks.DataFrame]. 

-

157 Input dataframe. 

-

158 

-

159 Returns 

-

160 ------- 

-

161 Union[pd.DataFrame, ks.DataFrame] 

-

162 Transformed dataframe. 

-

163 """ 

-

164 self.check_dataframe(X) 

-

165 if isinstance(X, pd.DataFrame): 

-

166 return X.fillna(self.statistics) 

-

167 for col, val in self.statistics.items(): 

-

168 X[col] = X[col].replace({np.nan: val}) 

-

169 return X 

-

170 

-

171 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

172 """Transform the numpy ndarray X. 

-

173 

-

174 Parameters 

-

175 ---------- 

-

176 X (np.ndarray): Input ndarray. 

-

177 

-

178 Returns 

-

179 ------- 

-

180 np.ndarray: 

-

181 Transformed NumPy array. 

-

182 """ 

-

183 self.check_array(X) 

-

184 if self.idx_columns.size == 0: 

-

185 return X 

-

186 if X.dtype == object: 

-

187 return float_imputer_object( 

-

188 X, 

-

189 self.statistics_values.astype(object), 

-

190 self.idx_columns) 

-

191 return float_imputer( 

-

192 X, 

-

193 self.statistics_values, 

-

194 self.idx_columns) 

-
- - - diff --git a/cov_html/gators_imputers_int_imputer_py.html b/cov_html/gators_imputers_int_imputer_py.html deleted file mode 100644 index ff5269c2..00000000 --- a/cov_html/gators_imputers_int_imputer_py.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - Coverage for gators/imputers/int_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import float_imputer_object 

-

4from imputer import float_imputer 

-

5from ..util import util 

-

6from typing import List, Union 

-

7import numpy as np 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10import warnings 

-

11 

-

12 

-

13class IntImputer(_BaseImputer): 

-

14 """Impute the numerical columns satisfying the condition X == X.round() 

-

15 using the strategy passed by the user. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 strategy : str 

-

20 Imputation strategy. 

-

21 

-

22 Supported imputation strategies are: 

-

23 

-

24 - 'constant' 

-

25 - 'most_frequent' 

-

26 - 'mean' 

-

27 - 'median' 

-

28 

-

29 value : str, default to None. 

-

30 Imputation value used for `strategy=constant`. 

-

31 

-

32 columns: List[str], default to None. 

-

33 List of columns. 

-

34 

-

35 Examples 

-

36 --------- 

-

37 

-

38 * fit & transform with pandas 

-

39 

-

40 >>> import pandas as pd 

-

41 >>> import numpy as np 

-

42 >>> from gators.imputers import IntImputer 

-

43 >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

44 >>> obj = IntImputer(strategy='constant', value=-999) 

-

45 >>> obj.fit_transform(X) 

-

46 A B 

-

47 0 1.0 z 

-

48 1 2.0 a 

-

49 2 -999. a 

-

50 

-

51 * fit & transform with koalas 

-

52 

-

53 >>> import databricks.koalas as ks 

-

54 >>> import numpy as np 

-

55 >>> from gators.imputers import IntImputer 

-

56 >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

57 >>> obj = IntImputer(strategy='most_frequent', value=-999) 

-

58 >>> obj.fit_transform(X) 

-

59 A B 

-

60 0 1.0 z 

-

61 1 2.0 a 

-

62 2 -999. a 

-

63 

-

64 * fit with pandas & transform with numpy 

-

65 

-

66 >>> import pandas as pd 

-

67 >>> import numpy as np 

-

68 >>> from gators.imputers import IntImputer 

-

69 >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

70 >>> obj = IntImputer(strategy='most_frequent', value=-999) 

-

71 >>> _ = obj.fit(X) 

-

72 >>> obj.transform_numpy(X.to_numpy()) 

-

73 array([[1.0, 'z'], 

-

74 [2.0, 'a'], 

-

75 [-999., 'a']], dtype=object) 

-

76 

-

77 * fit with koalas & transform with numpy 

-

78 

-

79 >>> import databricks.koalas as ks 

-

80 >>> import numpy as np 

-

81 >>> from gators.imputers import IntImputer 

-

82 >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) 

-

83 >>> obj = IntImputer(strategy='most_frequent', value=-999) 

-

84 >>> _ = obj.fit(X) 

-

85 >>> obj.transform_numpy(X.to_numpy()) 

-

86 array([[1.0, 'z'], 

-

87 [2.0, 'a'], 

-

88 [-999., 'a']], dtype=object) 

-

89 

-

90 See Also 

-

91 -------- 

-

92 gators.imputers.FloatImputer 

-

93 Impute float columns. 

-

94 gators.imputers.NumericsImputer 

-

95 Impute numerical columns. 

-

96 gators.imputers.ObjectImputer 

-

97 Impute categorical columns. 

-

98 

-

99 """ 

-

100 

-

101 def __init__(self, strategy: str, 

-

102 value: float = None, 

-

103 columns: List[str] = None): 

-

104 _BaseImputer.__init__(self, strategy, value, columns) 

-

105 if strategy == 'constant' and not isinstance(value, int): 

-

106 raise TypeError( 

-

107 '''`value` should be a integer 

-

108 for the IntImputer class''') 

-

109 self.columns = columns 

-

110 

-

111 def fit(self, 

-

112 X: Union[pd.DataFrame, ks.DataFrame], 

-

113 y: Union[pd.Series, ks.Series] = None) -> 'IntImputer': 

-

114 """Fit the transformer on the dataframe `X`. 

-

115 

-

116 Parameters 

-

117 ---------- 

-

118 X : Union[pd.DataFrame, ks.DataFrame]. 

-

119 Input dataframe. 

-

120 y : None 

-

121 None. 

-

122 

-

123 Returns 

-

124 ------- 

-

125 Imputer: Instance of itself. 

-

126 """ 

-

127 self.check_dataframe(X) 

-

128 if not self.columns: 

-

129 self.columns = util.get_int_only_columns(X=X) 

-

130 if not self.columns: 

-

131 warnings.warn( 

-

132 '''`X` does not contain columns satisfying: 

-

133 X[column] == X[column].round(), 

-

134 `IntImputer` is not needed''') 

-

135 self.idx_columns = np.array([]) 

-

136 return self 

-

137 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

138 self.statistics = self.compute_statistics( 

-

139 X=X, 

-

140 columns=self.columns, 

-

141 strategy=self.strategy, 

-

142 value=self.value, 

-

143 ) 

-

144 self.statistics_values = np.array( 

-

145 list(self.statistics.values())).astype(np.float64) 

-

146 return self 

-

147 

-

148 def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): 

-

149 """Transform the numpy ndarray X. 

-

150 

-

151 Parameters 

-

152 ---------- 

-

153 X (np.ndarray): Input ndarray. 

-

154 

-

155 Returns 

-

156 ------- 

-

157 np.ndarray: Imputed ndarray. 

-

158 """ 

-

159 self.check_array(X) 

-

160 if self.idx_columns.size == 0: 

-

161 return X 

-

162 X_dtype = X.dtype 

-

163 if 'int' in str(X_dtype): 

-

164 return X 

-

165 elif X_dtype == object: 

-

166 return float_imputer_object( 

-

167 X, 

-

168 self.statistics_values.astype(object), 

-

169 self.idx_columns) 

-

170 else: 

-

171 return float_imputer( 

-

172 X, 

-

173 self.statistics_values, 

-

174 self.idx_columns) 

-
- - - diff --git a/cov_html/gators_imputers_numerics_imputer_py.html b/cov_html/gators_imputers_numerics_imputer_py.html deleted file mode 100644 index 5e26f777..00000000 --- a/cov_html/gators_imputers_numerics_imputer_py.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - Coverage for gators/imputers/numerics_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import float_imputer_object 

-

4from imputer import float_imputer 

-

5from ..util import util 

-

6import numpy as np 

-

7from typing import List, Union 

-

8import pandas as pd 

-

9import databricks.koalas as ks 

-

10import warnings 

-

11 

-

12 

-

13class NumericsImputer(_BaseImputer): 

-

14 """Impute the numerical columns using the strategy passed by the user. 

-

15 

-

16 Parameters 

-

17 ---------- 

-

18 strategy : str 

-

19 Imputation strategy. 

-

20 

-

21 Supported imputation strategies are: 

-

22 

-

23 - 'constant' 

-

24 - 'mean' 

-

25 - 'median' 

-

26 

-

27 value : str, default to None. 

-

28 Imputation value used for `strategy=constant`. 

-

29 

-

30 Examples 

-

31 --------- 

-

32 

-

33 * fit & transform with pandas 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> import numpy as np 

-

37 >>> from gators.imputers import NumericsImputer 

-

38 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

39 >>> obj = NumericsImputer(strategy='median') 

-

40 >>> obj.fit_transform(X) 

-

41 A B 

-

42 0 0.10 z 

-

43 1 0.20 a 

-

44 2 0.15 a 

-

45 

-

46 * fit & transform with koalas 

-

47 

-

48 >>> import databricks.koalas as ks 

-

49 >>> import numpy as np 

-

50 >>> from gators.imputers import NumericsImputer 

-

51 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

52 >>> obj = NumericsImputer(strategy='mean') 

-

53 >>> obj.fit_transform(X) 

-

54 A B 

-

55 0 0.10 z 

-

56 1 0.20 a 

-

57 2 0.15 a 

-

58 

-

59 * fit with pandas & transform with numpy 

-

60 

-

61 >>> import pandas as pd 

-

62 >>> import numpy as np 

-

63 >>> from gators.imputers import NumericsImputer 

-

64 >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

65 >>> obj = NumericsImputer(strategy='mean') 

-

66 >>> obj.fit(X) 

-

67 obj.transform_numpy(X.to_numpy()) 

-

68 array([[0.1, 'z'], 

-

69 [0.2, 'a'], 

-

70 [0.15000000000000002, 'a']], dtype=object) 

-

71 

-

72 * fit with koalas & transform with numpy 

-

73 

-

74 >>> import databricks.koalas as ks 

-

75 >>> import numpy as np 

-

76 >>> from gators.imputers import NumericsImputer 

-

77 >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) 

-

78 >>> obj = NumericsImputer(strategy='mean') 

-

79 >>> obj.fit(X) 

-

80 >>> obj.transform_numpy(X.to_numpy()) 

-

81 array([[0.1, 'z'], 

-

82 [0.2, 'a'], 

-

83 [0.15000000000000002, 'a']], dtype=object) 

-

84 

-

85 See Also 

-

86 -------- 

-

87 gators.imputers.IntImputer 

-

88 Impute integer columns. 

-

89 gators.imputers.FloatImputer 

-

90 Impute float columns. 

-

91 gators.imputers.ObjectImputer 

-

92 Impute categorical columns. 

-

93 

-

94 """ 

-

95 

-

96 def __init__(self, strategy: str, 

-

97 value: float = None, 

-

98 columns: List[str] = None): 

-

99 _BaseImputer.__init__(self, strategy, value, columns) 

-

100 if strategy not in ['constant', 'mean', 'median']: 

-

101 raise ValueError( 

-

102 '''`strategy` should be "constant", ,"mean" 

-

103 or "median" for NumericsImputer Transformer.''') 

-

104 if strategy == 'constant' and not isinstance(value, float): 

-

105 raise TypeError( 

-

106 '''`value` should be a float 

-

107 for the NumericsImputer class''') 

-

108 

-

109 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

110 y: Union[pd.Series, ks.Series] = None) -> 'NumericsImputer': 

-

111 """Fit the transformer on the pandas/koalas dataframe X. 

-

112 

-

113 Parameters 

-

114 ---------- 

-

115 X : Union[pd.DataFrame, ks.DataFrame]. 

-

116 Input dataframe. 

-

117 y : None 

-

118 None. 

-

119 

-

120 Returns 

-

121 ------- 

-

122 'NumericsImputer': Instance of itself. 

-

123 """ 

-

124 self.check_dataframe(X) 

-

125 if not self.columns: 

-

126 self.columns = util.get_datatype_columns(X, float) 

-

127 if not self.columns: 

-

128 warnings.warn( 

-

129 '''`X` does not contain numerical columns, 

-

130 `NumericsImputer` is not needed''') 

-

131 self.idx_columns = np.array([]) 

-

132 return self 

-

133 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

134 self.statistics = self.compute_statistics( 

-

135 X=X, 

-

136 columns=self.columns, 

-

137 strategy=self.strategy, 

-

138 value=self.value, 

-

139 ) 

-

140 self.statistics_values = np.array( 

-

141 list(self.statistics.values())) 

-

142 return self 

-

143 

-

144 def transform( 

-

145 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

146 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

147 """Transform the dataframe `X`. 

-

148 

-

149 Parameters 

-

150 ---------- 

-

151 X : Union[pd.DataFrame, ks.DataFrame]. 

-

152 Input dataframe. 

-

153 

-

154 Returns 

-

155 ------- 

-

156 Union[pd.DataFrame, ks.DataFrame] 

-

157 Transformed dataframe. 

-

158 """ 

-

159 self.check_dataframe(X) 

-

160 if isinstance(X, pd.DataFrame): 

-

161 return X.fillna(self.statistics) 

-

162 for col, val in self.statistics.items(): 

-

163 X[col] = X[col].replace({np.nan: val}) 

-

164 return X 

-

165 

-

166 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

167 """Transform the numpy ndarray X. 

-

168 

-

169 Parameters 

-

170 ---------- 

-

171 X (np.ndarray): Input ndarray. 

-

172 

-

173 Returns 

-

174 ------- 

-

175 np.ndarray: 

-

176 Transformed NumPy array. 

-

177 """ 

-

178 self.check_array(X) 

-

179 if self.idx_columns.size == 0: 

-

180 return X 

-

181 if X.dtype == object: 

-

182 return float_imputer_object( 

-

183 X, 

-

184 self.statistics_values.astype(object), 

-

185 self.idx_columns) 

-

186 return float_imputer( 

-

187 X, 

-

188 self.statistics_values, 

-

189 self.idx_columns) 

-
- - - diff --git a/cov_html/gators_imputers_object_imputer_py.html b/cov_html/gators_imputers_object_imputer_py.html deleted file mode 100644 index 14058b35..00000000 --- a/cov_html/gators_imputers_object_imputer_py.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - Coverage for gators/imputers/object_imputer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from ._base_imputer import _BaseImputer 

-

3from imputer import object_imputer 

-

4from ..util import util 

-

5from typing import Union 

-

6import numpy as np 

-

7import pandas as pd 

-

8import databricks.koalas as ks 

-

9import warnings 

-

10 

-

11 

-

12class ObjectImputer(_BaseImputer): 

-

13 """Impute the categorical columns using the strategy passed by the user. 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 strategy : str 

-

18 Imputation strategy. 

-

19 

-

20 Supported imputation strategies are: 

-

21 

-

22 - 'constant' 

-

23 - 'most_frequent' 

-

24 

-

25 value : str, default to None. 

-

26 Imputation value used for `strategy=constant`. 

-

27 

-

28 Examples 

-

29 --------- 

-

30 

-

31 * fit & transform with pandas 

-

32 

-

33 >>> import pandas as pd 

-

34 >>> import numpy as np 

-

35 >>> from gators.imputers import ObjectImputer 

-

36 >>> X = pd.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

37 >>> obj = ObjectImputer(strategy='most_frequent') 

-

38 >>> obj.fit_transform(X) 

-

39 A B 

-

40 0 a 0.0 

-

41 1 b 1.0 

-

42 2 a 2.0 

-

43 3 a NaN 

-

44 

-

45 * fit & transform with koalas 

-

46 

-

47 >>> import databricks.koalas as ks 

-

48 >>> import numpy as np 

-

49 >>> from gators.imputers import ObjectImputer 

-

50 >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

51 >>> obj = ObjectImputer(strategy='most_frequent') 

-

52 >>> obj.fit_transform(X) 

-

53 A B 

-

54 0 a 0.0 

-

55 1 b 1.0 

-

56 2 a 2.0 

-

57 3 a NaN 

-

58 

-

59 * fit with pandas & transform with numpy 

-

60 

-

61 >>> import pandas as pd 

-

62 >>> import numpy as np 

-

63 >>> from gators.imputers import ObjectImputer 

-

64 >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

65 >>> obj = ObjectImputer(strategy='most_frequent') 

-

66 >>> _ = obj.fit(X) 

-

67 >>> obj.transform_numpy(X.to_numpy()) 

-

68 array([['a', 0.0], 

-

69 ['b', 1.0], 

-

70 ['a', 2.0], 

-

71 ['a', nan]], dtype=object) 

-

72 

-

73 * fit with koalas & transform with numpy 

-

74 

-

75 >>> import databricks.koalas as ks 

-

76 >>> import numpy as np 

-

77 >>> from gators.imputers import ObjectImputer 

-

78 >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) 

-

79 >>> obj = ObjectImputer(strategy='most_frequent') 

-

80 >>> _ = obj.fit(X) 

-

81 >>> obj.transform_numpy(X.to_numpy()) 

-

82 array([['a', 0.0], 

-

83 ['b', 1.0], 

-

84 ['a', 2.0], 

-

85 ['a', nan]], dtype=object) 

-

86 

-

87 See Also 

-

88 -------- 

-

89 gators.imputers.IntImputer 

-

90 Impute integer variables. 

-

91 gators.imputers.FloatImputer 

-

92 Impute float variables. 

-

93 gators.imputers.NumericsImputer 

-

94 Impute numerical variables. 

-

95 

-

96 """ 

-

97 

-

98 def __init__(self, strategy: str, value: str = None, columns=None): 

-

99 _BaseImputer.__init__(self, strategy, value, columns=columns) 

-

100 if strategy not in ['constant', 'most_frequent']: 

-

101 raise ValueError( 

-

102 '''`strategy` should be "constant" or "most_frequent" 

-

103 for the ObjectImputer Transformer.''') 

-

104 if strategy == 'constant' and not isinstance(value, str): 

-

105 raise TypeError( 

-

106 '''`value` should be a string 

-

107 for the ObjectImputer class''') 

-

108 

-

109 def fit(self, 

-

110 X: Union[pd.DataFrame, ks.DataFrame], 

-

111 y: Union[pd.Series, ks.Series] = None) -> 'ObjectImputer': 

-

112 """Fit the transformer on the dataframe `X`. 

-

113 

-

114 Parameters 

-

115 ---------- 

-

116 X : Union[pd.DataFrame, ks.DataFrame]. 

-

117 Input dataframe. 

-

118 y : None 

-

119 None. 

-

120 

-

121 Returns 

-

122 ------- 

-

123 ObjectImputer: Instance of itself. 

-

124 """ 

-

125 self.check_dataframe(X) 

-

126 if not self.columns: 

-

127 self.columns = util.get_datatype_columns(X, object) 

-

128 if not self.columns: 

-

129 warnings.warn( 

-

130 '''`X` does not contain object columns: 

-

131 `ObjectImputer` is not needed''') 

-

132 self.idx_columns = np.array([]) 

-

133 return self 

-

134 self.idx_columns = util.get_idx_columns(X.columns, self.columns) 

-

135 self.idx_columns = np.array( 

-

136 util.get_idx_columns(X, self.columns)) 

-

137 self.statistics = self.compute_statistics( 

-

138 X=X, 

-

139 columns=self.columns, 

-

140 strategy=self.strategy, 

-

141 value=self.value, 

-

142 ) 

-

143 self.statistics_values = np.array( 

-

144 list(self.statistics.values())).astype(object) 

-

145 return self 

-

146 

-

147 def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): 

-

148 """Transform the numpy ndarray X. 

-

149 

-

150 Parameters 

-

151 ---------- 

-

152 X (np.ndarray): Input ndarray. 

-

153 

-

154 Returns 

-

155 ------- 

-

156 np.ndarray: Imputed ndarray. 

-

157 """ 

-

158 self.check_array(X) 

-

159 if self.idx_columns.size == 0: 

-

160 return X 

-

161 return object_imputer( 

-

162 X, 

-

163 self.statistics_values, 

-

164 self.idx_columns) 

-
- - - diff --git a/cov_html/gators_model_building_hyperopt_py.html b/cov_html/gators_model_building_hyperopt_py.html deleted file mode 100644 index bec30cf8..00000000 --- a/cov_html/gators_model_building_hyperopt_py.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - Coverage for gators/model_building/hyperopt.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from hyperopt.pyll.base import Apply 

-

3from hyperopt import Trials 

-

4from hyperopt import fmin 

-

5from sklearn.model_selection import cross_val_score 

-

6from sklearn.model_selection import KFold, StratifiedKFold 

-

7from sklearn.metrics._scorer import _PredictScorer 

-

8from typing import List, Union, Dict, Callable 

-

9import numpy as np 

-

10import pandas as pd 

-

11import databricks.koalas as ks 

-

12 

-

13 

-

14class HyperOpt(): 

-

15 """Hyper parameter optimization using the Hyperopt package. 

-

16 

-

17 Parameters 

-

18 ---------- 

-

19 model : object 

-

20 Machine learning model. 

-

21 algo: Callable 

-

22 `algo` can be: 

-

23 

-

24 * hp.rand.suggest for random search. 

-

25 * hp.tpe.suggest for tree of parzen estimators. 

-

26 * hp.atpe.suggest for adaptative tree of parzen estimators. 

-

27 

-

28 scoring : _PredictScorer 

-

29 Score (or loss) function with signature score_func(y, y_pred). 

-

30 space : Dict[str, Apply] 

-

31 Hyperopt search space. 

-

32 kfold : Union[KFold, StratifiedKFold] 

-

33 sklearn K-Folds cross-validator. 

-

34 max_evals : int 

-

35 Number of evaluations. 

-

36 features: List[str] 

-

37 List of feature names. 

-

38 

-

39 Examples 

-

40 -------- 

-

41 

-

42 >>> import numpy as np 

-

43 >>> import sklearn 

-

44 >>> from hyperopt import tpe 

-

45 >>> from lightgbm import LGBMClassifier 

-

46 >>> from gators.model_building import HyperOpt 

-

47 >>> from sklearn.model_selection import StratifiedKFold 

-

48 >>> X_np = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

49 >>> y_np = np.array([0, 1, 1, 0]) 

-

50 >>> hyper = HyperOpt( 

-

51 ... model=LGBMClassifier(random_state=0), 

-

52 ... algo=tpe.suggest, 

-

53 ... scoring=sklearn.metrics.make_scorer(sklearn.metrics.f1_score), 

-

54 ... space={'max_depth': hp.quniform('max_depth',1, 3, 1)}, 

-

55 ... max_evals=3, 

-

56 ... kfold=StratifiedKFold(n_splits=2), 

-

57 ... features=['x', 'y'], 

-

58 ... ) 

-

59 >>> _ = hyper.fit(X_np, y_np) 

-

60 >>> hyper.model 

-

61 LGBMClassifier(max_depth=2, random_state=0) 

-

62 

-

63 """ 

-

64 

-

65 def __init__(self, model: object, scoring: _PredictScorer, 

-

66 algo: Callable, 

-

67 space: Dict[str, Apply], 

-

68 kfold: Union[KFold, StratifiedKFold], 

-

69 max_evals: int, 

-

70 features: List[str]) -> 'HyperOpt': 

-

71 

-

72 if not hasattr(model, 'fit') or not hasattr(model, 'predict'): 

-

73 raise TypeError( 

-

74 '`model` should have the methods `fit` and `predict`') 

-

75 if not callable(algo): 

-

76 raise TypeError( 

-

77 ''' 

-

78 `algo` should be: 

-

79 hyperopt.rand, hyperopt.tpe, or hyperopt.atpe''') 

-

80 if not isinstance(scoring, (str, _PredictScorer)): 

-

81 raise TypeError( 

-

82 '''`scoring` should be a str or 

-

83 a sklearn.metrics._scorer._PredictScorer''') 

-

84 if not isinstance(space, dict): 

-

85 raise TypeError( 

-

86 '`space` should be a dict') 

-

87 if not isinstance(kfold, (KFold, StratifiedKFold)): 

-

88 raise TypeError( 

-

89 '`scoring` should be a sklearn.metrics._scorer._PredictScorer') 

-

90 if not isinstance(max_evals, int): 

-

91 raise TypeError( 

-

92 '`max_evals` should be an int') 

-

93 if not isinstance(features, list): 

-

94 raise TypeError( 

-

95 '`features` should be a list') 

-

96 self.model = model 

-

97 self.algo = algo 

-

98 self.scoring = scoring 

-

99 self.space = space 

-

100 self.kfold = kfold 

-

101 self.max_evals = max_evals 

-

102 self.history = pd.DataFrame() 

-

103 self.int_parameters: List[str] = self.get_int_parameters(space) 

-

104 self.features = features 

-

105 

-

106 def fit(self, X: np.ndarray, y: np.ndarray) -> 'HyperOpt': 

-

107 """Fit model on X with y. 

-

108 

-

109 Parameters 

-

110 ---------- 

-

111 X : np.ndarray 

-

112 NumPy array. 

-

113 y : np.ndarray 

-

114 Target values. 

-

115 

-

116 Returns 

-

117 ------- 

-

118 HyperOpt 

-

119 Instance of itself. 

-

120 """ 

-

121 if not isinstance(X, np.ndarray): 

-

122 raise TypeError( 

-

123 '''`X` must be a NumPy array.''') 

-

124 if not isinstance(y, np.ndarray): 

-

125 raise TypeError( 

-

126 '''`y` must be a NumPy array.''') 

-

127 

-

128 def fn(params, cv=self.kfold, X=X, y=y): 

-

129 for int_parameter in self.int_parameters: 

-

130 params[int_parameter] = int(params[int_parameter]) 

-

131 self.model.set_params(**params) 

-

132 self.model.fit(X, y) 

-

133 score = cross_val_score( 

-

134 self.model, X, y, cv=cv, 

-

135 scoring=self.scoring, n_jobs=-1).mean() 

-

136 return - score 

-

137 

-

138 trials = Trials() 

-

139 best = fmin( 

-

140 fn=fn, 

-

141 space=self.space, 

-

142 algo=self.algo, 

-

143 max_evals=self.max_evals, 

-

144 trials=trials, 

-

145 rstate=np.random.RandomState(0) 

-

146 ) 

-

147 for int_parameter in self.int_parameters: 

-

148 best[int_parameter] = int(best[int_parameter]) 

-

149 self.history = self.generate_history(trials) 

-

150 self.model.set_params(**best) 

-

151 self.model.fit(X, y) 

-

152 return self 

-

153 

-

154 def get_feature_importances(self) -> pd.Series: 

-

155 """Generate the feature importances from the selected model. 

-

156 

-

157 Returns 

-

158 ------- 

-

159 pd.Series 

-

160 Feature importances. 

-

161 """ 

-

162 feature_importances_ = pd.Series( 

-

163 self.model.feature_importances_, self.features) 

-

164 return feature_importances_.sort_values(ascending=False) 

-

165 

-

166 @staticmethod 

-

167 def generate_history(trials: object) -> pd.DataFrame: 

-

168 """Generate hyperparameter tuning history. 

-

169 

-

170 Parameters 

-

171 ---------- 

-

172 trials : object 

-

173 Hyperopt trial funnction. 

-

174 

-

175 Returns 

-

176 ------- 

-

177 pd.DataFrame 

-

178 Hyperparameter tuning history. 

-

179 """ 

-

180 def f(x) -> ks.Series[np.float32]: 

-

181 return pd.Series({key: val[0] for key, val in x.items()}) 

-

182 

-

183 loss = pd.DataFrame(trials.results) 

-

184 params = pd.DataFrame(trials.miscs)['vals'].apply(f) 

-

185 history = pd.concat([params, loss], axis=1) 

-

186 history['id'] = history.index 

-

187 history.sort_values('loss', ascending=False) 

-

188 return history 

-

189 

-

190 @staticmethod 

-

191 def get_int_parameters(space) -> List[str]: 

-

192 """Get the list of int parameters based on the hyperopt search space. 

-

193 

-

194 Parameters 

-

195 ---------- 

-

196 space : object 

-

197 Hyperopt search space. 

-

198 

-

199 Returns 

-

200 ------- 

-

201 List[str] 

-

202 List of int parameters. 

-

203 """ 

-

204 int_parameters = [] 

-

205 for key in space.keys(): 

-

206 if 'qlog' in str(space[key]) or 'quni' in str(space[key]): 

-

207 int_parameters.append(key) 

-

208 return int_parameters 

-
- - - diff --git a/cov_html/gators_model_building_lgbm_treelite_dumper_py.html b/cov_html/gators_model_building_lgbm_treelite_dumper_py.html deleted file mode 100644 index 2f1d4de3..00000000 --- a/cov_html/gators_model_building_lgbm_treelite_dumper_py.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Coverage for gators/model_building/lgbm_treelite_dumper.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import os 

-

4import treelite 

-

5from lightgbm.sklearn import LGBMClassifier, LGBMRegressor 

-

6 

-

7 

-

8class LGBMTreeliteDumper: 

-

9 """LightGBM Treelite Dumper class. 

-

10 

-

11 Examples 

-

12 -------- 

-

13 

-

14 >>> from lightgbm import LGBMClassifier 

-

15 >>> from gators.model_building import LGBMTreeliteDumper 

-

16 >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

17 >>> y_train = np.array([0, 1, 1, 0]) 

-

18 >>> model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) 

-

19 >>> LGBMTreeliteDumper.dump( 

-

20 ... model=model, 

-

21 ... toolchain='gcc', 

-

22 ... parallel_comp=1, 

-

23 ... model_path='.', 

-

24 ... model_name='dummy' 

-

25 >>> ) 

-

26 [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

27 [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler 

-

28 [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

29 [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... 

-

30 [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... 

-

31 [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... 

-

32 [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... 

-

33 [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... 

-

34 """ 

-

35 

-

36 @staticmethod 

-

37 def dump(model: Union[LGBMClassifier, LGBMRegressor], 

-

38 toolchain: str, 

-

39 parallel_comp: int, 

-

40 model_path: str, model_name: str): 

-

41 """Dump the XGBoost treelite as a .so and a 

-

42 .dylib file. 

-

43 

-

44 Parameters 

-

45 ---------- 

-

46 model: Union[LGBMClassifier, LGBMRegressor]. 

-

47 LightGBM trained model. 

-

48 toolchain: str 

-

49 Compiler. List of available treelite compiler. 

-

50 * gcc 

-

51 * clang 

-

52 * msvc 

-

53 parallel_comp: int 

-

54 Treelite parallel compilation. 

-

55 model_path : str 

-

56 Model path. 

-

57 model_name : str 

-

58 Model name. 

-

59 """ 

-

60 if not isinstance(model, (LGBMClassifier, LGBMRegressor)): 

-

61 raise TypeError( 

-

62 '`model` should be a LGBMClassifier or LGBMRegressor.') 

-

63 if not isinstance(toolchain, str): 

-

64 raise TypeError('`toolchain` should be a str.') 

-

65 if toolchain not in ['gcc', 'clang', 'msvc']: 

-

66 raise ValueError( 

-

67 '`toolchain` should be `gcc`, `clang`, or `msvc`.') 

-

68 if not isinstance(parallel_comp, int): 

-

69 raise TypeError('`parallel_comp` should be an int.') 

-

70 if not isinstance(model_path, str): 

-

71 raise TypeError('`model_path` should be a str.') 

-

72 if not isinstance(model_name, str): 

-

73 raise TypeError('`model_name` should be a str.') 

-

74 file_name = 'dummy_lgbm_model.txt' 

-

75 model.booster_.save_model(file_name) 

-

76 model_ = treelite.Model.load(file_name, model_format='lightgbm') 

-

77 platform_dict = {'gcc': 'unix', 'clang': 'osx', 'msvc': 'windows'} 

-

78 format_dict = {'gcc': '.so', 'clang': '.dylib', 'msvc': '.dll'} 

-

79 model_.export_lib( 

-

80 toolchain=toolchain, 

-

81 libpath=os.path.join( 

-

82 model_path, model_name + format_dict[toolchain]), 

-

83 verbose=False, 

-

84 params={'parallel_comp': parallel_comp}, 

-

85 nthread=1, 

-

86 ) 

-

87 model_.export_srcpkg( 

-

88 platform=platform_dict[toolchain], 

-

89 toolchain=toolchain, 

-

90 params={'parallel_comp': parallel_comp}, 

-

91 pkgpath=os.path.join(model_path, model_name + '.zip'), 

-

92 libname=os.path.join( 

-

93 model_path, model_name + format_dict[toolchain]), 

-

94 verbose=True, 

-

95 ) 

-
- - - diff --git a/cov_html/gators_model_building_train_test_split_py.html b/cov_html/gators_model_building_train_test_split_py.html deleted file mode 100644 index 60954965..00000000 --- a/cov_html/gators_model_building_train_test_split_py.html +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - Coverage for gators/model_building/train_test_split.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers import TransformerXY 

-

2from ..util import util 

-

3from typing import Tuple, Union 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class TrainTestSplit(TransformerXY): 

-

9 """TrainTestSplit class. 

-

10 

-

11 Parameters 

-

12 ---------- 

-

13 test_ratio : float 

-

14 Proportion of the dataset to include in the test split. 

-

15 strategy : str 

-

16 Train/Test split strategy. The possible values are: 

-

17 

-

18 * ordered 

-

19 * random 

-

20 * stratified 

-

21 

-

22 random_state : int 

-

23 Random state. 

-

24 

-

25 Notes 

-

26 ----- 

-

27 Note that the `random` and `stratified` strategies will be give different 

-

28 results for pandas and koalas. 

-

29 

-

30 Examples 

-

31 -------- 

-

32 

-

33 * ordered split 

-

34 

-

35 >>> import pandas as pd 

-

36 >>> from gators.model_building import TrainTestSplit 

-

37 >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

38 >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

39 >>> test_ratio = 0.5 

-

40 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') 

-

41 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

42 >>> X_train 

-

43 X_test 

-

44 y_train 

-

45 y_test A B C 

-

46 0 0 1 2 

-

47 1 3 4 5 

-

48 2 6 7 8 

-

49 3 9 10 11 

-

50 >>> X_test 

-

51 A B C 

-

52 4 12 13 14 

-

53 5 15 16 17 

-

54 6 18 19 20 

-

55 7 21 22 23 

-

56 >>> y_train 

-

57 0 0 

-

58 1 1 

-

59 2 2 

-

60 3 0 

-

61 Name: TARGET, dtype: int64 

-

62 >>> y_test 

-

63 4 1 

-

64 5 2 

-

65 6 0 

-

66 7 1 

-

67 Name: TARGET, dtype: int64 

-

68 

-

69 * random split 

-

70 

-

71 >>> from gators.model_building import TrainTestSplit 

-

72 >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

73 >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

74 >>> test_ratio = 0.5 

-

75 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') 

-

76 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

77 >>> X_train 

-

78 A B C 

-

79 0 0 1 2 

-

80 3 9 10 11 

-

81 4 12 13 14 

-

82 5 15 16 17 

-

83 >>> X_test 

-

84 A B C 

-

85 6 18 19 20 

-

86 2 6 7 8 

-

87 1 3 4 5 

-

88 7 21 22 23 

-

89 >>> y_train 

-

90 0 0 

-

91 3 0 

-

92 4 1 

-

93 5 2 

-

94 Name: TARGET, dtype: int64 

-

95 >>> y_test 

-

96 6 0 

-

97 2 2 

-

98 1 1 

-

99 7 1 

-

100 Name: TARGET, dtype: int64 

-

101 

-

102 * stratified split 

-

103 

-

104 >>> import pandas as pd 

-

105 >>> from gators.model_building import TrainTestSplit 

-

106 >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) 

-

107 >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') 

-

108 >>> test_ratio = 0.5 

-

109 >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') 

-

110 >>> X_train, X_test, y_train, y_test = obj.transform(X, y) 

-

111 >>> X_train 

-

112 A B C 

-

113 0 0 1 2 

-

114 1 3 4 5 

-

115 2 6 7 8 

-

116 >>> X_test 

-

117 A B C 

-

118 6 18 19 20 

-

119 3 9 10 11 

-

120 7 21 22 23 

-

121 4 12 13 14 

-

122 5 15 16 17 

-

123 >>> y_train 

-

124 0 0 

-

125 1 1 

-

126 2 2 

-

127 Name: TARGET, dtype: int64 

-

128 >>> y_test 

-

129 6 0 

-

130 3 0 

-

131 7 1 

-

132 4 1 

-

133 5 2 

-

134 Name: TARGET, dtype: int64 

-

135 

-

136 """ 

-

137 

-

138 def __init__(self, test_ratio: float, strategy: str, 

-

139 random_state: int = 0): 

-

140 if not isinstance(strategy, str): 

-

141 raise TypeError('`strategy` must be a string.') 

-

142 if not isinstance(test_ratio, float): 

-

143 raise TypeError('`test_ratio` must be a float.') 

-

144 if not isinstance(random_state, int): 

-

145 raise TypeError('`random_state` must be an int.') 

-

146 if strategy not in ['ordered', 'random', 'stratified']: 

-

147 raise ValueError('`strategy` not implemented.') 

-

148 self.test_ratio = test_ratio 

-

149 self.random_state = random_state 

-

150 self.strategy = strategy 

-

151 

-

152 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

153 y: Union[pd.Series, ks.Series], 

-

154 ) -> Tuple[ 

-

155 Union[pd.DataFrame, ks.DataFrame], 

-

156 Union[pd.DataFrame, ks.DataFrame], 

-

157 Union[pd.Series, ks.Series], 

-

158 Union[pd.Series, ks.Series]]: 

-

159 """Transform dataframe and series. 

-

160 

-

161 Parameters 

-

162 ---------- 

-

163 X: Union[pd.DataFrame, ks.DataFrame] 

-

164 Dataframe. 

-

165 y: np.ndarray 

-

166 Labels 

-

167 test_ratio: float 

-

168 Ratio of data points used for the test set. 

-

169 

-

170 Returns 

-

171 -------- 

-

172 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame], 

-

173 Union[pd.Series, ks.Series], Union[pd.Series, ks.Series]] 

-

174 Train-Test split. 

-

175 """ 

-

176 self.check_dataframe(X) 

-

177 self.check_y(X, y) 

-

178 if self.strategy == 'ordered': 

-

179 return self.ordered_split(X, y) 

-

180 y_name = y.name 

-

181 x_name = X.index.name 

-

182 if isinstance(X, ks.DataFrame): 

-

183 X['index'] = X.index 

-

184 Xy = X.join(y) 

-

185 

-

186 if self.strategy == 'random': 

-

187 Xy_train, Xy_test = self.random_split(Xy, x_name) 

-

188 else: 

-

189 Xy_train, Xy_test = self.stratified_split(Xy, x_name, y_name) 

-

190 return Xy_train.drop(y_name, axis=1), Xy_test.drop(y_name, axis=1), Xy_train[y_name], Xy_test[y_name] 

-

191 

-

192 def ordered_split(self, 

-

193 X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] 

-

194 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: 

-

195 """Perform random split. 

-

196 

-

197 Parameters 

-

198 ---------- 

-

199 X : Union[pd.DataFrame, ks.DataFrame] 

-

200 Dataframe 

-

201 y : Union[pd.Series, ks.Series] 

-

202 Series 

-

203 Returns 

-

204 ------- 

-

205 Union[pd.DataFrame, ks.DataFrame]: 

-

206 Train set. 

-

207 Union[pd.DataFrame, ks.DataFrame]: 

-

208 Test set. 

-

209 """ 

-

210 n_samples = X.shape[0] 

-

211 n_test = int(self.test_ratio * n_samples) 

-

212 n_train = n_samples - n_test 

-

213 return X.head(n_train), X.tail(n_test), y.head(n_train), y.tail(n_test) 

-

214 

-

215 def random_split(self, 

-

216 Xy: Union[pd.DataFrame, ks.DataFrame], 

-

217 x_name: str 

-

218 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], 

-

219 Union[pd.DataFrame, ks.DataFrame]]: 

-

220 """Perform random split. 

-

221 

-

222 Parameters 

-

223 ---------- 

-

224 Xy : Union[pd.DataFrame, ks.DataFrame] 

-

225 Dataframe. 

-

226 x_name: str 

-

227 Dataframe index name. 

-

228 

-

229 Returns 

-

230 ------- 

-

231 Union[pd.DataFrame, ks.DataFrame]: 

-

232 Train set. 

-

233 Union[pd.DataFrame, ks.DataFrame]: 

-

234 Test set. 

-

235 """ 

-

236 

-

237 if isinstance(Xy, ks.DataFrame): 

-

238 self.test_ratio -= 1e-6 

-

239 Xy_train, Xy_test = Xy.to_spark().randomSplit( 

-

240 [1. - self.test_ratio, self.test_ratio], 

-

241 seed=self.random_state 

-

242 ) 

-

243 Xy_train = Xy_train.to_koalas() 

-

244 Xy_test = Xy_test.to_koalas() 

-

245 Xy_train.set_index('index', drop=True, inplace=True) 

-

246 Xy_train.index.name = x_name 

-

247 Xy_test.set_index('index', drop=True, inplace=True) 

-

248 Xy_test.index.name = x_name 

-

249 else: 

-

250 Xy_test = Xy.sample( 

-

251 frac=self.test_ratio, random_state=self.random_state) 

-

252 Xy_train = Xy.drop(Xy_test.index) 

-

253 return Xy_train, Xy_test 

-

254 

-

255 def stratified_split(self, 

-

256 Xy: Union[pd.DataFrame, ks.DataFrame], 

-

257 x_name: str, y_name: str 

-

258 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: 

-

259 """Perform stratified split. 

-

260 

-

261 Parameters 

-

262 ---------- 

-

263 Xy : Union[pd.DataFrame, ks.DataFrame] 

-

264 Dataframe. 

-

265 x_name: str 

-

266 Dataframe index name. 

-

267 y_name: str 

-

268 Target column name. 

-

269 

-

270 Returns 

-

271 ------- 

-

272 Union[pd.DataFrame, ks.DataFrame]: 

-

273 Train set. 

-

274 Union[pd.DataFrame, ks.DataFrame]: 

-

275 Test set. 

-

276 """ 

-

277 y_values = Xy[y_name].value_counts(normalize=True) 

-

278 Xy_test_list = [] 

-

279 Xy_train_list = [] 

-

280 if isinstance(Xy, ks.DataFrame): 

-

281 self.test_ratio -= 1e-6 

-

282 for label, ratio in y_values.iteritems(): 

-

283 Xy_label = Xy[Xy[y_name] == label] 

-

284 Xy_train_label, Xy_test_label = Xy_label.to_spark( 

-

285 ).randomSplit( 

-

286 [1. - self.test_ratio, self.test_ratio], 

-

287 seed=self.random_state 

-

288 ) 

-

289 Xy_train_label = Xy_train_label.to_koalas() 

-

290 Xy_test_label = Xy_test_label.to_koalas() 

-

291 Xy_train_label.set_index('index', drop=True, inplace=True) 

-

292 Xy_train_label.index.name = x_name 

-

293 Xy_test_label.set_index('index', drop=True, inplace=True) 

-

294 Xy_test_label.index.name = x_name 

-

295 Xy_test_list.append(Xy_test_label) 

-

296 Xy_train_list.append(Xy_train_label) 

-

297 return util.concat(Xy_train_list, axis=0), \ 

-

298 util.concat(Xy_test_list, axis=0) 

-

299 

-

300 for label, ratio in y_values.iteritems(): 

-

301 Xy_label = Xy[Xy[y_name] == label] 

-

302 Xy_label_test = Xy_label.sample( 

-

303 frac=self.test_ratio, 

-

304 random_state=self.random_state) 

-

305 Xy_test_list.append(Xy_label_test) 

-

306 Xy_train_list.append(Xy_label.drop(Xy_label_test.index)) 

-

307 return util.concat(Xy_train_list, axis=0), util.concat(Xy_test_list, axis=0) 

-
- - - diff --git a/cov_html/gators_model_building_xgb_booster_builder_py.html b/cov_html/gators_model_building_xgb_booster_builder_py.html deleted file mode 100644 index bdde9cea..00000000 --- a/cov_html/gators_model_building_xgb_booster_builder_py.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - Coverage for gators/model_building/xgb_booster_builder.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3import numpy as np 

-

4import xgboost 

-

5from xgboost import ( 

-

6 XGBClassifier, 

-

7 XGBRegressor, 

-

8 XGBRFClassifier, 

-

9 XGBRFRegressor 

-

10) 

-

11 

-

12 

-

13class XGBBoosterBuilder: 

-

14 """XGBoost Booster Converter Class. 

-

15 

-

16 Examples 

-

17 -------- 

-

18 >>> import numpy as np 

-

19 >>> import xgboost as xgb 

-

20 >>> from gators.model_building import XGBBoosterBuilder 

-

21 >>> 

-

22 >>> X_np = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

23 >>> y_np = np.array([0, 1, 1, 0]) 

-

24 >>> xgbooster = XGBBoosterBuilder.train( 

-

25 ... model=xgb.XGBClassifier().fit(X_np, y_np), 

-

26 ... X_train=X_np, 

-

27 ... y_train=y_np, 

-

28 ... ) 

-

29 xgbooster.predict(xgb.DMatrix(X_np)) 

-

30 >>> xgbooster.predict(xgb.DMatrix(X_np)) 

-

31 array([0.5, 0.5, 0.5, 0.5], dtype=float32) 

-

32 

-

33 """ 

-

34 

-

35 @staticmethod 

-

36 def train( 

-

37 model: Union[ 

-

38 XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor], 

-

39 X_train: np.array, 

-

40 y_train: np.ndarray, 

-

41 num_class=None): 

-

42 """Convert the XGBoost model to a XGB Booster model. 

-

43 

-

44 Parameters 

-

45 ---------- 

-

46 model : Union[XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor] 

-

47 Trained xgboost.sklearn model. 

-

48 X_train : np.ndarray 

-

49 Train array. 

-

50 y_train : np.ndarray 

-

51 Labels. 

-

52 

-

53 Returns 

-

54 ------- 

-

55 xgboost.Booster 

-

56 Trained xgboost Booster model. 

-

57 """ 

-

58 if not isinstance(model, (XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor)): 

-

59 raise TypeError( 

-

60 '`model` should be a `xgboost.sklearn` model.') 

-

61 if not isinstance(X_train, np.ndarray): 

-

62 raise TypeError('`X_train` should be a NumPy array.') 

-

63 if not isinstance(y_train, np.ndarray): 

-

64 raise TypeError('`y_train` should be a NumPy array.') 

-

65 if num_class is not None and not isinstance(num_class, int): 

-

66 raise TypeError('`num_class` should be an int.') 

-

67 params = model.get_xgb_params() 

-

68 if num_class: 

-

69 params['num_class'] = num_class 

-

70 n_estimators = model.n_estimators 

-

71 dtrain = xgboost.DMatrix(X_train, label=y_train) 

-

72 return xgboost.train(params, dtrain, n_estimators) 

-
- - - diff --git a/cov_html/gators_model_building_xgb_treelite_dumper_py.html b/cov_html/gators_model_building_xgb_treelite_dumper_py.html deleted file mode 100644 index 8a139972..00000000 --- a/cov_html/gators_model_building_xgb_treelite_dumper_py.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - Coverage for gators/model_building/xgb_treelite_dumper.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2import os 

-

3import numpy as np 

-

4import xgboost 

-

5from xgboost.sklearn import XGBClassifier 

-

6import treelite 

-

7 

-

8 

-

9class XGBTreeliteDumper: 

-

10 """XGBoost Treelite Dumper class. 

-

11 

-

12 Examples 

-

13 -------- 

-

14 

-

15 >>> import xgboost as xgb 

-

16 >>> from gators.model_building import XGBTreeliteDumper 

-

17 >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

-

18 >>> y_train = np.array([0, 1, 1, 0]) 

-

19 >>> dtrain = xgb.DMatrix(X_train, label=y_train) 

-

20 >>> model = xgb.train({'max_depth': 1}, dtrain, num_boost_round=1) 

-

21 >>> XGBTreeliteDumper.dump( 

-

22 ... model=model, 

-

23 ... toolchain='gcc', 

-

24 ... parallel_comp=1, 

-

25 ... model_path='.', 

-

26 ... model_name='dummy' 

-

27 >>> ) 

-

28 [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

29 [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler 

-

30 [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. 

-

31 [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... 

-

32 [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... 

-

33 [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... 

-

34 [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... 

-

35 [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... 

-

36 """ 

-

37 

-

38 @staticmethod 

-

39 def dump(model: xgboost.core.Booster, toolchain: str, 

-

40 parallel_comp: int, 

-

41 model_path: str, model_name: str): 

-

42 """Dump the XGBoost treelite as a .so and a 

-

43 .dylib file. 

-

44 

-

45 Parameters 

-

46 ---------- 

-

47 model: xgboost.core.Booster. 

-

48 Trained model. 

-

49 toolchain: str 

-

50 Compiler. List of available treelite compiler. 

-

51 * gcc 

-

52 * clang 

-

53 * msvc 

-

54 parallel_comp: int 

-

55 Treelite parallel compilation. 

-

56 model_path : str 

-

57 Model path. 

-

58 model_name : str 

-

59 Model name. 

-

60 """ 

-

61 if not isinstance(model, xgboost.core.Booster): 

-

62 raise TypeError('`model` should be an xgboost.core.Booster.') 

-

63 if not isinstance(toolchain, str): 

-

64 raise TypeError('`toolchain` should be a str.') 

-

65 if toolchain not in ['gcc', 'clang', 'msvc']: 

-

66 raise ValueError( 

-

67 '`toolchain` should be `gcc`, `clang`, or `msvc`.') 

-

68 if not isinstance(parallel_comp, int): 

-

69 raise TypeError('`parallel_comp` should be an int.') 

-

70 if not isinstance(model_path, str): 

-

71 raise TypeError('`model_path` should be a str.') 

-

72 if not isinstance(model_name, str): 

-

73 raise TypeError('`model_name` should be a str.') 

-

74 model_ = treelite.Model.from_xgboost(model) 

-

75 platform_dict = {'gcc': 'unix', 'clang': 'osx', 'msvc': 'windows'} 

-

76 format_dict = {'gcc': '.so', 'clang': '.dylib', 'msvc': '.dll'} 

-

77 model_.export_lib( 

-

78 toolchain=toolchain, 

-

79 libpath=os.path.join( 

-

80 model_path, model_name + format_dict[toolchain]), 

-

81 verbose=False, 

-

82 params={'parallel_comp': parallel_comp}, 

-

83 nthread=1, 

-

84 ) 

-

85 model_.export_srcpkg( 

-

86 platform=platform_dict[toolchain], 

-

87 toolchain=toolchain, 

-

88 params={'parallel_comp': parallel_comp}, 

-

89 pkgpath=os.path.join(model_path, model_name + '.zip'), 

-

90 libname=os.path.join( 

-

91 model_path, model_name + format_dict[toolchain]), 

-

92 verbose=True, 

-

93 ) 

-
- - - diff --git a/cov_html/gators_pipeline_pipeline_py.html b/cov_html/gators_pipeline_pipeline_py.html deleted file mode 100644 index 3f057837..00000000 --- a/cov_html/gators_pipeline_pipeline_py.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - Coverage for gators/pipeline/pipeline.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3import numpy as np 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6from ..transformers.transformer import Transformer 

-

7from ..util import util 

-

8 

-

9 

-

10class Pipeline(Transformer): 

-

11 """Chain the **gators** transformers together. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 steps : List[Transformer] 

-

16 List of transformations. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> import numpy as np 

-

25 >>> from gators.imputers import IntImputer 

-

26 >>> from gators.imputers import FloatImputer 

-

27 >>> from gators.imputers import ObjectImputer 

-

28 >>> from gators.pipeline import Pipeline 

-

29 >>> X = pd.DataFrame( 

-

30 ... {'A': [0.1, 0.2, 0.3, np.nan], 

-

31 ... {'B': [1, 2, 2, np.nan], 

-

32 ... {'C': ['a', 'b', 'c', np.nan]}) 

-

33 >>> steps = [ 

-

34 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

35 ... FloatImputer(strategy='median'), 

-

36 ... IntImputer(strategy='most_frequent'), 

-

37 ... ] 

-

38 >>> obj = Pipeline(steps=steps) 

-

39 >>> obj.fit_transform(X) 

-

40 A B C 

-

41 0 0.1 1.0 a 

-

42 1 0.2 2.0 b 

-

43 2 0.3 2.0 c 

-

44 3 0.2 2.0 MISSING 

-

45 

-

46 * fit & transform with koalas 

-

47 

-

48 >>> import databricks.koalas as ks 

-

49 >>> import numpy as np 

-

50 >>> from gators.imputers import IntImputer 

-

51 >>> from gators.imputers import FloatImputer 

-

52 >>> from gators.imputers import ObjectImputer 

-

53 >>> from gators.pipeline import Pipeline 

-

54 >>> X = ks.DataFrame( 

-

55 ... {'A': [0.1, 0.2, 0.3, np.nan], 

-

56 ... {'B': [1, 2, 2, np.nan], 

-

57 ... {'C': ['a', 'b', 'c', np.nan]}) 

-

58 steps = [ 

-

59 ObjectImputer(strategy='constant', value='MISSING'), 

-

60 FloatImputer(strategy='median'), 

-

61 IntImputer(strategy='most_frequent'), 

-

62 ] 

-

63 obj = Pipeline(steps=steps) 

-

64 obj.fit_transform(X) 

-

65 >>> steps = [ 

-

66 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

67 ... FloatImputer(strategy='median'), 

-

68 ... IntImputer(strategy='most_frequent'), 

-

69 ... ] 

-

70 >>> obj = Pipeline(steps=steps) 

-

71 >>> obj.fit_transform(X) 

-

72 A B C 

-

73 0 0.1 1.0 a 

-

74 1 0.2 2.0 b 

-

75 2 0.3 2.0 c 

-

76 3 0.2 2.0 MISSING 

-

77 

-

78 * fit with pandas & transform with numpy 

-

79 

-

80 >>> import pandas as pd 

-

81 >>> import numpy as np 

-

82 >>> from gators.imputers import IntImputer 

-

83 >>> from gators.imputers import FloatImputer 

-

84 >>> from gators.imputers import ObjectImputer 

-

85 >>> from gators.pipeline import Pipeline 

-

86 >>> X = pd.DataFrame( 

-

87 ... {'A': [0.1, 0.2, 0.3, np.nan], 

-

88 ... {'B': [1, 2, 2, np.nan], 

-

89 ... {'C': ['a', 'b', 'c', np.nan]}) 

-

90 >>> steps = [ 

-

91 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

92 ... FloatImputer(strategy='median'), 

-

93 ... IntImputer(strategy='most_frequent'), 

-

94 ... ] 

-

95 >>> obj = Pipeline(steps=steps) 

-

96 >>> _ = obj.fit(X) 

-

97 obj.transform_numpy(X.to_numpy()) 

-

98 >>> obj.transform_numpy(X.to_numpy()) 

-

99 array([[0.1, 1.0, 'a'], 

-

100 [0.2, 2.0, 'b'], 

-

101 [0.3, 2.0, 'c'], 

-

102 [0.2, 2.0, 'MISSING']], dtype=object) 

-

103 

-

104 * fit with koalas & transform with numpy 

-

105 

-

106 >>> import databricks.koalas as ks 

-

107 >>> import numpy as np 

-

108 >>> from gators.imputers import IntImputer 

-

109 >>> from gators.imputers import FloatImputer 

-

110 >>> from gators.imputers import ObjectImputer 

-

111 >>> from gators.pipeline import Pipeline 

-

112 >>> X = ks.DataFrame( 

-

113 ... {'A': [0.1, 0.2, 0.3, np.nan], 

-

114 ... {'B': [1, 2, 2, np.nan], 

-

115 ... {'C': ['a', 'b', 'c', np.nan]}) 

-

116 steps = [ 

-

117 ObjectImputer(strategy='constant', value='MISSING'), 

-

118 FloatImputer(strategy='median'), 

-

119 IntImputer(strategy='most_frequent'), 

-

120 ] 

-

121 obj = Pipeline(steps=steps) 

-

122 _ = obj.fit(X) 

-

123 obj.transform_numpy(X.to_numpy()) 

-

124 >>> steps = [ 

-

125 ... ObjectImputer(strategy='constant', value='MISSING'), 

-

126 ... FloatImputer(strategy='median'), 

-

127 ... IntImputer(strategy='most_frequent'), 

-

128 ... ] 

-

129 >>> obj = Pipeline(steps=steps) 

-

130 >>> _ = obj.fit(X) 

-

131 obj.transform_numpy(X.to_numpy()) 

-

132 

-

133 >>> obj.transform_numpy(X.to_numpy()) 

-

134 array([[0.1, 1.0, 'a'], 

-

135 [0.2, 2.0, 'b'], 

-

136 [0.3, 2.0, 'c'], 

-

137 [0.2, 2.0, 'MISSING']], dtype=object) 

-

138 

-

139 

-

140 """ 

-

141 

-

142 def __init__(self, steps: List[Transformer]): 

-

143 if not isinstance(steps, list): 

-

144 raise TypeError('`steps` should be a list.') 

-

145 if not steps: 

-

146 raise TypeError('`steps` should be an empty list.') 

-

147 self.steps = steps 

-

148 self.is_model = hasattr(self.steps[-1], 'predict') 

-

149 self.n_steps = len(self.steps) 

-

150 self.n_transformations = self.n_steps - 1 if self.is_model else self.n_steps 

-

151 

-

152 def fit(self, 

-

153 X: Union[pd.DataFrame, ks.DataFrame], 

-

154 y: Union[pd.Series, ks.Series] = None) -> 'Pipeline': 

-

155 """Fit the transformer on the dataframe `X`. 

-

156 

-

157 Parameters 

-

158 ---------- 

-

159 X : Union[pd.DataFrame, ks.DataFrame]. 

-

160 Input dataframe. 

-

161 y : None 

-

162 None. 

-

163 

-

164 Returns 

-

165 ------- 

-

166 Pipeline 

-

167 Instance of itself. 

-

168 """ 

-

169 self.base_columns = list(X.columns) 

-

170 for step in self.steps[:self.n_transformations]: 

-

171 step = step.fit(X, y) 

-

172 X = step.transform(X) 

-

173 if self.is_model: 

-

174 _ = self.steps[-1].fit(X, y) 

-

175 return self 

-

176 

-

177 def transform( 

-

178 self, X: Union[pd.DataFrame, ks.DataFrame] 

-

179 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

180 """Transform the dataframe `X`. 

-

181 

-

182 Parameters 

-

183 ---------- 

-

184 X : Union[pd.DataFrame, ks.DataFrame]. 

-

185 Input dataframe. 

-

186 

-

187 Returns 

-

188 ------- 

-

189 Union[pd.DataFrame, ks.DataFrame] 

-

190 Transformed dataframe. 

-

191 """ 

-

192 self.check_dataframe(X) 

-

193 for step in self.steps[:self.n_transformations]: 

-

194 X = step.transform(X) 

-

195 return X 

-

196 

-

197 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

198 """Transform the NumPy array `X`. 

-

199 

-

200 Parameters 

-

201 ---------- 

-

202 X : np.ndarray 

-

203 Input array. 

-

204 

-

205 Returns 

-

206 ------- 

-

207 np.ndarray 

-

208 Transformed array. 

-

209 """ 

-

210 self.check_array(X) 

-

211 for step in self.steps[:self.n_transformations]: 

-

212 X = step.transform_numpy(X) 

-

213 return X 

-

214 

-

215 def fit_transform(self, 

-

216 X: Union[pd.DataFrame, ks.DataFrame], 

-

217 y: Union[pd.Series, ks.Series] = None 

-

218 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

219 """Fit and transform the pandas dataframe. 

-

220 

-

221 Parameters 

-

222 ---------- 

-

223 X : Union[pd.DataFrame, ks.DataFrame] 

-

224 Input dataframe. 

-

225 

-

226 Returns 

-

227 ------- 

-

228 Union[pd.DataFrame, ks.DataFrame] 

-

229 Transformed pandas dataframe. 

-

230 """ 

-

231 self.base_columns = list(X.columns).copy() 

-

232 # import time 

-

233 for step in self.steps[:self.n_transformations]: 

-

234 step = step.fit(X, y) 

-

235 X = step.transform(X) 

-

236 return X 

-

237 

-

238 def predict(self, 

-

239 X: Union[pd.DataFrame, ks.DataFrame], 

-

240 y: Union[pd.Series, ks.Series] = None) -> np.ndarray: 

-

241 """Predict on X, and predict. 

-

242 

-

243 Parameters 

-

244 ---------- 

-

245 X : Union[pd.DataFrame, ks.DataFrame]. 

-

246 Input dataframe. 

-

247 

-

248 Returns 

-

249 ------- 

-

250 np.ndarray 

-

251 Model predictions. 

-

252 """ 

-

253 for step in self.steps[:-1]: 

-

254 X = step.transform(X) 

-

255 return self.steps[-1].predict(X) 

-

256 

-

257 def predict_proba(self, 

-

258 X: Union[pd.DataFrame, ks.DataFrame], 

-

259 y: np.array = None) -> np.ndarray: 

-

260 """Predict on X, and return the probability of success. 

-

261 

-

262 Parameters 

-

263 ---------- 

-

264 X : Union[pd.DataFrame, ks.DataFrame]. 

-

265 Input dataframe. 

-

266 

-

267 Returns 

-

268 ------- 

-

269 np.ndarray 

-

270 Model probabilities of success. 

-

271 """ 

-

272 for step in self.steps[:-1]: 

-

273 X = step.transform(X) 

-

274 return self.steps[-1].predict_proba(X) 

-

275 

-

276 def predict_numpy(self, 

-

277 X: np.ndarray, 

-

278 y: Union[pd.Series, ks.Series] = None 

-

279 ) -> np.ndarray: 

-

280 """Predict on X, and predict. 

-

281 

-

282 Parameters 

-

283 ---------- 

-

284 X : Union[pd.DataFrame, ks.DataFrame]. 

-

285 Input dataframe. 

-

286 

-

287 Returns 

-

288 ------- 

-

289 np.ndarray 

-

290 Model predictions. 

-

291 """ 

-

292 for step in self.steps[:-1]: 

-

293 X = step.transform_numpy(X) 

-

294 return self.steps[-1].predict(X) 

-

295 

-

296 def predict_proba_numpy(self, 

-

297 X: np.ndarray) -> np.ndarray: 

-

298 """Predict on X, and return the probability of success. 

-

299 

-

300 Parameters 

-

301 ---------- 

-

302 X : np.ndarray 

-

303 Input array. 

-

304 

-

305 Returns 

-

306 ------- 

-

307 np.ndarray 

-

308 Model probabilities of success. 

-

309 """ 

-

310 for step in self.steps[:-1]: 

-

311 X = step.transform_numpy(X) 

-

312 return self.steps[-1].predict_proba(X) 

-

313 

-

314 def get_feature_importances(self, k: int) -> pd.Series: 

-

315 """Get the feature importances of the pipeline. 

-

316 

-

317 Parameters 

-

318 ---------- 

-

319 k int 

-

320 Number of top features to return. 

-

321 

-

322 Returns 

-

323 ------- 

-

324 pd.Series 

-

325 Feature importances. 

-

326 """ 

-

327 if not hasattr(self.steps[-1], 'feature_importances_'): 

-

328 raise AttributeError( 

-

329 '''The last step of the pipeline should have 

-

330 the attribute `feature_importances_`''') 

-

331 feature_importances_ = self.steps[-1].feature_importances_ 

-

332 return feature_importances_.sort_values(ascending=False).iloc[:k] 

-

333 

-

334 def get_features(self) -> List[str]: 

-

335 """Get the feature importances of the pipeline. 

-

336 

-

337 Parameters 

-

338 ---------- 

-

339 k int 

-

340 Number of top features to return. 

-

341 

-

342 Returns 

-

343 ------- 

-

344 List[str] 

-

345 List of features. 

-

346 """ 

-

347 if not hasattr(self.steps[-1], 'selected_columns'): 

-

348 raise AttributeError( 

-

349 '''The last step of the pipeline should have 

-

350 the attribute `selected_columns`''') 

-

351 return self.steps[-1].selected_columns 

-

352 

-

353 def get_production_columns(self): 

-

354 has_feature_importances_ = hasattr( 

-

355 self.steps[-1], 'feature_importances_') 

-

356 if not has_feature_importances_: 

-

357 raise AttributeError( 

-

358 '''The last step of the pipeline should contains 

-

359 the atrribute `feature_importances_`''') 

-

360 features = self.steps[-1].selected_columns 

-

361 

-

362 base_columns_ = features.copy() 

-

363 for step in self.steps[::-1]: 

-

364 if not hasattr(step, 'column_names'): 

-

365 continue 

-

366 for i, col in enumerate(base_columns_): 

-

367 if col in step.column_mapping: 

-

368 base_columns_[i] = step.column_mapping[col] 

-

369 base_columns_ = list(set(util.flatten_list(base_columns_))) 

-

370 base_columns_ = list(set(base_columns_)) 

-

371 prod_columns = [ 

-

372 c for c in self.base_columns 

-

373 if c in base_columns_] 

-

374 return prod_columns 

-
- - - diff --git a/cov_html/gators_sampling_supervised_sampling_py.html b/cov_html/gators_sampling_supervised_sampling_py.html deleted file mode 100644 index ee16b464..00000000 --- a/cov_html/gators_sampling_supervised_sampling_py.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - Coverage for gators/sampling/supervised_sampling.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1from ..transformers import TransformerXY 

-

2from ..util import util 

-

3from typing import Tuple, Union 

-

4import pandas as pd 

-

5import databricks.koalas as ks 

-

6 

-

7 

-

8class SupervisedSampling(TransformerXY): 

-

9 """Sample each class depending on its occurrence. 

-

10 

-

11 For example, in a stronly imbalanced binary classification problem, 

-

12 only the majority is undersampled. 

-

13 

-

14 Parameters 

-

15 ---------- 

-

16 n_samples : int 

-

17 Number of samples to keep 

-

18 

-

19 Examples 

-

20 -------- 

-

21 * pandas transform 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.sampling import SupervisedSampling 

-

25 >>> X = pd.DataFrame({ 

-

26 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

27 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

28 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

29 >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

30 >>> obj = SupervisedSampling(n_samples=3) 

-

31 >>> X, y = obj.transform(X, y) 

-

32 >>> X 

-

33 A B C 

-

34 1 3 4 5 

-

35 3 9 10 11 

-

36 4 12 13 14 

-

37 5 15 16 17 

-

38 >>> y 

-

39 1 0 

-

40 3 1 

-

41 4 2 

-

42 5 3 

-

43 Name: TARGET, dtype: int64 

-

44 

-

45 * koalas transform 

-

46 

-

47 >>> import pandas as ks 

-

48 >>> from gators.sampling import SupervisedSampling 

-

49 >>> X = ks.DataFrame({ 

-

50 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

51 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

52 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

53 >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

54 >>> obj = SupervisedSampling(n_samples=3) 

-

55 >>> X, y = obj.transform(X, y) 

-

56 >>> X 

-

57 A B C 

-

58 1 3 4 5 

-

59 3 9 10 11 

-

60 4 12 13 14 

-

61 5 15 16 17 

-

62 >>> y 

-

63 1 0 

-

64 3 1 

-

65 4 2 

-

66 5 3 

-

67 Name: TARGET, dtype: int64 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, n_samples: int): 

-

72 if not isinstance(n_samples, int): 

-

73 raise TypeError('`n_samples` should be an int.') 

-

74 self.n_samples = n_samples 

-

75 self.frac_vec = pd.Series([]) 

-

76 

-

77 def transform(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

78 y: Union[pd.Series, ks.Series] 

-

79 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], 

-

80 Union[pd.Series, ks.Series]]: 

-

81 """Fit and transform the dataframe `X` and the series `y`. 

-

82 

-

83 Parameters 

-

84 ---------- 

-

85 X : Union[pd.DataFrame, ks.DataFrame] 

-

86 Input dataframe. 

-

87 y : Union[pd.Series, ks.Series] 

-

88 Input target. 

-

89 

-

90 Returns 

-

91 ------- 

-

92 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: 

-

93 Transformed dataframe and the series. 

-

94 """ 

-

95 self.check_dataframe(X) 

-

96 self.check_y(X, y) 

-

97 y_name = y.name 

-

98 self.frac_vec = self.compute_sampling_fractions(y, self.n_samples) 

-

99 Xy = X.join(y) 

-

100 Xy_sampled = self.sample_dataframe( 

-

101 Xy=Xy, 

-

102 frac_vec=self.frac_vec, 

-

103 y_name=y_name 

-

104 ) 

-

105 return Xy_sampled.drop(y_name, axis=1), Xy_sampled[y_name] 

-

106 

-

107 @staticmethod 

-

108 def compute_sampling_fractions(y: Union[pd.Series, ks.Series], 

-

109 n_samples: int) -> pd.Series: 

-

110 """Compute the sampling fractions. 

-

111 

-

112 Parameters 

-

113 ---------- 

-

114 y : Union[pd.Series, ks.Series] 

-

115 Target values. 

-

116 n_samples : int 

-

117 Number of samples to keep. 

-

118 

-

119 Returns 

-

120 ------- 

-

121 pd.Series 

-

122 Fraction to keep for each label. 

-

123 """ 

-

124 class_count = y.value_counts() 

-

125 n_classes = len(class_count) 

-

126 n_samples_per_class = int(n_samples / n_classes) 

-

127 mask = class_count > n_samples_per_class 

-

128 n_classes_ = mask.sum() 

-

129 n_samples_ = n_samples - class_count[~ mask].sum() 

-

130 frac_vec = n_samples_ / (class_count * n_classes_) 

-

131 if isinstance(frac_vec, ks.Series): 

-

132 frac_vec = frac_vec.to_pandas() 

-

133 frac_vec[frac_vec > 1] = 1. 

-

134 frac_vec = frac_vec.mask(frac_vec < 1./n_samples, 1./n_samples) 

-

135 return frac_vec 

-

136 

-

137 @staticmethod 

-

138 def sample_dataframe(Xy: Union[pd.DataFrame, ks.DataFrame], 

-

139 frac_vec: pd.Series, y_name: str 

-

140 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

141 """Sample dataframe. 

-

142 

-

143 Parameters 

-

144 ---------- 

-

145 Xy : Union[pd.DataFrame, ks.DataFrame] 

-

146 Dataframe. 

-

147 frac_vec : pd.Series 

-

148 Fraction to keep for each label. 

-

149 y_name : str 

-

150 Target name. 

-

151 

-

152 Returns 

-

153 ------- 

-

154 Union[pd.DataFrame, ks.DataFrame] 

-

155 Transformed dataframe. 

-

156 """ 

-

157 if isinstance(Xy, pd.DataFrame): 

-

158 Xy_sampled = pd.DataFrame(columns=Xy.columns) 

-

159 else: 

-

160 Xy_sampled = ks.DataFrame(columns=Xy.columns) 

-

161 for c, frac in frac_vec.iteritems(): 

-

162 if frac == 1: 

-

163 Xy_sampled = util.concat( 

-

164 [Xy_sampled, Xy[Xy[y_name] == int(c)]], axis=0) 

-

165 else: 

-

166 Xy_sampled = util.concat( 

-

167 [Xy_sampled, 

-

168 Xy[Xy[y_name] == int(c)].sample( 

-

169 frac=frac, random_state=0)], 

-

170 axis=0 

-

171 ) 

-

172 return Xy_sampled.astype(Xy.dtypes.to_dict()) 

-
- - - diff --git a/cov_html/gators_sampling_unsupervised_sampling_py.html b/cov_html/gators_sampling_unsupervised_sampling_py.html deleted file mode 100644 index 86423486..00000000 --- a/cov_html/gators_sampling_unsupervised_sampling_py.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - Coverage for gators/sampling/unsupervised_sampling.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1 

-

2from ..transformers import TransformerXY 

-

3from typing import Tuple, Dict, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class UnsupervisedSampling(TransformerXY): 

-

10 """Randomly sample the data and target. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 n_samples : int 

-

15 Number of samples to keep. 

-

16 

-

17 Examples 

-

18 -------- 

-

19 

-

20 * pandas transform 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> from gators.sampling import UnsupervisedSampling 

-

24 >>> X = pd.DataFrame({ 

-

25 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

26 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

27 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

28 >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

29 >>> obj = UnsupervisedSampling(n_samples=3) 

-

30 >>> X, y = obj.transform(X, y) 

-

31 >>> X = pd.DataFrame({ 

-

32 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

33 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

34 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

35 >>> X 

-

36 A B C 

-

37 5 15 16 17 

-

38 2 6 7 8 

-

39 1 3 4 5 

-

40 >>> y 

-

41 5 3 

-

42 2 1 

-

43 1 0 

-

44 Name: TARGET, dtype: int64 

-

45 

-

46 * koalas transform 

-

47 

-

48 >>> import databricks.koalas as ks 

-

49 >>> from gators.sampling import UnsupervisedSampling 

-

50 >>> X = ks.DataFrame({ 

-

51 ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, 

-

52 ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, 

-

53 ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) 

-

54 >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') 

-

55 >>> obj = UnsupervisedSampling(n_samples=3) 

-

56 >>> X, y = obj.transform(X, y) 

-

57 >>> X 

-

58 A B C 

-

59 0 0 1 2 

-

60 3 9 10 11 

-

61 2 6 7 8 

-

62 >>> y 

-

63 0 0 

-

64 3 1 

-

65 2 1 

-

66 Name: TARGET, dtype: int64 

-

67 

-

68 """ 

-

69 

-

70 def __init__(self, n_samples: int): 

-

71 if not isinstance(n_samples, int): 

-

72 raise TypeError('`n_samples` should be an int.') 

-

73 self.n_samples = n_samples 

-

74 

-

75 def transform(self, 

-

76 X: Union[pd.DataFrame, ks.DataFrame], 

-

77 y: Union[pd.Series, ks.Series], 

-

78 ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: 

-

79 """Fit and transform the dataframe `X` and the series `y`. 

-

80 

-

81 Parameters: 

-

82 X : Union[pd.DataFrame, ks.DataFrame] 

-

83 Input dataframe. 

-

84 y : Union[pd.Series, ks.Series] 

-

85 Input target. 

-

86 

-

87 Returns 

-

88 ------- 

-

89 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: 

-

90 Transformed dataframe and the series. 

-

91 """ 

-

92 self.check_dataframe(X) 

-

93 self.check_y(X, y) 

-

94 frac = self.n_samples / X.shape[0] 

-

95 if frac >= 1.: 

-

96 return X, y 

-

97 y_name = y.name 

-

98 Xy = X.join(y).sample(frac=round(frac, 3), random_state=0) 

-

99 return Xy.drop(y_name, axis=1), Xy[y_name] 

-
- - - diff --git a/cov_html/gators_scalers_minmax_scaler_py.html b/cov_html/gators_scalers_minmax_scaler_py.html deleted file mode 100644 index 5c338157..00000000 --- a/cov_html/gators_scalers_minmax_scaler_py.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - Coverage for gators/scalers/minmax_scaler.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from scaler import minmax_scaler 

-

3from ..transformers.transformer import Transformer 

-

4import numpy as np 

-

5from typing import Union 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class MinMaxScaler(Transformer): 

-

11 """Scale each column to the [0, 1] range. 

-

12 

-

13 Parameters 

-

14 ---------- 

-

15 dtype : type, default to np.float64. 

-

16 Numerical datatype of the output data. 

-

17 

-

18 Examples 

-

19 --------- 

-

20 

-

21 * fit & transform with pandas 

-

22 

-

23 >>> import pandas as pd 

-

24 >>> from gators.scalers import MinMaxScaler 

-

25 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

26 >>> obj = MinMaxScaler() 

-

27 >>> obj.fit_transform(X) 

-

28 A B 

-

29 0 0.0 0.00 

-

30 1 0.5 0.75 

-

31 2 1.0 1.00 

-

32 

-

33 * fit & transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.scalers import MinMaxScaler 

-

37 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

38 >>> obj = MinMaxScaler() 

-

39 >>> obj.fit_transform(X) 

-

40 A B 

-

41 0 0.0 0.00 

-

42 1 0.5 0.75 

-

43 2 1.0 1.00 

-

44 

-

45 * fit with pandas & transform with numpy 

-

46 

-

47 >>> import pandas as pd 

-

48 >>> from gators.scalers import MinMaxScaler 

-

49 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

50 >>> obj = MinMaxScaler() 

-

51 >>> _ = obj.fit(X) 

-

52 >>> obj.transform_numpy(X.to_numpy()) 

-

53 array([[0. , 0. ], 

-

54 [0.5 , 0.75], 

-

55 [1. , 1. ]]) 

-

56 

-

57 * fit with koalas & transform with numpy 

-

58 

-

59 >>> import databricks.koalas as ks 

-

60 >>> from gators.scalers import MinMaxScaler 

-

61 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

62 >>> obj = MinMaxScaler() 

-

63 >>> _ = obj.fit(X) 

-

64 >>> obj.transform_numpy(X.to_numpy()) 

-

65 array([[0. , 0. ], 

-

66 [0.5 , 0.75], 

-

67 [1. , 1. ]]) 

-

68 

-

69 """ 

-

70 

-

71 def __init__(self, dtype: type = np.float64): 

-

72 self.dtype = dtype 

-

73 self.X_min: Union[pd.DataFrame, ks.DataFrame] = None 

-

74 self.X_max: Union[pd.DataFrame, ks.DataFrame] = None 

-

75 self.X_min_np = np.array([]) 

-

76 self.X_max_np = np.array([]) 

-

77 

-

78 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

79 y: Union[pd.Series, ks.Series] = None) -> 'MinMaxScaler': 

-

80 """Fit the transformer on the pandas/koalas dataframe X. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 X : Union[pd.DataFrame, ks.DataFrame] 

-

85 Input dataframe. 

-

86 y : Union[pd.Series, ks.Series], default to None. 

-

87 Labels. 

-

88 

-

89 Returns 

-

90 ------- 

-

91 'MinMaxScaler': Instance of itself. 

-

92 """ 

-

93 self.check_dataframe(X) 

-

94 self.check_dataframe_is_numerics(X) 

-

95 self.X_min = X.min().astype(self.dtype) 

-

96 self.X_max = X.max().astype(self.dtype) 

-

97 self.X_min_np = self.X_min.to_numpy().astype(self.dtype) 

-

98 self.X_max_np = self.X_max.to_numpy().astype(self.dtype) 

-

99 return self 

-

100 

-

101 def transform(self, X): 

-

102 """Transform the dataframe `X`. 

-

103 

-

104 Parameters 

-

105 ---------- 

-

106 X : Union[pd.DataFrame, ks.DataFrame]. 

-

107 Input dataframe. 

-

108 

-

109 Returns 

-

110 ------- 

-

111 Union[pd.DataFrame, ks.DataFrame] 

-

112 Transformed dataframe. 

-

113 """ 

-

114 self.check_dataframe(X) 

-

115 self.check_dataframe_is_numerics(X) 

-

116 

-

117 def f(x: ks.Series[self.dtype]): 

-

118 c = x.name 

-

119 return (x - self.X_min.loc[c]) / (self.X_max[c] - self.X_min[c]) 

-

120 

-

121 return X.astype(self.dtype).apply(f) 

-

122 

-

123 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

124 """Transform the array X. 

-

125 

-

126 Parameters 

-

127 ---------- 

-

128 X (np.ndarray): Input ndarray. 

-

129 

-

130 Returns 

-

131 ------- 

-

132 np.ndarray: Imputed ndarray. 

-

133 """ 

-

134 self.check_array(X) 

-

135 return minmax_scaler( 

-

136 X.astype(self.dtype), self.X_min_np, self.X_max_np) 

-
- - - diff --git a/cov_html/gators_scalers_standard_scaler_py.html b/cov_html/gators_scalers_standard_scaler_py.html deleted file mode 100644 index e21a5015..00000000 --- a/cov_html/gators_scalers_standard_scaler_py.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - Coverage for gators/scalers/standard_scaler.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from scaler import standard_scaler 

-

3from ..transformers.transformer import Transformer 

-

4import numpy as np 

-

5from typing import Union 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9 

-

10class StandardScaler(Transformer): 

-

11 """Scale each column by setting the mean to 0 and the standard deviation to 1. 

-

12 

-

13 

-

14 

-

15 Parameters 

-

16 ---------- 

-

17 dtype : type, default to np.float64. 

-

18 Numerical datatype of the output data. 

-

19 

-

20 Examples 

-

21 -------- 

-

22 

-

23 * fit & transform with pandas 

-

24 

-

25 >>> import pandas as pd 

-

26 >>> from gators.scalers import StandardScaler 

-

27 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

28 >>> obj = StandardScaler() 

-

29 >>> obj.fit_transform(X) 

-

30 A B 

-

31 0 -1.0 -1.120897 

-

32 1 0.0 0.320256 

-

33 2 1.0 0.800641 

-

34 

-

35 * fit & transform with koalas 

-

36 

-

37 >>> import databricks.koalas as ks 

-

38 >>> from gators.scalers import StandardScaler 

-

39 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

40 >>> obj = StandardScaler() 

-

41 >>> obj.fit_transform(X) 

-

42 A B 

-

43 0 -1.0 -1.120897 

-

44 1 0.0 0.320256 

-

45 2 1.0 0.800641 

-

46 

-

47 * fit with pandas & transform with numpy 

-

48 

-

49 >>> import pandas as pd 

-

50 >>> from gators.scalers import StandardScaler 

-

51 >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

52 >>> obj = StandardScaler() 

-

53 >>> _ = obj.fit(X) 

-

54 >>> obj.transform_numpy(X.to_numpy()) 

-

55 array([[-1. , -1.12089708], 

-

56 [ 0. , 0.32025631], 

-

57 [ 1. , 0.80064077]]) 

-

58 

-

59 * fit with koalas & transform with numpy 

-

60 

-

61 >>> import databricks.koalas as ks 

-

62 >>> from gators.scalers import StandardScaler 

-

63 >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) 

-

64 >>> obj = StandardScaler() 

-

65 >>> _ = obj.fit(X) 

-

66 >>> obj.transform_numpy(X.to_numpy()) 

-

67 array([[-1. , -1.12089708], 

-

68 [ 0. , 0.32025631], 

-

69 [ 1. , 0.80064077]]) 

-

70 

-

71 """ 

-

72 

-

73 def __init__(self, dtype: type = np.float64): 

-

74 self.dtype = dtype 

-

75 self.X_mean: Union[pd.DataFrame, ks.DataFrame] = None 

-

76 self.X_std: Union[pd.DataFrame, ks.DataFrame] = None 

-

77 self.X_mean_np = np.array([]) 

-

78 self.X_std_np = np.array([]) 

-

79 

-

80 def fit(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

81 y: Union[pd.Series, ks.Series] = None) -> 'StandardScaler': 

-

82 """Fit the transformer on the pandas/koalas dataframe X. 

-

83 

-

84 Parameters 

-

85 ---------- 

-

86 X : Union[pd.DataFrame, ks.DataFrame]. 

-

87 Input dataframe. 

-

88 y : None 

-

89 None. 

-

90 

-

91 Returns 

-

92 ------- 

-

93 'StandardScaler': Instance of itself. 

-

94 """ 

-

95 self.check_dataframe(X) 

-

96 self.check_dataframe_is_numerics(X) 

-

97 self.X_std = X.std().astype(self.dtype) 

-

98 self.X_mean = X.mean().astype(self.dtype) 

-

99 self.X_mean_np = self.X_mean.to_numpy().astype(self.dtype) 

-

100 self.X_std_np = self.X_std.to_numpy().astype(self.dtype) 

-

101 return self 

-

102 

-

103 def transform(self, X): 

-

104 """Transform the dataframe `X`. 

-

105 

-

106 Parameters 

-

107 ---------- 

-

108 X : Union[pd.DataFrame, ks.DataFrame]. 

-

109 Input dataframe. 

-

110 

-

111 Returns 

-

112 ------- 

-

113 Union[pd.DataFrame, ks.DataFrame] 

-

114 Transformed dataframe. 

-

115 """ 

-

116 self.check_dataframe(X) 

-

117 self.check_dataframe_is_numerics(X) 

-

118 

-

119 def f(x: ks.Series[self.dtype]): 

-

120 c = x.name 

-

121 return (x - self.X_mean[c]) / self.X_std[c] 

-

122 

-

123 return X.astype(self.dtype).apply(f) 

-

124 

-

125 def transform_numpy(self, X: np.ndarray) -> np.ndarray: 

-

126 """Transform the numpy ndarray X. 

-

127 

-

128 Parameters 

-

129 ---------- 

-

130 X (np.ndarray): Input ndarray. 

-

131 

-

132 Returns 

-

133 ------- 

-

134 np.ndarray: Imputed ndarray. 

-

135 """ 

-

136 self.check_array(X) 

-

137 self.check_array_is_numerics(X) 

-

138 return standard_scaler( 

-

139 X.astype(self.dtype), self.X_mean_np, self.X_std_np) 

-
- - - diff --git a/cov_html/gators_transformers_transformer_py.html b/cov_html/gators_transformers_transformer_py.html deleted file mode 100644 index fbee4dfd..00000000 --- a/cov_html/gators_transformers_transformer_py.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - Coverage for gators/transformers/transformer.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import List, Union 

-

3from abc import ABC 

-

4from abc import abstractmethod 

-

5import numpy as np 

-

6import pandas as pd 

-

7import databricks.koalas as ks 

-

8 

-

9NUMERICS_DTYPES = [np.int16, np.int32, np.int64, np.float32, np.float64] 

-

10PRINT_NUMERICS_DTYPES = ', '.join( 

-

11 [dtype.__name__ for dtype in NUMERICS_DTYPES]) 

-

12 

-

13 

-

14class Transformer(ABC): 

-

15 """Abstract **gators** transformer class. 

-

16 

-

17 Examples 

-

18 --------- 

-

19 

-

20 * A Gators transformer. 

-

21 

-

22 >>> import pandas as pd 

-

23 >>> import databricks.koalas as ks 

-

24 >>> from gators.transformers import Transformer 

-

25 >>> class GetFirstColumn(Transformer): 

-

26 ... def fit(self, X, y=None): 

-

27 ... return self 

-

28 ... 

-

29 ... def transform(self, X: pd.DataFrame): 

-

30 ... return X[[X.columns[0]]] 

-

31 ... 

-

32 ... def transform_numpy(self, X: np.ndarray): 

-

33 ... return X[:, 0].reshape(-1, 1) 

-

34 ... 

-

35 ... 

-

36 

-

37 * fit & transform with pandas 

-

38 

-

39 >>> GetFirstColumn().fit_transform(pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

40 A 

-

41 0 1 

-

42 1 2 

-

43 

-

44 * fit with pandas & transform with NumPy 

-

45 

-

46 >>> obj = GetFirstColumn().fit(pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

47 >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) 

-

48 array([[5], 

-

49 [7]]) 

-

50 

-

51 * fit & transform with koalas 

-

52 

-

53 >>> GetFirstColumn().fit_transform(ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

54 A 

-

55 0 1 

-

56 1 2 

-

57 

-

58 * fit with koalas & transform with NumPy 

-

59 

-

60 >>> obj = GetFirstColumn().fit(ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) 

-

61 >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) 

-

62 array([[5], 

-

63 [7]]) 

-

64 

-

65 """ 

-

66 

-

67 @abstractmethod 

-

68 def fit( 

-

69 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

70 y: Union[pd.Series, ks.Series] = None) -> 'Transformer': 

-

71 """Fit the transformer on the dataframe `X`. 

-

72 

-

73 Parameters 

-

74 ---------- 

-

75 X : Union[pd.DataFrame, ks.DataFrame]. 

-

76 Input dataframe. 

-

77 y : None 

-

78 None. 

-

79 

-

80 Returns 

-

81 ------- 

-

82 Transformer: Instance of itself. 

-

83 """ 

-

84 

-

85 @abstractmethod 

-

86 def transform( 

-

87 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

88 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

89 """Transform the dataframe `X`. 

-

90 

-

91 Parameters 

-

92 ---------- 

-

93 X : Union[pd.DataFrame, ks.DataFrame]. 

-

94 Input dataframe. 

-

95 

-

96 Returns 

-

97 ------- 

-

98 Union[pd.DataFrame, ks.DataFrame] 

-

99 Transformed dataframe. 

-

100 """ 

-

101 

-

102 @abstractmethod 

-

103 def transform_numpy(self, X: Union[pd.Series, ks.Series], 

-

104 y: Union[pd.Series, ks.Series] = None): 

-

105 """Transform the array X. 

-

106 

-

107 Parameters 

-

108 ---------- 

-

109 X : np.ndarray 

-

110 Array 

-

111 """ 

-

112 

-

113 def fit_transform( 

-

114 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

115 y: Union[pd.Series, ks.Series] = None 

-

116 ) -> Union[pd.DataFrame, ks.DataFrame]: 

-

117 """Fit and Transform the dataframe `X`. 

-

118 

-

119 Parameters 

-

120 ---------- 

-

121 X : Union[pd.DataFrame, ks.DataFrame]. 

-

122 Input dataframe. 

-

123 y : Union[pd.Series, ks.Series], default to None. 

-

124 Input target. 

-

125 

-

126 Returns 

-

127 ------- 

-

128 Union[pd.DataFrame, ks.DataFrame] 

-

129 Transformed dataframe. 

-

130 """ 

-

131 _ = self.fit(X, y) 

-

132 return self.transform(X) 

-

133 

-

134 @staticmethod 

-

135 def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): 

-

136 """Validate dataframe. 

-

137 

-

138 Parameters 

-

139 ---------- 

-

140 X : Union[pd.DataFrame, ks.DataFrame] 

-

141 Input dataframe. 

-

142 """ 

-

143 if not isinstance(X, (pd.DataFrame, ks.DataFrame)): 

-

144 raise TypeError( 

-

145 '''`X` should be a pandas dataframe or a koalas dataframe.''') 

-

146 for c in X.columns: 

-

147 if not isinstance(c, str): 

-

148 raise ValueError( 

-

149 'Column names of `X` should be of type str.') 

-

150 

-

151 @ staticmethod 

-

152 def check_y(X: Union[pd.DataFrame, ks.DataFrame], 

-

153 y: Union[pd.Series, ks.Series]): 

-

154 """Validate target. 

-

155 

-

156 Parameters 

-

157 ---------- 

-

158 X : Union[pd.DataFrame, ks.DataFrame] 

-

159 Dataframe 

-

160 y : Union[pd.Series, ks.Series] 

-

161 Labels 

-

162 """ 

-

163 if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): 

-

164 raise TypeError('`y` should be a pandas series.') 

-

165 if isinstance(X, ks.DataFrame) and (not isinstance(y, ks.Series)): 

-

166 raise TypeError('`y` should be a koalas series.') 

-

167 if not isinstance(y.name, str): 

-

168 raise TypeError('Name of `y` should be a str.') 

-

169 if X.shape[0] != y.shape[0]: 

-

170 raise ValueError('Length of `X` and `y` should match.') 

-

171 

-

172 @ staticmethod 

-

173 def check_array(X: np.ndarray): 

-

174 """Validate array. 

-

175 

-

176 Parameters 

-

177 ---------- 

-

178 X (np.ndarray): Array. 

-

179 """ 

-

180 if not isinstance(X, np.ndarray): 

-

181 raise TypeError('`X` should be a NumPy array.') 

-

182 

-

183 @staticmethod 

-

184 def check_dataframe_is_numerics(X: Union[pd.DataFrame, ks.DataFrame]): 

-

185 """Check if dataframe is only numerics. 

-

186 

-

187 Parameters 

-

188 ---------- 

-

189 X : Union[pd.DataFrame, ks.DataFrame] 

-

190 Dataframe 

-

191 """ 

-

192 X_dtypes = X.dtypes.unique() 

-

193 for x_dtype in X_dtypes: 

-

194 if x_dtype not in NUMERICS_DTYPES: 

-

195 raise ValueError( 

-

196 f'`X` should be of type {PRINT_NUMERICS_DTYPES}.') 

-

197 

-

198 def check_datatype(self, dtype, accepted_dtypes): 

-

199 """Check if dataframe is only numerics. 

-

200 

-

201 Parameters 

-

202 ---------- 

-

203 X : Union[pd.DataFrame, ks.DataFrame] 

-

204 Dataframe 

-

205 """ 

-

206 print_dtypes = ', '.join([dtype.__name__ for dtype in accepted_dtypes]) 

-

207 if dtype not in accepted_dtypes: 

-

208 raise ValueError( 

-

209 f'''`X` should be of type {print_dtypes}. 

-

210 Use gators.converter.ConvertColumnDatatype before 

-

211 calling the transformer {self.__class__.__name__}.''') 

-

212 

-

213 @ staticmethod 

-

214 def check_dataframe_contains_numerics(X: Union[pd.DataFrame, ks.DataFrame]): 

-

215 """Check if dataframe is only numerics. 

-

216 

-

217 Parameters 

-

218 ---------- 

-

219 X : Union[pd.DataFrame, ks.DataFrame] 

-

220 Dataframe 

-

221 """ 

-

222 X_dtypes = X.dtypes.unique() 

-

223 for x_dtype in X_dtypes: 

-

224 if x_dtype in NUMERICS_DTYPES: 

-

225 return 

-

226 raise ValueError( 

-

227 f'''`X` should contains one of the following float dtypes: 

-

228 {PRINT_NUMERICS_DTYPES}. 

-

229 Use gators.converter.ConvertColumnDatatype before 

-

230 calling this transformer.''') 

-

231 

-

232 def check_dataframe_with_objects(self, X: Union[pd.DataFrame, ks.DataFrame]): 

-

233 """Check if dataframe contains object columns. 

-

234 

-

235 Parameters 

-

236 ---------- 

-

237 X : Union[pd.DataFrame, ks.DataFrame] 

-

238 Dataframe 

-

239 """ 

-

240 contains_object = object in X.dtypes.unique() 

-

241 if not contains_object: 

-

242 # name = self.__name__ if '__name__' in dir(self) \ 

-

243 # else self.__class__.__name__ 

-

244 raise ValueError( 

-

245 f'''`X` should contains object columns to use the transformer 

-

246 {self.__class__.__name__}.''') 

-

247 

-

248 def check_array_is_numerics(self, X: np.ndarray): 

-

249 """Check if array is only numerics. 

-

250 

-

251 Parameters 

-

252 ---------- 

-

253 X : np.ndarray 

-

254 Array 

-

255 """ 

-

256 if X.dtype not in NUMERICS_DTYPES: 

-

257 raise ValueError( 

-

258 f'''`X` should be of type {PRINT_NUMERICS_DTYPES} 

-

259 to use the transformer {self.__class__.__name__}. 

-

260 Use gators.converter.ConvertColumnDatatype before calling it.''') 

-

261 

-

262 def check_nans(self, X: Union[pd.DataFrame, ks.DataFrame], 

-

263 columns: List[str]): 

-

264 """Raise an error if X contains NaN values. 

-

265 

-

266 Parameters 

-

267 ---------- 

-

268 X : Union[pd.DataFrame, ks.DataFrame] 

-

269 Dataframe. 

-

270 columns : List[str] 

-

271 List of columns. 

-

272 """ 

-

273 if X[columns].isnull().sum().sum() != 0: 

-

274 raise ValueError( 

-

275 f'''The object columns should not contain NaN values 

-

276 to use the transformer {self.__class__.__name__}. 

-

277 Use `gators.imputers.ObjectImputer` before calling it.''') 

-
- - - diff --git a/cov_html/gators_transformers_transformer_xy_py.html b/cov_html/gators_transformers_transformer_xy_py.html deleted file mode 100644 index 0e3cd433..00000000 --- a/cov_html/gators_transformers_transformer_xy_py.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - Coverage for gators/transformers/transformer_xy.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from typing import Union 

-

3from abc import ABC 

-

4from abc import abstractmethod 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9class TransformerXY(ABC): 

-

10 """Abstract **gators** class to transform both X and y. 

-

11 

-

12 Examples 

-

13 --------- 

-

14 

-

15 * transform with pandas 

-

16 

-

17 >>> import pandas as pd 

-

18 >>> from gators.transformers import TransformerXY 

-

19 >>> class FirsRows(Transformer): 

-

20 ... def transform(self, X, y): 

-

21 ... return X.head(1), y.head(1) 

-

22 ... 

-

23 >>> X, y = FirsRows().fit_transform( 

-

24 ... X=pd.DataFrame({'A':[1, 2], 'B':[3, 4]}), 

-

25 ... y=pd.Series([0, 1],name='TARGET')) 

-

26 >>> X 

-

27 A B 

-

28 0 1 3 

-

29 >>> y 

-

30 0 

-

31 Name: TARGET, dtype: int64 

-

32 

-

33 * transform with koalas 

-

34 

-

35 >>> import databricks.koalas as ks 

-

36 >>> from gators.transformers import TransformerXY 

-

37 >>> class FirsRows(Transformer): 

-

38 ... def transform(self, X, y): 

-

39 ... return X.head(1), y.head(1) 

-

40 ... 

-

41 >>> X, y = FirsRows().fit_transform( 

-

42 ... X=ks.DataFrame({'A':[1, 2], 'B':[3, 4]}), 

-

43 ... y=ks.Series([0, 1],name='TARGET')) 

-

44 >>> X 

-

45 A B 

-

46 0 1 3 

-

47 >>> y 

-

48 0 

-

49 

-

50 """ 

-

51 

-

52 @abstractmethod 

-

53 def transform( 

-

54 self, X: Union[pd.DataFrame, ks.DataFrame], 

-

55 y: Union[pd.Series, ks.Series]): 

-

56 """Fit and Transform the dataframes `X`ad `y`. 

-

57 

-

58 Parameters 

-

59 ---------- 

-

60 X : Union[pd.DataFrame, ks.DataFrame]. 

-

61 Input dataframe. 

-

62 y : Union[pd.Series, ks.Series] 

-

63 None. 

-

64 

-

65 Returns 

-

66 ------- 

-

67 Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]] 

-

68 Transformed dataframes. 

-

69 """ 

-

70 

-

71 @staticmethod 

-

72 def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): 

-

73 """Validate dataframe. 

-

74 

-

75 Parameters 

-

76 ---------- 

-

77 X : Union[pd.DataFrame, ks.DataFrame] 

-

78 Input dataframe. 

-

79 """ 

-

80 if not isinstance(X, (pd.DataFrame, ks.DataFrame)): 

-

81 raise TypeError( 

-

82 '''`X` should be a pandas dataframe or a koalas dataframe.''') 

-

83 for c in X.columns: 

-

84 if not isinstance(c, str): 

-

85 raise TypeError('Column names of `X` should be of type str.') 

-

86 

-

87 @ staticmethod 

-

88 def check_y(X: Union[pd.DataFrame, ks.DataFrame], 

-

89 y: Union[pd.Series, ks.Series]): 

-

90 """Validate target. 

-

91 

-

92 Parameters 

-

93 ---------- 

-

94 X : Union[pd.DataFrame, ks.DataFrame] 

-

95 Dataframe 

-

96 y : Union[pd.Series, ks.Series] 

-

97 Labels 

-

98 """ 

-

99 if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): 

-

100 raise TypeError('`y` should be a pandas series.') 

-

101 if isinstance(X, ks.DataFrame) and (not isinstance(y, ks.Series)): 

-

102 raise TypeError('`y` should be a koalas series.') 

-

103 if not isinstance(y.name, str): 

-

104 raise TypeError('Name of `y` should be a str.') 

-

105 if X.shape[0] != y.shape[0]: 

-

106 raise ValueError('Length of `X` and `y` should match.') 

-
- - - diff --git a/cov_html/gators_util_util_py.html b/cov_html/gators_util_util_py.html deleted file mode 100644 index b1b8b10d..00000000 --- a/cov_html/gators_util_util_py.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - - - Coverage for gators/util/util.py: 100% - - - - - - - - - - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- r - m - x - p   toggle line displays -

-

- j - k   next/prev highlighted chunk -

-

- 0   (zero) top of page -

-

- 1   (one) first highlighted chunk -

-
-
-
-

1# License: Apache-2.0 

-

2from pyspark.ml.feature import VectorAssembler 

-

3from typing import List, Union 

-

4import numpy as np 

-

5import pandas as pd 

-

6import databricks.koalas as ks 

-

7 

-

8 

-

9def get_bounds(X_dtype: type) -> List: 

-

10 """Return upper and lower of the input numerical NumPy datatype. 

-

11 

-

12 Parameters 

-

13 ---------- 

-

14 X_dtype : type, default to np.float64 

-

15 Numerical NumPy datatype. 

-

16 

-

17 Returns 

-

18 ------- 

-

19 List 

-

20 Lower ad upper bounds. 

-

21 """ 

-

22 if 'float' in str(X_dtype): 

-

23 info = np.finfo(X_dtype) 

-

24 return info.min, info.max 

-

25 elif 'int' in str(X_dtype): 

-

26 info = np.iinfo(X_dtype) 

-

27 return info.min, info.max 

-

28 

-

29 

-

30def concat(objs: List[Union[pd.DataFrame, ks.DataFrame]], 

-

31 axis: int) -> Union[pd.DataFrame, ks.DataFrame]: 

-

32 """Concatenate the `objs` along an axis. 

-

33 

-

34 Parameters 

-

35 ---------- 

-

36 objs : List[Union[pd.DataFrame, ks.DataFrame]] 

-

37 List of dataframes to concatenate. 

-

38 axis : int 

-

39 The axis to concatenate along. 

-

40 

-

41 Returns 

-

42 ------- 

-

43 Union[pd.DataFrame, ks.DataFrame] 

-

44 Concatenated dataframe. 

-

45 """ 

-

46 if isinstance(objs[0], (pd.DataFrame, pd.Series)): 

-

47 return pd.concat(objs, axis=axis) 

-

48 return ks.concat(objs, axis=axis) 

-

49 

-

50 

-

51def get_datatype_columns( 

-

52 X: Union[pd.DataFrame, ks.DataFrame], 

-

53 datatype: type) -> List[str]: 

-

54 """Return the columns of the specified datatype. 

-

55 

-

56 Parameters 

-

57 ---------- 

-

58 X : Union[pd.DataFrame, ks.DataFrame] 

-

59 Input dataframe. 

-

60 datatype : type 

-

61 Datatype. 

-

62 

-

63 Returns 

-

64 ------- 

-

65 List[str] 

-

66 List of columns 

-

67 """ 

-

68 X_dtypes = X.dtypes 

-

69 mask = X_dtypes == datatype 

-

70 if isinstance(X, ks.DataFrame) and (datatype == object): 

-

71 mask = (X_dtypes == object) | ( 

-

72 X_dtypes.astype(str).str.startswith('<U')) 

-

73 

-

74 datatype_columns = [c for c, m in zip(X_dtypes.index, mask) if m] 

-

75 return datatype_columns 

-

76 

-

77 

-

78def exclude_columns(columns: List[str], 

-

79 excluded_columns: List[str]) -> List[str]: 

-

80 """Return the columns in `columns` not in `selected_columns`. 

-

81 

-

82 Parameters 

-

83 ---------- 

-

84 columns : List[str] 

-

85 List of columns. 

-

86 excluded_columns : List[str] 

-

87 List of columns. 

-

88 

-

89 Returns 

-

90 ------- 

-

91 List[str] 

-

92 List of columns. 

-

93 """ 

-

94 return [c for c in columns if c not in excluded_columns] 

-

95 

-

96 

-

97def get_idx_columns( 

-

98 columns: List[str], selected_columns: List[str]) -> np.ndarray: 

-

99 """Return the indices of the columns in `columns` 

-

100 and `selected_columns`. 

-

101 

-

102 Parameters 

-

103 ---------- 

-

104 columns : List[str] 

-

105 List of columns. 

-

106 selected_columns : List[str] 

-

107 List of columns. 

-

108 

-

109 Returns 

-

110 ------- 

-

111 np.ndarray 

-

112 Array of indices. 

-

113 """ 

-

114 selected_idx_columns = [] 

-

115 for selected_column in selected_columns: 

-

116 for i, column in enumerate(columns): 

-

117 if column == selected_column: 

-

118 selected_idx_columns.append(i) 

-

119 return np.array(selected_idx_columns) 

-

120 

-

121 

-

122def exclude_idx_columns( 

-

123 columns: List[str], excluded_columns: List[str]) -> np.ndarray: 

-

124 """Return the indices of the columns in `columns` 

-

125 and not in `excluded_columns`. 

-

126 

-

127 Parameters 

-

128 ---------- 

-

129 columns : List[str] 

-

130 List of columns. 

-

131 excluded_columns : List[str] 

-

132 List of columns. 

-

133 

-

134 Returns 

-

135 ------- 

-

136 np.ndarray 

-

137 Array of indices. 

-

138 """ 

-

139 

-

140 selected_idx_columns = [ 

-

141 i for i, c in enumerate(columns) 

-

142 if c not in excluded_columns 

-

143 ] 

-

144 return np.array(selected_idx_columns) 

-

145 

-

146 

-

147def get_numerical_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: 

-

148 """Return the float columns. 

-

149 

-

150 Parameters 

-

151 ---------- 

-

152 X : Union[pd.DataFrame, ks.DataFrame] 

-

153 Input dataframe. 

-

154 

-

155 Returns 

-

156 ------- 

-

157 List[str] 

-

158 List of columns. 

-

159 """ 

-

160 X_dtypes = X.dtypes 

-

161 mask = ( 

-

162 (X_dtypes == np.float64) | 

-

163 (X_dtypes == np.int64) | 

-

164 (X_dtypes == np.float32) | 

-

165 (X_dtypes == np.int32) | 

-

166 (X_dtypes == np.float16) | 

-

167 (X_dtypes == np.int16) 

-

168 ) 

-

169 numerical_columns = [c for c, m in zip(X_dtypes.index, mask) if m] 

-

170 return numerical_columns 

-

171 

-

172 

-

173def get_float_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: 

-

174 """Return the float columns. 

-

175 

-

176 Parameters 

-

177 ---------- 

-

178 X : Union[pd.DataFrame, ks.DataFrame] 

-

179 Input dataframe. 

-

180 

-

181 Returns 

-

182 ------- 

-

183 List[str] 

-

184 List of columns. 

-

185 """ 

-

186 numerical_columns = get_numerical_columns(X) 

-

187 if not numerical_columns: 

-

188 return [] 

-

189 i_max = int(np.min(np.array([X.shape[0], 50000]))) 

-

190 X_dummy = X[numerical_columns].head(i_max).to_numpy() 

-

191 float_columns = [ 

-

192 col for i, col in enumerate(numerical_columns) 

-

193 if not np.allclose( 

-

194 X_dummy[:, i].round(), 

-

195 X_dummy[:, i], equal_nan=True) or 

-

196 (X_dummy[:, i] != X_dummy[:, i]).mean() == 1 

-

197 ] 

-

198 return float_columns 

-

199 

-

200 

-

201def get_int_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: 

-

202 """Return the list of integer columns. 

-

203 

-

204 Parameters 

-

205 ---------- 

-

206 X : Union[pd.DataFrame, ks.DataFrame] 

-

207 Input dataframe. 

-

208 

-

209 Returns 

-

210 ------- 

-

211 List[str] 

-

212 List of columns. 

-

213 """ 

-

214 numerical_columns = get_numerical_columns(X) 

-

215 if not numerical_columns: 

-

216 return [] 

-

217 i_max = int(np.min(np.array([X.shape[0], 50000]))) 

-

218 X_dummy = X[numerical_columns].head(i_max).to_numpy() 

-

219 int_columns = [ 

-

220 col for i, col in enumerate(numerical_columns) 

-

221 if np.allclose( 

-

222 X_dummy[:, i].round(), 

-

223 X_dummy[:, i], equal_nan=True) and 

-

224 (X_dummy[:, i] != X_dummy[:, i]).mean() != 1 

-

225 ] 

-

226 return int_columns 

-

227 

-

228 

-

229def generate_spark_dataframe(X: ks.DataFrame, y=None): 

-

230 """ 

-

231 Generates a Spark dataframe and transforms the features 

-

232 to one column, ready for training in a SparkML model 

-

233 

-

234 Parameters 

-

235 ---------- 

-

236 X : ks.DataFrame 

-

237 Feature set. 

-

238 y : ks.Series, default to None. 

-

239 Target column. Defaults to None. 

-

240 

-

241 Returns 

-

242 ------- 

-

243 pyspark.DataFrame 

-

244 Contains the features transformed into one column. 

-

245 """ 

-

246 columns = list(X.columns) 

-

247 if y is None: 

-

248 spark_df = X.to_spark() 

-

249 else: 

-

250 spark_df = X.join(y).to_spark() 

-

251 vector_assembler = VectorAssembler( 

-

252 inputCols=columns, outputCol="features") 

-

253 transformed_spark_df = vector_assembler.transform(spark_df) 

-

254 return transformed_spark_df 

-

255 

-

256 

-

257def flatten_list(list_to_flatten: List): 

-

258 """Flatten list. 

-

259 

-

260 Parameters 

-

261 ---------- 

-

262 list_to_flatten : List 

-

263 List to flatten 

-

264 

-

265 Returns 

-

266 ------- 

-

267 List 

-

268 Flatten list 

-

269 """ 

-

270 list_flatten = [] 

-

271 for i, l in enumerate(list_to_flatten): 

-

272 if not isinstance(l, list): 

-

273 list_flatten.append(l) 

-

274 else: 

-

275 list_flatten += l 

-

276 return list_flatten 

-
- - - diff --git a/cov_html/index.html b/cov_html/index.html index cd321ee5..e9e8890c 100644 --- a/cov_html/index.html +++ b/cov_html/index.html @@ -1,617 +1,784 @@ + Coverage report - - - - - - + + - -
- Hide keyboard shortcuts -

Hot-keys on this page

-
-

- n - s - m - x - c   change column sorting -

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Modulestatementsmissingexcludedcoverage
Total294600100%
gators/binning/_base_discretizer.py7900100%
gators/binning/bin_rare_events.py6300100%
gators/binning/custom_discretizer.py3000100%
gators/binning/discretizer.py3300100%
gators/binning/quantile_discretizer.py3200100%
gators/clipping/clipping.py3500100%
gators/converter/convert_column_datatype.py2700100%
gators/converter/koalas_to_pandas.py1400100%
gators/converter/to_numpy.py1200100%
gators/data_cleaning/_base_data_cleaning.py2500100%
gators/data_cleaning/drop_columns.py1600100%
gators/data_cleaning/drop_datatype_columns.py1700100%
gators/data_cleaning/drop_high_cardinality.py2900100%
gators/data_cleaning/drop_high_nan_ratio.py2400100%
gators/data_cleaning/drop_low_cardinality.py2900100%
gators/data_cleaning/keep_columns.py1600100%
gators/data_cleaning/replace.py4000100%
gators/encoders/_base_encoder.py4600100%
gators/encoders/multiclass_encoder.py6900100%
gators/encoders/onehot_encoder.py6100100%
gators/encoders/ordinal_encoder.py4000100%
gators/encoders/regression_encoder.py2700100%
gators/encoders/target_encoder.py4700100%
gators/encoders/woe_encoder.py5100100%
gators/feature_generation/_base_feature_generation.py1400100%
gators/feature_generation/cluster_statistics.py6100100%
gators/feature_generation/elementary_arithmethics.py7400100%
gators/feature_generation/is_equal.py5400100%
gators/feature_generation/is_null.py3900100%
gators/feature_generation/one_hot.py4300100%
gators/feature_generation/plane_rotation.py5000100%
gators/feature_generation/polynomial_features.py5900100%
gators/feature_generation_dt/_base_datetime_feature.py2900100%
gators/feature_generation_dt/cyclic_day_of_month.py4800100%
gators/feature_generation_dt/cyclic_day_of_week.py3300100%
gators/feature_generation_dt/cyclic_hour_of_day.py3200100%
gators/feature_generation_dt/cyclic_minute_of_hour.py3200100%
gators/feature_generation_dt/cyclic_month_of_year.py3300100%
gators/feature_generation_dt/delta_time.py4800100%
gators/feature_generation_dt/ordinal_day_of_month.py2700100%
gators/feature_generation_dt/ordinal_day_of_week.py2700100%
gators/feature_generation_dt/ordinal_hour_of_day.py2600100%
gators/feature_generation_dt/ordinal_minute_of_hour.py2600100%
gators/feature_generation_dt/ordinal_month_of_year.py2600100%
gators/feature_generation_str/_base_string_feature.py2500100%
gators/feature_generation_str/extract.py3600100%
gators/feature_generation_str/lower_case.py2700100%
gators/feature_generation_str/split_extract.py3200100%
gators/feature_generation_str/string_contains.py2600100%
gators/feature_generation_str/string_length.py2600100%
gators/feature_generation_str/upper_case.py2800100%
gators/feature_selection/_base_feature_selection.py2100100%
gators/feature_selection/correlation_filter.py2700100%
gators/feature_selection/information_value.py5100100%
gators/feature_selection/multiclass_information_value.py4200100%
gators/feature_selection/regression_information_value.py3400100%
gators/feature_selection/select_from_model.py4300100%
gators/feature_selection/select_from_models.py6400100%
gators/feature_selection/variance_filter.py2200100%
gators/imputers/_base_imputer.py4400100%
gators/imputers/float_imputer.py4200100%
gators/imputers/int_imputer.py3700100%
gators/imputers/numerics_imputer.py4200100%
gators/imputers/object_imputer.py3300100%
gators/model_building/hyperopt.py7500100%
gators/model_building/lgbm_treelite_dumper.py2600100%
gators/model_building/train_test_split.py7400100%
gators/model_building/xgb_booster_builder.py2100100%
gators/model_building/xgb_treelite_dumper.py2500100%
gators/pipeline/pipeline.py8100100%
gators/sampling/supervised_sampling.py4300100%
gators/sampling/unsupervised_sampling.py1900100%
gators/scalers/minmax_scaler.py3100100%
gators/scalers/standard_scaler.py3200100%
gators/transformers/transformer.py7800100%
gators/transformers/transformer_xy.py2500100%
gators/util/util.py7100100%
-

- No items found using the specified filter. -

-
- + + - + + \ No newline at end of file diff --git a/cov_html/status.json b/cov_html/status.json index 86978f89..0864be17 100644 --- a/cov_html/status.json +++ b/cov_html/status.json @@ -1 +1,1452 @@ -{"format":2,"version":"6.0","globals":"80948c401ee7ebe88bb74cd6a81b4adf","files":{"d_b13ffdfa7fdfb0fb__base_discretizer_py":{"hash":"57ce5c93a88d7c1cd64393e4f7a5ff0b","index":{"nums":[0,1,79,0,0,0,0,0],"html_filename":"d_b13ffdfa7fdfb0fb__base_discretizer_py.html","relative_filename":"gators/binning/_base_discretizer.py"}},"d_b13ffdfa7fdfb0fb_bin_rare_events_py":{"hash":"233373b66bb9dcfc0ff51993701cf0dc","index":{"nums":[0,1,63,0,0,0,0,0],"html_filename":"d_b13ffdfa7fdfb0fb_bin_rare_events_py.html","relative_filename":"gators/binning/bin_rare_events.py"}},"d_b13ffdfa7fdfb0fb_custom_discretizer_py":{"hash":"a145d3f10849b15134c04c454b53202f","index":{"nums":[0,1,30,0,0,0,0,0],"html_filename":"d_b13ffdfa7fdfb0fb_custom_discretizer_py.html","relative_filename":"gators/binning/custom_discretizer.py"}},"d_b13ffdfa7fdfb0fb_discretizer_py":{"hash":"9dc285884179aedbbf726df0973d231c","index":{"nums":[0,1,33,0,0,0,0,0],"html_filename":"d_b13ffdfa7fdfb0fb_discretizer_py.html","relative_filename":"gators/binning/discretizer.py"}},"d_b13ffdfa7fdfb0fb_quantile_discretizer_py":{"hash":"007955c1dd0f2d4f5ff3c2981800bd07","index":{"nums":[0,1,32,0,0,0,0,0],"html_filename":"d_b13ffdfa7fdfb0fb_quantile_discretizer_py.html","relative_filename":"gators/binning/quantile_discretizer.py"}},"d_06c032577783e370_clipping_py":{"hash":"d3a39f3749250c8a812e2b3b1620ceea","index":{"nums":[0,1,35,0,0,0,0,0],"html_filename":"d_06c032577783e370_clipping_py.html","relative_filename":"gators/clipping/clipping.py"}},"d_e907b401e10b8f1d_convert_column_datatype_py":{"hash":"08056ac20fcf0f28298217650bed8cdf","index":{"nums":[0,1,27,0,0,0,0,0],"html_filename":"d_e907b401e10b8f1d_convert_column_datatype_py.html","relative_filename":"gators/converter/convert_column_datatype.py"}},"d_e907b401e10b8f1d_koalas_to_pandas_py":{"hash":"871988f853ddce7018efb02897140667","index":{"nums":[0,1,14,0,0,0,0,0],"html_filename":"d_e907b401e10b8f1d_koalas_to_pandas_py.html","relative_filename":"gators/converter/koalas_to_pandas.py"}},"d_e907b401e10b8f1d_to_numpy_py":{"hash":"a6b53cbfe45cbb3e69c07588361c5770","index":{"nums":[0,1,12,0,0,0,0,0],"html_filename":"d_e907b401e10b8f1d_to_numpy_py.html","relative_filename":"gators/converter/to_numpy.py"}},"d_d9c8a9d49d9efff0__base_data_cleaning_py":{"hash":"281df607a6e11de09dd6aa088b22cf53","index":{"nums":[0,1,25,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0__base_data_cleaning_py.html","relative_filename":"gators/data_cleaning/_base_data_cleaning.py"}},"d_d9c8a9d49d9efff0_drop_columns_py":{"hash":"9c767e2821ce6ee0d0e544674ccd968e","index":{"nums":[0,1,16,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_drop_columns_py.html","relative_filename":"gators/data_cleaning/drop_columns.py"}},"d_d9c8a9d49d9efff0_drop_datatype_columns_py":{"hash":"d61dcd5ac4cda4ca89fdf90b726266d4","index":{"nums":[0,1,17,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_drop_datatype_columns_py.html","relative_filename":"gators/data_cleaning/drop_datatype_columns.py"}},"d_d9c8a9d49d9efff0_drop_high_cardinality_py":{"hash":"29dca93a5d6b0ce4745c27a55ca0472e","index":{"nums":[0,1,29,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_drop_high_cardinality_py.html","relative_filename":"gators/data_cleaning/drop_high_cardinality.py"}},"d_d9c8a9d49d9efff0_drop_high_nan_ratio_py":{"hash":"6d1613cbbf65f1c638c37923e9fbf3b0","index":{"nums":[0,1,24,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_drop_high_nan_ratio_py.html","relative_filename":"gators/data_cleaning/drop_high_nan_ratio.py"}},"d_d9c8a9d49d9efff0_drop_low_cardinality_py":{"hash":"5fcf05adc3675e4360b0a6ac81a67fb8","index":{"nums":[0,1,29,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_drop_low_cardinality_py.html","relative_filename":"gators/data_cleaning/drop_low_cardinality.py"}},"d_d9c8a9d49d9efff0_keep_columns_py":{"hash":"4ffc208b0537b5ecd513ee331c30ebcb","index":{"nums":[0,1,16,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_keep_columns_py.html","relative_filename":"gators/data_cleaning/keep_columns.py"}},"d_d9c8a9d49d9efff0_replace_py":{"hash":"0c8125be678aba66234b9dedb935beb0","index":{"nums":[0,1,40,0,0,0,0,0],"html_filename":"d_d9c8a9d49d9efff0_replace_py.html","relative_filename":"gators/data_cleaning/replace.py"}},"d_2e7b559919172292__base_encoder_py":{"hash":"c43dbff6a9a35b619cd75815d1d68555","index":{"nums":[0,1,46,0,0,0,0,0],"html_filename":"d_2e7b559919172292__base_encoder_py.html","relative_filename":"gators/encoders/_base_encoder.py"}},"d_2e7b559919172292_multiclass_encoder_py":{"hash":"f056a5eb303f486098d9f2bf431cd5e1","index":{"nums":[0,1,69,0,0,0,0,0],"html_filename":"d_2e7b559919172292_multiclass_encoder_py.html","relative_filename":"gators/encoders/multiclass_encoder.py"}},"d_2e7b559919172292_onehot_encoder_py":{"hash":"dd769fb776935163801f5daf94ddfd2c","index":{"nums":[0,1,61,0,0,0,0,0],"html_filename":"d_2e7b559919172292_onehot_encoder_py.html","relative_filename":"gators/encoders/onehot_encoder.py"}},"d_2e7b559919172292_ordinal_encoder_py":{"hash":"1828458a5447fe7768f55bd57f17f9af","index":{"nums":[0,1,40,0,0,0,0,0],"html_filename":"d_2e7b559919172292_ordinal_encoder_py.html","relative_filename":"gators/encoders/ordinal_encoder.py"}},"d_2e7b559919172292_regression_encoder_py":{"hash":"d28743c4c31f8f9617e7d5c594765ae2","index":{"nums":[0,1,27,0,0,0,0,0],"html_filename":"d_2e7b559919172292_regression_encoder_py.html","relative_filename":"gators/encoders/regression_encoder.py"}},"d_2e7b559919172292_target_encoder_py":{"hash":"7d5f0c37431f1cc904062b4c5f61ac00","index":{"nums":[0,1,47,0,0,0,0,0],"html_filename":"d_2e7b559919172292_target_encoder_py.html","relative_filename":"gators/encoders/target_encoder.py"}},"d_2e7b559919172292_woe_encoder_py":{"hash":"a89fe109dc1922408d129ac68bcbdfce","index":{"nums":[0,1,51,0,0,0,0,0],"html_filename":"d_2e7b559919172292_woe_encoder_py.html","relative_filename":"gators/encoders/woe_encoder.py"}},"d_bafb7a187804c98b__base_feature_generation_py":{"hash":"7ed7dfb5df3b39fcde9f0cdfe8cc40a0","index":{"nums":[0,1,14,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b__base_feature_generation_py.html","relative_filename":"gators/feature_generation/_base_feature_generation.py"}},"d_bafb7a187804c98b_cluster_statistics_py":{"hash":"b0a69eb34db564b887bfacef9c8cc986","index":{"nums":[0,1,61,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_cluster_statistics_py.html","relative_filename":"gators/feature_generation/cluster_statistics.py"}},"d_bafb7a187804c98b_elementary_arithmethics_py":{"hash":"646d568eee17abf1d4ebd8a7ddf4e653","index":{"nums":[0,1,74,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_elementary_arithmethics_py.html","relative_filename":"gators/feature_generation/elementary_arithmethics.py"}},"d_bafb7a187804c98b_is_equal_py":{"hash":"d966d667d413c3c0f39b23eb71d4116e","index":{"nums":[0,1,54,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_is_equal_py.html","relative_filename":"gators/feature_generation/is_equal.py"}},"d_bafb7a187804c98b_is_null_py":{"hash":"c3f814a43cc9f41ffa7ae50fedcd6684","index":{"nums":[0,1,39,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_is_null_py.html","relative_filename":"gators/feature_generation/is_null.py"}},"d_bafb7a187804c98b_one_hot_py":{"hash":"55a46ef8cc98b80b61b80a96d1800874","index":{"nums":[0,1,43,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_one_hot_py.html","relative_filename":"gators/feature_generation/one_hot.py"}},"d_bafb7a187804c98b_plane_rotation_py":{"hash":"b2ccbc98fabd966d6cf986253464ae65","index":{"nums":[0,1,50,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_plane_rotation_py.html","relative_filename":"gators/feature_generation/plane_rotation.py"}},"d_bafb7a187804c98b_polynomial_features_py":{"hash":"39587ffc703c6f2b0c295675ae965844","index":{"nums":[0,1,59,0,0,0,0,0],"html_filename":"d_bafb7a187804c98b_polynomial_features_py.html","relative_filename":"gators/feature_generation/polynomial_features.py"}},"d_603dd87602f86b7b__base_datetime_feature_py":{"hash":"6f633ae07b8e9d337008932dec890120","index":{"nums":[0,1,29,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b__base_datetime_feature_py.html","relative_filename":"gators/feature_generation_dt/_base_datetime_feature.py"}},"d_603dd87602f86b7b_cyclic_day_of_month_py":{"hash":"10ab4bcf8170134f478dbfdfb2921b0d","index":{"nums":[0,1,48,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_cyclic_day_of_month_py.html","relative_filename":"gators/feature_generation_dt/cyclic_day_of_month.py"}},"d_603dd87602f86b7b_cyclic_day_of_week_py":{"hash":"0cf795bdfc3a71c25eb3dc15b2d1b3fb","index":{"nums":[0,1,33,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_cyclic_day_of_week_py.html","relative_filename":"gators/feature_generation_dt/cyclic_day_of_week.py"}},"d_603dd87602f86b7b_cyclic_hour_of_day_py":{"hash":"d0f347efbe87d335f52c794a627aad10","index":{"nums":[0,1,32,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_cyclic_hour_of_day_py.html","relative_filename":"gators/feature_generation_dt/cyclic_hour_of_day.py"}},"d_603dd87602f86b7b_cyclic_minute_of_hour_py":{"hash":"dc78cdac4387d450ede8543624384a02","index":{"nums":[0,1,32,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_cyclic_minute_of_hour_py.html","relative_filename":"gators/feature_generation_dt/cyclic_minute_of_hour.py"}},"d_603dd87602f86b7b_cyclic_month_of_year_py":{"hash":"c03cc21b72c504edf0b433f3340677ae","index":{"nums":[0,1,33,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_cyclic_month_of_year_py.html","relative_filename":"gators/feature_generation_dt/cyclic_month_of_year.py"}},"d_603dd87602f86b7b_delta_time_py":{"hash":"e20fbb88d6b4b002b89e7439f4f0492a","index":{"nums":[0,1,48,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_delta_time_py.html","relative_filename":"gators/feature_generation_dt/delta_time.py"}},"d_603dd87602f86b7b_ordinal_day_of_month_py":{"hash":"a255dd6e9cc38a0b09935cc8ddb3df7b","index":{"nums":[0,1,27,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_ordinal_day_of_month_py.html","relative_filename":"gators/feature_generation_dt/ordinal_day_of_month.py"}},"d_603dd87602f86b7b_ordinal_day_of_week_py":{"hash":"2a0bd6bd74fba07eb19aa2b19b77b1b9","index":{"nums":[0,1,27,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_ordinal_day_of_week_py.html","relative_filename":"gators/feature_generation_dt/ordinal_day_of_week.py"}},"d_603dd87602f86b7b_ordinal_hour_of_day_py":{"hash":"d3ba9af744b861194b1960ca01ff1b96","index":{"nums":[0,1,26,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_ordinal_hour_of_day_py.html","relative_filename":"gators/feature_generation_dt/ordinal_hour_of_day.py"}},"d_603dd87602f86b7b_ordinal_minute_of_hour_py":{"hash":"fb1b7ded71b65d1525ea09c2a72db269","index":{"nums":[0,1,26,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_ordinal_minute_of_hour_py.html","relative_filename":"gators/feature_generation_dt/ordinal_minute_of_hour.py"}},"d_603dd87602f86b7b_ordinal_month_of_year_py":{"hash":"76b439abac1f7c869520586a4d3e5661","index":{"nums":[0,1,26,0,0,0,0,0],"html_filename":"d_603dd87602f86b7b_ordinal_month_of_year_py.html","relative_filename":"gators/feature_generation_dt/ordinal_month_of_year.py"}},"d_6c98d578b789a2c0__base_string_feature_py":{"hash":"b38e88e4b16716113b6a9ee2a5387048","index":{"nums":[0,1,25,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0__base_string_feature_py.html","relative_filename":"gators/feature_generation_str/_base_string_feature.py"}},"d_6c98d578b789a2c0_extract_py":{"hash":"d6a2f5c48bb677bc28b1c7d4c0d95445","index":{"nums":[0,1,36,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0_extract_py.html","relative_filename":"gators/feature_generation_str/extract.py"}},"d_6c98d578b789a2c0_lower_case_py":{"hash":"cce3e3702fcbf65b26620ea6dccfa60c","index":{"nums":[0,1,27,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0_lower_case_py.html","relative_filename":"gators/feature_generation_str/lower_case.py"}},"d_6c98d578b789a2c0_split_extract_py":{"hash":"f87f3931214d2a1ccfbce5541c21ada1","index":{"nums":[0,1,32,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0_split_extract_py.html","relative_filename":"gators/feature_generation_str/split_extract.py"}},"d_6c98d578b789a2c0_string_contains_py":{"hash":"26010c50c68814a589cf2745c8d54f4b","index":{"nums":[0,1,26,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0_string_contains_py.html","relative_filename":"gators/feature_generation_str/string_contains.py"}},"d_6c98d578b789a2c0_string_length_py":{"hash":"4451d6155bb7b3cbeead1fb1549fa72a","index":{"nums":[0,1,26,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0_string_length_py.html","relative_filename":"gators/feature_generation_str/string_length.py"}},"d_6c98d578b789a2c0_upper_case_py":{"hash":"f6276fe0946757264d00dbde7979b188","index":{"nums":[0,1,28,0,0,0,0,0],"html_filename":"d_6c98d578b789a2c0_upper_case_py.html","relative_filename":"gators/feature_generation_str/upper_case.py"}},"d_77d5126526bda421__base_feature_selection_py":{"hash":"f1270e8857521a0046e2e4f64a932c15","index":{"nums":[0,1,21,0,0,0,0,0],"html_filename":"d_77d5126526bda421__base_feature_selection_py.html","relative_filename":"gators/feature_selection/_base_feature_selection.py"}},"d_77d5126526bda421_correlation_filter_py":{"hash":"89f75274434543498d436496ca2af5aa","index":{"nums":[0,1,27,0,0,0,0,0],"html_filename":"d_77d5126526bda421_correlation_filter_py.html","relative_filename":"gators/feature_selection/correlation_filter.py"}},"d_77d5126526bda421_information_value_py":{"hash":"1ec6394c9cd8a10f85570f65fcffcf2f","index":{"nums":[0,1,51,0,0,0,0,0],"html_filename":"d_77d5126526bda421_information_value_py.html","relative_filename":"gators/feature_selection/information_value.py"}},"d_77d5126526bda421_multiclass_information_value_py":{"hash":"e5df72139f5bdda34b8ae7ff68142f74","index":{"nums":[0,1,42,0,0,0,0,0],"html_filename":"d_77d5126526bda421_multiclass_information_value_py.html","relative_filename":"gators/feature_selection/multiclass_information_value.py"}},"d_77d5126526bda421_regression_information_value_py":{"hash":"140ab036c0fc44a5f7a6d7a203cb3ddf","index":{"nums":[0,1,34,0,0,0,0,0],"html_filename":"d_77d5126526bda421_regression_information_value_py.html","relative_filename":"gators/feature_selection/regression_information_value.py"}},"d_77d5126526bda421_select_from_model_py":{"hash":"0f793330e5881d5dbcfe8b8842313220","index":{"nums":[0,1,43,0,0,0,0,0],"html_filename":"d_77d5126526bda421_select_from_model_py.html","relative_filename":"gators/feature_selection/select_from_model.py"}},"d_77d5126526bda421_select_from_models_py":{"hash":"0a25417de2530e64057c939ac2992df5","index":{"nums":[0,1,64,0,0,0,0,0],"html_filename":"d_77d5126526bda421_select_from_models_py.html","relative_filename":"gators/feature_selection/select_from_models.py"}},"d_77d5126526bda421_variance_filter_py":{"hash":"6c9e63fa64ecf4de7fa5deb1634ca3a3","index":{"nums":[0,1,22,0,0,0,0,0],"html_filename":"d_77d5126526bda421_variance_filter_py.html","relative_filename":"gators/feature_selection/variance_filter.py"}},"d_8813d29e2db35b41__base_imputer_py":{"hash":"fac70f85ff360b25af98f94f8438298c","index":{"nums":[0,1,44,0,0,0,0,0],"html_filename":"d_8813d29e2db35b41__base_imputer_py.html","relative_filename":"gators/imputers/_base_imputer.py"}},"d_8813d29e2db35b41_float_imputer_py":{"hash":"39d9f6f8c5cf370f79301be635121d9d","index":{"nums":[0,1,42,0,0,0,0,0],"html_filename":"d_8813d29e2db35b41_float_imputer_py.html","relative_filename":"gators/imputers/float_imputer.py"}},"d_8813d29e2db35b41_int_imputer_py":{"hash":"ef4f2373ac4b8ef67364136810e02e7f","index":{"nums":[0,1,37,0,0,0,0,0],"html_filename":"d_8813d29e2db35b41_int_imputer_py.html","relative_filename":"gators/imputers/int_imputer.py"}},"d_8813d29e2db35b41_numerics_imputer_py":{"hash":"ec824df1cd41d175f7856dade29d1a8c","index":{"nums":[0,1,42,0,0,0,0,0],"html_filename":"d_8813d29e2db35b41_numerics_imputer_py.html","relative_filename":"gators/imputers/numerics_imputer.py"}},"d_8813d29e2db35b41_object_imputer_py":{"hash":"53ee9ed7c6c72a225ca0c54c40367e16","index":{"nums":[0,1,33,0,0,0,0,0],"html_filename":"d_8813d29e2db35b41_object_imputer_py.html","relative_filename":"gators/imputers/object_imputer.py"}},"d_c5ff3984fec972b3_hyperopt_py":{"hash":"7def38fc6c94cb1c0161ced6571ce49f","index":{"nums":[0,1,75,0,0,0,0,0],"html_filename":"d_c5ff3984fec972b3_hyperopt_py.html","relative_filename":"gators/model_building/hyperopt.py"}},"d_c5ff3984fec972b3_lgbm_treelite_dumper_py":{"hash":"93158c7a31e00b421544fbfcffab5f55","index":{"nums":[0,1,26,0,0,0,0,0],"html_filename":"d_c5ff3984fec972b3_lgbm_treelite_dumper_py.html","relative_filename":"gators/model_building/lgbm_treelite_dumper.py"}},"d_c5ff3984fec972b3_train_test_split_py":{"hash":"a4d6ba76f82035e70bd1fa288cb831e2","index":{"nums":[0,1,74,0,0,0,0,0],"html_filename":"d_c5ff3984fec972b3_train_test_split_py.html","relative_filename":"gators/model_building/train_test_split.py"}},"d_c5ff3984fec972b3_xgb_booster_builder_py":{"hash":"865f6721a1550571c3428601d525d2b0","index":{"nums":[0,1,21,0,0,0,0,0],"html_filename":"d_c5ff3984fec972b3_xgb_booster_builder_py.html","relative_filename":"gators/model_building/xgb_booster_builder.py"}},"d_c5ff3984fec972b3_xgb_treelite_dumper_py":{"hash":"a8087a6b1bc836717372d28c0a7fd6e5","index":{"nums":[0,1,25,0,0,0,0,0],"html_filename":"d_c5ff3984fec972b3_xgb_treelite_dumper_py.html","relative_filename":"gators/model_building/xgb_treelite_dumper.py"}},"d_3136addfbdc92683_pipeline_py":{"hash":"60188176cfe8c67e14c7925f07ea3a34","index":{"nums":[0,1,81,0,0,0,0,0],"html_filename":"d_3136addfbdc92683_pipeline_py.html","relative_filename":"gators/pipeline/pipeline.py"}},"d_1c8eb3056721e0f7_supervised_sampling_py":{"hash":"167711aae439a416f8a64110e04fd6f1","index":{"nums":[0,1,43,0,0,0,0,0],"html_filename":"d_1c8eb3056721e0f7_supervised_sampling_py.html","relative_filename":"gators/sampling/supervised_sampling.py"}},"d_1c8eb3056721e0f7_unsupervised_sampling_py":{"hash":"20ef08f6f49d00a0374812adf2c75d9e","index":{"nums":[0,1,19,0,0,0,0,0],"html_filename":"d_1c8eb3056721e0f7_unsupervised_sampling_py.html","relative_filename":"gators/sampling/unsupervised_sampling.py"}},"d_b016ed27f73af4c4_minmax_scaler_py":{"hash":"adf3636cefbc22288f5e98b37155be18","index":{"nums":[0,1,31,0,0,0,0,0],"html_filename":"d_b016ed27f73af4c4_minmax_scaler_py.html","relative_filename":"gators/scalers/minmax_scaler.py"}},"d_b016ed27f73af4c4_standard_scaler_py":{"hash":"6f9fae24da83d1bfb4a633f61f45aefa","index":{"nums":[0,1,32,0,0,0,0,0],"html_filename":"d_b016ed27f73af4c4_standard_scaler_py.html","relative_filename":"gators/scalers/standard_scaler.py"}},"d_94684d755a8de1fa_transformer_py":{"hash":"af5daeec78f51d1bfe930c1f5a9eefcc","index":{"nums":[0,1,78,0,0,0,0,0],"html_filename":"d_94684d755a8de1fa_transformer_py.html","relative_filename":"gators/transformers/transformer.py"}},"d_94684d755a8de1fa_transformer_xy_py":{"hash":"850aa09089cbd371e7b1b3ac3603d6dd","index":{"nums":[0,1,25,0,0,0,0,0],"html_filename":"d_94684d755a8de1fa_transformer_xy_py.html","relative_filename":"gators/transformers/transformer_xy.py"}},"d_1cfcd38d8af35d51_util_py":{"hash":"49a650faab2d035aafa752b2400a6a69","index":{"nums":[0,1,71,0,0,0,0,0],"html_filename":"d_1cfcd38d8af35d51_util_py.html","relative_filename":"gators/util/util.py"}}}} \ No newline at end of file +{ + "format": 2, + "version": "6.3.1", + "globals": "a8ae4667b6ae928b290bda3402e3ac95", + "files": { + "d_b13ffdfa7fdfb0fb__base_binning_py": { + "hash": "26914ece6c2a773f0c433a030ddbfc99", + "index": { + "nums": [ + 0, + 1, + 72, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb__base_binning_py.html", + "relative_filename": "gators/binning/_base_binning.py" + } + }, + "d_b13ffdfa7fdfb0fb_bin_factory_py": { + "hash": "8aa1d1a653a747ccfa864ce1f6ee1c1e", + "index": { + "nums": [ + 0, + 1, + 56, + 0, + 56, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_bin_factory_py.html", + "relative_filename": "gators/binning/bin_factory.py" + } + }, + "d_b13ffdfa7fdfb0fb_bin_rare_categories_py": { + "hash": "66f935d9048775f6230cc3dd1df54ad2", + "index": { + "nums": [ + 0, + 1, + 66, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_bin_rare_categories_py.html", + "relative_filename": "gators/binning/bin_rare_categories.py" + } + }, + "d_b13ffdfa7fdfb0fb_bin_single_target_class_categories_py": { + "hash": "22ef7fb6480e54f87cb4fb8cc2a4ee02", + "index": { + "nums": [ + 0, + 1, + 61, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_bin_single_target_class_categories_py.html", + "relative_filename": "gators/binning/bin_single_target_class_categories.py" + } + }, + "d_b13ffdfa7fdfb0fb_binning_py": { + "hash": "71225352555ff5d1e5b8edc925a9cd1a", + "index": { + "nums": [ + 0, + 1, + 24, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_binning_py.html", + "relative_filename": "gators/binning/binning.py" + } + }, + "d_b13ffdfa7fdfb0fb_custom_binning_py": { + "hash": "9300a3c3585fbd5df88bd0ac5342cc1b", + "index": { + "nums": [ + 0, + 1, + 29, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_custom_binning_py.html", + "relative_filename": "gators/binning/custom_binning.py" + } + }, + "d_b13ffdfa7fdfb0fb_quantile_binning_py": { + "hash": "9af2a256675637a5af879d4d7a4fdb66", + "index": { + "nums": [ + 0, + 1, + 26, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_quantile_binning_py.html", + "relative_filename": "gators/binning/quantile_binning.py" + } + }, + "d_b13ffdfa7fdfb0fb_tree_binning_py": { + "hash": "bf7a864f693575eac0cba9f5df45284b", + "index": { + "nums": [ + 0, + 1, + 34, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b13ffdfa7fdfb0fb_tree_binning_py.html", + "relative_filename": "gators/binning/tree_binning.py" + } + }, + "d_06c032577783e370_clipping_py": { + "hash": "3f84004e714a68734405ce266259a989", + "index": { + "nums": [ + 0, + 1, + 37, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_06c032577783e370_clipping_py.html", + "relative_filename": "gators/clipping/clipping.py" + } + }, + "d_e907b401e10b8f1d_to_numpy_py": { + "hash": "58f14322f3eeb547f8cd66a57718cf7e", + "index": { + "nums": [ + 0, + 1, + 12, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_e907b401e10b8f1d_to_numpy_py.html", + "relative_filename": "gators/converter/to_numpy.py" + } + }, + "d_e907b401e10b8f1d_to_pandas_py": { + "hash": "2926894e4e8c649dfde62bf61e7e2ce0", + "index": { + "nums": [ + 0, + 1, + 12, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_e907b401e10b8f1d_to_pandas_py.html", + "relative_filename": "gators/converter/to_pandas.py" + } + }, + "d_d9c8a9d49d9efff0__base_data_cleaning_py": { + "hash": "11d5be73f0fd624d4d6f98c7ce186960", + "index": { + "nums": [ + 0, + 1, + 25, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0__base_data_cleaning_py.html", + "relative_filename": "gators/data_cleaning/_base_data_cleaning.py" + } + }, + "d_d9c8a9d49d9efff0_convert_column_datatype_py": { + "hash": "d569303b34dcfaf3e8a4329e4c631ab0", + "index": { + "nums": [ + 0, + 1, + 27, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_convert_column_datatype_py.html", + "relative_filename": "gators/data_cleaning/convert_column_datatype.py" + } + }, + "d_d9c8a9d49d9efff0_drop_columns_py": { + "hash": "4e5356aa0f1ef9f3e826ad7dd659126c", + "index": { + "nums": [ + 0, + 1, + 15, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_drop_columns_py.html", + "relative_filename": "gators/data_cleaning/drop_columns.py" + } + }, + "d_d9c8a9d49d9efff0_drop_datatype_columns_py": { + "hash": "f71dea5eacdb97ca53eb587c7d64375b", + "index": { + "nums": [ + 0, + 1, + 16, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_drop_datatype_columns_py.html", + "relative_filename": "gators/data_cleaning/drop_datatype_columns.py" + } + }, + "d_d9c8a9d49d9efff0_drop_high_cardinality_py": { + "hash": "b6ebdb86e855c32f77979583daa1c75f", + "index": { + "nums": [ + 0, + 1, + 26, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_drop_high_cardinality_py.html", + "relative_filename": "gators/data_cleaning/drop_high_cardinality.py" + } + }, + "d_d9c8a9d49d9efff0_drop_high_nan_ratio_py": { + "hash": "9380c3b77be893b11afc289255d3f952", + "index": { + "nums": [ + 0, + 1, + 21, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_drop_high_nan_ratio_py.html", + "relative_filename": "gators/data_cleaning/drop_high_nan_ratio.py" + } + }, + "d_d9c8a9d49d9efff0_drop_low_cardinality_py": { + "hash": "6ceccb4bba464b2a5914476f0b0af38f", + "index": { + "nums": [ + 0, + 1, + 25, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_drop_low_cardinality_py.html", + "relative_filename": "gators/data_cleaning/drop_low_cardinality.py" + } + }, + "d_d9c8a9d49d9efff0_keep_columns_py": { + "hash": "ffccc6f772113baef570a1ef6461b4da", + "index": { + "nums": [ + 0, + 1, + 16, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_keep_columns_py.html", + "relative_filename": "gators/data_cleaning/keep_columns.py" + } + }, + "d_d9c8a9d49d9efff0_rename_columns_py": { + "hash": "8fdfcd83486803658bbfb31a46a43ffa", + "index": { + "nums": [ + 0, + 1, + 21, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_rename_columns_py.html", + "relative_filename": "gators/data_cleaning/rename_columns.py" + } + }, + "d_d9c8a9d49d9efff0_replace_py": { + "hash": "345589b5160a6081ca015cc0e32b160c", + "index": { + "nums": [ + 0, + 1, + 45, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_d9c8a9d49d9efff0_replace_py.html", + "relative_filename": "gators/data_cleaning/replace.py" + } + }, + "d_2e7b559919172292__base_encoder_py": { + "hash": "320b74c71f171143af62fc1a2d9313df", + "index": { + "nums": [ + 0, + 1, + 74, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292__base_encoder_py.html", + "relative_filename": "gators/encoders/_base_encoder.py" + } + }, + "d_2e7b559919172292_binned_columns_encoder_py": { + "hash": "03c8e70eacc657fe44a6d8e776961f51", + "index": { + "nums": [ + 0, + 1, + 38, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292_binned_columns_encoder_py.html", + "relative_filename": "gators/encoders/binned_columns_encoder.py" + } + }, + "d_2e7b559919172292_frequency_encoder_py": { + "hash": "640ba30ab11e472f6a8c1ae166952326", + "index": { + "nums": [ + 0, + 1, + 27, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292_frequency_encoder_py.html", + "relative_filename": "gators/encoders/frequency_encoder.py" + } + }, + "d_2e7b559919172292_onehot_encoder_py": { + "hash": "74f3bf07a46c1da292287539525c8219", + "index": { + "nums": [ + 0, + 1, + 52, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292_onehot_encoder_py.html", + "relative_filename": "gators/encoders/onehot_encoder.py" + } + }, + "d_2e7b559919172292_ordinal_encoder_py": { + "hash": "c2bc736ae6fc26b5f29ada7c152b6544", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292_ordinal_encoder_py.html", + "relative_filename": "gators/encoders/ordinal_encoder.py" + } + }, + "d_2e7b559919172292_target_encoder_py": { + "hash": "643817ad4816a96e5aca9078229419f4", + "index": { + "nums": [ + 0, + 1, + 31, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292_target_encoder_py.html", + "relative_filename": "gators/encoders/target_encoder.py" + } + }, + "d_2e7b559919172292_woe_encoder_py": { + "hash": "866c8ee236a7dfe775a6adc7fcce79c1", + "index": { + "nums": [ + 0, + 1, + 34, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_2e7b559919172292_woe_encoder_py.html", + "relative_filename": "gators/encoders/woe_encoder.py" + } + }, + "d_bafb7a187804c98b__base_feature_generation_py": { + "hash": "51b13fee9668ed7338e3f73e2bf33158", + "index": { + "nums": [ + 0, + 1, + 11, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b__base_feature_generation_py.html", + "relative_filename": "gators/feature_generation/_base_feature_generation.py" + } + }, + "d_bafb7a187804c98b_cluster_statistics_py": { + "hash": "ae4a4ad5ba2c8cb69908566af8345c4f", + "index": { + "nums": [ + 0, + 1, + 61, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_cluster_statistics_py.html", + "relative_filename": "gators/feature_generation/cluster_statistics.py" + } + }, + "d_bafb7a187804c98b_elementary_arithmethics_py": { + "hash": "1866477479163e8d8df5950ecf7b303a", + "index": { + "nums": [ + 0, + 1, + 79, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_elementary_arithmethics_py.html", + "relative_filename": "gators/feature_generation/elementary_arithmethics.py" + } + }, + "d_bafb7a187804c98b_is_equal_py": { + "hash": "f5813e5e492a9dc0136d8be816bf0fdf", + "index": { + "nums": [ + 0, + 1, + 44, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_is_equal_py.html", + "relative_filename": "gators/feature_generation/is_equal.py" + } + }, + "d_bafb7a187804c98b_is_null_py": { + "hash": "21fa2fab313a08cd1ff24568838d1055", + "index": { + "nums": [ + 0, + 1, + 38, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_is_null_py.html", + "relative_filename": "gators/feature_generation/is_null.py" + } + }, + "d_bafb7a187804c98b_one_hot_py": { + "hash": "04b05485972691f304e8ef60223b36e1", + "index": { + "nums": [ + 0, + 1, + 39, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_one_hot_py.html", + "relative_filename": "gators/feature_generation/one_hot.py" + } + }, + "d_bafb7a187804c98b_plane_rotation_py": { + "hash": "2bd3bc532990cc62940a4de9fac8b509", + "index": { + "nums": [ + 0, + 1, + 52, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_plane_rotation_py.html", + "relative_filename": "gators/feature_generation/plane_rotation.py" + } + }, + "d_bafb7a187804c98b_polynomial_features_py": { + "hash": "fec431fefb71a13f5dbc9a55ad44c644", + "index": { + "nums": [ + 0, + 1, + 54, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_polynomial_features_py.html", + "relative_filename": "gators/feature_generation/polynomial_features.py" + } + }, + "d_bafb7a187804c98b_polynomial_object_features_py": { + "hash": "8118ec3ec2508359f08b6dd4729024d0", + "index": { + "nums": [ + 0, + 1, + 46, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_polynomial_object_features_py.html", + "relative_filename": "gators/feature_generation/polynomial_object_features.py" + } + }, + "d_603dd87602f86b7b__base_datetime_feature_py": { + "hash": "7e86d017d452b09ab212c88fb57a7f3e", + "index": { + "nums": [ + 0, + 1, + 43, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b__base_datetime_feature_py.html", + "relative_filename": "gators/feature_generation_dt/_base_datetime_feature.py" + } + }, + "d_603dd87602f86b7b_cyclic_day_of_month_py": { + "hash": "d01352f3fb9af8b923900d38c3372c2a", + "index": { + "nums": [ + 0, + 1, + 30, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_cyclic_day_of_month_py.html", + "relative_filename": "gators/feature_generation_dt/cyclic_day_of_month.py" + } + }, + "d_603dd87602f86b7b_cyclic_day_of_week_py": { + "hash": "e9e81574645dcc97e222a7f32af7a997", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_cyclic_day_of_week_py.html", + "relative_filename": "gators/feature_generation_dt/cyclic_day_of_week.py" + } + }, + "d_603dd87602f86b7b_cyclic_hour_of_day_py": { + "hash": "0dbf8d81cadb2b390e41057e80919766", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_cyclic_hour_of_day_py.html", + "relative_filename": "gators/feature_generation_dt/cyclic_hour_of_day.py" + } + }, + "d_603dd87602f86b7b_cyclic_minute_of_hour_py": { + "hash": "d70c9ffbcae64778661ca49b34a5781b", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_cyclic_minute_of_hour_py.html", + "relative_filename": "gators/feature_generation_dt/cyclic_minute_of_hour.py" + } + }, + "d_603dd87602f86b7b_cyclic_month_of_year_py": { + "hash": "1539a4d7fd3d836c769103d00e66186d", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_cyclic_month_of_year_py.html", + "relative_filename": "gators/feature_generation_dt/cyclic_month_of_year.py" + } + }, + "d_603dd87602f86b7b_delta_time_py": { + "hash": "5d2f4d347f8bcd9684061e7989fd3bf3", + "index": { + "nums": [ + 0, + 1, + 44, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_delta_time_py.html", + "relative_filename": "gators/feature_generation_dt/delta_time.py" + } + }, + "d_603dd87602f86b7b_ordinal_day_of_month_py": { + "hash": "909d21ab32818fc65e5dc018a8e1dc8e", + "index": { + "nums": [ + 0, + 1, + 23, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_ordinal_day_of_month_py.html", + "relative_filename": "gators/feature_generation_dt/ordinal_day_of_month.py" + } + }, + "d_603dd87602f86b7b_ordinal_day_of_week_py": { + "hash": "d9379172a854f33ec143fd57ba01d273", + "index": { + "nums": [ + 0, + 1, + 23, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_ordinal_day_of_week_py.html", + "relative_filename": "gators/feature_generation_dt/ordinal_day_of_week.py" + } + }, + "d_603dd87602f86b7b_ordinal_hour_of_day_py": { + "hash": "035954a36ca81419c0e54747875e77b4", + "index": { + "nums": [ + 0, + 1, + 22, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_ordinal_hour_of_day_py.html", + "relative_filename": "gators/feature_generation_dt/ordinal_hour_of_day.py" + } + }, + "d_603dd87602f86b7b_ordinal_minute_of_hour_py": { + "hash": "285b4e390e8e9bcafc0acddf07e15e43", + "index": { + "nums": [ + 0, + 1, + 22, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_ordinal_minute_of_hour_py.html", + "relative_filename": "gators/feature_generation_dt/ordinal_minute_of_hour.py" + } + }, + "d_603dd87602f86b7b_ordinal_month_of_year_py": { + "hash": "827535d666b5cc2ffe3f3643d0f021d7", + "index": { + "nums": [ + 0, + 1, + 22, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_603dd87602f86b7b_ordinal_month_of_year_py.html", + "relative_filename": "gators/feature_generation_dt/ordinal_month_of_year.py" + } + }, + "d_6c98d578b789a2c0__base_string_feature_py": { + "hash": "842f56f0d3b46a1a9344bae6455d469e", + "index": { + "nums": [ + 0, + 1, + 24, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0__base_string_feature_py.html", + "relative_filename": "gators/feature_generation_str/_base_string_feature.py" + } + }, + "d_6c98d578b789a2c0_extract_py": { + "hash": "7e945ac8e3167525ae222f803d973272", + "index": { + "nums": [ + 0, + 1, + 31, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0_extract_py.html", + "relative_filename": "gators/feature_generation_str/extract.py" + } + }, + "d_6c98d578b789a2c0_lower_case_py": { + "hash": "e49611f8116a70db1eeaece7ca80cab3", + "index": { + "nums": [ + 0, + 1, + 29, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0_lower_case_py.html", + "relative_filename": "gators/feature_generation_str/lower_case.py" + } + }, + "d_6c98d578b789a2c0_split_extract_py": { + "hash": "0e7ced98f79e614571791bda6ce6842a", + "index": { + "nums": [ + 0, + 1, + 34, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0_split_extract_py.html", + "relative_filename": "gators/feature_generation_str/split_extract.py" + } + }, + "d_6c98d578b789a2c0_contains_py": { + "hash": "c65ac8e6eeceea9789ca2e4fcf4daf60", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0_contains_py.html", + "relative_filename": "gators/feature_generation_str/contains.py" + } + }, + "d_6c98d578b789a2c0_length_py": { + "hash": "00aace14f656de873cf90e24fedff106", + "index": { + "nums": [ + 0, + 1, + 21, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0_length_py.html", + "relative_filename": "gators/feature_generation_str/length.py" + } + }, + "d_6c98d578b789a2c0_upper_case_py": { + "hash": "5f2ff14fd5e323fdd7680dcc187486b8", + "index": { + "nums": [ + 0, + 1, + 29, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_6c98d578b789a2c0_upper_case_py.html", + "relative_filename": "gators/feature_generation_str/upper_case.py" + } + }, + "d_77d5126526bda421__base_feature_selection_py": { + "hash": "a7f373d70c75fd402d0c9bea359e3e5d", + "index": { + "nums": [ + 0, + 1, + 22, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421__base_feature_selection_py.html", + "relative_filename": "gators/feature_selection/_base_feature_selection.py" + } + }, + "d_77d5126526bda421_correlation_filter_py": { + "hash": "27e14c936aebc3a31c1b14eda2dd8cc9", + "index": { + "nums": [ + 0, + 1, + 24, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421_correlation_filter_py.html", + "relative_filename": "gators/feature_selection/correlation_filter.py" + } + }, + "d_77d5126526bda421_information_value_py": { + "hash": "925b0653c210f29f6c6249db734105e7", + "index": { + "nums": [ + 0, + 1, + 38, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421_information_value_py.html", + "relative_filename": "gators/feature_selection/information_value.py" + } + }, + "d_77d5126526bda421_select_from_model_py": { + "hash": "0cc113a3c79f7593135931416d34ad8d", + "index": { + "nums": [ + 0, + 1, + 24, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421_select_from_model_py.html", + "relative_filename": "gators/feature_selection/select_from_model.py" + } + }, + "d_77d5126526bda421_select_from_models_py": { + "hash": "39606d8b46bee0ad13aa7a3c621ef5c1", + "index": { + "nums": [ + 0, + 1, + 47, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421_select_from_models_py.html", + "relative_filename": "gators/feature_selection/select_from_models.py" + } + }, + "d_77d5126526bda421_variance_filter_py": { + "hash": "b4478a3b58db575d6d704f479ab6595a", + "index": { + "nums": [ + 0, + 1, + 18, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421_variance_filter_py.html", + "relative_filename": "gators/feature_selection/variance_filter.py" + } + }, + "d_8813d29e2db35b41__base_imputer_py": { + "hash": "8741b64d3ba3056c418a4885b73155ab", + "index": { + "nums": [ + 0, + 1, + 48, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_8813d29e2db35b41__base_imputer_py.html", + "relative_filename": "gators/imputers/_base_imputer.py" + } + }, + "d_8813d29e2db35b41_Numeric_imputer_py": { + "hash": "e058b03222200855dfa4ec31016c7822", + "index": { + "nums": [ + 0, + 1, + 39, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_8813d29e2db35b41_Numeric_imputer_py.html", + "relative_filename": "gators/imputers/Numeric_imputer.py" + } + }, + "d_8813d29e2db35b41_object_imputer_py": { + "hash": "15c20c8b09a2caca08b4a7f7969b3b3b", + "index": { + "nums": [ + 0, + 1, + 35, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_8813d29e2db35b41_object_imputer_py.html", + "relative_filename": "gators/imputers/object_imputer.py" + } + }, + "d_c5ff3984fec972b3_lgbm_treelite_dumper_py": { + "hash": "29918689ed3a23b0982828461c2955fd", + "index": { + "nums": [ + 0, + 1, + 26, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_c5ff3984fec972b3_lgbm_treelite_dumper_py.html", + "relative_filename": "gators/model_building/lgbm_treelite_dumper.py" + } + }, + "d_c5ff3984fec972b3_model_py": { + "hash": "9750e7744a623eba821896ba53ea1049", + "index": { + "nums": [ + 0, + 1, + 13, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_c5ff3984fec972b3_model_py.html", + "relative_filename": "gators/model_building/model.py" + } + }, + "d_c5ff3984fec972b3_train_test_split_py": { + "hash": "34a329bc141a1d196d067ee539917cc6", + "index": { + "nums": [ + 0, + 1, + 41, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_c5ff3984fec972b3_train_test_split_py.html", + "relative_filename": "gators/model_building/train_test_split.py" + } + }, + "d_c5ff3984fec972b3_xgb_booster_builder_py": { + "hash": "3beccd1d10253b892869dce8c3a0373e", + "index": { + "nums": [ + 0, + 1, + 21, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_c5ff3984fec972b3_xgb_booster_builder_py.html", + "relative_filename": "gators/model_building/xgb_booster_builder.py" + } + }, + "d_c5ff3984fec972b3_xgb_treelite_dumper_py": { + "hash": "9854e8f247b8a4d95b15ad07f6a81551", + "index": { + "nums": [ + 0, + 1, + 23, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_c5ff3984fec972b3_xgb_treelite_dumper_py.html", + "relative_filename": "gators/model_building/xgb_treelite_dumper.py" + } + }, + "d_3136addfbdc92683_pipeline_py": { + "hash": "67096fa0939dc5a61fc531c6ffecac45", + "index": { + "nums": [ + 0, + 1, + 21, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_3136addfbdc92683_pipeline_py.html", + "relative_filename": "gators/pipeline/pipeline.py" + } + }, + "d_1c8eb3056721e0f7_supervised_sampling_py": { + "hash": "976e6262f36c7b797323691961e39a3a", + "index": { + "nums": [ + 0, + 1, + 28, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_1c8eb3056721e0f7_supervised_sampling_py.html", + "relative_filename": "gators/sampling/supervised_sampling.py" + } + }, + "d_1c8eb3056721e0f7_unsupervised_sampling_py": { + "hash": "8b00b62c0215903ef3f277b688c34428", + "index": { + "nums": [ + 0, + 1, + 18, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_1c8eb3056721e0f7_unsupervised_sampling_py.html", + "relative_filename": "gators/sampling/unsupervised_sampling.py" + } + }, + "d_b016ed27f73af4c4__base_scaler_py": { + "hash": "745cbfadf21c892b197d307e55b271d8", + "index": { + "nums": [ + 0, + 1, + 24, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b016ed27f73af4c4__base_scaler_py.html", + "relative_filename": "gators/scalers/_base_scaler.py" + } + }, + "d_b016ed27f73af4c4_minmax_scaler_py": { + "hash": "18a73ce4ec355ca6c8eb2e9a1a70fb26", + "index": { + "nums": [ + 0, + 1, + 21, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b016ed27f73af4c4_minmax_scaler_py.html", + "relative_filename": "gators/scalers/minmax_scaler.py" + } + }, + "d_b016ed27f73af4c4_standard_scaler_py": { + "hash": "8e7ae7cda7c7fc2b27399c616b0cb039", + "index": { + "nums": [ + 0, + 1, + 19, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b016ed27f73af4c4_standard_scaler_py.html", + "relative_filename": "gators/scalers/standard_scaler.py" + } + }, + "d_b016ed27f73af4c4_yeo_johnson_py": { + "hash": "6cb324d0f9b4433b8acfa6da23e56222", + "index": { + "nums": [ + 0, + 1, + 42, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_b016ed27f73af4c4_yeo_johnson_py.html", + "relative_filename": "gators/scalers/yeo_johnson.py" + } + }, + "d_94684d755a8de1fa_transformer_py": { + "hash": "8f2862506adc9806087478ab53d6da16", + "index": { + "nums": [ + 0, + 1, + 81, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_94684d755a8de1fa_transformer_py.html", + "relative_filename": "gators/transformers/transformer.py" + } + }, + "d_94684d755a8de1fa_transformer_xy_py": { + "hash": "be2601c1f879a137e30089d040314de6", + "index": { + "nums": [ + 0, + 1, + 20, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_94684d755a8de1fa_transformer_xy_py.html", + "relative_filename": "gators/transformers/transformer_xy.py" + } + }, + "d_1cfcd38d8af35d51_iv_py": { + "hash": "7e7e23dbaeb225e867983126ca5b3707", + "index": { + "nums": [ + 0, + 1, + 19, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_1cfcd38d8af35d51_iv_py.html", + "relative_filename": "gators/util/iv.py" + } + }, + "d_1cfcd38d8af35d51_util_py": { + "hash": "1f1cfca69a555c32d270d81f0d9acb79", + "index": { + "nums": [ + 0, + 1, + 290, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_1cfcd38d8af35d51_util_py.html", + "relative_filename": "gators/util/util.py" + } + }, + "d_77d5126526bda421_supervized_correlation_filter_py": { + "hash": "db0cf0dd7f92bc2c2ac3497d7a38cb40", + "index": { + "nums": [ + 0, + 1, + 36, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_77d5126526bda421_supervized_correlation_filter_py.html", + "relative_filename": "gators/feature_selection/supervized_correlation_filter.py" + } + }, + "d_06c032577783e370_quantile_clipping_py": { + "hash": "2b20516d90e3163a3df55b2a0a652cd0", + "index": { + "nums": [ + 0, + 1, + 42, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_06c032577783e370_quantile_clipping_py.html", + "relative_filename": "gators/clipping/quantile_clipping.py" + } + }, + "d_bafb7a187804c98b_plan_rotation_py": { + "hash": "259f4d3f6ba6a6f51716955e8145baf2", + "index": { + "nums": [ + 0, + 1, + 52, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_bafb7a187804c98b_plan_rotation_py.html", + "relative_filename": "gators/feature_generation/plan_rotation.py" + } + }, + "d_8813d29e2db35b41_numeric_imputer_py": { + "hash": "af93e30fb1fe138d078aa7bbbc8508ad", + "index": { + "nums": [ + 0, + 1, + 39, + 0, + 0, + 0, + 0, + 0 + ], + "html_filename": "d_8813d29e2db35b41_numeric_imputer_py.html", + "relative_filename": "gators/imputers/numeric_imputer.py" + } + } + } +} \ No newline at end of file diff --git a/cov_html/style.css b/cov_html/style.css index 7f8e32ab..cca6f11f 100644 --- a/cov_html/style.css +++ b/cov_html/style.css @@ -28,23 +28,39 @@ a.nav { text-decoration: none; color: inherit; } a.nav:hover { text-decoration: underline; color: inherit; } -#header { background: #f8f8f8; width: 100%; border-bottom: 1px solid #eee; } +header { background: #f8f8f8; width: 100%; z-index: 2; border-bottom: 1px solid #ccc; } -@media (prefers-color-scheme: dark) { #header { background: black; } } +@media (prefers-color-scheme: dark) { header { background: black; } } -@media (prefers-color-scheme: dark) { #header { border-color: #333; } } +@media (prefers-color-scheme: dark) { header { border-color: #333; } } -.indexfile #footer { margin: 1rem 3.5rem; } +header .content { padding: 1rem 3.5rem; } -.pyfile #footer { margin: 1rem 1rem; } +header h2 { margin-top: .5em; font-size: 1em; } -#footer .content { padding: 0; color: #666; font-style: italic; } +header.sticky { position: fixed; left: 0; right: 0; height: 2.5em; } -@media (prefers-color-scheme: dark) { #footer .content { color: #aaa; } } +header.sticky .text { display: none; } -#index { margin: 1rem 0 0 3.5rem; } +header.sticky h1, header.sticky h2 { font-size: 1em; margin-top: 0; display: inline-block; } + +header.sticky .content { padding: 0.5rem 3.5rem; } + +header.sticky .content p { font-size: 1em; } + +header.sticky ~ #source { padding-top: 6.5em; } + +main { position: relative; z-index: 1; } + +.indexfile footer { margin: 1rem 3.5rem; } + +.pyfile footer { margin: 1rem 1rem; } -#header .content { padding: 1rem 3.5rem; } +footer .content { padding: 0; color: #666; font-style: italic; } + +@media (prefers-color-scheme: dark) { footer .content { color: #aaa; } } + +#index { margin: 1rem 0 0 3.5rem; } h1 { font-size: 1.25em; display: inline-block; } @@ -60,67 +76,67 @@ h1 { font-size: 1.25em; display: inline-block; } #filter_container input:focus { border-color: #007acc; } -h2.stats { margin-top: .5em; font-size: 1em; } +header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; color: inherit; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } -.stats button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; color: inherit; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } +@media (prefers-color-scheme: dark) { header button { border-color: #444; } } -@media (prefers-color-scheme: dark) { .stats button { border-color: #444; } } +header button:active, header button:focus { outline: 2px dashed #007acc; } -.stats button:active, .stats button:focus { outline: 2px dashed #007acc; } +header button.run { background: #eeffee; } -.stats button:active, .stats button:focus { outline: 2px dashed #007acc; } +@media (prefers-color-scheme: dark) { header button.run { background: #373d29; } } -.stats button.run { background: #eeffee; } +header button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; } -@media (prefers-color-scheme: dark) { .stats button.run { background: #373d29; } } +@media (prefers-color-scheme: dark) { header button.run.show_run { background: #373d29; } } -.stats button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; } +header button.mis { background: #ffeeee; } -@media (prefers-color-scheme: dark) { .stats button.run.show_run { background: #373d29; } } +@media (prefers-color-scheme: dark) { header button.mis { background: #4b1818; } } -.stats button.mis { background: #ffeeee; } +header button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; } -@media (prefers-color-scheme: dark) { .stats button.mis { background: #4b1818; } } +@media (prefers-color-scheme: dark) { header button.mis.show_mis { background: #4b1818; } } -.stats button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; } +header button.exc { background: #f7f7f7; } -@media (prefers-color-scheme: dark) { .stats button.mis.show_mis { background: #4b1818; } } +@media (prefers-color-scheme: dark) { header button.exc { background: #333; } } -.stats button.exc { background: #f7f7f7; } +header button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; } -@media (prefers-color-scheme: dark) { .stats button.exc { background: #333; } } +@media (prefers-color-scheme: dark) { header button.exc.show_exc { background: #333; } } -.stats button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; } +header button.par { background: #ffffd5; } -@media (prefers-color-scheme: dark) { .stats button.exc.show_exc { background: #333; } } +@media (prefers-color-scheme: dark) { header button.par { background: #650; } } -.stats button.par { background: #ffffd5; } +header button.par.show_par { background: #ffa; border: 2px solid #bbbb00; margin: 0 .1em; } -@media (prefers-color-scheme: dark) { .stats button.par { background: #650; } } +@media (prefers-color-scheme: dark) { header button.par.show_par { background: #650; } } -.stats button.par.show_par { background: #ffa; border: 2px solid #dddd00; margin: 0 .1em; } +#help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; } -@media (prefers-color-scheme: dark) { .stats button.par.show_par { background: #650; } } +#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; } -.help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; } +#help_panel_wrapper { float: right; position: relative; } -#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; } +#keyboard_icon { margin: 5px; } -#keyboard_icon { float: right; margin: 5px; cursor: pointer; } +#help_panel_state { display: none; } -.help_panel { padding: .75em; border: 1px solid #883; } +#help_panel { top: 25px; right: 0; padding: .75em; border: 1px solid #883; } -.help_panel .legend { font-style: italic; margin-bottom: 1em; } +#help_panel .legend { font-style: italic; margin-bottom: 1em; } -.indexfile .help_panel { width: 25em; } +.indexfile #help_panel { width: 25em; } -.pyfile .help_panel { width: 18em; } +.pyfile #help_panel { width: 18em; } -#panel_icon { float: right; cursor: pointer; } +#help_panel_state:checked ~ #help_panel { display: block; } .keyhelp { margin-top: .75em; } -.keyhelp .key { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; } +kbd { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; border-radius: 3px; } #source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; } @@ -132,7 +148,9 @@ h2.stats { margin-top: .5em; font-size: 1em; } @media (prefers-color-scheme: dark) { #source p .n { color: #777; } } -#source p .n a { text-decoration: none; color: #999; } +#source p .n.highlight { background: #ffdd00; } + +#source p .n a { margin-top: -4em; padding-top: 4em; text-decoration: none; color: #999; } @media (prefers-color-scheme: dark) { #source p .n a { color: #777; } } @@ -140,8 +158,6 @@ h2.stats { margin-top: .5em; font-size: 1em; } @media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } } -#source p.highlight .n { background: #ffdd00; } - #source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; } @media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } } @@ -154,13 +170,13 @@ h2.stats { margin-top: .5em; font-size: 1em; } #source p .t .com { color: #008000; font-style: italic; line-height: 1px; } -@media (prefers-color-scheme: dark) { #source p .t .com { color: #6A9955; } } +@media (prefers-color-scheme: dark) { #source p .t .com { color: #6a9955; } } #source p .t .key { font-weight: bold; line-height: 1px; } -#source p .t .str { color: #0451A5; } +#source p .t .str { color: #0451a5; } -@media (prefers-color-scheme: dark) { #source p .t .str { color: #9CDCFE; } } +@media (prefers-color-scheme: dark) { #source p .t .str { color: #9cdcfe; } } #source p.mis .t { border-left: 0.2em solid #ff0000; } @@ -192,7 +208,7 @@ h2.stats { margin-top: .5em; font-size: 1em; } @media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } } -#source p.par .t { border-left: 0.2em solid #dddd00; } +#source p.par .t { border-left: 0.2em solid #bbbb00; } #source p.par.show_par .t { background: #ffa; } @@ -218,13 +234,13 @@ h2.stats { margin-top: .5em; font-size: 1em; } #source p input ~ .r label.ctx::before { content: "▶ "; } -#source p input ~ .r label.ctx:hover { background: #d5f7ff; color: #666; } +#source p input ~ .r label.ctx:hover { background: #e8f4ff; color: #666; } @media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } } @media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } } -#source p input:checked ~ .r label.ctx { background: #aef; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; } +#source p input:checked ~ .r label.ctx { background: #d0e8ff; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; } @media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } } @@ -238,7 +254,7 @@ h2.stats { margin-top: .5em; font-size: 1em; } @media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } } -#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #aef; border-radius: .25em; margin-right: 1.75em; } +#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #d0e8ff; border-radius: .25em; margin-right: 1.75em; } @media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } } @@ -262,13 +278,13 @@ h2.stats { margin-top: .5em; font-size: 1em; } @media (prefers-color-scheme: dark) { #index th:hover { background: #333; } } -#index th.headerSortDown, #index th.headerSortUp { white-space: nowrap; background: #eee; } +#index th[aria-sort="ascending"], #index th[aria-sort="descending"] { white-space: nowrap; background: #eee; padding-left: .5em; } -@media (prefers-color-scheme: dark) { #index th.headerSortDown, #index th.headerSortUp { background: #333; } } +@media (prefers-color-scheme: dark) { #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { background: #333; } } -#index th.headerSortDown:after { content: " ↑"; } +#index th[aria-sort="ascending"]::after { font-family: sans-serif; content: " ↑"; } -#index th.headerSortUp:after { content: " ↓"; } +#index th[aria-sort="descending"]::after { font-family: sans-serif; content: " ↓"; } #index td.name a { text-decoration: none; color: inherit; } @@ -280,7 +296,7 @@ h2.stats { margin-top: .5em; font-size: 1em; } #index tr.file:hover td.name { text-decoration: underline; color: inherit; } -#scroll_marker { position: fixed; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; } +#scroll_marker { position: fixed; z-index: 3; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; } @media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } } diff --git a/data_cleaning.cpython-38-darwin.so b/data_cleaning.cpython-38-darwin.so deleted file mode 100755 index 2c343efa..00000000 Binary files a/data_cleaning.cpython-38-darwin.so and /dev/null differ diff --git a/dist/gators-0.1.0-cp38-cp38-macosx_10_9_x86_64.whl b/dist/gators-0.1.0-cp38-cp38-macosx_10_9_x86_64.whl deleted file mode 100644 index 070fe67d..00000000 Binary files a/dist/gators-0.1.0-cp38-cp38-macosx_10_9_x86_64.whl and /dev/null differ diff --git a/doc_data/_gators.png b/doc_data/_gators.png deleted file mode 100644 index 90b985e4..00000000 Binary files a/doc_data/_gators.png and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/BinRareEvents.jpg b/doc_data/benchmarking_pandas_numpy/BinRareEvents.jpg deleted file mode 100644 index ab3d6bf5..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/BinRareEvents.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/Clipping.jpg b/doc_data/benchmarking_pandas_numpy/Clipping.jpg deleted file mode 100644 index 0c533fc4..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/Clipping.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/ClusterStatistics.jpg b/doc_data/benchmarking_pandas_numpy/ClusterStatistics.jpg deleted file mode 100644 index fba90fcd..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/ClusterStatistics.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/CustomDiscretizer.jpg b/doc_data/benchmarking_pandas_numpy/CustomDiscretizer.jpg deleted file mode 100644 index c5cc7c73..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/CustomDiscretizer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/CyclicDayOfMonth.jpg b/doc_data/benchmarking_pandas_numpy/CyclicDayOfMonth.jpg deleted file mode 100644 index 539e4ff1..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/CyclicDayOfMonth.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/CyclicDayOfWeek.jpg b/doc_data/benchmarking_pandas_numpy/CyclicDayOfWeek.jpg deleted file mode 100644 index 8bf20478..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/CyclicDayOfWeek.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/CyclicHourOfDay.jpg b/doc_data/benchmarking_pandas_numpy/CyclicHourOfDay.jpg deleted file mode 100644 index 07c10493..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/CyclicHourOfDay.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/CyclicMinuteOfHour.jpg b/doc_data/benchmarking_pandas_numpy/CyclicMinuteOfHour.jpg deleted file mode 100644 index 5f350af9..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/CyclicMinuteOfHour.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/CyclicMonthOfYear.jpg b/doc_data/benchmarking_pandas_numpy/CyclicMonthOfYear.jpg deleted file mode 100644 index 8c703e6b..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/CyclicMonthOfYear.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/DeltaTime.jpg b/doc_data/benchmarking_pandas_numpy/DeltaTime.jpg deleted file mode 100644 index 00913ab0..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/DeltaTime.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/Discretizer.jpg b/doc_data/benchmarking_pandas_numpy/Discretizer.jpg deleted file mode 100644 index 44faf394..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/Discretizer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/DropColumns.jpg b/doc_data/benchmarking_pandas_numpy/DropColumns.jpg deleted file mode 100644 index 8f2f235a..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/DropColumns.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/DropDatatypeColumns.jpg b/doc_data/benchmarking_pandas_numpy/DropDatatypeColumns.jpg deleted file mode 100644 index 2556c950..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/DropDatatypeColumns.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/DropHighCardinality.jpg b/doc_data/benchmarking_pandas_numpy/DropHighCardinality.jpg deleted file mode 100644 index b1b16b45..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/DropHighCardinality.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/DropHighNaNRatio.jpg b/doc_data/benchmarking_pandas_numpy/DropHighNaNRatio.jpg deleted file mode 100644 index a51dfa79..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/DropHighNaNRatio.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/DropLowCardinality.jpg b/doc_data/benchmarking_pandas_numpy/DropLowCardinality.jpg deleted file mode 100644 index 4191f1d3..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/DropLowCardinality.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/ElementaryArithmetics.jpg b/doc_data/benchmarking_pandas_numpy/ElementaryArithmetics.jpg deleted file mode 100644 index d5b11966..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/ElementaryArithmetics.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/Extract.jpg b/doc_data/benchmarking_pandas_numpy/Extract.jpg deleted file mode 100644 index 9aa9add4..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/Extract.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/FloatImputer.jpg b/doc_data/benchmarking_pandas_numpy/FloatImputer.jpg deleted file mode 100644 index d3cd980b..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/FloatImputer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/IntImputer.jpg b/doc_data/benchmarking_pandas_numpy/IntImputer.jpg deleted file mode 100644 index 6f00f1cf..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/IntImputer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/IsEqual.jpg b/doc_data/benchmarking_pandas_numpy/IsEqual.jpg deleted file mode 100644 index dc48ef8c..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/IsEqual.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/IsNull.jpg b/doc_data/benchmarking_pandas_numpy/IsNull.jpg deleted file mode 100644 index 88215cd1..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/IsNull.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/KeepColumns.jpg b/doc_data/benchmarking_pandas_numpy/KeepColumns.jpg deleted file mode 100644 index 06f56a9b..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/KeepColumns.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/LowerCase.jpg b/doc_data/benchmarking_pandas_numpy/LowerCase.jpg deleted file mode 100644 index 4c4a6aa5..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/LowerCase.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/MinMaxScaler.jpg b/doc_data/benchmarking_pandas_numpy/MinMaxScaler.jpg deleted file mode 100644 index 9e28708e..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/MinMaxScaler.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/NumericsImputer.jpg b/doc_data/benchmarking_pandas_numpy/NumericsImputer.jpg deleted file mode 100644 index 29019785..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/NumericsImputer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/ObjectImputer.jpg b/doc_data/benchmarking_pandas_numpy/ObjectImputer.jpg deleted file mode 100644 index 83359226..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/ObjectImputer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OneHot.jpg b/doc_data/benchmarking_pandas_numpy/OneHot.jpg deleted file mode 100644 index cabd4ca2..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OneHot.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OneHotEncoder.jpg b/doc_data/benchmarking_pandas_numpy/OneHotEncoder.jpg deleted file mode 100644 index 23192477..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OneHotEncoder.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OrdinalDayOfMonth.jpg b/doc_data/benchmarking_pandas_numpy/OrdinalDayOfMonth.jpg deleted file mode 100644 index 6e8e2ba3..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OrdinalDayOfMonth.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OrdinalDayOfWeek.jpg b/doc_data/benchmarking_pandas_numpy/OrdinalDayOfWeek.jpg deleted file mode 100644 index 9418b39b..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OrdinalDayOfWeek.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OrdinalEncoder.jpg b/doc_data/benchmarking_pandas_numpy/OrdinalEncoder.jpg deleted file mode 100644 index fd97c882..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OrdinalEncoder.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OrdinalHourOfDay.jpg b/doc_data/benchmarking_pandas_numpy/OrdinalHourOfDay.jpg deleted file mode 100644 index 06babcb2..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OrdinalHourOfDay.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OrdinalMinuteOfHour.jpg b/doc_data/benchmarking_pandas_numpy/OrdinalMinuteOfHour.jpg deleted file mode 100644 index f2cb071b..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OrdinalMinuteOfHour.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/OrdinalMonthOfYear.jpg b/doc_data/benchmarking_pandas_numpy/OrdinalMonthOfYear.jpg deleted file mode 100644 index 84925384..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/OrdinalMonthOfYear.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/PlaneRotation.jpg b/doc_data/benchmarking_pandas_numpy/PlaneRotation.jpg deleted file mode 100644 index 6835c354..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/PlaneRotation.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/PolynomialFeatures.jpg b/doc_data/benchmarking_pandas_numpy/PolynomialFeatures.jpg deleted file mode 100644 index 5e84bed9..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/PolynomialFeatures.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/QuantileDiscretizer.jpg b/doc_data/benchmarking_pandas_numpy/QuantileDiscretizer.jpg deleted file mode 100644 index 6bb8fd5b..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/QuantileDiscretizer.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/RegressionEncoder.jpg b/doc_data/benchmarking_pandas_numpy/RegressionEncoder.jpg deleted file mode 100644 index 74d342c3..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/RegressionEncoder.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/Replace.jpg b/doc_data/benchmarking_pandas_numpy/Replace.jpg deleted file mode 100644 index a6aec2b8..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/Replace.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/SplitExtract.jpg b/doc_data/benchmarking_pandas_numpy/SplitExtract.jpg deleted file mode 100644 index dcfa72aa..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/SplitExtract.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/StandardScaler.jpg b/doc_data/benchmarking_pandas_numpy/StandardScaler.jpg deleted file mode 100644 index 4ae7e7ee..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/StandardScaler.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/StringContains.jpg b/doc_data/benchmarking_pandas_numpy/StringContains.jpg deleted file mode 100644 index db79b628..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/StringContains.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/StringLength.jpg b/doc_data/benchmarking_pandas_numpy/StringLength.jpg deleted file mode 100644 index 46d2180c..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/StringLength.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/TargetEncoder.jpg b/doc_data/benchmarking_pandas_numpy/TargetEncoder.jpg deleted file mode 100644 index 695e934a..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/TargetEncoder.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/UpperCase.jpg b/doc_data/benchmarking_pandas_numpy/UpperCase.jpg deleted file mode 100644 index 5ef066f3..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/UpperCase.jpg and /dev/null differ diff --git a/doc_data/benchmarking_pandas_numpy/WOEEncoder.jpg b/doc_data/benchmarking_pandas_numpy/WOEEncoder.jpg deleted file mode 100644 index b6339129..00000000 Binary files a/doc_data/benchmarking_pandas_numpy/WOEEncoder.jpg and /dev/null differ diff --git a/doc_data/dask_logo.jpeg b/doc_data/dask_logo.jpeg new file mode 100644 index 00000000..59eb64f4 Binary files /dev/null and b/doc_data/dask_logo.jpeg differ diff --git a/doc_data/dask_logo.png b/doc_data/dask_logo.png new file mode 100644 index 00000000..77d9275a Binary files /dev/null and b/doc_data/dask_logo.png differ diff --git a/doc_data/gators/Slide1.png b/doc_data/gators/Slide1.png deleted file mode 100644 index 512bdeac..00000000 Binary files a/doc_data/gators/Slide1.png and /dev/null differ diff --git a/doc_data/gators/Slide2.png b/doc_data/gators/Slide2.png deleted file mode 100644 index 4811e0be..00000000 Binary files a/doc_data/gators/Slide2.png and /dev/null differ diff --git a/doc_data/hyperopt_logo copy.png b/doc_data/hyperopt_logo copy.png new file mode 100644 index 00000000..7797c7fa Binary files /dev/null and b/doc_data/hyperopt_logo copy.png differ diff --git a/docker/dockerfile b/docker/dockerfile deleted file mode 100644 index 9c28b0ae..00000000 --- a/docker/dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -# RUN IN TERMINAL: -# docker build -t gators:latest -f docker/Dockerfile .\ - -# gators docker container (needs Zscaler disabled) -# If getting ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE -# REQUIREMENTS FILE, just keep re-running -# cd gators -# docker build -t gators:latest -f docker/Dockerfile . - - -# Install default environment -FROM dockerhub.paypalcorp.com/simility/python:3.7 - -# Install Java -RUN apt update -y && apt-get install -y software-properties-common && \ - apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && apt update -y && \ - apt-get install -y openjdk-8-jdk-headless && \ - export JAVA_HOME && \ - apt-get clean - -# Delete cache (stops ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE -# REQUIREMENTS FILE) -RUN rm ~/.cache/pip -rf - -# Install python libs -ENV LANG C.UTF-8 -RUN apt-get update && apt-get install -y python python-dev python-pip virtualenv libssl-dev libpq-dev git build-essential libfontconfig1 libfontconfig1-dev - -# Upgrade setuptools -RUN pip install -U pip --no-cache -RUN pip install setuptools>=41.0.0 --no-cache -RUN pip3.7 install numpy==1.19.5 --no-cache-dir -RUN pip3.7 install cython --no-cache-dir -# RUN pip3.7 install wheel --no-cache-dir -# Copy GATORS directory -RUN mkdir /gators -COPY ./ /gators - - -# Install gators -# RUN python3.7 /gators/setup_docker.py build_ext --inplace -RUN pip3.7 install /gators/. -# Set up working directory -WORKDIR / -RUN mkdir /workdir/ -RUN mkdir /workdir/examples -COPY ./examples /workdir/examples -RUN pip3.7 install jupyterlab --no-cache-dir -ENTRYPOINT jupyter lab --ip=0.0.0.0 --port=9090 --allow-root --no-browser --notebook-dir /workdir/ --NotebookApp.token='' \ No newline at end of file diff --git a/docker_ppnb/Dockerfile b/docker_ppnb/Dockerfile deleted file mode 100644 index 12be5b8c..00000000 --- a/docker_ppnb/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# RUN IN TERMINAL: -# docker build -t gators_pp:latest -f docker_ppnb/Dockerfile .\ -# gators docker image (for PP NBs) -# If getting ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE -# REQUIREMENTS FILE, just keep re-running - -# Install default environment -FROM dockerhub.paypalcorp.com/core-data-platform/ppmagics-spark230:latest -ENV LANG C.UTF-8 -# RUN echo python --version - -# Delete cache -#stops ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE) -RUN rm ~/.cache/pip -rf - -# Install python libs -# RUN apt-get update && apt-get install -y python python-dev python-pip virtualenv libssl-dev libpq-dev git build-essential libfontconfig1 libfontconfig1-dev - - -# Copy gators directory -RUN pip install -U pip --no-cache -RUN pip install setuptools>=41.0.0 --no-cache -RUN pip install numpy==1.19.5 --no-cache -RUN pip install cython --no-cache -RUN pip install wheel --no-cache - -COPY ./ /gators -# RUN chmod 777 /gators/ -RUN pip install /gators/. --no-deps -# RUN python /gators/setup_docker.py build_ext --inplace -# Install gators diff --git a/encoder.cpython-38-darwin.so b/encoder.cpython-38-darwin.so deleted file mode 100755 index f9b20d65..00000000 Binary files a/encoder.cpython-38-darwin.so and /dev/null differ diff --git a/examples/10min.ipynb b/examples/10min.ipynb index b2e84b81..2d5568fe 100644 --- a/examples/10min.ipynb +++ b/examples/10min.ipynb @@ -1,1282 +1,1381 @@ { - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# 10 minutes to gators" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 1, - "source": [ - "%load_ext autoreload\n", - "%autoreload 2" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 2, - "source": [ - "import copy\n", - "import numpy as np\n", - "import pandas as pd\n", - "from pandas.testing import assert_frame_equal\n", - "from xgboost import XGBClassifier\n", - "import treelite\n", - "import treelite_runtime\n", - "import dill" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 3, - "source": [ - "# imputers\n", - "from gators.imputers import (\n", - " FloatImputer, \n", - " IntImputer, \n", - " ObjectImputer,\n", - ")\n", - "# encoders\n", - "from gators.encoders import WOEEncoder\n", - "# pipeline\n", - "from gators.pipeline import Pipeline\n", - "# model building\n", - "from gators.model_building import XGBBoosterBuilder" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## end-to-end simple worflow" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "The workflow is as followed:\n", - "\n", - "1- create a pipeline to take care of the data preproprocessing.\n", - "\n", - "2- train the pipeline on a *pandas* or *koalas* dataframe.\n", - "\n", - "3- generate the preproccessed data.\n", - "\n", - "4- train a decision tree based model on the preprocessed data.\n", - "\n", - "5- use *treelite* to compile the model in C.\n", - " \n", - "The pipeline and the compiled model can then be deployed in production.\n", - "\n", - "**Notes:**\n", - " \n", - "* *koalas* and/or *pandas* are used offline,\n", - "by means of the `fit` and `transform methods`.\n", - "* In production, *numpy* is used with `transform_numpy`." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "The pipeline will be only composed of the following four transformers:\n", - "\n", - "* ObjectImputer\n", - "* WOEEncoder\n", - "* FloatImputer\n", - "* IntImputer" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### with pandas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 4, - "source": [ - "data = pd.read_parquet('data/titanic.parquet')\n", - "y = data['Survived']\n", - "X = data.drop(['Survived'], axis=1)\n", - "X.head(2)" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PclassNameSexAgeSibSpParchTicketFareCabinEmbarked
PassengerId
13Braund, Mr. Owen Harrismale22.010A/5 211717.2500NoneS
21Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
\n", - "
" - ], - "text/plain": [ - " Pclass Name \\\n", - "PassengerId \n", - "1 3 Braund, Mr. Owen Harris \n", - "2 1 Cumings, Mrs. John Bradley (Florence Briggs Th... \n", - "\n", - " Sex Age SibSp Parch Ticket Fare Cabin Embarked \n", - "PassengerId \n", - "1 male 22.0 1 0 A/5 21171 7.2500 None S \n", - "2 female 38.0 1 0 PC 17599 71.2833 C85 C " - ] - }, - "metadata": {}, - "execution_count": 4 - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### pipeline" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 5, - "source": [ - "prepro_steps = [\n", - " ObjectImputer(strategy='constant', value='MISSING'),\n", - " WOEEncoder(),\n", - " FloatImputer(strategy='mean'),\n", - " IntImputer(strategy='constant', value=-1),\n", - "]\n", - "pipe = Pipeline(steps=prepro_steps)\n", - "X_prepro = pipe.fit_transform(X, y)\n", - "X_prepro_np = pipe.transform_numpy(X.to_numpy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 6, - "source": [ - "X_prepro.head(2)" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PclassNameSexAgeSibSpParchTicketFareCabinEmbarked
PassengerId
13.00.0-0.98383322.01.00.00.07.2500-0.374703-0.203599
21.00.01.52987738.01.00.00.071.28330.0000000.688399
\n", - "
" - ], - "text/plain": [ - " Pclass Name Sex Age SibSp Parch Ticket Fare \\\n", - "PassengerId \n", - "1 3.0 0.0 -0.983833 22.0 1.0 0.0 0.0 7.2500 \n", - "2 1.0 0.0 1.529877 38.0 1.0 0.0 0.0 71.2833 \n", - "\n", - " Cabin Embarked \n", - "PassengerId \n", - "1 -0.374703 -0.203599 \n", - "2 0.000000 0.688399 " - ] - }, - "metadata": {}, - "execution_count": 6 - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "##### check `transform` and `tranform_numpy` output" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 7, - "source": [ - "assert X_prepro.shape == X_prepro_np.shape\n", - "X_prepro_np_pd = pd.DataFrame(\n", - " X_prepro_np, \n", - " index=X_prepro.index, \n", - " columns=X_prepro.columns,\n", - ")\n", - "assert_frame_equal(X_prepro, X_prepro_np_pd)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### model building" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 8, - "source": [ - "model = XGBClassifier(\n", - " max_depth=2,\n", - " n_estimators=10,\n", - " random_state=0, \n", - " eval_metric='mlogloss', \n", - " use_label_encoder=False)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### pandas model" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 9, - "source": [ - "model_pd = copy.copy(model)\n", - "_ = model_pd.fit(X_prepro, y)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### numpy model" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 10, - "source": [ - "model = model.fit(X_prepro.to_numpy(), y.to_numpy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### treelite model" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 11, - "source": [ - "xgb_booster = XGBBoosterBuilder.train(\n", - " model=model, \n", - " X_train=X_prepro_np, \n", - " y_train=y.to_numpy(),\n", - ")\n", - "\n", - "treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", - "treelite_model.export_lib(\n", - " toolchain='gcc', \n", - " libpath='./models/treelite_simple_xgb.so', \n", - " params={'parallel_comp': 4},\n", - " verbose=True)\n", - "model_tl = treelite_runtime.Predictor(\n", - " './models/treelite_simple_xgb.so', verbose=False)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[11:41:25] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", - "[11:41:25] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", - "[11:41:25] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file header.h...\n", - "[11:41:25] ../src/c_api/c_api.cc:126: Writing file main.c...\n", - "[11:41:25] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:105: Compiling sources files in directory ./models/tmpsdrk142d into object files (*.o)...\n", - "[11:41:25] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:134: Generating dynamic shared library ./models/tmpsdrk142d/predictor.dylib...\n", - "[11:41:25] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/__init__.py:278: Generated shared library in 0.34 seconds\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "##### per-sample model benchmarking" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 12, - "source": [ - "x = X.iloc[[0]]\n", - "xnp = x.to_numpy()\n", - "stats_pd = %timeit -o model_pd.predict_proba(pipe.transform(x))[0][1]\n", - "stats_pd_tl = %timeit -o model_tl.predict(treelite_runtime.DMatrix(pipe.transform(x).to_numpy()))\n", - "stats_np = %timeit -o model.predict_proba(pipe.transform_numpy(xnp))[0][1]\n", - "stats_np_tl = %timeit -o model_tl.predict(treelite_runtime.DMatrix(pipe.transform_numpy(xnp)))" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "55.1 ms ± 1.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "59.8 ms ± 5.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "114 µs ± 6.14 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", - "110 µs ± 6.57 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "Overall speed-up" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 13, - "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np_tl).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy&Treelite x{round(speedup)}'" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy&Treelite x500.91'" - ] - }, - "metadata": {}, - "execution_count": 13 - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### check model predictions" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 14, - "source": [ - "X_np = X.to_numpy()\n", - "y_pred_pd = model_pd.predict_proba(pipe.transform(X))[:, 1]\n", - "y_pred_np = model.predict_proba(pipe.transform_numpy(X_np))[:, 1]\n", - "y_pred_tl = model_tl.predict(treelite_runtime.DMatrix(pipe.transform_numpy(X_np).astype(float)))\n", - "assert np.allclose(y_pred_np, y_pred_pd)\n", - "assert np.allclose(y_pred_np, y_pred_tl)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### dumping both model and pipeline " - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 15, - "source": [ - "model_path = 'models/simple_xgb.dill'\n", - "with open(model_path, 'wb') as file:\n", - " dill.dump(model, file)\n", - "model_path = 'pipelines/simple_pipeline.dill'\n", - "with open(model_path, 'wb') as file:\n", - " dill.dump(model, file)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### with koalas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 16, - "source": [ - "import databricks.koalas as ks\n", - "from gators.converter import KoalasToPandas" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 17, - "source": [ - "data = ks.read_parquet('data/titanic.parquet')\n", - "y_ks = data['Survived']\n", - "X_ks = data.drop(['Survived', 'PassengerId'], axis=1)\n", - "X_ks.head(2)" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PclassNameSexAgeSibSpParchTicketFareCabinEmbarked
03Braund, Mr. Owen Harrismale22.010A/5 211717.2500NoneS
11Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
\n", - "
" - ], - "text/plain": [ - " Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked\n", - "0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 None S\n", - "1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38.0 1 0 PC 17599 71.2833 C85 C" - ] - }, - "metadata": {}, - "execution_count": 17 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 18, - "source": [ - "X_prepro_ks = pipe.fit_transform(X_ks, y_ks)\n", - "X_prepro_ks_np = pipe.transform_numpy(X.to_numpy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 19, - "source": [ - "X_prepro_ks_pd, y_ks_pd = KoalasToPandas().transform(X_prepro_ks, y_ks)\n", - "X_prepro_ks_pd.index = X_prepro.index" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "##### check `pandas` and `koalas` output" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 20, - "source": [ - "assert_frame_equal(X_prepro_ks_pd, X_prepro)\n", - "assert np.allclose(X_prepro_ks_np, X_prepro)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "Since we have a pandas dataframe, the same steps from the pandas section can now followed" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## Create you own transformers: example with log10" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### imports" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 21, - "source": [ - "from typing import List, Union\n", - "from math import log10\n", - "import numpy as np\n", - "import pandas as pd\n", - "import databricks.koalas as ks\n", - "from gators.util import util\n", - "from gators.transformers import Transformer" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Inplace transformer on the all dataframe" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 22, - "source": [ - "class Log10Inplace(Transformer):\n", - " def __init__(self):\n", - " pass\n", - "\n", - " def fit(self,\n", - " X: Union[pd.DataFrame, ks.DataFrame],\n", - " y: Union[pd.Series, ks.Series] = None) -> 'Log10Inplace':\n", - " self.check_dataframe(X)\n", - " return self\n", - "\n", - " def transform(\n", - " self, X: Union[pd.DataFrame, ks.DataFrame]\n", - " ) -> Union[pd.DataFrame, ks.DataFrame]:\n", - " self.check_dataframe(X)\n", - " return X.applymap(log10)\n", - "\n", - " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", - " self.check_array(X)\n", - " return np.log10(X)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "**Notes:**\n", - "\n", - "If your use case do not need koalas, the `transform` method can be replaced by:\n", - " \n", - "`return pd.DataFrame(np.log10(X.to_numpy()), columns=X.columns, index=X.index)`\n", - "\n", - "which is significantly faster." - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 23, - "source": [ - "X = pd.DataFrame(\n", - " np.abs(np.random.randn(10, 10)), columns=list('ABCDEFGHIJ'))\n", - "%timeit _ = X.applymap(log10)\n", - "%timeit _ = pd.DataFrame(np.log10(X.to_numpy()), columns=X.columns, index=X.index)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "2.09 ms ± 192 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", - "45.2 µs ± 1.99 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Inplace transformer on the selected columns" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "Transform the given columns can be interesting in the following ways:\n", - "\n", - "* Only a few colums need to be transformed.\n", - "* Only a given datatype should be transformed.\n", - "* The transformation should not be applied on the encoded columns, and the name of the base columns are obtained before the transformation." - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 24, - "source": [ - "class Log10ColumnsInplace(Transformer):\n", - " def __init__(self, columns: List[str]):\n", - " if not isinstance(columns, list):\n", - " raise TypeError('`columns` should be a list.')\n", - " if not columns:\n", - " raise ValueError('`columns` should not be empty.')\n", - " self.columns = columns\n", - " \n", - " def fit(self,\n", - " X: Union[pd.DataFrame, ks.DataFrame],\n", - " y: Union[pd.Series, ks.Series] = None) -> 'Log10Columns':\n", - " self.check_dataframe(X)\n", - " self.idx_columns = util.get_idx_columns(\n", - " columns=X.columns,\n", - " selected_columns=self.columns\n", - " )\n", - " return self\n", - "\n", - " def transform(\n", - " self, X: Union[pd.DataFrame, ks.DataFrame]\n", - " ) -> Union[pd.DataFrame, ks.DataFrame]:\n", - " self.check_dataframe(X)\n", - " X[self.columns] = X[self.columns].applymap(log10)\n", - " return X\n", - "\n", - " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", - " self.check_array(X)\n", - " X[:, self.idx_columns] = np.log10(X[:, self.idx_columns])\n", - " return X\n", - " " - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### transformer creating new columns" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "Creating new columns can be interesting if\n", - "\n", - "* the raw data are needed for other transformations. \n", - "* the raw data still contains some meaningful predictive information. " - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 25, - "source": [ - "class Log10Columns(Transformer):\n", - " def __init__(self, columns: List[str]):\n", - " if not isinstance(columns, list):\n", - " raise TypeError('`columns` should be a list.')\n", - " if not columns:\n", - " raise ValueError('`columns` should not be empty.')\n", - " self.columns = columns\n", - " self.column_names = [f'{c}__log10' for c in self.columns]\n", - " self.colum_mapping = dict(zip(self.column_names, self.columns))\n", - "\n", - " def fit(self,\n", - " X: Union[pd.DataFrame, ks.DataFrame],\n", - " y: Union[pd.Series, ks.Series] = None) -> 'Log10Columns':\n", - " self.check_dataframe(X)\n", - " self.idx_columns = util.get_idx_columns(\n", - " columns=X.columns,\n", - " selected_columns=self.columns\n", - " )\n", - " return self\n", - "\n", - " def transform(\n", - " self, X: Union[pd.DataFrame, ks.DataFrame]\n", - " ) -> Union[pd.DataFrame, ks.DataFrame]:\n", - " self.check_dataframe(X)\n", - " X_new = X[self.columns].applymap(log10)\n", - " X_new.columns = self.column_names\n", - " return X.join(X_new)\n", - "\n", - " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", - " self.check_array(X)\n", - " X_new = np.log10(X[:, self.idx_columns])\n", - " return np.concatenate((X, X_new), axis=1)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "**Notes**\n", - "\n", - "The class parameter `colum_names` will be used to clean up the pipeline." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### tests" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 26, - "source": [ - "X = pd.DataFrame(\n", - " np.abs(np.random.randn(10, 10)), columns=list('ABCDEFGHIJ'))\n", - "X_np = X.to_numpy()" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 27, - "source": [ - "columns = util.get_datatype_columns(X, float)\n", - "X_new_inplace_all = Log10Inplace().fit_transform(X.copy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 28, - "source": [ - "columns = util.get_datatype_columns(X, float)\n", - "X_new_inplace_cols = Log10ColumnsInplace(\n", - " columns=columns).fit_transform(X.copy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 29, - "source": [ - "columns = util.get_datatype_columns(X, float)\n", - "X_new = Log10Columns(columns=columns).fit_transform(X)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 30, - "source": [ - "assert np.allclose(\n", - " X_new_inplace_all.to_numpy(), X_new_inplace_cols.to_numpy())\n", - "cols = [\n", - " 'A__log10', 'B__log10', 'C__log10', 'D__log10', 'E__log10', \n", - " 'F__log10', 'G__log10', 'H__log10', 'I__log10', 'J__log10'\n", - "]\n", - "assert np.allclose(\n", - " X_new_inplace_all.to_numpy(), X_new[cols].to_numpy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### per-sample benchmarking" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 31, - "source": [ - "np.random.seed(0)\n", - "n_cols = 1000\n", - "X = pd.DataFrame(\n", - " np.abs(np.random.randn(1, n_cols)), \n", - " columns=[f'col{i}'for i in range(n_cols)])\n", - "X_np = X.to_numpy()\n", - "x = X.iloc[[0]]\n", - "x_np = x.to_numpy()" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 32, - "source": [ - "columns = list(X.columns)\n", - "obj = Log10ColumnsInplace(columns=columns)\n", - "_ = obj.fit(X)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 33, - "source": [ - "# result saved to be compared with the transform_numpy using Cython.\n", - "x_np_new = obj.transform_numpy(x_np.copy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 34, - "source": [ - "%timeit _ = obj.transform(x.copy())\n", - "%timeit _ = obj.transform_numpy(x_np.copy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "223 ms ± 11.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", - "17 µs ± 714 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "**Notes:**\n", - " \n", - "Since the transformation happens inplace, the `.copy()` is \n", - "neccessary however, the `.copy()` runtime is negligeable: " - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 35, - "source": [ - "%timeit x.copy()\n", - "%timeit x_np.copy()" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "20.8 µs ± 1.46 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", - "590 ns ± 24.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 36, - "source": [ - "columns = list(X.columns)\n", - "obj = Log10Columns(columns=columns)\n", - "_ = obj.fit(X)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 37, - "source": [ - "%timeit _ = obj.transform(x.copy())\n", - "%timeit _ = obj.transform_numpy(x_np.copy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "152 ms ± 4.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "16.7 µs ± 673 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Cython" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "The per-sample runtime of the `transform_numpy` is already pretty good.\n", - "But, it some cases, Cython will allow to get even faster. " - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 1, - "source": [ - "%load_ext Cython" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 4, - "source": [ - "%%cython\n", - "import cython\n", - "import numpy as np\n", - "cimport numpy as np\n", - "from libc.math cimport log10\n", - "\n", - "\n", - "@cython.boundscheck(False)\n", - "@cython.wraparound(False)\n", - "cpdef np.ndarray[np.float64_t, ndim=2] cython_log10(\n", - " np.ndarray[np.float_t, ndim=2] X,\n", - " np.ndarray[np.int64_t, ndim=1] idx_columns,\n", - "):\n", - " cdef int i\n", - " cdef int j\n", - " cdef int n_rows = X.shape[0]\n", - " cdef int n_cols = X.shape[1]\n", - " with nogil:\n", - " for i in range(n_rows):\n", - " for j in range(n_cols):\n", - " X[i, j] = log10(X[i, j])\n", - " return X" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 40, - "source": [ - "class Log10ColumnsInplaceWithCython(Transformer):\n", - " def __init__(self, columns: List[str]):\n", - " if not isinstance(columns, list):\n", - " raise TypeError('`columns` should be a list.')\n", - " if not columns:\n", - " raise ValueError('`columns` should not be empty.')\n", - " self.columns = columns\n", - " \n", - " def fit(self,\n", - " X: Union[pd.DataFrame, ks.DataFrame],\n", - " y: Union[pd.Series, ks.Series] = None) -> 'Log10Columns':\n", - " self.check_dataframe(X)\n", - " self.idx_columns = util.get_idx_columns(\n", - " columns=X.columns,\n", - " selected_columns=self.columns\n", - " )\n", - " return self\n", - "\n", - " def transform(\n", - " self, X: Union[pd.DataFrame, ks.DataFrame]\n", - " ) -> Union[pd.DataFrame, ks.DataFrame]:\n", - " self.check_dataframe(X)\n", - " X[self.columns] = X[self.columns].applymap(log10)\n", - " return X\n", - "\n", - " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", - " self.check_array(X)\n", - " X[:, self.idx_columns] = cython_log10(X, self.idx_columns)\n", - " return X" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 41, - "source": [ - "columns = list(X.columns)\n", - "obj = Log10ColumnsInplaceWithCython(columns=columns)\n", - "_ = obj.fit(X)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 42, - "source": [ - "assert np.allclose(obj.transform_numpy(x_np.copy()), x_np_new)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 43, - "source": [ - "%timeit _ = obj.transform_numpy(x_np.copy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "13.2 µs ± 720 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "A slight runtime improvement is obtained for this transformer.\n", - "\n", - "**Notes:**\n", - "\n", - "In some cases, for example the Encoders, Cython leads to a significant runtime improvement. " - ], - "metadata": {} - } - ], - "metadata": { - "kernelspec": { - "display_name": "gators38", - "language": "python", - "name": "gators38" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 10 minutes to gators" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pandas.testing import assert_frame_equal\n", + "from xgboost import XGBClassifier\n", + "import treelite\n", + "import treelite_runtime\n", + "import dill" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# data cleaning\n", + "from gators.data_cleaning import ConvertColumnDatatype\n", + "\n", + "# imputers\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "\n", + "# encoders\n", + "from gators.encoders import WOEEncoder\n", + "\n", + "# pipeline\n", + "from gators.pipeline import Pipeline\n", + "\n", + "# model building\n", + "from gators.model_building import XGBBoosterBuilder" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## end-to-end simple worflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The workflow is as followed:\n", + "\n", + "1- create a pipeline to take care of the data preproprocessing.\n", + "\n", + "2- train the pipeline on a *pandas* or *koalas* dataframe.\n", + "\n", + "3- generate the preproccessed data.\n", + "\n", + "4- train a decision tree based model on the preprocessed data.\n", + "\n", + "5- use *treelite* to compile the model in C.\n", + " \n", + "The pipeline and the compiled model can then be deployed in production.\n", + "\n", + "**Notes:**\n", + " \n", + "* *koalas* and/or *pandas* are used offline,\n", + "by means of the `fit` and `transform methods`.\n", + "* In production, *numpy* is used with `transform_numpy`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The pipeline will be only composed of the following four transformers:\n", + "\n", + "* ObjectImputer\n", + "* WOEEncoder\n", + "* NumericImputer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### with pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SexAgeSibSpParchCabin
0male22.010None
1female38.010C85
\n", + "
" + ], + "text/plain": [ + " Sex Age SibSp Parch Cabin\n", + "0 male 22.0 1 0 None\n", + "1 female 38.0 1 0 C85" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "columns = [\"Sex\", \"Age\", \"SibSp\", \"Parch\", \"Cabin\", \"Survived\"]\n", + "data = pd.read_parquet(\"data/titanic.parquet\")[columns]\n", + "y = data[\"Survived\"]\n", + "X = data.drop([\"Survived\"], axis=1)\n", + "X.head(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "prepro_steps = [\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"WOEEncoder\", WOEEncoder(inplace=True)),\n", + " (\n", + " \"ConvertColumnDatatype\",\n", + " ConvertColumnDatatype(columns=[\"SibSp\", \"Parch\"], datatype=float),\n", + " ),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"mean\", inplace=True)),\n", + "]\n", + "pipe = Pipeline(steps=prepro_steps)\n", + "X_prepro = pipe.fit_transform(X, y)\n", + "X_prepro_np = pipe.transform_numpy(X.to_numpy())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-0.98142372, 22. , 1. , 0. , -0.37441799],\n", + " [ 1.52476689, 38. , 1. , 0. , 1.57080012],\n", + " [ 1.52476689, 26. , 0. , 0. , -0.37441799],\n", + " ...,\n", + " [ 1.52476689, 29.69911765, 1. , 2. , -0.37441799],\n", + " [-0.98142372, 26. , 0. , 0. , 1.57080012],\n", + " [-0.98142372, 32. , 0. , 0. , -0.37441799]])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_prepro_np" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SexAgeSibSpParchCabin
0-0.98142422.01.00.0-0.374418
11.52476738.01.00.01.570800
\n", + "
" + ], + "text/plain": [ + " Sex Age SibSp Parch Cabin\n", + "0 -0.981424 22.0 1.0 0.0 -0.374418\n", + "1 1.524767 38.0 1.0 0.0 1.570800" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_prepro.head(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### check `transform` and `tranform_numpy` output" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SexAgeSibSpParchCabin
0-0.98142422.01.00.0-0.374418
11.52476738.01.00.01.570800
\n", + "
" + ], + "text/plain": [ + " Sex Age SibSp Parch Cabin\n", + "0 -0.981424 22.0 1.0 0.0 -0.374418\n", + "1 1.524767 38.0 1.0 0.0 1.570800" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_prepro_np_pd = pd.DataFrame(\n", + " X_prepro_np,\n", + " index=X_prepro.index,\n", + " columns=X_prepro.columns,\n", + ")\n", + "X_prepro_np_pd.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "assert X_prepro.shape == X_prepro_np.shape\n", + "X_prepro_np_pd = pd.DataFrame(\n", + " X_prepro_np,\n", + " index=X_prepro.index,\n", + " columns=X_prepro.columns,\n", + ")\n", + "assert_frame_equal(X_prepro, X_prepro_np_pd)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### model building" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "model = XGBClassifier(\n", + " max_depth=2,\n", + " n_estimators=10,\n", + " random_state=0,\n", + " eval_metric=\"mlogloss\",\n", + " use_label_encoder=False,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### pandas model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "model_pd = copy.copy(model)\n", + "_ = model_pd.fit(X_prepro, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### numpy model" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model = model.fit(X_prepro.to_numpy(), y.to_numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### treelite model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[16:09:44] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", + "[16:09:44] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", + "[16:09:44] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file header.h...\n", + "[16:09:44] ../src/c_api/c_api.cc:126: Writing file main.c...\n", + "[16:09:44] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:105: Compiling sources files in directory ./models/tmppmwz3168 into object files (*.o)...\n", + "[16:09:44] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:134: Generating dynamic shared library ./models/tmppmwz3168/predictor.dylib...\n", + "[16:09:44] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/__init__.py:278: Generated shared library in 0.40 seconds\n" + ] + } + ], + "source": [ + "xgb_booster = XGBBoosterBuilder.train(\n", + " model=model,\n", + " X_train=X_prepro_np,\n", + " y_train=y.to_numpy(),\n", + ")\n", + "\n", + "treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", + "treelite_model.export_lib(\n", + " toolchain=\"clang\",\n", + " libpath=\"./models/treelite_simple_xgb.so\",\n", + " params={\"parallel_comp\": 4},\n", + " verbose=True,\n", + ")\n", + "model_tl = treelite_runtime.Predictor(\"./models/treelite_simple_xgb.so\", verbose=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### per-sample model benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13.7 ms ± 1.13 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", + "6.85 ms ± 230 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", + "1.48 ms ± 108 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n", + "67.6 µs ± 2.27 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" + ] + } + ], + "source": [ + "x = X.iloc[[0]]\n", + "x_np = x.to_numpy()\n", + "stats_pd = %timeit -o model_pd.predict_proba(pipe.transform(x))[0][1]\n", + "stats_pd_tl = (\n", + " %timeit -o model_tl.predict(treelite_runtime.DMatrix(pipe.transform(x).to_numpy()))\n", + ")\n", + "stats_np = %timeit -o model.predict_proba(pipe.transform_numpy(x_np.copy()))[0][1]\n", + "stats_np_tl = %timeit -o model_tl.predict(treelite_runtime.DMatrix(pipe.transform_numpy(x_np.copy())))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Overall speed-up" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Speed-up Pandas VS Numpy&Treelite x203'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "speedup = (\n", + " 1e3 * float(str(stats_pd).split(\" \")[0]) / float(str(stats_np_tl).split(\" \")[0])\n", + ")\n", + "f\"Speed-up Pandas VS Numpy&Treelite x{round(speedup)}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### check model predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "X_np = X.to_numpy()\n", + "y_pred_pd = model_pd.predict_proba(pipe.transform(X))[:, 1]\n", + "y_pred_np = model.predict_proba(pipe.transform_numpy(X_np.copy()))[:, 1]\n", + "y_pred_tl = model_tl.predict(\n", + " treelite_runtime.DMatrix(pipe.transform_numpy(X_np.copy()))\n", + ")\n", + "assert np.allclose(y_pred_np, y_pred_pd)\n", + "assert np.allclose(y_pred_np, y_pred_tl)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### dumping both model and pipeline " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "model_path = \"models/simple_xgb.dill\"\n", + "with open(model_path, \"wb\") as file:\n", + " dill.dump(model, file)\n", + "model_path = \"models/simple_pipeline.dill\"\n", + "with open(model_path, \"wb\") as file:\n", + " dill.dump(model, file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### with koalas" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: An illegal reflective access operation has occurred\n", + "WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/Users/cpoli/gators38/lib/python3.8/site-packages/pyspark/jars/spark-unsafe_2.12-3.1.3.jar) to constructor java.nio.DirectByteBuffer(long,int)\n", + "WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform\n", + "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", + "WARNING: All illegal access operations will be denied in a future release\n", + "22/10/05 16:10:21 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + } + ], + "source": [ + "from pyspark import SparkConf, SparkContext\n", + "\n", + "conf = SparkConf()\n", + "conf.set(\"spark.executor.memory\", \"2g\")\n", + "conf.set(\"spark.sql.codegen.wholeStage\", \"false\")\n", + "conf.set(\"spark.sql.autoBroadcastJoinThreshold\", -1)\n", + "SparkContext(conf=conf)\n", + "import pyspark.pandas as ps\n", + "\n", + "ks.set_option(\"compute.default_index_type\", \"distributed-sequence\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "import pyspark.pandas as ps\n", + "from gators.converter import ToPandas" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SexAgeSibSpParchCabin
0male22.010None
1female38.010C85
\n", + "
" + ], + "text/plain": [ + " Sex Age SibSp Parch Cabin\n", + "0 male 22.0 1 0 None\n", + "1 female 38.0 1 0 C85" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = ps.read_parquet(\"data/titanic.parquet\")[columns]\n", + "y_ks = data[\"Survived\"]\n", + "X_ks = data.drop([\"Survived\", \"PassengerId\"], axis=1)\n", + "X_ks.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "X_prepro_ks = pipe.fit_transform(X_ks, y_ks)\n", + "X_prepro_ks_np = pipe.transform_numpy(X.to_numpy())" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "X_prepro_ks_pd, y_ks_pd = ToPandas().transform(X_prepro_ks, y_ks)\n", + "X_prepro_ks_pd.index = X_prepro.index" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### check `pandas` and `koalas` output" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "assert_frame_equal(X_prepro_ks_pd, X_prepro)\n", + "assert np.allclose(X_prepro_ks_np, X_prepro)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we have a pandas dataframe, the same steps from the pandas section can now followed" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create you own transformers: example with log10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### imports" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Union\n", + "from math import log10\n", + "import numpy as np\n", + "import pandas as pd\n", + "import pyspark.pandas as ps\n", + "from gators.util import util\n", + "from gators.transformers import Transformer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inplace transformer on the all dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "class Log10Inplace(Transformer):\n", + " def __init__(self):\n", + " pass\n", + "\n", + " def fit(\n", + " self,\n", + " X: Union[pd.DataFrame, ps.DataFrame],\n", + " y: Union[pd.Series, ps.Series] = None,\n", + " ) -> \"Log10Inplace\":\n", + " self.check_dataframe(X)\n", + " return self\n", + "\n", + " def transform(\n", + " self, X: Union[pd.DataFrame, ps.DataFrame]\n", + " ) -> Union[pd.DataFrame, ps.DataFrame]:\n", + " self.check_dataframe(X)\n", + " return X.applymap(log10)\n", + "\n", + " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", + " self.check_array(X)\n", + " return np.log10(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Notes:**\n", + "\n", + "If your use case do not need koalas, the `transform` method can be replaced by:\n", + " \n", + "`return pd.DataFrame(np.log10(X.to_numpy()), columns=X.columns, index=X.index)`\n", + "\n", + "which is significantly faster." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.41 ms ± 30.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n", + "30.1 µs ± 238 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" + ] + } + ], + "source": [ + "X = pd.DataFrame(np.abs(np.random.randn(10, 10)), columns=list(\"ABCDEFGHIJ\"))\n", + "%timeit _ = X.applymap(log10)\n", + "%timeit _ = pd.DataFrame(np.log10(X.to_numpy()), columns=X.columns, index=X.index)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inplace transformer on the selected columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Transform the given columns can be interesting in the following ways:\n", + "\n", + "* Only a few colums need to be transformed.\n", + "* Only a given datatype should be transformed.\n", + "* The transformation should not be applied on the encoded columns, and the name of the base columns are obtained before the transformation." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "class Log10ColumnsInplace(Transformer):\n", + " def __init__(self, columns: List[str]):\n", + " if not isinstance(columns, list):\n", + " raise TypeError(\"`columns` should be a list.\")\n", + " if not columns:\n", + " raise ValueError(\"`columns` should not be empty.\")\n", + " self.columns = columns\n", + "\n", + " def fit(\n", + " self,\n", + " X: Union[pd.DataFrame, ps.DataFrame],\n", + " y: Union[pd.Series, ps.Series] = None,\n", + " ) -> \"Log10Columns\":\n", + " self.check_dataframe(X)\n", + " self.idx_columns = util.get_idx_columns(\n", + " columns=X.columns, selected_columns=self.columns\n", + " )\n", + " return self\n", + "\n", + " def transform(\n", + " self, X: Union[pd.DataFrame, ps.DataFrame]\n", + " ) -> Union[pd.DataFrame, ps.DataFrame]:\n", + " self.check_dataframe(X)\n", + " X[self.columns] = X[self.columns].applymap(log10)\n", + " return X\n", + "\n", + " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", + " self.check_array(X)\n", + " X[:, self.idx_columns] = np.log10(X[:, self.idx_columns])\n", + " return X" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### transformer creating new columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creating new columns can be interesting if\n", + "\n", + "* the raw data are needed for other transformations. \n", + "* the raw data still contains some meaningful predictive information. " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "class Log10Columns(Transformer):\n", + " def __init__(self, columns: List[str]):\n", + " if not isinstance(columns, list):\n", + " raise TypeError(\"`columns` should be a list.\")\n", + " if not columns:\n", + " raise ValueError(\"`columns` should not be empty.\")\n", + " self.columns = columns\n", + " self.column_names = [f\"{c}__log10\" for c in self.columns]\n", + "\n", + " def fit(\n", + " self,\n", + " X: Union[pd.DataFrame, ps.DataFrame],\n", + " y: Union[pd.Series, ps.Series] = None,\n", + " ) -> \"Log10Columns\":\n", + " self.check_dataframe(X)\n", + " self.idx_columns = util.get_idx_columns(\n", + " columns=X.columns, selected_columns=self.columns\n", + " )\n", + " return self\n", + "\n", + " def transform(\n", + " self, X: Union[pd.DataFrame, ps.DataFrame]\n", + " ) -> Union[pd.DataFrame, ps.DataFrame]:\n", + " self.check_dataframe(X)\n", + " X_new = X[self.columns].applymap(log10)\n", + " X_new.columns = self.column_names\n", + " return X.join(X_new)\n", + "\n", + " def transform_numpy(self, X: np.ndarray) -> np.ndarray:\n", + " self.check_array(X)\n", + " X_new = np.log10(X[:, self.idx_columns])\n", + " return np.concatenate((X, X_new), axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### tests" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "X = pd.DataFrame(np.abs(np.random.randn(10, 10)), columns=list(\"ABCDEFGHIJ\"))\n", + "X_np = X.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "columns = util.get_datatype_columns(X, float)\n", + "X_new_inplace_all = Log10Inplace().fit_transform(X.copy())" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "columns = util.get_datatype_columns(X, float)\n", + "X_new_inplace_cols = Log10ColumnsInplace(columns=columns).fit_transform(X.copy())" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "columns = util.get_datatype_columns(X, float)\n", + "X_new = Log10Columns(columns=columns).fit_transform(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "assert np.allclose(X_new_inplace_all.to_numpy(), X_new_inplace_cols.to_numpy())\n", + "cols = [\n", + " \"A__log10\",\n", + " \"B__log10\",\n", + " \"C__log10\",\n", + " \"D__log10\",\n", + " \"E__log10\",\n", + " \"F__log10\",\n", + " \"G__log10\",\n", + " \"H__log10\",\n", + " \"I__log10\",\n", + " \"J__log10\",\n", + "]\n", + "assert np.allclose(X_new_inplace_all.to_numpy(), X_new[cols].to_numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### per-sample benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "np.random.seed(0)\n", + "n_cols = 1000\n", + "X = pd.DataFrame(\n", + " np.abs(np.random.randn(1, n_cols)), columns=[f\"col{i}\" for i in range(n_cols)]\n", + ")\n", + "X_np = X.to_numpy()\n", + "x = X.iloc[[0]]\n", + "x_np = x.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "columns = list(X.columns)\n", + "obj = Log10ColumnsInplace(columns=columns)\n", + "_ = obj.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# result saved to be compared with the transform_numpy using Cython.\n", + "x_np_new = obj.transform_numpy(x_np.copy())" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "234 ms ± 4.38 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", + "16.1 µs ± 108 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" + ] + } + ], + "source": [ + "%timeit _ = obj.transform(x.copy())\n", + "%timeit _ = obj.transform_numpy(x_np.copy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Notes:**\n", + " \n", + "Since the transformation happens inplace, the `.copy()` is \n", + "neccessary however, the `.copy()` runtime is negligeable: " + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "18.4 µs ± 876 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n", + "500 ns ± 16 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" + ] + } + ], + "source": [ + "%timeit x.copy()\n", + "%timeit x_np.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "columns = list(X.columns)\n", + "obj = Log10Columns(columns=columns)\n", + "_ = obj.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "109 ms ± 7.99 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "14.7 µs ± 1.71 µs per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" + ] + } + ], + "source": [ + "%timeit _ = obj.transform(x.copy())\n", + "stats_log_np = %timeit -o obj.transform_numpy(x_np.copy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cython" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The per-sample runtime of the `transform_numpy` is already pretty good.\n", + "But, it some cases, Cython will allow to get even faster. " + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext Cython" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "%%cython\n", + "import cython\n", + "import numpy as np\n", + "cimport numpy as np\n", + "from libc.math cimport log10\n", + "\n", + "\n", + "@cython.boundscheck(False)\n", + "@cython.wraparound(False)\n", + "cpdef np.ndarray[np.float64_t, ndim=2] cython_log10(\n", + " np.ndarray[np.float_t, ndim=2] X,\n", + " np.ndarray[np.int64_t, ndim=1] idx_columns,\n", + "):\n", + " cdef int i\n", + " cdef int j\n", + " cdef int n_rows = X.shape[0]\n", + " cdef int n_cols = X.shape[1]\n", + " with nogil:\n", + " for i in range(n_rows):\n", + " for j in range(n_cols):\n", + " X[i, j] = log10(X[i, j])\n", + " return X" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "class Log10ColumnsInplaceWithCython(Transformer):\n", + " def __init__(self, columns: List[str]):\n", + " if not isinstance(columns, list):\n", + " raise TypeError(\"`columns` should be a list.\")\n", + " if not columns:\n", + " raise ValueError(\"`columns` should not be empty.\")\n", + " self.columns = columns\n", + "\n", + " def fit(self, X, y=None) -> \"Log10Columns\":\n", + " self.check_dataframe(X)\n", + " self.idx_columns = util.get_idx_columns(\n", + " columns=X.columns, selected_columns=self.columns\n", + " )\n", + " return self\n", + "\n", + " def transform(self, X):\n", + " self.check_dataframe(X)\n", + " X[self.columns] = X[self.columns].applymap(log10)\n", + " return X\n", + "\n", + " def transform_numpy(self, X):\n", + " self.check_array(X)\n", + " X[:, self.idx_columns] = cython_log10(X, self.idx_columns)\n", + " return X" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "columns = list(X.columns)\n", + "obj = Log10ColumnsInplaceWithCython(columns=columns)\n", + "_ = obj.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "assert np.allclose(obj.transform_numpy(x_np.copy()), x_np_new)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9.95 µs ± 284 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" + ] + } + ], + "source": [ + "stats_log_cy = %timeit -o obj.transform_numpy(x_np.copy())" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Speed-up Cython VS Numpy x1.48'" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "speedup = float(str(stats_log_np).split(\" \")[0]) / float(\n", + " str(stats_log_cy).split(\" \")[0]\n", + ")\n", + "f\"Speed-up Cython VS Numpy x{round(speedup, 2)}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A slight runtime improvement is obtained for this transformer.\n", + "\n", + "**Notes:**\n", + "\n", + "In some cases, for example the Encoders, Cython leads to a significant runtime improvement. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gators38", + "language": "python", + "name": "gators38" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } \ No newline at end of file diff --git a/examples/benchmarking_figures.ipynb b/examples/benchmarking_figures.ipynb deleted file mode 100644 index 7c72c4db..00000000 --- a/examples/benchmarking_figures.ipynb +++ /dev/null @@ -1,1845 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from gators.util import util\n", - "from gators.util import benchmark\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "housing_file_location=\"data/house_prices.parquet\"\n", - "sf_crime_file_location=\"data/sf_crime.parquet\"\n", - "titanic_file_location=\"data/titanic.parquet\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 1460 entries, 1 to 1460\n", - "Data columns (total 80 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 MSSubClass 1460 non-null int64 \n", - " 1 MSZoning 1460 non-null object \n", - " 2 LotFrontage 1201 non-null float64\n", - " 3 LotArea 1460 non-null int64 \n", - " 4 Street 1460 non-null object \n", - " 5 Alley 91 non-null object \n", - " 6 LotShape 1460 non-null object \n", - " 7 LandContour 1460 non-null object \n", - " 8 Utilities 1460 non-null object \n", - " 9 LotConfig 1460 non-null object \n", - " 10 LandSlope 1460 non-null object \n", - " 11 Neighborhood 1460 non-null object \n", - " 12 Condition1 1460 non-null object \n", - " 13 Condition2 1460 non-null object \n", - " 14 BldgType 1460 non-null object \n", - " 15 HouseStyle 1460 non-null object \n", - " 16 OverallQual 1460 non-null int64 \n", - " 17 OverallCond 1460 non-null int64 \n", - " 18 YearBuilt 1460 non-null int64 \n", - " 19 YearRemodAdd 1460 non-null int64 \n", - " 20 RoofStyle 1460 non-null object \n", - " 21 RoofMatl 1460 non-null object \n", - " 22 Exterior1st 1460 non-null object \n", - " 23 Exterior2nd 1460 non-null object \n", - " 24 MasVnrType 1452 non-null object \n", - " 25 MasVnrArea 1452 non-null float64\n", - " 26 ExterQual 1460 non-null object \n", - " 27 ExterCond 1460 non-null object \n", - " 28 Foundation 1460 non-null object \n", - " 29 BsmtQual 1423 non-null object \n", - " 30 BsmtCond 1423 non-null object \n", - " 31 BsmtExposure 1422 non-null object \n", - " 32 BsmtFinType1 1423 non-null object \n", - " 33 BsmtFinSF1 1460 non-null int64 \n", - " 34 BsmtFinType2 1422 non-null object \n", - " 35 BsmtFinSF2 1460 non-null int64 \n", - " 36 BsmtUnfSF 1460 non-null int64 \n", - " 37 TotalBsmtSF 1460 non-null int64 \n", - " 38 Heating 1460 non-null object \n", - " 39 HeatingQC 1460 non-null object \n", - " 40 CentralAir 1460 non-null object \n", - " 41 Electrical 1459 non-null object \n", - " 42 1stFlrSF 1460 non-null int64 \n", - " 43 2ndFlrSF 1460 non-null int64 \n", - " 44 LowQualFinSF 1460 non-null int64 \n", - " 45 GrLivArea 1460 non-null int64 \n", - " 46 BsmtFullBath 1460 non-null int64 \n", - " 47 BsmtHalfBath 1460 non-null int64 \n", - " 48 FullBath 1460 non-null int64 \n", - " 49 HalfBath 1460 non-null int64 \n", - " 50 BedroomAbvGr 1460 non-null int64 \n", - " 51 KitchenAbvGr 1460 non-null int64 \n", - " 52 KitchenQual 1460 non-null object \n", - " 53 TotRmsAbvGrd 1460 non-null int64 \n", - " 54 Functional 1460 non-null object \n", - " 55 Fireplaces 1460 non-null int64 \n", - " 56 FireplaceQu 770 non-null object \n", - " 57 GarageType 1379 non-null object \n", - " 58 GarageYrBlt 1379 non-null float64\n", - " 59 GarageFinish 1379 non-null object \n", - " 60 GarageCars 1460 non-null int64 \n", - " 61 GarageArea 1460 non-null int64 \n", - " 62 GarageQual 1379 non-null object \n", - " 63 GarageCond 1379 non-null object \n", - " 64 PavedDrive 1460 non-null object \n", - " 65 WoodDeckSF 1460 non-null int64 \n", - " 66 OpenPorchSF 1460 non-null int64 \n", - " 67 EnclosedPorch 1460 non-null int64 \n", - " 68 3SsnPorch 1460 non-null int64 \n", - " 69 ScreenPorch 1460 non-null int64 \n", - " 70 PoolArea 1460 non-null int64 \n", - " 71 PoolQC 7 non-null object \n", - " 72 Fence 281 non-null object \n", - " 73 MiscFeature 54 non-null object \n", - " 74 MiscVal 1460 non-null int64 \n", - " 75 MoSold 1460 non-null int64 \n", - " 76 YrSold 1460 non-null int64 \n", - " 77 SaleType 1460 non-null object \n", - " 78 SaleCondition 1460 non-null object \n", - " 79 SalePrice 1460 non-null int64 \n", - "dtypes: float64(3), int64(34), object(43)\n", - "memory usage: 923.9+ KB\n" - ] - } - ], - "source": [ - "housing_df = pd.read_parquet(housing_file_location)\n", - "housing_df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 5000 entries, 0 to 4999\n", - "Data columns (total 9 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 Dates 5000 non-null object \n", - " 1 Category 5000 non-null object \n", - " 2 Descript 5000 non-null object \n", - " 3 DayOfWeek 5000 non-null object \n", - " 4 PdDistrict 5000 non-null object \n", - " 5 Resolution 5000 non-null object \n", - " 6 Address 5000 non-null object \n", - " 7 X 5000 non-null float64\n", - " 8 Y 5000 non-null float64\n", - "dtypes: float64(2), object(7)\n", - "memory usage: 390.6+ KB\n" - ] - } - ], - "source": [ - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "sf_crime_df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 891 entries, 1 to 891\n", - "Data columns (total 11 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 Survived 891 non-null int64 \n", - " 1 Pclass 891 non-null int64 \n", - " 2 Name 891 non-null object \n", - " 3 Sex 891 non-null object \n", - " 4 Age 714 non-null float64\n", - " 5 SibSp 891 non-null int64 \n", - " 6 Parch 891 non-null int64 \n", - " 7 Ticket 891 non-null object \n", - " 8 Fare 891 non-null float64\n", - " 9 Cabin 204 non-null object \n", - " 10 Embarked 889 non-null object \n", - "dtypes: float64(2), int64(4), object(5)\n", - "memory usage: 83.5+ KB\n" - ] - } - ], - "source": [ - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "titanic_df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_all(bench_dict, name='test'):\n", - " # key = list(bench_dict.keys())[-1]\n", - " # val = bench_dict[key]\n", - " # columns = (val['pandas']/val['numpy']).sort_values().index\n", - " # print(columns)\n", - " N=len(bench_dict.items())\n", - " i=0\n", - " transformer=\"\"\n", - " fig, ax = plt.subplots(1, 2, figsize=[18, 8],tight_layout=True)\n", - " plt.subplots_adjust(wspace=0.1)\n", - " dfs=[]\n", - " for key, value in bench_scalers.items():\n", - " df = value.copy()\n", - " df.index = [key]\n", - " dfs.append(df)\n", - " transformer = str(value.index[0]).split('_')[0]\n", - " final_df = pd.concat(dfs)\n", - " (final_df*1e-3).plot.bar(\n", - " ax=ax[0],\n", - " rot=0,\n", - " color=['#c73d22', '#0077ea'],\n", - " logy=True,\n", - " ylabel='runtime (s)',\n", - " xlabel='# of columns',\n", - " ylim=[1e-6, 1],\n", - " width=0.75,\n", - " figsize=[7*1.60, 5],\n", - " legend=True,\n", - " fontsize=14)\n", - " (final_df['pandas']/final_df['numpy']).plot.bar(\n", - " ax=ax[1],\n", - " rot=0,\n", - " color=['#0077ea'],\n", - " legend=False,\n", - " ylabel='runtime speed-up',\n", - " xlabel='# of columns',\n", - " figsize=[7*1.60, 5],\n", - " width=0.75,\n", - " fontsize=14)\n", - " ax[1].xaxis.label.set_fontsize(14)\n", - " ax[0].xaxis.label.set_fontsize(14)\n", - " ax[1].yaxis.label.set_fontsize(14)\n", - " ax[0].yaxis.label.set_fontsize(14)\n", - "\n", - "\n", - " ax[1].set_ylabel('runtime speed-up', labelpad=-25)\n", - " matplotlib.rcParams['legend.fontsize'] = 12\n", - " \n", - " for p in ax[1].patches:\n", - " ax[1].annotate(\n", - " f'{round(p.get_height())}X',\n", - " (p.get_x()+p.get_width()/2., p.get_height()),\n", - " ha='center',\n", - " va='center',\n", - " xytext=(0, 10), textcoords='offset points', fontsize=14)\n", - "\n", - " ax[1].spines['top'].set_visible(False)\n", - " ax[1].spines['right'].set_visible(False)\n", - " ax[1].spines['bottom'].set_visible(False)\n", - " ax[1].spines['left'].set_visible(False)\n", - " ax[1].get_yaxis().set_ticks([])\n", - " ax[1].yaxis.label.set_fontsize(14)\n", - " ax[1].xaxis.label.set_fontsize(14)\n", - " title = f'''{transformer}'''\n", - " plt.suptitle(title, fontsize=16)\n", - " fig.tight_layout()\n", - " fig.savefig(name+\".jpg\")\n", - " plt.show()\n", - " plt.close(fig)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "n_vec = [1, 10, 100]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# DropHighCardinality\n", - "from gators.data_cleaning import DropHighCardinality\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "objs = [DropHighCardinality(max_categories=3)]\n", - "columns = [\"Category\", \"Address\", \"Resolution\"]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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N+ASYFm2SHsyX779HNgb+B/gUODedXWklF4HLgf+EBFts/U2B+4Erk8pTa21K5RUtOrsmI+IWAacmVIaXerYP4FXU0qDSx17D3gwpXRRRHwLOD+ldFz23A3Aiymle3IavCRJNSQimpEZx/j9lNL47LF7gJRSOqka9fQFHgG2SyktyR7bAngWWJhSOjYi7gK6Az1SSl/V7JVIEjTMdwBVFRFbAgcAI8udeoLMt0MALwLdIqIDmRv1d4ErNlDnEGAIwNZbb33A7rvvXtNhS5I20fTp0xemlFpXoWjd/BathsydO5f27dvz7LPPjgNYu3YtzZo148ILL+Soo4764fTp0+nSpQvnnXceAwYMqLSee++9l0GDBrF06dLF646llHj//ffZd999Oemkk1KjRo148cUX6d69+5c5uDRJhSsqO1Fvkg+gFdAAWFDu+AKgN0BKaXVEnAtMJNOl7LoNzXSVUroVuBWgR48eadq0abURtyRpE0TEh/mOoS4YNmwY3bt3p2fPngB88sknLFu2jKuvvporrriCa6+9lmeeeYaTTjqJZs2a8b3vfW+9Oj7//HMuvfRSBg8eTMOGZX/1d+3alfPPP58RI0Zw6aWX0r1791xclqQiVdfGfGy2lNK4lNKuKaWu2eRigyKiX0Tcunjx4o0VlSQpp4YPH86UKVMYO3YsDRo0ADJPPgCOPfZYhg8fTvfu3Rk+fDgnnngiN99883p1LFu2jH79+tGhQweuu+669c6vWLGCe++9l6ZNmzJlyhTqanfsuu6aa67h61//Ottuuy2tW7emX79+vP7662XKDBw4kIgosx144IEl52fNmrXe+XXbr3/9awDmz59Pq1atuP7668vU/cYbb7DVVltx33331f7FSpuhPiUfC4E1QNtyx9sC8ze10pTS+JTSkObNm29ObJIk1ahzzjmHe++9l2eeeYaddtqp5HirVq1o2LAhe+65Z5nye+yxB7Nnzy5zbNmyZfTt2xeARx55hK222mq9di644AJWr17Niy++yLRp0ypMYLRxkyZNYujQoTz33HM888wzNGzYkN69e7No0aIy5Xr37s28efNKtgkTJpSc69ixY5lz8+bNY9SoUUQEJ5xwAgA77LADt9xyC5dccglvvvkmAKtWreKUU07h+9//Pv/1X/+Vu4uWNkG96XaVUvoqIqYDRwIPlDp1JDB2U+uNiH5Av65du25mhJIk1Yxhw4bxl7/8hYkTJ1J+POKWW27J17/+dd55550yx9999106d+5csr906VK++93vklLiscceo1mzZuu1M3HiREaNGsXEiRPZa6+9uP766zn77LPp27cvO++8c+1cXIF6/PHHy+yPGTOG5s2bM3XqVPr161dyvHHjxuywww4V1tGgQYP1zj300EP07t2bHXfcseTYgAED+Otf/8opp5zCCy+8wBVXXMG8efN48skna/CKpNpRp5KP7Iwe67KALYBOEdEdWJRSmg38BhgTES+SmWLwp2SmE/zDpraZnTlkfI8ePQZvtLAkSbXsjDPOYMyYMTz88MO0aNGC+fMzD/ebNWtWkkD8/Oc/58QTT+SQQw6hV69eTJw4kfvuu4+HH34YyCQeffr0YcmSJTz88MN88cUXfPHFFwC0bNmSLbfckqVLlzJo0CCGDRvGIYdklswaPHgwY8eOZdCgQUyaNIkttqhPHSTqlqVLl7J27VpatGhR5viUKVNo06YN2223HYcddhhXXXUVbdq0qbCOf/3rXzz99NPcf//9650bNWoUe+21FyeddBIPPfQQf/vb32jZsmUFtUh1S52aajciDiczWLy8P6eUBmbLDCUzb3k7MmuCnJNSmry5bTvgXFJl1q5dy8KFC/n8889Zs2ZNvsMpGA0aNGC77bajVatWFf6RGxHTU0o9qlBV3flFVgMiKp4k5vLLL+eXv/xlyf7o0aO5+uqr+eijj9hll1246KKL+O///m8g0wXoiCOOqLCeiRMncvjhh/PjH/+Y559/npdffrlMd6w5c+bQrVs3LrvsMs4555yau7Aic+KJJ/Lee+8xbdq0kvE69913H02bNmXHHXdk1qxZXHLJJaxZs4bp06fTuHHj9er4xS9+wR133MHHH39Mo0aN1js/evRoBg0axMknn8xdd91V69ckVUOls13VqeQjH0p1uxr83nvv5TscSXXQ7NmziQjatm1Lo0aNKv3jUFWXUmLVqlUsWLCAlBKdOq2/VmyxJh+q/4YPH859993HlClTyozXKW/u3Ll07tyZv/zlLxx//PFlzq1evZqOHTty8sknVzhRwNq1azniiCOYNm0anTp14pVXXqlwTI+UJ5X+oiz656kOOJe0MV988QUdOnRgyy23NPGoIRHBlltuSYcOHUq6A0mFoLKJAirSvn17vva1r1HRl5/jx49n/vz5nHbaaRW+94YbbuC1117jpZdeYtmyZVx88cU1Er9U24o++ZCkqrDve+3w56pCMmzYsJLEoyoLFy9cuJA5c+bQrl279c7ddtttHHbYYey6667rnXvrrbe4+OKLuemmm9hzzz254447uPHGG5k6dWqNXIdUm4r+ru86H5IkaXOdccYZ3Hnnndxzzz0lEwXMnz+fZcuWAZlpj8877zyef/55Zs2axaRJk+jXrx9t2rThuOOOK1PX7Nmzefzxxxk8eP25cFavXs2pp57K9773PU466SQA+vTpw2mnncagQYNYvnx57V+stBmKPvmw25UkVU2XLl146qmn8h2GVCeNGjWKpUuX8u1vf5t27dqVbCNHjgQyEyy89tprHHvssey6666ceuqp7Lbbbjz//PNss802Zeq64447aN68Of3791+vnWuuuYYPP/yQ3//+92WOjxw5ktWrV3PRRRfV3kVKNaDoB5yv42xXkirz1ltvsccee5Q59sKhtbsGwoGTP6jV+jdFly5duP322+ndu3eN1lvRzxcccC5J9VilAyTr1Dof+eAig5Kk6ogLP813CAUhXds63yFIygO7XdntSlI916VLF6655hr23HNPWrRowaBBg1i5ciWfffYZRx99NK1bt6ZFixYcffTRfPzxxyXvO/zww7n00ks56KCD2GabbejTpw8LFy4sOT9mzBg6d+7M9ttvz1VXXVWmzRdffJGePXuy3Xbb0a5dO84880y++uorIDON7jnnnEObNm3Ydttt2XvvvXn99ddz88OQJNVpRZ98SFIhuPvuu3n88cf54IMPePfdd7nyyitZu3YtgwYN4sMPP2T27Nk0adKEM888s8z77rnnHu68804++eQTvvrqq5L+6W+++Sann346Y8aMYe7cufz73/8uk7g0aNCA3/72tyxcuJDnn3+ep59+mlGjRgHwxBNPMHnyZN59910WL17M/fffz/bbb5+7H4Ykqc4y+ZCkAnDmmWfSsWNHWrZsycUXX8y9997L9ttvT//+/WnatCnbbLMNF198Mf/4xz/KvG/QoEHsuuuuNGnShBNPPJEZM2YA8OCDD3L00Udz6KGH0rhxY6644ooy0+IecMABHHjggTRs2JAuXbrwk5/8pKTuRo0asXTpUt5++21SSuyxxx4VTiUqSSo+RT/mQ5IKQceOHUted+7cmblz57J8+XLOOeccHnvsMT777DMAli5dypo1a2jQoAEAO+ywQ8n7mjZtWjIt6Ny5c8vUufXWW5d5evHuu+8yfPhwpk2bxvLly1m9ejUHHHAAAL169eLMM8/kjDPO4MMPP+T4449n5MiRbLvttrX3A5A2wrE6NcOxOtpcRf/kw3U+JBWCjz76qOT17Nmzad++Pddffz3vvPMO//znP1myZAmTJ08GMmMyNqZdu3Zl6ly+fDn//ve/S/ZPP/10dt99d9577z2WLFnC1VdfXaben/3sZ0yfPp0333yTd999l1//+tc1cZmSpHqu6JMPB5xLKgS33HILH3/8MYsWLeKqq65iwIABLF26lCZNmrDddtuxaNEiRowYUeX6TjjhBB555BGmTJnCV199xWWXXcbatWtLzi9dupRtt92WZs2a8fbbb5dZc+Cll17in//8J6tWrWLrrbdmq622ciVzSRJg8iFJBeGHP/whffr0YaeddmLnnXfmkksu4eyzz2bFihW0atWKAw88kKOOOqrK9e21117ccsst/PCHP6Rdu3a0aNGCr33tayXnR44cyT333MM222zD4MGDGTBgQMm5JUuWMHjwYFq0aFEyW9b5559fo9crSaqfXGQwy0UGJVWmskXw6oraWvwvV+rbIoOOHagZuR474OdWMxzzoSqqdJFBn3xIkiRJyomiTz4ccC5JkiTlRtFPtZtSGg+M79Gjx+B8xyJJm2LWrFn5DkGSpCop+icfkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5UTRT7UbEf2Afl27ds13KJLqkdpeLdlVhCVJhajon3yklManlIY0b94836FIkiRJBa3okw9Jqu+6dOnCyJEj2WeffWjevDkDBgxg5cqVjB49moMPPrhM2Yjg/fffB2DgwIEMHTqU7373uzRr1oyDDjqI+fPnc/bZZ9OiRQt23313XnnllTLtXHPNNey55560aNGCQYMGsXLlSgC6devG+PHjS8quWrWKVq1alXm/JEkmH5JUAO6//34ee+wxZs6cyauvvsro0aOr/L4rr7yShQsX0rhxY3r27Mn+++/PwoULOeGEExg+fHiZ8nfffTePP/44H3zwAe+++y5XXnklAKeccgr/+7//W1JuwoQJtGvXjv3226/GrlGSVP+ZfEhSAfjZz35G+/btadmyJf369WPGjBlVet9xxx3HAQccwFZbbcVxxx3HVlttxSmnnEKDBg0YMGDAek8uzjzzTDp27EjLli25+OKLuffeewH4n//5HyZMmMCSJUsAGDNmDCeffHKNXqMkqf4z+ZCkArDDDjuUvG7atCnLli2r0vvatm1b8rpJkybr7Zevp2PHjiWvO3fuzNy5cwFo3749Bx10EGPHjuXzzz/n0Ucf5aSTTtqka5EkFa6in+1KkgrV1ltvzfLly0v258+fv9l1fvTRRyWvZ8+eTfv27Uv2Tz31VG6//XZWr15Nz5496dChw2a3J0kqLD75kKQCte+++/LGG28wY8YMVq5cyS9/+cvNrvOWW27h448/ZtGiRVx11VUMGDCg5Nz3v/99Xn75ZW688UZOOeWUzW5LklR4Cjb5iIi/RsRnEfFgvmORpHzYddddueyyy+jduze77LLLejNfbYof/vCH9OnTh5122omdd96ZSy65pORckyZN6N+/PzNnzuT444/f7LYkSYUnUkr5jqFWRMThwDbAqSmlEzZWvkePHmnatGm1HZakeuitt95ijz32yHcYedelSxduv/12evfuXWmZX/3qV7z77rtlZr7amMp+vhExPaXUowpV5PQXWW0vMFkscr2Qpp9bzXABVFVRVHaiYJ98pJQmAUvzHYckFYtFixZxxx13MGTIkHyHIkmqo3KefETEoRExLiLmRESKiIEVlBkaETMjYmVETI+IQ3IdpySp6m677TY6duzId7/7XQ499NB8hyNJqqPyMdtVM+B14K7sVkZEDABuBIYCU7L/PhoRe6aUZmfLzKDi2PuklObWUtySVNRmzZpV6bnBgwczePDg3AUjSaqXcp58pJQmABMAImJ0BUWGA6NTSrdl98+KiKOA04GLsnV0r4lYImIIMASgU6dONVGlJEmSpErUqTEfEbElcADwRLlTTwDfqun2Ukq3ppR6pJR6tG7tACpJlSvUyTnyzZ+rJBWXOpV8AK2ABsCCcscXADusX7xyEfEU8ADQNyI+joielZTrFxG3Ll68eFPilVQEGjVqxIoVK/IdRkFasWIFjRo1yncYkqQcqWvJR41JKfVOKbVOKTVNKX0tpfR8JeXGp5SGNG/ePNchSqon2rRpw5w5c1i+fLnf1NeQlBLLly9nzpw5tGnTJt/hSJJyJB8DzjdkIbAGaFvueFtgfu7DkSTYdtttAZg7dy6rVq3KczSFo1GjRrRt27bk5ytJKnx1KvlIKX0VEdOBI8l0mVrnSGBsbbQZEf2Afl27dq2N6iUViG233dY/kiVJ2kz5WOejWUR0j4ju2fY7ZffXTTf1G2BgRJwWEXtExI1Ae+APtRGP3a4kSZKk3MjHmI8ewCvZrQkwIvv6VwAppb8AZwOXADOAg4G+KaUPayMYB5xLkiRJuZHz5COlNCmlFBVsA0uVGZVS6pJSapxSOiClNLkW4/HJhyRJkpQDBTvblSRJkqS6peiTD7tdSZIkSblR9MmH3a4kSZKk3Cj65EOSJElSbph8SJIkScqJok8+HPMhSZIk5UbRJx+O+ZAkSZJyo+iTD0mSJEm5YfIhSZIkKSeKPvlwzIckSZKUG0WffDjmQ5IkScqNok8+JEmSJOWGyYckSZKknDD5kCRJkpQTRZ98OOBckiRJyo2iTz4ccC5JkiTlRtEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKiYb5DkCSpHxZsWIFH3zwAQA777wzTZo0yXNEklTYfPIhSSo6X375JWeffTYtW7Zk3333ZZ999qFly5YMGzaMlStX5js8STk0efJkjjnmGDp06EBEMHr06DLnly1bxllnncXXvvY1mjRpwm677cZvf/vbMmUGDx5c8gVG69atOfbYY3nrrbdKzr/++utstdVWjB07tsz7nnrqKRo1asTUqVNr7frqGpMPSVLROf3003nwwQe5/fbbee+993j//fe5/fbb+etf/8rQoUPzHZ6kHFq2bBndunXjxhtvrPDp5/Dhw/n73//OmDFjeOutt7j44ou58MILGTNmTEmZHj16MHr0aN566y0ef/xxUkr07t2bVatWAdCtWzdGjBjBT3/6UxYsWADA4sWLGTRoEOeeey4HHXRQbi62DoiUUr5jyKuI6Af069q16+D33nsv3+FIkrIiYnpKqUcVilb7F9k222zDQw89xJFHHlnm+JNPPkn//v1ZsmRJ5XFd+Gl1m1MF0rWtc9qen1vNyPXnlmvNmjXj5ptvZuDAgSXHunXrRv/+/RkxYkTJscMOO4y9996bm2++ucJ6Xn31Vfbdd1/efvttdtttNwDWrl3LIYccQqtWrfjb3/7GKaecwowZM5g2bRpbbrllrV5XHkRlJ4r+yYfrfEhS8dl6663p0KHDesc7dOjguA9JZRx88MGMHz+ejz76CIDnnnuOGTNmcNRRR1VY/osvvuDOO++kU6dOdOnSpeT4FltswZ///GeeeuopTjrpJO677z7uuuuuQkw8Nqjokw9JUvE566yzGDFiBCtWrCg5tmLFCq644grOOuusPEYmqa753e9+x7777kunTp1o1KgRhx12GP/v//0/jj766DLlRo0aRbNmzWjWrBmPPvooTz/9NI0bNy5TpmvXrpx//vncc889XHjhhXTv3j2HV1I3ONuVJKnovPDCC/zjH/+gQ4cO7LPPPgC89tprrF69mi+++IJjjjmmpOy4cePyFaakOuCmm27iueeeY9y4cXTu3JnJkydz3nnn0aVLlzJPP0466SSOPPJI5s2bx8iRI/nBD37A1KlTadq0aUmZFStWcO+999K0aVOmTJlCSomISnsoFSSTD0lS0WnVqhX9+/cvc2zHHXfMUzSS6qoVK1Zw0UUX8cADD9CvXz8A9tlnH2bMmMHIkSPLJB/NmzenefPm7LLLLhx44IG0aNGCsWPHcvLJJ5eUueCCC1i9ejUvvvgiPXv25Oabby66p60mH5KkonPnnXfmOwRJ9cCqVatYtWoVDRo0KHO8QYMGrF27ttL3pZRIKfHll1+WHJs4cSKjRo1i4sSJ7LXXXlx//fWcffbZ9O3bl5133rnWrqGuMfmQJElS0Vq2bBnvv/8+kJmRavbs2cyYMYOWLVvSqVMnDjvsMC688EKaNWtG586d+cc//sFdd93FddddB8D777/P2LFj6d27N61bt+bjjz/m2muvpXHjxiXjQpYuXcqgQYMYNmwYhxxyCJBZG2Ts2LEMGjSISZMmscUWxTEUu+in2l2nR48eadq0afkOQ5KUVZtT7e69994b7Gf96quvVh6XU7bWCKfarZ8KcardSZMmccQRR6x3/NRTT2X06NHMnz+fiy66iCeeeIJFixbRuXNnTjvtNM4991wigo8++oghQ4Ywffp0Pv/8c9q2bcuhhx7KpZdeyu677w7Aj3/8Y55//nlefvllttpqq5I25syZQ7du3bjssss455xzcnbNOVDpDbYgn3xEREdgDNAGWA1ckVJ6IL9RSZLqihNOOKHM/qpVq5gxYwZTp07ljDPOyFNUkvLh8MMPZ0Nfxu+www4b7KrZsWNHHn300Q22cccdd1R4vEOHDnz22WdVC7RAFGTyQSbhODulNCMidgCmR8SElNIX+Q5MkpR/l19+eYXHf/3rX/Phhx/mOBpJKh4F2bkspTQvpTQj+3o+sBBomdegJEl13vHHH8/dd9+d7zAkqWDlPPmIiEMjYlxEzImIFBEDKygzNCJmRsTKiJgeEYdsRnsHAA1SSh9tTtySpMI3efLkMnPyS5JqVj66XTUDXgfuym5lRMQA4EZgKDAl+++jEbFnSml2tswMKo69T0ppbqm6WmbbGFzD1yBJqsdKLyIImWkx582bxyuvvFJplyxJ0ubLefKRUpoATACIiNEVFBkOjE4p3ZbdPysijgJOBy7K1tF9Y+1ERGPgYeDalNJzmx24JKlgbL/99mX2t9hiC/baay+uvvpq+vTpk6eoJKnw1akB5xGxJXAAMLLcqSeAb1WjngBGA8+klMZsoNwQYAhAp06dqhuuJKmecpFBqX5wiuSaUZemSK5rA85bAQ2ABeWOLwB2qEY9BwEDgO9HxIzstnf5QimlW1NKPVJKPVq3rjsfiiQpd6699lo+//zzfIchSUWhriUfNSKlNCWltEVKqXup7bWKykZEv4i4dfHixbkOU5JUB1x99dUsWrQo32FIUlGoa8nHQmAN0Lbc8bbA/NpoMKU0PqU0pHnz5rVRvSSpjtvQ4mKSpJpVp5KPlNJXwHTgyHKnjgRqZdC4Tz4kSZKk3MjHOh/NIqJ7RHTPtt8pu79uxPdvgIERcVpE7BERNwLtgT/URjw++ZCk4vbmm2/SuXPnfIchSUUhH7Nd9QAmltofkd3+DAxMKf0lIrYHLgHakVkTpG9K6cPaCCYi+gH9unbtWhvVS5LquI4dO+Y7BEkqGlVKPiJiD+C/gcOALkAT4FPgZeBRYGxK6cuq1JVSmgTERsqMAkZVpb7NlVIaD4zv0aOHCxFKUgHbYostyMzEvnFr1qyp5WgkqThtMPmIiP2B64CDgalkxl08CKwAWgLdgKuAmyLiOuCGqiYhkiTl0v3331+SfCxYsIDLLruM4447jp49ewLw/PPP8/DDDzNixIh8hilJBW1jTz7+Sib5+EFK6bPKCkVET+Ac4DwyyUi9YbcrSSoOJ5xwQsnrY445hmuuuYbBg//z0PtHP/oR3/jGN3j44YcZOnRoPkKUpIK3sQHnu6SUbtlQ4gGQUno+pXQi8OuaCy03HHAuScXnmWee4Ygjjljv+BFHHMGkSZNyH5AkFYkNJh/ZqW8rFRGNqlNekqS6oFWrVjz44IPrHX/wwQdp3bp1HiKSpOJQ5dmuIuJnwJyU0tjs/h3AqRHxAXBMSumdWopRkqQa9atf/YpBgwYxceLEkjEfL7zwAk899RR33HFHnqOTpMJVnXU+fkZmhisi4lDgROCHwAzg+hqPLEdcZFCSis8pp5zCc889R6tWrRg3bhzjxo1j++23Z+rUqZx66qn5Dk+SClZ11vnoAMzMvu4HPJBSuj8iXgOerfHIcsSpdiWpOH3zm9/k7rvvzncYklRUqvPkYwnQJvv6SODp7OtVwFY1GZQkSbVtwYIFjBw5kqFDh7Jw4UIApk6dysyZMzfyTknSpqpO8vEEcFtE3A50JbO4IMBe/OeJiCRJdd706dPZbbfduPvuu7n99ttZsmQJAE8++SQXX3xxnqOTpMJVneTjDDILDbYGTkgpLcoe3x+4t6YDyxXHfEhS8TnvvPMYNmwYr7zyCo0bNy45/p3vfIepU6fmMTJJKmxVHvORUloCnFXB8ctrNKIcc8yHJBWf6dOnVzirVbt27ViwYEEeIpKk4rDBJx8RsU11KqtueUmS8qFJkyZ89tn66+e+/fbbtGnTpoJ3SJJqwsa6Xb0XEZdExNcqKxARW0TEdyPiSTJdsyRJqtOOPfZYRowYwZdffglARDBr1iwuuOAC+vfvn+foJKlwbazb1SHAVcC/slPqTgPmAiuBFsCewIHACuBq4LbaC1WSpJoxcuRI+vbtS+vWrVm+fDkHH3wwCxYs4KCDDuLKK6/Md3iSVLA2mHyklN4DToyIjmQWFTwE+AbQBFgIvALcCkxIKa2t5VglSaoR2267LVOmTOGZZ57h5ZdfZu3atey///707t0736FJUkGr0oDzlNJHZFYxr7crmVcmIvoB/bp27ZrvUCRJOdarVy969eqV7zAkqWhUZ6rdgpRSGp9SGtK8efN8hyJJyqFRo0ax11570bRpU/71r38BcO2113L//ffnOTJJKlxFn3xIkorPDTfcwJVXXsmQIUNIKZUc79ChAzfffHMeI5OkwmbyIUkqOn/4wx+47bbbGDZsGA0b/qcH8v77788bb7yRx8gkqbCZfEiSis6HH35It27d1jveqFEjVqxYkYeIJKk4mHxIkorOTjvtxMsvv7ze8QkTJrDnnnvmISJJKg5Vmu1qnYhoC5wM7AxcmlJaGBEHAXNTSjNrI0BJkmraeeedx5lnnsny5ctJKfH8888zZswYrrvuOv70pz/lOzxJKlhVTj4i4gDgaWAmsBfwazJrfRwJ7Ar8sDYClCSppg0aNIjVq1fzi1/8guXLl3PyySfTvn17fve73zFgwIB8hydJBas6Tz5GAjemlC6PiKWljj8ODKrZsHLHdT4kqTgNHjyYwYMHs3DhQtauXUubNm3yHZIkFbzqjPk4APhzBcfnAW1rJpzcc50PSSpeH3zwAS+88AIvvvhiyVofkqTaU50nHyuAFhUc3x34pGbCkSSp9v373//mxz/+MePGjWOLLTLfw6WUOProo/nTn/7E9ttvn+cIJakwVefJx9+AyyOicXY/RUQX4P8BY2s6MEmSastpp53G+++/z7PPPsvKlStZuXIlkydPZubMmQwePDjf4UlSwarOk4/zgAnAp0BTYAqZ7lZTgUtqPjRJkmrH448/ztNPP03Pnj1Ljh100EH88Y9/pHfv3nmMTJIKW5WTj5TSEuDgiOgF7E/mqcnLKaWnais4SZJqQ+vWrdl6663XO960aVO7XElSLar2IoMppWdSSiNTSteZeEiS6qPLLruMs88+mzlz5pQcmzNnDueeey6XXXZZHiOTpMJW3UUG9wOOANpQLnFJKf28BuPaZBGxHfAUmWtrSGZ64NvyGpQkqU654YYbmDVrFl26dKFDhw5AJvnYaqut+OSTT/jd735XUvbVV1/NV5iSVHCqs8jgz4FrgQ+BBUAqdTpV+Kb8WAocmlJaHhFbA69HxEMppX/nOzBJUt1wwgkn5DsESSpK1XnycQ5wekrpj7UVTE1IKa0Blmd3GwOR3SRJAuDyyy/PdwiSVJSqM+ZjC+DpzWksIg6NiHERMSciUkQMrKDM0IiYGRErI2J6RByyCe1sFxH/B3wM/DqltHBz4pYkFZZPP/2UTz/9tGT/tdde45JLLuHee+/NY1SSVPiqk3z8Hhi0me01A14HhpFZtLCMiBgA3AhcDewHPAc8GhGdSpWZERGvV7C1X1cmpfR5SmlfYEfghxFRb1dglyTVvBNPPJHx48cDsHDhQg499FD++te/8tOf/pTrr78+z9FJUuGqTrerEcCEiHiFTAKxqvTJlNKPNlZBSmkCmbVCiIjRFRQZDowuNUD8rIg4CjgduChbR/eqBpxSWpB9AnII8GBV3ydJKmyvvvoqBx54IAAPPvggXbt25aWXXuJvf/sb559/Pueee26eI5SkwlSdJx9XAX2A1UALoHW5bbNExJbAAcAT5U49AXyrGvW0jYhtsq+bA4cC71RSdkhETIuIaaUfv0uSCtuKFSto1qwZAE899RTHHHMMAPvvvz8fffRRPkOTpIJWneRjKPDDlNLXU0pHp5T6ld5qIJZWQAMyM2mVtgDYoRr1dAaezT7xeBa4KaX0WkUFU0q3ppR6pJR6tG692fmTJKme2GWXXXjooYf46KOPeOKJJ+jTpw8ACxYsYLvttstvcJJUwKqTfKwAXqmtQGpKSunFlFL3lNK+KaV9NjY7V0T0i4hbFy9enKsQJUl5dvnll3PBBRfQpUsXDjzwQL75zW8C8Pjjj7PffvvlOTpJKlzVST5+C5wdEbU1be1CYA1QfnB4W2B+LbVJSml8SmlI8+bNa6sJSVIdc/zxxzN79mymTZvGY489VnK8d+/e/OY3v8ljZJJU2Koz4PwQMuMnvhcRb7L+gPNjNieQlNJXETEdOBJ4oNSpI4Gxm1P3hkREP6Bf165da6sJSVId1LZtW9q2Lft917onIJKk2lGd5GMh8NDmNBYRzYB1f+VvAXSKiO7AopTSbOA3wJiIeBGYCvwUaA/8YXPa3ZCU0nhgfI8ePQbXVhuSJEmSqpF8pJQ2d40PgB7AxFL7I7Lbn4GBKaW/RMT2wCVAOzJT+vZNKX1YA21LkiRJyqPqPPnYbCmlScAGx4yklEYBo3ISEHa7kiRJknJlg8lHRLwKHJZS+iwiXgNSZWVTSvvUdHC5YLcrSZIkKTc29uRjLPBlqdeVJh+SJNUnCxYsYMyYMXzwwQdcccUVtGrViqlTp9K+fXt23HHHfIcnSQVpg8lHSmlEqde/rPVo8sBuV5JUfKZPn863v/1tdtxxR9544w3OP/98WrVqxZNPPsm7777LPffck+8QJakgVXmdj4h4JiK2q+D4thHxTI1GlUOu8yFJxee8885j2LBhvPLKKzRu3Ljk+He+8x2mTp2ax8gkqbBVZ5HBw4EtKzi+FZk1QCRJqhemT5/Oqaeeut7xdu3asWDBgjxEJEnFYaOzXUXE/qV294mIRaX2GwDfAebUdGC5YrcrSSo+TZo04bPPPlvv+Ntvv02bNm3yEJEkFYeqTLU7jcxA8wQ8UcH5FcBZNRlULjnblVT4Xjh053yHsFEHTv4g3yEUlWOPPZYRI0bwwAMPABARzJo1iwsuuID+/fvnOTpJKlxV6Xa1I7AzmfU5vpHdX7d1ALZNKf2p1iKUJKmGjRw5kkWLFtG6dWuWL1/OwQcfTNeuXdluu+248sor8x2eJBWsjT75KLW6eHXGh0iSVGdtu+22TJkyhWeeeYaXX36ZtWvXsv/++9O7d+98hyZJBa1aK5xHxNeAQ4E2lEtGUkq/qcG4Clp96AICdgMpz89NKjy9evWiV69e+Q5DkopGlZOPiDgJ+BOwGviUsgsOJqBeJh8OOJek4vTKK68wceJEPvnkE9auXVvm3HXXXZenqCSpsFXnycevgOuBS1NKa2opnpxzwLkkFZ/rrruOCy+8kM6dO9O2bVsiouRc6deSpJpVneSjLXB7ISUekqTi9Nvf/pbf//73/OQnP8l3KJJUVKoziHwC8M3aCkSSpFxZu3Yt3/72t/MdhiQVneo8+XgS+H8RsRfwGrCq9MmU0kM1GZgkSbXl9NNP58477+Sqq67KdyiSVFSqk3z8MfvvLyo4l8isdl7vOOBckorP5ZdfTt++fdlvv/3o1q0bjRo1KnP+T39y+SpJqg1V7naVUtpiA1u9TDwgM+A8pTSkefPm+Q5FkpQjF198MU888QQNGzbks88+49NPPy2zSZJqR7XW+ZAkqRCMGjWKe+65hwEDBuQ7FEkqKtVZ52P4hs67yKAkqb5o0qQJ++23X77DkKSiU50nH2eV228EtANWAJ9QTxcZlCQVn3POOYcbbriBW265xXU9JCmHqpx8pJR2LH8sItoCdwK31WRQkiTVpmeffZbJkyfz97//nT333HO9Aefjxo3LU2SSVNg2a8xHSmlBRFwM3A/8tWZCkiSpdrVq1Yrjjz8+32FIUtGpiQHnW5BZ/VySpHrhzjvvzHcIklSUqjPgvPxXREFmzMcZwLM1GVQuuc6HJEmSlBvVefLxYLn9BHwKPAOcW2MR5VhKaTwwvkePHoPzHYskqfbss88+/OMf/6BFixbsvffeGxxo/uqrr+YwMkkqHtUZcF7lBQklSapr+vfvT+PGjUteO8uVJOVelZKPiGgETAFOSSm9U7shSZJU8y6//PKS17/85S/zF4gkFbEqPc1IKa0CdiTT1UqSpHqtV69efP755+sdX7JkCb169cp9QJJUJKrTlerPgOMiJEn13qRJk/jqq6/WO75y5UqefbbezqEiSXVedQacbw2cFBFHAtOBL0qfTCn9rCYDkySppr388sslr1999VVatmxZsr9mzRoef/xxOnTokI/QJKkoVCf52ANYd9feqdy5OtcdKyKaAm8BD6SUzst3PJKk/OvRowcRQUTQp0+f9c43adKEm266KQ+RSVJxqM5sV0fUZiC14GLghXwHIUmqO2bOnElKiZ122okXX3yR1q1bl5zbcsstadOmDQ0aNMhjhJJU2GpihfM6JyJ2AXYHxgPd8hyOJKmO6Ny5MwBr167NcySSVJxymnxExKHAecABQHtgUEppdLkyQ4Hzyaye/gZwdkqpuqP/Rmbr+NbmxixJKkwff/wxkydP5pNPPlkvGRk+fHieopKkwpbrJx/NgNeBu7JbGRExALgRGEpmXZGhwKMRsWdKaXa2zAwqjrtPSmluRBwLvJtSejciTD4kSeu5++67+dGPfkTDhg1p3bp1mQUHI8LkQ5JqSU6Tj5TSBGACQESMrqDIcGB0Sum27P5ZEXEUcDpwUbaO7htp5kDgvyLiB2SSnUYRsSSl9KvNvwJJUiG47LLLOPfcc7niiisc4yFJOVSddT5qVURsSaY71hPlTj1BNbpPpZQuSil1TCl1IdPF67bKEo+IGBIR0yJi2qeffrqJkUuS6psFCxZw2mmnmXhIUo7VmeQDaAU0ABaUO74A2KE2Gkwp3ZpS6pFS6lF6xhNJUmHr27cv//znP/MdhiQVnYKc7Wqd8oPZKxIR/YB+Xbt2rf2AJEl1wpFHHskFF1zAG2+8wd57702jRo3KnD/++OPzFJkkFba6lHwsBNYAbcsdbwvMr61GU0rjgfE9evQYXFttSJLqlp/85CcAXH311eudiwjWrFmT65AkqSjUmW5XKaWvgOnAkeVOHQk8V1vtRkS/iLh18eLFtdWEJKmOWbt2baWbiYck1Z6cJh8R0SwiukdE92zbnbL7nbJFfgMMjIjTImKPiLiRzHogf6itmFJK41NKQ5o3b15bTUiSJEki992uegATS+2PyG5/BgamlP4SEdsDl5BZZPB1oG9K6cMcxylJKmC/+c1vNnjedT4kqXbkep2PSUBspMwoYFROAsIB55JUjG666aYy+6tWrWLevHk0adKENm3amHxIUi2pSwPO88IB55JUfGbOnLnesQULFjBo0CAGD/bXgSTVljoz4FySpHxq27YtV111FT//+c/zHYokFayiTz6c7UqStM7atWtZsKD8WreSpJpityu7XUlS0XnooYfK7KeUmDdvHrfccguHHHJInqKSpMJX9MmHJKn4nHDCCWX2I4LWrVvTq1cvrr/++jxFJUmFz+RDklR01q5dm+8QJKkoOebDMR+SVFRWrVrFN7/5Td555518hyJJRafokw9XOJek4tKoUSNmzpxJxAaXnZIk1YKiTz4kScXn1FNP5bbbbst3GJJUdBzzIUkqOl988QV33303Tz75JAcccABbb711mfO/+93v8hSZJBW2ok8+IqIf0K9r1675DkWSlCNvvfUW+++/PwD/+te/ypyzO5Yk1Z6iTz5c50OSis/EiRPzHYIkFSXHfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ4o++XCRQUmSJCk3ij75cJFBSZIkKTeKPvmQJEmSlBsmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ4o++XCdD0mSJCk3ij75cJ0PSZIkKTeKPvmQJEmSlBsmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJxrmO4DaEBGzgCXAWuCzlNIR+Y1IkiRJUkEmH1nfSikty3cQkiRJkjLsdiVJkiQpJ3KafETEoRExLiLmRESKiIEVlBkaETMjYmVETI+IQzahqQT8IyJeioiTNjtwSZIkSZst192umgGvA3dltzIiYgBwIzAUmJL999GI2DOlNDtbZgYVx90npTQ3+/rglNKciGgHPBURr6WUXq3xq5EkSZJUZTlNPlJKE4AJABExuoIiw4HRKaXbsvtnRcRRwOnARdk6ulehnTnZf+dFxARgf8DkQ5IkScqjOjPmIyK2BA4Anih36gngW9WoZ+uI2Cb7uhnQC3ijkrJDImJaREz79NNPNy1wSZIkSVVSZ5IPoBXQAFhQ7vgCYIdq1NMWmBIR/we8ANyVUnqpooIppVtTSj1SSj1at269KTFLkiRJqqKCm2o3pfQvYN+qlo+IfkC/rl271l5QkiRJkurUk4+FwBoyTy5KawvMr61GU0rjU0pDmjdvXltNSJIkSaIOJR8ppa+A6cCR5U4dCTxXW+1GRL+IuHXx4sW11YQkSZIkcr/OR7OI6B4R3bNtd8rud8oW+Q0wMCJOi4g9IuJGoD3wh9qKyScfkiRJUm7k+slHD+CV7NYEGJF9/SuAlNJfgLOBS4AZwMFA35TSh7UVkE8+JEmSpNzIafKRUpqUUooKtoGlyoxKKXVJKTVOKR2QUppcyzH55EOSJEnKgToz5kOSJElSYSv65MNuV5IkSVJuFH3yYbcrSZIkKTeKPvmQJEmSlBsmH5IkSZJyouiTD8d8SJIkSblR9MmHYz4kSZKk3Cj65EOSJElSbph8SJIkScqJok8+HPMhSZIk5UbRJx+O+ZAkSZJyo+iTD0mSJEm5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJwo+uTD2a4kSZKk3Cj65MPZriRJkqTcaJjvACRJEBd+mu8QNipd2zrfIUiS6rmif/IhSZIkKTdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUE0WffDjVriRJkpQbRZ98ONWuJEmSlBtFn3xIkiRJyg2TD0mSJEk5YfIhSZIkKSdc4VyVcsXl+snPTZIk1VU++ZAkSZKUEyYfkiRJknKiIJOPiNgxIiZGxJsR8VpEbJ3vmCRJkqRiV6hjPkYDl6SUno2IlsCXeY5HkiRJKnoFl3xExF7AqpTSswAppUV5DkmSJEkSOe52FRGHRsS4iJgTESkiBlZQZmhEzIyIlRExPSIOqWYzuwDLImJ8RLwcEb+okeAlSZIkbZZcP/loBrwO3JXdyoiIAcCNwFBgSvbfRyNiz5TS7GyZGVQcd5+U0tzsuUOA7sAnwGMR8VJK6ckavxpJkiRJVZbT5COlNAGYABARoysoMhwYnVK6Lbt/VkQcBZwOXJSto/tGmpkDTEspfZRtZwKZRMTkQ5IkScqjSCnlp+GIZcCZKaXR2f0tgeXAf6eUHihV7hagW0rpsCrW2xB4CegFLAb+BvwxpfRIBWWHAEOyu7sB72zyBRWmVsDCfAehavNzq5/83NbXOaXkipSbICKGpJRuzXccqh4/t/rJz6166tKA81ZAA2BBueMLgN5VrSSltDo7zmMyEMATFSUe2bK3Av7HUomImJZS6pHvOFQ9fm71k5+batgQ/P1WH/m51U9+btVQl5KPGpNSehR4NN9xSJIkSfqPurTI4EJgDdC23PG2wPzchyNJkiSpJtWZ5COl9BUwHTiy3KkjgedyH5HwEWJ95edWP/m5qSb531P95OdWP/m5VUNOB5xHRDOga3b3OeBaYBywKKU0OzvV7hgyU+xOBX4K/BjYK6X0Yc4ClSRJklTjcp18HA5MrODUn1NKA7NlhgI/B9qRWRPknJTS5ByFKEmSJKmW5G2qXUmSJEnFpc6M+VDdEBGHRsS4iJgTESkiBuY7JpW1sc8oMn4ZEXMjYkVETIqIvfIUbtGqic8pIlpExJiIWJzdxkTEdrm8DtUf3r/rB+/h9YP38Npj8qHympHp7jYMWJHnWFSxjX1GPwfOBc4Cvg58AjwZEdvkLEJBzXxO9wD7A0dlt/3JjIuTKuL9u37wHl4/eA+vJXa7UqXKr0Kvuqf8ZxQRAcwFbk4pXZU91oTMTfG8lNIf8xVrMduUzyki9gDeBA5OKU3NljkYeBbYPaX0Tu6vRPWF9+/6wXt4/eA9vGb55EMqLDsCOwBPrDuQUloBTAa+la+gtJ6qfE49gWWUnWp8KvAFfpZSofIeXj94D98MJh9SYdkh+++CcscXlDqn/KvK57QD8Gkq9Xg6+/oT/CylQuU9vH7wHr4ZTD4kSZIk5YTJh1RY5mf/bVvueNtS55R/Vfmc5gOts32LgZJ+xm3ws5QKlffw+sF7+GYw+ZAKy0wyN7Uj1x2IiK2AQyjb71T5VZXP6Xkys630LPW+nsDW+FlKhcp7eP3gPXwzNMx3AKpbIqIZ0DW7uwXQKSK6A4tSSrPzFphKbOwziogbgF9ExNvAu8AlZAa93ZOHcIvW5n5OKaW3IuIx4I8RMSRbzx+BR4p5lhRVzvt3/eA9vH7wHl57nGpXZUTE4cDECk79OaU0MKfBqEIb+4yyj3UvB34CtAD+CZyRUno9Z0GqRj6niGgB3AQckz00jsx0j5/XXuSqr7x/1w/ew+sH7+G1x+RDkiRJUk445kOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQ8igidoiIJyLii4iolXmvI+LwiEgR0ao26pekYuU9XKo+kw+pCiKidUR8FRFbR0Sj7C+aTjVQ9XlAe6A70K4G6pMkleM9XKo7GuY7AKme6An8X0rpi4j4JrAopTS7BurtCkxPKb1XA3VJkirmPVyqI3zyIVXNt4Cp2dcHl3q9QRHxk4h4P/uN2/sRMbjUuVnAscAp2UfqozdQT9+I+GdErIiIf0fE+IjYKnuuRUT8OSI+y55/KiL22kBdAyNiWbljZR7rrysTEd+NiLcjYnlEjIuI5hFxQkS8FxGLI2JMRDQpVc+kiBgVEVdHxMKI+CQiRkbEFqXKHB8Rr2ZjXRQR/4iItlX5eUrSJvIe7j1cdYRPPqRKZB/Jv5rdbQqsiYiBQBMgRcTnwD0ppaGVvP844GbgHOAJ4DvAqIiYn1IaD3wduAdYBAwDVlRSz1HAOOBaYBCZ/2/78J8vD0YDu5H5JfgZcBXwWETsmlKqsM4qagycC5wEbAmMzW4rgP7A9sBDwFDg+lLvOwm4kcwv++7Za5wO3BsROwD3ARdl62oGHLgZMUpShbyHew9XHZVScnNzq2Aj8wuiC7AP8FX2352BpcCh2XOtNvD+qcCfyh0bDUwptf8IMHojcUwF7qvk3C5AAg4tdaw5sBg4Lbt/eLZMq+z+QGBZuXoqKpOA3UqVGQmsKX3N2et5pNT+JOD5cnU/Cdyefb1/tt7O+f583dzcCnvzHu493K1ubna7kiqRUlqdUpoF7A68lFJ6FdgBWJBSmpxSmpVSWriBKvZg/Uf7U4A9qxnKfsDTG2hjLfB8qbgXA69tQjvlfZlSeqfU/gJgfrlrXgC0Kfe+V8vtzy1V5v+Ap4DXI2JsRJweEa03M05JWo/3cO/hqpvsdiVVIiLeADoDjYAtsn1sGwINs68/TClV2i93A2plOsZqtLMWiHLHGlVQbnUF9a2q4Fj5LzEqLZNSWhMRfcg8pu8D/Bi4JiIOSyn9XyXxSlK1eQ/3Hq66yScfUuX6kunvOh/4n+zr14Gzs6/7buT9bwEHlTt2MPBmNeN4Bfj2BtrYgsxMLgBExLbA3hto51OgabbcOt2rGdMmSxnPp5RGkOkzPRcYkKv2JRUN7+G1wHu4NpdPPqRKpJQ+zA6uawv8jcy3P3sBY1NK86pQxa+BByJiOpnBikeRGch3fDVDuQoYHxHvkxn4F2S+cfpjSum9iPgb8MeIGAJ8ni2/JFu2Iv8EviDzbdVvgX3JDDisdRFxINAbeJzM4/79gI5U/5e5JG2Q9/Ca5z1cNcEnH9KGHU6mr/BK4BvAx1X8pUVK6WHgLDIzpbxJZjaUoSkzS0qVpZQmAMcB3yXzDdo/gCPIPHqHzOwpL5KZTeVFMrO6HJUqmSUlpbSIzC/QI8n0Kx4CXFqdmDbDYjLfJD4CvEdmhpUrUkr/m6P2JRWXw/EeXpO8h2uzRUq56rooSZIkqZj55EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk78f01mzfza0V6zAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_all(bench_scalers, name= \"DropHighCardinality\")" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Cq06l65rpqvMvBa4FqBfv375+OOPN0bckqQNEBGzyx1Dc3HYYYdx9NFHs8MOO/DKK68wZswYBgwYwIwZM9h8881Xl+vUqRMXX3wxw4cP51vf+haDBg1aR62S1PCaU/JRJ5k5EZhY1/IRMRgY3KdPn8YLSpKkRvT1r/9rvPhuu+3G3nvvzfbbb8+f//xnjj766NXnVq5cyY033kjbtm157LHHWLp0KVtssUU5QpZUoZrUmI/1WACsALpVO94NeGNDK83MSZk5skOHDhsTmyRJTUbPnj35xCc+wd///vc1jl9xxRU8/fTTPPbYYyxatIjRo0eXKUJJlarZJB+Z+TGFRQMPrXbqUAqzXm2QiBgcEde+9957GxOeJElNxoIFC5g7dy49evRYfez5559n9OjRXHnllfTt25cbbriB8ePHM3369DJGKqnSNKnkIyLaR8QeEbEHhdi2K+6vmkr3J8CwiDghInaOiPEU1vb4xYZe05YPSVJTt2jRImbOnMnMmTNZuXIlc+bMYebMmcyZM4dFixZx1lln8fDDD/PKK68wdepUBg8eTNeuXTnqqKMAWL58Occffzxf/vKXOe644wAYOHAgJ5xwAsOHD2fx4sXl/HiSKkhkNp1JQiLiIAqDxav7dWYOK5YZBfwXhekBnwFOz8xpG3ttB5xLqs3KlStZsGAB7777LitWrCh3OC3GpptuytZbb03nzp3ZZJO1/xYWETMys18dqmo6X2SNZOrUqRx88MFrHT/++OP5+c9/zle/+lWefPJJ3n33XXr06MHBBx/MBRdcwLbbbgvABRdcwFVXXcUzzzxDly7/mkBs0aJF7L777gwePJjx48eX7PNIavFqne2qSSUf5VBlwPmI6n1jJQlgzpw5RATdunWjdevWRNT6TFUdZSbLli1j/vz5ZCbbbbf2WrEmH5LUbNX6Rdmkul2Vg92uJK3Phx9+SK9evdhss81MPBpIRLDZZpvRq1cvPvzww3KHI0kqkYpPPiSpLmrqFqSN589VkipLxT/1ne1KkiRJKo2KTz7sdiVJddO7d2/uueeecochNRvTpk3jyCOPpFevXkQEEyZMqLXsiSeeSEQwbty41cfeeOMNOnfuzOWXX75G2WeffZYtttiC//mf/2ms0KVG0+JWOJekUnik/06NWv++015u1PolNb5Fixax6667MnToUIYOHVprudtuu41HH32Unj17rnG8e/fuXH311QwbNozDDz+cvn37smzZMoYOHcpXv/rVNVa2l5qLik8+qsx2Ve5QJEnNQHz/rXKH0CLkJV3WX6iZGzRoEIMGDQJg2LBhNZaZPXs2p556Kvfccw+HH374WueHDBnCH/7wB4YOHcojjzzCBRdcwOuvv87dd9/dmKFLjcZuV3a7ktTM9e7dm4svvpi+ffvSsWNHhg8fztKlS3nnnXc44ogj6NKlCx07duSII47gtddeW/2+gw46iB/+8Ifsv//+bLnllgwcOJAFCxasPn/TTTex/fbbs8022zB27Ng1rvnoo4+y3377sfXWW9OjRw9OPvlkPv74Y6Awje7pp59O165d2Wqrrdhtt9145plnSvPDkJqR5cuX841vfIMxY8aw884711rummuuYe7cuRx33HFcfPHFXH/99XTq1KmEkUoNp+KTD0lqCW6++WbuuusuXn75ZV566SUuvPBCVq5cyfDhw5k9ezZz5syhTZs2nHzyyWu875ZbbuHGG2/kzTff5OOPP17d3/y5557jpJNO4qabbmLevHm8/fbbayQum266KT/96U9ZsGABDz/8MPfeey/XXHMNAFOmTGHatGm89NJLvPfee9x6661ss802pfthSM3EeeedR+fOnTnppJPWWa5Tp05cfPHF3HrrrXzjG99Y3ZoiNUcmH5LUApx88slsu+22dOrUidGjR/Pb3/6WbbbZhmOOOYa2bduy5ZZbMnr0aB544IE13jd8+HA+9alP0aZNG772ta8xc+ZMoNAH/YgjjqB///5svvnmXHDBBWtMi7v33nuz77770qpVK3r37s2JJ564uu7WrVvzwQcf8MILL5CZ7LzzzvTo0aNkPwupOZg6dSoTJkzghhtuWG/ZlStXcuONN9K2bVsee+wxli5dWoIIpcZh8iFJLcC22267+vX222/PvHnzWLx4MSeeeCLbb789W221Ff379+fdd99lxYoVq8t279599eu2bduyaNEiAObNm7dGne3atVuj9eKll17iiCOOoHv37my11Vb84Ac/WN1la8CAAZx88sl85zvfoWvXrowcOZL333+/0T671BxNnTqV119/nR49etCqVStatWrF7NmzOfvss/nEJz6xRtkrrriCp59+mscee4xFixYxevToMkUtbbyKTz5c50NSS/Dqq6+ufj1nzhx69uzJ5Zdfzosvvsjf/vY33n//faZNmwYUxmSsT48ePdaoc/Hixbz99tur90866SQ+85nP8Pe//53333+fiy66aI16v/vd7zJjxgyee+45XnrpJS677LKG+JhSizFq1CieeuopZs6cuXrr2bMnp59+Ovfee+/qcs8//zyjR4/myiuvpG/fvtxwww2MHz+e6dOnlzF6acNV/GxXmTkJmNSvX78R5Y5FkjbU1VdfzRFHHEHbtm0ZO3YsQ4YM4YMPPqBNmzZsvfXWLFy4kPPPP7/O9R177LHss88+PPTQQ3zuc5/j3HPPZeXKlavPf/DBB2y11Va0b9+eF154gZ///Od06VKYveixxx5j5cqV7LXXXrRr144tttjClcxVkRYtWsQ//vEPoNB1as6cOcycOZNOnTqx3Xbb0bVr1zXKt27dmu7du/PpT38aKAxIP/744/nyl7/McccdB8DAgQM54YQTGD58ODNnzqRt27al/VDSRvLbQJJagG9+85sMHDiQHXfckZ122okxY8Zw2mmnsWTJEjp37sy+++7LYYcdVuf6dtllF66++mq++c1v0qNHDzp27LhGV5Bx48Zxyy23sOWWWzJixAiGDBmy+tz777/PiBEj6Nix4+rZsr73ve816OeVmoPHH3+cPffckz333JMlS5Zw3nnnseeee3LuuefW6f0XX3wxs2fP5uc///kax8eNG8fy5cs555xzGiNsqVFFXZrfK0G/fv3y8ccfL3cYkpqg559/fp3TYJZb7969uf766znkkEPKHcoGqe3nGxEzMrNfHaoo6ReZ63w0jEpY50PN07Rp0xg3bhwzZsxg3rx53HjjjbWu03LiiSdy7bXXctlll3HWWWcBhZXpd911V8455xzOPPPM1WWfffZZ9t57byZMmFAJC0RGbSds+ZAkSZKKVq1MP378eNq0aVNrufWtTD9mzBiee+45AFemr6Likw8HnEuSJGmVQYMGcdFFF3HsscfWOl5t1cr0t9xyC61bt17r/JAhQ/jKV77C0KFDWb58+eqV6Veth1TJHHDugHNJzdwrr7xS7hAkqWLUZ2X6XXbZheOOO47bb7+dO+64w5XpseVDkiRJqjNXpt84Fd/yIUmSJNXFqpXpZ86cud6yNa1Mv8UWWzR+kE2cyYckSWrxnKWsYVT6LGVVV6ZfZcWKFZx99tlcccUVvPbaa6uPV12Z/ktf+hKjR4/m8ssvL0fYTYrJhyRJklQHo0aN4thjj13j2Je+9CW+8Y1vMGLEv4YPr1qZ/vrrr1+9Mv2gQYM4+uij2X///UsddpNi8iFJkiQVuTJ943LAuSRJklTkyvSNq+JbPiJiMDC4T58+5Q5FUjPS2P3HK71ftSSVy0EHHURm1rl89enOf/jDH/LDH/5wrXLt27fnn//858aG1+xVfMtHZk7KzJEdOnQodyiSJElSi1bxyYckNXe9e/dm3Lhx7L777nTo0IEhQ4awdOlSJkyYwAEHHLBG2YhY3Zd52LBhjBo1isMPP5z27duz//7788Ybb3DaaafRsWNHPvOZz/Dkk0+ucZ2LL76Yvn370rFjR4YPH87SpUsB2HXXXZk0adLqssuWLaNz585rvF+SJJMPSWoBbr31Vv7yl78wa9YsnnrqKSZMmFDn91144YUsWLCAzTffnP3224+99tqLBQsWcOyxx3LGGWesUf7mm2/mrrvu4uWXX+all17iwgsvBGDo0KH893//9+pykydPpkePHuy5554N9hklSc2fyYcktQDf/e536dmzJ506dWLw4MF1WgAL4KijjmLvvfdmiy224KijjmKLLbZg6NChbLrppgwZMmStlouTTz6Zbbfdlk6dOjF69Gh++9vfAvDv//7vTJ48mffffx+Am266iW9961sN+hklSc2fyYcktQDdu3df/bpt27YsWrSoTu/r1q3b6tdt2rRZa796Pdtuu+3q19tvvz3z5s0DoGfPnuy///78/ve/59133+XOO+9cPcWkJEmrVPxsV5LUUrVr147Fixev3n/jjTc2us5XX3119es5c+bQs2fP1fvHH388119/PcuXL2e//fajV69eG309SZXNlekbRlOaQdGWD0lqoT772c/y7LPPMnPmTJYuXcqPfvSjja7z6quv5rXXXmPhwoWMHTuWIUOGrD731a9+lSeeeILx48czdOjQjb6WJKnlabHJR0T8ISLeiYjbyh2LJJXDpz71Kc4991wOOeQQPvnJT64189WG+OY3v8nAgQPZcccd2WmnnRgzZszqc23atOGYY45h1qxZHH300Rt9LUlSyxP1WUSlOYmIg4AtgeMz89j1le/Xr18+/vjjjR2WpGbo+eefZ+eddy53GGXXu3dvrr/+eg455JBay/z4xz/mpZdeWmPmq/Wp7ecbETMys18dqijp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94YOrhTsdiVJkiSVxvpaPn4PfFTlda3JhyRJzcn8+fO56aabePnll7ngggvo3Lkz06dPp2fPnuywww7lDk+SWqR1Jh+ZeX6V1z9q9GjKwG5XklR5ZsyYwRe/+EV22GEHnn32Wb73ve/RuXNn7r77bl566SVuueWWcocoSS1Sndf5iIj7ImLrGo5vFRH3NWhUJeQ6H5JUec466yxOPfVUnnzySTbffPPVx7/0pS8xffr0MkYmSS1bfRYZPAjYrIbjW1BYA0SSpGZhxowZHH/88Wsd79GjB/Pnzy9DRJJUGdY721VE7FVld/eIWFhlf1PgS8Dchg6sVOx2JUmVp02bNrzzzjtrHX/hhRfo2rVrGSKSpMpQl5aPx4HHKAw2n1LcX7X9DTgH+HFjBdjY7HYlSZXnK1/5Cueffz4ffVSYUyUieOWVVzj77LM55phjyhydJLVcdUk+dgB2orA+x+eK+6u2XsBWmfmrRotQkqQGNm7cOBYuXEiXLl1YvHgxBxxwAH369GHrrbfmwgsvLHd4ktRirbfbVZXVxeszPkSSpCZrq6224qGHHuK+++7jiSeeYOXKley1114ccsgh5Q5Nklq0eq1wHhGfAPoDXamWjGTmTxowLkmSGt2AAQMYMGBAucOQpIpR5+QjIo4DfgUsB95izQUHE2iWyYcDziWpMj355JPcf//9vPnmm6xcuXKNc5deemmZopKklq0+LR8/Bi4HfpiZKxopnpLLzEnApH79+o0odyySpNK49NJL+f73v8/2229Pt27diIjV56q+liQ1rPokH92A61tS4iFJqkw//elP+fnPf86JJ55Y7lAkqaLUZxD5ZGCfxgpEkqRSWblyJV/84hfLHYYkVZz6tHzcDfx/EbEL8DSwrOrJzLy9IQOTJKmxnHTSSdx4442MHTu23KFIUkWpT/Lxy+K/P6jhXFJY7bzZccC5JFWe8847j0GDBrHnnnuy66670rp16zXO/+pXLl8lSY2hzt2uMnOTdWzNMvEAVziXpEo0evRopkyZQqtWrXjnnXd466231tgkSY2jXut8SJLUElxzzTXccsstDBkypNyhSFJFqc86H2es67yLDEqSmos2bdqw5557ljsMSao49Wn5OKXafmugB7AEeJNmusigJKnynH766VxxxRVcffXVrushSSVU5+QjM3eofiwiugE3Atc1ZFCSJDWm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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.data_cleaning import DropHighNaNRatio\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "objs = [DropHighNaNRatio(max_ratio=0.5)]\n", - "columns = [\"Category\", \"Address\", \"Resolution\"]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"DropHighNaNRatio\")" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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f/jDH+qVT5w4kV122YUzzzyTK664oqXDllpVZFb3DIV1BpyP+fvf/17ucCS1QXPmzCEi6NOnDx07diRitTMIqokyk6VLl1JTU0Nm0r//qmvFRsSMzBzclNO1fIRty5QpU3jwwQfZbbfdOProo7n66qsbTT5uvfVWLrjgAl577TVOOeWU2uQD4Je//CWjRo1ixowZ7LDDDixdupQ99tiDbbfdlv/9X9eqk9SiVvuLsuq/anLAuaS1ee+99+jXrx8bbLCBiUcLiQg22GAD+vXrx3vvvVfucNq8YcOGceGFFzJixIjVthLNnj2bk046iZtvvpmOHTuucnzkyJF8/vOf5+ijj2bZsmWcd955vPLKK1x99dWtHb4k1Wpr3a4kqU2yW1Dr8H1tGcuWLeNLX/oSZ511Fttvv/1q61199dXsuOOOHHXUUaxcrK5Hjx4ljFRStav6u76zXUmS2rvmLlZ3yy238KUvfcnF6iSVXNUnH3a7kqSmGTBgAHfffXe5w1ADKxeru/7669dat7HF6iSplOx2JUkfwsNDtmnV8+8x9YVWPb8qR93F6lZavnw5Z5xxBpdffjkvv/xybXndxeoOOuggxo8fz6WXXlqOsCVVqapPPurMdlXuUCRJarZx48YxYsSIemUHHXQQX/rSlxgz5l9LWK1crO66666rXaxu2LBhHH744ey1116lDrvk4r/nlzuEipDf61XuENTO2e3KbleS2rkBAwZw0UUXscMOO9C9e3dGjx7NkiVLeOONNzjkkEPo1asX3bt355BDDqn3Lfi+++7L2WefzV577cVHPvIRhg4dyoIFC2qP33jjjWy55ZZsuummXHDBBfWu+cgjj7DnnnuyySab0LdvX0444QQ++OADoDCN7imnnELv3r3ZeOON2XnnnXnqqadK82ZUqHfffbd2Fey6i9XNmTOH3r17s9NOO9XbmrtY3aJFi8r58iRVkapPPiSpEtx0003ccccdvPDCCzz//POcf/75rFixgtGjRzN79mzmzJlDp06dOOGEE+o97+abb+aGG27gtdde44MPPmDixIkAPPPMMxx//PHceOONzJs3j9dff71e4rL++uvz/e9/nwULFvDQQw9xzz331E7ZeueddzJ16lSef/553nrrLW655RY23XTT0r0ZFWj69OkMGjSIQYMGsXjxYiZMmMCgQYM455xzmvT8lYvV/ehHP6pXPnHiRJYtW8aZZ57ZGmFL0ipMPiSpApxwwglsscUW9OjRg/Hjx/OLX/yCTTfdlCOOOILOnTvzkY98hPHjx/PnP/+53vNGjx7Nxz72MTp16sSRRx7JzJkzgcJidYcccghDhgxhww035Lzzzqs3Le7uu+/OHnvsQYcOHRgwYADHHXdc7bk7duzIO++8w9/+9jcyk+23377eeAQ137777ktmrrKtbpXsF198sd4Cg2effTY1NTX06lW/y0zXrl355z//6SrZUh1Tp07l0EMPpV+/fkTEKv/Pzj77bLbbbju6dOlC9+7d+cxnPsNf/vKX2uOvvvoqPXv2XGU81dNPP81GG21U9Yt6mnxIUgXYYostah9vueWWzJs3j0WLFnHcccex5ZZbsvHGGzNkyBDefPNNli9fXlt3s802q33cuXNn3n33XQDmzZtX75xdunSp13rx/PPPc8ghh7DZZpux8cYb8+1vf7u2y9b+++/PCSecwDe+8Q169+7N2LFjefvtt1vttUtSS3r33XfZaaeduOKKK+jUqdMqxz/+8Y9z1VVX8eSTT/Lggw+y1VZbcfDBB1NTUwMU7qtXXXUVZ511Fs888wwAS5cu5eijj+YLX/gCX/ziF0v6etqaqk8+XOdDUiV46aWXah/PmTOHzTffnEsvvZTnnnuOv/71r7z99ttMnToVKIzJWJu+ffvWO+eiRYt4/fXXa/ePP/54tttuO/7+97/z9ttvc+GFF9Y77ze/+U1mzJjBM888w/PPP88ll1zSEi9TklrdsGHDuPDCCxkxYkSjC6F+5Stf4TOf+Qxbb701O+64I5dddhnvvPNObcsxwMiRI/n85z/P0UcfzbJlyzjvvPN45ZVXarunVrOqTz4ccC6pElx11VW8/PLLLFy4kAsuuICRI0fyzjvv0KlTJzbZZBMWLlzIueee2+TzjRgxgt///vc8+OCDfPDBB5xzzjmsWLGi9vg777zDxhtvTNeuXfnb3/5WbyzBo48+yl//+leWLl1Kly5d2GijjVzJXFJF+uCDD7jmmmvYeOON2XXXXesdu/rqq5k7dy5HHXUUF110Eddddx09evQoT6BtiL8NJKkCfPnLX2bo0KFsvfXWbLPNNpx11lmcfPLJLF68mJ49e7LHHntw8MEHN/l8O+64I1dddRVf/vKX6du3L927d+ejH/1o7fGJEydy880385GPfIQxY8YwcuTI2mNvv/02Y8aMoXv37rWzZX3rW99q0dcrSeX0+9//nq5du7LRRhvx/e9/n7vuuos+ffrUq9OjRw8uuugibrnlFr70pS8xbNiwMkXbtkRTmt+rweDBg3P69OnlDkNSG/Tss8+y/fbblzuM1RowYADXXXcdBxxwQLlD+VBW9/5GxIzMHNyEU/iLTGvlOh8to9rW+ejatSs//OEPGTVqVL3y9957j1deeYUFCxZw7bXXcs899/DQQw/Vm1xjxYoV7LfffkyfPp3+/fvz+OOPs9FGG5X4FZRNrO5A1S8yKElSc/hHbMuotj9iVVm6dOnCwIEDGThwIHvssQfbbrst1113HWeffXZtncsvv5wnn3ySRx99lIMOOojx48evMgNWNar6blcOOJckSdK6WLFiBe+//37t/rPPPsv48eO58sor2WGHHbj++uu54oormDZtWhmjbBuqvuUjMycDkwcPHjym3LFI0ofx4osvljsESaoY7777Lv/4xz+AQlIxZ84cZs6cSY8ePdhkk024+OKLGT58OH379mX+/Pm1E34ceeSRACxbtoxjjjmGz33ucxx11FEADB06lGOPPZbRo0czc+ZMOnfuXLbXV25V3/IhSZIkrTR9+nQGDRrEoEGDWLx4MRMmTGDQoEGcc845dOjQgaeffprDDjuMbbfdluHDh/P6668zdepUdtllFwAuuugiZs+eXW8WQChM1LFs2TLOPPPMcrysNqPqWz4kSZKklfbdd981rof0m9/8Zo3PP/vss+uN/Vipa9eu/POf/1zn+No7Wz4kSZIklYTJhyRJkqSSMPmQJEmSVBImH5IkSZJKouoHnEfEcGD4wIEDyx2KpHaktReacwE2SXJRz5bSln6nVH3LR2ZOzsyx3bp1K3cokiRJUkWr+uRDktq7AQMGMHHiRHbZZRe6devGyJEjWbJkCZMmTWLvvfeuVzciahfPGjVqFOPGjeOzn/0sXbt2Za+99uLVV1/l5JNPpnv37my33XY8/vjj9a5z0UUXscMOO9C9e3dGjx7NkiVLANhpp52YPHlybd2lS5fSs2fPes+XJMnkQ5IqwC233MKf/vQnZs2axRNPPMGkSZOa/Lzzzz+fBQsWsOGGG7Lnnnuy2267sWDBAkaMGMGpp55ar/5NN93EHXfcwQsvvMDzzz/P+eefD8DRRx/N//zP/9TWmzJlCn379mXQoEEt9holSe2fyYckVYBvfvObbL755vTo0YPhw4czc+bMJj3vsMMOY/fdd2ejjTbisMMOY6ONNuLoo49m/fXXZ+TIkau0XJxwwglsscUW9OjRg/Hjx/OLX/wCgK985StMmTKFt99+G4Abb7yRr371qy36GiVJ7Z/JhyRVgM0226z2cefOnXn33Xeb9Lw+ffrUPu7UqdMq+w3Ps8UWW9Q+3nLLLZk3bx4Am2++OXvttRe//vWvefPNN/njH//IUUcd9aFeiySpclX9bFeSVKm6dOnCokWLavdfffXVdT7nSy+9VPt4zpw5bL755rX7xxxzDNdddx3Lli1jzz33pF+/fut8PUlSZbHlQ5Iq1Cc+8QmefvppZs6cyZIlS/jOd76zzue86qqrePnll1m4cCEXXHABI0eOrD32hS98gccee4wrrriCo48+ep2vJUmqPBWbfETEbyLijYi4tdyxSFI5fOxjH+Occ87hgAMOYNttt11l5qsP48tf/jJDhw5l6623ZptttuGss86qPdapUyeOOOIIZs2axeGHH77O15IkVZ7IzHLH0CoiYl/gI8AxmTlibfUHDx6c06dPb+2wJLVDzz77LNtvv325wyi7AQMGcN1113HAAQests53v/tdnn/++XozX63N6t7fiJiRmYObcIqS/iJz0bOWUepFz/zcWoafW/tUhkUGY3UHKrblIzPvB94pdxySVC0WLlzI9ddfz9ixY8sdiiSpjSp58hERQyLi9oiYGxEZEaMaqTMuImZFxJKImBER+5Q6TklS01177bVsscUWfPazn2XIkCHlDkeS1EaVY7arrsBTwM+LWz0RMRK4AhgHPFj8+ceI2CEz5xTrzKTx2Idm5rxWiluSqtqLL7642mNjxoxhzJgxpQtGktQulTz5yMwpwBSAiJjUSJVTgUmZeW1x/8SIOBg4HjizeI5dWyKWiBgLjAXo379/S5xSkiRJ0mq0qTEfEbEBsDtwZ4NDdwKfbunrZeY1mTk4Mwf36lXygTiS2pFKnZyj3HxfJam6tKnkA+gJrA/UNCivATZbtfrqRcTdwK+AYRHxckTsuZp6wyPimrfeeuvDxCupCnTs2JHFixeXO4yKtHjxYjp27FjuMCRJJdLWko8Wk5kHZGavzOycmR/NzIdWU29yZo7t1q1bqUOU1E707t2buXPn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P7/c4UlSxVprt6s6q4s3Z3yIJElt1sYbb8yDDz7Ivffey2OPPcaKFSvYbbfdOOCAA8odmiRVtGatcB4RHwWGAL1pkIxk5mUtGJckSa1u//33Z//99y93GJJUNZqcfETEUcBPgWXAfOovOJhAu0w+HHAuSdXp8ccf57777uO1115jxYoV9Y5dfPHFZYpKkipbc1o+vgtcCpydmctbKZ6Sy8zJwOTBgwePKXcskqTSuPjii/nv//5vttxyS/r06UNE1B6r+1iS1LKak3z0Aa6rpMRDklSdvv/97/OjH/2I4447rtyhSFJVac4g8inAp1orEEmSSmXFihV85jOfKXcYklR1mtPycRfw/yJiR+BJYGndg5l5W0sGJklSazn++OO54YYbuOCCC8odiiRVleYkHz8p/vx2I8eSwmrn7Y4DziWp+kyYMIFhw4YxaNAgdtppJzp27Fjv+E9/6vJVktQamtztKjPXW8PWLhMPcIVzSapG48eP584776RDhw688cYbzJ8/v94mSWodzVrnQ5KkSnD11Vdz8803M3LkyHKHIklVpTnrfJy6puMuMihJai86derEoEGDyh2GJFWd5rR8nNhgvyPQF1gMvEY7XWRQklR9TjnlFC6//HKuuuoq1/WQpBJqcvKRmVs1LIuIPsANwLUtGZQkSa3pgQceYOrUqfzhD39ghx12WGXA+e23316myCSpsq3TmI/MrImI8cAtwG9aJiRJklpXz549Ofzww8sdhiRVnZYYcL4ehdXPJUlqF2644YZyhyBJVak5A84bfkUUFMZ8fAN4oCWDKiXX+ZAkSZJKozktH7c22E9gPnAvcFqLRVRimTkZmDx48OAx5Y5FktR6dtllF/785z/TvXt3dt555zUONH/iiSdKGJkkVY/mDDhv8oKEkiS1NUcccQQbbrhh7WNnuZKk0mtS8hERHYEHgaMz87nWDUmSpJY3YcKE2sff+c53yheIJFWxJrVmZOZSYCsKXa0kSWrX9t9/f958881Vyt9++23233//0gckSVWiOV2pfgY4LkKS1O7df//9fPDBB6uUL1myhAceaLdzqEhSm9ecAeddgKMi4kBgBvBe3YOZ+c2WDEySpJb22GOP1T5+4okn6NGjR+3+8uXLueOOO+jXr185QpOkqtCc5GN7YOVde+sGx9pcd6yI6Aw8C/wqM08vdzySpPIbPHgw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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.data_cleaning import DropLowCardinality\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "objs = [DropLowCardinality(min_categories=2)]\n", - "columns = [\"Category\", \"Address\", \"Resolution\"]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"DropLowCardinality\")" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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6d+/P/vuuy9nn3023/3udxk1KtMzuWPHjqxfv54lS5aUO2dJSQkdO3YsVzZkyBB23313Jk+ezL333suECRNq/+YkFa16k3yklNaQWTTwqAq7jiIz69XnYsuHJKmuGTZsWGniUXE84tq1a1m7dm25lhCAhg0bsmHDBgD2339/GjduzOOPP166/7333uPVV1/lwAMPLC0bO3YskydP5u6776ZPnz5cdNFFnHHGGSxdurQW705SMatTyUd23vKeEdGTTGw7Z7c3TqV7IzAwOwf5nhFxE5m1PX73ea9py4ckqS4566yzGDNmDOPGjaN169YsWrSIRYsW8emnnwLQsmVLvvGNb3DxxRczdepU5s+fz9ixY/nDH/7A8ccfD0CrVq348Y9/zM9+9jMmT57Miy++yA9/+EP23Xdf+vbtC8C7777LsGHDuO6669h9990BGDFiBG3btuWcc87Jz81LKnh1aqrdiDiMzGDxiu5OKQ3M1hkK/AzoRGZNkOEppW3upOqAc0mbs2HDBpYsWcLHH3/M+vXr8x1OwWjYsCE77rgjbdu2pUGDTb8Li4jZKaXeVThV3flDVgMiKp8kZsSIEVxxxRVAZkD5JZdcwqRJk1i6dCm77LILp59+Oueff37p8Z999hkXXHAB48aNY9WqVRx55JGMHj2arl27klKiX79+bNiwgcmTJ5e75pw5c/ja177GH//4x9JkRpKqabOzXdWp5CMfIqI/0L979+6D33zzzXyHI6kOWrBgARFBhw4daNy48Wb/caiqSymxdu1aSkpKSCmx886brhVbrMmHJBWAzf6hrFPdrvLBbleStmbFihV06dKF7bbbzsSjhkQE2223HV26dGHFihX5DkeSlCNFn3xIUlVU1i1I287fqyQVl6J/6jvblSRJkpQbRZ982O1KkqqmW7duTJ48Od9hSJLqsUb5DkCS6qNnD92tVs9/wLS3avX8kiTlQ9EnH2Vmu8p3KJKkeiAu/jDfIRSEdF27fIcgKQ/sdmW3K0n1XLdu3bj22mvZa6+9aN26NYMGDWL16tV89NFHHHvssbRr147WrVtz7LHH8t5775Ued9hhh/GLX/yCgw46iB122IF+/fqxZMmS0v333HMPu+yyCzvttBNXX311uWvOnDmTPn36sOOOO9KpUyfOPvts1qxZA2Sm0R0+fDjt27enZcuW7LPPPsybNy83vwxJUp1W9MmHJBWC++67j8cee4y33nqLN954g6uuuooNGzYwaNAg3nnnHRYsWEDTpk05++yzyx03btw4xowZw+LFi1mzZg2jRo0C4JVXXuHMM8/knnvu4f333+c///lPucSlYcOG/PrXv2bJkiU888wzPPHEE4wePRqASZMmMW3aNN544w2WLVvGAw88wE477ZS7X4Ykqc4y+ZCkAnD22WfTtWtX2rRpw6WXXsr999/PTjvtxIknnkizZs3YYYcduPTSS/nHP/5R7rhBgwbxpS99iaZNm3LyySczZ84cAB566CGOPfZYDj30ULbffnt++ctflpsWd//99+eAAw6gUaNGdOvWjTPOOKP03I0bN+aTTz7htddeI6XEnnvuSadOnXL2u5Ak1V0mH5JUALp27Vr6fpddduH9999n5cqVnHHGGeyyyy60bNmSQw89lI8//pj169eX1u3YsWPp+2bNmvHpp58C8P7775c7Z/Pmzcu1Xrzxxhsce+yxdOzYkZYtW/Lzn/+8tMvWEUccwdlnn81ZZ51F+/btGTJkCMuXL6+1e5ck1R9Fn3y4zoekQvDuu++Wvl+wYAGdO3fmhhtu4PXXX+e5555j+fLlTJs2DciMydiaTp06lTvnypUr+c9//lO6feaZZ7LHHnvw5ptvsnz5cq655ppy5/3pT3/K7NmzeeWVV3jjjTf41a9+VRO3KUmq54o++XDAuaRCcOutt/Lee++xdOlSrr76agYMGMAnn3xC06ZN2XHHHVm6dCkjR46s8vlOOukk/vrXvzJ9+nTWrFnD5ZdfzoYNG0r3f/LJJ7Rs2ZIWLVrw2muv8T//8z+l+55//nmee+451q5dS/PmzWnSpIkrmUuSAJMPSSoIp5xyCv369WPXXXdlt91247LLLuPcc89l1apVtG3blgMOOICjjz66yufr0aMHt956K6eccgqdOnWidevWfOELXyjdP2rUKMaNG8cOO+zA4MGDGTBgQOm+5cuXM3jwYFq3bl06W9aFF15Yo/crSaqfoirN78Wgd+/eadasWfkOQ1Id9Oqrr7LnnnvmO4zN6tatG3fccQd9+/bNdyify+Z+vxExO6XUuwqnyOkfMtf5qBmu8yEVtNjcDls+JEmSJOVE0ScfDjiXJEmScqNRvgPIt5TSBGBC7969B+c7Fkn6PN5+++18hyBJUpUUfcuHJEmSpNww+ZAkSdpG1157LV/96ldp2bIl7dq1o3///sybN2+z9c844wwiglGjRpUrf+uttzj++ONp164dLVu25OSTT6akpKR0/7x582jSpAkPP/xwueMmT55M48aNmTFjRs3emFTDTD4kSZK20dSpUxk6dChPP/00U6ZMoVGjRvTt25elS5duUvehhx5i5syZdO7cuVz5ihUr6NevHyklpkyZwowZM1izZg39+/cvXWdn7733ZuTIkfzkJz8pTUqWLVvGoEGDOP/88znooINq/2albVD0Yz4kSZK21WOPPVZu+5577qFVq1bMmDGD/v37l5a/8847DBs2jMmTJ/Otb32r3DEzZsxg/vz5zJo1i9atWwNw991307p1a6ZMmVI6nfaFF17I+PHjGTJkCI888gjnnHMOrVu35sorr6zlu5S2nS0fkiRJNeyTTz5hw4YNpUkEwLp16/je977HZZddVunaNp999hkRQZMmTUrLmjRpQoMGDZg+fXppWYMGDbj77ruZPHky3//+9/nf//1f/vCHP7DddtvV7k1JNcDkQ5IkqYYNGzaMnj170qdPn9KyESNG0LZtW84888xKjznggANo0aIFF154IStWrGDFihVccMEFrF+/ng8++KBc3e7du3PhhRcybtw4Lr74Ynr27FmbtyPVmKLvdhUR/YH+3bt3z3cokuqR2l7l2tWfpfrrvPPOY/r06UyfPp2GDRsCmTEhY8eOZc6cOZs9rl27djz44IOceeaZjB49mgYNGvC9732PXr160aBB+e+LV61axf3330+zZs2YPn06KSUiNruotFRnFH3LR0ppQkppSKtWrfIdiiRJqueGDx/O/fffz5QpU9h1111Ly6dOncoHH3xAp06daNSoEY0aNeKdd97hoosu4gtf+EJpvX79+vHWW2+xePFilixZwj333MPChQvLnQvgoosuYt26dcycOZNZs2Zxyy235OwepW1R9MmHJNV33bp1Y9SoUey77760atWKAQMGsHr1asaOHcvBBx9crm5E8K9//QuAgQMHMnToUL71rW/RokULDjroIBYtWsS5555L69at2WOPPXjxxRfLXefaa69lr732onXr1gwaNIjVq1cDmRl4JkyYUFp37dq1tG3bttzxUqEbNmxYaeKxxx57lNs3dOhQ5s6dy5w5c0pfnTt3Zvjw4TzxxBObnKtt27bsuOOOTJkyhcWLF3PccceV7nvyyScZPXo0Y8eOpUePHtxwww1cfPHFvPXWW7V+j9K2MvmQpALwwAMP8Pe//5358+czd+5cxo4dW+XjrrrqKpYsWcL2229Pnz596NWrF0uWLOGkk07ivPPOK1f/vvvu47HHHuOtt97ijTfe4KqrrgLg1FNP5d577y2tN3HiRDp16sR+++1XY/co1WVnnXUWY8aMYdy4cbRu3ZpFixaxaNEiPv30UwDat2/P3nvvXe7VuHFjOnbsyJe//OXS84wZM4ZnnnmGt956i3vvvZfvfOc7DB8+vLTOJ598wqBBgxg2bBiHHHIIAIMHD+aQQw5h0KBBpVPySnWVyYckFYCf/vSndO7cmTZt2tC/f/8t9isv6/jjj2f//fenSZMmHH/88TRp0oRTTz2Vhg0bMmDAgE1aLs4++2y6du1KmzZtuPTSS7n//vsB+MEPfsDEiRNZvnw5kJlm9Ic//GGN3qNUl40ePZpPPvmEI488kk6dOpW+Ki4iuDWvv/46xx9/PHvuuSdXXnkll156ablznHvuuTRr1oyrr7663HF33nknL730EjfddFON3I9UW4p+wLkkFYKOHTuWvm/WrBnvv/9+lY7r0KFD6fumTZtusr3xW9uNunbtWvp+l112Kb1O586dOeigg3j44Yc5/vjjefTRR/1HkIpKSqnax7z99tublF133XVcd911mz3mzjvvrLS8S5cufPTRR9WOQco1kw9JKlDNmzdn5cqVpduLFi3a5nO+++67pe8XLFhQboXm0047jTvuuIN169bRp08funTpss3XkyQVFrtdSVKB+spXvsLLL7/MnDlzWL16NVdcccU2n/PWW2/lvffeY+nSpVx99dUMGDCgdN9///d/88ILL3DTTTdx6qmnbvO1JEmFp2CTj4j4c0R8FBEP5TsWScqHL33pS1x++eX07duX3XfffZOZrz6PU045hX79+rHrrruy2267cdlll5Xua9q0KSeeeCLz58/nhBNO2OZrSZIKT3yePor1QUQcBuwAnJZSOmlr9Xv37p1mzZpV22FJqodeffVV9txzz3yHkXfdunXjjjvuoG/fvputc+WVV/LGG2+Um/lqazb3+42I2Sml3lU4RU7/kNX2ApPFwoU0pYK22RUvC3bMR0ppajYBkSTlwNKlS7nzzju555578h2KtAmTxpph0qhtlfNuVxFx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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.data_cleaning import DropColumns\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Category\", \"Address\", \"Resolution\"]\n", - "objs = [DropColumns(columns)]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"DropColumns\")" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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VarQoUMH1q9fn318/PjxNGjQgJo1ax60FsSCBQto2bIlxx13HHXq1KFfv37s3r0bCKbRHTRoELVq1aJq1aqceeaZfPzxx+G8GCIiUqIlffIhIpIIJkyYwBtvvMGyZcv48ssvufvuu9m/fz89e/bkm2++YeXKlVSoUIF+/frlOu+5555j3LhxrF27lt27dzNq1CgAPv30U/r06cP48eNZvXo1P/zwQ67EpUyZMvz1r39l/fr1zJs3jzfffDN7cbxp06Yxa9YsvvzySzZv3swLL7xAzZo1w3sxRESkxFLyISKSAPr168cJJ5xAjRo1GDZsGBMnTqRmzZp06dKFihUrUqVKFYYNG8Y777yT67yePXvyk5/8hAoVKvC73/2OJUuWAPDSSy9xySWX0Lp1a8qXL89dd92Va1rcFi1acN5551G2bFkaNmzIddddl33tlJQUtm7dyueff467c9ppp1GnTp3QXgsRESm5lHyIiCSAE044IftxgwYNWL16NTt27OC6666jQYMGVK1aldatW7Np0yb27duXXbd27drZjytWrMi2bdsAWL16da5rVqpUKVfrxZdffskll1xC7dq1qVq1Kn/605+yu2y1bduWfv36cf3111OrVi169+7Nli1b4vbcRUSk9Ej65EPrfIhIIvj222+zH69cuZK6devy4IMP8sUXX/Dee++xZcsWZs2aBQRjMg6nTp06ua65Y8cOfvjhh+z9Pn36cOqpp/LVV1+xZcsW7rnnnlzXveGGG1i0aBGffvopX375JQ888EBxPE0RESnlkj750IBzEUkEjz/+ON999x0bNmxg5MiRdOvWja1bt1KhQgWOO+44NmzYwIgRIwp9va5du/Lvf/+bOXPmsHv3bm6//Xb279+ffXzr1q1UrVqVypUr8/nnn/P3v/89+9j777/Pe++9x549e6hUqRLHHnusVjIXERFAyYeISEK4/PLL6dChAyeddBInn3wyt912GwMHDmTnzp2kpqZy3nnncfHFFxf6emeccQaPP/44l19+OXXq1KF69eocf/zx2cdHjRrFc889R5UqVejVqxfdunXLPrZlyxZ69epF9erVs2fLuvnmm4v1+YqISOlkhWl+TwYZGRm+cOHCqMMQkRLos88+47TTTos6jAI1bNiQMWPG0K5du6hDOSIFvb5mtsjdMwpxiVB/kWmdj+KhdT5EEpoVdEAtHyIiIiIiEoqkTz404FxEREREJBxlow4gau4+BZiSkZHRK+pYRESOxIoVK6IOQUREpFCSvuVDRERERETCoeRDRERERERCoeRDRERE5Cjde++9/PSnP6Vq1aqkpaXRqVMnPv744+zje/bsYciQITRt2pRKlSpRp04dLr/8clauXJnrOj/++CP9+/cnNTWVSpUq0blzZ7777rvs49OmTSMlJYX33nsv13ljxoyhcuXKLFu2LL5PVOQoKfkQEREROUozZ86kb9++vPvuu7z11luULVuWdu3asWHDBgB27NjB4sWLGTZsGIsXL+bVV1/l22+/5eKLL2bv3r3Z1xk4cCCTJk1i4sSJzJ49my1btnDJJZewb98+ADp06MC1115L9+7d2blzJxCM+xo8eDCjRo3i5JNPDv/JixSB1vmI0TofIlKQkr7OR2mndT6SU6Kv87Ft2zaqVavGK6+8QqdOnfKt8+mnn3LGGWewdOlSzjzzTDZv3kxaWhrjxo3jiiuuAODbb7+lQYMGvPbaa/ziF78AYPv27Zx11ln86le/4uGHH+aiiy7i2GOP5fXXXw/t+YkcRoHrfCT9bFciIiIixW3r1q3s37+f6tWrF1hny5YtANl1Fi1axJ49e+jQoUN2nRNOOIHTTjuNd999Nzv5qFSpEpmZmbRp04Z169bx4Ycf5uriJVKSJX3yYWadgE6NGjWKOhQRKUXi/e13on8rLJLoBgwYQLNmzWjZsmW+x3fv3s2NN95Ip06dOP744wFYs2YNZcqUITU1NVfd9PR01qxZk6vsggsu4Morr+SZZ55h7Nix1KtXLz5PRKSYJf2YD3ef4u69q1WrFnUoIiIikgAGDx7MnDlzmDRpEmXKlDno+N69e7nyyivZtGkT48aNO6J7ZGVl8Z///IeKFSsya9asow1ZJDRJn3yIiJR2DRs2ZNSoUTRt2pRq1arRrVs3du3aRWZmJhdccEGuumbG119/DUCPHj3o27cvv/zlL6lcuTKtWrVizZo1DBw4kOrVq3PqqafywQcf5LrPvffey+mnn0716tXp2bMnu3btAqBJkyZMmTIlu+6ePXtITU3Ndb5IMhg0aBATJ07krbfe4qSTTjro+N69e/m///s/li5dyptvvknNmjWzj9WuXZt9+/axfv36XOdkZWVRu3btXGW9e/emcePGzJgxg3/+85+5/v+JlGRKPkREEsALL7zA66+/zvLly1m6dCmZmZmFPu/uu+9m/fr1lC9fnpYtW9K8eXPWr19P165dGTx4cK76EyZM4I033mDZsmV8+eWX3H333QBcffXV/POf/8yuN3XqVOrUqcPZZ59dbM9RpKQbMGBAduJx6qmnHnR8z549dOvWjaVLl/L2228flFC0aNGClJQUpk+fnl323Xff8dlnn3H++ednl2VmZjJjxgyeeeYZWrZsyZAhQ7juuuuyZ9YSKcmUfIiIJIAbbriBunXrUqNGDTp16sSSJUsKdd6ll15KixYtOPbYY7n00ks59thjufrqqylTpgzdunU7qOWiX79+nHDCCdSoUYNhw4YxceJEAK688kqmTp2aPYB2/PjxXHXVVcX6HEVKsuuvv55x48bx3HPPUb16ddasWcOaNWvYtm0bELR4/Pa3v2X+/PlMnDgRM8uuc2DK3GrVqvGHP/yBW265hRkzZvDBBx9w1VVX0bRpU9q1awcEs18NGDCA++67j8aNGwMwfPhwUlNT6d+/fzRPXqQIlHyIiCSAnN+gVqxYMfsPnsNJT0/PflyhQoWD9vNe54QTTsh+3KBBA1avXg1A3bp1adWqFZMmTWLTpk289tpr2VOFiiSD0aNHs3XrVn7+859Tp06d7G3UqFFA0ILx6quvsnr1alq0aJGrzvPPP599nYcffphLL72Ubt260apVKypXrsyUKVMoU6YM7s4111xDRkYG/fr1yz6nXLlyPPvss7z44ov861//Cv25ixRF0s92JSKSqCpVqsSOHTuy9/POlnMkvv322+zHK1eupG7dutn73bt3Z8yYMezdu5eWLVtq9h1JKodbN61hw4aHrQNQvnx5Hn30UR599NGDjplZri5ZOTVr1ozdu3cXLliRCKnlQ0QkQZ111ll88sknLFmyhF27dnHHHXcc9TUff/xxvvvuOzZs2MDIkSPp1q1b9rHf/OY3LF68mEceeYSrr776qO8lIiKJJ2GTDzP7l5ltNLOXoo5FRCQKP/nJT7j99ttp164djRs3PmjmqyNx+eWX06FDB0466SROPvlkbrvttuxjFSpUoEuXLixfvpzLLrvsqO8lIiKJxwrTBFgamVkboArQ3d27Hq5+RkaGL1y4MN5hiUgp9Nlnn3HaaadFHUbkGjZsyJgxY7IHvubnzjvv5Msvv8w189XhFPT6mtki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mS0FfubuG83sI8ALquvuTYs7uDCo25WIiIiISDgO1/IxCfgxx+MCkw8REZHSJCsri/Hjx7Ns2TLuuusuUlNTmTt3LnXr1uXEE0+MOjwRkYR0yKl23X2Eu++IPb4jtp/vFk64xU/rfIiIJJ9FixZxyimnMGHCBMaOHcuWLVsAmD59OsOGDYs4OhEJ06xZs+jcuTP16tXDzMjMzMx13N254447qFu3LhUqVKBNmzZ88sknueo0bNgQM8u1DR06NPv4tGnTSElJ4b333st13pgxY6hcuTLLli2L2/MraQo95sPM3gIuc/dNecqrAq+4e9tiji0U6nYlkvjmtz456hAO67xZyfOLpyS46aabGDBgACNGjKBKlSrZ5b/4xS8YN25chJGJSNi2bdtGkyZNuPrqq7n66qsPOn7//ffz4IMPkpmZySmnnMKdd95J+/bt+eKLL3J9ftx+++306dMne79y5crZjzt06MC1115L9+7d+eCDD6hQoQIrVqxg8ODBjBo1ipNPLvm/p4pLURYZbAOUy6f8WII1QEREREqFRYsW0b1794PK69SpQ1ZWVgQRiUhUOnbsyD333EPXrl055pjcfxq7Ow8//DBDhw6lS5cuNGnShGeeeYatW7fy3HPP5apbpUoVateunb3lTD4ARo0axd69exk6dCjuTo8ePTj//PP54x//GPfnWJIcNvkws+Zm1jy22/TAfmz7KdAbWBXXKONI3a5ERJJPhQoV2Lhx40Hln3/+ObVq1YogIhEpiZYvX86aNWvo0KFDdlmFChVo3bo17777bq66o0aNombNmjRr1oyRI0eye/fuXMcrVapEZmYmjz/+OFdccQUffvghY8eODeV5lCSF6Xa1kGCguQPT8jm+E+hfnEGFSd2uRESSz69//WtGjBjBiy++CICZsWLFCoYMGUKXLl0ijk5ESoo1a9YAkJ6enqs8PT2dVav+9937DTfcwNlnn03NmjVZsGABQ4cOZfny5YwZMybXeRdccAFXXnklzzzzDGPHjqVevXrxfxIlTGGSjxMJ1ub4L3AOsC7Hsd3AWnffF4fYRERE4mLUqFF07NiRtLQ0duzYwQUXXEBWVhatWrXi7rvvjjo8ESllBg8enP24adOmVK1alW7duvGXv/yFmjVrZh/LysriP//5DxUrVmTWrFlcc801UYQbqcMmHzlWFy/K+BCRhFMa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lFzHL7vssogiExFJbCUp+VgP7APS85SnA2vidVN3nwJMycjI6BWve4iISMly3XXXAXDPPfccdMzM2LdvX9ghiYgkhRLT7crddwOLgPZ5DrUH3o3Xfc2sk5k9uXnz5njdQkRESpj9+/cXuCnxEBGJn1CTDzOrbGbNzKxZ7N71Y/v1Y1UeAnqY2bVmdpqZPUKwHsg/4hWTu09x997VqlWL1y1ERERERITwu11lAG/n2B8R254Berj782ZWE7iNYJHBj4GO7v5NyHGKiEgCe+ihhw55XOt8iIjER9jrfMwE7DB1RgOjQwkIDTgXEUlGjz76aK79PXv28P3331OhQgVq1aql5ENEJE5K0oDzSGjAuYhI8lm+fPlBZVlZWfTs2ZNevfTrQEQkXkrMgHMREZEopaenM3LkSG655ZaoQxERSVhJn3xotisRETlg//79ZGXlXetWRESKi7pdqduViEjSefnll3Ptuzvff/89jz/+OBdeeGFEUYmIJL6kTz5ERCT5dO3aNde+mZGWlkbbtm158MEHI4pKRCTxKfkQEZGks3///qhDEBFJShrzoTEfIiJJZc+ePZx77rl88cUXUYciIpJ0kj750ArnIiLJJSUlheXLl2N2yGWnREQkDpI++RARkeTTvXt3nnrqqajDEBFJOhrzISIiSWf79u1MmDCB6dOn06JFCypVqpTr+N/+9reIIhMRSWxJn3yYWSegU6NGjaIORUREQvLZZ5/RvHlzAP773//mOqbuWCIi8ZP0yYfW+RARST5vv/121CGIiCQljfkQEREREZFQKPkQEREREZFQKPkQEREREZFQJH3yoUUGRURERETCkfTJhxYZFBEREREJR9InHyIiIiIiEg4lHyIiIiIiEgolHyIiIiIiEgolHyIiIiIiEgolHyIiIiIiEgolHyIiIiIiEoqkTz60zoeIiIiISDiSPvnQOh8iIiIiIuFI+uRDRERERETCoeRDRERERERCoeRDRERERERCoeRDRERERERCoeRDRERERERCoeRDRERERERCUTbqAOLBzFYAW4D9wEZ3vyjaiEREREREJCGTj5jz3X1b1EGIiIiIiEhA3a5ERERERCQUoSYfZtbazCab2SozczPrkU+dvma23Mx2mdkiM7vwCG7lwDtm9r6ZXXHUgYuIiIiIyFELu9tVZeBj4NnYlouZdQMeAfoCc2I/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vb35XG9PPmV5v8QosI677zOzDgTN9B2APwD3mtnP3P3DAuIVESkyfYbrM1xKJrV8iBSsI0F/1zXAlbHHHwMDY487Hub8z4BWecouAD4tYhwfAD8/xD2OIZjJBQAzqwqceYj7rAMqxuod0KyIMR0xD8xz9xEEfaZXA93Cur+IJA19hseBPsPlaKnlQ6QA7v5NbHBdOvAqwbc/ZwCT3P37QlziAeBFM1tEMFjxYoKBfJcVMZSRwBQz+5pg4J8RfOP0hLt/ZWavAk+YWW9gU6z+lljd/LwHbCf4tuqvwFkEAw7jzszOA9oBbxA0958NnEDRf5mLiBySPsOLnz7DpTio5UPk0NoQ9BXeBZwDfFfIX1q4+ytAf4KZUj4lmA2lrwezpBSau08FLgV+SfAN2jvARQRN7xDMnrKAYDaVBQSzulzsBcyS4u4bCH6BtifoV9wb+HNRYjoKmwm+Sfw38BXBDCt3ufs/Q7q/iCSXNugzvDjpM1yOmrmH1XVRRERERESSmVo+REREREQkFEo+REREREQkFEo+REREREQkFEo+REREREQkFEo+REREREQkFEo+REREREQkFEo+REREREQkFEo+REREREQkFEo+REREREQkFP8fAkGR7C2un50AAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.data_cleaning import DropDatatypeColumns\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Category\", \"Address\", \"Resolution\", \"X\", \"Y\"]\n", - "objs = [DropDatatypeColumns(float)]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"DropDatatypeColumns\")" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABDk0lEQVR4nO3de5hVZdn48e8tooIooJxJQaXygIo6laRQEpL6iqb4RulPhApUlMCz5gFRUd+C0lQqPKHk+ZBCYSoKIaQiKJ4VJTyhIIgCCniA5/fH3kzDMMCMzOw9s/f3c13rmr2e9ey17jVb13Dv5xQpJSRJkiSppm2W7wAkSZIkFQeTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfklTDIqJvRKSI6FCu/DsRsTginouIZnmMLyLiuIh4LCI+iogvI+K9iLgzIg76Gud7KyLG1ECokqQ6zuRDkvIgIr4PTATeALqllBblKY56wN3ALcBbwC+BHwHnAFsBj0VE43zEJkkqPJvnOwBJKjYR8QPg78DzwGEppaV5DOc84BjgmJTSfeWO3RYRPYAvcx+WJKkQ2fIhSTkUEQcDDwHPAD8um3hExNER8VRELI+ITyLinojYsYJzDIiI5yNiZUQsiogbI2K7cnVSRAyPiPOzXahWRMSUiOhUps4WwBnAPypIPABIKT2SUlpe5j3/r9y1x0ZE643c88URkSooHxMRb5XZb5+N+6SIuCIi5kfEsoj4a0Q0jIgOEfFwRHwaEW9GxAkVXScivhkR/8jWezsiLoqIzcrUaxQR10TEOxHxeUR8GBETI2LXDd2HJGnTmXxIUu78DzAemAL8T0rpszUHIuIk4D7gFTItEScCHYF/RcQ2ZepdCVxHpsvWEcBZwCHAQ9kuVGX1AQ4DTgX6Ai3JdKNak6iUAE2AcZUJPiIGAGOBV4GjgXOBH2djbFSZc1TSeUAb4ATgIqA38Gfgb8A/gKOAF4CbI2KPCt7/N+Bx4CfAA8Cw7LnW+APw02z5wWR+17PI/C4kSTXIbleSlDtXAXOAI1NKn68pzP7D/f+Am1NKvyhTPh14ncw4jKsioj2ZZGNYSumSMvVmA1OBnmT+sb1GA6DHmiQnIp4mM8bkNOBCYIdsvbc3Fng2sbkUmJxS+lmZ8teAJ4BfAH+sxO+gMuaklNYkCw9HRBfgeOD4lNJfs9edQSb5OgZ4udz7R6aUbs6+nhgR3YCfA2vKOgO3pZRuLPOev1VT7JKkDbDlQ5Jy5x/ALmS+2S+rM7AtmTEWm6/ZgHeB14Cu2XoHk3lul6/3NLCsTL01JpRtXUkpvQU8lb1eVX0baAHcVrYwpTSVTPLyg69xzvV5qNz+a9mfD5e57sfAh/w3gSrrH+X2XwLKdl97BugbEb+JiJIKWowkSTXElg9Jyp3TgPnA0IhYkVL6v2x5i+zPiet538fl6r25nnrbl9tfUEGdBcCarkrvZn+2W2/E/7Wmq9YHFRybX+Z4dfi43P4XGyjfqoL3Ly63/3m5eoPIxPwLYDiwOCJuBc4vO75FklT9TD4kKXcSMIDMP4SvjIjPU0pXAR9lj/dl3S5EkGnVoEy9Hqz7D/Gyx9doWUGdlsC87OsZwCdkumuN3kjsa/5B36qCY62AmRt470rIDHBPKX1Rprx8spQTKaVPybQ+nRcR7ch03bqSTDJzTj5ikqRiYfIhSTmUUlqdnaVpC+APEbESuJ1MgtEhpXTLBt7+KLAa2DGl9GglLndYRGxdZsxHe2B/Mv/QJqX0RUSMBC6NiF4VzXiVnZ1rGpmxJwuAnwE3ljn+fTItJyM3EMeaMSUdgWez72sCfJ//JlZ5kVJ6GxgZEceRiU+SVINMPiQpx1JKqyLiWDIJyCgy3YLOAq6LiOZkxjwsAdqSGUsxOaV0e0ppTkT8H3BtRHwb+BeZVoUdyIwHuSGlNKnMpVYAj0TE74AtyczutJTMbE9rXAHsDdyVXZV8PJlWjm8AvcjMatU0pbQ8Ii4C/hIRfwX+mo1vOJlB7Ddt4JbX3M/1ETE0G8vZwKdV+81Vj4h4kswMXy9mY/gBmd/BhhI/SVI1MPmQpDxIKX0VET8lMzvVDWRmc1ozde6xZJ7P88jMJDWrzPt+ExGvAqdkt0Rm7MZjZJKAsm4FPgOuBZqRGWj9s5TS4jLnW5WN4zgyYyDGAI3ItHI8AfwgpbQkW3d0RCzPxvggmX+4TwDOLjuwvYJ7/SQiDieT9NwNvAdcAnQHfli531i1mkJmqt1zyfye/wOcllKqrtm6JEnrESmts+6TJKmOyy7qNzyldEG+Y5EkaQ2n2pUkSZKUEyYfkiRJknLCbleSJEmScsKWD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk4UXPIREYdHxOsR8UZE/Crf8UiSJEnKiJRSvmOoNhGxOfAKcBCwBJgJfD+l9FFeA5MkSZJUcC0f3wVeTinNSyl9CjwE9MhzTJIkSZKoZclHRHSNiHERMS8iUkT0raDOwIiYGxErI2JmRHQpc7gNMK/M/jygbQ2HLUlStYmI8yLimYhYGhELI2J8RHQsV2dM9u9k2e2pcnWuj4g5EbEie54HI2K3Msc7Zv+W9ir3vu4R8WVEHFCzdyqpGNWq5ANoBLwEDAZWlD8YEb2Bq4HLgX2AfwMPRcSOuQxSkqQa9ENgFPB9oBvwFTAxIrYrV28i0LrMdli54zOAvsBuwI+ByJ6nPkBK6SVgKPDniGgJEBGNgZuBkSmladV9Y5JUa8d8RMSnwKkppTFlyp4GXkgp9S9T9gZwb0rpvIj4PnBWSumo7LGrgOkppdtzGrwkSdUkIhqRGcf4k5TS+GzZGKBZSunwKpxnL+B5YNeU0uvZss2AJ4BFKaUjI+JWoBNQklL6olpvRJKAzfMdQGVFxBbAfsCIcoceIfPtEMB0oGNEtCXzoD4UuHQD5xwADADYeuut99t1112rO2xJ0tc0c+bMRSml5pWoWju/Rasm77//Pm3atOGJJ54Yt6bshBNO4IEHHqBFixapSZMm/OAHP2D48OG0aNGiwnN89tlnDBkyhPvvv5/Zs2e/tqY8pcSbb77J3nvvzXHHHZfq16/P9OnT6dSp0+c5uDVJhSvWd6DOJB9AM6AesKBc+QKgO0BK6auIOAOYRKZL2W83NNNVSmk0MBqgpKQkzZgxoybiliR9DRHxdr5jqA0GDx5Mp06d6Ny5c2nZIYccwtFHH81OO+3EW2+9xQUXXEC3bt2YOXMmW265ZWm9UaNGcfbZZ/PZZ5/x7W9/m8cee2yt4wAdOnTgrLPOYtiwYVx44YV06tQpV7cmqQjVpeSjUlJK44BxG62YFRE9gZ4dOnSouaAkSfoaTj/9dKZOncrUqVOpV69eafnPfvaz0td77rkn++23H+3ateMf//gHRx99dOmx4447joMPPpgPPviAESNG8L//+79MmzaNhg0bltZZsWIFd9xxBw0bNmTq1KmklIhY75eWkrRJatuA8w1ZBKwCWpYrbwnM/7onTSmNTykNaNy48abEJklStTrttNO44447ePzxx9l55503WLdNmzZ84xvf4I033lirvHHjxnzzm9+ka9eu3HvvvcyePZv77rtvrTrnnHMOX331FdOnT2fGjBlce+211X4vkrRGnUk+sgPfZgIHlzt0MJlZr76WiOgZEaOXLFmyKeFJklRtBg8eXJp4VGY84qJFi5g3bx6tW7deb52UEiklPv/8v8M5Jk2axKhRoxgzZgx77LEHI0eO5Nxzz2XOnDnVch+SVF6tmu0qO6PHmv5P/wauJNOFanFK6Z3sVLtjgYHANOAk4JfAHimlTeob7JgPSapdImJmSqmkElVrzx+yanDKKacwduxYHnjgAXbffffS8kaNGtGoUSM+/fRTLr74Ynr16kXr1q156623OO+883j33Xd59dVX2WabbXjzzTe577776N69O82bN+e9997jyiuv5IknnuDVV1+lVatWLFu2jD333JNevXoxcuTI0usccsghLF++nMmTJ7PZZnXmO0pJtct6+27WtuTjh2QGi5d3S0qpb7bOQOBsMnOavwScllKasqnXNvmQtD6rV69m0aJFfPLJJ6xatSrf4RSMevXq0aRJE5o1a1bhP3KLNflY33iLoUOHcvHFF7NixQp+8pOf8Nxzz/HJJ5/QunVrDjroIC699FJ22GEHAN59910GDBjAzJkz+eSTT2jZsiVdu3blwgsvLG1J+eUvf8mTTz7Js88+y1ZbbVV6nXnz5tGxY0cuuugiTjvttJq/4QJxxRVXcP/99/P666+z5ZZbsv/++3PFFVfQsWPHCuufeOKJjB49mt/97neceeaZ6xxPKXHYYYfxz3/+k3vuuYdjjjkGgJdeeomSkhJuu+02evX67/qQEydO5NBDD2Xy5MkccIDrQyrv6sZsVymlyWwg2GydUWQWX6oWDjiXtDHvvfceEUH79u2pX7++g3GrQUqJL7/8kgULFvDee++x446uFbvGxr4UbNCgAQ8//PAG6+ywww489NBDG6xz4403Vljetm1bPv744w0HqXVMnjyZgQMH8p3vfIeUEhdddBHdu3fnlVdeYbvt1l4f8t5772X69Om0adNmvecbOXJkhUl5x44dGTZsGCeddBIHHnggLVu2ZMmSJfTr148zzjjDxEO1XtG3pzrgXNLGfPbZZ7Rt25YtttjCxKOaRARbbLEFbdu25bPPPst3ONIme/jhh+nXrx8dO3Zkzz33ZOzYsSxcuJBp09ZeKP7tt99m8ODB3H777dSvX7/Ccz3zzDNcffXV3HzzzRUeP+uss/jWt77FgAEDABg0aBBNmzblkksuqd6bkmpArWr5kKTayr7vNcPfqwrVsmXLWL16NU2bNi0t++qrr/j5z3/OBRdcwG677bbe9x177LGMHj16vYtGbrbZZtxyyy1rFofknnvuYfr06WyxxRY1ci9SdSr6p76zXUmSpOpW0eKQQ4cOpVmzZpx88snrfd9JJ53EIYccwqGHHrrB869ZHPL222/n3HPPdXFI1RlFn3zY7UqSKqd9+/ZMnDgx32FItd6axSHvu+++0sUhJ0+ezJgxY9Y71gZg7NixPP/88/zud7/b6DUqWhxSqgvsdiVJX8NTXXep0fPvP8V1FqS66LTTTuPOO+9k0qRJay0OOXnyZD744IO11mJZtWoV55xzDldddRXvvfcejz32GK+88gqNGjVa65y9e/emc+fOTJ06tbSs7OKQnTt35tprr2XQoEE1f4PSJir65MPZriRJVRHnLsx3CAUhXdk83yFUu8GDB3PXXXcxadKkdRaHHDhwYOl0uWv8+Mc/5uc//zn9+/cHYPjw4etMu7vnnnsyYsQIjjzyyNKyNYtDTpo0qXRxyCFDhnDYYYexyy41+8WItKnsdmW3K0l1XPv27bniiivYfffdadq0Kf369WPlypV8/PHHHH744TRv3pymTZty+OGH895775W+74c//CEXXnghBxxwANtssw09evRg0aJFpcfHjh1Lu3bt2H777Rk+fPha11zzbWuTJk1o3bo1p556Kl988QWQmSr2tNNOo0WLFmy77bbsueeevPTSS7n5ZUh5csopp3DzzTdz++2307RpU+bPn8/8+fP59NNPAWjRogUdO3Zca6tfvz6tWrXi29/+NpCZ5rh8HchMnbymFWXZsmX069ePwYMH06VLFwD69+9Ply5d6NevH6tXr87D3UuVV/TJhyQVgttuu42HH36YOXPmMHv2bC677DJWr15Nv379ePvtt3nnnXdo0KABp5566lrvu/3227n55pv58MMP+eKLLxgxYgQAr7zyCieffDJjx47l/fff56OPPlorcalXrx5/+MMfWLRoEU8++SSPPfYYo0ZllmB65JFHmDJlCrNnz2bJkiXcfffdbL/99rn7ZUh5MGrUKJYtW8aPfvQjWrduXbqt+X+qugwZMoSGDRuu84XAjTfeyIsvvsjVV19drdeTqlvRd7uSpEJw6qmnlq5uff755zNo0CAuu+yytVZAPv/88znooIPWel+/fv341re+BcBPf/pTxo0bB2QWQTv88MPp2rUrAJdeeinXXntt6fv222+/0tft27fnxBNP5F//+hdDhgyhfv36LFu2jNdee43vfve7651SVCokX2fA91tvvVXl87o4pOo6Wz4kqQCsSTwA2rVrx/vvv8/y5cs58cQTadeuHdtuuy1du3blk08+YdWqVaV1W7VqVfq6YcOGpV1E3n///bXOufXWW6/VejF79mwOP/xwWrVqxbbbbstvfvOb0i5b3bp149RTT+WUU06hRYsWDBgwgKVLl9bYvUuS6o6iTz5c50NSIXj33XdLX7/zzju0adOGkSNH8vrrr/P000+zdOlSpkyZAlTuG9rWrVuvdc7ly5fz0Ucfle6ffPLJ7LrrrrzxxhssXbqUyy+/fK3z/vrXv2bmzJm88sorzJ49u1JTh0qSCl/RJx8OOJdUCK677jree+89Fi9ezPDhw+nduzfLli2jQYMGNGnShMWLFzNs2LBKn++YY47h73//O1OnTuWLL77goosuWmsg67Jly9h2221p1KgRr732Gn/6059Kjz3zzDM8/fTTfPnll2y99dZstdVWrmQuSQJMPiSpIBx77LH06NGDnXfemV122YULLriAIUOGsGLFCpo1a8b+++/PIYccUunz7bHHHlx33XUce+yxtG7dmqZNm/KNb3yj9PiIESO4/fbb2Wabbejfvz+9e/cuPbZ06VL69+9P06ZNS2fLOuuss6r1fiVJdVO4ImZGSUlJmjFjRr7DkFQLvfrqq7V60HT79u254YYb6N69e75D+VrW9/uNiJkppZJKnCKnf8hc56N65HqdDz+36lGI67OoRsT6DtjyIUmSJCknij75cMC5JEmSlBtFv85HSmk8ML6kpKR/vmORpK+jMmsFSJJUGxR9y4ckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5UfRT7UZET6Bnhw4d8h2KpDqkpldLdhVhSVIhKvqWj5TS+JTSgMaNG+c7FEmSJKmgFX3yIUl1Xfv27RkxYgR77bUXjRs3pnfv3qxcuZIxY8Zw4IEHrlU3InjzzTcB6Nu3LwMHDuTQQw+lUaNGHHDAAcyfP58hQ4bQtGlTdt11V5577rm1rnPFFVew++6707RpU/r168fKlSsB6NixI+PHjy+t++WXX9KsWbO13i9JksmHJBWAu+++m3/+85/MnTuXF154gTFjxlT6fZdddhmLFi1iyy23pHPnzuy7774sWrSIY445htNPP32t+rfddhsPP/wwc+bMYfbs2Vx22WUA9OnTh7/+9a+l9SZMmEDr1q3ZZ599qu0eJUl1n8mHJBWAX//617Rp04btttuOnj17MmvWrEq976ijjmK//fZjq6224qijjmKrrbaiT58+1KtXj969e6/TcnHqqaeyww47sN1223H++edzxx13APD//t//Y8KECSxduhSAsWPHcvzxx1frPUqS6j6TD0kqAK1atSp93bBhQz799NNKva9ly5alrxs0aLDOfvnz7LDDDqWv27Vrx/vvvw9AmzZtOOCAA7jvvvv45JNPeOihhzjuuOO+1r1IkgpX0c92JUmFauutt2b58uWl+/Pnz9/kc7777rulr9955x3atGlTun/CCSdwww038NVXX9G5c2fatm27ydeTJBUWWz4kqUDtvffevPzyy8yaNYuVK1dy8cUXb/I5r7vuOt577z0WL17M8OHD6d27d+mxn/zkJzz77LNcffXV9OnTZ5OvJUkqPAWbfETE3yLi44i4N9+xSFI+fOtb3+Kiiy6ie/fufPOb31xn5quv49hjj6VHjx7svPPO7LLLLlxwwQWlxxo0aECvXr2YO3cuRx999CZfS5JUeCKllO8YakRE/BDYBjghpXTMxuqXlJSkGTNm1HRYkuqgV199ld122y3fYeRd+/btueGGG+jevft661xyySXMnj17rZmvNmZ9v9+ImJlSKqnEKXL6h6ymF5gsFrleSNPPrXq4AKoqKdZ3oGBbPlJKk4Fl+Y5DkorF4sWLufHGGxkwYEC+Q5Ek1VI5Tz4iomtEjIuIeRGRIqJvBXUGRsTciFgZETMjokuu45QkVd7111/PDjvswKGHHkrXrl3zHY4kqZbKx2xXjYCXgFuz21oiojdwNTAQmJr9+VBE7J5SeidbZxYVx94jpfR+DcUtSUXtrbfeWu+x/v37079//9wFI0mqk3KefKSUJgATACJi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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.data_cleaning import KeepColumns\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Category\", \"Address\", \"Resolution\", \"X\", \"Y\"]\n", - "objs = [KeepColumns([\"Category\", \"Address\", \"Resolution\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"KeepColumns\")" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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NezKzNoRmCye3evu3iNYph9wD4FnI38N3OHuc0627dyGXR06dIj169dz4MCBk21CMilTpgynnnoqJUvm9IhsERENuxKRk5N5GFRmQ4cO5ZFHHgFg8+bN3H///UyfPp1t27ZRt25devXqxZ133omZsW7dOpKTk0lNTWXHjh1Uq1aNtm3b8vDDDx/Tk3LUmjVrCD7tiqSkwC3sww8/5P777+eHH34gPT2d0047jV69enHbbbdRokQJfv31V5o3b87555/Pa6+9lqW+999/nz/+8Y8sWLCA3/3udwX3AYVWrsOuClXyEQmZhl31/v777485v3r1ak455RSqVKmS63/Ekj/uzi+//MLu3buP+WuBiMhRSj5ERIqsXH9pLmwrnIedu6e4e3KFChVyPH/gwAElHgXMzKhSpYp6k0RERERiTMwnH3mhxKPg6TMVERERiT0xn3yYWRcze3Hnzp2RDkVEREREJKrFfPJxomFXAvXq1cv1WdciIiIiInlVqB61W1QsatsgpPW3nLMqpPWLiIiIiERCzCcfWmRQREREpHCy+7ZEOoSo4E8kRjqEDBp2VYSHXdWrV4+//vWvNGnShEqVKtGzZ08OHDjA9u3bufzyy0lMTKRSpUpcfvnlrF+/PuO6du3a8fDDD9O6dWtOOeUUOnXqxNatWzPOjxs3jrp161KlSpVjFrT57LPPaNWqFRUrVqRGjRr079+fgwcPAoFH6N5xxx1UrVqV8uXLc8455/D111+H58MQERERkUIv5pOPom78+PFMmzaNVatWsXLlSoYPH056ejo9e/bkp59+Yu3atcTFxdG/f/8s102YMIHXXnuNn3/+mYMHDzJq1CgAvvnmG/r27cu4cePYuHEjv/zyS5bEpXjx4vztb39j69atLFy4kI8//pgxY8YAMH36dObMmcPKlSvZuXMnb7/9dsYKnSIiIiIiSj6KuP79+1O7dm0qV67Mgw8+yFtvvUWVKlW45pprKFu2LKeccgoPPvggs2fPznJdz549Of3004mLi+NPf/oTS5cuBWDSpElcfvnltG3bltKlS/PYY49RrNj//jNp0aIFLVu2pESJEtSrV48+ffpk1F2yZEl2797Nd999h7vTuHFjatSoEbbPQkREREQKNyUfRVzt2rUzXtetW5eNGzeyb98++vTpQ926dSlfvjxt27Zlx44dHDlyJKNs9erVM16XLVuWPXv2ALBx48YsdZYrVy5L78XKlSu5/PLLqV69OuXLl+eBBx7IGLLVvn17+vfvz2233UbVqlVJTk5m165dIXvvIiIiIlK0xHzyUdTX+Vi3bl3G67Vr11KzZk2eeuopVqxYwaeffsquXbuYM2cOEJiTcSI1atTIUue+ffv45ZdfMvb79u3LmWeeyffff8+uXbt4/PHHs9R7++23k5qayjfffMPKlSt58sknC+JtioiIiEgUiPnkoyhPOAcYPXo069evZ9u2bYwYMYJu3bqxe/du4uLiqFixItu2bWPYsGF5rq9r16689957zJs3j4MHDzJkyBDS09Mzzu/evZvy5csTHx/Pd999xz/+8Y+Mc59//jmffvophw4doly5cpQpUybLkC0RERERiW36zbCIu/766+nUqROnnXYaDRo04KGHHmLQoEHs37+fhIQEWrZsyaWXXprn+s466yxGjx7N9ddfT40aNahUqRKnnnpqxvlRo0YxYcIETjnlFHr37k23bt0yzu3atYvevXtTqVKljKdl3X333QX6fkVERESk6LK8DMWJBUlJSb548eJjjn/77bc0btw4AhGdWL169Xj55Zfp0KFDpEP5TQrzZysikWdmqe6elIei+odMJEppnY+CEYF1Piy3E+r5EBERERGRsIj55KOoTzgXERERESkqSkQ6gEhz9xQgJSkpqXekY8mvNWvWRDoEEREREZE8i/meDxERERERCQ8lHyIiIiIiEhZKPkREREREJCyUfIiIiIiISFgo+RARERERkbBQ8iEiIiIiImER84/aNbMuQJeGDRvm/ZoQr7YZgVUoRURERERCLuZ7Ptw9xd2TK1SoEOlQRERERESiWswnH0VZvXr1GDVqFOeeey4VKlSgW7duHDhwgLFjx9KmTZssZc2MH374AYAePXrQr18/LrvsMuLj42ndujWbN29m0KBBVKpUiTPPPJMlS5Zkaeevf/0rTZo0oVKlSvTs2ZMDBw4AcPbZZ5OSkpJR9tChQyQkJGS5XkREREQElHwUeW+//TYffvghq1evZtmyZYwdOzbP1w0fPpytW7dSunRpWrVqRfPmzdm6dStdu3Zl8ODBWcqPHz+eadOmsWrVKlauXMnw4cMB+Mtf/sKbb76ZUW7q1KnUqFGDZs2aFdh7FBEREZHoEPNzPoq622+/nZo1awLQpUsXli5dSsuWLU943VVXXUWLFi0yXo8ZM4a//OUvAHTr1o2///3vWcr379+f2rVrA/Dggw8yYMAAhg8fzo033shjjz3Grl27KF++POPGjeOmm24qyLcoctIWtW0Q6RBOqOWcVZEOQUREJOTU81HEVa9ePeN12bJl2bNnT56uq1atWsbruLi4Y/az13M08QCoW7cuGzduBKBmzZq0bt2ad955hx07dvDBBx9www03/Kb3IiIiIiLRTT0fUahcuXLs27cvY3/z5s0nXee6desyXq9duzajtwWge/fuvPzyyxw+fJhWrVpRq1atk25PRERERKKPej6i0Hnnncfy5ctZunQpBw4c4JFHHjnpOkePHs369evZtm0bI0aMoFu3bhnn/vjHP/LFF1/w7LPPZgzdEhERERHJLmqTDzP7j5ltN7NJkY4l3E4//XSGDBlChw4daNSo0TFPvvotrr/+ejp16sRpp51GgwYNeOihhzLOxcXFcc0117B69Wquvvrqk25LRERERKKTuXukYwgJM2sHnAJ0d/euJyqflJTkixcvPub4t99+S+PGjQs8vqKkXr16vPzyy3To0CHXMo8++igrV67M8uSrE9FnK+GiCedFk5mluntSHopG5z9kIhLyhZ1jRQQWsLbcTkRtz4e7zwJ2RzqOWLBt2zZeeeUVkpOTIx2KiIiIiBRiYU8+zKytmU0xsw1m5mbWI4cy/cxstZkdMLNUM7so3HFK3rz00kvUrl2byy67jLZt20Y6HBEREREpxCLxtKt44GvgjeCWhZl1A54F+gHzgj8/MLMm7r42WGYpOcfeyd03hijumLVmzZpcz/Xu3ZvevXuHLxgRERERKbLCnny4+1RgKoCZjc2hyGBgrLu/FNwfYGaXAn2B+4N1NC2IWMwsGUgGqFOnTkFUKSIiIiIiuShUcz7MrBTQApie7dR04MKCbs/dX3T3JHdPSkzMfSJOtE7KjyR9piIiIiKxp1AlH0ACUBxIy3Y8Dah+bPHcmdkMYCLQ2czWm1mrXMp1MbMXd+7cmWM9xYsX59ChQ/lpWvLg0KFDlCihNS5FREREYklhSz4KjLt3cPdEdy/r7qe6+8JcyqW4e3KFChVyrKdixYqkpaWRnp4e0nhjSXp6OmlpaeT2mYuIiIhIdCpsf3reChwBqmU7Xg3YHP5wICEhgfXr17NixYpINB+1ypUrR0JCQqTDEBEREZEwKlTJh7sfNLNUoCOBIVNHdQTeCUWbZtYF6NKwYcMczxcrVkyT0UVERERECkAk1vmIN7OmZtY02H6d4P7R3/CfBnqYWS8za2xmzwI1gRdCEc+Jhl2JiIiIiEjBiMScjyRgSXCLA4YFXz8K4O7/BgYBDwFLgTZAZ3f/KRTBnGjCuYiIiIiIFIywJx/uPsvdLYetR6YyY9y9nruXdvcW7j4nhPGo50NEREREJAyi9mlXIiIiIiJSuMR88qFhVyIiIiIi4RHzyYeGXYmIiIiIhEfMJx8iIiIiIhIeSj5ERERERCQsYj750JwPEREREZHwiPnkQ3M+RERERETCI+aTDxERERERCQ8lHyIiIiIiEhYxn3xozoeIiIiISHjEfPKhOR8iIiIiIuER88mHiIiIiIiEh5IPEREREREJCyUfIiIiIiISFjGffGjCuYiIiIhIeMR88qEJ5yIiIiIi4RHzyYeIiIiIiISHkg8REREREQkLJR8iIiIiIhIWJSIdgIiISKTs37+fVatWAdCgQQPi4uIiHJGISHRTz4eIiMScX3/9lUGDBlG5cmXOO+88zj33XCpXrszAgQM5cOBApMMTEYla6vkQEZGY07dvX6ZPn87LL79Mq1atAFi4cCH3338/u3fv5tVXX41whCIi0Snmkw8z6wJ0adiwYaRDERGRMJk4cSKTJ0+mY8eOGcdOO+00qlatyjXXXKPkQ0QkRGI++XD3FCAlKSmpd6RjkcJtUdsGkQ4hT1rOWRXpEEQKvXLlylGrVq1jjteqVUvzPkREQkhzPkREJOYMGDCAYcOGsX///oxj+/fv57HHHmPAgAERjExEJLrFfM+HiIjEnkWLFjF79mxq1arFueeeC8BXX33F4cOH2bt3L1dccUVG2SlTpkQqTBGRqKPkQ0REYk5CQgLXXHNNlmP169ePUDQiIrFDyYeIiMSc1157LdIhiIjEJM35EBERERGRsFDPh4iIxJxzzjkHM8v1/LJly8IYjYhI7IjK5MPMagPjgKrAYeAxd58Y2ahERKSw6Nq1a5b9Q4cOsXTpUubPn89tt90WoahERKJfVCYfBBKOQe6+1MyqA6lmNtXd90Y6MBERibyhQ4fmePzJJ5/kp59+CnM0IiKxIyrnfLj7JndfGny9GdgKVI5oUCIiUuhdffXVjB8/PtJhiIhErbAnH2bW1symmNkGM3Mz65FDmX5mttrMDphZqplddBLttQCKu/u6k4lbRESi35w5cyhbtmykwxARiVqRGHYVD3wNvBHcsjCzbsCzQD9gXvDnB2bWxN3XBsssJefYO7n7xkx1VQ620buA34OIiBRhmRcRBHB3Nm3axJIlS3IdkiUiIicv7MmHu08FpgKY2dgcigwGxrr7S8H9AWZ2KdAXuD9YR9MTtWNmpYF3gSfcfcFJBy4iIlGjSpUqWfaLFSvGWWedxeOPP06nTp0iFJWISPQrVBPOzawU0AIYle3UdODCfNRjwFjgE3cfd5xyyUAyQJ06dfIbroiIFFFaZFBEJDIK24TzBKA4kJbteBpQPR/1tAa6AX80s6XB7Zzshdz9RXdPcvekxMTE3xy0iIgUXU888QQ7duyIdBgiIjGhsCUfBcLd57l7MXdvmmn7KqeyZtbFzF7cuXNnuMMUEZFC4PHHH2fbtm2RDkNEJCYUtuRjK3AEqJbteDVgcygadPcUd0+uUKFCKKoXEZFCzt0jHYKISMwoVMmHux8EUoGO2U51BEIyaVw9HyIiIiIi4RGJdT7izaypmTUNtl8nuH90xvfTQA8z62Vmjc3sWaAm8EIo4lHPh4hIbPvmm2+oW7dupMMQEYkJkXjaVRIwM9P+sOD2OtDD3f9tZlWAh4AaBNYE6ezuP4UiGDPrAnRp2LBhKKoXEZFCrnbt2pEOQUQkZuQp+TCzxsB1wO+BekAcsAX4AvgAeMfdf81LXe4+C7ATlBkDjMlLfSfL3VOAlKSkJC1EKCISxYoVK0bgSewnduTIkRBHIyISm46bfJhZc2Ak0AaYT2DexSRgP1AZOBsYATxvZiOBZ/KahIiIiITT22+/nZF8pKWlMWTIEK666ipatWoFwMKFC3n33XcZNmxYJMMUEYlqJ+r5+A+B5ONad9+eWyEzawXcAdxFIBkpMjTsSkQkNnTt2jXj9RVXXMFf//pXevf+X6f3zTffzPnnn8+7775Lv379IhGiiEjUO9GE80buPvp4iQeAuy909z8BTxZcaOGhCeciIrHnk08+4eKLLz7m+MUXX8ysWbPCH5CISIw4bvIRfPRtrsysZH7Ki4iIFAYJCQlMmjTpmOOTJk0iMTExAhGJiMSGPD/tysxuBza4+zvB/VeA7ma2CrjC3VeEKEYREZEC9eijj9KzZ09mzpyZMedj0aJFzJgxg1deeSXC0YmIRK/8rPNxO4EnXGFmbYE/AdcDS4GnCjyyMNEigyIisecvf/kLCxYsICEhgSlTpjBlyhSqVKnC/Pnz6d69e6TDExGJWvlZ56MWsDr4ugsw0d3fNrOvgLkFHlmY6FG7IiKx6YILLmD8+PGRDkNEJKbkp+djF1A1+Loj8HHw9SGgTEEGJSIiEmppaWmMGjWKfv36sXXrVgDmz5/P6tWrT3CliIj8Vvnp+ZgOvGRmXwANCSwuCHAW/+sRkTxY1LZBpEPIk5ZzVkU6BBGRkEhNTeUPf/gD9evXZ/ny5dx1110kJCTw0UcfsXLlSiZMmBDpEEVEolJ+ej5uI7DQYCLQ1d23BY83B94q6MDCRXM+RERiz1133cXAgQNZsmQJpUuXzjh+ySWXMH/+/AhGJiIS3fLc8+Huu4ABORwfWqARhZnmfIiIxJ7U1NQcn2pVo0YN0tLSIhCRiEhsOG7Ph5mdkp/K8lteREQkEuLi4ti+/dj1c7/77juqVq2awxUiIlIQTjTs6nsze8jMTs2tgJkVM7PLzOwjAkOzRERECrUrr7ySYcOG8euvvwJgZqxZs4Z7772Xa665JsLRiYhErxMNu7oIGAH8GHyk7mJgI3AAqAQ0AVoC+4HHgZdCF6qIiEjBGDVqFJ07dyYxMZF9+/bRpk0b0tLSaN26NcOHD490eCIiUeu4yYe7fw/8ycxqE1hU8CLgfCAO2AosAV4Eprp7eohjFRERKRDly5dn3rx5fPLJJ3zxxRekp6fTvHlzOnToEOnQRESiWp4mnLv7OgKrmBfZlcxzY2ZdgC4NGzaMdCgiIhJm7du3p3379pEOQ0QkZuTnUbtRyd1T3D25QoUKkQ5FRETCaMyYMZx11lmULVuWH3/8EYAnnniCt99+O8KRiYhEr5hPPkREJPY888wzDB8+nOTkZNw943itWrX4+9//HsHIRESim5IPERGJOS+88AIvvfQSAwcOpESJ/41Abt68OcuXL49gZCIi0U3Jh4iIxJyffvqJs88++5jjJUuWZP/+/RGISEQkNij5EBGRmHPaaafxxRdfHHN86tSpNGnSJAIRiYjEhjw97eooM6sG3AQ0AB52961m1hrY6O6rQxGgiIhIQbvrrrvo378/+/btw91ZuHAh48aNY+TIkbz66quRDk9EJGrlOfkwsxbAx8Bq4CzgSQJrfXQETgeuD0WAIiIiBa1nz54cPnyYBx54gH379nHTTTdRs2ZNnnvuObp16xbp8EREolZ+ej5GAc+6+1Az253p+DSgZ8GGFT5a50NEJDb17t2b3r17s3XrVtLT06latWqkQxIRiXr5mfPRAng9h+ObgGoFE074aZ0PEZHYtWrVKhYtWsRnn32WsdaHiIiETn56PvYDlXI4fibwc8GEIyIiEnq//PILt9xyC1OmTKFYscDf4dydyy+/nFdffZUqVapEOEIRkeiUn56P/wJDzax0cN/NrB7wf8A7BR2YiIhIqPTq1YsffviBuXPncuDAAQ4cOMCcOXNYvXo1vXv3jnR4IiJRKz89H3cBU4EtQFlgHoHhVvOBhwo+NBERkdCYNm0aH3/8Ma1atco41rp1a/75z3/SoUOHCEYmIhLd8px8uPsuoI2ZtQeaE+g1+cLdZ4QqOBERkVBITEykXLlyxxwvW7ashlyJiIRQvhcZdPdP3H2Uu49U4iEiIkXRkCFDGDRoEBs2bMg4tmHDBu68806GDBkSwchERKJbfhcZbAZcDFQlW+Li7vcUYFy/mZlVBGYQeG8lCDwe+KWIBiUiIoXKM888w5o1a6hXrx61atUCAslHmTJl+Pnnn3nuuecyyi5btixSYYqIRJ38LDJ4D/AE8BOQBnim057jRZGxG2jr7vvMrBzwtZlNdvdfIh2YiIgUDl27do10CCIiMSk/PR93AH3d/Z+hCqYguPsRYF9wtzRgwU1ERASAoUOHRjoEEZGYlJ85H8WAj0+mMTNra2ZTzGyDmbmZ9cihTD8zW21mB8ws1cwu+g3tVDSzL4H1wJPuvvVk4hYRkeiyZcsWtmzZkrH/1Vdf8dBDD/HWW29FMCoRkeiXn+TjH0DPk2wvHvgaGEhg0cIszKwb8CzwONAMWAB8YGZ1MpVZamZf57DVPFrG3Xe4+3lAfeB6MyuyK7CLiEjB+9Of/kRKSgoAW7dupW3btvznP//h1ltv5amnnopwdCIi0Ss/w66GAVPNbAmBBOJQ5pPufvOJKnD3qQTWCsHMxuZQZDAwNtME8QFmdinQF7g/WEfTvAbs7mnBHpCLgEl5vU5ERKLbsmXLaNmyJQCTJk2iYcOGfP755/z3v//l7rvv5s4774xwhCIi0Sk/PR8jgE7AYaASkJhtOylmVgpoAUzPdmo6cGE+6qlmZqcEX1cA2gIrcimbbGaLzWxx5u53ERGJbvv37yc+Ph6AGTNmcMUVVwDQvHlz1q1bF8nQRESiWn6Sj37A9e7+O3e/3N27ZN4KIJYEoDiBJ2lllgZUz0c9dYG5wR6PucDz7v5VTgXd/UV3T3L3pMTEk86fRESkiGjUqBGTJ09m3bp1TJ8+nU6dOgGQlpZGxYoVIxuciEgUy0/ysR9YEqpACoq7f+buTd39PHc/90RP5zKzLmb24s6dO8MVooiIRNjQoUO59957qVevHi1btuSCCy4AYNq0aTRr1izC0YmIRK/8JB9/AwaZWageW7sVOAJknxxeDdgcojZx9xR3T65QoUKomhARkULm6quvZu3atSxevJgPP/ww43iHDh14+umnIxiZiEh0y8+E84sIzJ/4f2b2DcdOOL/iZAJx94Nmlgp0BCZmOtUReOdk6j4eM+sCdGnYsGGomhARkUKoWrVqVKuW9e9dR3tAREQkNPKTfGwFJp9MY2YWDxz9Lb8YUMfMmgLb3H0t8DQwzsw+A+YDtwI1gRdOpt3jcfcUICUpKal3qNoQEREREZF8JB/ufrJrfAAkATMz7Q8Lbq8DPdz932ZWBXgIqEHgkb6d3f2nAmhbREREREQiKD89HyfN3WcBx50z4u5jgDFhCQgNuxIRERERCZfjJh9mtgz4vbtvN7OvAM+trLufW9DBhYOGXYmIiIiIhMeJej7eAX7N9DrX5ENERKQoSUtLY9y4caxatYrHHnuMhIQE5s+fT82aNalfv36kwxMRiUrHTT7cfVim14+EPJoI0LArEZHYk5qayh/+8Afq16/P8uXLufvuu0lISOCjjz5i5cqVTJgwIdIhiohEpTyv82Fmn5hZxRyOlzezTwo0qjDSOh8iIrHnrrvuYuDAgSxZsoTSpUtnHL/kkkuYP39+BCMTEYlu+VlksB1QKofjZQisASIiIlIkpKam0r1792OO16hRg7S0tAhEJCISG074tCsza55p91wz25ZpvzhwCbChoAMLFw27EhGJPXFxcWzfvv2Y49999x1Vq1aNQEQiIrEhLz0fi4HPCUw2nx7cP7p9CtwPPBqqAENNw65ERGLPlVdeybBhw/j118AzVcyMNWvWcO+993LNNddEODoRkeiVl+SjPtCAwPoc5wf3j261gPLu/mrIIhQRESlgo0aNYtu2bSQmJrJv3z7atGlDw4YNqVixIsOHD490eCIiUeuEw64yrS6en/khIiIihVb58uWZN28en3zyCV988QXp6ek0b96cDh06RDo0EZGolq8Vzs3sVKAtUJVsyYi7P12AcYmIiIRc+/btad++faTDEBGJGXlOPszsBuBV4DCwhawLDjpQJJMPTTgXEYlNS5YsYebMmfz888+kp6dnOTdy5MgIRSUiEt3y0/PxKPAU8LC7HwlRPGHn7ilASlJSUu9IxyIiIuExcuRI7rvvPurWrUu1atUws4xzmV+LiEjByk/yUQ14OZoSDxERiU1/+9vf+Mc//kGfPn0iHYqISEzJzyTyqcAFoQpEREQkXNLT0/nDH/4Q6TBERGJOfno+PgL+z8zOAr4CDmU+6e6TCzIwERGRUOnbty+vvfYaI0aMiHQoIiIxJT/Jxz+DPx/I4ZwTWO28yNGEcxGR2DN06FA6d+5Ms2bNOPvssylZsmSW86++quWrRERCIc/Drty92HG2Ipl4gFY4FxGJRQ8++CDTp0+nRIkSbN++nS1btmTZREQkNPK1zoeIiEg0GDNmDBMmTKBbt26RDkVEJKbkZ52Pwcc7r0UGRUSkqIiLi6NZs2aRDkNEJObkp+djQLb9kkANYD/wM0V0kUEREYk9d9xxB8888wyjR4/Wuh4iImGU5+TD3etnP2Zm1YDXgJcKMigREZFQmjt3LnPmzOH999+nSZMmx0w4nzJlSoQiExGJbic158Pd08zsQeBt4D8FE5KIiEhoJSQkcPXVV0c6DBGRmFMQE86LEVj9XEREpEh47bXXIh2CiEhMys+E8+x/IjICcz5uA+YWZFDhpHU+RERERETCIz89H5Oy7TuwBfgEuLPAIgozd08BUpKSknpHOhYREQmdc889l9mzZ1OpUiXOOeec4040X7ZsWRgjExGJHfmZcJ7nBQlFREQKm2uuuYbSpUtnvNZTrkREwi9PyYeZlQTmAX9x9xWhDUlERKTgDR06NOP1I488ErlARERiWJ56M9z9EFCfwFArERGRIq19+/bs2LHjmOO7du2iffv24Q9IRCRG5Gco1euA5kWIiEiRN2vWLA4ePHjM8QMHDjB3bpF9hoqISKGXnwnn5YAbzKwjkArszXzS3W8vyMBEREQK2hdffJHxetmyZVSuXDlj/8iRI0ybNo1atWpFIjQRkZiQn+SjMXD0rn1atnOFbjiWmZUFvgUmuvtdkY5HREQiLykpCTPDzOjUqdMx5+Pi4nj++ecjEJmISGzIz9OuLg5lICHwILAo0kGIiEjhsXr1atyd0047jc8++4zExMSMc6VKlaJq1aoUL148ghGKiES3gljhvNAxs0bAmUAKcHaEwxERkUKibt26AKSnp0c4EhGR2BTW5MPM2gJ3AS2AmkBPdx+brUw/4G4Cq6cvBwa5e35n/40K1nHhycYsIiLRaf369cyZM4eff/75mGRk8ODBEYpKRCS6hbvnIx74GngjuGVhZt2AZ4F+BNYV6Qd8YGZN3H1tsMxSco67k7tvNLMrgZXuvtLMlHyIiMgxxo8fz80330yJEiVITEzMsuCgmSn5EBEJkbAmH+4+FZgKYGZjcygyGBjr7i8F9weY2aVAX+D+YB1NT9BMS+DPZnYtgWSnpJntcvdHT/4diIhINBgyZAh33nknjz32mOZ4iIiEUX7W+QgpMytFYDjW9GynppOP4VPufr+713b3egSGeL2UW+JhZslmttjMFm/ZsuU3Ri4iIkVNWloavXr1UuIhIhJmhSb5ABKA4kBatuNpQPVQNOjuL7p7krsnZX7iiYiIRLfOnTvz6aefRjoMEZGYE5VPuzoq+2T2nJhZF6BLw4YNQx+QiIgUCh07duTee+9l+fLlnHPOOZQsWTLL+auvvjpCkYmIRLfClHxsBY4A1bIdrwZsDlWj7p4CpCQlJfUOVRsiIlK49OnTB4DHH3/8mHNmxpEjR8IdkohITCg0w67c/SCQCnTMdqojsCBU7ZpZFzN7cefOnaFqQkRECpn09PRcNyUeIiKhE9bkw8zizaypmTUNtl0nuF8nWORpoIeZ9TKzxmb2LIH1QF4IVUzunuLuyRUqVAhVEyIiIiIiQviHXSUBMzPtDwturwM93P3fZlYFeIjAIoNfA53d/acwxykiIlHs6aefPu55rfMhIhIa4V7nYxZgJygzBhgTloDQhHMRkVj0/PPPZ9k/dOgQmzZtIi4ujqpVqyr5EBEJkcI04TwiNOFcRCT2rF69+phjaWlp9OzZk9699c+BiEioFJoJ5yIiIpFUrVo1RowYwT333BPpUEREolbMJx962pWIiByVnp5OWlr2tW5FRKSgaNiVhl2JiMScyZMnZ9l3dzZt2sTo0aO56KKLIhSViEj0i/nkQ0REYk/Xrl2z7JsZiYmJtG/fnqeeeipCUYmIRD8lHyIiEnPS09MjHYKISEzSnA/N+RARiSmHDh3iggsuYMWKFZEORUQk5sR88qEVzkVEYkvJkiVZvXo1ZsdddkpEREIg5pMPERGJPd27d+ell16KdBgiIjFHcz5ERCTm7N27l/Hjx/PRRx/RokULypUrl+X8c889F6HIRESiW8wnH2bWBejSsGHDSIciIiJh8u2339K8eXMAfvzxxyznNBxLRCR0Yn7YleZ8iIjEnpkzZ+a6ffLJJ5EOT4qITZs20b17dxITEylTpgxNmjRh9uzZGefdnUceeYSaNWsSFxdHu3btWL58ecb5WbNmYWY5bhMnTszS1rRp02jVqhVly5alYsWKtG/fPuPc9OnTKVmyJJ9++mmWa15++WXi4+NZtWpViD4BkfyL+eRDREREJL927NhB69atcXfef/99vv32W55//nmqVq2aUWbkyJE89dRTPP/883z++edUrVqVjh07snv3bgAuvPBCNm3alGW7//77iY+P57LLLsuo59133+XPf/4zN910E0uWLGHhwoXccsstGec7depEr1696N69O/v37wdgzZo1DB48mFGjRtGgQYMwfSoiJxbzw65ERERE8mvkyJHUqFGDN954I+NY/fr1M167O8888wz33Xcf11xzDQCvv/46VatWZcKECfTp04dSpUpRvXr1LPVOmjSJ6667jvj4eACOHDnC7bffzsiRI+ndu3dGucaNG2e5btSoUZx33nncd999PPPMM/To0YMLL7yQW2+9tcDfu8jJUM+HiIiISD69++67XHDBBXTr1o2qVavStGlT/v73v+PuAKxevZrNmzfTqVOnjGvi4uJo27YtCxYsyLHOWbNm8f3335OcnJxxLDU1lXXr1lGqVCmaN29O9erV6dSpE0uWLMlybbly5Rg7diyjR4/mhhtu4Msvv+SVV14JwTsXOTkxn3xokUERERHJrx9//JExY8Zw2mmnMW3aNAYOHMh9993H6NGjAdi8eTMA1apVy3JdtWrVMs5l9+KLL9K0aVOSkpKytAMwZMgQHnjgAd5//31OPfVU2rVrx6ZNm7Jc36ZNG2688UbeeustnnrqKWrVqlVg71ekoMR88qEJ5yIiIpJf6enpNG/enL/+9a80a9aMnj17cvvtt2ckH/n1yy+/MHny5CxDq462A/Dggw/StWtXWrRowYsvvkiFChWyDPkCSEtL4/3336ds2bLM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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# BINNING STARTS \n", - "# SKIPPED REPLACE\n", - "from gators.binning import BinRareEvents\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns=[\"Category\", \"Address\", \"Resolution\"]\n", - "objs = [BinRareEvents(min_ratio=0.5)]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"BinRareEvents\")" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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yiWXXFJ+7kMOOYTly5czbdo0ttii0XyvrMLWaAacl5IZLL7OuOx2HTAipfT3iOgAnENm7uvZwGGbm3hI0sasXbuWxYsX89FHH7FmzZp8h1MwmjRpQrt27ejYsaN/MKnRmz9/Pj/4wQ9YvHgxnTp1Yp999uHJJ5+kR48erFixghdeeIHrr7+ejz76iK5du3LQQQdxyy23lM9k1bx5cx566CEuvfRSPvnkE7bZZhv+67/+i7Fjx9KkSRMATjrpJFq2bMmECRMqnfuaa65ht91249JLL+XnP/95zq9dqo0G1fORDw44l7Qp8+bNIyLo0qULzZo1c2BnHUgpsWrVKsrKykgpse22668Va8+HJDVaBTHgvF444FzSpnz66ad0796d5s2bm3jUkYigefPmdO/enU8//TTf4UiScqTokw9JqgkfC6of/rtKUnEp+ru+s11JkiRJuVH0yYePXUlSzfTs2ZMHH3ww32FIkhqxhjbblSQ1Ck8O2KFe29/nEefslyQVnqJPPirMdpXvUCRJUj2JM97PdwgFIV3YKd8hqJHzsSsfu5LUyPXs2ZNf//rX7LrrrrRv356RI0eycuVKPvzwQw4//HA6depE+/btOfzww5k/f375+w488EB++ctfst9++7HVVlsxePBgFi9eXF5+ww030KNHDzp06LDeugJPP/00/fv3p127dnTt2pXjjz+ezz//HMhMo/vzn/+czp0706ZNG3bffXdmz56dm38MSVKDVvTJhyQVghtvvJH777+fN998k9dee43x48ezdu1aRo4cydtvv828efMoKSnh+OOPr/S+m266iWuvvZb33nuPzz//nIsvvhiAl156ieOOO44bbriBhQsX8sEHH1RKXJo0acLvf/97Fi9ezBNPPMFDDz3ExIkTAZgyZQqPPPIIr732GkuXLuWWW26hQ4cOufvHkCQ1WCYfklQAjj/+eLbZZhu+9KUvcfbZZ3PzzTfToUMHhg4dSsuWLdlqq604++yzefjhhyu9b+TIkXzlK1+hpKSE733vezz//PMA3HbbbRx++OEMGDCAFi1acP7551eaFnfvvfdmn332oWnTpvTs2ZNjjjmmvO1mzZrx8ccf88orr5BSYpdddqFr1645+7eQJDVcJh+SVAC22Wab8tc9evRg4cKFLF++nGOOOYYePXrQpk0bBgwYwEcffcSaNWvK62699dblr1u2bMknn3wCwMKFCyu12apVq0q9F6+99hqHH344W2+9NW3atOGss84qf2Rr4MCBHH/88fz0pz+lc+fOjB49mmXLltXbtUuSGo+iTz5c50NSIXjnnXfKX8+bN49u3bpxySWX8Oqrr/LUU0+xbNkyHnnkESAzJmNTunbtWqnN5cuX88EHH5TvH3fccey88868/vrrLFu2jAsuuKBSuz/72c+YOXMmL730Eq+99hq//e1v6+IyJUmNXNEnHw44l1QILr/8cubPn8+SJUuYMGECw4cP5+OPP6akpIR27dqxZMkSxo0bV+P2hg0bxj333MNjjz3G559/zrnnnsvatWvLyz/++GPatGlD69ateeWVV/jzn/9cXvbMM8/w1FNPsWrVKlq1asWWW27pSuaSJMDkQ5IKwpFHHsngwYPZfvvt2WGHHTjnnHM46aSTWLFiBR07dmSfffbhkEMOqXF7vXv35vLLL+fII4+ka9eutG/fni9/+cvl5RdffDE33XQTW221FaNGjWL48OHlZcuWLWPUqFG0b9++fLas0047rU6vt5Cdd955RESlreLjcSklzjvvPLp160ZJSQkHHnggL7744nrt3H///fTv35+WLVvSrl07Bg4cWF42ZcoUmjVrxlNPPVXpPVdffTWtW7fmzTddZ0ZS/YiadL8Xg9LS0jRjxox8hyGpAXr55ZfZZZdd8h3GBvXs2ZOrr76aQYMG5TuUL2RD/74RMTOlVFqDJgrqF9l5553H3/72N6ZNm1Z+rEmTJnTqlFlf4Te/+Q3jx49n0qRJ7LTTTvzqV7/iscce49VXX2WrrbYC4M4772TkyJFMmDCBr3/966xdu5Znn32Wo446qrzN4447jqlTp/Lcc89RUlLC3Llz2WOPPbjooos49thjc3rNueA6H3XDdT5UQ7GhAns+JElqYJo2bcrWW29dvq1LPFJK/OEPf+CMM85g6NCh7Lbbblx33XV8/PHH3HTTTQCsWbOGn/3sZ1x00UWMGTOGnXbaiV122aVS4gGZ3qvVq1dzxhlnkFJixIgR7LvvvgWZeEhqOIo++XDAuSSpoXnrrbfo1q0b2223Hd///vd56623AJgzZw6LFi1i8ODB5XVLSkoYMGAAjz/+OAAzZ87knXfeoXnz5vTt25ett96awYMH89xzz1U6R6tWrZg0aRKXX345Rx11FP/3f//HNddck7uLlFSUij75cMC5pMZu7ty5jfaRK62vX79+TJo0iX/9619cddVVLFq0iH333ZcPPviARYsWAdClS5dK7+nSpUt52bpE5dxzz+Wss87in//8J1/+8pc58MADeffddyu9b//99+eHP/whN998M5dccgndu3fPwRVKKmZFn3xIktSQHHrooXzve99jjz32YNCgQdxzzz2sXbuW6667rkbvXzcr2dlnn82wYcPYe++9ufLKK2nbti3XX399pbplZWX885//pGXLluVTMUtSfTL5kCSpAWvdujW9e/fm9ddfL5/1qqysrFKdsrKy8rJ1q8nvuuuu5eVNmzZlxx13ZN68eZXeN3r0aHbccUcefPBB/vd//5fJkyfX56VIksmHJEkN2cqVK3nllVfo2rUr2223HVtvvTUPPPBApfJHH32UfffdF4C9996bFi1a8Oqrr5bXWbt2LW+++SY9evQoPzZp0iQefPBBrrvuOvr378/pp5/OMcccw5IlS3J3cZKKjsmHJEkNyKmnnsrDDz/MnDlzeOqppxg2bBiffvopRx99NBHBSSedxG9+8xvuuOMOZs+ezYgRI2jdujVHHnkkAG3atOHYY49l7Nix3H///bz66quceOKJfPjhh/z3f/83AO+88w4nnngiF154ITvuuCMAY8eOpWPHjpxwwgl5u3ZJha9pvgOQJEn/MX/+fH7wgx+wePFiOnXqxD777MOTTz5Z3mvxi1/8ghUrVvDTn/6UDz/8kH79+jFlypTyNT4Afvvb39K8eXOOPvpoli9fTt++fZk6dSpdu3YlpcSPf/xjSktLOf7448vf07x5c66//nq++tWvMmzYML7zne/k/NolFT4XGcxykUFJG9LQFxls7FxkULngIoN1w0UGVUMbXGSw6Hs+ImIIMKRXr175DkVSI1Lff8j4C16SVIiKfsyH63xIkiRJuVH0yYckNXY9e/bk4osvZo899qBt27YMHz6clStXMmnSJPbff/9KdSOCN954A4ARI0YwZswYDj30UFq3bs1+++3HokWLOOmkk2jfvj0777xzpVWxe/bsya9//Wt23XVX2rdvz8iRI1m5ciUAu+22W6VpWletWkXHjh3XW1VbklTcTD4kqQDccsst/Otf/2LOnDnMmjWLSZMm1fh948ePZ/HixbRo0YL+/fvTt29fFi9ezLBhwzj55JMr1b/xxhu5//77efPNN3nttdcYP348AD/60Y/43//93/J69957L127dmWvvfaqs2uUJDV+RT/mQ5IKwc9+9jO6desGwJAhQ3j++efZZ599Nvm+73znO+y9997lrydOnMiPfvQjAIYPH85ll11Wqf7xxx/PNttsA2RW0D7hhBMYP348P/zhDzn//PNZtmwZbdq04YYbbiif1rXQOHC5bjiuSSpO9nxIUgFYt7o1QMuWLfnkk09q9L4uXbqUvy4pKVlvv2o76xIPgB49erBw4UIAunXrxn777cftt9/ORx99xH333cdRRx31ha5FklS47PmQpALVqlUrli9fXr6/aNGizW7znXfeKX89b9688t4WgKOPPpqrr76a1atX079/f7p3777Z55MkFRZ7PiSpQO255568+OKLPP/886xcuZLzzjtvs9u8/PLLmT9/PkuWLGHChAkMHz68vOzb3/42zz77LJdeemn5o1uSJFVUsMlHRPwjIj6MiNvyHYsk5cNXvvIVzj33XAYNGsSOO+643sxXX8SRRx7J4MGD2X777dlhhx0455xzystKSkoYOnQoc+bM4Ygjjtjsc0mSCk/BrnAeEQcCWwFHp5SGbaq+K5xL2hBXOM/o2bMnV199NYMGDdpgnV/96le89tprlWa+2pTGtsK5A87rRq4HnPu51Q0nClANbXCF84Lt+UgpTQM+znccklQslixZwjXXXMPo0aPzHYokqYHKefIREQMi4u6IWBARKSJGVFNnTETMiYiVETEzIg7IdZySpJq76qqr2GabbTj00EMZMGBAvsORJDVQ+ZjtqjUwG7g+u1USEcOBS4ExwGPZn/dFxK4ppXnZOs9TfeyDU0oL6yluSSpqc+fO3WDZqFGjGDVqVO6CkSQ1SjlPPlJK9wL3AkTEpGqqnAxMSildld0/ISIOAY4Dzsy20acuYomI0cBogG233bYumpQkSZK0AQ1qzEdENAf2BqZUKZoC7FvX50spXZlSKk0plXbq5AAqSRtWqJNz5Jv/rpJUXBpU8gF0BJoAZVWOlwFbr199wyLiQeBW4LCImB8R/TdQb0hEXLl06dIvEq+kItCsWTNWrFiR7zAK0ooVK2jWrFm+w5Ak5UhDSz7qTEppUEqpU0qpZUrpyymlJzZQb3JKaXTbtm1zHaKkRqJz584sWLCA5cuX+019HUkpsXz5chYsWEDnzp3zHY4kKUfyMeB8YxYDa4AuVY53ARblPhxJgjZt2gCwcOFCVq1aledoCkezZs3o0qVL+b+vJKnwNajkI6X0eUTMBA4m88jUOgcDt9fHOSNiCDCkV69e9dG8pALRpk0b/0iWJGkz5WOdj9YR0Sci+mTPv212f910U78DRkTETyJil4i4FOgG/KU+4vGxK0mSJCk38jHmoxR4LruVAOOyr38FkFL6O3AScA7wPLA/cFhK6e36CMYB55IkSVJu5Dz5SClNSylFNduICnUmppR6ppRapJT2Tik9Uo/x2PMhSZIk5UDBznYlSZIkqWEp+uTDx64kSZKk3Cj65MPHriRJkqTcKPrkQ5IkSVJumHxIkiRJyomiTz4c8yFJkiSAX//610QExx9/PACrVq3i9NNPZ4899qBVq1Z07dqVI488knnz5lV636hRo9hhhx0oKSmhU6dOfOtb3+Lll18uL589ezZbbrklt99eec3sBx98kGbNmjF9+vT6v7gGouiTD8d8SJIk6cknn+TKK69kjz32KD+2fPlynn32Wc4++2yeffZZ7rrrLt555x0OOeQQVq9eXV6vtLSUSZMm8fLLL3P//feTUmLQoEGsWrUKgN12241x48Zx7LHHUlZWBsDSpUsZOXIkp5xyCvvtt19uLzaPIqWU7xgahNLS0jRjxox8hyFJyoqImSml0hpUzekvsjjj/VyermClCzvl9Hx+bnUj159brixdupS+ffty9dVXM27cOHbbbTcuu+yyauu+9NJL9O7dm1mzZrH77rtXW2fWrFnsueeevPLKK+y0004ArF27lgMOOICOHTty11138aMf/Yjnn3+eGTNm0Lx583q7tjyJDRUUfc+HJEmSitvo0aMZNmwYBx100CbrLlu2DID27dtXW/7pp59y7bXXsu2229KzZ8/y41tssQXXXXcdDz74IEcddRR/+9vfuP766wsx8diook8+HPMhSZJUvK666ireeOMNxo8fv8m6n3/+OaeccgpDhgzhy1/+cqWyiRMn0rp1a1q3bs19993HQw89RIsWLSrV6dWrF6eddho33XQTZ5xxBn369KnLS2kUij75cMyHJElScXr11Vc566yzuOmmm2jWrNlG665evZof/vCHfPTRR1x77bXrlR911FE899xzPPzww3zlK1/hu9/9LsuXL69UZ8WKFdx88820bNmSxx57jGIc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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.binning import Discretizer\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns=[\"Category\", \"Address\", \"Resolution\"]\n", - "objs = [Discretizer(n_bins=3)]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"Discretizer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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tNNOq5kbkmpJpFTcMxSWGXA++O233853OJLqoA8//JCIoF27djRq1MiBnTUgpcTy5cuZO3cuKSW22WbNtWIjYlpKqaQqp6v5CCVJG2GtvyiL/qsmB5xLWp/FixfTqVMnNt10UxOPGhIRbLrppnTq1InFixfnOxxJUo4UffIhSVVht6Da4c9VkopL0T/1ne1KkiRJyo2iTz7sdiVJVdOlSxcee+yxfIchSarH6tpsV5JULzzXa/taPf8+k52zX5JUeIo++Sgz21W+Q5EkSbUkzpmX7xAKQrq8Tb5DUD1ntyu7XUmq57p06cJll13GLrvsQosWLRg0aBDLli3j888/58gjj6RNmza0aNGCI488klmzZpW+78ADD+TXv/41PXv2ZIsttqBPnz7Mnz+/tPyOO+6gc+fOtGrVao11BaZMmcK+++7LVlttRYcOHTj55JP5+uuvgcw0uqeddhpt27Zlyy23ZPfdd2fGjBm5+WFIkuq0ok8+JKkQjB07lkceeYR3332Xt956i4svvphVq1YxaNAgPvjgAz788EMaN27MySefXO59d955J7feeiuffvopX3/9NaNGjQIyKysPHTqUO+64g9mzZ/PZZ5+VS1waNGjAH/7wB+bPn8+zzz7LP//5T0aPHg3AxIkTmTx5Mm+99RYLFy7k7rvvplWrVrn7YdRzF154IRFRbmvfvn1peUqJCy+8kI4dO9K4cWMOPPBAXn311UrPtWzZMrp160ZEMHXq1NLjEydOpFGjRjz//PPl6t900000a9aMd9+125+k2mHyIUkF4OSTT2brrbemZcuWnHfeedx11120atWKY445hiZNmrDFFltw3nnn8cQTT5R736BBg/jmN79J48aN+eEPf8j06dMBuPfeeznyyCPp1asXm222GRdddFG5aXH32msv9tlnHxo2bEiXLl046aSTSs/dqFEjFi1axBtvvEFKiZ133pkOHTrk7GdRCHbccUc++eST0u2VV14pLbviiiu48sorueaaa3jhhRdo27YthxxyCIsWLVrjPGeeeSbf+MY31jjep08fTjzxRE444QSWLl0KwPvvv8/pp5/OqFGj2H772h3TJKl4mXxIUgHYeuutS1937tyZ2bNns2TJEk466SQ6d+7MlltuSa9evfjiiy9YuXJlad2y36g3adKE//znPwDMnj273DmbNm1arvXirbfe4sgjj6R9+/ZsueWWnHvuuaVdtg4++GBOPvlkfv7zn9O2bVuGDBnCl19+WWv3XogaNmxI+/btS7c2bTL97FNKXHXVVZxzzjkcc8wx7Lbbbtx2220sWrSIO++8s9w5HnzwQSZNmlTamlXRqFGjWLFiBeeccw4pJQYOHMh+++3Hz372s1q/P0nFq+iTD9f5kFQIPvroo9LXH374IR07duTKK6/kzTff5Pnnn+fLL79k8uTJQOYP2PXp0KFDuXMuWbKEzz77rHR/6NCh7LTTTrz99tt8+eWXXHrppeXO+4tf/IJp06bx2muv8dZbb/G73/2uJm6zaLz33nt07NiRbbfdlh/96Ee89957AMycOZM5c+bQp0+f0rqNGzemV69ePPPMM6XHZs2axdChQ7nzzjtp3Lhxpddo2rQpY8aM4dprr2XAgAH8+9//5uabb67dG5NU9Io++XDAuaRCcO211zJr1iwWLFjAJZdcQv/+/Vm0aBGNGzdmq622YsGCBYwcObLK5+vXrx8PPfQQTz31FF9//TUXXHABq1atKi1ftGgRW265Jc2aNeONN97gz3/+c2nZCy+8wPPPP8/y5ctp2rQpm2++uSuZV8Pee+/NmDFj+Mc//sGNN97InDlz2G+//fjss8+YM2cOAO3atSv3nnbt2pWWrVy5kgEDBnDGGWfQrVu3dV5r//335yc/+Ql33XUXV155JZ06daqdm5KkLH8bSFIBOPbYY+nTpw/bbbcd22+/Peeffz6nnnoqS5cupXXr1uyzzz4cdthhVT7frrvuyrXXXsuxxx5Lhw4daNGiRbmxA6NGjeLOO+9kiy22YPDgwfTv37+07Msvv2Tw4MG0aNGidLass846q0bvt5Adfvjh/PCHP2SPPfagd+/ePPTQQ6xatYrbbrutSu+/9NJL2XTTTTn99NPXW3fu3Ln8/e9/p0mTJqUtY5JUm6Iqze/FoKSkJJWdCUSSVnv99dfZeeed8x3GWnXp0oWbbrqJ3r175zuUDbK2n29ETEsplVThFAX/i+yggw5ip5124qyzzmL77bdnypQpfOtb3yot/+53v0vr1q257bbbOPDAA3nyySeJiNLylStX0qBBA/r378/YsWNLj3//+99n3rx5XHnllRxwwAH87W9/o2/fvjm9t1xxnY+a4TofqqJYW0HRLzIoSVJdtmzZMt544w0OOuggtt12W9q3b8+jjz5amnwsW7aMJ598snRcza233srixYtL3z979mwOPfRQxo4dS8+ePUuPjxkzhscee4zp06ezww47cPbZZ3PSSSfRs2dPWrZsmdublFQ0ir7blQPOJUl1yZlnnskTTzzBzJkzef755+nXrx+LFy/mhBNOICI49dRT+e1vf8v999/PjBkzGDhwIM2aNePYY48FYNttt2W33XYr3b75zW8CsP3225d2nfvoo48YPnw4l19+OTvssAMAI0aMoHXr1pxyyin5uXFJRaHoWz5SSuOB8SUlJYPzHYskbYj3338/3yGoBs2aNYsf//jHzJ8/nzZt2rDPPvvw3HPP0blzZwB++ctfsnTpUn7+85/z+eefs/feezNx4kS22GKLKp0/pcRPf/pTSkpKyi06uemmm3L77bfz7W9/m379+nHUUUfVyv1JKm6O+chyzIektanrYz7qO8d8KBcc81EzHPOhKlrrmI+i73YlSZIkKTdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUE0U/25UkSdXhwOWa4cBlqTgVffIREX2Bvl27ds13KJLqkdr+A9Q/zCRJhajou12llManlIY0b94836FIkiRJBa3okw9Jqu+6dOnCqFGj2GOPPWjevDn9+/dn2bJljBkzhv33379c3YjgnXfeAWDgwIEMGzaMww8/nGbNmtGzZ0/mzJnDqaeeSosWLdhpp5146aWXyl3nsssuY5dddqFFixYMGjSIZcuWAbDbbrsxfvz40rrLly+ndevW5d4vSZLJhyQVgLvvvpt//OMfzJw5k5dffpkxY8ZU+X0XX3wx8+fPZ7PNNmPfffelR48ezJ8/n379+nH66aeXqz927FgeeeQR3n33Xd566y0uvvhiAI4//nj+8pe/lNabMGECHTp0YM8996yxe5Qk1X8mH5JUAH7xi1/QsWNHWrZsSd++fZk+fXqV3nfUUUex1157sfnmm3PUUUex+eabc/zxx9OgQQP69++/RsvFySefzNZbb03Lli0577zzuOuuuwD4yU9+woQJE/jyyy8BuOOOOzjuuONq9B4lSfWfyYckFYD27duXvm7SpAn/+c9/qvS+du3alb5u3LjxGvsVz7P11luXvu7cuTOzZ88GoGPHjvTs2ZP77ruPL774gocffpgBAwZs0L1IkgpX0c92JUmFqmnTpixZsqR0f86cORt9zo8++qj09YcffkjHjh1L90844QRuuukmVqxYwb777kunTp02+nqSpMJiy4ckFahu3brx6quvMn36dJYtW8aFF1640ee89tprmTVrFgsWLOCSSy6hf//+pWU/+MEPePHFF7n66qs5/vjjN/pakqTCU7DJR0T8LSI+j4h78x2LJOXDN7/5TS644AJ69+7NDjvssMbMVxvi2GOPpU+fPmy33XZsv/32nH/++aVljRs35phjjmHmzJkcffTRG30tSVLhiZRSvmOoFRFxILAFcEJKqd/66peUlKSpU6fWdliS6qHXX3+dnXfeOd9h5F2XLl246aab6N2791rr/OY3v+Gtt94qN/PV+qzt5xsR01JKJVU4RU5/kbnCec3I9UKafm41wwVQVUWxtoKCbflIKT0OLMp3HJJULBYsWMDNN9/MkCFD8h2KJG2Qyy67jIjg5JNPrrT8pJNOIiIYNWpUueNz5szhuOOOo3379jRp0oRu3boxduzY0vIZM2aw+eabc99995V732OPPUajRo14+umna/5m6qicJx8R0SsixkXExxGRImJgJXWGRcTMiFgWEdMi4oBcxylJqrobb7yRrbfemsMPP5xevXrlOxxJqrbnnnuOG264gT322KPS8nvvvZcpU6aUm2hjteOPP57XX3+dBx98kBkzZnD88cdz3HHHMXnyZCCzEOvIkSP52c9+xty5cwFYuHAhgwYN4owzzqBnz561d2N1TD5aPpoBM4DhwNKKhRHRH7gauBTYE3gGeDgitilTZ3pEzKhkW/O/BklSjXj//ffX2uVq8ODBLF68mOuuuy7HUUnSxlu4cCEDBgzglltuoUWLFmuUf/DBBwwfPpw777yTRo0arVH+zDPP8POf/5y9996b7bbbjjPOOIOtt96aKVOmlNY566yz+OY3v1naOnzKKafQokULfvOb39TejdVBOU8+UkoTUkrnppTuBVZVUuV0YExK6caU0usppVOAT4ChZc7RPaW0WyXb7OrEEhFDImJqREydN8++oJIkScVoyJAh9OvXj4MOOmiNshUrVvDjH/+Y888/f63j//bff3/uvvtuPvvsM1atWsWDDz7IvHnzyn1hs8kmm3Dbbbfx2GOPMWDAAP7v//6P22+/nU033bTW7qsuqlNjPiJiU2AvYGKFoonAfjV9vZTSDSmlkpRSSZs2DqCStHaFOjlHvvlzlZRvN954I++88w4XX3xxpeUjRoygdevWDB06tNJygLvvvpuIoHXr1my22WYMGDCAu+66i+7du5er17VrV8466yzuvPNOzjnnnDXKi0FdW2SwNdAAmFvh+Fxg7dOrVCIiHgO6AU0jYhbw/1JKz1ZSry/Qt2vXrhsWsaSC16hRI5YuXUqTJk3yHUrBWbp0aaVdGCQpF958803OPfdcnnrqqUqfRY8//jhjxoxh+vTp6zzP+eefz/z583nsscdo3bo1DzzwAMcffzyTJ0+mW7dupfWWLl3KXXfdRZMmTXjqqadIKRGx1omhClKdavmoSSml3imlNimlJimlb1SWeGTrjU8pDWnevHmuQ5RUT7Rt25aPP/6YJUuW+E19DUkpsWTJEj7++GPatm2b73AkFalnn32W+fPns+uuu9KwYUMaNmzIE088wejRo2nYsCGPPPIIn3zyCR06dCgt/+CDDzj77LP5xje+AcC7777LNddcw4033sh3vvMdunXrxogRI/jWt77FNddcU+56Z599NitWrGDKlClMnTqVP/3pT/m47byqay0f84GVQLsKx9sBc3IfjiTBlltuCcDs2bNZvnx5nqMpHI0aNaJdu3alP19JyrUf/OAHlJSUX05o0KBB7LDDDpx77rm0adOGAQMGlCs/9NBD+fGPf8zgwYMBWLJkCQANGjQoV69BgwasWvXf4c2TJk1i9OjRTJo0iV133ZUrr7ySU089lSOOOILtt9++Nm6vTqpTyUdK6euImAYcAtxTpugQ4L7K37Vx7HYlqSq23HJL/0iWpAKz1VZbsdVWW5U71rRpU1q2bMluu+0GQLt25b8Tb9SoEe3bt2fHHXcEYKeddqJr164MGzaMUaNG0apVKx544AEeffRRHnzwQQAWLVrEoEGDGD58OAcckFlBYvDgwdx3330MGjSIxx9/nE02KdgOSeXkY52PZhHRPSK6Z6+/TXZ/9VS6vwcGRsSJEbFzRFwNdARqZf5Gu11JkiRpQzVq1IgJEybQpk0b+vbtyx577MHtt9/OrbfeSt++fQE49dRTadKkCZdcckm5995888288sorXH311fkIPS8i1/2XI+JAYFIlRbellAZm6wwDfgl0ILMmyGkppcm1FM/qlo/Bb7/9dm1cQpK0ASJiWkqpZP01yekvsjjHqdlrQro8t7NM+rnVjFx/bqq31jqKPh/rfDyeUopKtoFl6oxOKXVJKW2WUtqrthKP7LVs+ZAkSZJyoDg6l0mSJEnKu6JPPiKib0TcsHDhwnyHIkmSJBW0ok8+7HYlSZIk5UadmmpXkiRJWs2JAmpGXZoooOhbPiRJkiTlRtEnH475kCRJknKj6JMPx3xIkiRJuVH0yYckSZKk3DD5kCRJkpQTRZ98OOZDkiRJyo2iTz4c8yFJkiTlRtEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKiaJPPhxwLkmSJOVG0ScfDjiXJEmScqPokw9JkiRJuWHyIUmSJCknTD4kSZIk5UTDfAcgSVK+LF26lHfffReA7bffnsaNG+c5IkkqbLZ8SJKKzldffcWpp55Ky5Yt6datG3vssQctW7Zk+PDhLFu2LN/hSVLBsuVDklR0hg4dysSJE7npppvYd999AXj22Wf51a9+xaJFi7jlllvyHKEkFaaiTz4ioi/Qt2vXrvkORZKUI/fccw/3338/hxxySOmx7bbbjrZt23LMMceYfEhSLSn6bleu8yFJxadp06Z06tRpjeOdOnVy3Ick1aKiTz4kScXnlFNOYeTIkSxdurT02NKlS7nooos45ZRT8hiZJBW2ou92JUkqPs899xxPPPEEnTp1Yo899gDglVdeYcWKFSxevJjvfe97pXXHjRuXrzAlqeCYfEiSik7r1q055phjyh3bdttt8xSNJBUPkw9JUtG59dZb8x2CJBUlx3xIkiRJyglbPiRJRWf33XcnItZa/vLLL+cwGkkqHgWZfETE1sAdQFtgBXBRSume/EYlSaor+vXrV25/+fLlTJ8+naeffpqf//zneYpKkgpfQSYfZBKOU1NK0yOiPTAtIiaklBbnOzBJUv6NGDGi0uO/+93v+OCDD3IcjSQVj4Ic85FS+iSlND37eg4wH2iZ16AkSXXe0UcfzdixY/MdhiQVrJwnHxHRKyLGRcTHEZEiYmAldYZFxMyIWBYR0yLigI243l5Ag5TSRxsTtySp8E2ePJkmTZrkOwxJKlj56HbVDJgB3J7dyomI/sDVwDDgqey/D0fELimlD7N1plN57H1SSrPLnKtl9hqDa/geJEn1WNlFBAFSSnzyySe89NJLa+2SJUnaeDlPPlJKE4AJABExppIqpwNjUko3ZvdPiYjDgKHAr7Ln6L6+60TEZsADwOUppWc2OnBJUsFo1apVuf1NNtmEXXfdlUsvvZQ+ffrkKSpJKnx1asB5RGwK7AWMqlA0EdivGucJYAzwr5TSHeuoNwQYArDNNttUN1xJUj3lIoOSlB91bcB5a6ABMLfC8blA+2qcpyfQH/hBREzPbrtXrJRSuiGlVJJSKmnTps0GBy1Jqr8uv/xyvvjii3yHIUlFoa4lHzUipfRUSmmTlFL3MtsrldWNiL4RccPChQtzHaYkqQ649NJLWbBgQb7DkKSiUNeSj/nASqBdhePtgDm1ccGU0viU0pDmzZvXxuklSXVcSinfIUhS0ahTyUdK6WtgGnBIhaJDgFoZNG7LhyRJkpQb+Vjno1lEdI+I7tnrb5PdXz3i+/fAwIg4MSJ2joirgY7AdbURjy0fklTcXnvtNTp37pzvMCSpKORjtqsSYFKZ/ZHZ7TZgYErprxHRCjgf6EBmTZAjUkof1EYwEdEX6Nu1a9faOL0kqY7beuut8x2CJBWNKiUfEbEz8GPgf4AuQGNgHvAi8DBwX0rpq6qcK6X0OBDrqTMaGF2V822slNJ4YHxJSYkLEUpSAdtkk03IzMS+fitXrqzlaCSpOK0z+YiIHsAVwP7A02TGXdwLLAVaArsBlwDXRMQVwFVVTUIkScqlu+++uzT5mDt3LhdccAFHHXUU++67LwDPPvssDzzwACNHjsxnmJJU0NbX8vE3MsnH/0spfb62ShGxL3AacCaZZKTesNuVJBWHfv36lb7+3ve+x2WXXcbgwf9t9P7pT3/Kt7/9bR544AGGDRuWjxAlqeCtb8D5Dimla9eVeACklJ5NKf0Q+F3NhZYbDjiXpOLzr3/9i4MOOmiN4wcddBCPP/547gOSpCKxzuQjO/XtWkVEo+rUlySpLmjdujX33nvvGsfvvfde2rRpk4eIJKk4VHm2q4j4BfBxSum+7P7NwAkR8S7wvZTSm7UUoyRJNeo3v/kNgwYNYtKkSaVjPp577jkee+wxbr755jxHJ0mFqzrrfPyCzAxXREQv4IfAscB04MoajyxHXGRQkorP8ccfzzPPPEPr1q0ZN24c48aNo1WrVjz99NOccMIJ+Q5PkgpWddb56ATMzL7uC9yTUro7Il4BnqzxyHLEqXYlqTjtvffejB07Nt9hSFJRqU7Lx5dA2+zrQ4B/Zl8vBzavyaAkSaptc+fOZdSoUQwbNoz58+cD8PTTTzNz5sz1vFOStKGqk3xMBG6MiJuArmQWFwTYlf+2iEiSVOdNmzaNHXfckbFjx3LTTTfx5ZdfAvDoo49y3nnn5Tk6SSpc1el29XMya3hsA/RLKS3IHu8B3FXTgeWK63xIhe+5XtvnO4T12mfyu/kOoaiceeaZDB8+nJEjR7LFFluUHj/00EO59dZb8xiZJBW2KicfKaUvgVMqOT6iRiPKMcd8qKrqwx+w4B+xUlVMmzat0lmtOnTowNy5c/MQkSQVh3V2u4qILdZVvrH1JUnKh8aNG/P552uun/vGG2/Qtm3bSt4hSaoJ62v5eDsi/gSMSSnNqqxCRGwCHAqcTmYQ+uU1G2Lh8Rt0Scqv73//+4wcOZJ77rkHgIjg/fff5+yzz+aYY47Jc3SSVLjWl3wcQGacx3vZKXWnArOBZUALYBdgH2ApcClwY+2FKklSzRg1ahRHHHEEbdq0YcmSJey///7MnTuXnj17cvHFF+c7PEkqWOtMPlJKbwM/jIitySwqeADwbaAxMB94CbgBmJBSWlXLsUqSVCO23HJLnnrqKf71r3/x4osvsmrVKnr06EHv3r3zHZokFbQqDThPKX1EZhXzeruS+do425UkFa+DDz6Ygw8+ON9hSFLRqM46HwUppTQ+pTSkefPm+Q5FkpRDo0ePZtddd6VJkya89957AFx++eXcfffdeY5MkgpX0ScfkqTic9VVV3HxxRczZMgQUkqlxzt16sSf/vSnPEYmSYXN5EOSVHSuu+46brzxRoYPH07Dhv/tgdyjRw9effXVPEYmSYXN5EOSVHQ++OADdttttzWON2rUiKVLl+YhIkkqDiYfkqSis9122/Hiiy+ucXzChAnssssueYhIkopDlWa7Wi0i2gHHAdsDv04pzY+InsDslNLM2ghQkqSaduaZZ3LyySezZMkSUko8++yz3HHHHVxxxRXccsst+Q5PkgpWlZOPiNiLzArmM4Fdgd+RWevjEOCbwLG1EaAkSTVt0KBBrFixgnPPPZclS5Zw3HHH0bFjR/74xz/Sv3//fIcnSQWrOi0fo4CrU0ojImJRmeOPAINqNqzccZ0PSSpOgwcPZvDgwcyfP59Vq1bRtm3bfIckSQWvOmM+9gJuq+T4J0C7mgkn91znQ5KK17vvvstzzz3HlClTStf6kCTVnuq0fCwFWlRyfCfg05oJR5Kk2vfZZ5/xv//7v4wbN45NNsl8D5dS4sgjj+SWW26hVatWeY5QkgpTdVo+HgRGRMRm2f0UEV2A3wL31XRgkiTVlhNPPJF33nmHJ598kmXLlrFs2TImT57MzJkzGTx4cL7Dk6SCVZ2WjzOBCcA8oAnwFJnuVk8D59d8aJIk1Y5HHnmEf/7zn+y7776lx3r27Mn1119P79698xiZJBW2KicfKaUvgf0j4mCgB5lWkxdTSo/VVnCSJNWGNm3a0LRp0zWON2nSxC5XklSLqr3IYErpXymlUSmlK0w8JEn10QUXXMCpp57Kxx9/XHrs448/5owzzuCCCy7IY2SSVNiqu8jgnsBBQFsqJC4ppV/WYFwbLCK2Ah4jc28NyUwPfGNeg5Ik1SlXXXUV77//Pl26dKFTp05AJvnYfPPN+fTTT/njH/9YWvfll1/OV5iSVHCqs8jgL4HLgQ+AuUAqU5wqfVN+LAJ6pZSWRERTYEZE3J9S+izfgUmS6oZ+/frlOwRJKkrVafk4DRiaUrq+toKpCSmllcCS7O5mQGQ3SZIAGDFiRL5DkKSiVJ0xH5sA/9yYi0VEr4gYFxEfR0SKiIGV1BkWETMjYllETIuIAzbgOltFxL+BWcDvUkrzNyZuSVJhmTdvHvPmzSvdf+WVVzj//PO566678hiVJBW+6iQffwYGbeT1mgEzgOFkFi0sJyL6A1cDlwJ7As8AD0fENmXqTI+IGZVsHVfXSSl9kVLqBmwLHBsR9XYFdklSzfvhD3/I+PHjAZg/fz69evXib3/7Gz/72c+48sor8xydJBWu6nS7GglMiIiXyCQQy8sWppR+ur4TpJQmkFkrhIgYU0mV04ExZQaInxIRhwFDgV9lz9G9qgGnlOZmW0AOAO6t6vskSYXt5ZdfZp999gHg3nvvpWvXrrzwwgs8+OCDnHXWWZxxxhl5jlCSClN1Wj4uAfoAK4AWQJsK20aJiE2BvYCJFYomAvtV4zztImKL7OvmQC/gzbXUHRIRUyNiatnmd0lSYVu6dCnNmjUD4LHHHuN73/seAD169OCjjz7KZ2iSVNCqk3wMA45NKX0rpXRkSqlv2a0GYmkNNCAzk1ZZc4H21ThPZ+DJbIvHk8A1KaVXKquYUrohpVSSUipp02aj8ydJUj2xww47cP/99/PRRx8xceJE+vTpA8DcuXPZaqut8hucJBWw6iQfS4GXaiuQmpJSmpJS6p5S6pZS2mN9s3NFRN+IuGHhwoW5ClGSlGcjRozg7LPPpkuXLuyzzz7svffeADzyyCPsueeeeY5OkgpXdZKPPwCnRkRtTVs7H1gJVBwc3g6YU0vXJKU0PqU0pHnz5rV1CUlSHXP00Ufz4YcfMnXqVP7xj3+UHu/duze///3v8xiZJBW26gw4P4DM+InvRsRrrDng/HsbE0hK6euImAYcAtxTpugQ4L6NOfe6RERfoG/Xrl1r6xKSpDqoXbt2tGtX/vuu1S0gkqTaUZ3kYz5w/8ZcLCKaAav/yt8E2CYiugMLUkofAr8H7oiIKcDTwM+AjsB1G3PddUkpjQfGl5SUDK6ta0iSJEmqRvKRUtrYNT4ASoBJZfZHZrfbgIEppb9GRCvgfKADmSl9j0gpfVAD15YkSZKUR9Vp+dhoKaXHgXWOGUkpjQZG5yQg7HYlSZIk5co6k4+IeBn4n5TS5xHxCpDWVjeltEdNB5cLdruSJEmScmN9LR/3AV+Veb3W5EOSpPpk7ty53HHHHbz77rtcdNFFtG7dmqeffpqOHTuy7bbb5js8SSpI60w+Ukojy7y+sNajyQO7XUlS8Zk2bRrf+c532HbbbXn11Vc566yzaN26NY8++ihvvfUWd955Z75DlKSCVOV1PiLiXxGxVSXHt4yIf9VoVDnkOh+SVHzOPPNMhg8fzksvvcRmm21WevzQQw/l6aefzmNkklTYqrPI4IHAppUc35zMGiCSJNUL06ZN44QTTljjeIcOHZg7d24eIpKk4rDe2a4iokeZ3T0iYkGZ/QbAocDHNR1YrtjtSpKKT+PGjfn888/XOP7GG2/Qtm3bPEQkScWhKi0fU4EXyAw2n5jdX709D/wK+E1tBVjb7HYlScXn+9//PiNHjuSrrzJzqkQE77//PmeffTbHHHNMnqOTpMJVleRjW2B7MutzfDu7v3rrBGyZUrql1iKUJKmGjRo1igULFtCmTRuWLFnC/vvvT9euXdlqq624+OKL8x2eJBWs9Xa7KrO6eHXGh0iSVGdtueWWPPXUU/zrX//ixRdfZNWqVfTo0YPevXvnOzRJKmjVWuE8Ir4B9ALaUiEZSSn9vgbjkiSp1h188MEcfPDB+Q5DkopGlZOPiBgA3AKsAOZRfsHBBNTL5MMB55JUnF566SUmTZrEp59+yqpVq8qVXXHFFXmKSpIKW3VaPn4DXAn8OqW0spbiybmU0nhgfElJyeB8xyJJyo0rrriCc845h86dO9OuXTsiorSs7GtJUs2qTvLRDripkBIPSVJx+sMf/sCf//xnTjrppHyHIklFpTqDyCcAe9dWIJIk5cqqVav4zne+k+8wJKnoVKfl41HgtxGxK/AKsLxsYUrp/poMTJKk2jJ06FBuvfVWLrnkknyHIklFpTrJx/XZf8+tpCyRWe283nHAuSQVnxEjRnDEEUew5557sttuu9GoUaNy5bfc4vJVklQbqtztKqW0yTq2epl4gCucS1IxOu+885g4cSINGzbk888/Z968eeU2SVLtqNY6H5IkFYLRo0dz55130r9//3yHIklFpTrrfJy+rnIXGZQk1ReNGzdmzz33zHcYklR0qtPycUqF/UZAB2Ap8Cn1dJFBSVLxOe2007jqqqu49tprXddDknKoyslHSmnbiscioh1wK3BjTQYlSVJtevLJJ5k8eTJ///vf2WWXXdYYcD5u3Lg8RSZJhW2jxnyklOZGxHnA3cDfaiYkSZJqV+vWrTn66KPzHYYkFZ2aGHC+CZnVzyVJqhduvfXWfIcgSUWpOgPOK35FFGTGfPwceLImg8ol1/mQJEmScqM6LR/3VthPwDzgX8AZNRZRjqWUxgPjS0pKBuc7FklS7dljjz144oknaNGiBbvvvvs6B5q//PLLOYxMkopHdQacV3lBQkmS6ppjjjmGzTbbrPS1s1xJUu5VKfmIiEbAU8DxKaU3azckSZJq3ogRI0pfX3jhhfkLRJKKWJVaM1JKy4FtyXS1kiSpXjv44IP54osv1jj+5ZdfcvDBB+c+IEkqEtXpSnUb4LgISVK99/jjj/P111+vcXzZsmU8+WS9nUNFkuq86gw4bwoMiIhDgGnA4rKFKaVf1GRgkiTVtBdffLH09csvv0zLli1L91euXMkjjzxCp06d8hGaJBWF6iQfOwOrn9rbVSirc92xIqIJ8DpwT0rpzHzHI0nKv5KSEiKCiKBPnz5rlDdu3JhrrrkmD5FJUnGozmxXB9VmILXgPOC5fAchSao7Zs6cSUqJ7bbbjilTptCmTZvSsk033ZS2bdvSoEGDPEYoSYWtJlY4r3MiYgdgJ2A8sFuew5Ek1RGdO3cGYNWqVXmORJKKU06Tj4joBZwJ7AV0BAallMZUqDMMOIvM6umvAqemlKo7+m9U9hz7bWzMkqTCNGvWLCZPnsynn366RjJy+umn5ykqSSpsuW75aAbMAG7PbuVERH/gamAYmXVFhgEPR8QuKaUPs3WmU3ncfVJKsyPi+8BbKaW3IsLkQ5K0hrFjx/LTn/6Uhg0b0qZNm3ILDkaEyYck1ZKcJh8ppQnABICIGFNJldOBMSmlG7P7p0TEYcBQ4FfZc3Rfz2X2AX4UEf+PTLLTKCK+TCn9ZuPvQJJUCC644ALOOOMMLrroIsd4SFIOVWedj1oVEZuS6Y41sULRRKrRfSql9KuU0tYppS5kunjduLbEIyKGRMTUiJg6b968DYxcklTfzJ07lxNPPNHEQ5JyrM4kH0BroAEwt8LxuUD72rhgSumGlFJJSqmk7IwnkqTCdsQRR/D888/nOwxJKjoFOdvVahUHs1cmIvoCfbt27Vr7AUmS6oRDDjmEs88+m1dffZXdd9+dRo0alSs/+uij8xSZJBW2upR8zAdWAu0qHG8HzKmti6aUxgPjS0pKBtfWNSRJdctJJ50EwKWXXrpGWUSwcuXKXIckSUWhznS7Sil9DUwDDqlQdAjwTG1dNyL6RsQNCxcurK1LSJLqmFWrVq11M/GQpNqT0+QjIppFRPeI6J699jbZ/W2yVX4PDIyIEyNi54i4msx6INfVVkwppfEppSHNmzevrUtIkiRJIvfdrkqASWX2R2a324CBKaW/RkQr4HwyiwzOAI5IKX2Q4zglSQXs97///TrLXedDkmpHrtf5eByI9dQZDYzOSUA44FySitE111xTbn/58uV88sknNG7cmLZt25p8SFItqUsDzvPCAeeSVHxmzpy5xrG5c+cyaNAgBg/214Ek1ZY6M+BckqR8ateuHZdccgm//OUv8x2KJBWsok8+nO1KkrTaqlWrmDu34lq3kqSaYrcru11JUtG5//77y+2nlPjkk0+49tprOeCAA/IUlSQVvqJPPiRJxadfv37l9iOCNm3acPDBB3PllVfmKSpJKnwmH5KkorNq1ap8hyBJRckxH475kKSisnz5cvbee2/efPPNfIciSUWn6JMPVziXpOLSqFEjZs6cScQ6l52SJNWCok8+JEnF54QTTuDGG2/MdxiSVHQc8yFJKjqLFy9m7NixPProo+y11140bdq0XPkf//jHPEUmSYWt6JOPiOgL9O3atWu+Q5Ek5cjrr79Ojx49AHjvvffKldkdS5JqT9EnH67zIUnFZ9KkSfkOQZKKkmM+JEmSJOWEyYckSZKknDD5kCRJkpQTRZ98uMigJEmSlBtFn3y4yKAkSZKUG0WffEiSJEnKDZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTRZ98uM6HJEmSlBtFn3y4zockSZKUG0WffEiSJEnKDZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTDfMdQG2IiPeBL4FVwOcppYPyG5EkSZKkgkw+svZLKf0n30FIkiRJyrDblSRJkqScyGnyERG9ImJcRHwcESkiBlZSZ1hEzIyIZRExLSIO2IBLJeCJiHghIgZsdOCSJEmSNlquu101A2YAt2e3ciKiP3A1MAx4KvvvwxGxS0rpw2yd6VQed5+U0uzs6/1TSh9HRAfgsYh4JaX0co3fjSRJkqQqy2nykVKaAEwAiIgxlVQ5HRiTUroxu39KRBwGDAV+lT1H9ypc5+Psv59ExASgB2DyIUmSJOVRnRnzERGbAnsBEysUTQT2q8Z5mkbEFtnXzYCDgVfXUndIREyNiKnz5s3bsMAlSZIkVUmdST6A1kADYG6F43OB9tU4TzvgqYj4N/AccHtK6YXKKqaUbkgplaSUStq0abMhMUuSJEmqooKbajel9B7Qrar1I6Iv0Ldr1661F5QkrUecU/dbX9PlfkkjSdo4danlYz6wkkzLRVntgDm1ddGU0viU0pDmzZvX1iUkSZIkUYeSj5TS18A04JAKRYcAz9TWdSOib0TcsHDhwtq6hCRJkiRyv85Hs4joHhHds9feJru/TbbK74GBEXFiROwcEVcDHYHraismWz4kSZKk3Mj1mI8SYFKZ/ZHZ7TZgYErprxHRCjgf6EBmTZAjUkof1FZAjvlQoXHsgCRJqqtyvc7H40Csp85oYHROAspcbzwwvqSkZHCurllf+EesJEmSalKdGfMhSZIkqbAVffLhgHNJkiQpN4o++XDAuSRJkpQbRZ98SJIkScoNkw9JkiRJOVH0yYdjPiRJkqTcKPrkwzEfkiRJUm4UffIhSZIkKTdMPiRJkiTlRNEnH475kCRJknKj6JMPx3xIkiRJuVH0yYckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOFH3y4WxXkiRJUm4UffLhbFeSJElSbhR98iFJkiQpN0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScqLokw+n2pUkSZJyo+iTD6falSRJknKj6JMPSZIkSblh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScqIgk4+I2DYiJkXEaxHxSkQ0zXdMkiRJUrFrmO8AaskY4PyU0pMR0RL4Ks/xSJIkSUWv4JKPiNgVWJ5SehIgpbQgzyFJkiRJIsfdriKiV0SMi4iPIyJFxMBK6gyLiJkRsSwipkXEAdW8zA7AfyJifES8GBHn1kjwkiRJkjZKrls+mgEzgNuzWzkR0R+4GhgGPJX99+GI2CWl9GG2znQqj7tPSml2tuwAoDvwKfCPiHghpfRojd+NJEmSpCrLafKRUpoATACIiDGVVDkdGJNSujG7f0pEHAYMBX6VPUf39VzmY2BqSumj7HUmkElETD4kSZKkPIqUUn4uHPEf4OSU0pjs/qbAEuDHKaV7ytS7FtgtpfQ/VTxvQ+AF4GBgIfAgcH1K6aFK6g4BhmR3dwTe3OAbKkytgfn5DkLV5udWP/m5ralzSqlNvoOojyJiSErphnzHoerxc6uf/Nyqpy4NOG8NNADmVjg+F+hd1ZOklFZkx3lMBgKYWFnika17A+B/LGsREVNTSiX5jkPV4+dWP/m5qYYNwd9v9ZGfW/3k51YNdSn5qDEppYeBh/MdhyRJkqT/qkuLDM4HVgLtKhxvB8zJfTiSJEmSalKdST5SSl8D04BDKhQdAjyT+4iETYj1lZ9b/eTnpprkf0/1k59b/eTnVg05HXAeEc2ArtndZ4DLgXHAgpTSh9mpdu8gM8Xu08DPgP8Fdk0pfZCzQCVJkiTVuFwnHwcCkyopui2lNDBbZxjwS6ADmTVBTkspTc5RiJIkSZJqSd6m2pUkSZJUXOrMmA/VDRHRKyLGRcTHEZEiYmC+Y1J56/uMIuPCiJgdEUsj4vGI2DVP4RatmvicIqJFRNwREQuz2x0RsVUu70P1h8/v+sFneP3gM7z2mHyoomZkursNB5bmORZVbn2f0S+BM4BTgG8BnwKPRsQWOYtQUDOf051AD+Cw7NaDzLg4qTI+v+sHn+H1g8/wWmK3K61VxVXoVfdU/IwiIoDZwJ9SSpdkjzUm81A8M6V0fb5iLWYb8jlFxM7Aa8D+KaWns3X2B54EdkopvZn7O1F94fO7fvAZXj/4DK9ZtnxIhWVboD0wcfWBlNJSYDKwX76C0hqq8jntC/yH8lONPw0sxs9SKlQ+w+sHn+EbweRDKizts//OrXB8bpky5V9VPqf2wLxUpnk6+/pT/CylQuUzvH7wGb4RTD4kSZIk5YTJh1RY5mT/bVfheLsyZcq/qnxOc4A22b7FQGk/47b4WUqFymd4/eAzfCOYfEiFZSaZh9ohqw9ExObAAZTvd6r8qsrn9CyZ2Vb2LfO+fYGm+FlKhcpneP3gM3wjNMx3AKpbIqIZ0DW7uwmwTUR0BxaklD7MW2Aqtb7PKCKuAs6NiDeAt4DzyQx6uzMP4Ratjf2cUkqvR8Q/gOsjYkj2PNcDDxXzLClaO5/f9YPP8PrBZ3jtcapdlRMRBwKTKim6LaU0MKfBqFLr+4yyzbojgJOAFsDzwM9TSjNyFqRq5HOKiBbANcD3sofGkZnu8Yvai1z1lc/v+sFneP3gM7z2mHxIkiRJygnHfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh9SHkVE+4iYGBGLI6JW5r2OiAMjIkVE69o4vyQVK5/hUvWZfEhVEBFtIuLriGgaEY2yv2i2qYFTnwl0BLoDHWrgfJKkCnyGS3VHw3wHINUT+wL/Tiktjoi9gQUppQ9r4LxdgWkppbdr4FySpMr5DJfqCFs+pKrZD3g6+3r/Mq/XKSJOioh3st+4vRMRg8uUvQ98Hzg+26Q+Zh3nOSIino+IpRHxWUSMj4jNs2UtIuK2iPg8W/5YROy6jnMNjIj/VDhWrll/dZ2IODwi3oiIJRExLiKaR0S/iHg7IhZGxB0R0bjMeR6PiNERcWlEzI+ITyNiVERsUqbO0RHxcjbWBRHxRES0q8rPU5I2kM9wn+GqI2z5kNYi2yT/cna3CbAyIgYCjYEUEV8Ad6aUhq3l/UcBfwJOAyYChwKjI2JOSmk88C3gTmABMBxYupbzHAaMAy4HBpH5/7YP//3yYAywI5lfgp8DlwD/iIhvppQqPWcVbQacAQwANgXuy25LgWOAVsD9wDDgyjLvGwBcTeaXfffsPU4D7oqI9sD/Ab/KnqsZsM9GxChJlfIZ7jNcdVRKyc3NrZKNzC+ILsAewNfZf7cHFgG9smWt1/H+p4FbKhwbAzxVZv8hYMx64nga+L+1lO0AJKBXmWPNgYXAidn9A7N1Wmf3BwL/qXCeyuokYMcydUYBK8vec/Z+Hiqz/zjwbIVzPwrclH3dI3vezvn+fN3c3Ap78xnuM9ytbm52u5LWIqW0IqX0PrAT8EJK6WWgPTA3pTQ5pfR+Smn+Ok6xM2s27T8F7FLNUPYE/rmOa6wCni0T90LglQ24TkVfpZTeLLM/F5hT4Z7nAm0rvO/lCvuzy9T5N/AYMCMi7ouIoRHRZiPjlKQ1+Az3Ga66yW5X0lpExKtAZ6ARsEm2j21DoGH29QcppbX2y12HWpmOsRrXWQVEhWONKqm3opLzLa/kWMUvMdZaJ6W0MiL6kGmm7wP8L3BZRPxPSunfa4lXkqrNZ7jPcNVNtnxIa3cEmf6uc4CfZF/PAE7Nvj5iPe9/HehZ4dj+wGvVjOMl4DvruMYmZGZyASAitgR2X8d15gFNsvVW617NmDZYyng2pTSSTJ/p2UD/XF1fUtHwGV4LfIZrY9nyIa1FSumD7OC6dsCDZL792RW4L6X0SRVO8TvgnoiYRmaw4mFkBvIdXc1QLgHGR8Q7ZAb+BZlvnK5PKb0dEQ8C10fEEOCLbP0vs3Ur8zywmMy3VX8AupEZcFjrImIfoDfwCJnm/j2Bran+L3NJWief4TXPZ7hqgi0f0rodSKav8DLg28CsKv7SIqX0AHAKmZlSXiMzG8qwlJklpcpSShOAo4DDyXyD9gRwEJmmd8jMnjKFzGwqU8jM6nJYWsssKSmlBWR+gR5Cpl/xEODX1YlpIywk803iQ8DbZGZYuSil9JccXV9ScTkQn+E1yWe4NlqklKuui5IkSZKKmS0fkiRJknLC5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQJEmSlBMmH5IkSZJy4v8DSMhqqPXVfIQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.binning import QuantileDiscretizer\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns=[\"Category\", \"Address\", \"Resolution\"]\n", - "objs = [QuantileDiscretizer(n_bins=3)]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"QuantileDiscretizer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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rqbDliR9S7NmzVqUUmpfhap1869okuq01atX87e//Y0mTZowa9asG4EbTzrpJJ599tkd3n333Yu22GILnnzySVq1asXEiRP7AT9/+OGHOfDAA/noo4/+DPwZIKXEDjvswKBBgx4A+Otf/8qQIUMYP3781F69erFkyRJ22203rr76anr06FF6/pQSd955Jz/96U+vOfTQQ6+ZPXs2c+fO3Zbs76b1XKytoN4kH0A7oBFQXOF4MdAfIKW0KiLOBB4l06XsqnXNdJVSuhm4GaCoqCg9//zztRG3JOlbiIi38x2DpIZn3rx57LnnnqxYsYKWLVvy97//nZ122gmA66+/npNOOoktt9ySxo0zvybfcMMNHHbYYQAsXLiQRo0a0a5du3JtduzYkYULFwLw73//m5KSEi677DKuvfZa2rZtyyWXXML+++/Pyy+/TPPmzUvfd+yxx3LzzTdz33338fDDD9OyZctc/Ajyqq6N+dhgKaVJKaXvppR6ZpOLdYqIgRFx85IlS3IRniRJkvJo2223Zc6cOTzzzDOcfPLJnHDCCcyfPx/IJBpPPvkkkyZNYtasWfz+97/nrLPO4oEHHqhy+yUlJaxcuZLrr7+egw8+mN12242JEyfy0UcfMXny5HJ1X3zxRZ5++mmaN2/OjBkzavQ666r6lHwsAlYDHSsc7wgs/LaNppQmp5RGtG7dekNikyRJUj2w8cYb07NnT3bddVeuvPJK+vTpw+9//3uWL1/Oeeedx1VXXcXAgQPp3bs3p5xyCscccwyjR2d6/Xfq1InVq1ezaNGicm0WFxfTqVMnADp37gxAr169Sstbt25Nly5deOedd0qPrVq1iiFDhnD44Ydzxx13cMUVVzB79uzavvy8qzfJR0rpazKLBh5UoeggMrNefSs++ZAkSSpcJSUlfPXVV6xcuZKVK1fSqFGjcuWNGjWipKQEgF133ZUmTZowbdp/xpG/9957vPzyy+y1V2YI8t577w3Aq6++Wlrniy++4MMPP6Rbt26lxy677DI++OADxo4dy5FHHsl///d/c8IJJ/D111/X2rXWBXUq+cjOrdwnIvqQiW3L7P43U+leAwyNiBMjYvuIuI7M2h43fttz+uRDkiSpMJx77rk8/vjjvPXWW8ybN4/zzjuP6dOnc9xxx9GqVSv+67/+i3PPPZfp06ezYMECJkyYwO23384RRxwBZJ5g/PSnP+VXv/oVDz30ELNnz+b444+nd+/e9O/fH4Dvfve7HH744Zx22mnMnDmTl156iWHDhtGhQ4fSsSOzZs3i8ssv5+abb2bzzTcHMl2+Fi1axKhRo/Lzw8mROjXVbkTsR2aweEV/SikNzdYZCfwK6ExmerJfppQ2uJOcA84lrU1JSQmLFi3is88+Y/Xq1fkOp8Fo1KgRm222Ge3atWOjjdb8W1hEzEopFVWhqbrzRSapThs6dCiPPvooCxcupHXr1vTu3Zuzzz6b73//+0BmQPl5553H1KlTWbx4Md26dePEE0/kzDPPJLscB1999RVnnXUWd955J8uXL+fAAw9k7NixbLHFFqXn+fzzzznjjDO49957SSmxzz77cO2117L11lvz1Vdf0bdvX3bbbTduu+22cvH97//+Lz/60Y948skn+d73vpe7H0zNW+tsV3Uq+ciHiBgIDOzZs+fw119/Pd/hSKqD3nnnHSKCjh070qRJk9IvIH17KSVWrlxJcXExKSW23HLNtWJNPiSp3lrrF2Wd6naVD3a7krQ+X375JV27dmXjjTc28aghEcHGG29M165d+fLLL/MdjiQpRwo++ZCkqqisW5A2nD9XSSosBX/Xd7YrSZIkKTcKPvmw25UkVU337t156KGH8h2GJKkea5zvACSpPnq639a12v4eM96s1fYlScqHgk8+ysx2le9QJEmSVEac+3G+Q2gQ0m/b5zuEUna7stuVpHque/fuXHnllfTq1Ys2bdowbNgwVqxYwaeffsphhx1G+/btadOmDYcddhjvvfde6fv2228/fv3rX7P33nuz6aabMmDAABYtWlRafscdd9CtWzc233xzLr/88nLnfPbZZ9lzzz3ZbLPN6Ny5M6ecckrpqrwpJX75y1/SoUMHWrVqxU477cT8+fNz88OQJNVpBZ98SFJDMHHiRB588EHefPNNXnvtNS677DJKSkoYNmwYb7/9Nu+88w7NmjXjlFNOKfe+O++8k9tuu42PPvqIr7/+mtGjRwPw0ksvcfLJJ3PHHXfwwQcf8Mknn5RLXBo1asTvf/97Fi1axFNPPcXDDz/M2LFjAZg6dSozZszgtddeY8mSJdx9992lK/hKkgqbyYckNQCnnHIKW2yxBW3btuWCCy7grrvuYvPNN+eoo46iefPmbLrpplxwwQU89thj5d43bNgwvvvd79KsWTOOPvpo5syZA8A999zDYYcdRr9+/WjatCmXXnppuWlxd911V/bYYw8aN25M9+7dOemkk0rbbtKkCZ9//jmvvPIKKSW23357OnfunLOfhSSp7jL5kKQGYIsttih93a1bNz744AOWLVvGSSedRLdu3WjVqhX9+vXjs88+Y/Xq1aV1O3XqVPq6efPmfPHFFwB88MEH5dps0aJFuacXr732GocddhidOnWiVatWnH/++aVdtg444ABOOeUUfv7zn9OhQwdGjBjB0qVLa+3aJUn1R8EnH67zIakhePfdd0tfv/POO3Tp0oWrr76aV199lWeeeYalS5cyY8YMIDMmY306d+5crs1ly5bxySeflO6ffPLJbLfddrz++ussXbqUK664oly7v/jFL5g1axYvvfQSr732Gr/73e9q4jIlSfVcwScfDjiX1BCMGTOG9957j8WLF3P55ZczePBgPv/8c5o1a8Zmm23G4sWLGTVqVJXbGzRoEP/85z954okn+Prrr7nooosoKSkpLf/8889p1aoVLVu25JVXXuGPf/xjadlzzz3HM888w8qVK2nRogWbbLKJK5lLkgCTD0lqEI499lgGDBhAjx492Hrrrbnwwgs5/fTTWb58Oe3atWOPPfbg4IMPrnJ7O+ywA2PGjOHYY4+lc+fOtGnThu985zul5aNHj+bOO+9k0003Zfjw4QwePLi0bOnSpQwfPpw2bdqUzpZ19tln1+j1SpLqp6jK4/dCUFRUlJ5//vl8hyGpDnr55ZfZfvvt8x3GWnXv3p3x48fTv3//fIfyrazt5xsRs1JKRVVowi8yqYFynY+akYd1PmJtBT75kCRJkpQTBZ98OOBckiRJyo3G+Q4g31JKk4HJRUVFw/MdiyR9G2+99Va+Q5AkqUoK/smHJEmSpNww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkScoJkw9JkiRJOVHwU+1GxEBgYM+ePfMdiqR6pLZX3c3DarSSJNW6gn/ykVKanFIa0bp163yHIkmSJDVoBZ98SFJ91717d0aPHk3v3r1p3bo1gwcPZsWKFUyYMIF99tmnXN2I4I033gBg6NChjBw5kkMOOYSWLVuy9957s3DhQk4//XTatGnDdtttx+zZs8ud58orr6RXr160adOGYcOGsWLFCgB23HFHJk+eXFp35cqVtGvXrtz7JUky+ZCkBuDuu+/mgQceYMGCBcydO5cJEyZU+X2XXXYZixYtomnTpuy555707duXRYsWMWjQIM4444xy9SdOnMiDDz7Im2++yWuvvcZll10GwJAhQ/jzn/9cWm/KlCl07tyZXXbZpcauUZJU/5l8SFID8Itf/IIuXbrQtm1bBg4cyJw5c6r0viOOOIJdd92VTTbZhCOOOIJNNtmEIUOG0KhRIwYPHrzGk4tTTjmFLbbYgrZt23LBBRdw1113AfCTn/yEKVOmsHTpUgDuuOMOjj/++Bq9RklS/WfyIUkNQKdOnUpfN2/enC+++KJK7+vYsWPp62bNmq2xX7GdLbbYovR1t27d+OCDDwDo0qULe++9N/feey+fffYZ//rXvzjuuOO+1bVIkhqugp/tSpIaqhYtWrBs2bLS/YULF25wm++++27p63feeYcuXbqU7p9wwgmMHz+eVatWseeee9K1a9cNPp8kqWHxyYckNVA777wzL774InPmzGHFihX85je/2eA2x4wZw3vvvcfixYu5/PLLGTx4cGnZj370I1544QWuu+46hgwZssHnkiQ1PA02+YiIv0fEpxFxT75jkaR8+O53v8tFF11E//792WabbdaY+erbOPbYYxkwYAA9evRg66235sILLywta9asGUcddRQLFizgyCOP3OBzSZIankgp5TuGWhER+wGbAieklAatr35RUVF6/vnnazssSfXQyy+/zPbbb5/vMPKue/fujB8/nv79+6+1ziWXXMJrr71Wbuar9VnbzzciZqWUiqrQRMP8IpNU6wu6Foo8LFwbaytosE8+UkrTgc/zHYckFYrFixdzyy23MGLEiHyHIkmqo3KefEREv4iYFBHvR0SKiKGV1BkZEQsiYkVEzIqIfXMdpySp6saNG8cWW2zBIYccQr9+/fIdjiSpjsrHbFctgfnA7dmtnIgYDFwHjASeyP77r4jolVJ6J1tnDpXHPiCl9EEtxS1JBe2tt95aa9nw4cMZPnx47oKRJNVLOU8+UkpTgCkAETGhkipnABNSSuOy+6dGxMHAycB52Tb61EQsETECGAGw5ZZb1kSTkiRJktaiTo35iIiNgV2BqRWKpgJ71fT5Uko3p5SKUkpF7dvnfCCOpHqkoU7OkW/+XCWpsNSp5ANoBzQCiiscLwY6rVl97SLiIeBvwKER8V5E7LmWegMj4uYl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B5JUW+rMgHNJkvKpY8eOXH755fzqV7/KdyiS1GAVfPLhbFeSpG+UlJRQXFxxrVtJUk2x25XdriSp4Nx3333l9lNKfPjhh4wZM4Z99903T1FJUsNX8MmHJKnwDBo0qNx+RNC+fXsOOOAArr766jxFJUkNn8mHJKnglJSU5DsESSpIjvlwzIckFZSVK1ey++678+qrr+Y7FEkqOAWffLjCuSQVliZNmrBgwQIi1rnslCSpFhR88iFJKjwnnHAC48aNy3cYklRwHPMhSSo4X375JRMnTmTatGnsuuuutGjRolz59ddfn6fIJKlhK/jkIyIGAgN79uyZ71AkSTny8ssv07dvXwD+/e9/lyuzO5Yk1Z6CTz5c50OSCs+jjz6a7xAkqSA55kOSJElSTph8SJIkScoJkw9JkiRJOVHwyYeLDEqSJEm5UfDJh4sMSpKkDdW9e3ciYo3tBz/4wRp1r7zySiKCU045pdzxX//612y33Xa0aNGCNm3acOCBB/Lkk0+Wli9cuJB27dpx9dVXl3vfiy++yCabbMJf/vKX2rk4qQYVfPIhSZK0oZ577jk+/PDD0u2FF14gIjj66KPL1Xv66ae5+eab6d279xptbLvttowZM4Z58+bxxBNPsNVWW3HwwQdTXFwMQKdOnRgzZgwXXnghL730EgArV65kyJAh/OhHP+KYY46p/QuVNpDJhyRJ0gZq3749nTp1Kt2mTJlCq1atyiUfS5Ys4bjjjuPWW2+lTZs2a7Txk5/8hAMPPJAePXqwww47cM011/D5558zZ86c0jqDBw/m8MMPZ8iQIaxatYpLL72UDz/8kLFjx+biMqUNZvIhSZJUg1JK3HLLLfzkJz+hWbNmpcdHjBjBoEGD2H///dfbxtdff83NN99Mq1at6NOnT7mysWPH8v7773Pcccdx5ZVXMn78eNq2bVvTlyHVioJfZFCSJKkmTZs2jQULFjB8+H/WLx43bhxvvPEGf/7zn9f53n/+858cc8wxLFu2jM6dOzNt2jQ6duxYrk7btm258sorGTZsGMcffzyHHnporVyHVBt88iFJklSDxo0bx/e+9z123nlnAF599VXOP/987rzzTpo0abLO9+6///7MmTOHJ598koMPPpijjz6aDz/8sFydkpISbrvtNpo3b85zzz3HihUrau1apJpm8iFJklRDPvroI+6///5yTz2eeuopFi1axA477EDjxo1p3Lgxjz32GGPHjqVx48Z89dVXpXVbtGhBz5492WOPPbjlllto0qQJ48ePL3eOa6+9lnnz5vHcc8/xxRdfcMEFF+Ts+qQNVfDdriJiIDCwZ8+e+Q5FkiTVcxMmTKBp06b8+Mc/Lj32ox/9iKKionL1hg0bxjbbbMP555/PxhtvvNb2SkpKyiUnL7/8MhdccAHjx4+nV69e3HLLLRx66KEceeSR7L333jV/QVINK/jkI6U0GZhcVFQ0fL2VJUmS1iKlxPjx4znmmGNo2bJl6fHNNtuMzTbbrFzdFi1a0LZtW3bccUcAli5dylVXXcXAgQPp3LkzH3/8MWPGjOG9994rnTFr1apVnHDCCfzgBz/guOOOA2DAgAGceOKJDBs2jDlz5tC8efPcXKz0LdntSpIkqQZMnz6d119/vVyXq6pq3LgxL774IkcccQTbbLMNAwcO5JNPPmHGjBmla4JceeWVvP322/zxj38s997Ro0ezatUqzjvvvBq5Dqk2FfyTD0mSpJqw//77k1KqUt3p06eX22/evDl///vf1/meX//61/z6179e43jLli3597//XeU4pXzyyYckSZKknDD5kCRJkpQTJh+SJEmScsLkQ5IkSVJONMgB5xHxFrAUKAE+TSntn9+IJEmqmt/85jeMGjWq3LGOHTuycOFCAO677z5uuukmXnjhBRYtWsSjjz7KfvvtV67+woULOfvss5k2bRpLly5lm2224Ve/+lXp9Kzz58+nqKiIiRMnctRRR5W+76GHHuKQQw5h+vTpDW7NiDj343yH0CCk37bPdwiq5xryk4+9Ukp9TDwkSfXNtttuy4cffli6zZs3r7Tsyy+/ZK+99uKaa65Z6/uHDBnCyy+/zP3338/8+fMZMmQIxx9/PDNmzABgxx13ZNSoUfzsZz+juLgYgCVLljBs2DDOPPPMBpd4SKo7GuSTD0mS6rPGjRvTqVOnSsuOP/54ABYtWrTW9z/55JPccMMN7L777gCceeaZXH/99Tz77LP069cPgLPPPptJkyYxYsQI7r//fk499VTatGnDJZdcUsNXI0n/kdMnHxHRLyImRcT7EZEiYmgldUZGxIKIWBERsyJi329xqgQ8FhHPRcRxGxy4JEk59O9//5suXbqw1VZbccwxx1R7DYd99tmHu+++m08++YSSkhLuv/9+Pv74Y/r3719aZ6ONNuJPf/oTDz30EMcddxx/+ctfuP3229l4441r+nIkqVSuu121BOYDpwHLKxZGxGDgOuAKYBfgSeBfEbFlmTpzImJ+JVuXMk3tk1LaFfghcH5E9K7Fa5IkqcbsvvvuTJgwgQceeIBx48axcOFC9tprLz755JMqt3H33XcTEbRr146mTZty3HHHcdddd9GnT59y9Xr27MnZZ5/NnXfeybnnnrtGuSTVtJx2u0opTQGmAETEhEqqnAFMSCmNy+6fGhEHAycD52Xb6FOF87yf/ffDiJgC9AXmbmj8kiTVtkMOOaTc/h577EGPHj3405/+xBlnnFGlNi688EIWLVrEQw89RLt27fjHP/7BkCFDmDFjBjvvvHNpveXLl3PXXXfRvHlznnjiCVJKRESNXo8klVVnBpxHxMbArsDUCkVTgb2q0U6LiNg0+7olcADw4lrqjoiI5yPi+Y8/dhYMSVLd07JlS3bYYQdef/31KtV/8803ueGGGxg3bhwHHnggO++8MxdffDHf+973uOGGG8rVPeecc1i1ahXPPvsszz//PH/4wx9q4xIkqVSdST6AdkAjoLjC8WKg8lF3lesIPBER/wc8DdyeUnqusooppZtTSkUppaL27Z06TpJU96xYsYJXXnmFzp07V6n+smXLAGjUqFG5440aNaKkpKR0/9FHH2Xs2LFMmDCBHXbYgauvvppzzz2XN998s+aCl6QK6lLyUSNSSv9OKe2c3XZMKV23rvoRMTAibl6yZEmuQpQkaa3OOussHnvsMRYsWMAzzzzDoEGD+PLLLznhhBMAWLx4MXPmzGH+/PkAvPHGG8yZM6d0HZDtttuOnj17MnLkSJ599lnefPNNrr76aqZNm8YRRxwBwOeff86wYcM47bTT2HffzLwuw4cPZ99992XYsGHlkhRJqkl1KflYBKwm8+SirI7Awto6aUppckppROvWrWvrFJIkVdl7773Hj3/8Y7bddluOPPJImjZtytNPP023bt0AmDRpErvssgv7759Zxmr48OHssssu3HjjjQA0adKEKVOm0L59ewYOHEjv3r25/fbbue222xg4cCAAp59+Os2bN+fyyy8vd+5bbrmFefPmcd116/y7nSR9a3VmnY+U0tcRMQs4CPhbmaKDgHtr67wRMRAY2LNnz9o6hSRJVfaXv/xlneVDhw5l6NCh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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.clipping import Clipping\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns=[\"X\", \"Y\"]\n", - "sf_crime_df = sf_crime_df[columns]\n", - "objs = [Clipping({\"X\":[-121.5, 122.5], \"Y\":[37.5, 37.75]})]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"Clipping\")" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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+YgVd5/s7v1r1Khx8MIikpC2bt1Kw4YNqVChghKPYmJmVKhQgYYNG7J169awwxERkYAkfPIhIlIQeXULkqLTz1VEJLEk/FNfs12JiIiIiAQj4ZMPdbsSESmYpk2bMm3atLDDEBGRUqxETbUrIlJazOlwVEzrP2nmspjWLyIiEoaETz6yzXYVdigiIiIiko395ZewQ4gL/kDywQsFRN2u1O1KREq5pk2bcv/999O8eXNq1apF37592bFjB7/99hvnnXceycnJ1KpVi/POO4+ffvop631nnHEGf/3rXznllFM47LDD6NKlCxkZGVnnx40bR5MmTahTpw7Dhw/Pcc3PP/+c9u3bU7NmTerXr88111zDrl27gMg0utdffz1169alevXqtGzZki+//DKYH4aIiJRoCZ98iIjEg/Hjx/Pee++xbNkyvv/+e+69914yMzPp27cvK1euZNWqVVSuXJlrrrkmx/smTJjACy+8wM8//8yuXbsYMWIEAF9//TUDBgxg3LhxrFmzhl9//TVH4lK2bFkeffRRMjIy+PTTT/nggw8YPXo0AFOnTmXmzJl8//33bNy4kVdffZU6deoE98MQEZESS8mHiEgcuOaaa2jUqBG1a9fmtttu4+WXX6ZOnTp0796dKlWqcNhhh3HbbbfttwJv3759Ofroo6lcuTKXXHIJCxcuBOD111/nvPPOo0OHDlSsWJF77rknx7S47dq146STTqJcuXI0bdqUq666Kqvu8uXLs3nzZr799lvcneOOO4769esH9rMQEZGSS8mHiEgcaNSoUdbrJk2asGbNGrZt28ZVV11FkyZNqF69Oh06dGDDhg3s3bs3q2y9evWyXlepUoUtW7YAsGbNmhx1Vq1aNUfrxffff895551HvXr1qF69OrfeemtWl62OHTtyzTXXcPXVV1O3bl369+/Ppk2bYnbvIiJSeiR88qF1PkQkHvz4449Zr1etWkWDBg14+OGH+e677/jss8/YtGkTM2fOBCJjMg6mfv36Oerctm0bv/76a9b+gAEDOPbYY1myZAmbNm3ivvvuy1Hvddddx7x58/j666/5/vvveeihh4rjNkVEpJRL+ORDA85FJB6MGjWKn376ifXr1zN8+HB69uzJ5s2bqVy5MjVr1mT9+vUMGzaswPX16NGDf/3rX8yaNYtdu3Zxxx13kJmZmXV+8+bNVK9enWrVqvHtt9/y5JNPZp374osv+Oyzz9i9ezdVq1alUqVKWslcREQAJR8iInHh0ksvpUuXLhx55JEcddRR3H777QwePJjt27eTlJTESSedxDnnnFPg+lq0aMGoUaO49NJLqV+/PrVq1eLwww/POj9ixAgmTJjAYYcdRlpaGj179sw6t2nTJtLS0qhVq1bWbFk33XRTsd6viIiUTlaQ5vdEkJqa6nPnzg07DBEpgb755huOO+64sMPIV9OmTXn22Wfp1KlT2KEckvx+vmY2z91TC1CFvshE4pTW+SgeIazzYfmdUMuHiIiIiIgEIuGTDw04FxEREREJRrmwAwibu08GJqempqaFHYuIyKFYsWJF2CGIiIgUSMK3fIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCASfqpdM+sGdGvWrFnYoYhIKRLrVXdDWI1WREQk5hK+5cPdJ7t7/xo1aoQdioiIiIhIXEv45ENEpLRr2rQpI0aMoFWrVtSoUYOePXuyY8cOxo4dy6mnnpqjrJmxdOlSAPr06cPAgQM599xzqVatGqeccgrr1q1j8ODB1KpVi2OPPZYFCxbkuM79999P8+bNqVWrFn379mXHjh0AHH/88UyePDmr7O7du0lKSsrxfhERESUfIiJx4NVXX+Xdd99l+fLlLFq0iLFjxxb4fffeey8ZGRlUrFiR9u3b07ZtWzIyMujRowc33HBDjvLjx4/nvffeY9myZXz//ffce++9APTq1Yt//OMfWeWmTJlC/fr1adOmTbHdo4iIlH5KPkRE4sB1111HgwYNqF27Nt26dWPhwoUFet9FF11Eu3btqFSpEhdddBGVKlWiV69elC1blp49e+7XcnHNNdfQqFEjateuzW233cbLL78MwJ/+9CemTJnCpk2bABg3bhyXX355sd6jiIiUfko+RETiQL169bJeV6lShS1bthTofSkpKVmvK1euvN9+7noaNWqU9bpJkyasWbMGgAYNGnDKKafwxhtvsGHDBt555x0uu+yyQ7oXERGJXwk/25WISLyqWrUq27Zty9pft25dkev88ccfs16vWrWKBg0aZO337t2bZ599lj179tC+fXsaNmxY5OuJiEh8UcuHiEicOuGEE/jqq69YuHAhO3bs4K677ipynaNGjeKnn35i/fr1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PkREREREJBBKPkREREREJBBKPkREREREJBAJn3xonQ8RERERkWAkfPKhdT5ERERERIKR8MmHiIiIiIgEQ8mHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEolzYAcSCma0ANgGZwG/ufma4EYmIiIiISFwmH1Enu/uWsIMQEREREZEIdbsSEREREZFABJp8mFkHM5tkZqvNzM2sTx5lBprZcjPbYWbzzOy0Q7iUAx+Z2RdmdlmRAxcRERERkSILuuWjGvAlMAjYnvukmfUERgL3AW2AT4B3zKxxtjILzezLPLYG2ao61d3bAecDt5pZqxjek4iIiCSYmTNncv7559OwYUPMjLFjx+Y4b2Z5bldffXVWmfT0dPr06UODBg2oUqUK55xzDkuWLMlRzxlnnLFfHX/84x+zzn/55ZdUqlSJN954I8f7pk2bRvny5Zk9e3bx37xIEQSafLj7FHe/1d1fJzIYPLcbgLHuPsbdv3H3a4G1wIBsdbR29+Pz2NZkK7M6+u9aYArQNqY3JiIiIglly5YtHH/88YwcOZLKlSvvd37t2rU5tsmTJwNwySWXAODuXHjhhSxZsoS33nqLBQsW0KRJEzp16sTWrVtz1NW3b98cdT399NNZ544//niGDRvGn//8Z9LT0wHYuHEjffv25cYbb+SUU06J1Y9A5JCUmAHnZlYBaAeMyHVqKnByIeqpCpRx981mVg3oCLyaT9n+QH+Axo0b51VEREREZD9du3ala9euAPTp02e/8/Xq1cux//bbb3P00Udz+umnA7BkyRLmzJnDwoULOeGEEwB48sknqVevHi+//DL9+vXLem+VKlX2qy+7m266iUmTJtG/f3/efvttrr32WmrVqsXdd99d1NsUKXYlacB5ElAWSM91PB3I//+4/aUAs8zsP8Ac4CV3/yKvgu7+jLununtqcnLyocQsIiIickBbtmzhlVdeIS0tLevYzp07AahUqVLWsTJlylCxYkVmzZqV4/2vvPIKSUlJtGjRgiFDhrB58+Yc58uUKcOLL77ItGnTuOyyy3jllVd46aWXqFChQgzvSuTQlJiWj+Li7j8AJxS0vJl1A7o1a9YsdkGJiIhIwpowYQK7du2id+/eWceOPfZYGjduzK233sqYMWOoVq0ajz76KD/99BNr167NKnfppZfSpEkTGjRowFdffcXQoUNZtGgRU6dOzXGNZs2acdNNNzFs2DD++te/0rp166BuT6RQSlLykQHsJdJykV0KsC5WF3X3ycDk1NTUtIMWFhERESmkMWPGcMEFF5C9l0X58uWZOHEiV155JXXq1KFs2bJ06tSJc889F3fPKte/f/+s1y1btuTII4/kxBNPZP78+bRt+98hrdu3b+fll1+mSpUqzJo1C3fHzIK5QZFCKDHdrtx9FzAP6JzrVGcis17FhJl1M7NnNm7cGKtLiIiISIJauHAhc+fOzdHlap927dqxcOFCNmzYwNq1a3n33Xf59ddfOfLII/OtLzU1lbJly+43K9Ytt9zCnj17+Pzzz5k7dy5PPPFEsd+LSHEIep2PambW2sxaR6/dOLq/b7T3I0AfM+tnZseZ2UigAfBUrGJy98nu3r9GjRqxuoSIiIgkqGeeeYYjjjiCTp065VumRo0aJCcns2TJEubOncsFF1yQb9nFixezd+9e6tevn3Vs+vTpjB49mrFjx9KiRQsefvhh/vKXv7Bs2bJivReR4hB0t6tUYHq2/WHR7UWgj7v/08zqALcD9YmsCdLV3VfGKiCN+RAREZHC2rJlC0uXLgUgMzOTVatWsXDhQmrXrp01g+a2bdsYP348N998c55doF577TWSkpJo0qQJixcvZtCgQVx44YV06dIFgGXLljF+/Hi6du1KUlISX3/9NTfeeCNt2rTJmkJ38+bN9O3bl0GDBnHaaZF1mdPS0njjjTfo27cvM2bMoEyZEtPRRSTwdT5muLvlsfXJVma0uzd194ru3s7dZ8Y4JrV8iIiISKHMnTuXNm3a0KZNG7Zv386dd95JmzZtuOOOO7LK/POf/2Tr1q307ds3zzrWrl1Lr169OPbYY7nuuuu4/PLLefnll7POV6hQgQ8++ICzzz6bY445huuuu44uXbowbdo0ypYtC8DgwYOpUqUKw4cPz1H3c889x+LFixk5cmQM7l7k0Fn2QU2JLDU11efOnRvIteZ0OCqQ6xTVSTPVXJudPrfSqzR8dvrc9mdm89w9tQBF9UUmEqfsL7+EHUJc8AcCX1Ii39kOEr4dTgPORURERESCkfDJh7pdiYiIiIgEI+GTDxERERERCYaSDxERERERCUTCJx8a8yEiIiIiEoyg1/kocdx9MjA5NTV1/6VHRUREJC5o1qTiEcKsSRJnEr7lQ0REREREgqHkQ0REREREApHwyYfGfIiIiIiIBENjPjTmQ0RKgNLQH119vUVEpKgSPvmQ/OmXIREREREpTko+ROKMkkYREREpqRJ+zIeIiIiIiARDyYeIiIiIiAQi4ZMPzXYlIiIlyahRo2jVqhXVq1enevXqtG/fnn//+99Z5ydOnMjZZ59NcnIyZsaMGTNyvH/FihWYWZ7bQw89BMC6detISkri4YcfzvHer776ikqVKvHKK6/E/D5FJDElfPLh7pPdvX+NGjXCDkVERITDDz+cv/3tb8yfP5+5c+fSsWNHLrzwQhYtWgTA1q1bOfnkk3nkkUfyfH+jRo1Yu3Ztjm306NGYGT169ACgXr16jBo1ittvv52vv/4agN27d9OrVy8uvPBC/vjHPwZzsyKScDTgXEREpAS54IILcuwPHz6cJ598kk8//ZRWrVpx+eWXA5CRkZHn+8uWLUu9evVyHJs4cSKdOnXiiCOOyDrWs2dP3nzzTXr16sWcOXO45557WLt2Le+//34x35GIyH8p+RARESmh9u7dy2uvvcaWLVs4+eSTD6mOH374gQ8++IBXX311v3OjR4+mRYsWXHbZZUycOJG3336b2rVrFzVsEZF8KfkQEREpYRYvXkz79u3ZsWMH1apV480336Rly5aHVNezzz5LcnLyfi0qALVr1+b++++nb9++XH755XTt2rWooYuIHFDCj/kQEREpaY455hgWLlzIZ599xoABA+jduzdffvlloevZs2cPL7zwAr1796Z8+fL7nc/MzOSFF16gSpUqfPHFF+zYsaM4whcRyZeSDxERkRKmQoUKNGvWjHbt2nH//ffTunVrHn300ULXM3nyZNatW0e/fv3yPP/YY4+xePFivvjiC7Zs2cJtt91W1NBFRA4o4ZMPTbUrIiIlXWZmJjt37iz0+8aMGcPpp5/O0Ucfvd+5b775httuu43HH3+c5s2b89xzzzFy5Ehmz55dHCGLiOQp4cd8uPtkYHJqampa2LGIiIj85S9/4Q9/+AONGjVi8+bNTJgwgRkzZmSt9bF+/XpWrVrFhg0bAFi6dCk1a9akXr16OWa5WrVqFe+99x4vvfTSftfYs2cPvXv35g9/+AOXXXYZAF26dKFfv3707duXhQsXUqVKldjfrIgknIRv+RARESlJ1q1bx5/+9CeOOeYYzjrrLL744gveeecdzj33XAAmTZpEmzZtOPPMMwFIS0ujTZs2PPXUUznqee6556hRowbdu3ff7xr3338/K1eu5Mknn8xxfMSIEezZs4ehQ4fG6O5EJNGZu4cdQ4mQmprqc+fODeRaczocFch1iqr9yXPCDuGg/IHkwK6lz634BPm5Qen47PS57c/M5rl7agGK6otMDsr+8kvYIcSFwJ8D+tyKRdCfG2D5nVDLh4iIiIiIBELJh4iIiIiIBELJh4iIiIiIBELJh4iIiIiIBCIup9o1syOA54EUYC9wkrtvDTcqERGJBxoAWzxCGAArIiVAXCYfwFjgdnf/2MxqA4VfmUlERERERIpV3CUfZtYC2O3uHwO4+/qQQxIREREREQIe82FmHcxskpmtNjM3sz55lBloZsvNbIeZzTOz0wp5md8BW8xsspnNN7NbiyV4EREREREpkqBbPqoBXwIvRbcczKwnMBIYCMyK/vuOmTV391XRMgvJO+4u7r4meu40oDXwM/CumX3h7u8X+92IiIiIiEiBBZp8uPsUYAqAmY3No8gNwFh3HxPdv9bMzgEGAEOjdbQ+yGVWA3Pd/cfodaYQSUSUfIiIiIiIhMjcPZwLm20BrnH3sdH9CsA24P/c/bVs5UYBx7v76QWstxzwBdAR2Ai8DTzt7v/Ko2x/oH909xjgu0O+ofiUBGSEHYQUmj630kmf2/6auLumRDoEZtbf3Z8JOw4pHH1upZM+t8IpSQPOk4CyQHqu4+lAp4JW4u57ouM8ZgIGTM0r8YiWfQbQfyz5MLO57p4adhxSOPrcSid9blLM+qPvt9JIn1vppM+tEEpS8lFs3P0d4J2w4xARERERkf8qSSucZxBZEDAl1/EUYF3w4YiIiIiISHEqMcmHu+8C5gGdc53qDHwSfESCmhBLK31upZM+NylO+u+pdNLnVjrpcyuEQAecm1k1oFl09xPgAWASsN7dV0Wn2h1HZIrd2cCfgSuBFu6+MrBARURERESk2AWdfJwBTM/j1Ivu3idaZiBwM1CfyJog17v7zIBCFBERERGRGAltql0REREREUksJWbMh5QMZtbBzCaZ2WozczPrE3ZMktPBPiOLuMvM1pjZdjObYWYtQgo3YRXH52RmtcxsnJltjG7jzKxmkPchpYee36WDnuGlg57hsaPkQ3KrRqS72yBge8ixSN4O9hndDNwIXAv8D/Az8L6ZHRZYhALF8zlNANoC50S3tkTGxYnkRc/v0kHP8NJBz/AYUbcryVfuVeil5Mn9GZmZAWuAJ9x9ePRYZSIPxSHu/nRYsSayQ/mczOw44GvgVHefHS1zKvAxcKy7fxf8nUhpoed36aBneOmgZ3jxUsuHSHw5AqgHTN13wN23AzOBk8MKSvZTkM+pPbCFnFONzwa2os9SJF7pGV466BleBEo+ROJLvei/6bmOp2c7J+EryOdUD/jFszVPR1//jD5LkXilZ3jpoGd4ESj5EBERERGRQCj5EIkv66L/puQ6npLtnISvIJ/TOiA52rcYyOpnXBd9liLxSs/w0kHP8CJQ8iESX5YTeah13nfAzCoBp5Gz36mEqyCf06dEZltpn+197YGq6LMUiVd6hpcOeoYXQbmwA5CSxcyqAc2iu2WAxmbWGljv7qtCC0yyHOwzMrPHgFvN7Fvge+B2IoPeJoQQbsIq6ufk7t+Y2bvA02bWP1rP08C/EnmWFMmfnt+lg57hpYOe4bGjqXYlBzM7A5iex6kX3b1PoMFIng72GUWbde8ErgJqAZ8BV7v7l4EFKcXyOZlZLeBx4PzooUlEpnvcELvIpbTS87t00DO8dNAzPHaUfIiIiIiISCA05kNERERERAKh5ENERERERAKh5ENERERERAKh5ENERERERAKh5ENERERERAKh5ENERERERAKh5EMkRGZWz8ymmtlWM4vJvNdmdoaZuZklxaJ+EZFEpWe4SOEp+RApADNLNrNdZlbVzMpHv2gaF0PVQ4AGQGugfjHUJyIiuegZLlJylAs7AJFSoj3wH3ffamYnAuvdfVUx1NsMmOfuS4qhLhERyZue4SIlhFo+RArmZGB29PWp2V4fkJldZWZLo39xW2pmadnOrQAuAHpFm9THHqCermb2mZltN7NfzWyymVWKnqtlZi+a2W/R89PMrMUB6upjZltyHcvRrL+vjJmda2bfmtk2M5tkZjXMrIeZLTGzjWY2zswqZ6tnhpmNNrP7zCzDzH42sxFmViZbmYvNbFE01vVm9pGZpRTk5ykicoj0DNczXEoItXyI5CPaJL8oulsF2GtmfYDKgJvZBmCCuw/M5/0XAU8A1wNTgbOB0Wa2zt0nA/8DTADWA4OA7fnUcw4wCXgA6Evk/9su/PePB2OBY4h8Cf4GDAfeNbOj3T3POguoInAjcBlQAXgjum0HugN1gInAQODhbO+7DBhJ5Mu+dfQe5wEvm1k94BVgaLSuasBJRYhRRCRPeobrGS4llLtr06Ytj43IF0RToBWwK/rvUcBmoEP0XNIB3j8beD7XsbHArGz7/wLGHiSO2cAr+Zz7HeBAh2zHagAbgX7R/TOiZZKi+32ALbnqyauMA8dkKzMC2Jv9nqP3869s+zOAT3PV/T7wbPR122i9TcL+fLVp0xbfm57heoZrK5mbul2J5MPd97j7CuBY4At3XwTUA9Ldfaa7r3D3jANUcRz7N+3PApoXMpQ2wAcHuEYm8Gm2uDcCiw/hOrntdPfvsu2nA+ty3XM6UDfX+xbl2l+Trcx/gGnAl2b2hpkNMLPkIsYpIrIfPcP1DJeSSd2uRPJhZl8BTYDyQJloH9tyQLno65Xunm+/3AOIyXSMhbhOJmC5jpXPo9yePOrbncex3H/EyLeMu+81sy5Emum7AFcC95vZ6e7+n3ziFREpND3D9QyXkkktHyL560qkv+s64E/R118Cg6Ovux7k/d8Ap+Q6dirwdSHjWACcdYBrlCEykwsAZlYdaHmA6/wCVImW26d1IWM6ZB7xqbsPI9Jneg3QM6jri0jC0DM8BvQMl6JSy4dIPtx9ZXRwXQrwNpG//rQA3nD3tQWo4iHgNTObR2Sw4jlEBvJdXMhQhgOTzWwpkYF/RuQvTk+7+xIzext42sz6Axui5TdFy+blM2Arkb9WPQqcQGTAYcyZ2UlAJ+A9Is39bYBGFP7LXETkgPQML356hktxUMuHyIGdQaSv8A7g98BPBfzSwt3fAq4lMlPK10RmQxnokVlSCszdpwAXAecS+QvaR8CZRJreITJ7yudEZlP5nMisLud4PrOkuPt6Il+gnYn0K+4P/LUwMRXBRiJ/SfwXsITIDCv3uPs/Arq+iCSWM9AzvDjpGS5FZu5BdV0UEREREZFEppYPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJxP8D5lBzOPso150AAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.scalers import MinMaxScaler\n", - "housing_df = pd.read_parquet(sf_crime_file_location)\n", - "columns=[\"X\", \"Y\"]\n", - "sf_crime_df=housing_df[columns]\n", - "objs = [MinMaxScaler()]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"MinMaxScaler\")" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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WLEirVq1YvPmzezfvz+7bo0aNbJflytXju3btwOwdu3aXG2WL18+V+/FsmXLuPzyy6lRowYVK1bknnvuyR6y1bp1a3r16sVtt91GtWrV6NGjB1u3bo3atYuISPGR9MmH1vkQkUTw/fffZ79evXo1tWrV4rHHHuPrr7/m448/ZuvWrcyaNQsIzck4nJo1a+Zqc+fOnfz000/Z+7feeiunnXYa33zzDVu3bmXo0KG52v3jH//IwoUL+eKLL1i2bBmPPvpoJC5TRESKuaRPPjThXEQSwbPPPssPP/zApk2bGDJkCJ07d2bbtm2kpqZy7LHHsmnTJgYNGlTo9jp16sS///1vZs+ezZ49e7j//vvJysrKPr5t2zYqVqxIhQoV+Oqrr/jrX/+afeyTTz7h448/Zu/evZQvX56yZctqJXMREQGUfIiIJITrrruOdu3aceKJJ3LSSSdx33330bdvX3bt2kXVqlVp3rw5l156aaHba9iwIc8++yzXXXcdNWvWpHLlyhx//PHZx4cPH864ceM45phj6N69O507d84+tnXrVrp3707lypWzn5Y1YMCAiF6viIgUT1aY7vdkkJGR4QsWLAg6DBGJQ19++SWnn3560GEUqH79+rz44ou0adMm6FCOSEE/XzNb6O4ZhWhCv8hEEpTW+YiMANb5sIIOqOdDRERERERiIumTD004FxERERGJjVJBBxA0d58MTM7IyOgedCwiIkdi5cqVQYcgIiJSKEnf8yEiIiIiIrGh5ENERERERGJCyYeIiIiIiMSEkg8REREREYkJJR8iIiIiIhITSj5ERERERCQmkv5Ru2bWAeiQnp4edCgiUoxEe9XdAFajFRERibqk7/lw98nu3qNSpUpBhyIiIiIiktCSPvkQESnu6tevz/DhwznzzDOpVKkSnTt3Zvfu3YwZM4bzzz8/V10z49tvvwWga9eu9OzZk8suu4wKFSpw3nnnsX79evr27UvlypU57bTTWLRoUa7zPPzwwzRo0IDKlSvTrVs3du/eDUCjRo2YPHlydt29e/dStWrVXO8XERFR8iEikgDGjx/PO++8w4oVK1iyZAljxowp9PsGDx7Mxo0bKVOmDC1atKBZs2Zs3LiRTp060a9fv1z1X3vtNaZOncry5ctZtmwZgwcPBuDGG2/kb3/7W3a9KVOmULNmTZo2bRqxaxQRkeJPyYeI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379/P1OnTqV27dpBhCYikhSKknycDhy4a5+Y51jcDccys3LAl8Ab7n5H0PGIiEjwMjIyMDPMjHbt2h10PDU1laeffjqAyEREkkNRnnZ1UTQDiYJ7gY+CDkJEROLHihUrcHdOPPFE5s+fT1paWvax0qVLU61aNUqWLBlghCIiiS0SK5zHHTM7GTgNmAw0CjgcERGJE/Xq1QMgKysr4EhERJJTTJMPM2sF3AGcBdQCurn7mDx1egIDCK2e/jnQ192LOvtveLiNc482ZhERSUw//PADs2bN4scffzwoGenXr19AUYmIJLZY93xUAJYCr4a3XMysMzAC6EloXZGewNtm1sDdV4frLCb/uNu5+1ozuxJY5u7LzEzJh4iIHOS1117j97//PaVKlSItLS3XgoNmpuRDRCRKYpp8uPsUYAqAmY3Jp0o/YIy7jwrv9zazS4FbgbvDbTQ5zGmaA78xs2sJJTspZrbV3R88+isQEZFEcP/999O/f38eeughzfEQEYmhoqzzEVVmVprQcKxpeQ5NowjDp9z9bnev4+71CQ3xGlVQ4mFmPcxsgZkt2LBhwxFGLiIixU1mZiY33XSTEg8RkRiLm+QDqAqUBDLzlGcCNaJxQnd/wd0z3D0j5xNPREQksbVv356PP/446DBERJJOQj7t6oC8k9nzY2YdgA7p6enRD0hEROJC27ZtufPOO/n8888544wzSElJyXX8mmuuCSgyEZHEFk/Jx0ZgP1A9T3l1YH20Turuk4HJGRkZ3aN1DhERiS8333wzAEOHDj3omJmxf//+WIckIpIU4mbYlbvvARYCbfMcagvMjdZ5zayDmb2wZcuWaJ1CRETiTFZWVoGbEg8RkeiJafJhZhXMrImZNQmfu254v264yuNAVzO7ycxON7MRhNYDeS5aMbn7ZHfvUalSpWidQkREREREiP2wqwxgRo79QeHtFaCru//DzI4D7iO0yOBSoL27r4pxnCIiksAef/zxQx7XOh8iItER63U+ZgJ2mDojgZExCQhNOBcRSUZPP/10rv29e/eybt06UlNTqVatmpIPEZEoiacJ54HQhHMRkeSzYsWKg8oyMzPp1q0b3bvr14GISLTEzYRzERGRIFWvXp0hQ4bwpz/9KehQREQSVtInH3ralYiIHJCVlUVmZt61bkVEJFI07ErDrkREks7EiRNz7bs769at49lnn6Vly5YBRSUikviSPvkQEZHk06lTp1z7ZkZaWhqtW7fmscceCygqEZHEp+RDRESSTlZWVtAhiIgkJc350JwPEZGksnfvXs455xy+/vrroEMREUk6SZ98aIVzEZHkkpKSwooVKzA75LJTIiISBUmffIiISPLp0qULo0aNCjoMEZGkozkfIiKSdHbs2MFrr73Gu+++y1lnnUX58uVzHX/qqacCikxEJLElffJhZh2ADunp6UGHIiIiMfLll1/SrFkzAL777rtcxzQcS0QkepI++dA6HyIiyWfGjBlBhyAikpQ050NERERERGJCyYeIiIiIiMSEkg8REREREYmJpE8+tMigiIiIiEhsJH3yoUUGRURERERiI+mTDxERERERiQ0lHyIiIiIiEhNKPkREREREJCaUfIiIiIiISEwo+RARERERkZhQ8iEiIiIiIjGR9MmH1vkQEREREYmNpE8+tM6HiIiIiEhsJH3yISIiIiIisaHkQ0REREREYkLJh4iIiIiIxISSDxERERERiQklHyIiIiIiEhNKPkREREREJCZKBR1ANJjZSmArkAX87O4XBRuRiIiIiIgkZPIRdq67bw86CBERERERCdGwKxERERERiYmYJh9m1srMJpnZGjNzM+uaT52eZrbCzHab2UIza3kEp3LgAzP7xMyuP+rARURERETkqMV62FUFYCnwanjLxcw6AyOAnsDs8L9vm1kDd18drrOY/ONu5+5rw6/Pd/c1ZlYTmG5mn7n7kohfjYiIiIiIFFpMez7cfYq73+PubxKaDJ5XP2CMu49y9y/dvTewDrg1RxtN3L1RPtvaHHXWhP9dB0wBmkX1wkRERCSpzJo1iyuuuILatWtjZowZM6bAujfffDNmxvDhw7PLVq5ciZnluz366KPZ9bp3785JJ51EamoqaWlpXHnllXz55ZfZx5cuXUrZsmWZMGFCrnNOnz6dlJQU5syZE7mLFomAuJnzYWalgbOAaXkOTQPOLUI75c3smPDrCkBr4PMC6vYwswVmtmDDhg1HFriIiIgkne3bt9OoUSNGjBhBampqgfXefPNN5s+fT61atXKV16lTh3Xr1uXaRo4ciZnRqVOn7HoZGRmMGTOGL7/8kqlTp+LutGnThr179wLQqFEjBg0axC233EJmZiYAW7ZsoVu3bvTv35/zzjsvClcvcuTiJvkAqgIlgcw85ZlAjSK0Ux2YbWb/BT4CXnX3T/Kr6O4vuHuGu2ekpaUdScwiIiKShNq3b8/QoUPp1KkTJUrk/+fUqlWr6NOnD+PGjSMlJSXXsZIlS1KjRo1c28SJE2nTpg0nnHBCdr2bb76Zli1bUr9+fZo1a8bgwYNZu3Yt3333XXadAQMGcMopp9CjRw8AevfuTeXKlXnwwQejcOUiRyfhHrXr7t8BjQtb38w6AB3S09OjF5SIiIgklX379vHb3/6W++67j9NPP/2w9b/77jvee+89xo8fX2CdHTt2MHr0aOrWrUv9+vWzy0uUKMErr7xC48aNuf7663njjTeYP38+pUuXjsSliERUPPV8bAT2E+q5yKk6sD5aJ3X3ye7eo1KlStE6hYiIiCSZgQMHUrVqVW699dbDVwZefPHF7DkdeY0cOZIKFSpQoUIF3n77bd577z3KlCmTq056ejoDBgxg3Lhx3HXXXTRp0iQSlyEScXGTfLj7HmAh0DbPobbA3Gid18w6mNkLW7ZsidYpREREJInMnDmTMWPG8NJLLxWq/r59+xg9ejRdunQ5aHgWwPXXX8+iRYv44IMPOOWUU7j22mvZuXNnrjq7du3i9ddfp1y5csyePRt3j8i1iERarNf5qGBmTcysSfjcdcP7dcNVHge6mtlNZna6mY0AagHPRSsm9XyIiIhIJM2cOZN169ZRs2ZNSpUqRalSpVi1ahV33nknxx9//EH1J0+ezPr167npppvyba9SpUqcfPLJtGrVijfffJNly5Yd9HSrO++8k3379jF//nwWLFjAM888E5VrEzlasZ7zkQHMyLE/KLy9AnR193+Y2XHAfUBNQmuCtHf3VdEKSHM+REREJJJ69uyZ64lVAJdccgm//e1v6d69+0H1R40axQUXXMApp5xy2LbdHXfnl19+yS6bMWMGI0eOZMaMGTRs2JDHHnuMvn370r59e0466aSjvyCRCIpp8uHuMwE7TJ2RwMiYBBQ632RgckZGxsF3AxEREZF8bN++nW+//RaArKwsVq9ezeLFi6lSpQp169alWrVqueqnpKRQo0YNTj311Fzlq1evZurUqbz66kFrL/Ptt98yYcIE2rRpQ1paGj/88APDhg2jTJkyXH755QBs27aNbt260adPH1q2bAmE1gaZMGEC3bp1Y+bMmQU+jUskCPqvUURERKSIFixYQNOmTWnatCm7du1i4MCBNG3alPvvv79I7bz00ktUqlSJjh07HnSsTJkyzJw5k8suu4z09HQ6d+7MMcccw7x586hRI7QKQd++fSlXrhxDhgw5qN3PPvuMESNGHPlFikSBJfuEpBzDrrp/8803MTnnR62KRxdo81nLgw4hruhzK76Kw2enz+1gZrbQ3TMKUTW5f5GJJDC7S4tAR4IPi/l6dgWOdEr6ng9NOBcRERERiY2kTz5ERERERCQ2lHyIiIiIiEhMJH3yoUUGRURERERiI9brfMQdPWpXREQk8WnicmQEMHFZEkzS93yIiIiIiEhsJH3Ph4hIPCgO38rqG08RETlaSZ985FjnI+hQRCJCf8SKiIhIvEr65ENzPgqmP2JFREREJJI050NERERERGJCyYeIiIiIiMSEkg8REREREYkJJR8iIiIiIhITSZ98aIVzERGJJw8//DBnn302FStWJC0tjQ4dOrB06dJcdbZv307v3r05/vjjSU1N5dRTT+WJJ57IVeeFF17goosu4thjj8XMWLlyZa7jS5cupWzZskyYMCFX+fTp00lJSWHOnDlRuT4RSW5Jn3y4+2R371GpUqWgQxEREWHmzJn07NmTuXPn8v7771OqVCnatGnDpk2bsuv069eP//znP4wdO5Yvv/ySe++9l7vuuouxY8dm19m5cyft2rXjgQceyPc8jRo1YtCgQdxyyy1kZmYCsGXLFrp160b//v0577zzonqdIpKckv5RuyIiIvFk6tSpufbHjh1LpUqVmDNnDh06dABg7ty53HDDDVx00UUA1K9fn5deeomPP/6YG264AYC+ffsCsGDBggLPNWDAACZNmkSPHj1466236N27N5UrV+bBBx+MwpWJiKjnQ0REJK5t27aNrKwsKleunF12/vnnM3nyZL7//nsglIwsXryYSy+9tEhtlyhRgldeeYXp06dz/fXX8/e//51XX32V0qVLR/QaREQOUPIhIiISx/r06UOTJk1o0aJFdtlTTz1F48aNqVu3LikpKVxwwQX85S9/4fLLLy9y++np6QwYMIBx48Zx11130aRJkwhGLyKSm4ZdiYiIxKl+/foxe/ZsZs+eTcmSJbPLn376aebOncukSZOoV68es2bN4o477qB+/fpF7v3YtWsXr7/+OuXKlWP27Nm4O2YW6UsREQHU8yEiIhKXbr/9dl5//XXef/99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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.scalers import StandardScaler\n", - "housing_df = pd.read_parquet(sf_crime_file_location)\n", - "columns=[\"X\", \"Y\"]\n", - "sf_crime_df=housing_df[columns]\n", - "objs = [StandardScaler()]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"StandardScaler\")" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "Buffer dtype mismatch, expected 'int64_t' but got 'double'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mhousing_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhousing_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mobjs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mFloatImputer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstrategy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'median'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mbench_scalers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbenchmark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_X\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobjs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhousing_df\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_vec\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mn_vec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mplot_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbench_scalers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0;34m\"FloatImputer\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/gators/util/benchmark.py\u001b[0m in \u001b[0;36mrun_X\u001b[0;34m(objs, X, columns, n_vec, y, timeit_args)\u001b[0m\n\u001b[1;32m 289\u001b[0m bench_dict[1] = generate_per_sample_benchmarking(\n\u001b[1;32m 290\u001b[0m \u001b[0mobjs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextra_info_X_vec\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'_1column'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mys\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mys\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 291\u001b[0;31m timeit_args=timeit_args)\n\u001b[0m\u001b[1;32m 292\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 293\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/gators/util/benchmark.py\u001b[0m in \u001b[0;36mgenerate_per_sample_benchmarking\u001b[0;34m(objs, Xs, extra_info_X_vec, extra_info_O_vec, ys, timeit_args)\u001b[0m\n\u001b[1;32m 96\u001b[0m ] = get_runtime_in_milliseconds(str(dummy))\n\u001b[1;32m 97\u001b[0m dummy = get_ipython().run_line_magic(\n\u001b[0;32m---> 98\u001b[0;31m 'timeit', f'-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())')\n\u001b[0m\u001b[1;32m 99\u001b[0m results.loc[f'{obj.__class__.__name__}{extra_info_O}{extra_info_X}', 'numpy'\n\u001b[1;32m 100\u001b[0m ] = get_runtime_in_milliseconds(str(dummy))\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[1;32m 2324\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2325\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2326\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2327\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2328\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1161\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1162\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1163\u001b[0;31m \u001b[0mtime_number\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1164\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1165\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 169\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 170\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/gators/imputers/float_imputer.py\u001b[0m in \u001b[0;36mtransform_numpy\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatistics_values\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m self.idx_columns)\n\u001b[0m", - "\u001b[0;32m~/anaconda3/envs/gator/lib/python3.6/site-packages/gators/imputers/imputer.pyx\u001b[0m in \u001b[0;36mimputer.__pyx_fuse_1float_imputer\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: Buffer dtype mismatch, expected 'int64_t' but got 'double'" - ] - } - ], - "source": [ - "from gators.imputers import FloatImputer\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "columns = [\"LotFrontage\"]\n", - "housing_df = housing_df[columns]\n", - "objs = [FloatImputer(strategy='median')]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"FloatImputer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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RmO+xF62bBk33XQTHTt25MEHHyQziWiwkaAitaoxH2uxEPgY6F3neG/g9U9aaWZOzsyxXbt2XZfYJEmSVAX69u3Lpz71KZ577jkA7rvvPp5++mk6d+5Mu3btaNeu8N3+qFGj2GuvvVZ57+mnn85HH33E9OnTmTFjBpdffnnJ4y+3NpN8ZOYHFBYN3LfOqX0pzHr1iUTEyIi4asmSJesSniRJkqrAwoULmT9/Pn369AHgwgsvZPbs2cyaNatmA7j44ov53e9+V/O++++/nwkTJjBx4kS23357LrnkEr7//e/zwgsvlOM2yqZVdbuKiM7Ayv5P6wFbRMQgYFFmzgN+BlwfEdOBh4BjKKztceUnvWZmTgYmDxkyZMy6xC5JkqS259133+X5558HYMWKFcybN49Zs2bRvXt3unfvzrnnnsuhhx5Knz59ePHFFznjjDPo1asXX/nKVwDo168f/fqtvqzc5ptvzlZbbQUUBqSPHj2aE044gaFDC0vUjRkzhttuu43Ro0czdepU1luvzbQJrJPIbD2ThETEFykMFq/rt5l5VLHMOOB7FOZYfhI4KTOnreu1HXAuqSErVqxg4cKFLF68mI8//rjc4VSM9ddfn0022YQePXrU+0s3ImZm5pBGVNV6fpFJanOmTp3K3nvvvdrxI488kl/96ld8+ctf5vHHH2fx4sX06dOHvffem/PPP5/NN9+8wTqLs11x2GGFdQa/9a1v8fDDD/PYY4+x0UYb1ZSbP38+O+ywA2effTYnnXRS899c+TQ4kKVVJR/lUGvA+ZiVffckqbZ58+YREfTu3Zv27dtX3eDAlpCZfPjhhyxYsIDMZIstVl8r1uRDktqsBn9RVkf7zho44FzS2rz33nv069ePDTbYwMSjmUQEG2ywAf369eO9994rdziSpBKp+uRDkhqjWvrilpo/V0mqLlX/1He2K0mSJKk0qj75sNuVJDXOgAEDuPfee8sdhtRqTZs2jYMPPph+/foREUycOLHBskcffTQRwcUXX7zauenTp7PvvvvSuXNnNt54Y/bYYw8WLlwIwJNPPslGG23Ebbfdtsp77r33Xtq3b89DDz3UrPckNbdWNdWuJLUVjwzbukXr321adc37LlWCd999lx122IEjjjiCI444osFyt956K9OnT6dv376rnXv00UfZb7/9OO200/j5z3/OBhtswJNPPkn79u0B2GGHHRg/fjzHHHMMe+21F71792bJkiWMHj2aU045hT333LPF7k9qDlWffNSa7arcoUiSpDbswAMP5MADDwTgqKOOqrfMSy+9xAknnMC9997LAQccsNr5k046ie985zuceeaZNcc+85nPrFLmtNNOY9KkSYwdO5Y77riD448/nm7dunHeeec13820EvH9N8sdQkXIH/csdwg17HZltytJbdyAAQP40Y9+xHbbbUe3bt0YPXo0y5cv56233uKggw6iZ8+edOvWjYMOOohXXnml5n1f/OIX+eEPf8iee+7JxhtvzIgRI2q6dgBcf/319O/fn0033ZQLL7xwlWtOnz6d3XffnU022YQ+ffpw3HHH8cEHHwCFaXRPOukkevXqRZcuXdhxxx158sknS/PDkFqxjz76iK997WucddZZbLvttqudf+ONN3j44Yfp06cPe+21F7169WLo0KHcd999q5Rbb731+O1vf8u9997L4Ycfzn/913/xu9/9jg022KBUtyJ9YlWffEhSJbjhhhu4++67eeGFF5gzZw4XXHABK1asYPTo0bz00kvMmzePDh06cNxxx63yvhtvvJHrrruON954gw8++KCm//nTTz/Nsccey/XXX8+rr77KP//5z1USl/XXX5+f//znLFy4kIcffpj77ruPCRMmADBlyhSmTZvGnDlzWLJkCTfffDObbrpp6X4YUit1zjnn0KNHD4499th6z//jH/+oKffNb36Tu+++m6FDh7Lffvvxt7/9bZWyAwcO5LTTTuPGG2/k+9//PoMGDWrp8KVmYfIhSRXguOOOY/PNN6d79+6ceeaZ3HTTTWy66aYceuihdOzYkY033pgzzzyTP//5z6u8b/To0XzmM5+hQ4cOfPWrX2XWrFlAoU/6QQcdxLBhw9hwww05//zzV5kWd9ddd2W33XajXbt2DBgwgKOPPrqm7vbt2/POO+/wzDPPkJlsu+229OnTp2Q/C6k1mjp1KhMnTuQ3v/lNg2VWrFgBFAajf/Ob32Tw4MFcdNFFfO5zn+PKK69cpeyyZcu46aab6NixIw8++CDVvmi02g6TD0mqAJtvvnnN6/79+/Pqq6+ydOlSjj76aPr370+XLl0YNmwYixcv5uOPP64pu9lmm9W87tixI++++y4Ar7766ip1durUaZXWizlz5nDQQQex2Wab0aVLF37wgx/UdNkaPnw4xx13HN/5znfo1asXY8eO5e23326xe5fagqlTp/Laa6/Rp08f2rVrR7t27XjppZc4/fTT+dSnPgVQk6Rvt912q7x3u+22Y968eascO/300/noo4+YPn06M2bM4PLLLy/NjUjrqOqTD9f5kFQJXn755ZrX8+bNo2/fvlxyySU8++yzPProo7z99ttMmzYNoFHfkPbp02eVOpcuXco///nPmv1jjz2WbbbZhueee463336biy66aJV6v/vd7zJz5kyefvpp5syZw09/+tPmuE2pzRo3bhyzZ89m1qxZNVvfvn056aSTasZ0DBgwgL59+/Lss8+u8t45c+bQv3//mv3777+fCRMmMHHiRLbffnsuueQSvv/97/PCC86Sp9av6pMPB5xLqgRXXHEFr7zyCosWLeLCCy9k1KhRvPPOO3To0IFNNtmERYsWMX78+EbXd9hhh/GHP/yBBx98kA8++ICzzz67pksIwDvvvEOXLl3o3LkzzzzzDL/61a9qzv31r3/l0Ucf5cMPP6RTp05stNFGrmTeRM2xXsRVV13F3nvvzSabbEJE8OKLL65y3vUimt+7775bk1isWLGCefPmMWvWLObNm0evXr3YYYcdVtnat2/PZpttxmc/+1kAIoLTTjuNyy67jFtuuYXnn3+eiy66iEceeYSjjz4aKPy/N3r0aE444QSGDh0KwJgxYxg6dCijR49e5f9TqTXyt4EkVYCvf/3rjBgxgq222oqtt96as846ixNPPJFly5bRo0cPdtttN/bff/9G17f99ttzxRVX8PWvf50+ffrQrVu3mq4hABdffDE33ngjG2+8MWPGjGHUqFE1595++23GjBlDt27dambLOu2005r1fivdyvUiLr30Ujp06NBguTWtF7F06VJGjBjBueeeW+97a68XsWDBAgDXi1hHM2bMYPDgwQwePJhly5ZxzjnnMHjwYM4+++xG13HiiSfygx/8gFNOOYWdd96Z22+/nbvuuoudd9655nzHjh1Xm4HuN7/5DU888QSXXnpps96T1NzCAUoFQ4YMyRkzZpQ7DEmt0N///vd6p8VsLQYMGMA111zDPvvsU+5QPpGGfr4RMTMzhzSiior+Rda5c2cuv/zy1daNeOmll9hjjz1q1os47rjjOPXUU1d7/4wZM/jc5z7H3LlzGTBgwCrnVqxYwdChQ+nRowd33HEHRxxxBLNmzWLGjBlO26pWwXU+mkcZ1vmIhk5U/SKDkiS1NWtbL6KxVq4XsfPOO3P44Ydzyy23MH36dBMPSS2m6rtdOeBcktTWrG29iKZwvQhJpVT1LR+ZORmYPGTIkDHljkWSPom6A4lV2VauF7FyTZZ1Vd96EREN9piQpHVS9S0fkiS1JY1ZL6IpXC9CUilVfcuHJEltybhx4zjssMNWObbffvvxta99jTFjmtaIv3K9iPvvv79mvYgTTzyRAw88kK233ro5wy47By43jzIMXFaFMfmQJKmVeffdd3n++ecBVlkvonv37myxxRb06tVrlfJ114sAeP3113n99deZM2cOAE8//TSLFy9miy22oHv37g2uF3HbbbcxevRopk6d6voskpqdTxVJklqZ5lgv4sorr2Tw4MEcfvjhAPzbv/0bgwcPZtKkSYDrRUgqD9f5KHKdD0kNae3rfLR1rvOhUrDbVfModbcrP7fm0ZrW+bDlQ5IkSVJJVP2Yj4gYCYwcOHBguUOR1Ia09LdxDuqUJFWiqm/5yMzJmTm2a9eu5Q5FkiRJqmhVn3xIUls3YMAALr74YnbaaSe6du3KqFGjWL58ORMnTmSvvfZapWxE1MyidNRRRzFu3DgOOOAAOnfuzJ577snrr7/OiSeeSLdu3dhmm214/PHHV7nOj370I7bbbju6devG6NGjWb58OQA77LADkydPrin74Ycf0qNHj1XeL0mSyYckVYCbb76ZP/7xj8ydO5fZs2czceLERr/vggsuYOHChWy44Ybsvvvu7LLLLixcuJDDDjuMk08+eZXyN9xwA3fffTcvvPACc+bM4YILLgDgiCOO4D//8z9ryt1555306dOHwYMHN9s9SpLavqof8yFJleC73/0uffv2BWDkyJHMmjWL3Xbbba3v+8pXvsKuu+5a83rChAkcccQRAIwaNWq11a6PO+44Nt98cwDOPPNMjj/+eC644AL+4z/+g/PPP5+3336bLl26cP311/ONb3yjOW+x1XD2nebhuCapOtnyIUkVYLPNNqt53bFjR959991Gva937941rzt06LDaft16ViYeAP379+fVV18FoG/fvuy5557cdtttLF68mLvuuqtmfQlJklay5UOSKlSnTp1YunRpzf7rr7++znW+/PLLNa/nzZtX09oCcOSRR3LNNdfw0Ucfsfvu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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.imputers import NumericsImputer\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "columns = [\"MasVnrArea\", \"GarageYrBlt\", \"LotFrontage\"]\n", - "housing_df = housing_df[columns]\n", - "objs = [NumericsImputer(strategy='median')]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"NumericsImputer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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hcSlUaNG/Pa3v2XBggU8/fTTPProo9xwww0ATJo0iSlTpvD222+zaNEi/vznP7P11lvn78OQJNVZJh+S1ACceuqpbLPNNrRt25bzzz+fe+65h6233pqjjz6a5s2bs+WWW3L++efzz3/+s8L7hg4dyte//nWaNWvG97//fWbMmAHAfffdx2GHHUafPn1o2rQpl1xySYVlcffee2/22WcfGjduTPfu3TnxxBPL2m7SpAmff/45b775Jikldt55Zzp37py3z0KSVHeZfEhSA7DNNtuUve7WrRtz585l6dKlnHjiiXTr1o1WrVrRp08fPvvsM1atWlVWt1OnTmWvmzdvzpIlSwCYO3duhTZbtGhRoffi7bff5rDDDqNTp060atWKX/7yl2VDtvr27cupp57KKaecQocOHRg+fDiLFy/O2bVLkuqPok8+fM6HpIbggw8+KHs9e/ZsunTpwpVXXslbb73Fs88+y+LFi5kyZQqQmZOxIZ07d67Q5tKlS/nkk0/K9k8++WR22mkn3nnnHRYvXszll19eod2f/exnTJ8+nddff523336b3/zmN7VxmZKkeq7okw8nnEtqCK6//no+/PBDFi5cyGWXXcbgwYP5/PPPadasGVtttRULFy7k4osvrnZ7xxxzDH/729+YOnUqK1as4MILL2T16tVl5Z9//jmtWrWiZcuWvPnmm/z+978vK3v++ed59tlnWblyJS1atGCLLbbwSeaSJMDkQ5IahGOPPZYBAwaw/fbbs8MOO3DBBRdw+umns2zZMtq1a8c+++zDIYccUu32dt11V66//nqOPfZYOnfuTJs2bfja175WVj5mzBjuvvtuttxyS4YNG8bgwYPLyhYvXsywYcNo06ZN2WpZv/jFL2r1eiVJ9VNUp/u9GJSUlKQXXnih0GFIqoPeeOMNdt5550KHsU7du3fnlltuoV+/foUOZaOs6/ONiOkppZJqNOEvMqmB8jkftaMAz/mIdRXY8yFJkiQpL4o++XDCuSRJkpQfjQsdQKGllCYAE0pKSoYVOhZJ2hizZs0qdAiSJFVL0fd8SJIkScoPkw9JkiRJeWHyIUmSJCkvTD4kSZIk5YXJhyRJkqS8MPmQJEmSlBdFv9RuRAwCBvXo0aPQoUiqR3L91N0CPI1WkqScK/qej5TShJTS8NatWxc6FEmSJKlBK/rkQ5Lqu+7duzNmzBj22GMPWrduzeDBg1m+fDljx45l//33r1A3Inj33XcBGDJkCCNGjODQQw+lZcuW7LfffsybN4/TTz+dNm3asNNOO/HSSy9VOM8VV1zBLrvsQps2bRg6dCjLly8HYLfddmPChAlldVeuXEm7du0qvF+SJJMPSWoA/vznP/OPf/yDmTNn8vLLLzN27Nhqv+/SSy9lwYIFNG3alN69e7PXXnuxYMECjjnmGM4888wK9e+66y4efvhh3nvvPd5++20uvfRSAH784x/zxz/+sazexIkT6dy5M7169aq1a5Qk1X8mH5LUAPzsZz+jS5cutG3blkGDBjFjxoxqve/II49k7733ZosttuDII49kiy224Mc//jGNGjVi8ODBa/VcnHrqqWyzzTa0bduW888/n3vuuQeAH/3oR0ycOJHFixcDMG7cOI477rhavUZJUv1n8iFJDUCnTp3KXjdv3pwlS5ZU630dO3Yse92sWbO19iu3s80225S97tatG3PnzgWgS5cu7Lffftx///189tlnPPTQQ/zwhz/cqGuRJDVcRb/alSQ1VC1atGDp0qVl+/PmzdvkNj/44IOy17Nnz6ZLly5l+8cffzy33HILX331Fb1796Zr166bfD5JUsNiz4ckNVB77rknr732GjNmzGD58uVcdNFFm9zm9ddfz4cffsjChQu57LLLGDx4cFnZf/3Xf/Hiiy9yzTXX8OMf/3iTzyVJangabPIREX+JiE8j4r5CxyJJhfD1r3+dCy+8kH79+rHjjjuutfLVxjj22GMZMGAA22+/PTvssAMXXHBBWVmzZs04+uijmTlzJkcdddQmn0uS1PBESqnQMeRERBwIbAkcn1I6ZkP1S0pK0gsvvJDrsCTVQ2+88QY777xzocMouO7du3PLLbfQr1+/ddb51a9+xdtvv11h5asNWdfnGxHTU0ol1WiiYf4ik5TzB7oWiwI8uDbWVdBgez5SSk8Anxc6DkkqFgsXLuTWW29l+PDhhQ5FklRH5T35iIg+ETE+IuZERIqIIVXUGRERMyNieURMj4gD8h2nJKn6br75ZrbZZhsOPfRQ+vTpU+hwJEl1VCFWu2oJvArcmd0qiIjBwDXACGBq9udDEbFLSml2ts4Mqo59QEppbo7ilqSiNmvWrHWWDRs2jGHDhuUvGElSvZT35COlNBGYCBARY6uociYwNqV0c3b/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EYOBa4DLgV7AU8BDEbFtuTozIuLVKrYua+qklD5LKe0JbAccGxH19gnskqTa9/3vf58JEyYAsGDBAvr06cNf/vIXTjrpJK688soCRydJDVdNhl1dDEyMiJfIJBAryxemlH6yoQZSShPJPCuEiBhbRZUzgbHlJoifFhGHACcD52Xb6FndgFNKpdkekAOA+6r7PklSw/byyy+zzz77AHDffffRo0cPnn/+eR588EF+8Ytf8POf/7zAEUpSw1STno/LgAHAV0AboH2lbZNExObA3sCkSkWTgH1r0E7HiNgy+7o10Ad4ax11h0fECxHxQvnud0lSw7Zs2TJatmwJwOTJkzn88MMB2Guvvfjggw8KGZokNWg1ST5GAMemlL6ZUjospTSo/FYLsbQDGpFZSau8UqBTDdrpBjyZ7fF4Erg2pfRKVRVTSjellEpSSiXt229y/iRJqid23HFHHnjgAT744AMmTZrEgAEDACgtLWWrrbYqbHCS1IDVJPlYBryUq0BqS0rpuZRSz5TSnimlPTa0OldEDIqImxYtWpSvECVJBTZq1CjOOeccunfvzj777MO3v/1tAB5++GF69epV4OgkqeGqSfLxW+D0iMjVsrULgFVA5cnhHYF5OTonKaUJKaXhrVu3ztUpJEl1zFFHHcXs2bN54YUX+Mc//lF2vF+/flx11VUFjEySGraaTDg/gMz8ie9FxOusPeH88E0JJKW0IiKmA/2Be8sV9Qfu35S21yciBgGDevTokatTSJLqoI4dO9KxY8W/d63pAZEk5UZNko8FwAObcrKIaAms+Vf+ZsC2EdETWJhSmg1cBYyLiOeAacBJQBfgxk057/qklCYAE0pKSobl6hySJEmSapB8pJQ29RkfACXA4+X2L85udwBDUkr/FxFbAxcAncks6TswpfR+LZy7znimzw6FDqFa9pnyXqFDkCRJUgNSk56PTZZSegJY75yRlNINwA15CQiHXUmSJEn5st7kIyJeBr6TUvo0Il4B0rrqppT2qO3g8sFhV5IkSVJ+bKjn437gy3Kv15l8SJJUn5SWljJu3Djee+89LrnkEtq1a8e0adPo0qUL2223XaHDk6QGab3JR0rp4nKvL8p5NAXgsCtJKj7Tp0/nu9/9Lttttx2vvfYav/jFL2jXrh2PPPIIb7/9NnfffXehQ5SkBqnaz/mIiMciYqsqjreK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bp2rU0iSJEki/8OuSoDHy+1fnN3uAIaklP4vIrYGLiDzkMFXgYEppffzHKckqQG76qqr1lvucz4kKTfy/ZyPJ4DYQJ0bgBvyEhBOOJekYnTttddW2F+5ciUfffQRzZo1o0OHDiYfkpQjdWnCeUE44VySis/MmTPXOlZaWsrQoUMZNsxfB5KUK3VmwrkkSYXUsWNHLrvsMs4+++xChyJJDVbRJx+udiVJWmP16tWUllZ+1q0kqbY47MphV5JUdB544IEK+yklPvroI66//noOOOCAAkUlSQ1f0ScfkqTic8wxx1TYjwjat29P3759ufLKKwsUlSQ1fCYfkqSis3r16kKHIElFyTkfzvmQpKKycuVKvv3tb/PWW28VOhRJKjpFn3z4hHNJKi5NmjRh5syZRKz3sVOSpBwo+uRDklR8jj/+eG6++eZChyFJRcc5H5KkovPFF19w11138cgjj7D33nvTokWLCuW/+93vChSZJDVsRZ98RMQgYFCPHj0KHYokKU/eeOMN9tprLwD+/e9/VyhzOJYk5U7RJx8+50OSis/jjz9e6BAkqSg550OSJElSXph8SJIkScoLkw9JkqQamjJlCocffjhdu3YlIhg7dmyF8iFDhhARFbZ99tmnyrZSShx66KFEBPfdd1+FshdffJH+/fuz1VZbsfXWWzN8+HCWLFlSVj5p0iSaNGnCs88+W+F9t9xyCy1btuS9996rnQuWaknRJx8+ZFCSJNXUkiVL2G233bjmmmto1qxZlXX69evHRx99VLZNnDixynpXXnklm2229j/J5s6dS79+/dh+++159tln+cc//sFrr73GkCFDyuoMGDCAE044geOPP55ly5YBMGvWLM4880zGjBnDDjvssOkXK9UiJ5w74VySJNXQwIEDGThwIECFZKC8pk2b0qlTp/W28/zzz3PNNdcwffp0OnbsWKHsb3/7G5ttthk33HADjRo1AuDGG29kjz324N1332XNSp1jxoxhzz335Nxzz+Xqq69myJAh7Lvvvpx00kmbeJVS7Sv65EOSJCkXpk6dSocOHdhqq634zne+w2WXXUaHDh3Kyj///HOOPfZYbrrppgrH1/jyyy9p0qRJWeIBlPWyTJ06tSz5aNGiBWPHjuXAAw9k/vz5/Otf/+LVV1/N8dVJG6foh11JkiTVtkMOOYQ777yTRx99lCuvvJLn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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.imputers import ObjectImputer\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "columns = [\"MasVnrType\", \"BsmtFinType2\", \"FireplaceQu\"]\n", - "housing_df = housing_df[columns]\n", - "objs = [ObjectImputer(strategy='most_frequent')]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"ObjectImputer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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4a9//Su77LLLWu3uvPNOvvzySwYPHrzOvr788ktOP/10BgwYwNe/nlnSMX/+fJo0aUJJSUmltp07d2b+/PmVyvbdd1+OPfZYbrvtNm655Ra6di38pcoNbc3HRkspTUgpfSOl1DObXKxXRAyIiBsXLVqUi/AkSZKUR9tvvz3Tp0/nueee46STTmLw4MFrRhwquemmmzjiiCPo2LH6AdiVK1dy7LHH8umnnzJ27NivFEtZWRn//Oc/adWqFZMnT/5KfTQ2jSn5WACsAjpXKe8MzF+7ec2klCamlIa3a9duY2KTJElSI9C8eXN69uxJr169uOyyy9h999359a9/XanN9OnTmTp1KsOGDau2j5UrV/Lf//3fzJgxg0ceeYQOHTqU13Xp0oVVq1axYMGCSu8pKyujS5culcqGDx/Odtttx8MPP8wf//hHJk6cWEefsuFqNMlHSulLMg8NPLhK1cFkdr36Shz5kCRJKl6rV6/miy++qFR24403svXWW9O3b9+12q9YsYJBgwYxY8YMHnvssbUSil69etGsWTMeeuih8rL333+f119/nb333ru8bNy4cTz88MPcdttt9O7dm7POOosTTzyRhQsX1vEnbFgaVPIREW0iYveI2J1MbFtlz9dspXs1MCS7B/IOEXEtmWd7/H4dXW6QIx+SJEnF4eyzz+bJJ59k1qxZvPzyy5xzzjk8/vjjHHPMMeVtli5dyh133MFPfvITIiqvm165ciX/7//9P5599lnuuusuIoL58+czf/58li3LPCWiXbt2/OQnP+EXv/gFDz/8MC+99BLHHXccu+66a3ky895773HKKadw+eWXs9122wEwatQoSkpKGDlyZI5+GvnR0Bacl5JZLL7G6OxxGzAkpfTniOgAnEdm7+VXgP4pJRclSqo3q1evZsGCBXz66aesWrUq3+EUjCZNmrDZZptRUlLCJps0qL+FSSpQ8+fP59hjj2X+/Pm0a9eOXXfdlQceeIBDDjmkvM2f//xnPv/8c4YOHbrW+99//33+/ve/A5kRjorGjh3LkCFDALjmmmto2rQpgwYNYtmyZRx00EHcfvvtNGnShJQSP/7xjyktLeXkk08uf3/z5s25/fbb+da3vsXAgQM58sgj6+EnkH8N9jkfuRIRA4ABPXv2HPbWW2/lOxxJDdCcOXOICDp37kyzZs3W+kuYai+lxIoVKygrKyOlxFZbrf2s2IiYllIqrUl3dR+hJGkjrPMXZdH/qclpV5I25PPPP6dr1640b97cxKOORATNmzena9eufP755/kOR5KUI0WffEhSTTgtqH74c5Wk4lL0d313u5IkSZJyo+iTD6ddSVLN9OjRg4cffjjfYUiSGrGGttuVJDUKz/bZtl7732vyO/XavyRJ+VD0yUeF3a7yHYokSZIqiLM/yncIBSFd3jHfIZRz2pXTriQ1cj169OCyyy5jxx13ZPPNN2fo0KEsX76cTz75hMMOO4yOHTuy+eabc9hhh/H++++Xv2///ffnV7/6Ffvssw9f+9rX6NevHwsWLCivHz9+PN27d6dDhw5ccsklla75/PPP07t3bzbbbDO22GILTj75ZL788ksgs43uz3/+czp16kTbtm3ZZZddeOWVV3Lzw5AkNWhFn3xIUiG44447ePDBB3nnnXd48803ufjii1m9ejVDhw5l9uzZzJkzh5YtW1Z6oBXAnXfeydixY/nwww/58ssvGTNmDACvvfYaJ510EuPHj2fevHl8/PHHlRKXJk2a8Otf/5oFCxbwzDPP8Mgjj3DDDTcAMGnSJCZPnsybb77JokWL+Mtf/kKHDh1y98OQJDVYJh+SVABOPvlkunXrRvv27Tn33HO566676NChA0cffTStWrXia1/7Gueeey5PPPFEpfcNHTqUb3zjG7Rs2ZIf/OAHTJ8+HYB77rmHww47jD59+tCiRQsuuuiiStvi9urVi7322oumTZvSo0cPTjzxxPK+mzVrxmeffcYbb7xBSokddtiBLbbYImc/C0lSw2XyIUkFoFu3buWvu3fvzrx581i6dCknnngi3bt3p23btvTp04dPP/2UVatWlbft0qVL+etWrVqxZMkSAObNm1epz9atW1cavXjzzTc57LDD6NKlC23btuWXv/xl+ZStAw88kJNPPpmf/vSndOrUieHDh7N48eJ6++ySpMaj6JMPn/MhqRC899575a/nzJnDlltuyVVXXcW///1vnnvuORYvXszkyZOBzJqMDdliiy0q9bl06VI+/vjj8vOTTjqJb37zm7z11lssXryYSy+9tFK/P/vZz5g2bRqvvfYab775JldeeWVdfExJUiNX9MmHC84lFYLrr7+e999/n4ULF3LJJZcwaNAgPvvsM1q2bMlmm23GwoULGT16dI37GzhwIP/4xz946qmn+PLLLzn//PNZvXp1ef1nn31G27ZtadOmDW+88Qa/+93vyuteeOEFnnvuOVasWEHr1q3ZdNNNfZK5JAkw+ZCkgvCjH/2Ifv36sc0227Dtttty3nnnceqpp7Js2TJKSkrYa6+9OPTQQ2vc30477cT111/Pj370I7bYYgs233xzvv71r5fXjxkzhjvvvJOvfe1rDBs2jEGDBpXXLV68mGHDhrH55puX75Z15pln1unnlSQ1TlGT4fdiUFpamqZOnZrvMCQ1QK+//jo77LBDvsNYpx49enDzzTfTt2/ffIfylazr5xsR01JKpTXowl9kUoHyOR91Iw/P+Yh1VTjyIUmSJCknij75cMG5JEmSlBtN8x1AvqWUJgITS0tLh+U7Fkn6KmbNmpXvECRJqpGiH/mQJEmSlBsmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ4p+q92IGAAM6NmzZ75DkdSI1PdTd/PwNFpJkupd0Y98pJQmppSGt2vXLt+hSJIkSQWt6JMPSWrsevTowZgxY9h1111p164dgwYNYvny5YwbN4599923UtuI4O233wZgyJAhjBgxgu9+97u0adOGffbZh/nz53Pqqaey+eab881vfpOXXnqp0nUuu+wydtxxRzbffHOGDh3K8uXLAdh5552ZOHFiedsVK1ZQUlJS6f2SJJl8SFIB+Mtf/sK//vUvZs6cyYwZMxg3blyN33fxxRezYMECWrRoQe/evdlzzz1ZsGABAwcO5LTTTqvU/o477uDBBx/knXfe4c033+Tiiy8G4Pjjj+ePf/xjebv777+fLbbYgj322KPOPqMkqfEz+ZCkAvCzn/2MLbfckvbt2zNgwACmT59eo/cdeeSR9OrVi0033ZQjjzySTTfdlOOPP54mTZowaNCgtUYuTj75ZLp160b79u0599xzueuuuwA49thjuf/++1m8eDEA48eP57jjjqvTzyhJavxMPiSpAHTp0qX8datWrViyZEmN3te5c+fy1y1btlzrvGo/3bp1K3/dvXt35s2bB8CWW27JPvvsw7333sunn37KAw88wDHHHPOVPoskqXAV/W5XklSoWrduzdKlS8vP58+fv9F9vvfee+Wv58yZw5Zbbll+PnjwYG6++WZWrlxJ79696dq160ZfT5JUWBz5kKQCtdtuu/Hq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zMHnkSQ1QnfccQfbbrstw4YN45prruG6664rP37729/mOzw1ApMnT+bwww+na9euRATjxo2rVH/fffdxyCGH0LFjRyKCxx9/fK0+vvjiC0aOHElJSQmtW7fm8MMP5/3336/UZs6cOQwYMIDWrVtTUlLCz372s0o7tZ177rl069aNRYsWVXrfsccey2677Vbtrm5SPuU0+Ugp3Z9S+mVK6R6gujHv04BxKaWbUkqvp5RGAh8AJ1XoY/eU0s7VHPOyTfYCfhgRs8iMgAyLiPPr95NJkhqT888/n9NPP53Fixcza9YsZs6cWX68++67+Q5PjcCSJUvYeeedufbaa2nZsuVa9Z9//jl77703V1999Tr7OPXUU7n33nu56667ePLJJ1m8eDGHHXYYq1atAjI7sH3ve9/js88+48knn+Suu+7innvu4fTTTy/vY9SoUbRv356RI0eWl917773cfffd3H777TRv3rwOP7W08RrMmo+IaE5mOtaYKlWTqMX0qZTSOcA52T6HADunlC5cxzWHA8MBttpqq+qaSJIKUFlZGSeccIKLy/WV9e/fn/79+wMwZMiQteqPO+44ABYsWFDt+xctWsQtt9zC2LFjOfjggwEYP3483bt35+GHH+aQQw5h0qRJvPrqq8yePZtu3boBcMUVV3DCCSdwySWX0LZtW5o3b87tt9/Ot771LY488kj23ntv/ud//ocLLriA3XbbrR4+ubRxcj3tan1KgCZAWZXyMqBLfVwwpXRjSqk0pVRacccTSVJh69+/P88991y+w1ARmzZtGitWrKi05XO3bt3YYYcdePrppwF45pln2GGHHcoTD4BDDjmEL774gmnTppWX7bbbbowaNYoTTzyR4447jp49e/KLX/widx9GqoUGM/JRH6ouZq9ORAwABvTs2bP+A5IkNQgHH3wwZ511Fq+++iq77LILzZo1q1R/1FFH5SkyFYv58+fTpEkTSkpKKpV37tyZ+fPnl7fp3LlzpfqSkhKaNGlS3maNs846i1tvvZVHH32U1157zVE9NVgNKflYAKwCOlcp7wzMX7t53UgpTQQmlpaWDquva0iSGpYTTzwRgEsvvXStuogon3MvNRaPPfYYs2fPpmnTpjz99NN84xvfyHdIUrUazLSrlNKXwDTg4CpVB5PZ9apeRMSAiLix6i4RkqTCtXr16nUeJh7KhS5durBq1aq11oSUlZXRpUuX8jZlZZVnoy9YsIBVq1aVt4HM+pEf//jHnHbaaVx66aWceuqpa+2aJTUUOU0+IqJNROweEbtnr71V9nzNau+rgSERcUJE7BAR15J5Hsjv6yumlNLElNLwdu3a1dclJEmSKunVqxfNmjXjoYceKi97//33ef3119l778w+O7179+b111+vlEg89NBDtGjRgl69epWXnXLKKbRr144LL7yQU089lV122YUTTjghdx9GqoVcT7sqBR6rcD46e9wGDEkp/TkiOgDnkXnI4CtA/5TS7BzHKUkqYOvb/hR8yKA2bMmSJbz99ttAZiRtzpw5TJ8+nfbt27PVVluxcOFC5syZw6effgrA22+/zWabbUaXLl3o0qUL7dq14yc/+Qm/+MUv6NSpEx06dOC0005j1113pW/fvgD069ePnXbaieOPP56rrrqKjz/+mDPPPJNhw4bRtm1bAP7+979z55138uyzz9KiRQsAxo0bx2677cZNN93EsGHOKlfDEimlfMeQVxUWnA976623cnLNZ/tsm5PrbKy9Jr+T7xAaFL+3xqsxfHd+b2uLiGkppdIaNK31L7Ktt9660vmKFSv44IMPaNmyJZ06dfJZH9qgxx9/nAMOOGCt8sGDBzNu3DjGjRvH0KFD16ofNWoUF1xwAZB5yOAZZ5zBnXfeybJlyzjooIO44YYbKu1uNWfOHEaMGMGjjz5Ky5YtOeaYY7jyyitp0aIFCxYsYOedd+akk05i1KhRla5z/fXXc8455/Dyyy/TvXv3uv3wORRnf5TvEApCujznu7rGOiuKPflYo7S0NE2dOjUn12oM/yEE/sdQVX5vjVdj+O783tZWn8lHdcrKyhg6dCjDhg3jyCOPrIsuJW0kk4+60ZCSjwaz4FySpHzq3Lkzl1xyic9HkKR6VPTJh7tdSZLWWL169Vq7C0mS6k5Des5HXvicD0kqPvfdd1+l85QSH3zwAddffz377bdfnqKSpMJX9MmHJKn4DBw4sNJ5RNCxY0cOPPBArrrqqjxFJUmFz+RDklR0Vq9ene8QJKkoFX3yUWGr3XyHIknKgRUrVrDvvvty++23s/322+c7HOWIuybVjTzsmqQCU/QLzn3CuSQVl2bNmjFz5kwi1rkTpCSpnhR98iFJKj6DBw/mpptuyncYklR0in7alSSp+Hz++efccccdPPTQQ/Tq1YvWrVtXqv/Nb36Tp8gkqbAVffLhmg9JKj6vv/46e+65JwDvvvtupTqnY0lS/Sn65MPnfEhS8XnsscfyHYIkFSXXfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ4o++YiIARFx46JFi/IdiiRJklTQij758CGDkiRJUm4UffIhSZIkKTdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSTjTNdwD5FhEDgAE9e/bMdyiSilic/VG+Q9igdHnHfIcgSWrkin7kw+d8SJIkSblR9MmHJEmSpNww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkScoJkw9JkiRJOVGQz/mIiFnAYmA18ElK6YD8RiRJkiSpIJOPrL1TSkvyHYQkSZKkDKddSZIkScqJnCYfEdEnIiZExNyISBExpJo2IyJiZkQsj4hpEbHfV7hUAp6IiBci4piNDlySJEnSRsv1tKs2wCvA7dmjkogYBFwLjACeyv77QETsmFKak20znerj7pdSmpd9vW9KaW5EbAE8HBEvp5Rm1PmnkSRJklRjOU0+Ukr3A/cDRMS4apqcBoxLKd2UPR8ZEYcCJwHnZPvYvQbXmZv994OIuB/YEzD5kCRJkvKowaz5iIjmQC9gUpWqScDeteindUR8Lfu6DXAg8Oo62g6PiKkRMfWjjz76aoFLkiRJqpEGk3wAJUAToKxKeRnQpRb9dAaeioj/A54Fbk8pvVBdw5TSjSml0pRSaceOHb9KzJIkSZJqqOC22k0pvQvsVtP2ETEAGNCzZ8/6C0qSJElSgxr5WACsIjNyUVFnYH59XTSlNDGlNLxdu3b1dQlJkiRJNKDkI6X0JTANOLhK1cHA0/V13YgYEBE3Llq0qL4uIUmSJIkcT7vKLgBfM79pE2CriNgdWJjdSvdqYHxEPA9MAf4H2BL4fX3FlFKaCEwsLS0dVl/XkHIpzm74myeky11jJUlSMcr1yEcp8FL2aAmMzr6+ECCl9GfgVOA8YDqwL9A/pTS7vgJy5EOSJEnKjZwmHymlx1NKUc0xpEKbG1JKPVJKLVJKvVJKk+s5Jtd8SJIkSTnQYNZ8SJIkSSpsBbfVbm251e66uXZAkiRJdanoRz6cdiVJkiTlRtEnH5IkSZJyw+RDkiRJUk4UffLhVruSJElSbhR98uGaD0mSJCk3ij75kCSpoZk8eTKHH344Xbt2JSIYN25cpfolS5YwcuRIvv71r9OyZUu23357fv3rX5fXz5o1i4io9rjyyisBmD9/PiUlJVx11VWV+n711VfZdNNN+dOf/lTvn1NS8TH5kCSpgVmyZAk777wz1157LS1btlyr/rTTTuOf//wn48eP5/XXX+fcc8/l7LPPZvz48QB069aNDz74oNJxww03EBEMHDgQgC5dunD99ddz3nnn8dprrwGwYsUKjj/+eL7//e/zwx/+MHcfWFLR8DkfPudDktTA9O/fn/79+wMwZMiQteqffvppjjvuOA444AAAevTowS233MJzzz3HcccdR5MmTejSpUul99x333307duXrbfeurxs0KBB/PWvf+X444/n2Wef5aKLLuKDDz7goYceqr8PJ6moFf3Ih2s+JEmNzb777svEiRN57733gEwyMn36dA499NBq27/77rs88sgjDB8+fK26G264gblz53LMMcdw2WWXcfPNN9O+fft6jV9S8Sr6kQ9Jkhqb3/zmN5x44olstdVWNG2a+VV+3XXXcdhhh1Xb/uabb6Zjx44cccQRa9W1b9+eyy67jKFDh3LccceVj7hIUn0w+ZAkqZG57rrrePrpp5kwYQLdu3dn8uTJnHHGGfTo0WOt0Y+VK1cyduxYBg8eTLNmzdbqa/Xq1YwdO5ZWrVrxwgsvsHz5cjbddNNcfRRJRabop11JktSYLFu2jHPOOYcrrriCAQMGsOuuu3LyySfzwx/+kDFjxqzVfuLEicyfP58TTjih2v6uueYaXn75ZV544QWWLFnCueeeW98fQVIRM/mQJKkRWbFiBStWrKBJkyaVyps0acLq1avXan/TTTfxne98h2984xtr1a3ZKeu6665jxx135JZbbuHaa69lypQp9Ra/pOJW9NOu3O1KktTQLFmyhLfffhvITIuaM2cO06dPp3379my11VZ85zvf4eyzz6ZNmzZ0796dJ554gttvv50rrriiUj9z5szhwQcf5Pbbb1/rGitXrmTw4MF873vf45hjjgGgX79+nHDCCQwdOpTp06fTqlWr+v+wkopK0Y98uNuVJKmhmTp1KnvssQd77LEHy5YtY9SoUeyxxx6cf/75APzpT3/iv/7rvzjmmGPYcccdufzyy7nooos4+eSTK/Vzyy230K5dO44++ui1rnHZZZcxe/Zsfve731UqHzNmDCtXruScc86pvw8oqWgV/ciHJEkNzf77709KaZ31Xbp0YezYsRvsZ/To0YwePbraul/96lf86le/Wqu8TZs2vPvuuzUPVpJqoehHPiRJkiTlhsmHJEmSpJww+ZAkSZKUEyYfkiRJknKi6JOPiBgQETcuWrQo36FIkiRJBa3od7tKKU0EJpaWlg7LdyySpIYvzv4o3yEUhHR5x3yHICkPin7kQ5IkSVJumHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJwoyOQjIraOiMci4rWIeDkiWuc7JkmSJKnYFepzPsYB56WUnoyI9sAXeY5HkiRJKnoFl3xExE7AipTSkwAppYV5DkmSJEkSOZ52FRF9ImJCRMyNiBQRQ6ppMyIiZkbE8oiYFhH71fIy2wFLImJiRLwYEb+sk+AlSZIkbZRcj3y0AV4Bbs8elUTEIOBaYATwVPbfByJix5TSnGyb6VQfd7+U0rxs3X7A7sCHwL8i4oWU0kN1/mkkSZIk1VhOk4+U0v3A/QARMa6aJqcB41JKN2XPR0bEocBJwDnZPnbfwGXmAlNTSu9lr3M/mUTE5EOSJEnKo0gp5efCEUuAk1NK47LnzYGlwH+nlO6u0O56YOeU0ndq2G9T4AXgQGAR8HfgDymlf1TTdjgwPHu6PfDvr/yBClMJsCDfQajW/N4aJ7+3tXVPKXXMdxCNUUQMTyndmO84VDt+b42T31vtNKQF5yVAE6CsSnkZ0LemnaSUVmbXeUwGAphUXeKRbXsj4P9Y1iEipqaUSvMdh2rH761x8ntTHRuOv98aI7+3xsnvrRYaUvJRZ1JKDwAP5DsOSZIkSf/RkB4yuABYBXSuUt4ZmJ/7cCRJkiTVpQaTfKSUvgSmAQdXqToYeDr3EQmHEBsrv7fGye9Ndcn/PTVOfm+Nk99bLeR0wXlEtAF6Zk+fBi4HJgALU0pzslvtjiezxe4U4H+AnwA7pZRm5yxQSZIkSXUu18nH/sBj1VTdllIakm0zAvgFsAWZZ4L8PKU0OUchSpIkSaonedtqV5IkSVJxaTBrPtQwRESfiJgQEXMjIkXEkHzHpMo29B1FxgURMS8ilkXE4xGxU57CLVp18T1FxOYRMT4iFmWP8RGxWS4/hxoP79+Ng/fwxsF7eP0x+VBVbchMdzsFWJbnWFS9DX1HvwBOB0YC/wV8CDwUEV/LWYSCuvme7gT2BA7NHnuSWRcnVcf7d+PgPbxx8B5eT5x2pXWq+hR6NTxVv6OICGAe8NuU0iXZspZkbopnpJT+kK9Yi9lX+Z4iYgfgNWDflNKUbJt9gSeBb6aU/p37T6LGwvt34+A9vHHwHl63HPmQCsvWQBdg0pqClNIyYDKwd76C0lpq8j31BpZQeavxKcDn+F1Khcp7eOPgPXwjmHxIhaVL9t+yKuVlFeqUfzX5nroAH6UKw9PZ1x/idykVKu/hjYP38I1g8iFJkiQpJ0w+pMIyP/tv5yrlnSvUKf9q8j3NBzpm5xYD5fOMO+F3KRUq7+GNg/fwjWDyIRWWmWRuagevKYiITYH9qDzvVPlVk+/pGTK7rfSu8L7eQGv8LqVC5T28cfAevhGa5jsANSwR0QbomT3dBNgqInYHFqaU5uQtMJXb0HcUEdcAv4yIN4A3gfPILHq7Mw/hFq2N/Z5SSq9HxL+AP0TE8Gw/fwD+Ucy7pGjdvH83Dt7DGwfv4fXHrXZVSUTsDzxWTdVtKaUhOQ1G1drQd5Qd1h0FnAhsDjwH/DSl9ErOglSdfE8RsTlwHXB4tmgCme0eP62/yNVYef9uHLyHNw7ew+uPyYckSZKknHDNhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iHlUUR0iYhJEfF5RNTLvtcRsX9EpIgoqY/+JalYeQ+Xas/kQ6qBiOgYEV9GROuIaJb9RbNVHXR9BrAlsDuwRR30J0mqwnu41HA0zXcAUiPRG/i/lNLnEfFtYGFKaU4d9NsTmJZSeqsO+pIkVc97uNRAOPIh1czewJTs630rvF6viDgxIt7O/sXt7YgYVqFuFnAEcHx2SH3cevrpHxHPRcSyiPg4IiZGxKbZus0j4raI+CRb/3BE7LSevoZExJIqZZWG9de0iYjvRsQbEbE0IiZERLuIGBgRb0XEoogYHxEtK/TzeETcEBGXRsSCiPgwIsZExCYV2hwVETOysS6MiCcionNNfp6S9BV5D/cergbCkQ9pHbJD8jOyp62AVRExBGgJpIj4FLgzpTRiHe8/Evgt8HNgEnAIcENEzE8pTQT+C7gTWAicAixbRz+HAhOAy4GhZP5/24///PFgHLA9mV+CnwCXAP+KiG+klKrts4ZaAKcDxwDNgXuzxzLgaKADcB8wAriqwvuOAa4l88t+9+xnnAbcFRFdgD8B52T7agPstRExSlK1vId7D1cDlVLy8PCo5iDzC6IHsCvwZfbfbYHPgD7ZupL1vH8KcGuVsnHAUxXO/wGM20AcU4A/raNuOyABfSqUtQMWASdkz/fPtinJng8BllTpp7o2Cdi+QpsxwKqKnzn7ef5R4fxx4JkqfT8E3Jx9vWe23+75/n49PDwK+/Ae7j3co2EeTruS1iGltDKlNAv4JvBCSmkG0AUoSylNTinNSiktWE8XO7D20P5TwI61DGUP4JH1XGM18EyFuBcBL3+F61T1RUrp3xXOy4D5VT5zGdCpyvtmVDmfV6HN/wEPA69ExL0RcVJEdNzIOCVpLd7DvYerYXLalbQOEfEq0B1oBmySnWPbFGiafT07pbTOebnrUS/bMdbiOquBqFLWrJp2K6vpb0U1ZVX/iLHONimlVRHRj8wwfT/gJ8BlEfGdlNL/rSNeSao17+Hew9UwOfIhrVt/MvNd5wPHZl+/Apyafd1/A+9/HdinStm+wGu1jOMl4KD1XGMTMju5ABARbYFd1nOdj4BW2XZr7F7LmL6ylPFMSmk0mTnT84BBubq+pKLhPbweeA/XxnLkQ1qHlNLs7OK6zsDfyfz1Zyfg3pTSBzXo4krg7oiYRmax4qFkFvIdVctQLgEmRsTbZBb+BZm/OP0hpfRWRPwd+ENEDAc+zbZfnG1bneeAz8n8terXwG5kFhzWu4jYC+gLPEhmuH8PoBu1/2UuSevlPbzueQ9XXXDkQ1q//cnMFV4OfAt4v4a/tEgp/Q0YSWanlNfI7IYyImV2SamxlNL9wJHAd8n8Be0J4AAyQ++Q2T3leTK7qTxPZleXQ9M6dklJKS0k8wv0YDLziocDv6pNTBthEZm/JP4DeIvMDisXpZT+mKPrSyou++M9vC55D9dGi5RyNXVRkiRJUjFz5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk78f74Aq+7yu1kzAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# IMPUTERS \n", - "from gators.encoders import OrdinalEncoder\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Category\"]\n", - "sf_crime_df = sf_crime_df[columns]\n", - "objs = [OrdinalEncoder()]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OrdinalEncoder\")" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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mXjUsIigbdu2tiZJkiQVmIJPPqrCxKPm+ZlKkiQVnoJPPpztSpIkScqNgk8+XOdj3bp3787kyZPzHYYkSZLqubo221W98Ey/rWq1/t2nzanV+iVJkqR8KPjko8xsV/kORZIkSWXE2fPzHUKDkC5rl+8QStntqh53u+revTuXXnop2223Ha1bt2bo0KEsW7aMzz//nIMPPph27drRunVrDj74YD788MPS9+2zzz786le/Ys8992TjjTdmwIABLFiwoPT8+PHj6datG23btmXMmDHlrvncc8/Rp08fNt10Uzp16sRJJ53EN998A2Sm0D311FNp3749m2yyCTvssAOvvvpqbj4MSZIk1XkFn3zUd3feeSePPPIIc+bM4e2332b06NGsXLmSoUOH8t577/H+++/TrFmzcgvbANx1113cdtttfPrpp3zzzTeMHTsWgNdff50TTzyR8ePH8/HHH/PZZ5+VS1waN27MVVddxYIFC3j66ad5/PHHueGGGwB49NFHmTZtGm+//TaLFi3i3nvvpW3btrn7MCRJklSnmXzUcyeddBJdunShTZs2nHfeedx99920bduWww8/nObNm7Pxxhtz3nnn8eSTT5Z739ChQ/ne975Hs2bNOOKII5g9ezYA999/PwcffDD9+vVjww035OKLL6ZRo//+Z7LLLruw++6706RJE7p3787xxx9fWnfTpk1ZvHgxb775Jikltt12Wzp16pSzz0KSJEl1m8lHPdelS5fS1926dePjjz9myZIlHH/88XTr1o1NNtmEfv368cUXX7BixYrSsh07dix93bx5c7766isAPv7443J1tmjRolzrxdtvv83BBx9Mx44d2WSTTTj33HNLu2ztt99+nHTSSfz85z+nffv2DB8+nC+//LLW7l2SJEn1S8EnH/V9nY8PPvig9PX777/PZpttxhVXXMFbb73Fs88+y5dffsm0adOAzJiMdenUqVO5OpcsWcJnn31Wun/iiSeyzTbb8M477/Dll19yySWXlKv3F7/4BbNmzeL111/n7bff5re//W1N3KYkSZIagIJPPurzgHOA66+/ng8//JCFCxcyZswYhgwZwuLFi2nWrBmbbropCxcuZNSoUVWub/Dgwfztb39j+vTpfPPNN1xwwQWsXLmy9PzixYvZZJNNaNmyJW+++Sa///3vS889//zzPPvssyxfvpwW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Z9NNN6WkpISVK1fWaryFZOXKlZSUlLCmz1ySpPropptu4l//+hejR4+u9Py1117LjjvuSNeuXWnatCl77703v/nNbzj44INLy5xwwgkMHDiQAw88cK3X6tGjB2eeeSZ33XUXZ599Nr17967JW5FqTV370/MCYAXQocLxDsC83IcDRUVFfPjhh7z11lv5uHyD1aJFC4qKivIdhiRJNeKtt97i3HPPZfr06TRt2rTSMtdddx0zZ85kwoQJdOvWjWnTpnHGGWfQvXt3Bg4cyPjx4/nnP/9JZeuOVbR06VLuvvtumjdvzvTp00kpEbHGpRWkOqNOJR8ppW8iYhZwAJkuU6scADxQ+bvWT0QMAgb16NGj0vONGjVyMLokSVqrp59+mgULFtCzZ8/SYytWrGDatGn84Q9/4LPPPuOcc87hvvvuY9CgQQD06tWL2bNnM3bsWAYOHMjjjz/O66+/TsuWLcvVPWTIEPr06cP06dNLj5111ll8++23PPfcc/Tp04ff/e53jBw5Mjc3K62HnCcfEdESWPWbfiOga0T0BhamlN4HrgTGR8RzwAzgBGAzoFbmck0pTQQmFhcXD6uN+iVJUsP34x//mOLi4nLHhg4dytZbb825554LZMY7Nm7cuFyZxo0bl3btHjNmDGeccUa58zvssANjx47lkEMOKT02ZcoUbrjhBqZMmULPnj254oorOOWUUzjooIPYaqutauP2pBqTj5aPYmBKmf1R2e124NiU0p8joi1wPtCJzJogB6WU3quNYNbV8iFJkrQum266KZtuumm5Yy1atKBNmzZsv/32AOy9996cffbZtGzZkm7duvHkk09yxx13cPnllwPQuXNnOnfuvFrdXbp0YcsttwQyA9KHDh3KySefzF57ZdZgHjZsGA888ABDhw5l6tSplU7RK9UVOf+vM6U0NaUUlWzHlilzQ0qpe0ppw5TSLimlabUYz1oHnEuSJNWEe+65h1133ZWjjjqK7bbbjssuu4yLL7643EKE63LKKafQvHlzxowZU+74LbfcwiuvvMI111xT02FLNapOjfmQJElqKKZOnVpuv2PHjmtcu2NNKq6Ldcstt1RarnPnznz++efVqlvKh4Jvl1vXOh+SJEmSakbBJx92u5IkSZJyo+CTD0mSJEm5YfIhSZIkKScKfsC5U+1KktTwxdnz8x1Cg5Aua5fvEFTP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kqTa8cgjj/D444/Tp0+f0mN77rknf/zjH+nfv38eI5Okhq3KyUdK6Uugb0TsB+xMptXkxZTS5NoKTpKk2tCuXTtatGix2vHmzZvb5UqSalG1FxlMKT2RUhqbUrrcxEOSVB9dcMEFnHLKKXz00Uelxz766CNOP/10LrjggjxGJkkNW7WSj4jYKSJOi4jLIuLyslttBVhdEbFpRLwQEbMj4tWIsPOuJKmcq6++mueff57u3buX25599lmuvfZaevXqVbrl2qWXXsquu+7KJptsQrt27Rg0aBCvvvpquTJfffUVI0eOZPPNN6dZs2Z8//vf56qrripXZt68eRx99NF07NiR5s2bs+OOO3LnnXeWnn/11VfZaKONeOCB8sM2J0+eTNOmTZkxY0bt3aSkglWdRQZ/CVwGvAeUAKnM6VTpm/JjMdAvpbQkIloAr0bEgymlz/IdmCSpbhg8eHC+Q1ijqVOnMmLECHbddVdSSlxwwQX079+f119/nTZt2gBw2mmnMXnyZMaPH88WW2zBtGnTGDZsGEVFRRx99NEAHHPMMSxcuJCHHnqIdu3a8Ze//IWjjz6aLl260K9fP7bffntGjRrFCSecQN++fenQoQOLFi1i6NChnH766ey55575/BgkNVDVGXB+KnBiSumPtRVMTUgprQCWZHc3BCK7SZIEwIUXXpjvENbokUceKbc/fvx4WrVqxYwZMxg0aBAAM2fO5Oijj2bfffcFoHv37txyyy08++yzpcnHzJkzue6669htt90AOP3007n22mt57rnn6NevHwBnnnkmEyZMYPjw4Tz00EOMHDmS1q1bc9FFF+XqdiUVmOp0u2oEPL4+F4uIfhExISI+iogUEcdWUmZERMyNiGURMSsi9voO19k0Iv4JfAj8NqW0YH3iliQ1LPPnz2f+/Pml+6+88grnn38+d999dx6jqtzixYtZuXIlrVv/d6mtvn37MnHiRD744AMgk2jMnj2bgQMHlitz77338tlnn7Fy5Uoeeugh5s+fX242r0aNGnH77bczefJkjjrqKO655x7uuOMONthgg9zdoKSCUp3k4/fA0PW8XkvgVeBkMosWlhMRQ4BrgEuAnYCZwMMR0bVMmVVjOSpum60qk1L6IqW0I7AFcGRE1NsV2CVJNe+II45g4sSJACxYsIB+/frxl7/8hRNOOIErrrgiz9GVd/LJ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.encoders import OneHotEncoder\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Category\"]\n", - "sf_crime_df = sf_crime_df[columns]\n", - "objs = [OneHotEncoder()]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OneHotEncoder\")" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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JkzgpZdeombN2B+qXNDGfJw0d5/i7qe5e4NwcnFcZtbJzF7YuXNnEOGJiIiISAHw4osvcu6553LWWWell73xxhtMnDiRyZMns2zZMiZOnMjYsWN56aWX0us8++yzfPLJJ0yZMoWlS5fyl7/8hQEDBvD+++9nd5rjSklJ4b333qNUqVLMmzcvX66roCtMyUcqcASomqW8KrD12Oq54+5T3b1H+fLlTyY2ERERESkktm3bxr/+9a9MvR4AAwcOZMCAAVx33XU0bdqUm266if79+/P4448DsH//fu677z6eeOIJOnXqRLNmzejduzfXXXcdI0eGRgZUq1aNI0eOkJqamqntlJQUqlWrlqmsR48eNGzYkFmzZvHaa68xderUCF51wVBokg93P0ho0cD2WQ61JzTr1S+ing8RERGR+DJ+/HiKFy/O9ddfn6l83759FC1aNFNZ0aJFSUtLA+DQoUMcOnTouHXOOeccEhISmDlzZvrxzZs389VXX3HBBRekl40fP55Zs2YxYcIEWrZsyaBBg+jZsyc7duzI12staApU8hGeN7m5mTUnFFvt8P7RqXSfBrqG50BuZGajCa3t8bdfek71fIiIiIjED3dn3LhxXHfddZQpUybTsU6dOjFixAjee+89NmzYwD/+8Q+efvpprrrqKgDKlSvHb37zG+69917mzp3L+vXrGT9+PBMnTkyvU758eW699VbuueceZs2axfLly7npppto1qwZ7dq1A2DTpk307duXESNG0LBhQwCGDh1KYmIiffr0CfC7EbwCNdWumV1EaLB4VhPcvWu4Ti/gHkJzM68C7nL3k35ILqcB54cOHWLz5s0cOHDgZE8hGZQoUYJf/epXJCQkRDsUESmgzGypuyfnomrB+UEmIgXenDlzaNu2LYsWLeK8887LdGz37t088MAD/OMf/2Dbtm1Ur16d6667jgcffJASJUoAoQHl9913HzNmzGDHjh3UqVOH2267jbvvvhuz0CRPP//8MwMGDGDy5Mns37+fSy65hLFjx1KrVi3cnQ4dOpCWlsasWbPS3wOwYsUKzjvvPN544430ZKaQynG2qwKVfESDmXUCOjVo0KD7119/fczx9evXU7ZsWSpXrpzpH4f8cu7ODz/8wO7du6lXr160wxGRAkrJh4hIoZXjL80F6rGraDjRY1cHDhxQ4pHPzIzKlSurN0lEREQkzsR98pEbSjzyn76nIiIiIvEn7pMPzXYlIiIiIhKMuE8+NNvVidWtW5dZs2ZFOwwRERERKeSKRTuAwujTNqdGtP3z562LaPsi8SbS/2fzg/7fi4hIPIj75CPDbFfRDkVEREREMrB7t0c7hJjgI5KiHUI6PXZViB+7qlu3Lo8//jiNGzemYsWKdOvWjQMHDvDjjz9y+eWXk5SURMWKFbn88svZvHlz+vsuuugiHnjgAVq1akXZsmXp0KEDqamp6cdfffVV6tSpQ+XKlRk+fHimcy5evJiWLVtSoUIFqlevTu/evTl48CAQmkL3rrvuokqVKpQrV46mTZuyatWqYL4ZIiIiIlLgxX3yUdhNmjSJDz74gHXr1rF27VoeffRR0tLS6NatGxs3buTbb7+lZMmS9O7dO9P7Jk+ezCuvvMK2bds4ePAgI0eOBODLL7/k9ttv59VXX2XLli388MMPmRKXokWL8pe//IXU1FQWLlzIhx9+yNixYwGYMWMG8+bNY+3atezcuZM333yTypUrB/fNEBEREZECTclHIde7d29q1apFpUqVGDx4MK+//jqVK1fmmmuuoVSpUpQtW5bBgwfz0UcfZXpft27dOO200yhZsiTXXnstK1asAODtt9/m8ssvp02bNhQvXpxHHnmEIkX+98/knHPO4fzzz6dYsWLUrVuXnj17predkJDA7t27Wb16Ne5Oo0aNqF69emDfCxEREREp2JR8FHK1atVKf12nTh22bNnCvn376NmzJ3Xq1KFcuXK0adOGn376iSNHjqTXrVatWvrrUqVKsWfPHgC2bNmSqc3SpUtn6r1Yu3Ytl19+OdWqVaNcuXLcf//96Y9stW3blt69e3PHHXdQpUoVevTowa5duyJ27SIiIiJSuMR98lHY1/nYtGlT+utvv/2WGjVq8NRTT7FmzRoWLVrErl27mDdvHhAak3Ei1atXz9Tmvn37+OGHH9L3b7/9ds444wy+/vprdu3axWOPPZap3TvvvJOlS5fy5ZdfsnbtWp588sn8uEwRERERiQFxn3wU5gHnAGPGjGHz5s3s2LGD4cOH06VLF3bv3k3JkiWpUKECO3bsYNiwYblur3Pnzvz73/9m/vz5HDx4kAcffJC0tLT047t376ZcuXKUKVOG1atX89e//jX92GeffcaiRYs4dOgQpUuXpkSJEpke2RIRERGR+KbfDAu5G264gQ4dOlC/fn1OPfVUhgwZQr9+/di/fz+JiYmcf/75XHbZZblur0mTJowZM4YbbriB6tWrU7FiRX71q1+lHx85ciSTJ0+mbNmydO/enS5duqQf27VrF927d6dixYrps2UNHDgwX69XRERERAovy82jOPEgOTnZlyxZckz5V199RaNGjaIQ0YnVrVuXcePG0a5du2iH8osU5O+txBYtMlg4mdlSd0/ORVX9IBOJUVrnI39EYZ0Py+mAej5ERERERCQQcZ98FPYB5yIiIiIihUWxaAcQbe4+FZianJzcPdqx5NWGDRuiHYKIiIiISK7Ffc+HiIiIiIgEQ8mHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEQsmHiIiIiIgEIu6n2jWzTkCnBg0a5P49EV5tMwqrUIqIiIiIRFzc93y4+1R371G+fPlohyIiIiIiEtPiPvkozOrWrcvIkSNp1qwZ5cuXp0uXLhw4cIDx48fTunXrTHXNjG+++QaArl270qtXL377299SpkwZWrVqxdatW+nXrx8VK1bkjDPOYPny5ZnO8/jjj9O4cWMqVqxIt27dOHDgAABnnnkmU6dOTa976NAhEhMTM71fRERERASUfBR6b775Ju+//z7r169n5cqVjB8/Ptfve/TRR0lNTaV48eK0bNmSFi1akJqaSufOnenfv3+m+pMmTeKDDz5g3bp1rF27lkcffRSAm2++mddeey293rRp06hevTpnn312vl2jiIiIiMQGJR+F3J133kmNGjWoVKkSnTp1YsWKFbl631VXXcU555xDiRIluOqqqyhRogQ333wzRYsWpUuXLsf0XPTu3ZtatWpRqVIlBg8ezOuvvw7AH/7wB6ZNm8auXbsAePXVV7npppvy9RpFREREJDYo+SjkqlWrlv66VKlS7NmzJ1fvq1q1avrrkiVLHrOftZ1atWqlv65Tpw5btmwBoEaNGrRq1Yp33nmHn376ienTp3PjjTf+omsRERERkdgW97NdxaLSpUuzb9++9P2tW7eedJubNm1Kf/3tt99So0aN9P1bbrmFcePGcfjwYVq2bEnNmjVP+nwiIiIiEnvU8xGDzjrrLL744gtWrFjBgQMHeOihh066zTFjxrB582Z27NjB8OHD6dKlS/qx3//+9yxbtozRo0dz8803n/S5RERERCQ2xWzyYWb/MLMfzeztaMcStNNOO40HH3yQdu3a0bBhw2NmvvolbrjhBjp06ED9+vU59dRTGTJkSPqxkiVLcs0117B+/Xquvvrqkz6XiIiIiMQmc/doxxARZnYRUBa4xd07n6h+cnKyL1my5Jjyr776ikaNGuV7fIVJ3bp1GTduHO3atcuxzsMPP8zatWszzXx1IvreSlA+bXNqtEM4ofPnrYt2CAWOmS119+RcVI3NH2QiEvGFneNFFBawtpwOxGzPh7vPBXZHO454sGPHDl566SV69OgR7VBEREREpAALPPkwszZmNsXMvjMzN7Ou2dTpZWbrzeyAmS01swuDjlNy58UXX6RWrVr89re/pU2bNtEOR0REREQKsGjMdlUGWAVMDG+ZmFkXYDTQC5gf/jrdzBq7+7fhOivIPvYO7r4lQnHHrQ0bNuR4rHv37nTv3j24YERERESk0Ao8+XD3acA0ADMbn02V/sB4d38xvN/HzC4DbgfuC7fRPD9iMbMeQA+A2rVr50eTIiIiIiKSgwI15sPMTgHOAWZkOTQDuCC/z+fuL7h7srsnJyXlPBAnVgflR5O+pyIiIiLxp0AlH0AiUBRIyVKeAlQ7tnrOzGwW8BbQ0cw2m1nLHOp1MrMXdu7cmW07RYsW5dChQ3k5teTCoUOHKFZMa1yKiIiIxJOClnzkG3dv5+5J7l7K3X/l7gtzqDfV3XuUL18+23YqVKhASkoKaWlpEY03nqSlpZGSkkJO33MRERERiU0F7U/PqcARoGqW8qrA1uDDgcTERDZv3syaNWuicfqYVbp0aRITE6MdhoiIiIgEqEAlH+5+0MyWAu0JPTJ1VHvgnUic08w6AZ0aNGiQ7fEiRYpoMLqIiIiISD6IxjofZcysuZk1D5+/dnj/6G/4TwNdzew2M2tkZqOBGsDfIhHPiR67EhERERGR/BGNMR/JwPLwVhIYFn79MIC7vwH0A4YAK4DWQEd33xiJYE404FxERERERPJH4MmHu891d8tm65qhzlh3r+vuxd39HHefF8F41PMhIiIiIhKAmJ3tSkRERERECpa4Tz702JWIiIiISDDiPvnQY1ciIiIiIsEoUFPtihRkn7Y5Ndoh5Mr589ZFOwQRERGRbMV9z4eIiIiIiAQj7pMPjfkQEREREQlG3CcfGvMhIiIiIhKMuE8+REREREQkGEo+REREREQkEHGffGjMh4iIiIhIMOI++dCYDxERERGRYMR98iEiIiIiIsFQ8iEiIiIiIoFQ8iEiIiIiIoGI++RDA85FRERERIIR98mHBpyLiIiIiAQj7pMPEREREREJhpIPEREREREJhJIPEREREREJRLFoByAiIhIt+/fvZ926dQCceuqplCxZMsoRiYjENvV8iIhI3Pn555/p168flSpV4qyzzqJZs2ZUqlSJvn37cuDAgWiHJyISs9TzISIicef2229nxowZjBs3jpYtWwKwcOFC7rvvPnbv3s3LL78c5QhFRGJT3CcfZtYJ6NSgQYNohyIiIgF56623ePfdd2nfvn16Wf369alSpQrXXHONkg8RkQiJ+8eutM6HiEj8KV26NDVr1jymvGbNmhr3ISISQXGffIiISPzp06cPw4YNY//+/ell+/fv55FHHqFPnz5RjExEJLbF/WNXIiISfz799FM++ugjatasSbNmzQD4/PPPOXz4MHv37uWKK65IrztlypRohSkiEnOUfIiISNxJTEzkmmuuyVRWr169KEUjIhI/lHyIiEjceeWVV6IdgohIXNKYDxERERERCYR6PkREJO40bdoUM8vx+MqVKwOMRkQkfsRk8mFmtYBXgSrAYeARd38rulGJiEhB0blz50z7hw4dYsWKFSxYsIA77rgjSlGJiMS+mEw+CCUc/dx9hZlVA5aa2TR33xvtwEREJPqGDh2abfmTTz7Jxo0bA45GRCR+xOSYD3f/3t1XhF9vBVKBSlENSkRECryrr76aSZMmRTsMEZGYFXjyYWZtzGyKmX1nZm5mXbOp08vM1pvZATNbamYXnsT5zgGKuvumk4lbRERi37x58yhVqlS0wxARiVnReOyqDLAKmBjeMjGzLsBooBcwP/x1upk1dvdvw3VWkH3sHdx9S4a2KoXP0T2fr0FERAqxjIsIArg733//PcuXL8/xkSwRETl5gScf7j4NmAZgZuOzqdIfGO/uL4b3+5jZZcDtwH3hNpqf6DxmVhz4JzDC3T856cBFRCRmVK5cOdN+kSJFaNKkCY899hgdOnSIUlQiIrGvQA04N7NTgHOAkVkOzQAuyEM7BowHZrv7q8ep1wPoAVC7du28hisiIoWUFhkUEYmOgjbgPBEoCqRkKU8BquWhnVZAF+D3ZrYivDXNWsndX3D3ZHdPTkpK+sVBi4hI4TVixAh+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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.encoders import WOEEncoder\n", - "from gators.imputers import ObjectImputer\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "imputer = ObjectImputer(strategy='most_frequent')\n", - "titanic_df = imputer.fit_transform(titanic_df)\n", - "columns = [\"Cabin\", \"Embarked\"]\n", - "sf_crime_df = titanic_df[columns]\n", - "objs = [WOEEncoder()]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec, y=titanic_df[\"Survived\"])\n", - "plot_all(bench_scalers, name= \"WOEEncoder\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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f/58Fi5cyKpVqwodTtHYdNNN2XLLLWnfvn21f+RGxPSUUp9anKrh/CKrJ5MnT+bggw9eq3zQoEGMHTuWsWPHMmTIkLWOjxo1iosvvrjG50OmteOggw7ixz/+Mc8++ywvvfRSpe5Yc+bMYbfddmPkyJGceeaZ9feiJJWSGgeONajkoxAqDDgf+vbbbxc6HEkN0OzZs4kIOnXqRNOmTR2MWw9SSqxcuZKysjJSSmyzzdprxZZy8iFJjVyNvyhLvj3VAeeS1ufzzz+nW7duNGvWzMSjnkQEzZo1o1u3buXdgSRJxa/kkw9Jqg37vueG76sklZaSv+s725UkSZKUHyWffNjtSpJqp3v37jz22GOFDkOS1Ig1qKl2JamxeK7vDjk9/z5TXGdBklR8Sj75qDDbVaFDkSQ1AnH+vEKHUBTSlR0KHYKkArDbld2uJDVy3bt355e//CW77LILbdu2ZciQIaxYsYLPPvuMI444gg4dOtC2bVuOOOIIPvzww/LnHXTQQfziF79g//33Z4sttqB///7Mnz+//Pidd97Jtttuy1ZbbcXll19e6ZovvPAC++67L1tuuSVdunThtNNO48svvwQy0+ieeeaZdOzYkdatW7P77rvz2muv5efNkCQ1aCWffEhSMbjrrrt45JFHePfdd3nrrbe47LLLWL16NUOGDOH9999n9uzZNG/enNNOO63S8+6++25uv/12PvnkE7788kvGjBkDwBtvvMEpp5zCnXfeydy5c/n0008rJS6bbropv/nNb5g/fz7PPvssjz/+ODfccAMAEydOZMqUKbz11lssWrSIe++9l6222ip/b4YkqcEy+ZCkInDaaaex9dZb065dOy688ELuuecettpqK4455hhatGjBFltswYUXXsiTTz5Z6XlDhgzh61//Os2bN+cHP/gBM2bMAOD+++/niCOOoG/fvmy22WZceumllabF3Wuvvdhnn31o0qQJ3bt35+STTy4/d9OmTVmyZAlvvvkmKSV23nlnunTpkrf3QpLqYsqUKRx55JF069aNiGDs2LGVjqeUuPjii+natSvNmzfnoIMO4vXXX6/2XCtWrGDPPfckIpg2bVp5+cSJE2natCnPP/98pfq33HILrVq14t13S2ecn8mHJBWBrbfeuvzxtttuy9y5c1m2bBknn3wy2267La1bt6Zv374sXLiQVatWldft3Llz+eMWLVqwdOlSAObOnVvpnC1btqzUevHWW29xxBFH0LlzZ1q3bs3Pf/7z8i5bhxxyCKeddhqnnnoqHTt2ZNiwYSxevDhnr12SNsbSpUvZbbfduO6662jevPlax6+66iquvvpqfve73/Hiiy/SsWNH+vXrx5IlS9aqe8455/C1r31trfL+/ftz0kknMWjQIJYvXw7Ae++9x1lnncWYMWPYYYfcTmLSkJR88uE6H5KKwQcffFD+ePbs2XTt2pWrr76af//73zz//PMsXryYKVOmAJlv8danS5culc65bNkyPv300/L9U045hZ122om3336bxYsXc8UVV1Q6709/+lOmT5/OG2+8wVtvvcWvf/3r+niZklTvDj/8cK644gqOPfbYtRY+TSlx7bXXcv7553PMMcew2267cccdd7BkyRLuvvvuSnX//ve/M2nSpPLuq1WNGTOGr776ivPPP5+UEoMHD2a//fbjJz/5Sc5eW0NU8smHA84lFYPrr7+eDz/8kAULFnD55ZczcOBAlixZQvPmzdlyyy1ZsGABo0ePrvX5jj32WB566CGefvppvvzyS0aOHMnq1avLjy9ZsoTWrVvTqlUr3nzzTf7whz+UH3vxxRd5/vnnWblyJS1btmTzzTd3JXNJjdKsWbP4+OOP6d+/f3lZ8+bN6du3L88880x52Ycffsgpp5zC3XffXW3rCWRakMeOHcv111/P8ccfzyuvvMKtt96a89fQ0PjbQJKKwHHHHUf//v3Zfvvt2WGHHbjooosYMWIEy5cvp3379uyzzz4cdthhtT7frrvuyvXXX89xxx1Hly5daNu2baWuBGPGjOHuu+9miy22YOjQoQwcOLD82OLFixk6dCht27Ytny3r3HPPrdfXK0n58PHHHwPQqVOnSuWdOnUqP7Zq1SqOP/54zj77bPbcc891nu+AAw7ghz/8Iffccw9XX3013bp1y03gDVjJr/MhSRuioS0C+M1vfpMLLrigUlmLFi2YPHlypbKTTz65/HHVY4MHD2bw4MHl+4MGDWLQoEHl+xdeeGH54759+/Lmm29Wev4ll1wCwHe+8x1mzpy5IS9DatSmTJnCmDFjmD59OnPnzuX222+v9H8qpcTo0aO56aab+Oyzz9h77725/vrr2XXXXcvrXH755UyYMIEZM2awbNmytbpJTpw4kf/6r//i6aefZu+99y4vv+WWWxgxYgSvvPJKSY0faAiuuOIKmjVrxllnnbXeumVlZfzjH/+gRYsWTJkyhRNPPDEPETYstnxIkiTVg/oYuPzFF19w9NFHM2LEiGqv4cDl/FozKUdZWVml8rKysvJjjz/+OE888QRNmzalSZMmrFm4ep999uH444+v9Lxhw4ax44478thjj/HnP/+Z8ePH5+FVNCwln3w44FySJNWH+hi4fMkll3D22WfTq1evGq/jwOX82W677ejcuTOPPvpoedmKFSt46qmn2G+//QC4/fbbeeWVV5gxYwYzZsxgwoQJQGb9pV/96lflzxs7diyPPfYYd9xxB/vuuy/nnXceJ598MgsWLMjviyqwku92lVIaD4zv06fP0ELHIkkb4r333it0CJLWY30Dlyt2iVyfNQOXDzroIObNm8crr7zCa6+9louwS8LSpUt55513AFi9ejWzZ89mxowZtGvXjm222YYRI0ZwxRVXsNNOO/H1r3+dyy67jFatWnHccccBmQSlolatWgGwww47lI+V++CDDzjjjDO48sor2XHHHQEYNWoU48eP5/TTT+euu+7K18stuJJv+ZAkScq12gxcrgsHLtefadOm0atXL3r16sXy5csZNWoUvXr1YuTIkQD87Gc/48wzz+TUU0+lT58+fPTRR0ycOJEtttiiVudPKXHiiSfSp08fTjvttPLyZs2a8ac//Yn77ruPv/71rzl5bQ1Rybd8SJIkNTYOXK4/Bx100DrXP4oILr74Yi6++OJana979+6VzhcRlbptVdSzZ0++/PLLOsXb2NnyIUmSlGO1GbhcFw5cVmNl8iFJkpRjtRm4XFsOXFZjZvIhSZJUD5YuXVo+41HFgcuzZ88mIhgxYgS/+tWvePDBB3nttdcYPHhwpYHLQPlz1kwkseZ8S5cuBWoeuNy+fXtOP/30vL9mqa5iXX3cSkmfPn3StGnTCh2GpAboX//6FzvvvHOhwyhaNb2/ETE9pdSnFqfI6y+yOH9ePi9XtNKVHQodQr2bPHkyBx988FrlgwYNYuzYseWLDN54442VFhncbbfdyusOHjyYO+64Y61zTJo0iW9/+9v079+f1atX89hjjxER5cdnzJjBt771Lf7yl79w1FFH5eYFSrUXNR4o9eQjIgYAA3r06DH07bffLnQ4khqg6v44zvUfoMX4h1lNTD5KUyn9G5dKUI3JR8nPduU6H5IkSQ2TyX79aEjJvmM+JKmR6969O2PGjGGPPfagTZs2DBw4kBUrVjB27FgOOOCASnUjonwxrcGDBzN8+HC+973v0apVK/bff38+/vhjRowYQdu2bdlpp514+eWXK13nl7/8Jbvssgtt27ZlyJAhrFixAoDddtut0mw7K1eupH379pWeL0mSyYckFYF7772Xf/7zn8yaNYuZM2cyduzYWj/vsssuY/78+Wy22Wbsu+++9O7dm/nz53Psscdy1llnVap/11138cgjj/Duu+/y1ltvcdlllwFwwgkn8Oc//7m83oQJE+jSpQu9evWqt9coSWr8TD4kqQj89Kc/pWvXrrRr144BAwYwY8aMWj3vqKOOYq+99mLzzTfnqKOOYvPNN+eEE05g0003ZeDAgWu1XJx22mlsvfXWtGvXjgsvvJB77rkHgB/+8IdMmDCBxYsXA3DnnXfyox/9qF5foySp8TP5kKQiUHGRshYtWpRPy7k+nTp1Kn/cvHnztfarnmfrrbcuf7ztttsyd+5cALp27cr+++/PAw88wMKFC3n44Yc5/vjjN+i1SJKKV8kPOJekYtWyZUuWLVtWvv/xxx9v9Dk/+OCD8sezZ8+ma9eu5fuDBg3illtu4auvvmLfffelW7duG309qb44cLl+NKSBy2qcbPmQpCK155578vrrrzNjxgxWrFjBxRdfvNHnvP766/nwww9ZsGABl19+OQMHDiw/9t///d+89NJLXHfddZxwwgkbfS1JUvEp2uQjIv4aEZ9FxP2FjkWSCuHrX/86I0eO5NBDD2XHHXdca+arDXHcccfRv39/tt9+e3bYYQcuuuii8mPNmzfnmGOOYdasWRx99NEbfS1JUvEp2kUGI+IgYAtgUErp2PXVd4VzSTVxhfOM7t27c8stt3DooYfWWOeSSy7hrbfeqjTz1fq4yGBpynf3HT+3+uHn1jgVoLtcjYsMFm3LR0ppMrCk0HFIUqlYsGABt956K8OGDSt0KJKkBirvyUdE9I2IcRExJyJSRAyups7wiJgVESsiYnpEHJjvOCVJtXfzzTez9dZb873vfY++ffsWOhxJUgNViNmuWgGvAX/KbpVExEDgOmA48HT258MRsUtKaXa2zgyqj71/SmlujuKWpJL23nvv1Xhs6NChDB06NH/BSJIapbwnHymlCcAEgIgYW02V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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Feature Generation\n", - "# Skipped ClusterStatistics\n", - "from gators.feature_generation import ElementaryArithmetics\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"X\",\"Y\"]\n", - "sf_crime_df = sf_crime_df[columns]\n", - "# Why filter for columns , even though column names are given in constructor\n", - "objs = [ElementaryArithmetics(columns_a=[\"X\"], columns_b=[\"Y\"], operator='+', coef=0.1)]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"ElementaryArithmetics\")" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Vq1axbnnnkvfvn356le/WuFY69atGTZsGAMHDuTEE0+kT58+tRq/JJXXkJKPakkpjQeq/HaoKhHRF+jbtWvXugtKkqRNcM455zB16lSmTp1Ko0aNqqwzcuRIjjnmGNq2rbqTaM2aNfzsZz/js88+Y/z4df88lpaWMmrUKJo1a8YLL7zAypUr2XrrrWv1OiRprfo24HxDFgJfAu0rlbcH5m9qoymlCSmlwS1bttyc2CRJqlVnn30299xzD5MnT2bnnXeuss7LL7/M9OnTGTRoUJXH16xZw09/+lNmzpzJE088wXbbbbdOnRtuuIFXXnmFF154gWXLlnHRRRfV6nVIUnkNJvlIKa0is2jgEZUOHUFm1qtNEhF9I+K2xYsXb054kiTVmqFDh5YlHhsaj3jbbbex00470atXr3WOrV69mn79+jFz5kymTJlChw4d1qnzxhtvcNFFF3HTTTfRrVs37rjjDm688UamTZtWq9cjSWvVq+QjIlpERPeI6E4mth2y+2un0r0eGBARp0TE7hFxI5m1Pf60qee050OSVJ+cfvrpjBo1irvvvptWrVoxf/585s+fz7JlyyrUW758OWPHjuXnP/85ERXHdq5Zs4Yf/ehHPP/889xzzz1ERFk7K1asKKtz8skn873vfY/+/fsD0Lt3b0455RQGDhzI8uXLc3PBkopKvZpqNyIOITNYvLI/p5QGZOsMAX5JZl7zV4GzU0pPb+65HXAuaX1KS0tZuHAhn332GV9++WW+wykYjRo1Ytttt6VNmzZsscW634VFxIyUUkk1mqo/f8hqQeVEYq1LL72Uyy67rGx/1KhRDBo0iLlz59KpU6cKdefMmcNOO+1UZTujRo1iwIABXHHFFdx88828+uqrFcaLLFu2jL333pu+ffty4403bv4FFYlhw4Yxbtw43nrrLZo0acL+++/PsGHD2HPPCutDMmvWLH71q18xefJkVq1axW677cbYsWPZfffdARg0aBCTJ09m3rx5tGjRggMOOIBrrrmm7Pirr75KSUkJY8eO5bjjjitr9/HHH+eoo47iySef5MADD8zdhUtVW+9sV/Uq+ciHcgPOB/373//OdziS6qG5c+cSEbRv357GjRuv9x+Hqr6UEqtXr2bBggWklNhhh3XXii3W5EMN03e/+11+8pOf8M1vfpOUEpdccgnPPfccr7/+Oq1bZ9aHnD17Nt/61rc46aST6N+/P9tuuy1vvvkme+21F507dwbg1ltvpVu3bnTu3JlFixZx2WWXMWPGDObMmUPjxo0B+O1vf8vw4cN59dVXad++PYsXL2bPPfekf//+XHPNNXn7HUjlmHxsjD0fktbnjTfe4Otf/3qV385r85SWlvLWW2+VfatbnsmHGrJly5bRsmVLHnroIfr2zSxAf8IJJxARjB07ttrtzJw5k2984xu8+eabfP3rmTUkS0tLOfjgg2nTpg0PP/wwJ510UtnkA1tttVWdXI9UQ+tNPvxLKknVYOJRN/y9qlAtXbqU0tJSWrVqBWQShgkTJtCtWzeOPPJI2rZtyze/+U3uu+++9bbx+eefM2rUKHbYYQe6dOlSVr7FFlvw5z//mccff5z+/ftz7733ctddd5l4qEEo+ru+s11JkqTaVnlxyI8++ohly5Zx9dVX07t3bx577DF++tOf0r9/f/7+979XeO+IESNo0aIFLVq04JFHHuGJJ56gSZMmFep07dqV888/n7vvvptf/epXdO/ePVeXJm2Wok8+nO1KkqqnS5cuPP744/kOQ6r31i4O+eCDD5YtDllaWgrAMcccwznnnEP37t0555xz+PGPf8zNN99c4f39+/fnpZde4qmnnuJrX/saP/rRj9aZfWzFihXcc889NGvWjKlTp+Jj9GooCm6Fc0nKhed77lKn7e//9Dt12r6kunH22Wdz7733MmXKlAqLQ7Zp04Ytt9ySbt26Vai/++67c++991Yoa9myJS1btmTXXXdl//33p1WrVjz44IOceOKJZXUuuOAC1qxZw7/+9S969OjBzTffzJlnnlm3FyfVgqJPPsrNdpXvUCRJDUD86uN8h1AQ0jVtN16pgRk6dCj33XcfU6ZMWWdxyK222opvfvObvPXWWxXKZ82axY477rjeNlNKpJT44osvysqmTJnCiBEjmDJlCnvssQfXXXcdZ511Fn369GGXXer2ixFpc/nYlY9dSWrgunTpwrBhw+jWrRutWrVi4MCBrFy5kk8//ZSjjz6atm3b0qpVK44++mjef//9svcdcsgh/M///A8HHnggX/nKV+jduzcLFy4sOz5mzBh23HFHtttuO6666qoK51z7beu2225Lx44dOeOMM1i1ahWQ+cfS2WefTbt27dhmm23Ya6+9ePXVV3Pzy5DypDqLQ/7yl7/kvvvu47bbbuPtt99m5MiR3HvvvZx++ukAvP322/z2t79lxowZzJ07l2effZYf/ehHNGnShKOPPhrIDGQfOHAgQ4cO5eCDDwYya4McfPDBDBw4sOzxLqm+KvrkQ5IKwdixY3n00Ud55513mDVrFldeeSWlpaUMHDiQd999l7lz59K0aVPOOOOMCu+7++67GTVqFB999BGrVq1i+PDhALz++uucdtppjBkzhnnz5vHJJ59USFwaNWrE73//exYuXMhzzz3HE088wYgRIwCYNGkSTz/9NLNmzWLx4sXcf//9bLfddrn7ZUh5MGLECJYuXcrhhx9Ox44dy7a1/08B/OAHP+C2225j+PDh7LXXXtx0003cddddfO973wOgSZMmPPnkkxx11FF07dqVfv368ZWvfIXnnnuODh06AHDWWWfRrFmzdb4QuOOOO3jllVdcGFL1XtE/diVJheCMM84oW6Tsoosu4swzz+TKK6+ssALyRRddxKGHHlrhfQMHDuRrX/saAD/+8Y8ZP348AA888ABHH300PXv2BChbDXut/fbbr+x1ly5dOPXUU3nqqac466yzaNy4MUuXLuXNN9/kW9/6VpVreEiFproDvgcMGMCAAQOqPNa5c2ceeeSRDb7/jjvuqLJ8++2359NPP61WDFI+2fMhSQVgbeIBsOOOOzJv3jyWL1/Oqaeeyo477sg222xDz549+eyzz/jyyy/L6q79NhWgWbNmZY+IzJs3r0KbzZs3r9B7MWvWLI4++mg6dOjANttsw69//euyR7YOO+wwzjjjDE4//XTatWvH4MGDWbJkSZ1duySp4Sj65MN1PiQVgvfee6/s9dy5c+nUqRPXXXcdb731Fv/85z9ZsmQJTz/9NFC9b2g7duxYoc3ly5fzySeflO2fdtpp7Lbbbvz73/9myZIlXH311RXa/cUvfsGMGTN4/fXXmTVrFr/73e9q4zIlSQ1c0ScfDjiXVAhuueUW3n//fRYtWsRVV11Fv379WLp0KU2bNmXbbbdl0aJFXH755dVu7/jjj+dvf/sbU6dOZdWqVVxyySUVBrIuXbqUbbbZhhYtWvDmm2/yxz/+sezYCy+8wD//+U9Wr15N8+bN2XrrrV3JXJIEmHxIUkE44YQT6N27NzvvvDO77LILF198MWeddRYrVqygTZs27L///hx55JHVbm+PPfbglltu4YQT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smVLpk2bRt++fQE48cQTAVi4cGGVbTRq1IgOHSrOizRu3Dh69epVoUekX79+/PWvf+Wkk07i+eef54orruDDDz/kscceq81Lqvfysc7Hk0BspM4IYESO4pkATCgpKXF1LEmSpCK2dOlSSktLadWq1Sa38Z///IcnnniC+++/f51jI0aMYI899qB///6MGzeOhx9+mNatW29OyA1Owc52JUmSJNXE0KFD6d69Oz16VLlCQ7XcfvvttG3blmOOOWadY61bt2bYsGHcf//9/PSnP6VPnz6bE26DVK8GnOeDj11JkiTpnHPOYerUqUydOpVGjRptUhtr1qxh1KhRnHzyyVWuYVRaWsqoUaNo1qwZL7zwAitXrmTrrbfe3NAblKLv+XDAuSRJUnE7++yzueeee5g8eTI777zzJrczYcIE5s+fzymnnFLl8RtuuIFXXnmFF154gWXLlnHRRRdt8rkaqqJPPiRJklS8hg4dWpZ47LbbbpvV1siRI/nOd77D1772tXWOvfHGG1x00UXcdNNNdOvWjTvuuIMbb7yRadOmbdY5G5qif+xKkiRJxen0009nzJgxPPTQQ7Rq1Yr58zNrWrdo0YIWLVoAsGjRIubOnctnn30GwNtvv822225Lhw4dKsxyNXfuXB599FHuuuuudc6zZs0aTj75ZL73ve/Rv39/AHr37s0pp5zCwIEDefnll2nWrFkdX239UPQ9HxHRNyJuW7x4cb5DkSRJUg6NGDGCpUuXcvjhh9OxY8eybfjw4WV1xo8fzz777MOhhx4KwKBBg9hnn334058qLkF3xx130LJlS4477rh1zjNs2DDeffdd/vjHP1YoHz58OGvWrOHCCy+sg6urnyKllO8Y6oWSkpI0ffr0fIchScqKiBkppZJqVM3pH7L41ce5PF3BSte0zen5/NxqR64/NzVY611Wo+h7PiRJkiTlhsmHJEmSpJwo+uTDMR+SJElSbhR98uE6H5IkSVJuONWuJEmS6iUnCqgd9WmigKLv+ZAkSZKUGyYfkiRJknKi6JMPB5xLkiRJuVH0yYcDziVJkqTcKPrkQ5IkSVJumHxIkiRJygmTD0mSJEk54TofkqSitWLFCt555x0AdtllF5o2bZrniCSpsNnzIUkqOl988QVnnXUWrVu35hvf+AZ77703rVu3ZujQoaxcuTLf4UlSwbLnQ5JUdE47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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation import IsEqual\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"X\",\"Y\"]\n", - "#sf_crime_df = sf_crime_df[columns]\n", - "objs = [IsEqual(columns_a=[\"X\"], columns_b=[\"Y\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"IsEqual\")" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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TJjAxRdfzAsvvJDLy5JU4hpM8pFS+pzMooH9qxT1JzPr1Vfikw9JUn1z0kknlSceVccjbrPNNnTo0IEHH3yw/NiKFSt44okn2HffzBDI3r17s3TpUqZNm1ZeZ9q0aXz66afldQAuvPBC5s+fz9ixYzn88MP5wQ9+wNFHH83nn3+e4yuUVKrqVfIREc0jontEdCcTW+fs/pdT6V4BDIuIYyJip4i4mszaHn/6quf0yYckqT75xS9+wbhx47j99ttp1aoVCxYsYMGCBSxduhTIjN04+eST+d3vfse9997LSy+9xLBhw2jevDlHHXUUADvttBMHHXQQxx57LNOmTWPatGkce+yxHHzwweywww4AzJgxg4suuogbbriBLbfcEoBrrrmGhQsXMnr06MJcvKSiV6+m2o2Ib5EZLF7Vn1NKw7J1jiczv/lWZKYHPCWltMGdVB1wLmltVq9ezcKFC/n444/54osvCh1O0dh4441p2bIlbdq0YaON1vxbWETMSCn1qkFT9eeLrA5UHCRe0ahRozj//POBTBeq0aNHc/311/PRRx+x9957c91117Hrrv9di/Cjjz7ixBNPZOLEiQAccsghXHvttbRs2ZLPPvuMnj178o1vfINx48ZVOs8///lPDjvsMJ566in22muv3FykpGK31tmu6lXyUQgRMQgY1K1btxFvvPFGocORVA/NnTuXiKB9+/Y0atRorb8cquZSSqxcuZKysjJSSnTuvOZasaWafEhSEVjrF2W96nZVCHa7krQ+n376KZ06dWLTTTc18agjEcGmm25Kp06d+PTTTwsdjiQpT0o++ZCkmqiuW5A2nP+uklRaSv6u72xXkiRJUn6UfPJhtytJqpmuXbvy0EMPFToMSVIDtkmhA5CkhujpPtvltP19pryV0/YlSSqEkk8+Ksx2VehQJEkNQPzqw0KHUBTSpW0LHYKkArDbld2uJDVwXbt25ZJLLmHnnXemVatWDB8+nBUrVvDRRx9x8MEH07ZtW1q1asXBBx/Me++9V/6+b33rW/zmN79hv/32Y/PNN2fAgAEsXLiwvHzChAl06dKFLbfckosuuqjSOZ999ll69+5Ny5Yt2WqrrTjhhBPKV8VOKXHKKafQrl07tthiC3bbbTdeeuml/PxjSAU0ZcoUDjnkEDp16kREMH78+ErlS5cu5cQTT+RrX/saTZo0YYcdduDKK68sL3/77beJiGq33//+9wAsWLCANm3acPnll1dq++WXX2azzTbjzjvvzPl1Shui5JMPSSoGt912Gw888ABvvfUWs2fP5sILL2T16tUMHz6cd955h7lz59KkSRNOOOGESu+7/fbbGTduHB988AGff/45Y8aMAeCVV17huOOOY8KECcyfP5///Oc/lRKXjTfemCuvvJKFCxcybdo0Hn74YcaOHQvA5MmTmTJlCrNnz2bx4sXcdddd5StoS8Vs6dKl7Lrrrlx99dU0adJkjfJTTz2Vf/7zn0yYMIFXX32Vc845h1/96ldMmDABgK233pr333+/0jZ27FgigiOPPBKADh06cN1113HuuefyyiuvALBy5UqGDh3KYYcdxo9+9KP8XbD0FZh8SFIROOGEE9h6661p3bo155xzDnfccQdbbrklRxxxBE2bNmXzzTfnnHPO4fHHH6/0vuHDh/P1r3+dJk2a8MMf/pCZM2cCcPfdd3PwwQfTp08fGjduzAUXXFBpWtw999yTffbZh0022YSuXbty7LHHlrfdqFEjPvnkE1577TVSSuy0005stdVWefu3kApl4MCBXHzxxRx55JHVTiP91FNP8ZOf/IQDDzyQrl27MnToUPbZZx+eeeYZIJPUd+jQodJ277330q9fP7bZZpvydgYPHsyhhx7K0KFDWbVqFRdccEF5oiLVdyYfklQEtt566/LXXbp0Yf78+Sxbtoxjjz2WLl26sMUWW9CnTx8+/vhjvvjii/K6HTp0KH/dtGlTli5dCsD8+fMrtdmsWbNKTy9mz57NwQcfTIcOHdhiiy349a9/Xd5lq2/fvpxwwgn84he/oF27dowcOZIlS5bk7NqlhmL//fdn0qRJvPvuu0AmGZk5cyYHHXRQtfX//e9/8/DDDzNy5Mg1ysaOHcu8efMYMmQIl1xyCTfddBOtW7fOafxSXSj55MN1PiQVgy9/mQGYO3cuHTt25PLLL+f111/nmWeeYcmSJUyZMgXIjMlYn6222qpSm8uWLeM///lP+f5xxx3HjjvuyBtvvMGSJUu4+OKLK7X7y1/+khkzZvDKK68we/bs8v7qUin7wx/+wB577EHnzp1p1KgR3/zmN/nd737HwQcfXG39m266ibZt23LooYeuUda6dWsuueQS7rrrLn784x8zcODAXIcv1YmSTz4ccC6pGFx33XW89957LFq0iIsuuojBgwfzySef0KRJE1q2bMmiRYsYPXp0jds78sgj+cc//sGTTz7J559/znnnncfq1avLyz/55BO22GILmjdvzmuvvcYf//jH8rLnnnuOZ555hpUrV9KsWTM222wzVzKXgGuuuYannnqKiRMnMmPGDK688kpOP/10/vWvf61Rd9WqVYwbN46jjz6aRo0arVG+evVqxo0bR9OmTXnuuedYsWJFPi5B2mB+G0hSETjqqKMYMGAA2267Ldtttx3nnnsuJ598MsuXL6dNmzbss88+a+3aUZ1ddtmF6667jqOOOoqtttqKVq1a8bWvfa28fMyYMdx+++1svvnmjBgxgsGDB5eXLVmyhBEjRtCqVavy2bLOOOOMOr1eqaFZvnw5Z599NpdddhmDBg1i991354QTTuBHP/pR+UQPFU2aNIkFCxZwzDHHVNveVVddxYsvvshzzz3H0qVLOeecc3J9CVKdiJo8fi8FvXr1StOnTy90GJLqoVdffZWddtqp0GGsVdeuXbnpppvo169foUP5Stb27xsRM1JKvWrQRF6/yFzno24U+zofzZs359prr2XYsGFAJilv0aIFkyZNqtTN6thjj+WNN97gkUceqfT+gQMHsmzZMh577LE12n711Vfp2bMnN910E0OGDGHy5MkMHDiQxx9/nP322y+XlyXVVKytoOQXGZQkSaoLS5cu5c033wQy3aLmzp3LzJkzad26NZ07d+ab3/wmv/rVr2jevDldunTh8ccf59Zbb+Wyyy6r1M7cuXN54IEHuPXWW9c4x6pVqzj66KP53ve+x5AhQwAYMGAAxxxzDMOHD2fmzJk0bdo09xcrfUUl3+3KAeeSJKkuTJ8+nR49etCjRw+WL1/OqFGj6NGjB+eddx4Ad955J3vttRdDhgxh55135tJLL+WCCy5YY/2dm2++mRYtWnDEEUescY5LLrmEd955p9I4K8h0hVy1ahVnn3127i5QqgN2u8qy25Wktanv3a4aOrtdlaZi73Yllbi1drsq+ScfkiRJkvLD5EOSJElSXph8SJIkScoLkw9JkiRJeWHyIUmSJCkvXOdDkiQVPWcpqxvOUqYNVfLJR0QMAgZ169at0KFIakBy/YuMX/CSpGJU8t2uUkqTUkojW7RoUehQJEmSpKJW8smHJDV0Xbt2ZcyYMey+++60aNGCwYMHs2LFCsaPH8/+++9fqW5E8OabbwIwbNgwjj/+eL773e/SvHlz9ttvPxYsWMDJJ59Mq1at2HHHHXnhhRcqneeSSy5h5513plWrVgwfPpwVK1YAsOuuuzJp0qTyuitXrqRNmzaV3i9JksmHJBWBu+66i3/961/MmTOHWbNmMX78+Bq/78ILL2ThwoU0btyY3r1707NnTxYuXMiRRx7JqaeeWqn+bbfdxgMPPMBbb73F7NmzufDCCwEYOnQo//M//1Ne77777mOrrbaiR48edXaNkqSGz+RDkorAL3/5Szp27Ejr1q0ZNGgQM2fOrNH7vv/977Pnnnuy2Wab8f3vf5/NNtuMoUOHsvHGGzN48OA1nlyccMIJbL311rRu3ZpzzjmHO+64A4D/9//+H/fddx9LliwBYMKECfzkJz+p02uUJDV8Jh+SVAQ6dOhQ/rpp06YsXbq0Ru9r3759+esmTZqssV+1na233rr8dZcuXZg/fz4AHTt2ZL/99uOee+7h448/5v7772fIkCFf6VokScWr5Ge7kqRi1axZM5YtW1a+v2DBgg1u89133y1/PXfuXDp27Fi+f/TRR3PTTTexatUqevfuTadOnTb4fJKk4uKTD0kqUnvssQcvv/wyM2fOZMWKFZx//vkb3OZ1113He++9x6JFi7jooosYPHhwedlhhx3G888/z9VXX83QoUM3+FySpOJTtMlHRPxvRHwUEXcXOhZJKoSvf/3rnHfeefTr14/tt99+jZmvvoqjjjqKAQMGsO2227Lddttx7rnnlpc1adKEI444gjlz5nD44Ydv8LkkScUnUkqFjiEnIuJbwObA0SmlI9dXv1evXmn69Om5DktSA/Tqq6+y0047FTqMguvatSs33XQT/fr1W2ud3/72t8yePbvSzFfrs7Z/34iYkVLqVYMm8vpF5krZdSPfC2n6udUNF0BVDcXaCor2yUdK6THgk0LHIUmlYtGiRdx8882MHDmy0KFIkuqpvCcfEdEnIiZGxLyISBExrJo6x0fEnIhYEREzIuKAfMcpSaq5G2+8ka233prvfve79OnTp9DhSJLqqULMdtUceAm4NbtVEhGDgauB44Ensz/vj4idU0pzs3VmUn3sA1JK83MUtySVtLfffnutZSNGjGDEiBH5C0aS1CDl/clHSum+lNKvU0p3A6urqXIqMD6ldGNK6dWU0onA+8BxFdronlLatZqtVolHRIyMiOkRMf3DD+0LKkmSVGqmTJnCIYccQqdOnYgIxo8fv0ad2bNnc/jhh9OyZUuaNm1Kz549efXVV8vLR4wYwXbbbUeTJk1o27Ythx56aKXyl156ic0224x77rmnUrsPPfQQjRo1YurUqTm7vvqmXo35iIhNgT2ByVWKJgP71vX5Uko3pJR6pZR6tW3rACpJa1esk3MUmv+ukgpt6dKl7Lrrrlx99dU0adJkjfI5c+aw3377sc022/DII4/w0ksvceGFF9K8efPyOr169WL8+PG8+uqrPPDAA6SU6NevHytXrgRg1113ZfTo0fz85z+nrKwMgMWLFzN8+HBOO+009ttvv/xcbD1Q0NmuImIpcEJKaXx2vyMwD/hmSmlKhXrnAUNSSjvUou2HgD2AZsAi4AcppWnV1BsEDOrWrduIN954Y0MuR1KRevPNN+nYsSNNmzYtdChFZ9myZcyfP59u3bqtUeZsV8XN2a4apmKf7ap58+Zce+21DBs2rPzYUUcdRURw22231bidWbNmsccee/Daa6+xww6ZX19Xr17NAQccQJs2bfj73//O0KFDmTlzJtOnT2fTTTet60sptJKc7apfSqltSqlpSulr1SUe2XqTUkojW7Roke8QJTUQ7dq1Y968eSxbtsy/1NeRlBLLli1j3rx5tGvXrtDhSFK1Vq9ezaRJk9h555056KCDaNu2LXvttRd/+ctf1vqeTz/9lHHjxtG5c2e6du1afnyjjTbiz3/+Mw899BBDhgzhzjvv5NZbby3GxGOdCjHgfF0WAl8A7ascbw8syH84kgRbbLEFAPPnzy9/hK4N16hRI9q3b1/+7ytJ9c0HH3zA0qVLufjii7ngggu49NJLeeSRRxgyZAjNmzfne9/7XnndsWPHcuaZZ/Lpp5+yww478PDDD9O4ceNK7XXr1o0zzjiD0aNH85vf/Ibu3bvn+YoKr14lHymlzyNiBtAf+GuFov7APdW/a8NU6HaVi+YlFYktttjCX5IlqcSsXp2ZG+nQQw/l1FNPBaB79+5Mnz6da6+9tlLyMWTIEPr378/777/PmDFj+MEPfsDUqVMrddldvnw5d9xxB02bNuXJJ58kpUTEWnsoFaVCrPPRPCK6R0T37Pk7Z/c7Z6tcAQyLiGMiYqeIuBroCPwpF/HY7UqSJEnVadOmDZtssgk777xzpeM77bQTc+fOrXSsRYsWbL/99vTp04e7776b2bNnrzG71VlnncWqVat49tlnyxOYUlOIMR+9gBeyWxNgdPb1bwFSSn8BTgbOBWYC+wMDU0rv5CKYiBgUETcsXrw4F81LkiSpgdp0003Za6+9eP311ysdnz17Nl26dFnr+1JKpJT47LPPyo89+uijjB07lvHjx7PLLrtw+eWX86tf/Yq33norZ/HXR3nvdpVSeox1jIDP1hkLjM1TPJOASb169XJ1LEmSpBKzdOlS3nzzTSDTzWru3LnMnDmT1q1b07lzZ84880x++MMfcsABB9C3b18effRR7rzzTv72t78BmRkR77nnHvr160fbtm157733uPTSS2ncuDEHH3wwAJ988gnDhw/npJNO4oADDgAya4Pcc889DB8+nMcee4yNNiraeaAqKY2rlCRJkqoxffp0evToQY8ePVi+fDmjRo2iR48enHfeeQAcdthh3HDDDYwZM4bddtuNa665hltvvbV8vEfjxo157LHH+O53v0u3bt0YPHgwm2++OdOmTaNDhw4AnHzyyTRt2pSLLrqo0rlvvvlmXnzxRa6++ur8XnQBFXSdj/rAdT4kqX5ynY/i5jofDVOxr/OhOlN663zUlAPOJUmSpPwo+eRDkiRJUn6YfEiSJEnKi5JPPpxqV5IkScqPkk8+HPMhSZIk5Ufe1/mQJEmSasJZyupGfZqlrOSffEiSJEnKj5JPPhzzIUmSJOVHyScfjvmQJEmS8qPkkw9JkiRJ+WHyIUmSJCkvTD4kSZIk5UXJJx8OOJckSZLyo+STDwecS5IkSflR8smHJEmSpPww+ZAkSZKUFyYfkiRJkvJik0IHIElSoSxfvpy33noLgO22244mTZoUOCJJKm4++ZAklZzPPvuMk08+mdatW7PHHnuw++6707p1a0466SRWrFhR6PAkqWj55EOSVHKOO+44Jk+ezE033UTv3r0BmDZtGmeffTaffPIJt9xyS4EjlKTiVPLJR0QMAgZ169at0KFIkvLkr3/9K/feey/9+/cvP7btttvSrl07jjjiCJMPScqRku925TofklR6mjVrRqdOndY43qlTJ8d9SFIOlXzyIUkqPSeeeCKjR49m+fLl5ceWL1/OBRdcwIknnljAyCSpuJV8tytJUul5+umnefzxx+nUqRO77747AC+++CKrVq3i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vEo++ZAklZ6rrrqKCy+8kJEjR5JSKj/eqVMnrr322gJGJknFzeRDklRy/vSnP3HjjTdy0kknsckm/+2B3LNnT15++eUCRiZJxc3kQ5JUct555x123XXXNY43atSI5cuXFyAiSSoNJh+SpJKz7bbb8vzzz69x/L777mPnnXcuQESSVBpqNNvVlyKiPfATYDvgNymlhRGxHzA/pTQnFwFKklTXTj/9dE444QSWLVtGSolp06YxYcIELrvsMm655ZZChydJRavGyUdE7Ak8DMwBdgF+T2atj/7A14GjchGgJEl1bfjw4axatYpf//rXLFu2jJ/85Cd07NiRP/zhDwwePLjQ4UlS0arNk48xwNUppVER8UmF4w8Aw+s2rPxxnQ9JKk0jRoxgxIgRLFy4kNWrV9OuXbtChyRJRa82Yz72BP5czfH3gfZ1E07+uc6HJJWut956i6effppnn322fK0PSVLu1ObJx3KgVTXHdwQ+qJtwJEnKvf/85z/87Gc/Y+LEiWy0UebvcCklDj74YG655Ra23HLLAkcoScWpNk8+/g6MiojG2f0UEV2B3wH31HVgkiTlyjHHHMObb77JE088wYoVK1ixYgVTpkxhzpw5jBgxotDhSVLRqs2Tj9OB+4APgabAk2S6W00Fzq370CRJyo0HHniAhx9+mN69e5cf22+//bj++uvp169fASOTpOJW4+QjpbQE2D8i+gI9yTw1eT6l9FCugpMkKRfatm1Ls2bN1jjetGlTu1xJUg7VepHBlNIjKaUxKaXLTDwkSQ3Reeedx8knn8y8efPKj82bN4/TTjuN8847r4CRSVJxq+0igz2AA4F2VElcUkpn1mFcX1lEtAQeInNtm5CZHvjGggYlSapXrrrqKt5++226du1Kp06dgEzysdlmm/HBBx/whz/8obzurFmzChWmJBWd2iwyeCZwKfAOUAakCsWp2jcVxidAn5TSsohoBrwUEfemlP5T6MAkSfXDkUceWegQJKkk1ebJxynAcSml63MVTF1IKX0BLMvuNgYiu0kqUU/32a7QIazXPlPeKnQIJWXUqFGFDkGSSlJtko+NgIc35GQR0YfMrFl7Ah2B4Sml8VXqHA+cAWwFvAycnFJ6opbnaQk8DmwPnJFSWrghcde1hvCLEPjLUFV+blLx+PDDD4HMwHOAF198kb/85S/ssssu/PjHPy5k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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation import IsNull\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"X\",\"Y\"]\n", - "#sf_crime_df = sf_crime_df[columns]\n", - "objs = [IsNull(columns=[\"X\", \"Y\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"IsNull\")" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABCPElEQVR4nO3deZhUxdmw8ftRUTYF2ZcoqBB3BcQoEYkSQGNEX5fIG00U/QQjccU9GtEoxBg07knUCGrUN25JQDGicUFxCyjuiguKAg4girIpOvX90c1kZhiWgZnume77d13nmj6nqus8zdEz83SdqoqUEpIkSZJU2zbIdwCSJEmSioPJhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSSogETEgIh6KiE8jYllETI+I30XE5rV83ici4ulVlB0fESkiOlezzeYRcVFE9KiRICVJeWfyIUkFIiJ+BTwMLAOOB/YD/gQMBv4TEVvkL7p10hwYAZh8SFKB2CjfAUiS1l9E7AtcClyVUjq9XNGTEfF3YCpwG7BvPuKTJAns+ZCkQnE2sAA4r3JBSmkGcBmwT0TsAZB9DOrSiDglImZExJcR8WRE7Fj5/RFxaEQ8FxFLIuLziLgnIrZcn2Aj4/SIeDsivo6IORFxXURsli3vDMzIVr8pG2+KiMHrc15JUn6ZfEhSPRcRGwE/AB5JKS1bRbVx2Z99yx37GfBj4FTgWGBL4J/Z9la0/QvgPuAN4HDgBGAnMj0qm1YVS+WNqn/XjASuBB4BBgKXk3k87MGI2ACYAxyarftboFd2e3A1/xSSpDrOx64kqf5rCTQCPlhNnRVl5cd9LAcOTCktB4gIgHuA7wHPRERT4HfAmJTScSveFBEvAG8D/w+4qlx7e2XbXK2IaAGcAdyaUjope/jhiJgH3J6NaVxEvJQtez+l9Nya2pUk1X32fEhS8XpkReKR9Wr254pHqnoBmwF3VOrJ+Ah4C+hTqb2Xgd2r2C6tVG9PYGPgr5WO/x/wDZleHElSAbLnQ5Lqv0/JzHDVeTV1VpR9VO7Ygkp1vsr+bJj92Sb789FVtPlZpf1FKaUplStFRLdKh1pkf84pfzCl9E1EfFquXJJUYEw+JKmey/7R/iTQPyIarmLcx0HZn49Vo+lPsz8HA69XUf5lNdoqb0XS0658u9lelZasnBRJkgqEj11JUmEYTeYP91GVCyJiK+AcYFJK6flqtPkMmQSjS0ppShXb2+sY63PA18D/Vjo+iMyXYk9k91f0xDRax/NIkuoYez4kqQCklB6NiBHAxdlpam8j81hUD+BcYCHw82q2+UVEnAVcHxGtgYey7XQkMy7jiZTSnesQ64KIuAI4LyIWAxOA7cmMDXma/85oVUKm9+V/I+IVYDEwI6X0aRXNSpLqAXs+JKlApJR+A/wIaAKMASYCw8gkIj1TSjPXoc0/k3lka1syM1FNAC4i8+XVtPUI93xgeDbeB8gkSLcBP04plWbPXUpmpfbNyYw7+Q+ZaXklSfVUpJTyHYMkSZKkImDPhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEwWXfETEgRHxdkS8ExHH5zseSZIkSRmRUsp3DDUmIjYC3gD2BRYCU4Hvp5Q+zWtgkiRJkgqu5+N7wOsppVkppUXAQ8CAPMckSZIkiTqWfEREn4gYFxGzIiJFxOAq6gyLiBkRsSwipkbE3uWKOwCzyu3PAjrWctiSJKnIrOXfLN+NiPsj4vOIWBIRL0bE9pXqfC8iHomIRRHxZUQ8ExGtypX3yJZ/HhGfRsSNEdG0XPmAiFgeEXtUavf4bJvb1MLHl9ZZnUo+gKbAa8CpwNLKhRExCLgaGAV0B54BHoqILXMZpCRJKnpr+ptlK2AyMAPoC+wEXAAsKldnD2Ai8ASwJ7AbMBpYni3vADwKvA/sAewP7AiMXdFGSmkicDNwa0Q0yr6vM3AlcGZK6b2a+sBSTaizYz4iYhFwUkppbLljzwOvpJSGlDv2DnBvSum8iPg+cFZK6ZBs2VXACymlO3MavCRJKhqr+JvlTiCllI5azfueAR5PKZ2/ivKhZL5wbZtS+jZ7bGfgFaBrSund7LEmwMvAg8BpwOPAspTS/uv/6aSatVG+A1hbEbEx//1GoLyJwPezr18AdoqIjmQGnP8IuGQ1bQ4FhgI0adJkt+22266mw5YkraOpU6fOTym1XouqdfNbNBWNJk2acN11140BxgCUlpbStGlTzj33XPbff/8jp06dSufOnTnzzDMZNGgQAHPnzgXg2muv7dW7d+9fTZ8+nW233ZaLLrqIH/7whwBcc801jBo1ijlz5nyz4lzvvPMOXbt2ZcyYMe+sOJZS4umnn2afffY55YgjjjjloYce4rXXXgP/31D+xKoK6k3yAbQCNgRKKh0vAfoBpJS+iYgzyGT8GwCXr26mq5TSjcCNAD179kxTpkypjbglSesgIj7MdwzSupg7dy6LFi1i1KhRXHLJJVx22WU89thjHHXUUTRt2pQf//jHvP/++wCMGDGC3//+93Tv3p177rmH/fbbj6lTp7LrrrvSt29fhg8fzmWXXcbw4cNZvHgx5557LgBz5sypcM7evXvzs5/9jFtvvZW//OUvdOzokFfVTXVtzMd6SymNSyl9N6XUJZtcrFZEDIyIGxcuXJiL8CRJqmDSpEkcdNBBdOzYkYhg7NixK9WZPn06hx56KM2bN6dx48b06NGDN998s6x8yJAhbLPNNjRq1IjWrVtz8MEHVygH6Ny5MxFRYVvxhyzAxIkTadCgAc8//3yF99188800bdqU995z6MDaKi0tBeDggw9m+PDhdOvWjeHDh3PEEUdw3XXXVahzwgkncNxxx9G9e3dGjRrF7rvvzp/+9CcAdtxxR2699VauuuoqGjVqRLt27dhqq61o27YtG2xQ8U+4kpISHnzwQRo3bsykSZNy+Gml6qlPycd84FugbaXjbYFP1rXRlNL4lNLQZs2arU9skiStk0WLFrHTTjtx9dVX06hRo5XKZ8yYwV577cVWW23FY489xmuvvcall15K06ZlEx7Rs2dPxo4dy5tvvsnDDz9MSol+/fqxfPnyCm1deOGFzJkzp2y74IILysoGDBjA8ccfzzHHHMPSpZnx0x988AHDhw9n9OjRbLONkyatrVatWrHRRhuxww47VDi+/fbbM3PmTADat28PsFKdHXbYoawOwJFHHsknn3zC7Nmz+fTTT7nooouYN28eW2+9dYX3DR06lK5du/Loo4/y17/+lfHjx9fGR5PWW7157Cql9HVETAX6A/eUK+oP3Leu7UbEQGBgly5d1jNCSZKq74ADDuCAAw4AYPDgwSuVn3/++QwYMIArrrii7FjlPzxPOOGEstedO3fm0ksvZdddd+X9999n2223LSvbdNNNadeu3SpjGT16NLvuuivnnnsuV111FYMHD+b73/8+v/jFL9b14xWljTfemN1335233367wvHp06fTqVMnIHOdOnToUGWdnXfeeaU227bNfPd6yy230LBhQ/r3719WNnbsWB599FGmTZtG165dOeecczjhhBPYa6+9aNGiRU1/PGm91Kmej4hoGhHdIqIbmdi2zO6vmEr3SmBwdu7q7SPiajJre/xpXc9pz4ckqa4qLS1l/Pjx7LDDDuy///60bt2a3Xffnb/97W+rfM/ixYsZM2YMW265JZ07d65QNnr0aFq2bEm3bt0YOXIkX3/9dYXyJk2aMHbsWK6//nqOOuooXn75Zf7yl7/Uxker9xYtWsS0adOYNm0apaWlzJw5k2nTppX1Wpx99tn87W9/48Ybb+Tdd9/lpptu4v/+7//45S9/CUBEcNZZZ3HNNddwzz338O677zJq1Ciee+65Csnkddddx9SpU5k+fTrXX389J510Er/97W9p3rw5AB999BGnnnoql112GV27dgUy40hatWrFySefnNt/FGkt1KmpdiNiHzKDxSu7NaU0OFtnGHA20J7M/Nqnp5TW++FGB5xLWpXS0lLmz5/P559/zrfffpvvcArGhhtuSPPmzWnVqtVKz68DRMTUlFLPtWiq7vwiW09NmzbluuuuK+sB+eSTT2jfvj2NGzfmkksuoW/fvjz22GOcffbZ/POf/+THP/5x2XtvuOEGzj77bBYvXsy2227LAw88QPle/SuvvJLu3bvTsmVLXnjhBc4991z+53/+h5tvvnmlOAYPHlw2cPm4446r9c9dHz3xxBPsu+++Kx0/5phjysbtjB07llGjRvHRRx/RtWtXzjvvPH76059WqP+73/2O66+/nk8//ZQdd9yRUaNG0a9fv7Lyo48+mgcffJBFixax3XbbceaZZ/Lzn/8cyMxyNWDAAEpLS3n00UeJ+O8EQ9OmTeN73/sef/vb3zjkkENq4V9AWq1VznZVp5KPfCj32NWQd955Z431JRWfmTNnEhG0bduWBg0aVPgFr3WTUmL58uWUlJSQUmLLLVdeK9bkA2bPnk3Hjh356U9/yp13/nfJqiOPPJLPPvuMhx56qOzYwoULmTt3LnPmzGH06NF89NFHTJ48mcaNG1d5rrvvvptBgwYxf/58WrZsWXa8pKSEnXbaiSVLlvCTn/ykygHwkrQGq/xFWaceu8oHH7uStCaLFy+mY8eObLzxxiYeNSQi2HjjjenYsSOLFy/Odzh11toMXF6hWbNmdO3alT59+nDvvfcyffp07rtv1UMi99hjDwDefffdCscduCypNtWbAeeSlE9VPRak9ee/6+qtzcDlqqSUSCnx1VdfrbLOtGnTgP/OugQOXJZU+4r+ru86H5KkfFrfgcvvvvsuv/vd75g6dSozZ87kmWee4Sc/+QmbbLIJBx54IADPPvssf/jDH5g2bRozZszg7rvvZtiwYRx00EFlj7w5cFnFYE3r6gwePHil9XD23HPPCnU++eQTfv7zn9OuXTsaN27Mrrvuyh133FGhzsiRI9lrr71o0qRJlT3mRb2uzopvR4p922233ZIkVeWNN97Idwh1QqdOndIjjzxS4+2u6t8XmJLW7h5erz3++OOJzLiVCtsxxxxTVmfMmDGpa9euqWHDhmnnnXdOd955Z1nZzJkz0/77759at26dGjRokL7zne+kI488Mr355ptldaZOnZr22GOP1KxZs9SwYcO07bbbphEjRqTFixenlFIqLS1N/fr1S3379k2lpaUV4nvppZdSgwYN0v3331+7/xBSDjz44IPpvPPOS/fcc09q1KhRGjNmTIXyY445JvXr1y/NmTOnbPv0008r1Onfv3/abbfd0nPPPZfee++9NHr06BQR6cknnyyr8+tf/zqNHj06/epXv0qZP7dX9otf/CJtu+22acmSJSmllGbMmJE23XTT9Mc//rFmP3R+rPKeXfQDzldwtitJq/Lmm2+y/fbbVzj2XJ/aXXBtz0l171uvzp07c/PNN1eYiacmVPXvC8U54FxS7lSe4AEyPR/z58/ngQceWO37rr32Wo499tiyY506deLkk0/mzDPPrFD33nvv5Sc/+QlV/b29ePFidt11V3784x9z1VVXse+++9KwYUP+9a9/rf+Hy79VDpAs+jEfLjIoSVLhi3Pn5TuEgpAua53vEGrd008/TZs2bWjevDk/+MEPGDlyJG3atCkr7927N3fffTcHHXQQm2++OePHj2fevHnV/mJmxbo6++yzD/PmzePll1/mtddeq+mPU+cU/ZiP5GxXkuq5zp0789vf/pYddtiBzTffnGOPPZZly5bx2WefceCBB9K6dWs233xzDjzwQD7++OOy9+2zzz78+te/Zq+99mLTTTdlwIABzJ8/v6z89ttvp1OnTrRs2ZKRI0dWOOcLL7xAr169aN68Oe3bt+ekk04qW7AupcTpp59OmzZt2Gyzzdh5552L4heqpPpv//3357bbbuPf//43V1xxBS+88AJ9+/atMHnD3XffTUTQqlUrNtlkE4466ijuuusuunXrVu3z9e7dm5/97GfcddddXHHFFXTs2LEGP03dVPTJhyQVgjvuuIOHH36Y9957j+nTp3PppZdSWlrKsccey4cffsjMmTNp1KgRJ510UoX33XnnnYwZM4a5c+fy9ddfM3r0aADeeOMNTjzxRG6//XZmz57Np59+WiFx2XDDDfnDH/7A/PnzefbZZ/n3v//NDTfcAGQGUk6aNInp06ezcOFC7r777grrSEhSXfW///u/HHTQQey8884MHDiQhx56iLfffpsHH3ywrM4FF1zA/PnzefTRR5kyZQpnnXUWRx99NC+//HK1z1dSUsKDDz5I48aNmTRpvdfMrhdMPiSpAJx00klsscUWtGjRgvPPP5+77rqLli1bcthhh9G4cWM23XRTzj//fJ588skK7zv22GP57ne/S6NGjTjiiCPKpl+99957OfDAA+nTpw+bbLIJl1xySYVpcXfbbTf23HNPNtpoIzp37swJJ5xQ1naDBg348ssveeutt0gpsf3221eYzlWS6osOHTrwne98hxULUb/33ntce+213HTTTfzwhz9k1113ZcSIEey+++5ce+211W6/GNfVMfmQpAKwxRZblL3u1KkTs2fPZsmSJZxwwgl06tSJzTbbjD59+vD555/z7bffltVt165d2evGjRuzaNEiILOydvk2mzRpUqH3Yvr06Rx44IG0a9eOzTbbjF/96ldlj2z17duXk046iV/+8pe0adOGoUOH8sUXX9TaZ5ek2jJ//nxmzZpV9gXKkiVLgEzvb3kbbrghpaWl1Wp7xbo6t956K7169SpbV2fBggU1E3wd5YBzB5xLKgAfffRR2euZM2fSoUMHrrjiCt5++22ef/552rVrx7Rp0+jevXuVs65U1r59e958882y/SVLlvDpp5+W7Z944ol0796du+66i0033ZSrrrqKe++9t6z8lFNO4ZRTTmHu3LkcccQR/P73v+eSSy6poU+bXw5crhnFMHBZdc+iRYt49913ASqsq9OiRQtatGjBRRddxGGHHUb79u354IMPOO+882jTpg2HHHIIANtttx1dunRh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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation import OneHot\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Category\"]\n", - "sf_crime_df = sf_crime_df[columns]\n", - "objs = [OneHot(categories_dict={\"Category\":['WARRANTS', 'OTHER OFFENSES', 'LARCENY/THEFT', 'VEHICLE THEFT',\n", - " 'VANDALISM', 'NON-CRIMINAL', 'ASSAULT', 'BURGLARY',\n", - " 'SUSPICIOUS OCC', 'MISSING PERSON']})]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OneHot\")" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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PXv2TFOmTMlF3JKkdRARHxY6htrg66+/pqSkhBYtWlR6ftGiRfzlL39Z+SW21F577cWYMWM46aST6NSpE8899xzTpk3j3HPPLVdu+PDhdO/eneOOO46VX2JbtmyJ1s+QIUPo0aMHvXr1qvT8qFGj+O677zjhhBNKj2233XZ07tyZ3/zmN9xxxx00bdqU6667jo8//pjZs2eXe3/Lli258sorGTBgAD/72c845JBDcno/Uk2pbWM+1ltKaXRKaZuUUrdscrFGEdEvIm5fsGBBPsKTJKla1uVLLMCNN97ILrvsQufOnWnYsCE/+tGP+L//+z8OPfTQcuVWfom9//77+e///m+/xNaAs846i0mTJvHQQw/RoEGDSsvccccd/PSnP6V16/807jVs2JCHH36Y999/n80335zGjRszYcIEDj74YDbYoPxXtpKSEu655x4aN27Myy+/zNKlS3N6T1JNqUvJxzxgBdC2wvG2ZPpCrpOU0piU0qDmzZuvT2ySJNW4df0SC3DTTTfx3HPPMXr0aKZOncp1113HOeecw2OPPVaunF9ia9aZZ57Jfffdx/jx49lyyy0rLTNt2jSmTJnCwIEDVzm3++67M23aNL766itmz57NY489xhdffLFKXddffz2vvfYaL7/8MosWLeKCCy7Iyf1INS6lVCs3YBFwYoVjLwK3Vzg2A7hyPa7TD7i9W7duSZJUewBTUtWe5fXSGWeckdq1a5feeuut1ZZ59dVXE5DGjRtX7vjixYtTw4YN0yOPPFLu+C9+8Yu03377lTt2zTXXpBYtWqQ33ngjfe9730tnnXVWzd1EkTn99NNT27Zt05tvvrnGcieffHLaYostUklJyVrrnDFjRtpggw3S448/XnrszTffTJtsskn685//nFJK6fHHH08NGjRIkyZNWr8bkGrOap/ZtarlIzstYI+I6EGmVaZzdn/lVLrXAidGxEkRsX1E3EBmbY9b1/WayZYPSVItM2TIkNK/nq9pMpTbb7+dLbbYgv3337/c8WXLlrFs2bJVWksaNGhASUlJ6f5bb73FBRdcwE033cQOO+zAXXfdxQ033MDkyZNr9oaKwCmnnMI999zDqFGjaNGiBXPmzGHOnDksWrSoXLnFixdz77338otf/ILMzLrlPfDAA0yYMIF///vf/P3vf+eAAw7gsMMOo2/fzBwEy5cv54QTTuDHP/4xxx13HAB9+/blpJNOYsCAASxevDj3Nyuth1o11W5E7ENmsHhFf0wpnZgtMxj4NZn5sV8HzkwpTVzfazvgXNLqlJSUMG/ePL766itWrFhR6HDqjQYNGrDZZpvRqlWrVfqzA0TE1JRSzypUVXt+kdWAU045hZEjR/LII4+www47lB5v2rQpTZs2Ld1fvHgx7du359e//nWlXW722Wcf5s2bx80330yXLl145plnOPnkk7nqqqs47bTTWL58OT/84Q/p3LkzDz74YOn7fvWrXzF+/HimTZtG48aNc3uz9UhliQTA0KFD+e1vf1u6f8899zBw4EBmzZpFhw4dVil/44038vvf/565c+fSvn17jj/+eC666CI22mgjAC699FJuvvlmXn/99XJd7RYtWsTOO+9Mv379uOGGG2r25qTqW+1sV7Uq+SiEiOgH9OvWrdvAd999t9DhSKqFZs2aRUTQtm1bGjZsuNovGaq6lBLLli1j7ty5pJTo3HnVtWKLNfmoqS+xc+bM4fzzz2fcuHHMnz+fLl26cNJJJ3H22WcTEX6JlZRLJh9rY8uHpNV566232HbbbSv967zWT0lJCe+88w7bb7/9KueKNfmQpHpgtcmHv0klqQpMPHLDn6skFZeif+q7zockSZKUH0WffDjblSRVTdeuXXnyyScLHYYkqQ7bsNABSFJd9ELvrXJa/x4T389p/ZIkFULRJx9lZrsqdCiSJClH4n8/L3QI9UL6Xeu1F5LWoOiTj5TSGGBMz549BxY6FklaF127duWXv/wlI0eOZPbs2Rx22GH84Q9/YMmSJfzsZz/jxRdfZPny5ey5557ceuutfO973wMy60DsvffejB8/nunTp9OrVy9GjRpFq1atABg5ciQXXnghixYt4qyzzip3zZdeeokhQ4bw1ltv0ahRI4488kiuvfZaNtpoI1JKnHXWWdx7770sXbqULl26cN9997Hjjjvm/WeTC36JrRl+iZWKU9GP+ZCk+uDee+/l8ccf5/3332fGjBlcdtlllJSUMGDAAD788ENmzZpFo0aNOPXUU8u9b9SoUdxzzz189tlnfPfdd1x99dUAvPnmm5x88smMHDmSTz/9lC+++IKPP/649H0NGjTguuuuY968eTz//PM89dRTDB8+HIBx48YxceJEZsyYwYIFC7j//vvZfPPN8/fDkCTVWiYfklQPnHrqqXTq1ImWLVtywQUXcN9997H55ptz5JFH0rhxYzbddFMuuOACnnnmmXLvGzBgANtssw2NGjXi6KOPZtq0aQA8+OCDHHroofTu3ZuNN96YSy+9tNy0uLvvvjt77LEHG264YWnLy8q6GzZsyNdff83bb79NSontt9+e9u3b5+1nIUmqvUw+JKke6NSpU+nrLl268Omnn7J48WJ++ctf0qVLF5o1a0bv3r356quvWLFiRWnZdu3alb5u3LgxixYtAuDTTz8tV2eTJk3KtV7MmDGDQw89lHbt2tGsWTN+85vfMG/ePAD69OnDqaeeyimnnEKbNm0YNGgQCxcuzNm9S5LqjqJPPlznQ1J98NFHH5W+njVrFh06dOCaa67hnXfe4cUXX2ThwoVMnDgRgJTWviB4+/bty9W5ePFivvjii9L9k08+me222453332XhQsXcsUVV5Sr9/TTT2fq1Km8+eabzJgxg9///vc1cZuSpDqu6JMP1/mQVB/ccsstfPzxx8yfP5/LL7+c/v378/XXX9OoUSM222wz5s+fz7Bhw6pc31FHHcU//vEPJk2axHfffcfFF19MSUlJ6fmvv/6aZs2a0bRpU95++23+8Ic/lJ57+eWXefHFF1m2bBlNmjRhk002cSVzSRJg8iFJ9cKxxx5L37592XLLLdlqq6248MILOeOMM1iyZAmtWrVijz324KCDDqpyfd27d+eWW27h2GOPpX379rRo0aJ0liyAq6++mlGjRrHpppsycOBA+vfvX3pu4cKFDBw4kBYtWtClSxc233xzzj333Bq9X0lS3RRVaX4vBj179kxTpkwpdBiSaqG33nqL7bffvtBhrFbXrl2588472X///QsdyjpZ3c83IqamlHpWoYq8/iJzqt2ake+pdv3caoZTJKuKYnUnbPmQJEmSlBdFn3w44FySJEnKD1c4d4VzSXXcBx98UOgQJEmqkqJv+ZAkSZKUHyYfkiRJkvLC5EOSJElSXph8SJIkScoLkw9JkiRJeWHyIUmSJCkvin6q3YjoB/Tr1q1boUORVIfkerVkVxGWJNVHRd/ykVIak1Ia1Lx580KHIkmSJNVrRZ98SFJd17VrV66++mp23nlnmjdvTv/+/Vm6dCkjRoxgr732Klc2InjvvfcAOPHEExk8eDAHH3wwTZs2Zc8992TOnDmcccYZtGjRgu22245XX3213HWuvPJKdthhB1q0aMGAAQNYunQpADvuuCNjxowpLbts2TJatWpV7v2SJJl8SFI9cP/99/PYY48xc+ZMpk+fzogRI6r8vssuu4x58+ax8cYb06tXL3bbbTfmzZvHUUcdxVlnnVWu/L333svjjz/O+++/z4wZM7jssssAOP744/nzn/9cWm7s2LG0b9+eXXfdtcbuUZJU95l8SFI9cPrpp9OhQwdatmxJv379mDZtWpXed/jhh7P77ruzySabcPjhh7PJJptw/PHH06BBA/r3779Ky8Wpp55Kp06daNmyJRdccAH33XcfAP/zP//D2LFjWbhwIQAjR47kZz/7WY3eoySp7jP5kKR6oF27dqWvGzduzKJFi6r0vrZt25a+btSo0Sr7Fevp1KlT6esuXbrw6aefAtChQwf23HNPHnroIb766iseffRRjjvuuHW6F0lS/WXyIUn1VJMmTVi8eHHp/pw5c9a7zo8++qj09axZs+jQoUPp/gknnMCf//xnHnjgAXr16kXHjh3X+3qSlEtXXnkl//Vf/0WzZs1o3bo1/fr14/XXXy9X5qKLLmK77bajSZMmtGjRgv3224/nnnuuXJl99tmHiCi3HXPMMaXnX3/9dTbZZBMeeuihcu978sknadiwIZMnT87dTdYyJh+SVE/tsssuvPHGG0ybNo2lS5fy29/+dr3rvOWWW/j444+ZP38+l19+Of379y89d9hhh/HKK69www03cPzxx6/3tSQp155++mkGDx7Mc889x/jx49lwww3Zf//9mT9/fmmZbbfdlltuuYXXXnuNSZMmscUWW3DQQQcxd+7ccnUNGDCA2bNnl2633XZb6bkdd9yRYcOG8atf/ar0fQsWLGDAgAGcffbZ7Lnnnvm54Vqg3iYfEfG3iPgyIh4sdCySVAjbbLMNF198Mfvvvz9bb731KjNfrYtjjz2Wvn37suWWW7LVVltx4YUXlp5r1KgRRx55JDNnzuSII45Y72tJUq49/vjjDBgwgB133JGddtqJkSNH8vnnn5drifif//kf9ttvP7bccku6d+/Otddey9dff73K2LrGjRvTrl270q3iMg7nnnsu22yzDYMGDQLgtNNOo0WLFlxyySU5v8/aJFJKhY4hJyJiH2BT4ISU0lFrK9+zZ880ZcqUXIclqQ5666232H777QsdRsF17dqVO++8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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation import PlaneRotation\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"X\",\"Y\"]\n", - "#sf_crime_df = sf_crime_df[columns]\n", - "objs = [PlaneRotation(columns = [['X', 'Y']], theta_vec = [45.0])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"PlaneRotation\")\n", - "# error in documentation check constructor syntax" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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t27daNq0qYlHLYkImjZtSrdu3fjiiy8KHY4kKU+KPvmQpOqwW1Bu+LlKUnEp+qe+s11JkiRJ+VH0yYfdriSpenr27MnkyZMLHYYkqR6ra7NdSVK98K9+W+a0/j2eeCun9UuSVAhFn3yUm+2q0KFIkuqB+NmHhQ6hQUhXdSx0CJIKwG5XdruSVM/17NmTK6+8ku233562bdsydOhQli5dyscff8whhxxCx44dadu2LYcccgjvvvtu2fv23Xdffv7zn7PXXnux0UYbMWDAABYsWFB2/vbbb6dHjx60b9+eyy+/vMI1n332Wfr27cvGG29M165dOfXUU/nqq6+AzDS6P/3pT+nUqROtW7dmxx13ZNasWfn5MCRJdVrRJx+S1BCMHz+eRx55hLfeeos33niDyy67jJUrVzJ06FDmzJnD3Llzad68eYUF5QDuuOMObrnlFj744AO++uorRo8eDcArr7zCySefzO233857773HRx99VCFxadSoEddccw0LFizg6aef5h//+AdjxowBYNKkSTzxxBO88cYbLFq0iLvuuov27dvn78OQJNVZJh+S1ACceuqpdO/enXbt2nHhhRdy55130r59e4488khatGjBRhttxIUXXsjjjz9e4X1Dhw5l6623pnnz5hx99NHMnDkTgHvuuYdDDjmEfv36seGGG3LppZdWmBZ3t912Y4899qBx48b07NmTk046qazuJk2a8Nlnn/Haa6+RUmK77baja9euefssJEl1l8mHJDUA3bt3L3vdo0cP3nvvPRYvXsxJJ51Ejx49aN26Nf369eOTTz5hxYoVZWW7dOlS9rpFixZ8/vnnALz33nsV6mzZsmWF1os33niDQw45hC5dutC6dWsuuOCCsi5b/fv359RTT+WUU06hU6dODB8+nE8//TRn9y5Jqj+KPvlwnQ9JDcE777xT9nru3LlssskmXH311bz++us888wzfPrppzzxxBNAZkzGunTt2rVCnYsXL+ajjz4q2z/55JPZdtttefPNN/n000+54oorKtT7k5/8hBkzZvDKK6/wxhtv8Otf/7o2blOqs2644QZ22mknWrduTevWrenbty9/+9vfKpR54403OOKII9h4441p0aIFu+66K6+++ioAb7/9NhFR5bbq/5/58+fToUMHrr766gr1vvzyyzRr1oy//OUv+blZaT0UffLhgHNJDcENN9zAu+++y8KFC7n88ssZPHgwn332Gc2bN2fjjTdm4cKFjBo1qtr1HXXUUfz1r3/lqaee4quvvuLiiy9m5cqVZec/++wzWrduTatWrXjttdf4/e9/X3buueee45lnnmHZsmW0bNmSZs2auZK5GrxNN92UX/7ylzz//PNMnz6d/v37c9hhh/Hiiy8CMHv2bPbaay8233xzHnvsMWbNmsVll11Gq1atgEzr5fvvv19hGzNmDBHBUUcdBWRaKm+44QYuuugiXnnlFQCWLVvG8ccfz2GHHcb3v//9wty8VAP+NJCkBuDYY49lwIABbLHFFmy55ZZcdNFFnHHGGSxZsoQOHTqwxx57cOCBB1a7vl69enHDDTdw7LHH0rVrV9q2bcumm25adn706NHccccdbLTRRgwbNozBgweXnfv0008ZNmwYbdu2LZst65xzzqnV+5XqmkMPPZSDDjqIkpIStt56ay6//HI22mgjnn76aQAuvPBCBgwYwNVXX82uu+7KFltswcCBA8u6NzZq1IguXbpU2O677z72339/Nt9887LrDB48mEMPPZTjjz+e5cuXc+mll5YlKlJ9ENVpfi8Gffr0SdOnTy90GJLqoFdffZXtttuu0GGsUc+ePbnpppvYf//9Cx3K17KmzzciZqSU+lSjirz+IHOdj9rRkNf5WLFiBXfffTfHH388M2bMoFevXrRp04af/exnPPnkk8yYMYOePXty9tlnV0jcy/vvf/9LSUkJd911V1nLxyoLFy6kV69e9OvXj/vuu48HH3yQgQMH5uPWpOqKNZ2w5UOSJKkWvPTSS7Rq1YoNN9yQH//4x9x///3suOOOfPDBB3z++edcccUVDBgwgEcffZRjjjmG4447brVxIavcdNNNdOzYkUMPPXS1c+3atePKK6/krrvu4phjjjHxUL3iCueucC5JkmrBNttsw8yZM1m0aBH33HMPJ5xwAlOnTqVdu3ZApmvWmWeeCUDv3r2ZPn06v/vd7zj44IMr1LN8+XJuueUWTjjhBJo0abLadVauXMktt9xCixYteO6551i6dCnNmjXL/Q1KtaDoWz4ccC6pvnv77bfrbZcrqSFp2rQpJSUl7Lbbblx55ZX07t2ba665hg4dOtC4cWO23377CuW322475s6du1o9EyZMYP78+Zx44olVXufaa6/lpZde4rnnnuPzzz/nwgsvzMn9SLlQ9MmHJElSLqxcuZIvv/ySpk2b8o1vfIPXX3+9wvk33niDHj16rPa+sWPH8q1vfYutt956tXOvvvoqF154Iddffz3bb789N998M9dddx3Tpk3L2X1Itanou11JkiStr5/97GccfPDBdO/enc8++4w77riDqVOnlo3pOPfcczn66KPZZ5996N+/P1OmTOEvf/kLDzzwQIV65s6dyyOPPMJtt9222jWWL1/OCSecwMEHH8xxxx0HwIABAzjxxBMZOnQoM2fOpEWLFjm/V2l92PIhSZK0nubPn88PfvADttlmG/bbbz+ee+45Hn74YQ466CAADjvsMG688UZGjx7NjjvuyPXXX89tt9222niPm2++mTZt2nDkkUeudo0rr7ySOXPmVFhXBzJTXy9fvpzzzz8/dzco1RKn2s1yql1Ja1LXp9qt75xqtzg15Kl2JTnVriRJkqQCM/mQJElSUbrhhhvYaaedaN26Na1bt6Zv375rXHvlpJNOIiIYPXp0hePz58/nhz/8IV26dKFFixbsvPPOjB8/vuz8rFmzaNasGffee2+F902ePJkmTZoU3WQBRT/g3HU+JH0due56Y5cUScq9TTfdlF/+8pdstdVWrFy5kltvvZXDDjuMGTNmsNNOO5WVu+eee3j22WfZZJNNVqvj+OOPZ+HChTz44IN07NiR+++/nx/+8Id0796dfv36scMOOzBq1Ch+/OMfs/fee9O5c2cWLVrE0KFDOeuss9hrr73yecsFV/QtH67zIUmSVJwOPfRQDjroIEpKSth66625/PLL2WijjXj66afLysyZM4fTTz+dO+64o8pFH//5z39yyimnsPvuu7PFFltw1lln0b17d5599tmyMueccw5bb701w4cPB+C0006jbdu2/OIXv8j9TdYxRZ98SFJ917NnT0aPHs1OO+1EmzZtGDx4MEuXLmXcuHHsvffeFcpGBP/5z38AGDJkCCNGjOCggw6iVatW7LXXXsyfP58zzjiDtm3bsu222/LCCy9UuM6VV17J9ttvT9u2bRk6dChLly4FYIcddmDChAllZZctW0aHDh0qvF+S6rIVK1bwl7/8hc8//5w999wTyExvfMwxx3DRRRetceKRvffem7vuuouPPvqIlStX8uCDD/Lhhx9WWPx1gw024NZbb2Xy5Mkcd9xx/OUvf+G2226jadOmebm3uqTou11JUkNw11138fe//51mzZqx1157MW7cOJo1a1at9z3yyCP06tWLgQMH0rdvX0aNGsXVV1/NyJEjOfPMM5kyZUpZ+fHjx/PII4/QsmVLBg0axGWXXcZll13G8ccfz5///GcGDRoEwMSJE+natSu77LJLzu5ZqglnKasdDbFL6EsvvUTfvn1ZunQprVq14v7772fHHXcEYOTIkXTo0IGTTz55je+/6667+P73v1+2kv2GG27InXfeSe/evSuUKykp4ZxzzmHUqFH8/Oc/X+18sbDlQ5IagJ/85CdssskmtGvXjkGDBjFz5sxqve/www9nt912o1mzZhx++OE0a9aM448/nkaNGjF48ODVWi5OPfVUunfvTrt27bjwwgu58847AfjBD37AxIkT+fTTTwG4/fbb+eEPf1ir9yhJubDNNtswc+ZMnnnmGU4++WROOOEEZs2axdSpUxk3bhw333zzWt9/0UUXsWDBAiZPnsz06dM555xzOP744/n3v/9dodySJUu48847adGiBU899RTFutyFyYckNQBdunQpe92iRQs+//zzar2vc+fOZa+bN2++2n7lerp37172ukePHrz33nsAbLLJJuy1117ce++9fPLJJzz88MNlKzBLUl3WtGlTSkpK2G233bjyyivp3bs311xzDVOnTuX999+na9euNG7cmMaNGzNnzhzOO+88Nt10UwDeeustrr/+esaOHct+++3HzjvvzMiRI/nGN77B9ddfX+E65513HsuXL+fZZ59l+vTp/O53vyvE7Rac3a4kqYFq2bIlixcvLtufP3/+etf5zjvvlL2eO3duhZlfTjjhBG666SaWL19O37596dat23pfT5LybeXKlXz55ZeMGDGCo446qsK573znOxxzzDEMGzYMoOwZ26hRowrlGjVqxMqVK8v2p0yZwpgxY5gyZQq9evXi6quv5owzzmDgwIFsueWWOb6jusXkQ5IaqJ133pmXX36ZmTNnsu2223LJJZesd5033HADhxxyCC1atODyyy9n8ODBZecOO+wwRowYQWlpKeeee+56X0uScu1nP/sZBx98MN27d+ezzz7jjjvuYOrUqfztb3+jU6dOdOrUqUL5Jk2a0KVLF7bZZhsAtt12W0pKShgxYgSjR4+mffv2PPDAAzz66KM8+OCDAHz22WcMHTqU008/nX322QeA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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation import PolynomialFeatures\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"X\",\"Y\"]\n", - "#sf_crime_df = sf_crime_df[columns]\n", - "objs = [PolynomialFeatures(columns = ['X', 'Y'])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"PolynomialFeatures\")" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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cESkBEpLS8PMqF27NgkJCRp8WwzcnT179pCeno6707DhgWvFmlmKux84HVM+1RV/hCIicgQK/EUZv181hWnAuYgcyvbt26lfvz7ly5dX4lFMzIzy5ctTv359tm/fHu1wREQkIHGffIiIFEY8dwuKJP1cpbSaPXs2F154IfXr18fMDugid++993LSSSdRqVIlqlevznnnnce8ebnnx1mxYgUXX3wxSUlJVKlShSuuuIL09LzLmcG0adNo3749FStWpFq1anTq1Cn72PTp00lISODzzz/Pdc748eOpXLmyJguQEifun/qa7UpERESKatu2bdljYSpUqHDA8RNPPJHnnnuOJUuWMGfOHJo0aUK3bt2yk4vt27fTtWtX3J1PPvmEuXPnsnv3bnr06JG9dgvAe++9x5VXXsk111zDV199xfz587n++uuzj3ft2pUbbriB3r17k5mZCcCqVau47bbbGD16NMcff3yEfxIiRRP3Yz720wrnIlKQb7/9lmbNmkU7jKhr3Lgx48ePp3PnzsVab0E/X435kNKicuXKPPvss/Tp06fAMlu3bqVq1ap8+OGHnH/++UyfPp1u3bqxadMmqlevDsCWLVuoXr0606dPp3Pnzuzbt48mTZpw77330q9fwZNybt++nVNPPZU//vGPPPXUU5x77rkcffTRfPjhh8V9qyKFVWAf5ZI225WISKmwoGNkv01sN1tdJURixe7duxk7dixVqlShVatWAOzatQsz4+ijj84ud/TRR1OmTBnmzJlD586dSUlJYc2aNZQvX542bdqwbt06WrZsyaOPPkrr1q2zz6tUqRITJ07knHPOYePGjfz3v/9l6dKlQd+mSKHEffKRY7araIciIiKlgP11Y7RDiAn+SFK0Q4i4//znP1x55ZXs2LGDunXrMmPGDGrXrg1Au3btqFy5MnfeeSePPvooAH/961/Zt28fP//8MwA//vgjAMOHD+eJJ56gSZMmPPfcc5xzzjl899132avbA3To0IGrr76al19+mRdffJH69esHfLcihRP3Yz4025WIlHaNGzfm4Ycfpnnz5lSvXp2+ffuyc+dOfvnlF7p3705SUhLVq1ene/fu/PTTT9nnnXPOOdx7772cddZZHHPMMXTt2pWMjIzs45MmTaJRo0bUrFnzgLUfFi5cSPv27alWrRp169bl5ptvZvfu3UBoGt1bb72VWrVqUaVKFU455RR9Cytx6dxzzyU1NZV58+bRrVs3rrjiiuzEIikpiTfffJMPPviAY445hqpVq/Lrr7/Spk2b7IkY9o/9GDp0KJdddhlt27Zl7NixVK1alVdeeSXXtdLT03n//fepWLEis2fPDvZGRYog7pMPEZFY8OqrrzJt2jRWrFjB8uXLefDBB8nKyqJv376sXr2atLQ0KlSowM0335zrvNdee40JEyawYcMGdu/ezejRowH45ptvGDBgAJMmTWLdunVs2rQpV+JStmxZ/va3v5GRkcH8+fP5+OOPGTNmDBCafWf27NksX76cLVu28MYbb1CzZs3gfhgiJUSlSpVo2rQp7dq148UXXyQhIYHx48dnH+/atSsrVqxgw4YNZGRkMGnSJNauXctxxx0HkN2y0bx58+xzypUrxwknnEBaWlqua/Xv358TTjiBjz76iH/+859MmTIlgDsUKTolHyIiMeDmm2+mQYMG1KhRg6FDh/L6669Ts2ZNLr30UipWrMgxxxzD0KFD+fTTT3Od17dvX373u99RoUIFrrjiClJTUwF466236N69Ox07duSoo47igQceyDUtbtu2bWnXrh3lypWjcePG3Hjjjdl1JyQk8Ntvv/Hdd9/h7jRr1ixX9xCReJWVlcWuXbsO2J+YmEi1atX45JNP2LBhAxdeeCEQ+v/sqKOOYtmyZbnqWLFiBY0aNcreN3HiRD766CNefvll2rdvz5AhQ7jxxhvZvHlz5G9KpIiUfIiIxIAGDRpkv2/UqBHr1q1jx44d3HjjjTRq1IgqVarQsWNHfv31V/bt25ddtk6dOtnvK1asyLZt2wBYt25drjorVaqUq/Vi+fLldO/enTp16lClShXuueee7C5bnTp14uabb+bPf/4ztWrVon///mzdujVi9y4SDdu2bSM1NZXU1FSysrJIS0sjNTWVtLQ0tm7dyrBhw/j8889JS0sjJSWF6667jp9++okrrrgiu44JEyYwf/58VqxYwT//+U8uv/xybr31Vk488UQAqlSpwk033cSIESOYNm0ay5YtY9CgQfzyyy9cc801AKxZs4ZBgwbxyCOPcMIJJwAwYsQIEhMTueWWW4L/wYgcQtwnH1rnQ0RiwZo1a7Lfp6WlUa9ePZ544gmWLVvG559/ztatW7P7gRdmivW6devmqnPHjh1s2rQpe3vAgAGcdNJJfP/992zdupWHHnooV71/+ctfSElJ4ZtvvmH58uU8/vjjxXGbIiXGokWLaN26Na1btyYzM5MRI0bQunVrhg8fTrly5fj666+5+OKLOeGEE+jRowebNm1i9uzZtGzZMruOZcuWcfHFF9OsWTPuv/9+hg4dmt31cb/HH3+cXr160bt3b0477TSWLFnCzJkzqVu3Lu7OddddR3Jycq4uleXLl+eVV17hzTff5N133w3sZyJSGHE/25W7TwGmJCcnFzyBtohICffcc8/RvXt3KlasyKhRo+jZsye//fYbFSpUoFq1amzevJmRI0cWur7LLruMM844gzlz5nD66aczfPjwXAuf/fbbb1SpUoXKlSvz3Xff8Y9//IOkpNDsRV988QVZWVm0adOGSpUqZU8fKhJLzjnnnIMm8oX5o/+RRx7hkUceOWiZhIQEHnvsMR577LEDjpkZM2bMyPe8Vq1aZU8CIVKS6LeBiEgM6NWrF127duW4447j+OOPZ9iwYQwePJjMzEwSExNp164d3bp1K3R9LVq04LnnnqNXr17UrVuX6tWrc+yxx2YfHz16NK+99hrHHHMM/fr1o2fPntnHtm7dSr9+/ahevXr2bFl33nlnsd6viIiUTlrhPEwrnItIQUr6CueRWnk8KKVthXOt81E84mGdD5E4VuAK52r5EBERERGRQMR98qEB5yIiIiIiwdCAcw04F5FSbtWqVdEOQUREpFDiPvkQERGR2KexOsVDY3XkSMV9tysREREREQmGkg8REREREQmEkg8REREREQmEkg8REREREQmEkg8REREREQlE3M92ZWY9gB5NmzaNdigiUopEeuYczSgjIiKxKO5bPtx9irv3r1q1arRDERERERGJaXGffIiIlHaNGzdm9OjRtGzZkqpVq9KzZ0927tzJxIkT6dChQ66yZsYPP/wAQJ8+fRg4cCB/+MMfqFy5MmeddRbr169n8ODBVK9enZNOOomvvvoq13UefvhhmjdvTvXq1enbty87d+4E4OSTT2bKlCnZZffs2UNiYmKu80VERJR8iIjEgDfeeIMPP/yQlStXsnjxYiZOnFjo8x588EEyMjI46qijaN++PW3atCEjI4PLLruM2267LVf5V199lWnTprFixQqWL1/Ogw8+CMC1117LP//5z+xyU6dOpW7durRu3brY7lFEREo/JR8iIjHgL3/5C/Xq1aNGjRr06NGD1NTUQp138cUX07ZtW44++mguvvhijj76aK699lrKli1Lz549D2i5uPnmm2nQoAE1atRg6NChvP766wBcffXVTJ06la1btwIwadIkrrnmmmK9RxERKf2UfIiIxIA6depkv69YsSLbtm0r1Hm1a9fOfl+hQoUDtvPW06BBg+z3jRo1Yt26dQDUq1ePs846i7fffptff/2VDz74gKuuuuqw7kVERGJX3M92JSISqypVqsSOHTuyt9evX3/Eda5Zsyb7fVpaGvXq1cve7t27N+PHj2fv3r20b9+e+vXrH/H1REQktqjlQ0QkRp166ql8/fXXpKamsnPnTu67774jrvO5557jp59+YvPmzYwaNYqePXtmH/vTn/7El19+ydNPP8211157xNcSEZHYE7PJh5m9a2a/mNlb0Y5FRCQafve73zF8+HA6d+7MCSeccMDMV4ejV69edO3aleOOO47jjz+eYcOGZR+rUKECl156KStXruSSSy454muJiEjsMXePdgwRYWbnAMcAvd39skOVT05O9kWLFkU6LBEphb799luaNWsW7TCirnHjxowfP57OnTsXWOb+++9n+fLluWa+OpSCfr5mluLuyYWoItBfZJFeYDJeBL2Qpj634qEFUKWQrKADMdvy4e6zgN+iHYeISLzYvHkzL774Iv379492KCIiUkIFnnyYWUczm2xma83MzaxPPmUGmtlKM9tpZilmdnbQcYqISOGNGzeOBg0a8Ic//IGOHTtGOxwRkXzNnj2bCy+8kPr162NmudZE2rNnD0OGDKFly5ZUqlSJunXr0qtXL9LS0nLVsWvXLm655RYSExOpVKkSF154IT/99FOuMl988QWdO3emWrVqVKtWjfPOO4+FCxdmHx83bhxVqlRh1apVuc4bNmwY9evXZ/PmzcV+7yVFNFo+KgNLgUFAZt6DZtYTeBp4CGgNzAM+MLOGOcqkmtnSfF718tYnIiLFY9WqVQV2uerXrx/bt2/n+eefDzgqEZHC27ZtGyeffDJPP/00FSpUyHVsx44dfPnllwwdOpQvv/ySf//736xZs4Zu3bqxd+/e7HKDBw/m7bff5vXXX+ezzz5j69atdO/enX379mVfo1u3btSrV48FCxYwf/586taty/nnn89vv4U65fTr148OHTrQp08f9g+B+Pzzz3n00UcZP348NWrUCOgnEryojvkws23Aze4+Mce+z4HF7t4vx77vgbfc/e4i1n9OuP58x3yYWX+gP0DDhg3brl69uqi3ICJxQGM+IktjPuKTxnyUTrE05qNy5co8++yz9OnTp8Ay33zzDS1atGDx4sWccsopbNmyhaSkJCZMmJC9ltGaNWto1KgRH3zwAeeffz6LFi3itNNO48cff6RJkyYArFy5kuOOO44vvviC5OTQY23dunWcfPLJ3Hvvvdx00020bt2a3//+97zwwgsRv/cAlI4xH2ZWHmgLTM9zaDpwZnFfz93HunuyuycnJcXO/0wiUvxidXKOaNPPVURKsq1btwJQvXp1AFJSUtizZw9du3bNLtOgQQOaNWvGvHnzADjxxBNJSkrixRdfZNeuXezatYtx48bRsGFDWrRokX1evXr1ePbZZ7nnnnu4+uqr2b17N0888USAdxcdJSr5ABKBskB6nv3pQJ0DixfMzD4C3gQuMLOfzKx9AeV6mNnYLVu2HE68IhIHEhISyMw8oJeoFIPMzEwSEhKiHYaIyAF2797N7bffTo8ePTj22GOB0GKtZcuWJTExMVfZ2rVrZy/keswxxzBr1izeeOMNKlasSMWKFfnXv/7FjBkzDujq1atXL8444wzeeecdxo8fT+XKlYO5uSgqaclHsXH3zu6e5O4V3f1Yd59fQLkp7t6/atWqQYcoIqVErVq1WLt2LTt27NA39cXE3dmxYwdr166lVq1a0Q5HRCSXvXv3cvXVV/Prr78yYcKEIp2bmZnJddddR7t27ViwYAFz586ldevWXHTRRWzfvj1X2a+//poFCxZQsWJFZs+eXZy3UGKVi3YAeWQA+4DaefbXBtYHH46ICFSpUgUI9c/ds2dPlKOJHQkJCdSuXTv75ysiUhLs3buX//u//2PJkiXMmjWLmjVrZh+rU6cO+/btIyMjg5xd9tPT0zn77NDkrK+99horVqxg7ty5lC1bNntf9erVeffdd7n66quzr3Pttddy0UUX0bNnT6688kouuugiWrduHeDdBq9EJR/uvtvMUoAuhLpM7dcFeDsS1zSzHkCPpk2bRqJ6EYkRVapU0R/JIiIxbs+ePVx55ZUsXbqUWbNmUadO7l7/bdu2JSEhgRkzZtCrVy8AfvrpJ7799lvOPDM0PHnHjh2YGWXK/K+DUZkyZTAzsrKysvc9+OCDrFu3junTp1OzZk0uv/xyevfuzaJFiyhfvnwAdxsd0Vjno7KZtTKzVuHrNwxv759K90mgj5ndYGbNzOxpoB4Qkfkb1e1KREREJD5s27aN1NRUUlNTycrKIi0tjdTUVNLS0ti7dy+XX345CxYs4PXXX8fMWL9+PevXr88e91e1alWuv/567rrrLj766CO++uorrrnmGlq2bJk9FXmXLl3YunUrAwcO5Ntvv+Xrr7+mb9++lC1blk6dOgGhgeujRo1i7Nix2S0rzzzzDBkZGYwcOTI6P5yABD7Vbnj625n5HHrZ3fuEywwE7gLqEloT5FZ3j0hHuBwtH/2+//77SFxCREQOg6bajW2aard0Ku1T7c6aNYtzzz33gP29e/fmvvvuy54aN68JEyZkT8m7a9cu7rjjDl577TUyMzM577zzGDNmDA0aNMguP2PGDEaOHMnSpUsxM1q1asWoUaM488wz2bVrF23atOH0008/YDzJ+++/z5/+9CfmzZvHaaedVnw3HrwCp9qN6jofJUlycrIvWrQo2mGIiEiYko/YpuSjdCrtyYcEpnSs8yEiIiIiIrEr7pMPrfMhIiIiIhKMuE8+NOBcRERERCQYcZ98iIiIiIhIMErUOh8iIiIiIvtpooDiUZImCoj7lg+N+RARERERCUbcJx8a8yEiIiIiEoy4Tz5ERERERCQYSj5ERERERCQQcZ98aMyHiIiIiEgw4j750JgPEREREZFgxH3yISIiIiIiwVDyISIiIiIigVDyISIiIiIigYj75EMDzkVEREREghH3yYcGnIuIiIiIBCPukw8REREREQmGkg8REREREQmEkg8REREREQlEuWgHICIiEi2ZmZmsWLECgOOPP54KFSpEOSIRkdimlg8REYk7u3btYvDgwdSoUYNTTz2Vli1bUqNGDQYNGsTOnTujHZ6ISMxSy4eIiMSdAQMGMH36dMaPH0/79u0BmD9/PnfffTe//fYbL730UpQjFBGJTXGffJhZD6BH06ZNox2KiIgE5M033+Sdd96hS5cu2fuOO+44atWqxaWXXqrkQ0QkQuK+25XW+RARiT+VKlWifv36B+yvX7++xn2IiERQ3CcfIiISf2655RZGjhxJZmZm9r7MzEweeOABbrnllihGJiIS2+K+25WIiMSfBQsW8Omnn1K/fn1atmwJwJIlS9i7dy/bt2/nwgsvzC47efLkaIUpIhJzlHyIiEjcSUxM5NJLL821r0mTJlGKRkQkfij5EBGRuDNhwoRohyAiEpc05kNERERERAKhlg8REYk7p5xyCmZW4PHFixcHGI2ISPyIyeTDzBoAk4BawF7gAXd/M7pRiYhISXHZZZfl2t6zZw+pqanMnTuXP//5z1GKSkQk9sVk8kEo4Rjs7qlmVgdIMbOp7r492oGJiEj0jRgxIt/9jz/+OKtXrw44GhGR+BGTYz7c/Wd3Tw2/Xw9kADWiGpSIiJR4l1xyCa+++mq0wxARiVmBJx9m1tHMJpvZWjNzM+uTT5mBZrbSzHaaWYqZnX0E12sLlHX3NUcSt4iIxL7Zs2dTsWLFaIchIhKzotHtqjKwFHgl/MrFzHoCTwMDgTnhfz8ws+bunhYuk0r+sXd193U56qoRvka/Yr4HEREpxXIuIgjg7vz888989dVXBXbJEhGRIxd48uHuU4GpAGY2MZ8itwET3X1cePsWM+sGDADuDtfR6lDXMbOjgPeAR9x93hEHLiKl1oKOx0c7hENqN3tFtEOIKzVr1sy1XaZMGVq0aMFDDz1E165doxSViEjsK1EDzs2sPNAWGJ3n0HTgzCLUY8BE4BN3n3SQcv2B/gANGzYsariHrTT8IQT6Y0hEYpcWGRQRiY4SlXwAiUBZID3P/nSgcxHqOQvoCSw2sz+F913j7ktyFnL3scBYgOTkZD+cgCV+KGkUiU2PPPIIN910E9WqVYt2KCIiMS9WZ7ua4+5l3L1VjteS/MqaWQ8zG7tly5agwxQRkRLgoYceYvPmzdEOQ0QkLpS05CMD2AfUzrO/NrA+Ehd09ynu3r9q1aqRqF5EREo4dzV8i4gEpUQlH+6+G0gBuuQ51AWIyKBxtXyIiIiIiAQjGut8VDazVmbWKnz9huHt/SO+nwT6mNkNZtbMzJ4G6gHPRyIetXyIiMS3b775hkaNGkU7DBGRuBCNAefJwMwc2yPDr5eBPu7+LzOrCQwD6hJaE+QCd18diWDMrAfQo2nTppGoXkRESrgGDRpEOwQRkbhRqOTDzJoB/wf8HmgMVAA2Al8CHwBvu/uuwtTl7rMAO0SZMcCYwtR3pNx9CjAlOTlZCxGKiMSwMmXKEJqJ/dD27dsX4WhEROLTQZMPM2sDPAZ0AOYSGnfxFpAJ1ABOBkYBz5jZY8BThU1CREREgvTGG29kJx/p6ekMHz6ciy++mPbt2wMwf/583nvvPUaOHBnNMEVEYtqhWj7eJZR8XO7uvxRUyMzaA7cCdxBKRkoNdbsSEYkPl112Wfb7Cy+8kIcffph+/f7X6H3ddddx+umn89577zFw4MBohCgiEvMONeD8BHd/7mCJB4C7z3f3K4DHiy+0YGjAuYhI/Pnkk08499xzD9h/7rnnMmvWrOADEhGJEwdNPsJT3xbIzBKKUl5ERKQkSExM5K233jpg/1tvvUVSUlIUIhIRiQ+Fnu3KzP4CrHX3t8PbLwK9zWwFcKG7L4tQjCIiIsXq/vvvp2/fvsycOTN7zMeCBQv46KOPePHFF6McnYhI7CrKOh9/ITTDFWbWEbgC6AWkAk8Ue2QB0SKDIiLx59prr2XevHkkJiYyefJkJk+eTM2aNZk7dy69e/eOdngiIjGrKOt81AdWht/3AN509zfMbAnwWbFHFhBNtSsiEp/OOOMMXn311WiHISISV4rS8rEVqBV+3wX4OPx+D3B0cQYlIiISaenp6YwePZqBAweSkZEBwNy5c1m5cuUhzhQRkcNVlORjOjDOzMYDTQktLgjQgv+1iIiIiJR4KSkpnHjiibz66quMHz+erVu3AjBjxgyGDh0a5ehERGJXUZKPPxNaaDAJuMzdN4f3twFeL+7AgqIxHyIi8eeOO+5g0KBBfPXVVxx11FHZ+88//3zmzp0bxchERGJbocd8uPtW4JZ89o8o1ogCpjEfIiLxJyUlJd9ZrerWrUt6enoUIhIRiQ8Hbfkws2OKUllRy4uIiERDhQoV+OWXA9fP/e6776hVq1Y+Z4iISHE4VLer781smJkdW1ABMytjZn8wsxmEumaJiIiUaBdddBEjR45k165dAJgZq1atYsiQIVx66aVRjk5EJHYdqtvV2cAo4MfwlLqLgHXATqA60BxoB2QCDwHjIheqiIhI8Rg9ejQXXHABSUlJ7Nixgw4dOpCens5ZZ53Fgw8+GO3wRERi1kGTD3f/HrjCzBoQWlTwbOB0oAKQAXwFjAWmuntWhGMVEREpFlWqVGHOnDl88sknfPnll2RlZdGmTRs6d+4c7dBERGJaoQacu/saQquYl9qVzAtiZj2AHk2bNo12KCIiErBOnTrRqVOnaIchIhI3ijLVbkxy9ynu3r9q1arRDkVERAI0ZswYWrRoQcWKFfnxxx8BeOSRR3jjjTeiHJmISOyK++RDRETiz1NPPcWDDz5I//79cffs/fXr1+fZZ5+NYmQiIrFNyYeIiMSd559/nnHjxjFo0CDKlftfD+Q2bdrw9ddfRzEyEZHYpuRDRETizurVqzn55JMP2J+QkEBmZmYUIhIRiQ9KPkREJO4cd9xxfPnllwfsnzp1Ks2bN49CRCIi8aFQs13tZ2a1gWuA44F73T3DzM4C1rn7ykgEKCIiUtzuuOMObr75Znbs2IG7M3/+fCZNmsRjjz3GSy+9FO3wRERiVqGTDzNrC3wMrARaAI8TWuujC/A7oFckAhQRESluffv2Ze/evdxzzz3s2LGDa665hnr16vH3v/+dnj17Rjs8EZGYVZSWj9HA0+4+wsx+y7F/GtC3eMMKjtb5EBGJT/369aNfv35kZGSQlZVFrVq1oh2SiEjMK8qYj7bAy/ns/xmoXTzhBE/rfIiIxK8VK1awYMECFi5cmL3Wh4iIRE5RWj4yger57D8J2FA84YiIiETepk2buP7665k8eTJlyoS+h3N3unfvzksvvUTNmjWjHKGISGwqSsvHv4ERZnZUeNvNrDHwKPB2cQcmIiISKTfccAM//PADn332GTt37mTnzp3Mnj2blStX0q9fv2iHJyISs4rS8nEHMBXYCFQE5hDqbjUXGFb8oYmIiETGtGnT+Pjjj2nfvn32vrPOOosXXniBzp07RzEyEZHYVujkw923Ah3MrBPQhlCryZfu/lGkghMREYmEpKQkKlWqdMD+ihUrqsuViEgEFXmRQXf/xN1Hu/tjSjxERKQ0Gj58OIMHD2bt2rXZ+9auXcvtt9/O8OHDoxiZiEhsK+oig62Bc4Fa5Elc3P2uYozrsJlZNeAjQvdWjtD0wOOiGpSIiJQoTz31FKtWraJx48bUr18fCCUfRx99NBs2bODvf/97dtnFixdHK0wRkZhTlEUG7wIeAVYD6YDnOOz5nhQdvwEd3X2HmVUClprZO+6+KdqBiYhIyXDZZZdFOwQRkbhUlJaPW4EB7v5CpIIpDu6+D9gR3jwKsPBLREQEgBEjRkQ7BBGRuFSUMR9lgI+P5GJm1tHMJpvZWjNzM+uTT5mBZrbSzHaaWYqZnX0Y16lmZv8FfgIed/eMI4lbRERiy8aNG9m4cWP29pIlSxg2bBivv/56FKMSEYl9RUk+/gH0PcLrVQaWAoMILVqYi5n1BJ4GHgJaA/OAD8ysYY4yqWa2NJ9Xvf1l3P1Xdz8VaAL0MrNSuwK7iIgUvyuuuIIpU6YAkJGRQceOHXn33Xe56aabeOKJJ6IcnYhI7CpKt6uRwFQz+4pQArEn50F3v+5QFbj7VEJrhWBmE/MpchswMccA8VvMrBswALg7XEerwgbs7unhFpCzgbcKe56IiMS2xYsX065dOwDeeustmjZtyhdffMG///1v7rzzTm6//fYoRygiEpuK0vIxCugK7AWqA0l5XkfEzMoDbYHpeQ5NB84sQj21zeyY8PuqQEdgWQFl+5vZIjNblLP5XUREYltmZiaVK1cG4KOPPuLCCy8EoE2bNqxZsyaaoYmIxLSiJB8DgV7ufpq7d3f3HjlfxRBLIlCW0ExaOaUDdYpQTyPgs3CLx2fAM+6+JL+C7j7W3ZPdPTkp6YjzJxERKSVOOOEE3nnnHdasWcP06dPp2rUrAOnp6VSrVi26wYmIxLCiJB+ZwFeRCqS4uPtCd2/l7qe6e8tDzc5lZj3MbOyWLVuCClFERKJsxIgRDBkyhMaNG9OuXTvOOOMMAKZNm0br1q2jHJ2ISOwqSvLxN2CwmUVq2toMYB+Qd3B4bWB9hK6Ju09x9/5Vq1aN1CVERKSEueSSS0hLS2PRokV8+OGH2fs7d+7Mk08+GcXIRERiW1EGnJ9NaPzEH83sGw4ccH7hkQTi7rvNLAXoAryZ41AX4O0jqftgzKwH0KNp06aRuoSIiJRAtWvXpnbt3N937W8BERGRyChK8pEBvHMkFzOzysD+v/LLAA3NrBWw2d3TgCeBSWa2EJgL3ATUA54/kusejLtPAaYkJyf3i9Q1RERERESkCMmHux/pGh8AycDMHNsjw6+XgT7u/i8zqwkMA+oSmtL3AndfXQzXFhERERGRKCpKy8cRc/dZwEHHjLj7GGBMIAGhblciIiIiIkE5aPJhZouB37v7L2a2BPCCyrp7y+IOLgjqdiUiIiIiEoxDtXy8DezK8b7A5ENERKQ0SU9PZ9KkSaxYsYIHHniAxMRE5s6dS7169WjSpEm0wxMRiUkHTT7cfWSO9/dFPJooULcrEZH4k5KSwnnnnUeTJk34+uuvufPOO0lMTGTGjBksX76c1157LdohiojEpEKv82Fmn5hZtXz2VzGzT4o1qgBpnQ8Rkfhzxx13MGjQIL766iuOOuqo7P3nn38+c+fOjWJkIiKxrSiLDJ4DlM9n/9GE1gAREREpFVJSUujdu/cB++vWrUt6enoUIhIRiQ+HnO3KzNrk2GxpZptzbJcFzgfWFndgQVG3KxGR+FOhQgV++eWXA/Z/99131KpVKwoRiYjEh8K0fCwCviA02Hx6eHv/63PgbuD+SAUYaep2JSISfy666CJGjhzJrl2hOVXMjFWrVjFkyBAuvfTSKEcnIhK7CpN8NAGOJ7Q+x+nh7f2v+kAVd38pYhGKiIgUs9GjR7N582aSkpLYsWMHHTp0oGnTplSrVo0HH3ww2uGJiMSsQ3a7yrG6eFHGh4iIiJRYVapUYc6cOXzyySd8+eWXZGVl0aZNGzp37hzt0EREYlqRVjg3s2OBjkAt8iQj7v5kMcYlIiIScZ06daJTp07RDkNEJG4UOvkws6uAl4C9wEZyLzjoQKlMPjTgXEQkPn311VfMnDmTDRs2kJWVlevYY489FqWoRERiW1FaPu4HngDudfd9EYoncO4+BZiSnJzcL9qxiIhIMB577DH++te/0qhRI2rXro2ZZR/L+V5ERIpXUZKP2sD4WEo8REQkPv3tb3/jH//4BzfeeGO0QxERiStFGUQ+FTgjUoGIiIgEJSsri/POOy/aYYiIxJ2itHzMAB41sxbAEmBPzoPu/k5xBiYiIhIpAwYMYMKECYwaNSraoYiIxJWiJB8vhP+9J59jTmi181JHA85FROLPiBEjuOCCC2jdujUnn3wyCQkJuY6/9JKWrxIRiYRCd7ty9zIHeZXKxAO0wrmISDwaOnQo06dPp1y5cvzyyy9s3Lgx10tERCKjSOt8iIiIxIIxY8bw2muv0bNnz2iHIiISV4qyzsdtBzuuRQZFRKS0qFChAq1bt452GCIicacoLR+35NlOAOoCmcAGSukigyIiEn9uvfVWnnrqKZ577jmt6yEiEqBCJx/u3iTvPjOrDUwAxhVnUCIiIpH02WefMXv2bN5//32aN29+wIDzyZMnRykyEZHYdkRjPtw93cyGAm8A7xZPSCIiIpGVmJjIJZdcEu0wRETiTnEMOC9DaPVzERGRUmHChAnRDkFEJC4VZcB53q+IjNCYjz8DnxVnUEHSOh8iIiIiIsEoSsvHW3m2HdgIfALcXmwRBczdpwBTkpOT+0U7FhERiZyWLVvy6aefUr16dU455ZSDDjRfvHhxgJGJiMSPogw4L/SChCIiIiXNpZdeylFHHZX9XrNciYgEr1DJh5klAHOAa919WWRDEhERKX4jRozIfn/fffdFLxARkThWqNYMd98DNCHU1UpERKRU69SpE7/++usB+7du3UqnTp2CD0hEJE4UpSvVy4DGRYiISKk3a9Ysdu/efcD+nTt38tlnpXYOFRGREq8oA84rAVeZWRcgBdie86C7/6U4AxMRESluX375Zfb7xYsXU6NGjeztffv2MW3aNOrXrx+N0ERE4kJRko9mwP6n9nF5jpW47lhmVhH4FnjT3e+IdjwiIhJ9ycnJmBlmRteuXQ84XqFCBZ555pkoRCYiEh+KMtvVuZEMJAKGAguiHYSIiJQcK1euxN057rjjWLhwIUlJSdnHypcvT61atShbtmwUIxQRiW3FscJ5iWNmJwAnAVOAk6McjoiIlBCNGjUCICsrK8qRiIjEp0CTDzPrCNwBtAXqAX3dfWKeMgOBOwmtnv41MNjdizr6b3S4jjOPNGYREYlNP/30E7Nnz2bDhg0HJCO33XZblKISEYltQbd8VAaWAq+EX7mYWU/gaWAgoXVFBgIfmFlzd08Ll0kl/7i7uvs6M7sIWO7uy81MyYeIiBzg1Vdf5brrrqNcuXIkJSXlWnDQzJR8iIhESKDJh7tPBaYCmNnEfIrcBkx093Hh7VvMrBswALg7XEerQ1ymHXClmV1OKNlJMLOt7n7/kd+BiIjEguHDh3P77bfzwAMPaIyHiEiAirLOR0SZWXlC3bGm5zk0nSJ0n3L3u929gbs3JtTFa1xBiYeZ9TezRWa2aOPGjYcZuYiIlDbp6enccMMNSjxERAJWYpIPIBEoC6Tn2Z8O1InEBd19rLsnu3tyzhlPREQktl1wwQV8/vnn0Q5DRCTuxORsV/vlHcyeHzPrAfRo2rRp5AMSEZESoUuXLgwZMoSvv/6aU045hYSEhFzHL7nkkihFJiIS20pS8pEB7ANq59lfG1gfqYu6+xRgSnJycr9IXUNEREqWG2+8EYCHHnrogGNmxr59+4IOSUQkLpSYblfuvhtIAbrkOdQFmBep65pZDzMbu2XLlkhdQkRESpisrKwCX0o8REQiJ9Dkw8wqm1krM2sVvnbD8HbDcJEngT5mdoOZNTOzpwmtB/J8pGJy9ynu3r9q1aqRuoSIiIiIiBB8t6tkYGaO7ZHh18tAH3f/l5nVBIYRWmRwKXCBu68OOE4REYlhTz755EGPa50PEZHICHqdj1mAHaLMGGBMIAGhAeciIvHomWeeybW9Z88efv75ZypUqECtWrWUfIiIREhJGnAeFRpwLiISf1auXHnAvvT0dPr27Uu/fvp1ICISKSVmwLmIiEg01a5dm1GjRnHXXXdFOxQRkZgV98mHZrsSEZH9srKySE/Pu9atiIgUF3W7UrcrEZG488477+Tadnd+/vlnnnvuOc4+++woRSUiEvviPvkQEZH4c9lll+XaNjOSkpLo1KkTTzzxRJSiEhGJfUo+REQk7mRlZUU7BBGRuKQxHxrzISISV/bs2cMZZ5zBsmXLoh2KiEjcifvkQyuci4jEl4SEBFauXInZQZedEhGRCIj75ENEROJP7969GTduXLTDEBGJOxrzISIicWf79u28+uqrzJgxg7Zt21KpUqVcx//+979HKTIRkdgW98mHmfUAejRt2jTaoYiISEC+/fZb2rRpA8CPP/6Y65i6Y4mIRE7cJx9a50NEJP7MnDkz2iGIiMQljfkQEREREZFAKPkQEREREZFAKPkQEREREZFAxH3yoUUGRURERESCEffJhxYZFBEREREJRtwnHyIiIiIiEgwlHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEoi4Tz60zoeIiIiISDDiPvnQOh8iIiIiIsGI++RDRERERESCoeRDREREREQCoeRDREREREQCoeRDREREREQCoeRDREREREQCoeRDREREREQCUS7aAUSCma0CtgJZwC/ufm50IxIRERERkZhMPsLOdPdt0Q5CRERERERC1O1KREREREQCEWjyYWYdzWyyma01MzezPvmUGWhmK81sp5mlmNnZh3EpBz41sy/M7KojDlxERERERI5Y0N2uKgNLgVfCr1zMrCfwNDAQmBP+9wMza+7uaeEyqeQfd1d3Xxd+38Hd15pZXeAjM1vi7ouL/W5ERERERKTQAk0+3H0qMBXAzCbmU+Q2YKK7jwtv32Jm3YABwN3hOloV4jprw//+bGZTgTaAkg8RERERkSgqMWM+zKw80BaYnufQdODMItRTycyOCb+vDHQCvi6gbH8zW2RmizZu3Hh4gYuIiIiISKGUmOQDSATKAul59qcDdYpQT21gjpn9F1gAvOLuX+RX0N3HunuyuycnJSUdTswiIiIiIlJIMTfVrrv/CJxa2PJm1gPo0bRp08gFJSIiIiIiJSr5yAD2EWq5yKk2sD5SF3X3KcCU5OTkfpG6hojIodhfS37XT39ELcQiInJkSky3K3ffDaQAXfIc6gLMi9R1zayHmY3dsmVLpC4hIiIiIiIEv85HZTNrZWatwtduGN5uGC7yJNDHzG4ws2Zm9jRQD3g+UjG5+xR371+1atVIXUJERERERAi+5SMZ+Cr8qgCMDL+/H8Dd/wUMBoYBqUAH4AJ3Xx2pgNTyISIiIiISjKDX+ZgF2CHKjAHGBBIQGvMhsUdjB0RERKSkKkkDzqWE0R+xIiIiIlKcSsyA82hRtysRERERkWDEffKhAeciIiIiIsGI++RDRERERESCoeRDREREREQCEffJh8Z8iIiIiIgEI+6TD435EBEREREJRtwnHyIiIiIiEgwlHyIiIiIiEoi4Tz405kNEREREJBhxn3xozIeIiIiISDDiPvkQEREREZFgKPkQEREREZFAKPkQEREREZFAKPkQEREREZFAxH3yodmuRERERESCEffJh2a7EhEREREJRtwnHyIiIiIiEgwlHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEoi4Tz401a6IiIiISDDiPvnQVLsiIiIiIsGI++RDRERERESCoeRDREREREQCoeRDREREREQCoeRDREREREQCoeRDREREREQCoeRDREREREQCEZPJh5k1MbOZZvaNmS0xs0rRjklEREREJN6Vi3YAETIRGObun5lZDWBXlOMREREREYl7MZd8mFkLYI+7fwbg7pujHJKIiIiIiBBwtysz62hmk81srZm5mfXJp8xAM1tpZjvNLMXMzi7iZU4AtpnZFDP70szuKZbgRURERETkiATd8lEZWAq8En7lYmY9gaeBgcCc8L8fmFlzd08Ll0kl/7i7uvu68LGzgVbABuBDM/vC3WcU+92IiIiIiEihBZp8uPtUYCqAmU3Mp8htwER3HxfevsXMugEDgLvDdbQ6xGXWAovcfU34OlMJJSJKPkREREREosjcPToXNtsG3OzuE8Pb5YEdwP+5+5s5yj0HnOzuvy9kveWAL4BOwBbg38AL7v6ffMr2B/qHN08Elh32DcWmRCAj2kFIkelzK530uR2okbsnRTuI0sjM+rv72GjH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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation import ClusterStatistics\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "columns = [\"MSSubClass\", \"LotArea\"]\n", - "clusters_dict = {\n", - " 'cluster_name_a': columns,\n", - "}\n", - "objs = [ClusterStatistics(clusters_dict=clusters_dict)]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"ClusterStatistics\")" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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4x8ZO3Zs896Y1ERaTfKRmZ9RWDRw5zqHdqYw69UXYsuHJElqCkcddVR14rG0caSdO3emW7duvPbaa0yYMIE99tgDKCQn7dq14957762u+8477/DSSy/xrW99q7ps9OjR3HfffVx77bVstdVWnHDCCRx66KHMmDGj+W6ujTr33HP52te+RqdOnejWrRtDhgxZNH6m2scff8yRRx7Jl770Jdq3b89Xv/pVLrroourjM2bM4Mgjj2T99denffv29O3bl8MOO4wPPvhPz//nn3+eVVddldtuu63Wue+77z7atWvHY4891rw32pJkZovZKEy1u1lxmwOcVny9dvH4UOAz4BBgAwrT7n4M9Fvea2+55ZYpSWo5gAnZsGe4VHYjR47M1VdfPe+///589913q7fZs2dX17nlllvygQceyNdffz1vv/327NevX+699961zvOTn/wk+/Tpk/fee28+/fTTuf322+emm26an3/+eWZmvv3229mpU6e89NJLq9/z6aef5sYbb5z7779/aW62DRk8eHBeffXV+dxzz+Wzzz6be+65Z/bo0SM/+OCD6jrDhw/PddZZJx944IGcPHlyXnvttbnyyivnddddl5mZzz33XO611155xx135GuvvZYPPfRQDhw4MHfeeeda1zrvvPOya9euOW3atMzMnDlzZn7pS1/KE044oXQ3XDpLfGa3qKl2I2J7CoPF67o2Mw8u1hkJ/BzoRWFNkGMyc7k7OzrgXNKSLFy4kOnTpzNz5kwWLFhQ7nDajBVXXJE11liDrl271tvnPSImZuagBpyq5fwiU8UqLOOxuNNPP51f/vKXAFx66aX8+te/pqqqil69enHggQdy6qmnsvLKK1fX//TTTzn++OO58cYbmTt3LjvuuCOjRo2ib9++ZCaDBw9m4cKF3HfffbWuOWnSJL7+9a/zpz/9ib322qtZ77Ut+/jjj+ncuTO33347Q4YMAWCjjTZin3324Ywzzqiu9+1vf5uNN96Y3/72t/WeZ9y4cey+++7MnDmTTp06AYXfJdtuuy1du3bljjvu4MADD2TSpElMmDCh1n8DbcQSZ7tqUclHOUTEEGDIgAEDhr/22mvlDkdSC/T2228TEfTo0YN27dot8Y8MNVxmMn/+fKqqqshM1l578bViTT4kldq77767aIpkttlmGwB+8pOf8OSTT3LHHXfQt29fHn/8cXbddVduuOEGdt9993rPc/PNNzNs2DBmz57NSiv9Z3LZf/3rX2y66absueee/PnPf+bJJ59ks802K8WtldoSf1G2mjEfzSUdcC5pGT755BP69OnDyiuvbOLRRCKClVdemT59+vDJJ5+UO5wWpSF90COi3u3www+vrrOsfurTpk2ja9euXHjhhbXO/cILL7Dqqqty8803N++NSi1Q3SmSodBitemmm7L22mvTrl07vv3tb/M///M/S0w8Zs6cyamnnsrw4cNrJR4AAwYM4Gc/+xk33ngjJ554YltNPJaqNa3zIUll80WmwtSy+XNd3EMPPcTIkSP52te+RmZy2mmnsdNOO/Hiiy/SpUsXgOp1IRaZMGECQ4YMYb/99qsuO/bYY7nvvvu4/vrrWWeddRg/fjzDhw+na9eu/PCHP6Rnz55cfvnlHHzwwey6664MHDiQ+fPnc+CBB7Lnnnvy/e9/v6T3LZXboimSH3300eopkgEuu+wyHn/8ccaMGUO/fv0YP348xx9/PP3792eXXWovKv/xxx8zZMgQ+vTpw/nnn7/YNebOnctNN91Ehw4dePTRRwtjICrtS62lDQiphA0YAlwxYMCARo6jkVQpXnzxxXKH0KYt6eeLA84zM3P27Nm5wgor5JgxY5ZY55BDDsmvfOUrtco23HDDPO2002qVbbfddnn44YfXKhs6dGhuueWWOX/+/Dz11FOzV69etQbbSpXg6KOPzp49e+ZLL71Uq3zOnDnZrl27vP3222uV//jHP84dd9yxVtns2bNz2223zW222abWRAM1HXnkkbnuuuvm888/n6uvvnqtiQPamCU+syv+K6e025UkNUj//v257777yh1GxZk9ezYLFy5kzTXXrPf4xx9/zM0338zw4cNrlW+zzTaMHTuWf//73wA8/vjjTJo0abFvakeNGsWUKVM44IADOPfcc7nqqquqW1ikSrC0KZLnz5/P/Pnza7WEQGHCjIULF1bvz549m1122YUFCxYwbtw4OnbsuNh1HnzwQUaNGsXo0aPZcMMNufDCCznxxBN5/fXXm+fGWii7XUnSF/D37b7crOf/5vjK+mWkJauvD3pNN954I5999hkHHXRQrfJLL72UQw89lLXXXru63/lll122WD/1Ll26cO655zJs2DB++MMfsttuuzXPjUgt0OGHH87111/P7bffzpprrsm0aYV1qzt27EjHjh3p1KkT3/72tznxxBPp2LEj/fr14+GHH+a6666r7lY1e/ZsBg8ezKxZs7j99tv55JNPqseydenShZVXXpnZs2czbNgwjjrqKLbddlsAhg8fzm233cawYcN46KGHKqYbasUnHzVmuyp3KJIk1bKkPug1XXnlleyxxx5069atVnlD+6kvXLiQa665hg4dOvDUU08xb948Vl111Wa9r3KIE98vdwhtQp7XbdmVWpFRo0YBsOOOO9YqrzlF8s0338xJJ53EAQccwIwZM+jXrx9nnnkmRxxxBAATJ07k73//OwBf+cpXap3nwQcfZPvtt+foo4+mQ4cOnH322bWO/+EPf2CjjTbikksu4ZhjjmmOW2xxKiPFWgq7XUlq7fr378+5557LwIEDWXPNNRk2bBjz5s3jww8/ZPfdd6dbt26sueaa7L777rzzzjvV79t+++059dRT2XrrrVl99dUZPHgw06dPrz5+/fXX069fP9Zaa63FfmE++eSTbLXVVqyxxhr06tWLI444gs8++wwojCU85phj6N69O506dWLjjTdebLYmLdsxxxxT3RVk3XXXrbfOojUC6na5mjt3LieddBLnn38+Q4YMYZNNNuGII47g+9//PhdccEGtuhdffDHPPfccTz31FB9//DEnn3xys92T1NIsaVzCosQDoGfPnlxzzTVMmTKFuXPn8vLLL3P88cdXDxTffvvtl3ie7bffHigkGS+++OJiiX2fPn348MMPKybxAJMPSWoTbrjhBu6++25ef/11Xn31Vc466ywWLlzIsGHDeOutt3j77bdp37599Td1i9x4441cc801vPfee3z22WfVf5i++OKLHHbYYVx//fVMnTqVDz74oFbisuKKK3LRRRcxffp0nnjiCe6///7qbxDvuecexo8fz6uvvspHH33ELbfcwlprrVW6H0YbsLQ+6DVdccUVrLPOOuy00061yhvaT/2ll17i5JNP5rLLLmPgwIH84Q9/4JJLLuGxxx5r2huSpCKTD0lqA4444gj69u1Lly5dOPnkk7nppptYa6212GeffejQoQOrr746J598Mg8//HCt9w0bNoyvfOUrtG/fnv32249JkyYBcOutt7L77ruz3Xbbscoqq3DmmWfW6o+85ZZb8s1vfpOVVlqJ/v37c+ihh1afu127dsyePZuXX36ZzGSDDTagV69eJftZtHaHH34411xzDTfeeGN1H/Rp06bx8ccf16o3Z84cbrjhBn784x8vNlVnzX7qDz30EJMnT2b06NFcd9111atff/755xx00EH813/9FwcccAAAgwcP5pBDDmHYsGHMmTOnNDcsqaKYfEhSG9C3b9/q1/369WPq1KnMmTOHQw89lH79+tGpUye22247Zs6cyYIFC6rr9uzZs/p1hw4dqv/AnTp1aq1zrrbaarVaL1599VV23313evbsSadOnfjFL35R3WVrhx124IgjjuDwww+ne/fujBgxglmzZjXbvbc1o0aNYvbs2ey444706tWreqvbXepPf/oTn3zyCcOGDav3PDfffDNf+9rXOOCAAxg4cCDnnXderX7q5557Lm+99Rb/+7//W+t9F1xwAZ9//jknnXRS89ygpIpW8clHRAyJiCs++uijcociSV/YoulUAd5++2169+7NhRdeyCuvvMI//vEPZs2axfjx4wEWrXG0VL169ap1zjlz5vDBBx9U7x922GGsv/76vPbaa8yaNYtzzjmn1nl/+tOfMnHiRF588UVeffVVfv3rXzfFbVaEhvRBh0Kr1eeff07v3r3rPc+y+qmfeuqpVFVVLTZQvWPHjrzxxhtccsklzXJ/kipbxScfDjiX1BZcfvnlvPPOO8yYMYOzzz6boUOHMnv2bNq3b88aa6zBjBkzOOOMMxp8vn333Ze//vWvPProo3z22Wecdtppi81p36lTJzp27MjLL79c69vzp556in/84x/Mnz+f1VZbjVVXXbVippCUJC1dxU+1K0ltwf7778/gwYOZOnUqe+yxB6eccgozZ85k//33p2vXrvTu3ZvjjjuO22+/vUHn23DDDbn88svZf//9+eSTTzj22GP50pe+VH38ggsuYMSIEZx//vlsvvnmDB06lAceeACAWbNmccwxx/DGG2+w6qqr8t3vfpef/exnzXHbkto4p0huGi1piuRoSPN7JRg0aFBOmDCh3GFIaoFeeuklNthgg3KHsUT9+/fnqquuWmzGo9ZiST/fiJiYmYMacAp/kWmZ/CO2aZT6j1g/t6ZRhuQjlnTAdnBJkiRJJVHx3a5c4VyS1Bh+E9s0WlI3EEmlU/HJR2aOBcYOGjRo+DIrS1IL9Oabb5Y7BEmSGsRuV5IkSZJKwuRDkiRJUkmYfEiSJEkqCZMPSZIkSSVh8iFJkiSpJEw+JEmSJJVExU+16zofkr6I5l7rwTUQJEltUcW3fGTm2Mwc0blz53KHIkmSJLVpFZ98SFJr179/fy644AI22WQTOnfuzNChQ5k3bx6jR49mm222qVU3IvjXv/4FwMEHH8zIkSPZdddd6dixI1tvvTXTpk3j6KOPZs0112T99dfnmWeeqXWdc889l4EDB7LmmmsybNgw5s2bB8BGG23E2LFjq+vOnz+frl271nq/JEkmH5LUBtxyyy3cddddTJ48mWeffZbRo0c3+H1nnXUW06dPZ5VVVmGrrbZiiy22YPr06ey7774ce+yxterfcMMN3H333bz++uu8+uqrnHXWWQAceOCB/PGPf6yuN27cOHr16sXmm2/eZPcoSWr9TD4kqQ346U9/Su/evenSpQtDhgxh0qRJDXrfXnvtxZZbbsmqq67KXnvtxaqrrsqBBx7IiiuuyNChQxdruTjiiCPo27cvXbp04eSTT+amm24C4Ac/+AHjxo1j1qxZAFx//fX88Ic/bNJ7lCS1fiYfktQG9OzZs/p1hw4d+Pjjjxv0vh49elS/bt++/WL7dc/Tt2/f6tf9+vVj6tSpAPTu3Zutt96a2267jZkzZ3LnnXdywAEHfKF7kSS1XRU/25UktVWrrbYac+bMqd6fNm3acp/z3//+d/Xrt99+m969e1fvH3TQQVx11VV8/vnnbLXVVvTp02e5rydJalts+ZCkNmrTTTflhRdeYNKkScybN49f/vKXy33Oyy+/nHfeeYcZM2Zw9tlnM3To0Opje+65J08//TSXXHIJBx544HJfS5LU9rTZ5CMi/i8iPoyIW8sdiySVw1e+8hVOO+00dtppJ9Zbb73FZr76Ivbff38GDx7Muuuuy5e//GVOOeWU6mPt27dnn332YfLkyey9997LfS1JUtsTmVnuGJpFRGwPrA4clJn7Lqv+oEGDcsKECc0dlqRW6KWXXmKDDTYodxhl179/f6666ip22mmnJdb51a9+xauvvlpr5qtlWdLPNyImZuagBpyipL/ImnuByUpR6oU0/dyahp9b61SGhWtjSQfabMtHZj4EzC53HJJUKWbMmMEf/vAHRowYUe5QJEktVMmTj4jYLiLGRMSUiMiIOLieOiMjYnJEzIuIiRGxbanjlCQ13JVXXknfvn3Zdddd2W677codjiSphSrHbFcd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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_str import SplitExtract\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "objs = [SplitExtract(['Name'], [', '], [1], ['Dummy'])]\n", - "columns = [\"Name\"]\n", - "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"SplitExtract\")" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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XnjhBf7jP/6DefPmzavcRkqJt956i2984xt8//vfT40bN+b555+nb9++X9T5BUoqZLGxEw0m+QDaAVsDpZWOlwIHAaSU1kTE2cDjZJ7q/GpTM12llG4m+9eekpKSNGPGjLqIW5L0JUTEu/mOIV/GjRvHW2+9xR/+8IcNzu2yyy507dqVCy64gHHjxtG8eXN+/etfs2DBAj744IMat9WjRw/OPfdcRo8ezcUXX0zfvn1r4QokqWr1qttVbUgpPZBS+lpKqUc2udikiBgUETcvXbo0F+FJkrRJr7/+OhdccAF33303jRs33uB848aNuf/++3n77bdp27YtTZs25fHHH+fQQw9lq61q/rW+YsUK7rnnHpo2bcq0adMopCn4JdU/DSn5WASsBTpWOt4R+PDLVppSmphSGt6yZcstiU2SpFrxzDPPsGjRInr16kWjRo1o1KgRTz75JGPHjqVRo0Z88cUX7LnnnsyaNYslS5bwwQcf8NBDD/HJJ5+w00471bi98847jzVr1vD8888zY8YMfve7323+TZL0JTWY5COltIrMooEHVzp1MJlZr74Un3xIkuqTI488kjlz5jBr1qyyraSkhO9973vMmjWLbbbZpqxsy5Ytad++PW+++SYzZszgu9/9bo3aevzxxxk7dizjx4+nV69eXHPNNZx//vm8/fbbtX1ZkgTUszEfEdEc6JHd3QroGhF9gcUppfnAtcCEiHgemA6cSmZtjxu/bJsppYnAxJKSkmFbErskSbWhVatWtGrVqsKxZs2a0aZNG3r37g3An/70J9q1a0e3bt2YM2cOI0eO5Mgjj2TgwH+vq/vhhx/y4Ycf8sYbbwDwyiuvsGTJErp27UqbNm347LPPGDp0KCNHjmS//TJLZg0bNoz77ruPoUOH8sQTT3ypblyStCn1KvkASsgMFl9vdHa7AxiSUvq/iGgLXAR0IrMmyGEppaIdlCip7q1bt45FixaxZMkS1q5dm+9wCsbWW29Nq1ataNeunf+TW0MffPABZ511FqWlpXTq1IkTTjiBiy++uEKZG2+8kdGjR5ft/9d//RcAt99+O0OGDGHUqFE0bdqUK664osL7br31Vnr37s3111/PmWeeWfcXI6moRLEPLIuIQcCgHj16DHvzzTfzHY6kemj+/PlEBB07dqRx48Zk1njTlkgpsXr1akpLS0kp0bXrhmvFRsTMlFJJdaqr/QglSVtgo1+URf+nJgecS9qczz//nM6dO7PNNtuYeNSSiGCbbbahc+fOfP755/kOR5KUI0WffEhSddgtqG74e5Wk4lL0d31nu5IkSZJyo+iTD7tdSVL1dO/enSlTpuQ7DElSA1bfZruSpAbh2f4712n9e011nQVJUuEp+uSj3GxX+Q5FktQAxPkf5zuEgpCuap/vECTlgd2u7HYlqYHr3r07v/zlL9ltt91o3bo1Q4cOZeXKlXz66accfvjhtG/fntatW3P44YezYMGCsvftv//+XHzxxeyzzz585StfYeDAgSxatKjs/IQJE+jWrRtt27bdYC2I559/nr333ptWrVrRqVMnTj/9dFatWgVkptE988wz6dChAy1atGD33Xdn7ty5ufllSJLqtaJPPiSpENx11108/PDDvP3227zxxhtcfvnlrFu3jqFDh/Luu+8yf/58mjRpwumnn17hfXfffTe33347H330EatWrWLMmDFAZjXs0047jQkTJrBw4UI++eSTConL1ltvza9//WsWLVrEM888w6OPPsrYsWMBmDx5MlOnTuWNN95g6dKl/PGPf6Rt27a5+2VIkuotkw9JKgCnn346Xbp0oU2bNlx44YXcc889tG3blmOOOYamTZvyla98hQsvvJAnn3yywvuGDh3K1772NZo0acJxxx3HrFmzALj33ns5/PDD6d+/P9tuuy2XXXZZhWlx99xzT/baay8aNWpE9+7dOeWUU8rqbty4MZ999hmvvfYaKSV23XVXOnXqlLPfhSSp/jL5kKQC0KVLl7LX3bp1Y+HChSxfvpxTTjmFbt260aJFC/r378+SJUtYu3ZtWdntt9++7HXTpk3517/+BcDChQsr1NmsWbMKTy/eeOMNDj/8cLbffntatGjBBRdcUNZla8CAAZx++un8+Mc/pkOHDgwfPpxly5bV2bVLkhqOok8+XOdDUiF47733yl7Pnz+fHXbYgWuuuYbXX3+d5557jmXLljF16lQgMyZjczp16lShzuXLl/PJJ5+U7Z922mnssssuvPnmmyxbtowrr7yyQr0/+clPmDlzJq+88gpvvPEGV199dW1cpiSpgSv65MMB55IKwQ033MCCBQtYvHgxV1xxBYMHD+azzz6jSZMmtGrVisWLFzN69Ohq13fsscfyt7/9jWnTprFq1SouueQS1q1bV3b+s88+o0WLFjRv3pzXXnuN3//+92XnXnjhBZ577jlWr15Ns2bN2G677VzJXJIEmHxIUkE4/vjjGThwIDvttBM777wzF110EaNGjWLFihW0a9eOvfbai0MOOaTa9fXq1YsbbriB448/nk6dOtG6dWu++tWvlp0fM2YMd999N1/5ylcYNmwYgwcPLju3bNkyhg0bRuvWrctmyzr33HNr9XolSQ1TVOfxezEoKSlJM2bMyHcYkuqhV199lV133TXfYWxU9+7dueWWWzjooIPyHcqXsrHfb0TMTCmVVKOKnH6Ruc5H7XCdD6mgxcZO+ORDkiRJUk4UffLhgHNJkiQpNxrlO4B8SylNBCaWlJQMy3cskvRlvPPOO/kOQZKkain6Jx+SJEmScsPkQ5IkSQJ++ctfEhGcfvrpZccuvvhidtllF5o1a0br1q058MADefrpp6t8f0qJQw89lIjg3nvvLTs+d+5ctttuO+67774K5adMmULjxo2ZPn163VxQPWTyIUmSpKL37LPPcvPNN9OnT58Kx7/+9a9zww03MGfOHKZNm8aOO+7IIYccQmlp6QZ1XHPNNVWua9S7d29Gjx7NqaeeWva+pUuXMnToUM4++2z22WefurmoesjkQ5IkSUVt6dKlfP/73+e2226jdevWFc794Ac/4MADD2SnnXaiV69eXHvttXz22WfMmjWrQrkXXniB66+/nttvv73KNs4991y+9rWvMXz4cADOOOMMWrduzS9+8Ys6uab6yuRDkiRJRW348OEce+yxHHDAAZsst2rVKm6++WZatGhB3759y45/9tlnHH/88dx888106NChyvdutdVW3HHHHUyZMoXvf//7/O///i933nkn22yzTW1eSr1n8iFJkqSiNW7cON566y0uv/zyjZb529/+RvPmzdluu+349a9/zSOPPELHjh3Lzp966qkccsghHHrooZtsq0ePHpx77rncfffdnH/++RUSmGJR9FPtRsQgYFCPHj3yHYqkBqSuV7l29WdJqnuvv/46F1xwAdOmTaNx48YbLXfAAQcwa9YsFi1axLhx4zjuuON45pln6NSpExMmTOAf//gHM2bM2Gx7K1as4J577qFp06ZMmzaNlBIRG10MvCAV/ZOPlNLElNLwli1b5jsUSZIk5dAzzzzDokWL6NWrF40aNaJRo0Y8+eSTjB07lkaNGvHFF18A0KxZM3r06MFee+3FrbfeSuPGjbnlllsAePTRR3nllVdo3rx5WR0AgwcPZt99963Q3nnnnceaNWt4/vnnmTFjBr/73e9ye8H1QNEnH5LU0HXv3p0xY8bQp08fWrZsyeDBg1m5ciXjx4/f4IsvInjrrbcAGDJkCCNGjODQQw+lefPm7LPPPnz44YeMGjWK1q1bs8suu/DSSy9VaOeXv/wlu+22G61bt2bo0KGsXLkSyMzkMnHixLKyq1evpl27dhXeLxWTylO2rl69mvPOO48+ffrQrFkzOnXqxPHHH8/8+fMrvO+LL77gjDPOoF27djRr1owjjjiCBQsWlJ2fPHkyjRs35rnnnqvwvltuuYXmzZvz9ttv1/3FFZAjjzySOXPmMGvWrLKtpKSE733ve8yaNWuj4zHWrVtXlphcccUVzJ49u0IdAGPGjOHOO+8se8/jjz/O2LFjGT9+PL169eKaa67h/PPPL7rPzORDkgrAH//4Rx566CHmzZvH7NmzGT9+fLXfd/nll7No0SK23XZb9t57b/r168eiRYs49thjOeussyqUv+uuu3j44Yd5++23eeONN8r6SJ9wwgn84Q9/KCs3adIkOnXqxB577FFr1yg1FFVN2bp8+XJefPFFLrzwQl588UX++te/8t5773HIIYewZs2asnKjRo3ivvvu45577uGpp55i2bJlHH744axduxaAgQMHcvLJJ3PiiSeyYsUKAN555x3OOussxowZw84775zbi23gWrVqRe/evStszZo1o02bNvTu3ZvPPvuMiy66iOeee4758+czc+ZMTjrpJBYsWMBxxx0HQOfOnTeoA6BLly7stNNOQGZA+tChQxk5ciT77bcfAMOGDWO//fZj6NChrFu3Lj+/gDww+ZCkAvCTn/yEHXbYgTZt2jBo0KANpoDcmKOOOoo999yT7bbbjqOOOortttuOE044ga233prBgwdv8OTi9NNPp0uXLrRp04YLL7yQe+65B8hMRTlp0iSWLVsGwIQJE/jhD39Yq9coNQQbm7K1ZcuWPPLIIwwePJivf/3rfPOb3+Smm27i1Vdf5dVXXy1776233srVV1/NwQcfTL9+/ZgwYQKzZ89mypQpZXWNGTOGNWvWcP7555NSYsiQIXz729/m1FNPzfn1FrpGjRrx8ssvc9RRR9GzZ08GDRrEJ598wtSpUzdY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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_str import Extract\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "columns = [\"Name\"]\n", - "objs = [Extract(columns=['Name','Name'], i_min_vec=[0, 2], i_max_vec=[1, 3])]\n", - "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"Extract\")" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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0ScfklQddguqG76vklRciv6u72xXkiRJUm4UffJhtytJqp5u3boxceLEfIchSWrA6ttsV5LUILzUd9s6rX/PSe/Vaf2SJOVD0Scf5Wa7yncokqQGIM75NN8hFIR0Zft8h1CrbrjhBm666Sbef/99AHbZZRfOP//8sumNhw8fzp133lnhOd/97nd56aWXAFiwYAEXXnghTz31FB988AHt2rXjkEMO4dJLL2XzzTcH4I033qB3797cc889DBkypKyeiRMnctBBB/Hss8+y99575+DVSt+c3a7sdiWpgevWrRtXXHEFO++8M23atGHEiBGsWLGCzz//nEMOOYT27dvTpk0bDjnkED766KOy5+233378/Oc/Z++992bTTTdlwIABzJ8/v+z83XffTdeuXdl888257LLLKlzzlVdeoU+fPmy22WZ06tSJE088ka+++grITKN76qmn0qFDB1q1asWuu+7KG2+8kZs3Q8qTb33rW/zyl7/ktddeY8qUKfTr14/DDz+c6dOnl5Xp378/n3zySdk2bty4snMff/wxc+bM4aqrrmLGjBn88Y9/ZNKkSfz3f/93WZkePXpw0UUX8eMf/5iSkhIAFi5cyIgRIzj99NNNPNQgFH3yIUmF4J577uHJJ5/kvffeY+bMmVx66aWUlpYyYsQIPvjgA2bPnk2zZs048cQTKzxv7Nix3HHHHcybN4+vvvqKq6++GoC33nqLE044gbvvvpuPP/6Yzz77rELisvHGG3Pttdcyf/58XnzxRf72t79x4403AjBhwgQmTZrEzJkzWbhwIffdd1/ZN7dSoTrssMM46KCD6N69O9tvvz2XXXYZm266KS+++GJZmaZNm7LFFluUbW3bti0716NHDx566CEOPfRQunfvzve+9z1+9atfMXHiRBYtWlRW7swzz2T77bdn1KhRAJx00km0adOGiy++OHcvVtoAJh+SVABOPPFEttxyS9q2bct5553Hvffey+abb86QIUNo3rw5m266Keeddx5///vfKzxvxIgRbL/99jRr1oyjjz6aadOmAfDAAw9wyCGH0LdvX5o2bcoll1xSYVrcPfbYgz333JNGjRrRrVs3jj/++LK6GzduzOLFi/nHP/5BSomddtqJTp065ey9kPJt1apV/OlPf2LJkiXstddeZceff/55OnTowPbbb8/IkSOZN2/eOutZtGgRTZs2pXnz5mXHNtpoI+68804mTpzIMcccw5/+9CfuuusumjRpUmevR6pNJh+SVAC23HLLssddu3bl448/ZtmyZRx//PF07dqVVq1a0bdvX7744gtWrVpVVnaLLbYoe9y8eXOWLFkCZLqAlK+zRYsWFVovZs6cySGHHMIWW2xBq1at+NnPflbWZatfv36ceOKJ/OQnP6FDhw6MGjWqwje3UqGaMWMGLVu2pGnTpvz4xz/m4YcfZtdddwVg4MCB3HXXXfztb3/jmmuu4ZVXXqFfv358+eWXVdb1xRdf8POf/5yRI0fSqFHFIbrdu3fnzDPPZOzYsZxzzjn06tWrrl+aVGuKPvlwnQ9JheDDDz8sezx79mw6d+7MNddcwzvvvMPLL7/MokWLmDRpEpAZk7E+nTp1qlDnsmXL+Oyzz8r2TzjhBHbccUfeffddFi1axOWXX16h3p/+9KdMnTqVt956i5kzZ/KrX/2qNl6mVK/tsMMOTJs2jZdffpkTTjiBYcOGlY13+q//+i8OPfRQdt11VwYPHsz48eN55513eOKJJ9aoZ8mSJQwePJguXbpw1VVXrXF++fLl3HvvvTRv3pznn3++Wv+npfqi6JMPB5xLKgQ33HADH330EQsWLOCyyy5j6NChLF68mGbNmrHZZpuxYMECLrroomrXd9RRR/GXv/yF559/nq+++ooLLriA0tLSsvOLFy+mVatWtGzZkn/84x/8/ve/Lzv36quv8vLLL7Ny5UpatGjBJpts4krmKgpNmjShe/fu7LHHHlxxxRX06tWLa6+9tsqynTt35lvf+hbvvvtuheNLlixh0KBBAPzlL39hk002WeO5Z599Nl9//TWvvPIKU6ZM4Xe/+13tvxipjvjbQJIKwA9+8AMGDBjANttsw7bbbsv555/PKaecwvLly2nXrh177rknAwcOrHZ9u+yyCzfccAM/+MEP6NSpE23atOFb3/pW2fmrr76asWPHsummmzJy5EiGDh1adm7RokWMHDmSNm3alM2WdeaZZ9bq65UagtLS0rV2q5o/fz5z5sypMB5q8eLFDBw4kFWrVjFu3Dhatmy5xvOeeeYZbrzxRsaMGcMuu+zCNddcwznnnMN777k2kBqGsKkuo3fv3mnKlCn5DkNSPfT222+z00475TuMterWrRu33nor/fv3z3co38ja3t+ImJpS6l2NKnL6i8x1PmpHoa3zcc4553DwwQez5ZZbsnjxYsaOHcsvf/lLnnjiCfbdd19+8YtfMGTIEDp16sT777/Pueeey4cffsjbb7/NpptuyuLFixkwYACLFi3ikUceYdNNNy2ru23btjRp0oTFixez6667MmTIEK655pqy8wMHDmTZsmU8++yztjKqvoi1nfBfqCRJ0gaaO3cuP/zhD9lhhx34/ve/z6uvvsr48eM56KCD2HjjjZkxYwaHHXYY22+/PcOGDWOHHXbgxRdfLEsypk6dyksvvcRbb73F9ttvT6dOncq2F154AYBTTjmF5s2br7Huzm233caMGTO4/vrrc/66G7obbriBnj170qpVK1q1akWfPn0qjMP5+c9/zo477kiLFi1o06YN3//+98s+j9Xee+89jjjiCNq3b0+rVq04+uijy9ZhgczikJtssgkPPvhghedNnDiRxo0bM3ny5Lp9kfWMK5y7wrkkSdpAY8aMWeu5Zs2a8eSTT67z+fvtt996B47fdtttVR7v0qULn3/++Xpj1JpWLw653XbbUVpayp133snhhx/O1KlT6dmzJzvssAM33HADW2+9NcuXL+faa69l4MCBvPvuu3Ts2JGlS5cyYMAAdt11V55++mkgk7AMHjyYl156iY022qjC4pD77LMPHTt2LOrFIe12lWW3K0lrU9+7XTV0drsqToXW7UqFo23btlxxxRUcf/zxa5xbtGgRrVu35q9//SsHHnggEyZMYODAgXz22We0adMGyKw636ZNGyZMmFDWHba0tJR9992Xdu3a8eijj3Lssccybdo0pkyZUqhrtNjtSpIkSVqbtS0OudpXX33FzTffTKtWrcrWVvnyyy+JiAqzkq2e4e/5558vO+bikP9m8iFJkqSita7FISEz5XHLli3ZZJNNuPbaa3nqqafo2LEjAHvuuSctW7bkzDPPZOnSpSxdupQzzjiDVatW8cknn1S4jotDZph8SJIkqWita3FIgP33359p06bxwgsvMHDgQI4++uiyxKJ9+/bcf//9jB8/nk033ZTWrVvzxRdfsPvuu68x85iLQ2aYfEiSJKlorW9xyBYtWtC9e3f23HNPbrvtNho3bsytt95adn7AgAG89957zJs3j/nz53P33XczZ84cttlmmwrXcXHIjKKf7UqSJBU+JwqoHcUwUcC6Fodc1/l27doB8PTTTzNv3jwOPfTQsnOrF4d85plnyhaHPOWUUxg0aBDbbrtt7b+IeszkQ5IkSUWpqsUhn332WZ544gkWLVrEVVddxeDBg+nUqROffvopN9xwAx999BFHH310WR133HEHO+64Ix06dODFF1/k5JNP5tRTT2WHHXYAMivXjxgxgpNPPpl9990XgJEjR/Lggw8yYsSIolscsuiTD9f5kPRN1PW3qMXw7aIk5dvqxSHnzp1L69at6dmzJ+PHj+fAAw9k2bJlvPnmm9x+++189tlnbL755nznO99h0qRJ9OzZs6yOd955h3PPPZcFCxbQrVs3zjvvPE499dSy8+taHLJHjx5cf/31FcoXOtf5yHKdD0lrU9U6FCYftcd1PopTrv+N+7nVjmK6N2mDuM6HJBWqbt26cfXVV9OzZ09at27N0KFDWbFiBWPGjGGfffapUDYi+Oc//wnA8OHDGT16NAcddBAtW7Zk7733Zu7cuZxyyim0adOGHXfckddff73Cda644gp23nln2rRpw4gRI1ixYgUAPXr04PHHHy8ru3LlStq1a1fh+ZIkmXxIUgG47777+Otf/8qsWbOYPn06Y8aMqfbzLr30UubPn0/Tpk3p06cPu+++O/Pnz+eoo47itNNOq1D+nnvu4cknn+S9995j5syZXHrppQAce+yx/PGPfywrN27cODp16sRuu+1Wa69RktTwmXxIUgH46U9/SufOnWnbti2DBw9m2rRp1XreEUccwR577MEmm2zCEUccwSabbMKxxx7LxhtvzNChQ9douTjxxBPZcsstadu2Leeddx733nsvAD/84Q8ZN24cixYtAuDuu+/mRz/6Ua2+RklSw2fyIUkFYIsttih73Lx5c5YsWVKt561epRegWbNma+xXrmfLLbcse9y1a1c+/vhjADp37szee+/Ngw8+yBdffMH48eM55phjvtFrkSQVrqKf7UqSClWLFi1YtmxZ2f7cuXM3uM4PP/yw7PHs2bPp3Llz2f6wYcO49dZb+frrr+nTpw9dunTZ4OtJkgqLyYckFahvf/vbvPnmm0ybNo0dd9yRX/ziFxtc5w033MAhhxxSNm3k0KFDy84dfvjhjB49mpKSEs4666wNvpYkOUtZ7ahPs5QVbLeriHg4Ij6PiAfyHYsk5cP222/PBRdcQP/+/dluu+3WmPnqm/jBD37AgAED2Gabbdh22205//zzy841a9aMIUOGMGvWLI488sgNvpYkqfAU7DofEbEfsCkwLKV01PrKu86HpLVZ2zoUxaZbt27ceuut9O/ff61lLr74YmbOnFlh5qv1cZ2P4uQ6Hw2Tn1vDlIeWj+Jb5yOl9CywON9xSFKxWLBgAbfddhujRo3KdyiSpHoq58lHRPSNiMciYk5EpIgYXkWZ0RExKyJWRMTUiNg313FKkqrvlltuYcstt+Sggw6ib9+++Q5HklRP5WPAeUvgDeCu7FZBRAwFrgdGA89nf46PiJ1TSrOzZaZRdewDUkof11HcklTU3n///bWeGzlyJCNHjsxdMJKkBinnyUdKaRwwDiAixlRR5DRgTErpluz+SRExEDgBODdbR6/aiCUiRgGjALbaaqvaqFKSJEnSWtSrMR8R0QTYA5hQ6dQEYK/avl5K6eaUUu+UUu/27evPFGSS6p9CnZwj33xfJam41KvkA2gHbAyUVDpeAmyxZvG1i4iJwP3AoIj4KCL6rKXc4Ii4eeHChd8kXklFoHHjxixfvjzfYRSk5cuX07hx43yHIUnKkfqWfNSalFL/lFL7lFLzlNK3UkovrqXc4ymlUa1bt851iJIaiA4dOjBnzhyWLVvmN/W1JKXEsmXLmDNnDh06dMh3OJKkHKlvK5zPB1YBHSsd7wjMzX04kgStWrUC4OOPP2blypV5jqZwNG7cmI4dO5a9v5Kkwlevko+U0lcRMRU4gEyXqdUOAB6si2tGxGBgcPfu3euiekkFolWrVv6RLEnSBsrHOh8tI6JXRPTKXn+r7P7q6aZ+DQyPiOMiYqeIuB7oDPyhLuKx25UkSZKUG/kY89EbeD27NQMuyj6+GCCl9GfgFOB8YBqwDzAopfRBXQTjgHNJkiQpN3KefKSUnk0pRRXb8HJlbkwpdUspNU0p7ZFSmlSH8djyIUmSJOVAwc52JUmSJKl+Kfrkw25XkiRJUm4UffJhtytJkiQpN4o++ZAkSZKUGyYfkiRJknKi6JMPx3xIkiRJuVH0yYdjPiRJkqTcKPrkQ5IkSVJumHxIkiRJyomiTz4c8yFJkiTlRtEnH475kCRJknKj6JMPSZIkSblh8iFJkiQpJ0w+JEmSJOVE0ScfDjiXJEmScqPokw8HnEuSJEm5UfTJhyRJkqTcMPmQJEmSlBMmH5IkSZJyolG+A5AkKV+WL1/Oe++9B8C2225Ls2bN8hyRJBU2Wz4kSUXnyy+/5JRTTqFt27Z8+9vfpmfPnrRt25aTTz6ZFStW5Ds8SSpYtnxIkorOCSecwIQJE7j11lvp06cPAC+++CLnnnsuixcv5vbbb89zhJJUmIo++YiIwcDg7t275zsUSVKO3H///Tz00EMccMABZce22WYbOnTowJAhQ0w+JKmOFH23K9f5kKTi06JFC7p06bLG8S5dujjuQ5LqUNEnH5Kk4nPSSSdx0UUXsXz58rJjy5cv55JLLuGkk07KY2SSVNiKvtuVJKn4vPTSS/z973+nS5cu9OzZE4AZM2bw9ddfs3TpUg499NCyso899li+wpSkgmPyIUkqOu3atWPIkCEVjm299dZ5ikaSiofJhySp6Nxxxx35DkGSipJjPiRJkiTlhC0fkqSis+uuuxIRaz0/ffr0HEYjScWjIJOPiNgSuBvoAHwNXJJSuj+/UUmS6oujjjqqwv7KlSuZNm0akydP5ic/+UmeopKkwleQyQeZhOOUlNK0iNgCmBoR41JKS/MdmCQp/y688MIqj//qV7/igw8+yHE0klQ8CnLMR0rpk5TStOzjucB8oG1eg5Ik1XtHHnkk99xzT77DkKSClfPkIyL6RsRjETEnIlJEDK+izOiImBURKyJiakTsuwHX2wPYOKX04YbELUkqfJMmTaJ58+b5DkOSClY+ul21BN4A7spuFUTEUOB6YDTwfPbn+IjYOaU0O1tmGlXHPiCl9HG5utpmrzGyll+DJKkBK7+IIEBKiU8++YTXX399rV2yJEkbLufJR0ppHDAOICLGVFHkNGBMSumW7P5JETEQOAE4N1tHr/VdJyKaAo8AV6aUXtjgwCVJBWPzzTevsL/RRhuxyy67cPnllzNgwIA8RSVJha9eDTiPiCbAHsDVlU5NAPaqQT0BjAGeTindvY5yo4BRAFtttVVNw5UkNVAuMihJ+VHfBpy3AzYGSiodLwG2qEE9ewNDgcMjYlp227VyoZTSzSml3iml3u3bt//GQUuSGq4rr7ySL774It9hSFJRqG/JR61IKT2fUtoopdSr3DajqrIRMTgibl64cGGuw5Qk1QOXX345CxYsyHcYklQU6lvyMR9YBXSsdLwjMLcuLphSejylNKp169Z1Ub0kqZ5LKeU7BEkqGvUq+UgpfQVMBQ6odOoAoE4GjdvyIUmSJOVGPtb5aBkRvSKiV/b6W2X3V4/4/jUwPCKOi4idIuJ6oDPwh7qIx5YPSSpub731Fl27ds13GJJUFPIx21Vv4Jly+xdltzuB4SmlP0fE5sD5QCcya4IMSil9UBfBRMRgYHD37t3ronpJUj235ZZb5jsESSoa1Uo+ImIn4L+B7wHdgGbAp8BrwHjgwZTSl9WpK6X0LBDrKXMjcGN16ttQKaXHgcd79+7tQoSSVMA22mgjMjOxr9+qVavqOBpJKk7rTD4iYnfgKmAfYDKZcRcPAMuBtkAP4DLgtxFxFXBddZMQSZJy6b777itLPkpKSrjgggs44ogj6NOnDwAvvvgijzzyCBdddFE+w5Skgra+lo+HySQf/5lS+nxthSKiD3AqcAaZZKTBsNuVJBWHo446quzxoYceyhVXXMHIkf9u9P6f//kf/uM//oNHHnmE0aNH5yNESSp46xtwvl1K6YZ1JR4AKaUXU0pHA7+qvdBywwHnklR8nn76afbff/81ju+///48++yzuQ9IkorEOpOP7NS3axURjWtSXpKk+qBdu3Y88MADaxx/4IEHaN++fR4ikqTiUO3ZriLip8CclNKD2f3bgGER8R5waErpnTqKUZKkWnXxxRczYsQInnnmmbIxHy+99BITJ07ktttuy3N0klS4arLOx0/JzHBFRPQFjgZ+AEwDrqn1yHLERQYlqfgce+yxvPDCC7Rr147HHnuMxx57jM0335zJkyczbNiwfIcnSQWrJut8dAFmZR8PBu5PKd0XETOA52o9shxxql1JKk7f/e53ueeee/IdhiQVlZq0fCwCOmQfHwD8Lft4JbBJbQYlSVJdKykp4eqrr2b06NHMnz8fgMmTJzNr1qz1PFOS9E3VJPmYANwSEbcC3cksLgiwC/9uEZEkqd6bOnUqO+ywA/fccw+33norixYtAuCpp57ivPPOy3N0klS4apJ8/ITMQoPtgaNSSguyx3cH7q3twHLFMR+SVHzOOOMMTj75ZF5//XWaNm1advzAAw9k8uTJeYxMkgpbtcd8pJQWASdVcfzCWo0oxxzzIUnFZ+rUqVXOatWpUydKSkryEJEkFYd1tnxExKY1qaym5SVJyodmzZrx+edrrp/7j3/8gw4dOlTxDElSbVhft6t3I+L8iPjW2gpExEYRcVBEPEWma5YkSfXaYYcdxkUXXcSXX34JQETw/vvvc/bZZzNkyJA8RydJhWt93a72BS4D/pWdUncK8DGwAmgD7AzsCSwHLgduqbtQJUmqHVdffTWDBg2iffv2LFu2jH322YeSkhL23ntvLr300nyHJ0kFa53JR0rpXeDoiNiSzKKC+wL/ATQD5gOvAzcD41JKpXUcqyRJtaJVq1Y8//zzPP3007z22muUlpay++67079//3yHJkkFrVoDzlNKH5JZxbzBrmS+NhExGBjcvXv3fIciScqxfv360a9fv3yHIUlFoyZT7RaklNLjKaVRrVu3zncokqQcuvHGG9lll11o3rw5//rXvwC48sorue+++/IcmSQVrqJPPiRJxee6667j0ksvZdSoUaSUyo536dKF3/3ud3mMTJIKm8mHJKno/OEPf+CWW27h5JNPplGjf/dA3n333XnzzTfzGJkkFbZqLzKo2vNS323zHUK17DnpvXyHINWKhvB/zv9vufXBBx/Qo0ePNY43btyY5cuX5yEiSSoOJh9SNTWEP2DBP2Kl6thmm2147bXX6Nq1a4Xj48aNY+edd85TVJJU+GqUfERER+BHwLbAz1NK8yNib+DjlNKsughQkqTadsYZZ3DiiSeybNkyUkq8+OKL3H333Vx11VXcfvvt+Q5PkgpWtZOPiNgD+BswC9gF+BWZtT4OALYHflAXAUqSVNtGjBjB119/zc9+9jOWLVvGj370Izp37sxvfvMbhg4dmu/wJKlg1aTl42rg+pTShRGxuNzxJ4ERtRtW7rjOhyQVp5EjRzJy5Ejmz59PaWkpHTp0yHdIklTwajLb1R7AnVUc/wToWDvh5J7rfEhS8Xrvvfd46aWXeOWVV8rW+pAk1Z2atHwsB9pUcXxHYF7thCNJUt377LPP+N///V8ee+wxNtoo8z1cSolDDjmE22+/nc033zzPEUpSYapJy8ejwIUR0TS7nyKiG/BL4MHaDkySpLpy3HHH8c9//pPnnnuOFStWsGLFCiZNmsSsWbMYOXJkvsOTpIJVk5aPM4BxwKdAc+B5Mt2tJgPn135okiTVjSeffJK//e1v9OnTp+zY3nvvzU033UT//v3zGJkkFbZqJx8ppUXAPhHRD9idTKvJaymliXUVnCRJdaF9+/a0aNFijePNmze3y5Uk1aGadLsCIKX0dErp6pTSVSYekqSG6IILLuCUU05hzpw5ZcfmzJnD6aefzgUXXJDHyCSpsNV0kcHdgP2BDlRKXFJKZ9ViXN9YRGwGTCTz2hqRmR74lrwGJUmqV6677jref/99unXrRpcuXYBM8rHJJpswb948fvOb35SVnT59er7ClKSCU5NFBs8CrgQ+AEqAVO50qvJJ+bEY6JtSWhYRLYA3IuKhlNJn+Q5MklQ/HHXUUfkOQZKKUk1aPk4FTkgp3VRXwdSGlNIqYFl2tykQ2U2SJAAuvPDCfIcgSUWpJmM+NgL+tiEXi4i+EfFYRMyJiBQRw6soMzoiZkXEioiYGhH7foPrbBYR/wd8BPwqpTR/Q+KWJBWWTz/9lE8//bRsf8aMGZx//vnce++9eYxKkgpfTZKP3wMjNvB6LYE3gJPJLFpYQUQMBa4HLgd2A14AxkfEVuXKTIuIN6rYOq8uk1L6IqX0bWBr4AcR0WBXYJck1b6jjz6axx9/HID58+fTt29fHn74YX784x9zzTXX5Dk6SSpcNel2dREwLiJeJ5NArCx/MqX0P+urIKU0jsxaIUTEmCqKnAaMKTdA/KSIGAicAJybraNXdQNOKZVkW0D2BR6o7vMkSYVt+vTp7LnnngA88MADdO/enVdffZVHH32UM888k9NPPz3PEUpSYapJy8dlwADga6AN0L7StkEiogmwBzCh0qkJwF41qKdjRGyafdwa6Au8s5ayoyJiSkRMKd/8LkkqbMuXL6dly5YATJw4kUMPPRSA3XffnQ8//DCfoUlSQatJ8jEa+EFK6TsppUNSSoPLb7UQSztgYzIzaZVXAmxRg3q6As9lWzyeA36bUppRVcGU0s0ppd4ppd7t229w/iRJaiC22247HnroIT788EMmTJjAgAEDACgpKWGzzTbLb3CSVMBqknwsB16vq0BqS0rplZRSr5TSt1NKPdc3O1dEDI6ImxcuXJirECVJeXbhhRdy9tln061bN/bcc0+++93vAvDkk0+y22675Tk6SSpcNUk+rgVOiYi6mrZ2PrAKqDw4vCMwt46uSUrp8ZTSqNatW9fVJSRJ9cyRRx7J7NmzmTJlCn/961/Ljvfv359f//rXeYxMkgpbTQac70tm/MTBEfEWaw44P3RDAkkpfRURU4EDgPvLnToAeHBD6l6XiBgMDO7evXtdXUKSVA917NiRjh0rft+1ugVEklQ3apJ8zAce2pCLRURLYPVf+RsBW0VEL2BBSmk28Gvg7oh4BZgM/BjoDPxhQ667Limlx4HHe/fuPbKuriFJkiSpBslHSmlD1/gA6A08U27/oux2JzA8pfTniNgcOB/oRGZK30EppQ9q4dqSJEmS8qgmLR8bLKX0LLDOMSMppRuBG3MSEHa7kiRJknJlnclHREwHvpdS+jwiZgBpbWVTSj1rO7hcsNuVJEmSlBvra/l4EPiy3OO1Jh+SJDUkJSUl3H333bz33ntccskltGvXjsmTJ9O5c2e23nrrfIcnSQVpnclHSumico9/UefR5IHdriSp+EydOpXvf//7bL311rz55puceeaZtGvXjqeeeoqZM2cyduzYfIcoSQWp2ut8RMTTEbFZFcdbRcTTtRpVDrnOhyQVnzPOOIOTTz6Z119/naZNm5YdP/DAA5k8eXIeI5OkwlaTRQb3A5pUcXwTMmuASJLUIEydOpVhw4atcbxTp06UlJTkISJJKg7rne0qInYvt9szIhaU298YOBCYU9uB5YrdriSp+DRr1ozPP/98jeP/+Mc/6NChQx4ikqTiUJ2WjynAq2QGm0/I7q/eXgbOBS6uqwDrmt2uJKn4HHbYYVx00UV8+WVmTpWI4P333+fss89myJAheY5OkgpXdZKPrYFtyazP8R/Z/dVbF6BVSun2OotQkqRadvXVV7NgwQLat2/PsmXL2GeffejevTubbbYZl156ab7Dk6SCtd5uV+VWF6/J+BBJkuqtVq1a8fzzz/P000/z2muvUVpayu67707//v3zHZokFbQarXAeEd8C+gIdqJSMpJR+XYtxSZJU5/r160e/fv3yHYYkFY1qJx8RcQxwO/A18CkVFxxMQINMPhxwLknF6fXXX+eZZ55h3rx5lJaWVjh31VVX5SkqSSpsNWn5uBi4Bvh5SmlVHcWTcymlx4HHe/fuPTLfsUiScuOqq67inHPOoWvXrnTs2JGIKDtX/rEkqXbVJPnoCNxaSImHJKk4XXvttfz+97/n+OOPz3coklRUajKIfBzw3boKRJKkXCktLeX73/9+vsOQpKJTk5aPp4BfRsQuwAxgZfmTKaWHajMwSZLqygknnMAdd9zBZZddlu9QJKmo1CT5uCn782dVnEtkVjtvcBxwLknF58ILL2TQoEHstttu9OjRg8aNG1c4f/vtLl8lSXWh2t2uUkobrWNrkIkHuMK5JBWj8847jwkTJtCoUSM+//xzPv300wqbJKlu1GidD0mSCsGNN97I2LFjGTp0aL5DkaSiUpN1Pk5b13kXGZQkNRTNmjVjt912y3cYklR0atLycVKl/cZAJ2A5MI8GusigJKn4nHrqqVx33XXccMMNrushSTlU7eQjpbR15WMR0RG4A7ilNoOSJKkuPffcc0yaNIknnniCnXfeeY0B54899lieIpOkwrZBYz5SSiURcR5wH/Bw7YQkSVLdateuHUceeWS+w5CkolMbA843IrP6uSRJDcIdd9yR7xAkqSjVZMB55a+IgsyYj58Az9VmULnkOh+SJElSbtSk5eOBSvsJ+BR4Gji91iLKsZTS48DjvXv3HpnvWCRJdadnz578/e9/p02bNuy6667rHGg+ffr0HEYmScWjJgPOq70goSRJ9c2QIUNo2rRp2WNnuZKk3KtW8hERjYHngWNTSu/UbUiSJNW+Cy+8sOzxL37xi/wFIklFrFqtGSmllcDWZLpaSZLUoPXr148vvvhijeOLFi2iX79+uQ9IkopETbpS3Qk4LkKS1OA9++yzfPXVV2scX7FiBc8912DnUJGkeq8mA85bAMdExAHAVGBp+ZMppZ/WZmCSJNW21157rezx9OnTadu2bdn+qlWrePLJJ+nSpUs+QpOkolCT5GMnYPVde5tK5+pdd6yIaA68DdyfUjoj3/FIkvKvd+/eRAQRwYABA9Y436xZM37729/mITJJKg41me1q/7oMpA6cB7yU7yAkSfXHrFmzSCmxzTbb8Morr9C+ffuyc02aNKFDhw5svPHGeYxQkgpbbaxwXu9ExHbAjsDjQI88hyNJqie6du0KQGlpaZ4jkaTilNPkIyL6AmcAewCdgREppTGVyowGziSzevqbwCkppZqO/rs6W8deGxqzJKkwffTRR0yaNIl58+atkYycdtppeYpKkgpbrls+WgJvAHdltwoiYihwPTCazLoio4HxEbFzSml2tsw0qo57QErp44g4DJiZUpoZESYfkqQ13HPPPfzP//wPjRo1on379hUWHIwIkw9JqiM5TT5SSuOAcQARMaaKIqcBY1JKt2T3T4qIgcAJwLnZOnqt5zJ7Av8VEf9JJtlpHBGLUkoXb/grkCQVggsuuIDTTz+dSy65xDEekpRDNVnno05FRBMy3bEmVDo1gRp0n0opnZtS2jKl1I1MF69b1pZ4RMSoiJgSEVM+/fTTbxi5JKmhKSkp4bjjjjPxkKQcqzfJB9AO2BgoqXS8BNiiLi6YUro5pdQ7pdS7/IwnkqTCNmjQIF5++eV8hyFJRacgZ7tarfJg9qpExGBgcPfu3es+IElSvXDAAQdw9tln8+abb7LrrrvSuHHjCuePPPLIPEUmSYWtPiUf84FVQMdKxzsCc+vqoimlx4HHe/fuPbKuriFJql+OP/54AC6//PI1zkUEq1atynVIklQU6k23q5TSV8BU4IBKpw4AXqir60bE4Ii4eeHChXV1CUlSPVNaWrrWzcRDkupOTpOPiGgZEb0iolf22ltl97fKFvk1MDwijouInSLiejLrgfyhrmJKKT2eUhrVunXrurqEJEmSJHLf7ao38Ey5/Yuy253A8JTSnyNic+B8MosMvgEMSil9kOM4JUkF7Ne//vU6z7vOhyTVjVyv8/EsEOspcyNwY04CwgHnklSMfvvb31bYX7lyJZ988gnNmjWjQ4cOJh+SVEfq04DzvHDAuSQVn1mzZq1xrKSkhBEjRjBypL8OJKmu1JsB55Ik5VPHjh257LLLOOuss/IdiiQVrKJPPpztSpK0WmlpKSUllde6lSTVFrtd2e1KkorOQw89VGE/pcQnn3zCDTfcwL777punqCSp8BV98iFJKj5HHXVUhf2IoH379vTr149rrrkmT1FJUuEz+ZAkFZ3S0tJ8hyBJRckxH475kKSisnLlSr773e/yzjvv5DsUSSo6RZ98uMK5JBWXxo0bM2vWLCLWueyUJKkOFH3yIUkqPsOGDeOWW27JdxiSVHQc8yFJKjpLly7lnnvu4amnnmKPPfagRYsWFc7/5je/yVNkklTYij75iIjBwODu3bvnOxRJUo68/fbb7L777gD861//qnDO7liSVHeKPvlwnQ9JKj7PPPNMvkOQpKLkmA9JkiRJOWHyIUmSJCknTD4kSZIk5UTRJx8uMihJkiTlRtEnHy4yKEmSJOVG0ScfkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5UTRJx+u8yFJkiTlRtEnH67zIUmSJOVG0ScfkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5USjfAdQFyLifWARUAp8nlLaP78RSZIkSSrI5CNrr5TSknwHIUmSJCnDbleSJEmSciKnyUdE9I2IxyJiTkSkiBheRZnRETErIlZExNSI2PcbXCoBf4+IVyPimA0OXJIkSdIGy3W3q5bAG8Bd2a2CiBgKXA+MBp7P/hwfETunlGZny0yj6rgHpJQ+zj7eJ6U0JyI6ARMjYkZKaXqtvxpJkiRJ1ZbT5COlNA4YBxARY6oochowJqV0S3b/pIgYCJwAnJuto1c1rjMn+/OTiBgH7A6YfEiSJEl5VG/GfEREE2APYEKlUxOAvWpQT4uI2DT7uCXQD3hzLWVHRcSUiJjy6aeffrPAJUmSJFVLvUk+gHbAxkBJpeMlwBY1qKcj8HxE/B/wEnBXSunVqgqmlG5OKfVOKfVu3779N4lZkiRJUjUV3FS7KaV/Ad+ubvmIGAwM7t69e90FJUmSJKletXzMB1aRabkoryMwt64umlJ6PKU0qnXr1nV1CUmSJEnUo+QjpfQVMBU4oNKpA4AX6uq6ETE4Im5euHBhXV1CkiRJErlf56NlRPSKiF7Za2+V3d8qW+TXwPCIOC4idoqI64HOwB/qKiZbPiRJkqTcyPWYj97AM+X2L8pudwLDU0p/jojNgfOBTmTWBBmUUvqgrgJyzIek+iDOqf8z7qUrnZhDkrRhctrykVJ6NqUUVWzDy5W5MaXULaXUNKW0R0ppUh3HZMuHJEmSlAMFN9uVao/fxDZMfm6SJKm+qjcDzvPFAeeSJElSbhR98mG3K0mSJCk3ij75kCRJkpQbJh+SJEmScqLokw/HfEiSJEm5UfTJh2M+JEmSpNwo+uRDkiRJUm6YfEiSJEnKiaJPPhzzIUmSJOVG0ScfjvmQJEmScqPokw9JkiRJuWHyIUmSJCknTD4kSZIk5YTJhyRJkqScKPrkw9muJEmSpNwo+uTD2a4kSZKk3Cj65EOSJElSbph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5UTRJx9OtStJkiTlRtEnH061K0mSJOVG0ScfkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5URBJh8RsXVEPBMRb0XEjIhoke+YJEmSpGLXKN8B1JExwPkppecioi3wZZ7jkSRJkopewSUfEbELsDKl9BxASmlBnkOSJEmSRI67XUVE34h4LCLmRESKiOFVlBkdEbMiYkVETI2IfWt4me2AJRHxeES8FhE/q5XgJUmSJG2QXLd8tATeAO7KbhVExFDgemA08Hz25/iI2DmlNDtbZhpVxz0gpfRx9ty+QC9gHvDXiHg1pfRUrb8aSZIkSdWW0+QjpTQOGAcQEWOqKHIaMCaldEt2/6SIGAicAJybraPXei4zB5iSUvowe51xZBIRkw9JkiQpjyKllJ8LRywBTkwpjcnuNwGWAf+dUrq/XLkbgB4ppe9Vs95GwKtAP2Ah8ChwU0rpL1WUHQWMyu7uALzzjV9QYWoHzM93EKoxP7eGyc9tTV1TSu3zHURDFBGjUko35zsO1YyfW8Pk51Yz9WnAeTtgY6Ck0vESoH91K0kpfZ0d5zEJCGBCVYlHtuzNgP9Y1iIipqSUeuc7DtWMn1vD5OemWjYKf781RH5uDZOfWw3Up+Sj1qSUxgPj8x2HJEmSpH+rT4sMzgdWAR0rHe8IzM19OJIkSZJqU71JPlJKXwFTgQMqnToAeCH3EQmbEBsqP7eGyc9Ntcl/Tw2Tn1vD5OdWAzkdcB4RLYHu2d0XgCuBx4AFKaXZ2al27yYzxe5k4MfA/wK7pJQ+yFmgkiRJkmpdrpOP/YBnqjh1Z0ppeLbMaOAsoBOZNUFOTSlNylGIkiRJkupI3qbalSRJklRc6s2YD9UPEdE3Ih6LiDkRkSJieL5jUkXr+4wi4xcR8XFELI+IZyNilzyFW7Rq43OKiDYRcXdELMxud0fEZrl8HWo4vH83DN7DGwbv4XXH5EOVtSTT3e1kYHmeY1HV1vcZnQWcDpwEfAeYBzwVEZvmLEJB7XxOY4HdgYHZbXcy4+Kkqnj/bhi8hzcM3sPriN2utFaVV6FX/VP5M4qIAD4GfpdSuix7rBmZm+IZKaWb8hVrMfsmn1NE7AS8BeyTUpqcLbMP8BywY0rpndy/EjUU3r8bBu/hDYP38Nply4dUWLYGtgAmrD6QUloOTAL2yldQWkN1Pqc+wBIqTjU+GViKn6VUqLyHNwzewzeAyYdUWLbI/iypdLyk3DnlX3U+py2AT1O55uns43n4WUqFynt4w+A9fAOYfEiSJEnKCZMPqbDMzf7sWOl4x3LnlH/V+ZzmAu2zfYuBsn7GHfCzlAqV9/CGwXv4BjD5kArLLDI3tQNWH4iITYB9qdjvVPlVnc/pRTKzrfQp97w+QAv8LKVC5T28YfAevgEa5TsA1S8R0RLont3dCNgqInoBC1JKs/MWmMqs7zOKiOuAn0XEP4CZwPlkBr2NzUO4RWtDP6eU0tsR8VfgpogYla3nJuAvxTxLitbO+3fD4D28YfAeXnecalcVRMR+wDNVnLozpTQ8p8GoSuv7jLLNuhcCxwNtgJeBn6SU3shZkKqVzyki2gC/BQ7NHnqMzHSPX9Rd5GqovH83DN7DGwbv4XXH5EOSJElSTjjmQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZDyKCK2iIgJEbE0Iupk3uuI2C8iUkS0q4v6JalYeQ+Xas7kQ6qGiGgfEV9FRIuIaJz9RbNVLVR9BtAZ6AV0qoX6JEmVeA+X6o9G+Q5AaiD6AP+XUloaEd8FFqSUZtdCvd2BqSmld2uhLklS1byHS/WELR9S9ewFTM4+3qfc43WKiOMj4p/Zb9z+GREjy517HzgMODbbpD5mHfUMioiXI2J5RHwWEY9HxCbZc20i4s6I+Dx7fmJE7LKOuoZHxJJKxyo0668uExEHRcQ/ImJZRDwWEa0j4qiIeDciFkbE3RHRrFw9z0bEjRFxeUTMj4h5EXF1RGxUrsyRETE9G+uCiPh7RHSszvspSd+Q93Dv4aonbPmQ1iLbJD89u9scWBURw4FmQIqIL4CxKaXRa3n+EcDvgFOBCcCBwI0RMTel9DjwHWAssAA4GVi+lnoGAo8BVwIjyPy/HcC/vzwYA+xA5pfg58BlwF8jYvuUUpV1VlNT4HTgGKAJ8GB2Ww4MATYHHgJGA9eUe94xwPVkftn3yr7GqcC9EbEF8Cfg3GxdLYE9NyBGSaqS93Dv4aqnUkpubm5VbGR+QXQDegJfZX9uCywG+mbPtVvH8ycDt1c6NgZ4vtz+X4Ax64ljMvCntZzbDkhA33LHWgMLgeOy+/tly7TL7g8HllSqp6oyCdihXJmrgVXlX3P29fyl3P6zwIuV6n4KuDX7ePdsvV3z/fm6ubkV9uY93Hu4W/3c7HYlrUVK6euU0vvAjsCrKaXpwBZASUppUkrp/ZTS/HVUsRNrNu0/D+xcw1B2A/62jmuUAi+Wi3shMOMbXKeyL1NK75TbLwHmVnrNJUCHSs+bXmn/43Jl/g+YCLwREQ9GxAkR0X4D45SkNXgP9x6u+sluV9JaRMSbQFegMbBRto9tI6BR9vEHKaW19stdhzqZjrEG1ykFotKxxlWU+7qK+lZWcazylxhrLZNSWhURA8g00w8A/he4IiK+l1L6v7XEK0k15j3ce7jqJ1s+pLUbRKa/61zgh9nHbwCnZB8PWs/z3wb2rnRsH+CtGsbxOvD9dVxjIzIzuQAQEa2AXddxnU+B5tlyq/WqYUzfWMp4MaV0EZk+0x8DQ3N1fUlFw3t4HfAerg1ly4e0FimlD7KD6zoCj5L59mcX4MGU0ifVqOJXwP0RMZXMYMWBZAbyHVnDUC4DHo+If5IZ+BdkvnG6KaX0bkQ8CtwUEaOAL7LlF2XLVuVlYCmZb6uuBb5NZsBhnYuIPYH+wJNkmvt3A7ak5r/MJWmdvIfXPu/hqg22fEjrth+ZvsIrgP8APqrmLy1SSo8AJ5GZKeUtMrOhjE6ZWVKqLaU0DjgCOIjMN2h/B/Yn0/QOmdlTXiEzm8orZGZ1GZjWMktKSmkBmV+gB5DpVzwK+HlNYtoAC8l8k/gX4F0yM6xcklL6Y46uL6m47If38NrkPVwbLFLKVddFSZIkScXMlg9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScMPmQJEmSlBMmH5IkSZJywuRDkiRJUk6YfEiSJEnKCZMPSZIkSTnx/6T+l4qeNfgQAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_str import StringContains\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "columns = [\"Name\"]\n", - "objs = [StringContains(columns=['Name', 'Name'], contains_vec=['Mr', 'Mrs'])]\n", - "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"StringContains\")" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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L5JSehUYAfwhIjpk624FjAWuTylNy+E9SipSdXbMR0QsBc5IKY0rd+w54OWU0pByx94B7kspXRQR3wbOTykdkz13I/B8SumuvAYvSVItiYgWZMYx/iClNDEidgHeAnqklP4vW2YzYD7wy5TSmPXUcyTwd2DrlNLicu97CliQUjo6Iv4M9ABKUkpf5fjWJBWhxoUOoLoiYnOgFzCq0qnJZL4dAnge2CsiOpN5UB8BXLmBOocCQwG23HLLXrvttltthy1J+ppmzJixIKXUrhpF6+a3aLVk7ty5dOrUiaeeemoCwMsvv8w+++zDm2++OXNtmZQSXbp04dBDD70duL2qeu6++24GDx7MkiVLFpV/37///W++8Y1vcMIJJ6QmTZrw/PPP06NHjy9zfV+SGrRY34l6k3wAbYFGQGml46VAP4CU0qqIOBd4gkyXsus2NNNVSuk24DaAkpKSNH369FzELUn6GiLi/ULHUBcMHz6cHj160Lt3bwB22203tt9+e375y19y++2306JFC2644QY++ugj5s2bV2Udn3/+OZdeeilDhgyhceOKf/q7d+/O+eefz8iRI7n00kvp0aNHrm9JUhGra2M+NllKaUJKaZeUUvdscrFBETEgIm5btGjRxopKkpRX55xzDlOnTuX++++nUaNGADRp0oQHHniAd999l2222YbmzZvzxBNPcMQRR7DZZuv+WV+6dCkDBgygc+fOXHfddeucX758OXfffTfNmzdn6tSp1NXu2JIahvqUfCwAVgMdKh3vQKaf69eSUpqYUhraqlWrTYlNkqRadfbZZ3P33Xfz+OOPs+OOO1Y416tXL2bOnMnnn3/OvHnz+Oc//8mnn366TrmlS5dy5JFHAvD3v/+dpk2brnOdCy64gFWrVvH8888zffp0fve73+Xuphqwa6+9lm9+85u0bNmSdu3aMWDAAF599dUKZZYuXcqZZ57JdtttR7Nmzdh111254YYbKpQ55JBDiIgK249+9KOy86+++ipNmzbl/vvvr/C+Rx99lCZNmjBtmvMEqG6rN8lHduDbDOCwSqcOIzPr1ddiy4ckqa4ZPnx4WeKxofGIrVq1ol27drzzzjtMnz6do48+uuzckiVLOPzww1m9ejWTJk2iRYsW67z/iSeeYPTo0YwbN44999yT66+/ngsvvJB33303J/fVkE2ZMoVhw4bx9NNP8/jjj9O4cWP69evHwoULy8qcc845/OMf/2D8+PG88cYbXHzxxVx44YWMHz++Ql2DBw9m3rx5Zdutt95adm6vvfZi5MiR/OxnP6O0NNMTfdGiRQwePJhzzz2XAw5whmTVbXVqtqvsjB7ds7tPA78CJgALU0ofZKfaHQ8MA6YBPwN+CuyZUtqkvsGO+ZCkuiUiZqSUSqpRtO78IasFp59+OuPHj+fBBx9kjz32KDveokWLsgTi3nvvpW3btnTt2pVXXnmF4cOH06tXr7Jvw5csWUL//v1ZvHgxDz74IFtttVVZPW3atGHzzTdnyZIl7L333gwcOJDrr7++7Pzhhx/OsmXLmDJlSpXduFQ9S5cupVWrVjz44IMMGDAAyCQOAwcOZOTIkWXlDj74YPbee++yFqdDDjmEvfbaa4MtUGvWrOGggw6ibdu2/O1vf+PEE09k5syZTJ8+nc033zy3NyZVT70ZcF5CZrD4WiOz25+Ak1NK/5tdIOkSoCOZNUGO3NTEQ5I2ZM2aNSxYsIDPP/+c1atXFzqcBqNRo0ZsvfXWtG3b1n/kljN69GgADj300ArHR4wYweWXXw7AvHnzOOeccygtLaVjx46ceOKJXHrppWVlZ8yYwbPPPgvALrvsUqGeJ554gkMOOYSzzjqL5s2bc/XVV1c4f8cdd7DXXntx0003cfbZZ9f27RWNJUuWsGbNGlq3bl127MADD2TixImccsopdOnShaeffpqZM2dy/vnnV3jvX/7yF/7yl7/QoUMHjjjiCEaMGFEhgdxss83405/+tHaWMu69916ef/55Ew/VC3Wq5aMQImIAMKB79+5D3nnnnUKHI6kO+uCDD4gIOnToQJMmTcis8aZNkVJi5cqVlJaWklJi++3XXSu2WFs+1DD88Ic/LOsOt3aygK+++opTTz2VcePGlc06dvPNN/Ozn/2s7H233XYbXbt2pVOnTrz22mtcdNFF7LzzzkyePHmda1x++eVls5RdccUV+bkxqXrqTctH3qWUJgITS0pKhmy0sKSi9MUXX7Drrrv67Xwtigg233xzOnfuzFtvvVXocKRatXaWsqlTp5YlHpBJNJ5++mkmTJhA165defLJJznvvPPo1q0bhx9+OABDhw4tK7/33nuz4447st9++/Hiiy/Ss2fPsnNVzVLmFyOqD/xLKknVYOKRG/5e1dCsb5ay5cuXc9FFF3HdddcxYMAA9tlnH8444wx+9KMfMWpU5fWT/6OkpIRGjRpRuXeGs5Spvir6p76zXUmSpNqwoVnKVq5cycqVKyu0hEBm7NOaNWvWW+crr7zC6tWr6dixY9kxZylTfVb0yYfrfEhS9XTr1o1HH3200GFIddLpp5/O2LFjueuuu2jdujXz589n/vz5LF26FICWLVty8MEHc+GFFzJlyhRmzZrFuHHj+POf/8wxxxwDwLvvvssVV1zB9OnTmT17NpMmTeJHP/oR++67b9kUukuWLGHw4MEMHz6cgw46CIAhQ4Zw0EEHMXjw4A0mMlJdUPRjPiTp63i2z045rX//J/0GU6pPqjNL2V/+8hcuuugiTjjhBBYuXEjXrl258sorOeOMMwDYfPPNeeyxx7jppptYunQpXbp04Xvf+x4jRowoazFxljLVd0WffJSb7arQoUiS6oG48JNCh9AgpF+1K3QItao6s4duu+22jB07dr3nu3Tpwr/+9a8N1nHHHXdUebxz58589tlnG41BKjS7XdntSlI9161bN6699lr22GMPWrduzeDBg1mxYgWfffYZRx11FO3ataN169YcddRRfPTRR2XvO+SQQ7j00ks54IAD2Gqrrejfvz8LFiwoOz9+/Hi6du3KNttss863rM8//zy9e/dm6623pmPHjpxxxhl89dVXQOYfYWeffTbt27enZcuW7L333rz66qv5+WVIkuq0ok8+JKkhuPPOO3n44Yd59913efvtt7nqqqtYs2YNgwcP5v333+eDDz6gWbNmZd071rrrrrsYO3YsH3/8MV999VXZrDuvv/46p512GuPHj2fu3Ll8+umnFRKXRo0accMNN7BgwQKeeeYZHnvssbJuJ5MnT+bJJ5/k7bffZtGiRdxzzz1ss802+ftlSJLqLJMPSWoAzjjjDLp06UKbNm24+OKLufvuu9lmm20YOHAgzZs3Z6uttuLiiy9ep0vH4MGD2WWXXWjWrBk//OEPmTlzJgD33XcfRx11FH369GGLLbbgyiuvrDAtbq9evdh///1p3Lgx3bp149RTTy2ru0mTJixZsoQ333yTlBK77757hZl6JEnFy+RDkhqALl26lL3u2rUrc+fOZdmyZZx66ql07dqVli1b0qdPHz7//HNWr15dVnbbbbcte928efOymXnmzp1boc4tt9yyQuvF22+/zVFHHcW2225Ly5Yt+eUvf1nWZatv376cccYZnH766bRv356hQ4eyePHinN27JKn+KPrkw3U+JDUEH374YdnrDz74gE6dOnH99dfz1ltv8dxzz7F48WKefPJJoHoDYzt27FihzmXLlvHpp5+W7Z922mnstttuvPPOOyxevJhrrrmmQr0///nPmTFjBq+//jpvv/02v/71r2vjNiVJ9VzRz3aVUpoITCwpKRlS6Fgk6eu65ZZbOOqoo8qm4Bw0aBBLliyhWbNmbL311ixcuJCRI0dWu77jjjuO/fbbj6lTp/Ktb32Lyy67rML6AUuWLKFly5a0aNGCN998k9///ve0a5eZveiFF15gzZo19OzZky233JKmTZu6krkKzlnKakdDm6VM+edfA0lqAI4//nj69+/PjjvuyE477cQll1zCWWedxfLly2nbti37778/hx9+eLXr23PPPbnllls4/vjj6dixI61bt2a77bYrOz9q1CjuuusuttpqK4YMGcKgQYPKzi1evJghQ4bQunXrstmyzj///Fq9X0lS/RTVaX4vBiUlJWn69OmFDkNSHfTGG2+w++67FzqM9erWrRtjxoyhX79+hQ7la1nf7zciZqSUSqpRRV7/kPkNeu3I9zfofm61w5YPVVOs74QtH5IkSZLyouiTDwecS5IkSfnhgHMHnEuq52bPnl3oECRJqpaib/mQJEmSlB8mH5IkSZLywuRDkiRJRenaa6/lm9/8Ji1btqRdu3YMGDCAV199tUKZk08+mYiosO2///5l52fPnr3O+bXb2gVW58+fT9u2bbn++usr1P3aa6/RtGlT/vKXv+T+ZusIkw9JkiQVpSlTpjBs2DCefvppHn/8cRo3bky/fv1YuHBhhXL9+vVj3rx5ZdukSZPKznXp0qXCuXnz5jF69GgiguOOOw6AbbfdlltuuYVLLrmE119/HYCVK1dy4okn8oMf/IAf/ehH+bvpAiv6AeeSJEkqTg8//HCF/fHjx9OqVSumTZvGgAEDyo5vscUWbLvttlXW0ahRo3XOPfDAA/Tr148ddtih7NigQYP461//yoknnsizzz7LlVdeybx583jkkUdq8Y7qPls+JEmSJGDJkiWsWbOG1q1bVzg+depU2rdvzy677MKQIUP4+OOP11vHe++9x2OPPcbQoUPXOTd69GjmzJnDCSecwLXXXsuYMWNo06ZNrd9HXVb0LR8RMQAY0L1790KHIqkeyfVqya4iLEn5N3z4cHr06EHv3r3Ljh1++OEce+yx7LDDDsyePZtLLrmEvn37MmPGDLbYYot16hgzZgzt2rXj6KOPXudcmzZtuPbaaxk8eDA//vGPOfLII3N6P3VR0ScfrvMhSZKkc845h6lTpzJ16lQaNWpUdrz8eIy9996bXr160bVrV/7xj39w7LHHVqhj1apVjB07lpNOOokmTZqsc401a9YwduxYmjdvzgsvvMCKFSto2rRp7m6qDrLblSTVc926dWPUqFHss88+tGrVikGDBrFixQrGjRvHgQceWKFsRPDvf/8byMzgMmzYMI444ghatGjBAQccwPz58znrrLNo3bo1u+22Gy+99FKF61x77bXssccetG7dmsGDB7NixQoA9tprLyZOnFhWduXKlbRt27bC+yWprjr77LO5++67efzxx9lxxx03WLZTp05st912vPPOO+ucmzhxIvPnz+eUU06p8r033ngjr7zyCi+88AJLly7l4osvrpX46xOTD0lqAO655x7++c9/MmvWLF5++WXGjRtX7fddddVVLFiwgC222ILevXvTs2dPFixYwHHHHcc555xTofydd97Jww8/zLvvvsvbb7/NVVddBcCJJ57I//zP/5SVmzRpEh07dmTfffettXuUpFwYPnx4WeKx2267bbT8ggULmDNnDh07dlzn3O23387BBx/MLrvsss65N954g4svvpibb76ZPfbYgzvuuIObbrqJadOm1cp91BcmH5LUAPz85z+nU6dOtGnThgEDBjBz5sxqve+YY46hV69eNG3alGOOOYamTZty4okn0qhRIwYNGrROy8UZZ5xBly5daNOmDRdffDF33303AP/93//NpEmTWLx4MZCZMebHP/5xrd6jJNW2008/nbFjx3LXXXfRunVr5s+fz/z581m6dCkAS5cu5bzzzuOZZ55h9uzZTJkyhQEDBtC+fXuOOeaYCnV98MEHPPzwwwwZsm5P/lWrVnHSSSfxve99jxNOOAGA/v37c8oppzB48GCWLVuW+5utI0w+JKkBKD/NY/Pmzcv+cG5Mhw4dyl43a9Zsnf3K9XTp0qXsddeuXZk7dy6Q6YZwwAEHcP/99/P555/z0EMPlf2BlaS6avTo0SxZsoRDDz2Ujh07lm2jRo0CMtPovvLKKxx99NHs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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_str import StringLength\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "columns = [\"Name\"]\n", - "objs = [StringLength(columns=['Name'])]\n", - "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"StringLength\")" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Hsh2221HmzZtGDx4MF988QWQmUb3/PPPp1WrVjRp0oS99tqL1157LTe/DElSjVbwyYck1QX33XcfTzzxBHPmzGH27Nlce+21rFu3jv79+/POO+8wf/58GjZsyODBg0u97/777+cPf/gDH3zwAV988QUjR44E4I033uCcc85hzJgxLFy4kP/+97+lEpd69erxy1/+kiVLlvD888/z5JNPMmrUKAAmTJjA5MmTmT17NsuWLePBBx9k++23z90vQ5JUY5l8SFIdMHjwYNq3b0/z5s257LLLeOCBB9h+++054YQTaNSoEdtuuy2XXXYZzzzzTKn39e/fn1133ZWGDRvygx/8gBkzZgDw8MMPc/TRR9OzZ0+22morrrnmmlLT4u63334ccMAB1K9fn44dO3LWWWcV192gQQNWrFjBW2+9RUqJPfbYgzZt2uTsdyFJqrlMPiSpDmjfvn3x6w4dOrBw4UJWrlzJWWedRYcOHWjSpAk9e/bk448/Zu3atcVld9hhh+LXjRo14pNPPgFg4cKFpercZpttSrVezJ49m6OPPpoddtiBJk2a8NOf/rS4y1avXr0YPHgw5557Lq1atWLgwIEsX7682u5dklR7FHzy4TofkuqCd999t/j1/Pnzadu2LTfddBP/+te/ePHFF1m+fDmTJ08GMmMyNqVNmzal6ly5ciX//e9/i/fPOeccdt99d95++22WL1/OddddV6reH//4x0yfPp033niD2bNn84tf/KIqblOSVMsVfPLhgHNJdcHtt9/Oe++9x9KlSxkxYgR9+/ZlxYoVNGzYkO22246lS5cyfPjwCtd34okn8te//pUpU6bwxRdfcOWVV7Ju3bri8ytWrKBJkyY0btyYt956i9/85jfF515++WVefPFFVq9ezTbbbMPWW2/tSuaSJMDkQ5LqhJNPPpnevXuz0047sfPOO3P55Zdz3nnnsWrVKlq0aMEBBxzAEUccUeH6unbtyu23387JJ59MmzZtaNasGV/72teKz48cOZL777+fbbfdlgEDBtC3b9/ic8uXL2fAgAE0a9aseLasiy66qErvV5JUO0VFmt8LQVFRUZo2bVq+w5BUA7355pvsscce+Q5jgzp27Mhdd93FYYcdlu9QvpIN/X4jYnpKqagCVfiHTKqjXOejauRhnY/Y0AlbPiRJkiTlRMEnHw44lyRJknKjfr4DyLeU0jhgXFFR0YB8xyJJX8W8efPyHYIkSRVS8C0fkiRJknLD5EOSJElSTph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5UTBT7UbEX2APp07d853KJJqkepedTcPq9FKklTtCr7lI6U0LqU0sGnTpvkORZIkSarTCj75kKTarmPHjowcOZK9996bpk2b0rdvXz777DNGjx5Njx49SpWNCP79738D0K9fPwYNGsSRRx5J48aN6d69O4sWLeK8886jWbNm7L777rz66qulrnP99dfTpUsXmjVrRv/+/fnss88A2HPPPRk3blxx2dWrV9OiRYtS75ckyeRDkuqABx98kL///e/MnTuXmTNnMnr06Aq/79prr2XJkiVstdVWHHjggey7774sWbKEE088kQsuuKBU+fvuu48nnniCOXPmMHv2bK699loATjvtNP74xz8Wlxs/fjxt2rRhn332qbJ7lCTVfiYfklQH/PjHP6Zt27Y0b96cPn36MGPGjAq977jjjmO//fZj66235rjjjmPrrbfmtNNOo169evTt23e9lovBgwfTvn17mjdvzmWXXcYDDzwAwA9/+EPGjx/P8uXLARgzZgynnnpqld6jJKn2M/mQpDpghx12KH7dqFEjPvnkkwq9r3Xr1sWvGzZsuN5+2Xrat29f/LpDhw4sXLgQgLZt29K9e3ceeeQRPv74Yx5//HFOOeWUr3QvkqS6q+Bnu5KkumqbbbZh5cqVxfuLFi3a7Drffffd4tfz58+nbdu2xfunn346d911F2vWrOHAAw+kXbt2m309SVLdYsuHJNVRX//613n99deZMWMGn332GT/72c82u87bb7+d9957j6VLlzJixAj69u1bfO573/ser7zyCrfccgunnXbaZl9LklT31NnkIyL+LyI+ioiH8x2LJOXDrrvuypVXXslhhx3GLrvsst7MV1/FySefTO/evdlpp53Yeeedufzyy4vPNWzYkBNOOIG5c+dy/PHHb/a1JEl1T6SU8h1DtYiIQ4BtgdNTSiduqnxRUVGaNm1adYclqRZ688032WOPPfIdRt517NiRu+66i8MOO2yDZa6++mpmz55dauarTdnQ7zcipqeUiipQRd38Qyap2hd0LRR5WLg2NnSizrZ8pJSeBlbkOw5JKhRLly7l7rvvZuDAgfkORZJUQ+U8+YiInhExNiIW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BRhEZl2RQcDjEdElpTQ/W2YG5cfdO6W0MCKOBWanlGZHhMmHJGk99913H2eccQb169enZcuWpRYcjAiTD1Vajx49GDVqFG+99Ra77747b7zxBk899RSXXnppqTLjxo3jzDPPpH379jz33HPMmDGDiy66qFLX2mKLLbjnnnv4+te/zimnnMJDDz3ESy+9xJZbblnVtyVVuZwmHyml8cB4gIgYXU6RC4DRKaU7s/tDIuII4Bzg0mwd3TZxmQOAkyLi+2SSnQYRsTyl5NcBkiQArrzySi688EKuueYa6tWrl+9wVAdcfPHFrFixgi5dulCvXj3WrFnDZZddxqBBg4rL3HrrrZx11lnsuOOO1K+f+SfYbbfdxtFHH13p63Xu3JmLLrqI4cOHc8UVV9CtW7equhWpWtWYMR8RsSWZ7lgjy5yaQCW6T6WULiWbqEREP2DPDSUeETEQGAiw4447Vj5oSVKttHjxYs4880wTD1WZP//5z9x7773cf//9dO3alRkzZjB06FA6derEj370IyCTaDz33HOMHTuWDh06MHnyZIYNG0bHjh054ogjKnW9VatW8cADD9CoUSOmTJlCSqlUC55UU1VmkcHq1gKoBywuc3wxsEN1XDCldEdKqSilVNSyZcvquIQkqQY66qijSvXFlzbXRRddxLBhwzjppJPYa6+9OPXUU7ngggu4/vrrgUyycOmll3LjjTfSp08f9t57bwYPHsxJJ53EyJFlv3fdtIsvvpg1a9bw0ksvMW3aNH79619X9S1J1aLGtHxUh7KD2csTEX2APp07d67+gCRJNcLhhx/OxRdfzOuvv85ee+1FgwYNSp0//vjj8xSZaquVK1eu15JWr1694skMVq9ezerVqzdapqImTZrEqFGjmDRpEl27duWmm27ivPPO46ijjmLnnXfevBuRqllNSj6WAGuB1mWOtwYWVddFU0rjgHFFRUUDqusakqSa5ayzzgLguuuuW+9cRLB27dpch6Rark+fPtxwww106tSJrl278uqrr3LzzTdz2mmnAdCkSRMOPvhgLrnkEho3bkyHDh145plnuPfee7nxxhuL61m0aBGLFi1i9uzZALzxxht8/PHH7LjjjjRv3pwVK1bQv39/hg4dykEHHQTAgAEDeOSRR+jfvz9PP/00W2xRkzq2SKXVmP86U0pfANOBw8ucOhx4rrquGxF9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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_str import LowerCase\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "columns = [\"Name\"]\n", - "objs = [LowerCase(columns=['Name'])]\n", - "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"LowerCase\")" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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klRKnPdpvkOoF9LlRfkOoYTdrux2JamO69y5M6NGjaJr1660atWKQYMGsWzZMj7//HMOPfRQioqKaNWqFYceeigff/xxyfv2228/fvOb39CzZ0823XRT+vbty/z580vOjxs3jk6dOrH55ptz2WWXlbnmiy++SI8ePWjZsiUdOnTg1FNP5ZtvvgEy0+ieccYZtG3bls0224xddtmF119/PTe/DElSrVbwyYck1Qe33XYbEydO5P3332f69OlceumlrFq1ikGDBvHhhx8yc+ZMmjRpwqmnnlrmfbfffjs33XQTn3zyCd988w2jR48G4M033+Tkk09m3LhxzJ49m88++6xM4tKgQQP+8Ic/MH/+fJ5//nkef/xxrrvuOgAmTZrE5MmTmT59OgsXLuTuu+9m8803z90vQ5JUa5l8SFI9cOqpp7LlllvSunVrhg8fzh133MHmm2/O0UcfTdOmTdl0000ZPnw4Tz/9dJn3DRo0iO23354mTZpw7LHHMm3aNADuueceDj30UHr16sUmm2zCiBEjykyLu/vuu7PnnnvSsGFDOnfuzEknnVRSd6NGjfjyyy95++23SSmx44470qFDh5z9LiRJtZfJhyTVA1tuuWXJ606dOjF79myWLFnCSSedRKdOndhss83o1asXX3zxBStXriwp2759+5LXTZs2ZfHixQDMnj27TJ3NmjUr03oxffp0Dj30UNq3b89mm23Gr3/965IuW7179+bUU0/llFNOoW3btgwZMoRFixbV2L1LkuqOgk8+XOdDUn3w0UcflbyeOXMmW2yxBVdeeSXvvPMO//73v1m0aBGTJ08GMmMy1qdDhw5l6lyyZAmfffZZyf7JJ5/MDjvswLvvvsuiRYsYOXJkmXp/+ctfMnXqVN58802mT5/O7373u+q4TUlSHVfwyYcDziXVB9deey0ff/wxCxYs4LLLLqN///58+eWXNGnShJYtW7JgwQIuueSSStd3zDHH8I9//INnn32Wb775hgsvvJBVq1aVnP/yyy/ZbLPNaN68OW+//TZ//vOfS8699NJL/Pvf/2b58uU0a9aMxo0bu5K5JAkw+ZCkeuEnP/kJffv2ZZtttmHbbbflggsu4PTTT2fp0qW0adOGPffck4MOOqjS9e20005ce+21/OQnP6FDhw60atWK73znOyXnR48eze23386mm27K4MGD6d+/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n376aZlNklQzqrTOhyRJ9cF1113H7bffTv/+/fMdiiQVlKqs83Hmus67yKAkqa5o0qQJu+22W77DkKSCU5WWj9PK7TcCOgBLgU+oo4sMSpIKzxlnnMFVV13Ftdde67oekpRDlU4+Ukpblz8WEe2Am4AbqjMoSZJq0jPPPMPkyZN56KGH6Nq16xoDzsePH5+nyCSpftugMR8ppXkRMRy4G7i/ekKSJKlmtWnThqOOOirfYUhSwamOAecbkVn9XJKkOuGmm27KdwiSVJAqPdVuRBxVbjs6Ik4FbgWeqbkQa1ZE9IuI6xcuXJjvUCRJUh325Zdfcvrpp9OpUyeaNGnCXnvtxUsvvVRy/r777uPAAw+kqKiIiOCpp54q8/4PPviAiKhw+93vfgfA3LlzadOmDVdeeWWZ977xxhs0btyYO++8s8bvU9oQVWn5uKfcfgI+BZ4AflVtEeVYSmkCMKG4uHhwvmORJNWcXXfdlaeffppWrVqxyy67rHOg+auvvprDyFRfnHjiibz66qvcfPPNfOc73+HWW2+lT58+vPnmm3Ts2JGvvvqKvfbai5/+9KcMGDBgjfdvueWWzJkzp8yx+++/n1NOOYVjjjkGgPbt23PttdcycOBADj74YLp27cry5csZMGAARxxxBD/+8Y9zcq/St1WVAeeVbiWRJKm2Ofroo9lkk01KXjvLlarT0qVLuffee7n33nvZb7/9ALj44ouZMGECf/7zn7n00kv52c9+BsD8+fMrrKNBgwa0b9++zLH77ruPPn36sPXW/533p3///tx///0MGDCAF154gREjRjBnzhweffTRmrk5qRpVKvmIiEbAs8CAlNI7NRuSJEnV76KLLip5ffHFF+cvENVLK1asYOXKlTRu3LjM8SZNmvDss89+qzr/85//8Pjjj3P33Xevce66665jp5124vjjj+e+++7jwQcfpHXr1t/qOlIuVao1I6W0HNiaTFcrSZLqtN69e/PFF1+scXzRokX07t079wGpztt0003p0aMHl156KbNmzWLlypXceuutPP/882t0paqsMWPGUFRUxOGHH77GudatWzNq1CjuvvtujjvuOA455JANvQUpJ6rSlepmwHERkqQ676mnnuKbb75Z4/iyZct45pk6O4eK8mzcuHFstNFGfOc732GTTTbhmmuu4bjjjmOjjarec33FihXcdNNNnHDCCWusQwOwatUqbrrpJpo2bcpLL73EsmXLquMWpBpXlQHnzYDjI+IAYCrwVemTKaVfVmdgkiRVt5dffrnk9auvvlqmm8rKlSuZOHEiHTt2zEdoqge23XZbnn76ab766isWLVpEhw4d6N+/P9tss02V65owYQJz587lxBNPrPD8VVddxWuvvcZLL73EgQceyPDhw9eYAUuqjaqSfOwIrH5ql/+/qNZ1x4qIpsBbwN9TSmflOx5JUv4VFxeXTF3at2/fNc43adKEP/7xj3mITPVJs2bNaNasGZ9//jkTJ07kiiuuqHIdN9xwA/vuuy/bb7/9Gufeeusthg8fzpgxY+jatSs33ngjhxxyCEcddRQ9e/asjluQakxVZrvavyYDqQHDgRfyHYQkqfaYMWMGKSW22WYbXnzxRYqKikrObbzxxrRt25YGDRrkMULVZRMnTmTVqlXssMMOvPfee5x99tnssMMODBo0CIAFCxYwc+bMkvFG7733Hi1btqR9+/ZlZrmaOXMmEydO5JZbblnjGitWrOCEE07gRz/6EccffzwAffv25cQTT2TQoEFMmzaNpk2b1vzNSt9SvZw+NyK2A3YAHsl3LJKk2qNTp0507tyZVatWUVxcTKdOnUq2Dh06mHhogyxcuJBTTz2VHXbYgQEDBrD33nszceLEkjEb48ePZ7fddmP//TN/zx08eDC77bYbf/nLX8rUc+ONN9KiRQuOPvroNa4xatQoPvzwQ/785z+XOT569GhWrFjB+eefX0N3J1WPSCl3PaYiohdwFrA7sAUwKKU0tlyZocDZQAfgDeD0lFKVRv9FxIPZOvYCdq5Mt6vi4uI0ZcqUqlzmW3uh17Y5uc6G2nPy+/kOoVbxc6u76sJn5+e2poiYmlIqrkTRb/VF9vHHHzN58mQ++eQTVq1aVebcmWee+W2qlFTN4rxP8x1CvZAuL1p/oeq11oWUqjLmozo0B14HbsluZUREf+BqYCiZdUWGAo9ERNeU0sxsmWlUHHfflNLsiDgcmJ5Smh4Re9XMbUiS6rLbbruNn//85zRs2JCioqIyCw5GhMmHJNWQnCYfKaWHgYcBImJsBUXOBMamlG7I7p8WEQcBJwPnZ+votp7L7An8OCL+H5lkp1FELEop/XbD70CSVB9ceOGF/OpXv2LEiBF2tZKkHKo1Yz4iYmMy3bEmlTs1iUz3qUpJKZ2fUtoypdSZTBevG9aWeETEkIiYEhFTPv3UZj1JKhTz5s3jxBNPNPGQpByrNckH0AZoAMwrd3we0H7N4hsupXR9Sqk4pVRcesYTSVL9dsghh/Dvf/8732FIUsHJ9ZiPnCo/mL0iEdEP6NelS5eaD0iSVCsccMABnHvuubzxxhvssssua6wgfdRRR+UpMkmq32pT8jEfWAm0K3e8HTC3pi6aUpoATCguLh5cU9eQJNUuJ510EgAjR45c41xEsHLlylyHpBrmrEnVIw+zJqmeqTXdrlJK3wBTgQPKnToA+FdNXTci+kXE9QsXLqypS0iSaplVq1atdTPxkKSak9PkIyKaR0S3iOiWvfZW2f2tskV+DwyMiBMjYseIuJrMeiB/WUuVGyylNCGlNKRFixY1dQlJkiRJ5L7bVTHwZKn9S7LbzcDAlNJdEbE5cAGZRQZfBw5JKX2Y4zglSfXY73//+3Wed50PSaoZuV7n4ynWseJhtsx1wHU5CQgHnEtSIfrjH/9YZn/58uXMmTOHJk2a0LZtW5MPSaohtWnAeV444FySCs+MGTPWODZv3jwGDRrE4MF+HUhSTak1A84lScqndu3acdlll3HOOefkOxRJqrcKPvlwtitJ0mqrVq1i3rzya93m3pw5czjhhBMoKiqicePGdO3alaeffrrkfERUuJ1yyill6pk+fTpHHXUULVu2pGnTpnTv3p233noLgLlz59KmTRuuvPLKMu954403aNy4MXfeeWfN36ikgmO3K7tdSVLBue+++8rsp5SYM2cO1157Lfvss0+eosr44osv6NmzJ3vvvTcPPfQQRUVF/Oc//6Ft27YlZebMmVPmPVOmTKFfv34ce+yxJcdmzJhBz549GTBgAE888QQtW7bk7bffpnnz5gC0b9+ea6+9loEDB3LwwQfTtWtXli9fzoABAzjiiCP48Y9/nJsbllRQCj75kCQVnmOOOabMfkRQVFRE796912gJyLUrrriCDh06cMstt5Qc23rrrcuUad++fZn9Bx98kO23355999235Njw4cPp27dvmfvZZpttyryvf//+3H///QwYMIAXXniBESNGMGfOHB599NHqvCVJKlHw3a4kSYWnooUF586dy+23306HDh3yGtsDDzzAD37wA/r370/btm3p1q0bf/rTn0gpVVh+8eLF3HnnnWUGyq9atYoJEybQtWtXDjroIIqKithjjz2466671nj/ddddx6xZszj++OMZNWoUY8aMoXXr1jV2f5IKW8EnH475kKTCsnz5cn7wgx/wzjvv5DuUCv3nP//huuuuY5tttmHixIkMGzaM8847j2uvvbbC8rfffjvffPMNJ5xwQsmxTz75hMWLFzNy5Ej69u3Lo48+ynHHHcfxxx/PQw89VOb9rVu3ZtSoUdx9990cd9xxHHLIITV6f5IKW8F3u3LMhyQVlkaNGjFjxgwi1rnsVN6sWrWK4uJiRo0aBcBuu+3Gu+++y7XXXsupp566RvkbbriBww8/nKKiojJ1ABx++OEla5Z069aNKVOm8Kc//Ykf/ehHZcredNNNNG3alJdeeolly5bRuHHjmrxFSQWs4Fs+JEmF54QTTuCGG27IdxgV6tChA127di1zbMcdd2TmzJlrlJ02bRpTpkxZY22SNm3a0LBhw0rVc9VVV/Haa6/x0ksvsXjxYoYPH15NdyJJayr4lg9JUuH56quvuO2223j00UfZfffdadasWZnz11xzTZ4ig549e67RJWz69Ol06tRpjbLXX389W2+9NX369ClzfOONN2aPPfZYbz1vvfUWw4cPZ8yYMXTt2pUbb7yRQw45hKOOOoqePXtW411JUkbBJx8R0Q/o16VLl3yHIknKkbfeeovu3bsDmTEWpeW7O9YZZ5zBXnvtxWWXXUb//v155ZVXuOaaaxg5cmSZckuWLOG2227jnHPOqTDmc845h2OPPZZ99tmH3r178+STT3LnnXfywAMPALBixQpOOOEEfvSjH3H88ccD0LdvX0488UQGDRrEtGnTaNq0aY3fr6TCUvDJh2M+JKnwPPnkk/kOYa322GMPHnjgAX79618zYsQIttpqK0aMGMHQoUPLlLvrrrv46quvGDRoUIX1HHHEEVx//fWMHDmSYcOGsd1223HLLbeUjPcYNWoUH3744RoD0EePHs2uu+7K+eefz9VXX10zNympYMXapu4rNMXFxWnKlCk5udYLvbbNyXU21J6T3893CLWKn1vdVRc+Oz+3NUXE1JRScSWK+kWm9YrzPs13CPVCurxo/YWqkZ9b9cj15wastQnZAeeSJEmScsLkQ5IkSVJOFHzy4SKDkiRJUm4UfPKRUpqQUhrSokWLfIciSZIk1WsFP9uVJElV4QDY6pGHAbCSaoGCb/mQ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_str import UpperCase\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "columns = [\"Name\"]\n", - "objs = [UpperCase(columns=['Name'])]\n", - "bench_scalers = benchmark.run_X(objs, titanic_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"UpperCase\")" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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qarVz3cAFRURDYFewJgypyYAe2dfTwF2jojOZAacfx+4eD11DgeGAzRt2rTX9ttvX9VhS5I20rRp0xallNpWoGjN/BZNBWvVqlXcf//9NGjQgGnTpt0A3HD88cfz8MMP065du7Tlllvy3e9+l0svvZR27dqts5777ruPoUOH8vnnny9ZcyylxL///W922203jjnmmNSgQQOmTJlCjx49vszFe5MqKNZ1otYkH0AbYDOgqMzxIuBAgJTSNxFxOvAMmS5lV65vpquU0k3ATQC9e/dOU6dOrY64JUkbISLezXcMUmXMmjWLPn36sHLlSpo1a8bf/vY3dtllFwAOOeQQjjzySLbZZhvmzZvH+eefT79+/Zg2bRqNGjVaq67PPvuMX//61wwbNoz69Uv/uda9e3fOPPNMRo8eza9//Wt69OiRi7cnVYnalHxUSErpEeCRipaPiIHAwO7du1dfUJIkqc7bbrvtmDFjBkuWLOGBBx7g+OOPZ9KkSey888787//+b3G5XXbZhV69etG1a1ceffRRjjzyyFL1LFu2jIEDB9K5c2euvPLKte6zYsUK7rvvPpo0acLzzz9PSomIdX7RLNUoNW3A+fosAlYB7cscbw8s3NhKU0rjUkrDW7RosSmxSZKkAtewYUO6d+9Or169uPzyy+nRowe///3vyy3bqVMnttpqK95+++1Sx5ctW8ahh2bGof/jH/9g8803X+vas88+m2+++YYpU6YwdepU/vSnP1X9m5GqSa1JPrKDqKYBB5U5dRCZWa82SkQMjIiblixZsuHCkiRJFbR69Wq+/LL8oRiLFi1i/vz5dOzYsfjY559/ziGHHMKqVasYP348zZo1W+u6Z555huuvv56xY8ey0047cdVVV3HOOefwzjvvVNv7qMuuu+46dt11V5o3b07z5s3p06cPjz76aLllTzzxRCKCMWP+O/x48eLFnHTSSWy//fY0btyYLl26MGLECD755L+9/mfPns3mm2/Ogw8+WKq+iRMn0qBBA154obAmKatRyUdENIuIHhHRg0xsW2f310ylezUwJCJOiIgdIuJaMlPT3bCx97TlQ5IkbapzzjmH5557jnnz5jFr1izOPfdcJk2axDHHHMOyZcs444wzeOmll5g3bx6TJk1i4MCBtGvXjiOOOALIJB79+/fn008/ZezYsXzxxRcsXLiQhQsX8tVXXxWXGTp0KCeffDL77ZdZ5mzYsGHst99+DB06lNWrV+ft/ddWW221Fb/97W957bXXmDp1Kv369ePwww9n5syZpco98MADTJkyhU6dOpU6vmDBAubPn8+VV17JrFmzuPvuu5k8eTI//vGPi8vsvPPOjB49mp///OcUFWWGLi9ZsoShQ4dy+umns88+hbU8S42aajci9iczWLysO1JKQ7JlRpKZA7sjmTVBTk0pTd7UezvgXNK6rF69mkWLFvHZZ5+xatWqfIdTZ2y22WZsueWWtGnThnr11v4uLCKmpZR6V6CqmvOLTAVryJAhPPPMMyxcuJAWLVqw6667cuaZZ3LwwQezYsUKDj/8cKZPn85nn31Gx44dOeCAA7j44ovp0qULAJMmTeKAAw4ot+5nnnmG/fffn5/97Ge89NJLvPbaa6W6Y82fP5+dd96ZCy64gFNPPTUn77cua9WqFZdffjknnngiAO+++y577703EydO5Pvf/z6jRo3ijDPOWOf148ePZ8CAAXz22Wc0b94cyPwe2W+//WjTpg1///vfOe6445gxYwZTp06lYcOGOXlfOVY7ZrtKKU1iPcFmy1wPXF9V93TAuaQN+eCDD4gIunXrRoMGDRzYWQVSSnz99dcUFRXxwQcfsPXWrhWr2m3s2LHrPNe4cWOeeOKJ9V6///77s6EvhG+99dZyj3fu3JlPP/10gzFq/dZMkbxs2TL23juzisM333zDj3/8Y84//3x22GGHCtWzdOlSGjVqRJMmTYqP1atXjzvuuGPNFMncf//9TJkypa4mHutVo7pd5YPdriRtyBdffEHnzp1p2LChiUcViQgaNmxI586d+eKLL/IdjqQCNmvWLJo1a0ajRo34+c9/XmqK5AsvvJA2bdowYsSICtVVkSmS7733Xs4555yCnSK5RrV8SFJNVV63IG06/10l5du6pkhetGgRY8eOZcaMGRWqxymSK6bgn/rOdiVJklS41jVF8qRJk/jwww/p2LEj9evXp379+rz77rucffbZbLXVVqXqcIrkiiv45MNuV5JUMd26dWPixIn5DkOSqtWaKZJHjhzJzJkzmTFjRvHWqVMnTj31VJ566qni8k6RXDl2u5KkjfBy322rtf69JhfeLyRJyrVzzjmHH/zgB3Tp0oXPP/+ce++9l0mTJvHoo4/Srl072rVrV6p8gwYN6NChA9tttx3w3ymSly5dysMPP8wXX3xRPI6tVatWNGzYcJ1TJD/44IMMHTqUSZMmFVQX1IJPPpztSpKkui/O+TjfIdQJ6Yq2+Q6hSi1cuJBjjz221BTJjz32GAcffHCFrp82bRovv/wyAN/5zndKnVszRfIpp5xCkyZNuPTSS0udv/XWW9l555259tprC2qK5MJJs9bBbleSartu3bpx+eWXs+OOO9KyZUuGDh3KypUr+fTTTxkwYABt27alZcuWDBgwgA8++KD4uv33359f//rX7LPPPmyxxRb079+fRYsWFZ+/66676Nq1K61bt17rl+aUKVPo06cPW265JR07dmTUqFHFC6GllDj11FNp164dzZs3Z5dddmH27Nm5+ceQpEoYO3Ys7777Ll9++SUfffQREydOXG/iMW/evFJrfKyZIrm8bf/99wcyScYbb7yx1jiQNVMkF1LiASYfklQn3HPPPTzxxBO88847zJkzh0suuYTVq1czdOhQ3n33Xd577z0aN27MqFGjSl137733cvvtt/PRRx/x1VdfMWbMGADeeOMNRowYwV133cWCBQv45JNPSiUum222Gb///e9ZtGgRL730Ek899RTXX59ZgmnChAlMnjyZOXPmsGTJEv7617/SunXr3P1jSJJqLJMPSaoDRo0aRZcuXWjVqhXnnXce9913H61bt+aoo46iSZMmbLHFFpx33nk8++yzpa4bOnQo3/nOd2jcuDE/+tGPiqeUfOCBBxgwYAB9+/alUaNGXHzxxaX6JPfq1Yu99tqL+vXr061bN0488cTiuhs0aMDnn3/Om2++SUqJHXbYgY4dO+bs30KSVHOZfEhSHdClS5fi1127dmXBggUsX76cE088ka5du9K8eXP69u3LZ599xqpVq4rLdujQofh1kyZNWLZsGQALFiwoVWfTpk1LtV7MmTOHAQMG0KFDB5o3b86vfvWr4i5b/fr1Y9SoUfziF7+gXbt2DB8+nKVLl1bbe5ck1R4Fn3y4zoekuuD9998vfv3ee+/RqVMnrrrqKt566y1eeeUVli5dyuTJk4HMmIwN6dixY6k6ly9fzieffFK8P2LECLbffnvefvttli5dymWXXVaq3l/+8pdMmzaNN954gzlz5vC73/2uKt6mJKmWK/jZrlJK44BxvXv3HpbvWCRpY1133XUMGDCgeEaVwYMH8/nnn9O4cWO23HJLFi9ezOjRoytc36BBg9hzzz15/vnn2WOPPbjgggtYvXp18fnPP/+c5s2b06xZM958803+/Oc/07ZtZhacV199ldWrV9OzZ0+aNm3K5ptvXlDTSEqqOs5SVjVq0ixl/jaQpDrg6KOPpn///nzrW99i22235fzzz+eUU05hxYoVtGnThr322otDDjmkwvXttNNOXHfddRx99NF07NiRli1bllrRd8yYMdx7771sscUWDBs2jMGDBxefW7p0KcOGDaNly5bFs2WdeeaZVfp+JUm1U1Sk+b0Q9O7dO02dOjXfYUiqgf71r3+xww475DuMderWrRu33HILBx54YL5D2Sjr+veNiGkppd4VqMJfZNogv0GvGrn+Bt3PrWrkoeUj1nXClg9JkiRJOVHwyYcDziVJkqTccMC5A84l1XLz5s3LdwiSJFVIwbd8SJIkScoNkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJNch1113HrrvuSvPmzWnevDl9+vTh0UcfLT6fUuKiiy6iU6dONG7cmP3335/XX3+9VB1z5szh8MMPp02bNmyxxRbstddePP7448XnJ0yYQIMGDXjllVdKXXfLLbfQrFkz3nnnnep9k5IKlsmHJEk1yFZbbcVvf/tbXnvtNaZOnUq/fv04/PDDmTlzJgBXXnklV111FX/84x959dVXadeuHQcddBCff/55cR0DBgxg5cqVPPXUU0yfPp19992Xww47rDip6N+/PyeccALHH388K1asADKzpp122mmMGTOGbbfdNvdvXFJBKPgVziNiIDCwe/fuw95+++18hyOpBipvBe7qXnU3D6vR5o0rnG9Yq1atuPzyyxk+fDidOnVi1KhRnHfeeQCsWLGCdu3aMWbMGE488UQWLVpE27ZtefrppznggAMA+Oabb2jUqBF/+ctfGDRoEABffPEFu+22Gz/4wQ+45pprOOCAA9h8881LtZDUJa6UXTVc4bx2coXzGiSlNC6lNLxFixb5DkWSpFJWrVrF//3f/7Fs2TL23ntv5s6dy8KFC+nfv39xmcaNG9O3b19efPFFAFq3bs0OO+zAXXfdxbJly1i1ahU33XQTW2yxBfvss0/xdU2bNmXs2LFcd911HHPMMfzzn//k1ltvzfl7lFRYCj75kKTarlu3bowZM4Zdd92VFi1aMHjwYFauXMnYsWPZd999S5WNCP79738DMGTIEEaOHMn3v/99mjVrxj777MPChQs55ZRTaNmyJdtvvz3Tp08vdZ/LL7+cHXfckZYtWzJ06FBWrlwJwM4778y4ceOKy3799de0adOm1PWquFmzZtGsWTMaNWrEz3/+c/72t7+xyy67sHDhQgDat29fqnz79u2Lz0UETz75JLNnz6Z58+Y0atSIiy66iMcee4yOHTuWum7ffffl2GOP5b777uOqq66ic+fOuXmDkgqWyYck1QF//etfefzxx5k7dy4zZ85k7NixFb7ukksuYdGiRTRq1Ig+ffrQs2dPFi1axKBBgzjttNNKlb/nnnt44okneOedd5gzZw6XXHIJAMcddxx33313cbnx48fTsWNHdt999yp7j4Vku+22Y8aMGbzyyiuMGDGC448/ntmzZ1fo2pQSI0eOpHXr1jz33HNMmTKFQYMGcdRRRzF//vxSZYuKinj00Udp0qQJkydPro63IkmlmHxIUh3wy1/+kk6dOtGqVSsGDhzIjBkzKnTdEUccQa9evdh888054ogj2HzzzTnuuOPYbLPNGDx48FotF6NGjaJLly60atWK8847j/vuuw+AY489lvHjx7N06VIA7rrrLn7yk59U6XssJA0bNqR79+706tWLyy+/nB49evD73/+eDh06AJmkoaSioqLic08//TTjxo3jvvvuY5999qFnz55cf/31NG3alNtvv73UdcOHD+fb3/42EydO5O677y7VeiVJ1cHkQ5LqgDV/eAI0adKEZcuWVei6kt13GjduvNZ+2Xq6dOlS/Lpr164sWLAAgE6dOrHPPvvw4IMP8tlnn/HYY49xzDHHbNR70dpWr17Nl19+yTbbbEOHDh148skni8+tXLmS5557jr333huA5cuXA1CvXulf8fXq1WP16tXF+2PHjmXixInccccd9OnTh7PPPpsTTzyRxYsX5+AdSSpUJh+SVEc1bdq0+A9RoHhMwKZ4//33i1+/9957dOrUqXj/+OOP5+677+b++++nT58+jh/YSOeccw7PPfcc8+bNY9asWZx77rlMmjSJY445hojglFNO4be//S0PPfQQs2fPZsiQITRr1oyjjz4agD59+tCqVSuGDh3KP//5T+bMmcOZZ57Jf/7zHwYMGABkPseTTz6ZK664gm9/+9sAXHjhhbRp04aTTjopb+9dUt1XP98BSJKqx2677cbrr7/OjBkz2H777bnooos2uc7rrruOAQMG0KRJEy699FIGDx5cfO7www9n5MiRFBUVcdZZZ23yvQrVwoULOfbYY1m4cCEtWrRg11135bHHHuPggw8G4KyzzmLFihX84he/4NNPP2XPPfdkwoQJbLHFFgC0adOGxx9/nPPOO49+/frx9ddfs8MOO/Dwww/Ts2dPUkr89Kc/pXfv3owaNar4vg0bNuTOO+9kjz32YNCgQRxxxBF5ef+S6rY6m3xExN+A/YGnUkqD8hyOJOXcd77zHS644AIOPPBAGjduzOWXX86NN964SXUeffTR9O/fnwULFnDYYYdx/vnnF59r3LgxRx11FPfddx9HHnnkpoZfsDY0WUBEcNFFF603mezduzdPPPHEOq8v2W2rpB49evDVV19VNFRJqrQ6u8hgROwPbAEcX5Hko3fv3mnq1KnVHZakWmhdi+AVmm7dunHLLbdw4IEHrrPMb37zG+bMmVNq5qsNcZFB5YKL1VUNFxmsnVxkMAdSSpOAz/MdhyQVisWLF3PrrbcyfPjwfIciSaqhcp58RETfiHgkIuZHRIqIIeWUGRkRcyNiZURMi4j9ch2nJKnibr75Zrp06cL3v/99+vbtm+9wJEk1VD7GfDQDZgN3ZrdSImIwcC0wEng++/OxiNgxpfRetswMyo+9f0ppQTXFLUkFbd68ees8N2zYMIYNG5a7YCRJtVLOk4+U0nhgPEBEjC2nyGnA2JTSzdn9kyLiEGAEcG62jh5VEUtEDAeGA2y99dZVUaUkqY6zD3rVyEMfdEk1QI0a8xERDYFewIQypyYAe1f1/VJKN6WUeqeUerdt60NQ0rrV1ck58s1/V0kqLDUq+QDaAJsBRWWOFwEd1i6+bhExEbgfODQiPoiIPusoNzAiblqyZMnGxCupADRo0IAVK1bkO4w6acWKFTRo0CDfYUiScqSmJR9VJqV0YEqpbUqpSUppq5TSS+soNy6lNLxFixa5DlFSLdGuXTvmz5/P8uXL/aa+iqSUWL58OfPnz6ddu3b5DkeSlCM1bZHBRcAqoH2Z4+2BhbkPR5KgefPmACxYsICvv/46z9HUHQ0aNKB9+/bF/76SpLqvRiUfKaWvImIacBCZLlNrHAQ8WB33jIiBwMDu3btXR/WS6ojmzZv7R7IkSZsoH+t8NIuIHhHRI3v/rbP7a6abuhoYEhEnRMQOEXEt0Am4oTrisduVJEmSlBv5GPPRG5ie3RoDo7OvfwOQUvoLcApwPjAD2Bc4NKX0bnUE44BzSZIkKTdynnyklCallKKcbUiJMtenlLqllBqllHqllCZXYzy2fEiSJEk5UGdnu5IkSZJUsxR88mG3K0mSJCk3Cj75sNuVJEmSlBsFn3xIkiRJyg2TD0mSJEk5UfDJh2M+JEmSpNwo+OTDMR+SJElSbhR88iFJkiQpN0w+JEmSJOVEwScfjvmQJEmScqPgkw/HfEiSJEm5UfDJhyRJkqTcMPmQJEmSlBMmH5IkSZJyouCTDwecS5IkSblR8MmHA84lSZKk3Cj45EOSJElSbph8SJIkScoJkw9JkiRJOVE/3wFIkpQvK1as4J133gFg2223pXHjxnmOSJLqNls+JEkF58svv+SUU06hVatW7Lbbbuy66660atWKk08+mZUrV+Y7PEmqs2z5kCQVnBEjRjBhwgRuueUW+vTpA8BLL73Eueeey+eff85tt92W5wglqW4q+OQjIgYCA7t3757vUCRJOXL//ffz0EMPcdBBBxUf+9a3vkW7du046qijTD4kqZoUfLcr1/mQpMLTtGlTOnfuvNbxzp07O+5DkqpRwScfkqTCc9JJJzF69GhWrFhRfGzFihVcfPHFnHTSSXmMTJLqtoLvdiVJKjwvv/wyzz77LJ07d2bXXXcFYNasWXzzzTd88cUX/PCHPywu+8gjj+QrTEmqc0w+JEkFp02bNhx11FGljm2zzTZ5ikaSCofJhySp4Nx+++35DkGSCpJjPiRJkiTlhC0fkqSCs8suuxAR6zw/c+bMHEYjSYWjTiYfEdEFuAtoB3wDXJxSuj+/UUmSaopBgwaV2v/666+ZMWMGL7zwAr/4xS/yFJUk1X11Mvkgk3CcklKaEREdgGkRMT6l9EW+A5Mk5d+FF15Y7vHf/e53vPvuuzmORpIKR50c85FS+jClNCP7eiGwCGiV16AkSTXekUceyT333JPvMCSpzsp58hERfSPikYiYHxEpIoaUU2ZkRMyNiJURMS0i9tuE+/UCNkspvb8pcUuS6r7JkyfTpEmTfIchSXVWPrpdNQNmA3dmt1IiYjBwLTASeD7787GI2DGl9F62zAzKj71/SmlBibpaZe8xrIrfgySpFiu5iCBASokPP/yQ6dOnr7NLliRp0+U8+UgpjQfGA0TE2HKKnAaMTSndnN0/KSIOAUYA52br6LGh+0REI+Bh4IqU0oubHLgkqc5o3bp1qf169eqx0047cdlll9G/f/88RSVJdV+NGnAeEQ2BXsCYMqcmAHtXop4AxgJPp5TuWk+54cBwgK233rqy4UqSaikXGZSk/KhpA87bAJsBRWWOFwEdKlHPPsBg4PCImJHddilbKKV0U0qpd0qpd9u2bTc6aElS7XXFFVfw2Wef5TsMSSoINS35qBIppedTSvVSSj1KbLPKKxsRAyPipiVLluQ6TElSDXDZZZexePHifIchSQWhpiUfi4BVQPsyx9sDC6vjhimlcSml4S1atKiO6iVJNVxKKd8hSFLBqFHJR0rpK2AacFCZUwcB1TJo3JYPSZIkKTfysc5Hs4joERE9svffOru/ZsT31cCQiDghInaIiGuBTsAN1RGPLR+SVNjeeOMNunbtmu8wJKkg5GO2q97AMyX2R2e3O4AhKaW/RERr4HygI5k1QQ5NKb1bHcFExEBgYPfu3aujeklSDdelS5d8hyBJBaNCyUdE7AD8GPgu0A1oDHwMvAY8BjyYUvqyInWllCYBsYEy1wPXV6S+TZVSGgeM6927twsRSlIdVq9ePTIzsW/YqlWrqjkaSSpM600+IqIncCWwL/ACmXEXDwArgFbAzsClwB8j4krgmoomIZIk5dJf//rX4uSjqKiICy64gCOOOII+ffoA8NJLL/Hwww8zevTofIYpSXXahlo+/kYm+fiflNKn6yoUEX2AU4EzyCQjtYbdriSpMAwaNKj49Q9/+EMuv/xyhg37b6P3T3/6U/bYYw8efvhhRo4cmY8QJanO29CA82+nlK5bX+IBkFJ6KaX0I+B3VRdabjjgXJIKz9NPP80BBxyw1vEDDjiASZMm5T4gSSoQ600+slPfrlNENKhMeUmSaoI2bdrwwAMPrHX8gQceoG3btnmISJIKQ4Vnu4qIXwLzU0oPZvdvBY6PiHeAH6aU3qqmGCVJqlK/+c1vGDp0KM8880zxmI+XX36ZiRMncuutt+Y5OkmquyqzzscvycxwRUT0BX4EHA3MAK6q8shyxEUGJanwHHfccbz44ou0adOGRx55hEceeYTWrVvzwgsvcPzxx+c7PEmqsyqzzkdnYG729UDg/pTSXyNiFvBclUeWI061K0mFac899+See+7JdxiSVFAq0/KxFGiXfX0Q8FT29dfA5lUZlCRJ1a2oqIgxY8YwcuRIFi1aBMALL7zA3LlzN3ClJGljVSb5mADcHBG3AN3JLC4IsBP/bRGRJKnGmzZtGttttx333HMPt9xyC0uXLgXgySef5LzzzstzdJJUd1Um+fgFmYUG2wKDUkqLs8d7AvdVdWC54pgPSSo8Z5xxBieffDLTp0+nUaNGxccPPvhgXnjhhTxGJkl1W4XHfKSUlgInlXP8wiqNKMcc8yFJhWfatGnlzmrVsWNHioqK8hCRJBWG9bZ8RMQWlamssuUlScqHxo0b8+mna6+f++abb9KuXbtyrpAkVYUNdbt6OyLOj4it1lUgIupFxPcj4kkyXbMkSarRDjvsMEaPHs2XX34JQEQwb948zj77bI466qg8RydJddeGul3tB1wK/Cc7pe5UYAGwEmgJ7AjsBawALgNurr5QJUmqGmPGjOHQQw+lbdu2LF++nH333ZeioiL22WcfLrnkknyHJ0l11nqTj5TS28CPIqILmUUF9wP2ABoDi4DpwE3A+JTS6mqOVZKkKtG8eXOef/55nn76aV577TVWr15Nz549OfDAA/MdmiTVaRUacJ5Sep/MKua1diXzdYmIgcDA7t275zsUSVKO9evXj379+uU7DEkqGJWZardOSimNSykNb9GiRb5DkSTl0PXXX89OO+1EkyZN+M9//gPAFVdcwV//+tc8RyZJdVfBJx+SpMJzzTXXcMkllzB8+HBSSsXHO3fuzJ/+9Kc8RiZJdZvJhySp4Nxwww3cfPPNnHzyydSv/98eyD179uT111/PY2SSVLeZfEiSCs67777LzjvvvNbxBg0asGLFijxEJEmFocIrnEtSbfVy323zHcIG7TX5nXyHUFC+9a1v8dprr9G1a9dSx8ePH8+OO+6Yp6gkqe6rVPIREe2BnwDbAr9OKS2KiH2ABSmludURoFRT1IY/YME/YqWKOOOMMxg1ahTLly8npcRLL73EXXfdxZVXXsltt92W7/Akqc6qcPIREb2Ap4C5wE7A78is9XEQ8B3g6OoIUJKkqjZ06FC++eYbfvWrX7F8+XJ+8pOf0KlTJ/7whz8wePDgfIcnSXVWZVo+xgDXppQujIjPSxx/AhhatWHljut8SFJhGjZsGMOGDWPRokWsXr2adu3a5TskSarzKjPgvBdwRznHPwTaV004uec6H5JUuN555x1efvllpkyZUrzWhySp+lSm5WMF0LKc49sDH1VNOIXBsQOSlF+ffPIJP/vZz3jkkUeoVy/zPVxKiQEDBnDbbbfRunXrPEcoSXVTZVo+/g5cGBGNsvspIroBvwUerOrAJEmqLieccAL//ve/ee6551i5ciUrV65k8uTJzJ07l2HDhuU7PEmqsyrT8nEGMB74GGgCPE+mu9ULwPlVH5okSdXjiSee4KmnnqJPnz7Fx/bZZx9uvPFGDjzwwDxGJkl1W4WTj5TSUmDfiOgH9CTTavJaSmlidQUnSVJ1aNu2LU2bNl3reJMmTexyJUnVqNIrnKeUnk4pjUkpXWniIUmqjS644AJOOeUU5s+fX3xs/vz5nH766VxwwQV5jEyS6rbKLjK4O3AA0I4yiUtK6awqjGujRcSWwEQy760+memBb85rUJKkGuWaa65h3rx5dOvWjc6dOwOZ5GPzzTfno48+4g9/+ENx2ZkzZ+YrTEmqcyqzyOBZwBXAu0ARkEqcTuVelB+fA31TSssjoikwOyIeSil9ku/AJEk1w6BBg/IdgiQVpMq0fJwKjEgp3VhdwVSFlNIqYHl2txEQ2U2SJAAuvPDCfIcgSQWpMmM+6gFPbcrNIqJvRDwSEfMjIkXEkHLKjIyIuRGxMiKmRcR+G3GfLSPin8AHwO9SSos2JW5JUt3y8ccf8/HHHxfvz5o1i/PPP5/77rsvj1FJUt1XmeTjz8DQTbxfM2A2cDKZRQtLiYjBwLXAZcDuwIvAYxGxdYkyMyJidjlbpzVlUkqfpZR2A7YBjo6IWrsCuySp6v3oRz9i3LhxACxatIi+ffvyt7/9jZ///OdcddVVeY5OkuquynS7Gg2Mj4jpZBKIr0ueTCn9dEMVpJTGk1krhIgYW06R04CxJQaInxQRhwAjgHOzdfSoaMAppaJsC8h+wAMVvU6SVLfNnDmTvfbaC4AHHniA7t278+qrr/L3v/+dM888k9NPPz3PEUpS3VSZlo9Lgf7AN0BLoG2ZbZNEREOgFzChzKkJwN6VqKd9RGyRfd0C6Au8tY6ywyNiakRMLdn8Lkmq21asWEGzZs0AmDhxIj/84Q8B6NmzJ++//34+Q5OkOq0yycdI4OiU0v9LKQ1IKQ0suVVBLG2AzcjMpFVSEdChEvV0BZ7Ltng8B/wxpTSrvIIppZtSSr1TSr3btt3k/EmSVEt8+9vf5qGHHuL9999nwoQJ9O/fH4CioiK23HLL/AYnSXVYZZKPFcD06gqkqqSUpqSUeqSUdksp7bqh2bkiYmBE3LRkyZJchShJyrMLL7yQs88+m27durHXXnux5557AvDEE0+w++675zk6Saq7KpN8/B44JSKqa9raRcAqoOzg8PbAwmq6JymlcSml4S1atKiuW0iSapgjjzyS9957j6lTp/L4448XHz/wwAO5+uqr8xiZJNVtlRlwvh+Z8RM/iIg3WHvA+Q83JZCU0lcRMQ04CLi/xKmDgAc3pe71iYiBwMDu3btX1y0kSTVQ+/btad++9Pdda1pAJEnVozLJxyLgoU25WUQ0A9b8lV8P2DoiegCLU0rvAVcDd0XEFOAF4OdAJ+CGTbnv+qSUxgHjevfuPay67iFJkiSpEslHSmlT1/gA6A08U2J/dHa7AxiSUvpLRLQGzgc6kpnS99CU0rtVcG9JkiRJeVSZlo9NllKaBKx3zEhK6Xrg+pwEhN2uJEmSpFxZb/IRETOB76aUPo2IWUBaV9mU0q5VHVwu2O1KkiRJyo0NtXw8CHxZ4vU6kw9JkmqToqIi7rrrLt555x0uvvhi2rRpwwsvvECnTp3YZptt8h2eJNVJ600+UkqjS7y+qNqjyQO7XUlS4Zk2bRrf+9732GabbXj99dc588wzadOmDU8++SRz5szh3nvvzXeIklQnVXidj4h4OiK2LOd484h4ukqjyiHX+ZCkwnPGGWdw8sknM336dBo1alR8/OCDD+aFF17IY2SSVLdVZpHB/YGG5RzfnMwaIJIk1QrTpk3j+OOPX+t4x44dKSoqykNEklQYNjjbVUT0LLG7a0QsLrG/GXAwML+qA8sVu11JUuFp3Lgxn3766VrH33zzTdq1a5eHiCSpMFSk5WMq8CqZweYTsvtrtleAc4HfVFeA1c1uV5JUeA477DBGjx7Nl19m5lSJCObNm8fZZ5/NUUcdlefoJKnuqkjysQ2wLZn1OfbI7q/ZOgPNU0q3VVuEkiRVsTFjxrB48WLatm3L8uXL2XfffenevTtbbrkll1xySb7Dk6Q6a4PdrkqsLl6Z8SGSJNVYzZs35/nnn+fpp5/mtddeY/Xq1fTs2ZMDDzww36FJUp1WqRXOI2IroC/QjjLJSErp6iqMS5KkatevXz/69euX7zAkqWBUOPmIiGOA24BvgI8pveBgAmpl8uGAc0kqTNOnT+eZZ57ho48+YvXq1aXOXXnllXmKSpLqtsq0fPwGuAr4dUppVTXFk3MppXHAuN69ew/LdyySpNy48sorOeecc+jatSvt27cnIorPlXwtSapalUk+2gO31KXEQ5JUmH7/+9/z5z//mRNPPDHfoUhSQanMIPLxwJ7VFYgkSbmyevVqvve97+U7DEkqOJVp+XgS+G1E7ATMAr4ueTKl9FBVBiZJUnUZMWIEt99+O5deemm+Q5GkglKZ5OPG7M9flXMukVntvNZxwLkkFZ4LL7yQQw89lN13352dd96ZBg0alDp/220uXyVJ1aHC3a5SSvXWs9XKxANc4VySCtF5553HhAkTqF+/Pp9++ikff/xxqU2SVD0qtc6HJEl1wfXXX8+9997L4MGD8x2KJBWUyqzzcdr6zrvIoCSptmjcuDG77757vsOQpIJTmZaPk8rsNwA6AiuAj6iliwxKkgrPqaeeyjXXXMN1113nuh6SlEMVTj5SStuUPRYR7YHbgZurMihJkqrTc889x+TJk3n00UfZcccd1xpw/sgjj+QpMkmq2zZpzEdKqSgizgP+CvytakKSJKl6tWnThiOPPDLfYUhSwamKAef1yKx+LklSrXD77bfnOwRJKkiVGXBe9iuiIDPm4xfAc1UZVC65zockSZKUG5Vp+XigzH4CPgaeBk6vsohyLKU0DhjXu3fvYfmORZJUfXbddVeeffZZWrZsyS677LLegeYzZ87MYWSSVDgqM+C8wgsSSpJU0xx11FE0atSo+LWzXElS7lUo+YiIBsDzwHEppbeqNyRJkqrehRdeWPz6oosuyl8gklTAKtSakVL6GtiGTFcrSZJqtX79+vHZZ5+tdXzp0qX069cv9wFJUoGoTFeqOwDHRUiSar1Jkybx1VdfrXV85cqVPPdcrZ1DRZJqvMoMOG8KHBMRBwHTgC9Knkwp/bIqA5Mkqaq99tprxa9nzpxJq1ativdXrVrFE088QefOnfMRmiQVhMokHzsAa57a3ypzrsZ1x4qIJsC/gPtTSmfkOx5JUv717t2biCAi6N+//1rnGzduzB//+Mc8RCZJhaEys10dUJ2BVIPzgJfzHYQkqeaYO3cuKSW+9a1vMWXKFNq2bVt8rmHDhrRr147NNtssjxFKUt1WFSuc1zgR8W1ge2AcsHOew5Ek1RBdu3YFYPXq1XmORJIKU06Tj4joC5wB9AI6AUNTSmPLlBkJnElm9fTXgVNSSpUd/TcmW8femxqzJKlu+uCDD5g8eTIfffTRWsnIaaedlqeoJKluy3XLRzNgNnBndislIgYD1wIjyawrMhJ4LCJ2TCm9ly0zg/Lj7p9SWhARhwFzUkpzIsLkQ5K0lnvuuYef/vSn1K9fn7Zt25ZacDAiTD4kqZrkNPlIKY0HxgNExNhyipwGjE0p3ZzdPykiDgFGAOdm6+ixgdvsBfxvRPwPmWSnQUQsTSn9ZtPfgSSpLrjgggs4/fTTufjiix3jIUk5VJl1PqpVRDQk0x1rQplTE6hE96mU0rkppS4ppW5kunjdvK7EIyKGR8TUiJj68ccfb2TkkqTapqioiBNOOMHEQ5JyrMYkH0AbYDOgqMzxIqBDddwwpXRTSql3Sql3yRlPJEl126GHHsorr7yS7zAkqeDUydmu1ig7mL08ETEQGNi9e/fqD0iSVCMcdNBBnH322bz++uvssssuNGjQoNT5I488Mk+RSVLdVpOSj0XAKqB9mePtgYXVddOU0jhgXO/evYdV1z0kSTXLiSeeCMBll1221rmIYNWqVbkOSZIKQo3pdpVS+gqYBhxU5tRBwIvVdd+IGBgRNy1ZsqS6biFJqmFWr169zs3EQ5KqT06Tj4hoFhE9IqJH9t5bZ/e3zha5GhgSESdExA4RcS2Z9UBuqK6YUkrjUkrDW7RoUV23kCRJkkTuu131Bp4psT86u90BDEkp/SUiWgPnk1lkcDZwaErp3RzHKUmqw66++ur1nnedD0mqHrle52MSEBsocz1wfU4CwgHnklSI/vjHP5ba//rrr/nwww9p3Lgx7dq1M/mQpGpSkwac54UDziWp8MydO3etY0VFRQwdOpRhw/x1IEnVpcYMOJckKZ/at2/PpZdeyllnnZXvUCSpzir45MPZriRJa6xevZqiorJr3UqSqordrux2JUkF56GHHiq1n1Liww8/5LrrrmO//fbLU1SSVPcVfPIhSSo8gwYNKrUfEbRt25Z+/fpx1VVX5SkqSar7TD4kSQVn9erV+Q5BkgqSYz4c8yFJBeXrr79mzz335K233sp3KJJUcAo++XCFc0kqLA0aNGDu3LlErHfZKUlSNSj45EOSVHiOP/54br755nyHIUkFxzEfkqSC88UXX3DPPffw5JNP0qtXL5o2bVrq/B/+8Ic8RSZJdVvBJx8RMRAY2L1793yHIknKkX/961/07NkTgP/85z+lztkdS5KqT8EnH67zIUmF55lnnsl3CJJUkBzzIUmSJCknTD4kSZIk5YTJhyRJkqScKPjkw0UGJUmSpNwo+OTDRQYlSZKk3Cj45EOSJElSbph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScKPjkw3U+JEmSpNwo+OTDdT4kSZKk3Cj45EOSJElSbph8SJIkScoJkw9JkiRJOWHyIUmSJCknTD4kSZIk5YTJhyRJkqScqJ/vAKpDRMwDlgKrgU9TSgfkNyJJkiRJdTL5yNo7pbQs30FIkiRJyrDblSRJkqScyGnyERF9I+KRiJgfESkihpRTZmREzI2IlRExLSL224hbJeDZiHg1Io7Z5MAlSZIkbbJcd7tqBswG7sxupUTEYOBaYCTwfPbnYxGxY0rpvWyZGZQfd/+U0oLs631TSvMjoiMwMSJmpZRmVvm7kSRJklRhOU0+UkrjgfEAETG2nCKnAWNTSjdn90+KiEOAEcC52Tp6VOA+87M/P4yI8UBPwORDkiRJyqMaM+YjIhoCvYAJZU5NAPauRD1NI2KL7OtmQD/g9XWUHR4RUyNi6scff7xxgUuSJEmqkBqTfABtgM2AojLHi4AOlainPfB8RPwTeBm4M6X0ankFU0o3pZR6p5R6t23bdmNiliRJklRBdW6q3ZTSf4DdKlo+IgYCA7t37159QUmSJEmqUS0fi4BVZFouSmoPLKyum6aUxqWUhrdo0aK6biFJkiSJGpR8pJS+AqYBB5U5dRDwYnXdNyIGRsRNS5Ysqa5bSJIkSSL363w0i4geEdEje++ts/tbZ4tcDQyJiBMiYoeIuBboBNxQXTHZ8iFJkiTlRq5bPnoD07NbY2B09vVvAFJKfwFOAc4HZgD7AoemlN6troBs+ZAkSZJyI9frfEwCYgNlrgeuz0lAmfuNA8b17t17WK7uKUllxTk1f7rvdIWzAkqSNk2NGfMhSZIkqW6rc1PtVpZT7aqu8Rt0SZJUUxV88mG3q3Xzj1hJkiRVJbtdSZIkScoJkw9JkiRJOVHwyYdT7UqSJEm5UfDJh4sMSpIkSblR8MmHJEmSpNww+ZAkSZKUEwWffDjmQ5IkScqNgk8+HPMhSZIk5UbBJx+SJEmScsPkQ5IkSVJOmHxIkiRJygmTD0mSJEk5UfDJh7NdSZIkSblR8MmHs11JkiRJuVHwyYckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJyomCTz6caleSJEnKjYJPPpxqV5IkScqNgk8+JEmSJOWGyYckSZKknDD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJyok6mXxExDYR8UxEvBERsyKiab5jkiRJkgpd/XwHUE3GAuenlJ6LiFbAl3mOR5IkSSp4dS75iIidgK9TSs8BpJQW5zkkSZIkSeS421VE9I2IRyJifkSkiBhSTpmRETE3IlZGxLSI2K+St/k2sCwixkXEaxHxqyoJXpIkSdImyXXLRzNgNnBndislIgYD1wIjgeezPx+LiB1TSu9ly8yg/Lj7p5QWZM/tB/QAPgIej4hXU0pPVvm7kSRJklRhOU0+UkrjgfEAETG2nCKnAWNTSjdn90+KiEOAEcC52Tp6bOA284GpKaX3s/cZTyYRMfmQJEmS8ihSSvm5ccQyYFRKaWx2vyGwHPhxSun+EuWuA3ZOKX23gvXWB14F+gFLgL8DN6aU/lFO2eHA8OzudsBbG/2G6qY2wKJ8B6FK83Ornfzc1tY1pdQ230HURhExPKV0U77jUOX4udVOfm6VU5MGnLcBNgOKyhwvAg6saCUppW+y4zwmAwFMKC/xyJa9CfA/lnWIiKkppd75jkOV4+dWO/m5qYoNx99vtZGfW+3k51YJNSn5qDIppceAx/IdhyRJkqT/qkmLDC4CVgHtyxxvDyzMfTiSJEmSqlKNST5SSl8B04CDypw6CHgx9xEJmxBrKz+32snPTVXJ/55qJz+32snPrRJyOuA8IpoB3bO7LwJXAI8Ai1NK72Wn2r2LzBS7LwA/B34G7JRSejdngUqSJEmqcrlOPvYHninn1B0ppSHZMiOBs4COZNYEOTWlNDlHIUqSJEmqJnmbaleSJElSYakxYz5UM0RE34h4JCLmR0SKiCH5jkmlbegzioyLImJBRKyIiEkRsVOewi1YVfE5RUTLiLgrIpZkt7siYstcvg/VHj6/awef4bWDz/DqY/KhspqR6e52MrAiz7GofBv6jM4CTgdOAv4f8BHwZERskbMIBVXzOd0L9AQOyW49yYyLk8rj87t28BleO/gMryZ2u9I6lV2FXjVP2c8oIgJYAPwppXRp9lhjMg/FM1JKN+Yr1kK2MZ9TROwAvAHsm1J6IVtmX+A5YPuU0lu5fyeqLXx+1w4+w2sHn+FVy5YPqW7ZBugATFhzIKW0ApgM7J2voLSWinxOfYBllJ5q/AXgC/wspbrKZ3jt4DN8E5h8SHVLh+zPojLHi0qcU/5V5HPqAHycSjRPZ19/hJ+lVFf5DK8dfIZvApMPSZIkSTlh8iHVLQuzP9uXOd6+xDnlX0U+p4VA22zfYqC4n3E7/CyluspneO3gM3wTmHxIdctcMg+1g9YciIjNgf0o3e9U+VWRz+klMrOt9ClxXR+gKX6WUl3lM7x28Bm+CernOwDVLBHRDOie3a0HbB0RPYDFKaX38haYim3oM4qIa4BfRcSbwBzgfDKD3u7NQ7gFa1M/p5TSvyLiceDGiBieredG4B+FPEuK1s3nd+3gM7x28BlefZxqV6VExP7AM+WcuiOlNCSnwahcG/qMss26FwInAi2BV4BfpJRm5yxIVcnnFBEtgT8CP8weeoTMdI+fVV/kqq18ftcOPsNrB5/h1cfkQ5IkSVJOOOZDkiRJUk6YfEiSJEnKCZMPSZIkSTlh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kPIoIjpExISI+CIiqmXe64jYPyJSRLSpjvolqVD5DJcqz+RDqoCIaBsRX0VE04hokP1Fs3UVVH0G0AnoAXSsgvokSWX4DJdqjvr5DkCqJfoA/0wpfRERewKLU0rvVUG93YFpKaW3q6AuSVL5fIZLNYQtH1LF7A28kH29b4nX6xURJ0bEv7PfuP07IoaVODcPOAw4LtukPnY99RwaEa9ExIqI+CQixkXE5tlzLSPijoj4NHt+YkTstJ66hkTEsjLHSjXrrykTEd+PiDcjYnlEPBIRLSJiUES8HRFLIuKuiGhcop5JEXF9RFwWEYsi4qOIGBMR9UqUOTIiZmZjXRwRz0ZE+4r8e0rSRvIZ7jNcNYQtH9I6ZJvkZ2Z3mwCrImII0BhIEfEZcG9KaeQ6rj8C+BNwKjABOBi4PiIWppTGAf8PuBdYDJwMrFhHPYcAjwBXAEPJ/H/bn/9+eTAW2I7ML8FPgUuBxyPiOymlcuusoEbA6cAxQEPgwey2AjgKaA08BIwEripx3THAtWR+2ffIvsdpwH0R0QH4P+DcbF3NgL02IUZJKpfPcJ/hqqFSSm5ubuVsZH5BdAN2Bb7K/twW+Bzomz3XZj3XvwDcVubYWOD5Evv/AMZuII4XgP9bx7lvAwnoW+JYC2AJcEJ2f/9smTbZ/SHAsjL1lFcmAduVKDMGWFXyPWffzz9K7E8CXipT95PALdnXPbP1ds335+vm5la3N5/hPsPdauZmtytpHVJK36SU5gHbA6+mlGYCHYCilNLklNK8lNKi9VSxA2s37T8P7FjJUHYHnlrPPVYDL5WIewkwayPuU9aXKaW3SuwXAQvLvOcioF2Z62aW2V9Qosw/gYnA7Ih4MCJGRETbTYxTktbiM9xnuGomu11J6xARrwNdgQZAvWwf2/pA/ezrd1NK6+yXux7VMh1jJe6zGogyxxqUU+6bcur7upxjZb/EWGeZlNKqiOhPppm+P/Az4PKI+G5K6Z/riFeSKs1nuM9w1Uy2fEjrdiiZ/q4LgWOzr2cDp2RfH7qB6/8F7FPm2L7AG5WMYzrwvfXcox6ZmVwAiIjmwC7ruc/HQJNsuTV6VDKmjZYyXkopjSbTZ3oBMDhX95dUMHyGVwOf4dpUtnxI65BSejc7uK498Hcy3/7sBDyYUvqwAlX8Drg/IqaRGax4CJmBfEdWMpRLgXER8W8yA/+CzDdON6aU3o6IvwM3RsRw4LNs+aXZsuV5BfiCzLdVvwd2IzPgsNpFxF7AgcATZJr7dwe6UPlf5pK0Xj7Dq57PcFUFWz6k9dufTF/hlcAewAcV/KVFSulh4CQyM6W8QWY2lJEpM0tKhaWUxgNHAN8n8w3as8ABZJreITN7yhQys6lMITOryyFpHbOkpJQWk/kFehCZfsXDgV9XJqZNsITMN4n/AN4mM8PKxSmlu3N0f0mFZX98hlcln+HaZJFSrrouSpIkSSpktnxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfkiRJknLC5EOSJElSTph8SJIkScqJ/w/40PfwoXyrhQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import OrdinalMinuteOfHour\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [OrdinalMinuteOfHour(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OrdinalMinuteOfHour\")" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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wBCALbfcct+vfe1rtR22JGkjTZ8+fUlKqW01ihbOzCkqCKtXr+b++++ncePGTJ8+/Wbg5pNPPpm///3vtGvXLm299dZ84xvfYOTIkbRr1670ed/4xjd46aWXvtGmTZuftG/fniOPPJLhw4ez1VZblZZJKfHmm2+y9957c+KJJ6bGjRszdepUunfv/nkeXqpUlajqRINJPoA2QCNgcYXji4E+ACmlLyPiHOAJMq06v1rfTFcppVvJfnNQUlKSpk2bVhdxS5I2QkS8le8YpJqYNWsWPXv2ZOXKlbRo0YK//e1v7LnnngAcccQRHHfcceywww7MmzePSy65hN69ezN9+nSaNm0KwAknnECXLl3o2LEjL7/8MhdeeCEzZ85kwoQJ5a7TrVs3zjvvPEaMGMHPf/5zunfvnuuXKm20ejvVbkR8CpyeUhqd3V87mPwbKaVJZcpdCpyYUtplI6/TD+jXrVu3wW+88camBy5JqhURMT2lVFKNovXzF5mKzhdffMH8+fNZtmwZDzzwALfddhsTJ05kjz32WKfswoUL6dKlC3/961857rjjKq1v6tSp7LfffkyfPp0ePXqUHl+xYgXdu3fnnXfeYb/99uOxxx4josovmqV8qPIfZL0a87EBS4DVQPsKx9sDiza20pTS2JTSkFatWm1KbJIkqcg1adKEbt26se+++3L11VfTvXt3rr/++krLduzYka985Sus74vPkpISGjVqtE6Z888/ny+//JKpU6cybdo0fve739Xq65DqUoNJPlJKX5BZNPCwCqcOIzPr1UaJiH4RceuyZRXHc0mSJG28NWvW8PnnlQ/FWLJkCQsWLKBDhw5VPn/WrFmsXr26XJknnniCm266idGjR7P77rtz7bXXcsEFFzBnzpxaj1+qC/Wq21VEtAC6ZXefAX4BjAGWppTmZ6favRsYCkwGfgz8L7B7SmmT+gY75kOS6he7XakhueCCC/jWt75F586d+eSTT7j33nv55S9/yb/+9S8OPvhgLrvsMvr370+HDh2YN28eF154IW+//TavvvoqW221FXPmzOGee+7hqKOOok2bNrzyyiucc845NGvWjOeff55GjRrxySefsOeee9K/f3+uvfba0msfccQRLF++nIkTJ7LZZg3me2UVtgYz4LyEzGDxtUZktz8AA1NKf42IbYFLyMx9/RJw1KYmHpK0PmvWrGHJkiV89NFHrF69Ot/hFIxGjRqx9dZb06ZNG/9gUoO3aNEifvCDH7Bo0SJatWrFXnvtxfjx4zn88MNZsWIFs2bN4o9//CMfffQRHTp04NBDD+W+++4rncmqSZMmPPbYY4waNYpPP/2Uzp07861vfYvhw4fTqFEjAIYNG0bz5s0ZOXJkuWvfcccd7LHHHowaNYqzzjor569dqol61fKRDw44l7Qh8+fPJyJo3749jRs3dmBnLUgpsWrVKhYvXkxKie23X3etWFs+JKnBKogB53XCAeeSNuSzzz6jU6dONGnSxMSjlkQETZo0oVOnTnz22Wf5DkeSlCNFn3xIUnXYLahu+L5KUnEp+ru+s11JkiRJuVH0yYfdriSperp27cqjjz6a7zAkSQ1YfZvtSpIahGd77VSn9e8/yTn7JUmFp+iTjzKzXeU7FEmSVEfigvfzHUJBSL9om+8Q1MDZ7cpuV5IauK5du3L11Vez22670bp1awYNGsTKlSv58MMPOfroo2nbti2tW7fm6KOP5p133il93iGHHMLPf/5zDjzwQLbaaiv69u3LkiVLSs/ffffddOnShW233XaddQWmTp1Kz5492XrrrenQoQOnn346X3zxBZCZRvess86iXbt2tGzZkj333JOXXnopN2+GJKleK/rkQ5IKwT333MPDDz/MnDlzmD17NldeeSVr1qxh0KBBvPXWW8yfP59mzZpx+umnl3vevffey1133cV7773HF198wTXXXAPAK6+8wmmnncbdd9/NwoUL+eCDD8olLo0aNeL6669nyZIlTJkyhccee4ybbroJgAkTJjBp0iRmz57NsmXLuO+++9h2221z92ZIkuotkw9JKgCnn346nTt3ZptttuHiiy/mz3/+M9tuuy39+/enefPmbLXVVlx88cU8+eST5Z43aNAgdt55Z5o1a8b3vvc9ZsyYAcADDzzA0UcfTa9evWjatClXXHFFuWlx9913X/bff38233xzunbtyqmnnlpad+PGjfnkk0947bXXSCmx66670qFDh5y9F5Kk+svkQ5IKQOfOnUsfd+nShYULF7J8+XJOPfVUunTpQsuWLenVqxcfffQRq1evLi273XbblT5u3rw5n376KQALFy4sV+eWW25ZrvVi9uzZHH300Wy33Xa0bNmSiy66qLTLVu/evTn99NP5yU9+Qrt27RgyZAgff/xxnb12SVLDUfTJh+t8SCoEb7/9dunj+fPn07FjR6699lpef/11nnvuOT7++GMmTZoEZMZkbEiHDh3K1bl8+XI++OCD0v3TTjuNr33ta7zxxht8/PHHXHXVVeXq/elPf8r06dN55ZVXmD17Nr/+9a9r42VKkhq4ok8+HHAuqRDceOONvPPOOyxdupSRI0cyYMAAPvnkE5o1a8bWW2/N0qVLGTFiRLXrO/744/nnP//J008/zRdffMGll17KmjVrSs9/8skntGzZkhYtWvDaa6/x+9//vvTc888/z3PPPceqVavYcsst2WKLLVzJXJIEmHxIUkE44YQT6Nu3LzvuuCM77bQTl1xyCcOGDWPFihW0adOG/fffnyOOOKLa9e2+++7ceOONnHDCCXTo0IHWrVvzla98pfT8Nddcw7333stWW23F4MGDGTBgQOm5jz/+mMGDB9O6devS2bLOO++8Wn29kqSGKarT/F4MSkpK0rRp0/IdhqR66NVXX2XXXXfNdxhV6tq1K7fffjt9+vTJdygbpar3NyKmp5RKqlGFv8i0Qa7zUTtc50PVFFWdsOVDkiRJUk4UffLhgHNJkiQpNzbPdwD5llIaC4wtKSkZnO9YJGljzJs3L98hSJJULUXf8iFJkiQpN0w+JEmqR2688Ub22msvWrZsScuWLenZsyf/+te/Ss8/9NBDHH744bRt25aIYOLEievUccghhxAR5bbvf//7pedfeukltthiCx588MFyz3v00Udp3LgxkydPrrPXJ6m4mXxIklSPfOUrX+GXv/wlL7zwAtOmTaN379585zvfYebMmQB89tlnHHDAAVx33XXrrWfQoEG8++67pdstt9xSem6PPfZgxIgR/PjHP2bx4sUALFu2jEGDBnHOOedw4IEH1t0LlOqR2kj2Bw8ezE477USzZs1o27YtxxxzDK+++mrpeZP98kw+JEmqR4455hiOPPJIunXrxs4778zIkSPZaqutmDJlCgAnnXQSw4cP58gjj1xvPc2bN2e77bYr3Soupnveeeex8847M2TIEADOOOMMWrduzeWXX143L0yqh2oj2S8pKWH06NG8+uqrPPzww6SU6NOnD6tWrQJM9isq+gHnkiTVV6tXr+b+++/n008/5YADDqjRc//yl7/wl7/8hfbt23PkkUcyfPhwttpqq9Lzm222GX/4wx/Ye++9OfHEE7n//vuZOnUqTZo0qe2XIdVbxxxzTLn9kSNH8vvf/54pU6aw1157cdJJJwGwZMmSKus49dRTSx937dqVK6+8kr333pv//Oc/7LLLLkAm2R8zZgxDhgzhH//4R1En+yYfkiTVM7NmzaJnz56sXLmSFi1a8Le//Y0999yz2s8/4YQT6NKlCx07duTll1/mwgsvZObMmUyYMKFcuW7dunHeeecxYsQIfv7zn9O9e/dafiVSw7Epyf5an332GXfddRfbb789Xbt2LT1usv9fRZ98REQ/oF+3bt3yHYqkBqSuV0t2FeHitssuuzBjxgyWLVvGAw88wMknn8zEiRPZY489qvX8tV2pAPbcc0923HFH9ttvP1544QV69OhRem7FihX8+c9/pnnz5jz99NOklIiocmFiqSBtarIPcNNNN/Gzn/2Mzz77jF122YXHHnuMpk2blitjsp9R9GM+UkpjU0pDKvaFlSQpX5o0aUK3bt3Yd999ufrqq+nevTvXX3/9RtdXUlJCo0aNeOONN8odP//88/nyyy+ZOnUq06ZN43e/+92mhi41OGuT/eeee47TTjuNk08+mZdeeqlGdZx44om8+OKLPPnkk+y8885897vfZfny5eXKVJbsF6OiTz4kqaHr2rUr11xzDXvttRetWrViwIABrFy5ktGjR3PQQQeVKxsRvPnmmwAMHDiQoUOHcuSRR9KiRQsOPPBAFi1axLBhw2jdujVf+9rXePHFF8td5+qrr2a33XajdevWDBo0iJUrVwKZAZVjx44tLbtq1SratGlT7vnaeGvWrOHzzz/f6OfPmjWL1atX06FDh9JjTzzxBDfddBOjR49m991359prr+WCCy5gzpw5tRGy1GDURrLfqlUrvvrVr9KrVy8eeOABZs+evc7sVib7GSYfklQA7rvvPv79738zd+5cZs6cyejRo6v9vCuvvJIlS5bQtGlTevbsSY8ePViyZAnHH388Z599drny99xzDw8//DBz5sxh9uzZXHnllQD88Ic/5E9/+lNpuXHjxtGhQwf22WefWnuNxeKCCy7gqaeeYt68ecyaNYsLL7yQiRMncuKJJwKwdOlSZsyYUfrN7JtvvsmMGTNYtGgRAHPmzOHyyy9n2rRpzJs3j3HjxvH973+fffbZp3RWnU8++YRBgwZx5plncvDBBwOZ6UIPPvhgBg0axJo1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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import OrdinalHourOfDay\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [OrdinalHourOfDay(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OrdinalHourOfDay\")" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABHwElEQVR4nO3dd3hUZdrH8e8NhBpBICECS1HjioCAEHdFhFWkWbC/siu7CK6Aoi5YUKyICrqKXVm7qK+wr4AirCCIghRRpC1iAxFFKZEiTTq53z/OECchgcRkZpKZ3+e65mLOeZ55zj0ZPck9TzN3R0REREREJNLKxDoAERERERFJDEo+REREREQkKpR8iIiIiIhIVCj5EBERERGRqFDyISIiIiIiUaHkQ0REREREokLJh4hIHsysk5lNNrONZrbLzJaZ2T/NrHoR251hZjPCjk83Mzez04sY8qGuOdLMvst1zsMee81svZnNMrM7zaxWpGLJFcPJZjbOzDLNbLeZfWdmI8ysbh51q5jZa2b2UyjmZ0P/3pVH3S9DZY1znW8SOn9tBN7L3aG2yxV32yIi8UTJh4hILmZ2GzAF2AVcCXQGngF6Ap+aWb1ivNxCoHXo32gbGbr2n4ArgJnAdcDnZnZqJC9sZn8D5gI1gf5AR+B+gp/1IjNrlusl1wB/AW4KxTwM+AZol6vdVKARsCN3WdjxzGJ7IyIiUij6hkZEJIyZnQHcBzzm7teHFX1oZm8BC4BXgTPyeX1ZwNx9X0Gu5+5bgY+LFvVvttrdw6890cyeAGYBb5rZMe6+o7gvamaNgOeB8cCl7p4VKpppZmOBT4CxZtbE3feGyk4A1rj7q2HtfAj82cySwuq1A7YAb4WePxN26XbAz8Bnxf2eRESkYNTzISKS083AJuDW3AXuvhJ4ADjdzP4I2cOXhprZIDNbCewBTgyV/dnMvgoNKfrczC7M3WZew65CQ7Nmm1kHM1toZjvMbGnu15tZemgo0koz22lm35rZv4oyNMzdM4GBQBpBT8OBa3Uys0lmtjYsnhtDydaBOhPNbFEe7/FoM8sys6tCp/oDZYHrwhKPA9ffCNwGHAdcFHq9E/Q61QsbKnY6QQ9GFaBVWBPtgI+AD4G2uUJpC8xydw+1m2pmz5jZ6tBn9JWZ9ckn/tdDQ9N2m9nivD7LPF7Xxcy2m9lTZqbftyIiKPkQEckWGq//J+A9d9+VT7UJoX/bh53rCZxDMCToHGCNmXUARgHLCf6Ifgh4HDi+gOEcG6r/SOj1a4ExZpYeVqcO8AMwgGC40j3AmcCkAl4jP1OBfUCbsHPHAO8TDM86B3gFuBsYGlbnX0ALM/tDrvb6AL8Ar4eOzwTmu/vafK7/DpDFrz/j1gTD4NaFnh8YpnZg+FT48Kp2BD03s4DfmdkxAGZ2LFD3wGvMrCowGzg79D7OASYC/zKz6w40Fhpi9wnQHLgeOC907XFmdl4+8WNmPQj+W3nA3a/NnWSJiCQqDbsSEflVTaAS8N0h6hwoC5/3YUAnd9+ZfcLsTeAr4PwDf3ia2VcE8xy+LkAsKUA7d18eeu1CggTkUoL5Drj7TMLmL5jZRwTzIGaZ2UnuflAvREG4+04z2wDUDjuXPXzJzIzgj/vywE1mdlvoPb4LfAv0BeaF6iYBvYDX3X1bqIl6BMPX8rv+L2a2PlQPd/84FM/uXMPEtprZKoKE40EzqwY0I+hRWWFma0Nl33LwfI/+QAPgxAM/Y2CamR0JDDazf4WGzt1N8Pn+KdQrAzAllJTcw6/JaDYzu5kgKbva3V/I732KiCQi9XyIiBTdu7kSj7LAycDY8G+8Q384f1fANpeH/VGMu/8E/ATUD7tOeTO7LTRcaCewlyApgIL3sOTHAA+7Vu3QClPfEwwt20swN+ZIoFYoxizgWYJ5GNVCL72AYAjXs0WMJz8zgTahYU2nheL6NFQ2m1+TjnbANn6d2N+FoEdjpZmVO/Ag6GGpCTQOqzcJ2JJHveahHpRwjwJDgEuUeIiIHEzJh4jIrzYSrHDV8BB1DpT9EHYu9/ChFCAJyMzj9Xmdy8umPM7tBiqGHd9P8M38/xIMG/oDoXkSueoViplVIngPa0PHZQi+4T+XIOFoT5BcHRhyFX6tFwnmc/wtdHwVMC9XL8yPHOJnbGZVgFRy/ozzM5MgAWpGkGDMc/fdobJZ5Ew+PnL3/aHjWqFze3M9xoTKa4bV65FHvYdy1TvgL8BSYFoBYhcRSTgadiUiEuLu+0IrKHU0s4r5zPs4MM7/g/CX5qqzgeAP1LQ8Xp8GfF/kYAN/Bl519/sOnDCz5GJotzNBAjE7dHwskAH8zd3/N+xaXXO/0N03mtkbQF8zm0KwKtiVuaq9D/zdzGrnM+/jHIIvxz7Ioyy3D0P/tgs9wl8zC3jCzE4mmLPyYljZRoKepP75tPt1WL1ZwD/zqbcm1/GZBHNmJpvZ2e6+vQDvQUQkYajnQ0Qkp+EE32YPy11gZkcDtwAz3f2T/BoIfbv+KXBJ+CpHoRWyGhZjrJUJkpxwvYrSoAUbDD5I0Ovx77DrEH6t0FyO7vk0MwJoCrxAsOztv3OVP04wofzJ3KtAmVkNft3D483DxevuywgmonchWPVqVljxEmArcEfo+MOwsncJ9gNZ5e7z83hsC6vXDPg8n3q7yelz4HSC1bomF1MyKCISN9TzISISxt2nmdlgYIiZNSTY0+NnoCUwiOCP6b/l30K2wQTfgI83s2cJhhENIfhDubi8C1xuZp8R/LF+EVCYzQHrmtkpBF9E1QBOAXoTzPfoGjaP5UuC3pqhZrafIAm5Po/2gOwJ4osIeiKezL1XiLt/aWZ9CZKT983sGYJkpxHBUsdHAh3D9u44nFnAJQQ9UB+FXScrNAm/K7CTX+eCQDA3oxvB5PxHCXo6qoRiaOvu54fq3UUweX6mmT1FMGenOkFydYy7X5HH+/8ytBTwdILJ6V3CkhkRkYSmng8RkVzc/R7gLII/Rl8mSCL6ESQiGe6+qgBtTCPoGTie4Bv8gQRL4hZkpauCuo5gLsZQ4P+AIwjbm6MAehKsvvUhwW7npwNPAk3Ce3bcfQ/BxPF1BD+DpwnmWjxwiLYPzJ3Ic6K5u48kmCC+GXiKYI7E7aF/C7tS14cECdN/Q5s2hpsVKvsk9D4OXH8LQaI2iaA3awrwEnA+QdJwoN4qgiFn/yXokXmPYEnhP3GIYWHu/nWoTgNgah4T00VEEpKF9loSEREpNmY2B8hy99wb/YmISALTsCsRESkWZlaBYHhaB4JehfMP/QoREUk0Sj5ERKS41CaYc7EZGObuB23AJyIiiU3DrkREREREJCo04VxERERERKJCyYeIiIiIiESFkg8REREREYkKJR8iIiIiIhIVSj5ERERERCQqlHyIiIiIiEhUKPkQEREREZGoUPIhIiIiIiJRoeRDRERERESiQsmHiIiIiIhEhZIPERERERGJCiUfIiIiIiISFUo+REREREQkKpR8iIiIiIhIVCj5EBERERGRqIi75MPMzjWzr81suZldGet4REREREQkYO4e6xiKjZmVA74AzgC2AAuAU919Y0wDExERERGRuOv5+APwubuvdvftwGSgU4xjEhERERERSljyYWbtzGyCma02MzeznnnU6WdmK81sl5ktMLO2YcV1gNVhx6uBuhEOW0RERBKcmV1jZkvMbGvoMdfMzslV5/dm9qaZbTazHWa20MxOCCs/ysxeM7N1ofL/mln3sPKmob9/Ls7Vbgcz22tmbSL/TkWKpkQlH0AysBToD+zMXWhm3YDHgWHAScBHwGQzqx/NIEVERERy+RG4BWgJZAAfAOPNrBmAmR0NzAFWAu2BpsAdwPawNl4FTgDOD5W/CrxmZu0A3H0pMBh4xszSQu1WA14GHnb3ORF+jyJFVmLnfJjZduBadx8Zdu4TYIm79w47txwY6+63mtmpwEB3vzBU9hgwz91HRTV4ERERSXhmtgm41d2fNbNRgLt790PU3w5c5+4vh537HnjS3YeHjssAs4AN7n6+mb0KtAAy3H1PBN+OSLEoF+sACsrMygOtgOG5iqYCp4aezwOamlldggnnZwH3HqLNPkAfgCpVqrRq1KhRcYctIiK/0YIFCza4e2oBqpbMb9EkYe3fv58xY8aQlJTEggULnsnKynomOTmZQYMG0aVLl8sWLFhAw4YNuemmm+jWrVv26zp37oyZvbRx48aXqlevzsSJE6lUqRIfffTRQ8BDAO7ON998Q/PmzenevbsnJSUxb948WrRosTtW71ckD5ZfQalJPoAUoCyQmet8JtABwN33mdmNwHSCIWUPHmqlK3d/DngOICMjw+fPnx+JuEVE5DcIfeMrUmp89tlntG7dml27dpGcnMxbb73FiSeeyLp169i+fTvDhg3j3nvv5YEHHuCDDz6ge/fuJCcnc845wdSQN954gz//+c+kpKRQrlw5KlSowOjRo2nRokWO66SnpzNw4ECGDBnCnXfeeVC5SElWmpKPAnH3CcCEgtY3s65A1/T09MgFJSIiInHv+OOPZ/HixWzZsoWxY8dy+eWXM2PGDGrUqAHA+eefzw033ABAixYtmD9/Pk899VR28nHHHXewYcMGpk2bRkpKCuPHj6dHjx7MnDmT5s2bZ19n586djB49msqVKzN79mzcHbN8v2gWKVFK2oTzQ9kA7AfScp1PA9b91kbdfaK796lWrVpRYhMREZEEV758edLT02nVqhX3338/LVq04NFHH83uyWjcuHGO+ieccAKrVq0CYMWKFTz55JM8//zznHnmmTRv3pzBgwdz8skn8+STT+Z43S233MK+ffuYN29edgIjUlqUmuQjNIlqAdAxV1FHglWvfhMz62pmz23ZsqUo4YmIiIjkkJWVxe7duylfvjwnn3wyX3/9dY7yZcuW0aBBAwB27NgBQNmyZXPUKVu2LFlZWdnH06dPZ8SIEYwcOZImTZrw8MMPM2jQIFasWBHhdyNSPErUsCszSwYOjH8qA9Q3sxbAJndfBTxCsOTcPILl6q4i2Nvjmd96TXefCEzMyMjofdjKIiIiInkYNGgQ55xzDvXq1WPbtm2MGjWKGTNm8M477wBw8803c+mll9K2bVvat2/P9OnT+fe//8348eMBaNSoEenp6fTr14/hw4dTs2ZNxo8fz3vvvcfbb78NwLZt2+jVqxf9+/enbdtgm7PevXszbtw4evXqxYwZMyhTptR8rywJqkQttWtmpxNMFs/tFXfvGarTD7gZqE2wJ8j17j6zqNfWhHMRyU9WVhYbNmxg8+bN7N+/P9bhxI2yZcty5JFHkpKSkucfTGa2wN0zCtBUyflFJgmrZ8+eTJ8+nXXr1lGtWjWaNWvGwIED6dy5c3adkSNHMmzYMH744QeOO+44br31Vv7yl79kly9fvpxBgwYxe/Zstm/fTnp6OjfccAOXX345AH//+9+ZO3cuCxcupGLFitmvW716NU2bNuWuu+7i+uuvj96bFslfvpOQSlTyEQthE857L1++PNbhiEgJtGrVKsyMtLQ0kpKSNLGzGLg7e/fuJTMzE3enfv2D94pV8iEiUmrl+4sy4fvmNOFcRA7nl19+oW7dupQvX16JRzExM8qXL0/dunX55ZdfYh2OiIhEScInHyIiBaFx1JGhn6uISGJJ+Lu+VrsSEREREYmOhE8+NOxKRKRgGjZsyLRp02IdhoiIlGIlaqldEZHS4uN2x0a0/VNmas1+ERGJPwmffIStdhXrUERERCRCbND6WIcQF/yB1FiHIKWchl1p2JWIlHINGzbk/vvvp3HjxlSvXp1evXqxa9cufv75Z84991xSU1OpXr065557Lj/++GP2604//XTuvPNO2rRpwxFHHEGnTp3YsGFDdvlrr71GgwYNqFmzJkOHDs1xzXnz5tG6dWuOPPJIateuzbXXXsuePXuAYBnd66+/nlq1alG1alVOPPFEli5dGp0fhoiIlGgJn3yIiMSD119/nSlTprBixQqWLVvGfffdR1ZWFr169eL7779n1apVVKpUiWuvvTbH60aNGsXLL7/MTz/9xJ49exg+fDgAX3zxBVdffTWvvfYaa9asYePGjTkSl7Jly/Loo4+yYcMG5s6dy/vvv8+IESMAmDp1KjNnzmTZsmVs2bKFN954g5o1a0bvhyEiIiWWkg8RkThw7bXXUq9ePWrUqMHtt9/O6NGjqVmzJhdffDGVK1fmiCOO4Pbbb+fDDz/M8bpevXrx+9//nkqVKnHppZeyePFiAMaOHcu5555Lu3btqFChAvfee2+OZXFbtWrFKaecQrly5WjYsCF9+/bNbjspKYlt27bx1Vdf4e6ccMIJ1K5dO2o/CxERKbmUfIiIxIF69eplP2/QoAFr1qxhx44d9O3blwYNGlC1alXatWvH5s2b2b9/f3bdo446Kvt55cqV2b59OwBr1qzJ0WaVKlVy9F4sW7aMc889l6OOOoqqVaty2223ZQ/Zat++Pddeey3XXHMNtWrVok+fPmzdujVi711EREqPhE8+tM+HiMSDH374Ifv5qlWrqFOnDg8//DBff/01n3zyCVu3bmXmzJlAMCfjcGrXrp2jzR07drBx48bs46uvvppGjRqxfPlytm7dyrBhw3K0+49//IMFCxbwxRdfsGzZMh566KHieJsiIlLKJXzyoQnnIhIPnn76aX788Uc2bdrE0KFD6datG9u2baNSpUoceeSRbNq0iSFDhhS4vUsuuYT//Oc/zJ49mz179nDXXXeRlZWVXb5t2zaqVq1KcnIyX331Ff/617+yyz799FM++eQT9u7dS5UqVahYsaJ2MhcREUDJh4hIXLjsssvo1KkTxxxzDMceeyx33HEHAwYMYOfOnaSkpHDKKafQpUuXArfXpEkTnn76aS677DJq165N9erV+d3vfpddPnz4cEaNGsURRxxB79696datW3bZ1q1b6d27N9WrV89eLWvgwIHF+n5FRKR0soJ0vyeCjIwMnz9/fqzDEJES6Msvv+SEE06IdRj5atiwIS+88AIdOnSIdSi/SX4/XzNb4O4ZBWhCv8jksLTPR/HQPh9SQJZfgXo+RERERCQhPf300zRr1oyqVatStWpVWrduzTvvvJNdfuedd9KoUSOqVKlC9erVOfPMM/noo49ytNG7d2+OPfZYKlWqRGpqKueffz5ffvlldvnSpUupWLEi48aNy/G6adOmkZSUxJw5cyL7JkuYhE8+NOFcREREJDH97ne/45///CcLFy5k/vz5tG/fngsuuIAlS5YAcPzxx/P000/z2WefMXv2bI4++mi6dOlCZmZmdhsZGRmMHDmSL7/8kilTpuDudOjQgb179wLQtGlThgwZwlVXXZX9ui1bttCrVy9uvPFG2rRpE/03HkMadhWiYVcikp+SPuyqtNOwK4kGDbsqHokw7KpGjRrcf//99O3b96CyrVu3Uq1aNd599106d+6c5+uXLFlC8+bN+eqrrzj++OMByMrKom3btqSkpPD222/To0cPFi9ezPz58ylfvnxE30+M5Dvsqlw0oxARERERKYn279/PmDFj2L59O6eeeupB5Xv27OG5556jatWqtGjRIs82fvnlF15++WXq169Pw4YNs8+XKVOGV155hebNm9O9e3fGjBnDvHnz4jXxOKSEH3YlIiIiIonrs88+Izk5mQoVKnDVVVfx1ltvceKJJ2aX/+c//yE5OZmKFSvy6KOP8t5775GWlpajjREjRpCcnExycjKTJ0/m/fffp0KFCjnqpKenM3DgQEaNGsWgQYPyTWDinZIPEREREUlYxx9/PIsXL+aTTz7h6quv5vLLL2fp0qXZ5WeccQaLFy/mo48+okuXLlx66aWsXbs2Rxvdu3dn0aJFfPjhh/z+97/nf/7nf9ixY0eOOjt37mT06NFUrlyZ2bNnF2jD13ik5ENEREREElb58uVJT0+nVatW3H///bRo0YJHH300u7xKlSqkp6dzyimn8OKLL5KUlMQLL7yQo41q1apx3HHH0a5dO8aOHcuyZcsOWt3qlltuYd++fcybN4/58+fz1FNPReX9lTRKPkREREREQrKysti9e/dvLnd33D1HnenTpzNixAhGjhxJkyZNePjhhxk0aBArVqwo1thLA004FxEREZGENGjQIM455xzq1avHtm3bGDVqFDNmzOCdd95h69atPPjgg3Tt2pXatWuzfv16nn76aX788UcuvfRSAL755hvGjRtHhw4dSE1N5ccff+SBBx6gQoUKnHvuuQBs27aNXr160b9/f9q2bQsEe4OMGzeOXr16MWPGDMqUSZz+gIRPPsysK9A1PT091qGISCkS6WU7E2E5SxGRWFu3bh1//etfWbduHdWqVaNZs2ZMnjyZzp07s2PHDj7//HNeeuklNm7cSM2aNTn55JOZOXMmzZo1A6BChQrMmDGDhx9+mM2bN5OWlka7du2YO3cuRx11FAADBgygcuXKDB06NMe1X3zxRZo2bcrjjz/O9ddfH/X3Hiva5yNE+3yISH7y2odCyUfx0T4fEg3a56N4JNK9SYok330+EqePR0QkTjVs2JDhw4fTrFkzqlWrRrdu3di1axcjR47ktNNOy1HXzPjmm28A6NmzJ/369eOss84iOTmZNm3asG7dOgYMGED16tVp1KgRixYtynGd+++/n8aNG1O9enV69erFrl27gGAH34kTJ2bX3bt3LykpKTleLyIiouRDRCQOvPHGG7z77rusXLmSJUuWMHLkyAK/7r777mPDhg1UqFCB1q1b07JlSzZs2MAll1zCDTfckKP+66+/zpQpU1ixYgXLli3jvvvuA6BHjx787//+b3a9SZMmUbt2bU466aRie48iIlL6KfkQEYkD//jHP6hTpw41atSga9euLF68uECvu/DCC2nVqhUVK1bkwgsvpGLFivTo0YOyZcvSrVu3g3ourr32WurVq0eNGjW4/fbbGT16NAB//etfmTRpElu3bgXgtdde429/+1uxvkcRESn9lHyIiMSBAxMbASpXrsz27dsL9LrwXXorVap00HHudurVq5f9vEGDBqxZswaAOnXq0KZNG8aNG8fmzZuZPHky3bt3/03vRURE4lfCr3YlIhKvqlSpkmOH3XXr1hW5zR9++CH7+apVq6hTp0728eWXX84LL7zAvn37aN26NXXr1i3y9UQksWmhgOJRkhYKUM+HiEicat68OZ9//jmLFy9m165d3H333UVu88Aa95s2bWLo0KF069Ytu+yCCy5g4cKFPP744/To0aPI1xIRkfgTt8mHmb1lZj+b2dhYxyIiEgu///3vueuuu+jQoQPHHXfcQStf/RaXXXYZnTp14phjjuHYY4/ljjvuyC6rVKkSF198MStXruSiiy4q8rVERCT+xO0+H2Z2OnAEcLm7X3K4+trnQ0Tyk98+FImmYcOGvPDCC3To0CHfOvfccw/Lli3LsfLV4WifD4kGDd8pHtEevqPPrXjEYNhV4u3z4e4zgG2xjkNEJFFs2rSJF198kT59+sQ6FBERKaGinnyYWTszm2Bmq83MzaxnHnX6mdlKM9tlZgvMrG204xQRkYJ7/vnnqVevHmeddRbt2rWLdTgiIlJCxWK1q2RgKfBq6JGDmXUDHgf6AbND/042s8buvipUZzF5x97J3ddEKG4RkYT23Xff5VvWu3dvevfuHb1gRESkVIp68uHuk4BJAGY2Mo8qNwAj3f350PF1ZtYFuBq4NdRGi+KIxcz6AH0A6tevXxxNioiIiIhIPkrUnA8zKw+0AqbmKpoKnFrc13P359w9w90zUlNLzvrHIlLyxOviHLGmn6uISGIpUckHkAKUBTJznc8Ejjq4ev7MbBowBjjbzH40s9b51OtqZs9t2bLlt8QrIgkgKSmJnTt3xjqMuLRz506SkpJiHYaIiERJSUs+io27d3D3VHev7O6/c/e5+dSb6O59qlWrFu0QRaSUqFWrFqtXr2bHjh36pr6YuDs7duxg9erV1KpVK9bhlCj3338/J598MlWrViU1NZWuXbuydOnSHHUyMzPp2bMnderUoXLlynTp0oXly5cf1Na8efPo2LEjycnJHHHEEZx66qls2LABgKVLl1KxYkXGjRuX4zXTpk0jKSmJOXPmRO5NikjCisWE80PZAOwH0nKdTwPWRT8cERGoWrUqAGvWrGHv3r0xjiZ+JCUlkZaWlv3zlcCMGTPo168fJ598Mu6evVHkF198QY0aNXB3LrjgAsqUKcP48eOpVq0ajzzySHadKlWqAPDJJ5/QuXNnBg4cyKOPPkr58uVZunRpdk9T06ZNGTJkCFdddRWnnXYaaWlpbNmyhV69enHjjTfSpk2bWP4YRCROxXSTQTPbDlzr7iPDzn0C/Nfd+4SdWwaMc/dbIxBDV6Brenp677y+NRIRkdjQJoOB7du3U61aNcaPH0/Xrl1ZtmwZxx9/PIsXL6Z58+YAZGVlcdRRRzFs2DCuvPJKAE499VTOOOMMhg4dmm/bWVlZtG3blpSUFN5++2169OjB4sWLmT9/PuXLl4/K+4sWbVZXPLTJYOmU0JsMmlmymbUwsxah69cPHR9YbuoRoKeZXWlmJ5jZ40Ad4JlIxKNhVyIiUpJt27aNrKwsqlevDsDu3bsBqFixYnadMmXKUKFCBWbPng3ATz/9xNy5c6lduzannXYatWrVom3btrz//vs52i5TpgyvvPIK06ZNo3v37vz73//m1VdfjbvEQ0RKjljM+cgAFoUelYAhoef3ALj7/wEDgDuAxcBpwNnu/n0kgtGEcxERKcn69+9PixYtaN06WDelUaNG1K9fn9tuu41NmzaxZ88e/vnPf/Ljjz+ydu1aAL799lsABg8ezBVXXMGUKVNo27YtnTt35r///W+O9tPT0xk4cCCjRo1i0KBBtGjRIqrvT0QSS9STD3ef4e6Wx6NnWJ0R7t7Q3Su4eyt3nxnBeNTzISIiJdINN9zA7NmzGTduHGXLlgWCuTJvvvkmK1asoGbNmlSuXJnp06dz1llnUaZM8Gs9KysLgL59+3LFFVdw0kknMWzYME4++WSeeSbnQIKdO3cyevRoKleuzOzZs7WogohEVNyudiUiIlKaXX/99YwePZoPPviAY445JkdZq1atWLx4MZs3b2bt2rW8++67bNy4Mbte7dq1AWjcuHGO1zVu3JhVq1blOHfLLbewb98+5s2bx/z583nqqaci+K5EJNElfPKhYVciIlLS9O/fPzvxaNSoUb71qlWrRmpqKsuXL2f+/Pmcf/75ADRs2JA6derw9ddf56i/bNkyGjRokH08ffp0RowYwciRI2nSpAkPP/wwgwYNYsWKFZF5YyKS8BI++dCwKxERKUmuueYaXn75ZUaNGkX16tVZt24d69atY/v27dl1xowZw/Tp0/n22295++236dixIxdccAGdOnUCwMwYOHAgTzzxBGPGjOGbb75h2LBhfPzxx/Tt2xcIJrL36tWL/v3707ZtWwB69+5N27Zt6dWrV/bQLRGR4lTS9vkQERFJaCNGjADgzDPPzHF+8ODB3H333QCsXbuWG264gczMTGrXrk2PHj248847c9QfMGAAu3fv5sYbb2Tjxo00adKEyZMnZy/PO2DAACpXrnzQUrwvvvgiTZs25fHHH+f666+P0LsUkUQV030+SpKMjAyfP39+rMMQEZEQ7fMhxUn7RRQP7fNROiX0Ph8ljeZ8iIiIiIhER8InH5rzISIiIiISHQmffIiIiIiISHQo+RARERERkahI+NWuzKwr0DU9PT3WoYiISCmgCbDFIwYTYEWkBEj4ng/N+RARERERiY6ETz5ERERERCQ6lHyIiIiIiEhUKPkQEREREZGoSPjkQ5sMioiIiIhER8InH5pwLiIiIiISHQmffIiIiIiISHQo+RARERERkahQ8iEiIiIiIlGR8Duci4hI4tq5cycrVqwA4Nhjj6VSpUoxjkhEJL6p50NERBLO7t27GTBgADVq1KB58+Y0a9aMGjVq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Ug58aGafmln3IgcuIiIiIiJFFu1hV8nAUuDV0CMHM+sGPA70A2aH/p1sZo3dfVWozmLyjruTu68JPT/N3VebWW1gmpl95u5Liv3diIiIiIhIgUU1+XD3ScAkADMbmUeVG4CR7v586Pg6M+sCXA3cGmqjRQGuszr071ozmwS0BJR8iIiIiIjEUImZ82Fm5YFWwNRcRVOBUwvRThUzOyL0PBloD3yeT90+ZjbfzOavX7/+twUuIiIiIiIFUmKSDyAFKAtk5jqfCRxViHbSgNlm9l/gY+BVd/80r4ru/py7Z7h7Rmpq6m+JWURERERECijultp192+B5gWtb2Zdga7p6emRC0pEREREREpUz8cGYD9Bz0W4NGBdpC7q7hPdvU+1atUidQkREREREaEEJR/uvgdYAHTMVdQR+ChS1zWzrmb23JYtWyJ1CRERERERIfr7fCSbWQszaxG6dv3Qcf1QlUeAnmZ2pZmdYGaPA3WAZyIVk3o+RERERESiI9o9HxnAotCjEjAk9PweAHf/P2AAcAewGDgNONvdv49UQOr5EBERERGJjqgmH+4+w90tj0fPsDoj3L2hu1dw91buPjPCMannQ0REREQkCkrMnA8REREREYlvcbfUbmFpqV0RKQlsUMnf6NQf0H5IIiJSNAmffLj7RGBiRkZG71jHUtLoj6HSSZ+biIiIlFQadiUiIiIiIlGh5ENERERERKIi4ZMPLbUrIiIiIhIdCZ98aKldEREREZHoSPjkQ0REREREokPJh4iIiIiIREXCJx+a8yEiIiIiEh0Jn3xozoeIiIiISHQkfPIhIiIiIiLRoeRDRERERESiQsmHiIiIiIhEhZIPERERERGJioRPPrTalYiIiIhIdCR88qHVrkREREREoiPhkw8REREREYkOJR8iIiIiIhIVSj5ERERERCQqlHyIiIiIiEhUKPkQEREREZGoSPjkQ0vtioiIiIhER8InH1pqV0REREQkOhI++RARERERkehQ8iEiIiIiIlGh5ENERERERKJCyYeIiIiIiESFkg8REREREYkKJR8iIiIiIhIVcZl8mNnRZjbdzL4ws8/MrEqsYxIRERERSXTlYh1AhIwE7nD3WWZWA9gd43hERERERBJe3CUfZtYE2OvuswDcfVOMQxIREREREaI87MrM2pnZBDNbbWZuZj3zqNPPzFaa2S4zW2Bm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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import OrdinalDayOfWeek\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [OrdinalDayOfWeek(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OrdinalDayOfWeek\")" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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UaNG1KlTh9tuu43XXnuNY489liuuuIKqVatyzDHHcNttt/HRRx/luq5Pnz784he/oEqVKlx11VUsXrwYgIkTJ3LxxRfTsWNHKlWqxF133ZWrT3KbNm04++yzqVChAk2aNKF///45dSclJbFt2za++uor3J3TTjst12wxIiKSuJR8iIjEgUaNGuW8bty4MevWrWPnzp3079+fxo0bU6NGDTp27MjmzZs5cOBATtl69erlvK5atSrbt28HYN26dbnqrFatWq7Wi+XLl3PxxRdTr149atSowa233prTZatz585cf/31/PnPfyY1NZV+/fqxdevWqL13EREpOxI++TCz7mb2zJYtW2IdiojIUfv+++9zXq9Zs4YGDRrw4IMP8vXXX/Ppp5+ydetWZs2aBVCoha3q16+fq86dO3fy888/5+wPGDCAU089lW+++YatW7dyzz335Kr3L3/5CxkZGXzxxRcsX76cBx54oCTepoiIlHEJP9uVu08GJqenp/eNdSwiIkfrySef5OKLL86ZUaVHjx5s27aNKlWqUKtWLTZu3MioUaMKXd+VV17JWWedxZw5czjzzDO54447yM7Ozjm/bds2atSoQfXq1fnqq6/4xz/+QUpKaBaczz77jOzsbFq3bk21atWoXLlyQk0jKSIlR7OUlYzSNEuZfhuIiMSBq6++mm7dunHiiSdy0kknMWLECAYPHsyuXbtITk7m7LPP5oILLih0faeffjpPPvkkV199NfXr16d27docd9xxOefHjBnDq6++yjHHHEPfvn3p0aNHzrmtW7fSt29fateunTNb1tChQ0v0/YqISNlkhWl+TwTp6em+YMGCWIchIqXQl19+yWmnnRbrMArUpEkTnnvuObp06RLrUI5KQT9fM8tw9/RCVKFfZHJE+ga9ZAT9Dbo+t5IRg5YPK+iEWj5ERERERCQQCZ98aMC5iIiIiEgwNOBcA85FpIxbtWpVrEMQEREplIRv+RARERERkWAo+RARERERkUAo+RARESlFnnzySZo3b06NGjWoUaMGbdu25d133805/+abb3L++eeTkpKCmTFz5sx865k/fz5du3alevXqHHPMMbRr1y5nFfply5ZRuXJl3njjjVzXTJ8+naSkJObOnRu19yciiU3Jh4iISCly3HHH8fe//52FCxeyYMECOnfuzKWXXsqSJUsA2LFjB+3ateOhhx4qsI5PP/2Ubt260alTJz755BMyMjIYMmQISUlJADRr1oxRo0Zx3XXXkZmZCcCWLVvo06cPN998M+3bt4/+GxWRhKR1PsK0zoeIFKS0r/NR1mmdjyOrU6cO9957L/379885lpWVRUpKCjNmzKBTp065yrdr145zzz2X0aNHF1hndnY2HTp0IDk5mXfeeYeePXuyePFiFixYQMWKFaP1VmJG60WUDK3zUTZpnQ8RERE5ogMHDvCvf/2L7du3065du0Jds2HDBubNm0f9+vU555xzSE1NpUOHDnzwwQe5ypUrV46XXnqJ6dOnc8011/Cvf/2Ll19+OS4TDxEpPRJ+ql0z6w50T0tLi3UoIlKGRPvbuBh8SyWlyNKlS2nbti27d++mevXqvPXWW5xxxhmFuva7774DYOTIkTzwwAO0atWKCRMmcP7555ORkUGLFi1yyqalpTF06FBGjRrF7bffTsuWLaPxdkREciR8y4e7T3b3fjVr1ox1KCIiIgCccsopLF68mE8//ZQBAwbQq1cvli1bVqhrs7OzAejfvz9//OMfadWqFffccw+//OUveeqpp3KV3bVrF6+99hpVq1Zlzpw5qCu2iERbwicfIiJlXZMmTRgzZgzNmzenZs2a9OjRg927dzNu3DjOOeecXGXNjG+//RaA3r17M3DgQC688EKqV69O+/btWb9+PYMHD6Z27dqceuqpLFq0KNd97r33Xpo2bUrt2rXp06cPu3fvBkIDmCdPnpxTdt++fSQnJ+e6XgqvYsWKpKWl0aZNG+69915atmzJww8/XKhr69evD0DTpk1zHW/atClr1qzJdWzYsGHs37+f+fPns2DBAp544omSeQMiIgVQ8iEiEgdef/11/vOf/7By5UqWLFnCuHHjCn3d3XffTVZWFpUqVaJt27a0bt2arKwsrrzySm666aZc5V955RXee+89VqxYwfLly7n77rsB6NmzJ//85z9zyk2ZMoX69evTqlWrEnuPiSw7O5s9e/YUqmyTJk1o0KABX3/9da7jy5cvp3Hjxjn7M2bMYOzYsYwbN47TTz+dBx98kOHDh7NixYoSjV1EJJKSDxGROPCXv/yFBg0aUKdOHbp3787ixYsLdd1ll11GmzZtqFy5MpdddhmVK1emZ8+elC9fnh49ehzScnH99dfTqFEj6tSpw2233cZrr70GwO9/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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import OrdinalDayOfMonth\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [OrdinalDayOfMonth(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OrdinalDayOfMonth\")" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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+i5MqrP58+dz9NFHM3/+fNq3b0/v3r154IEH2H///cvL/PWvf+WLL75gxIgRNdazpjITJkzggQce4KWXXqJZs2blx3/xi19w3333MWrUKO677776vTGpnjXYdT7yJSKGAENKSkpGvvmms9RJWt28efOICLp06UKLFi1q/MZStZdSYtmyZZSVlZFSYvPNV18rNiJmpJRKa1Nd/UcoSVoPNf5DWfRfNdntStLafPHFF/To0YOWLVuaeNSTiKBly5b06NGDL774otDhSJLypOiTD0mqDbsF5Ya/V0kqLkX/1He2K0mSJCk/ij75sNuVJNVOr169ePjhhwsdhiSpEWtos11JUqPw7ICtc1r/btPezmn9kiQVQtEnHxVmuyp0KJIkKUfi9I8LHUKTkC7qVOgQ1MjZ7cpuV5IauV69enHhhRey4447summmzJixAiWLl3KJ598wsEHH0ynTp3YdNNNOfjgg3nvvffK37f33nvz61//mj322IONN96YwYMHs2DBgvLzEyZMYIsttmCzzTbj/PPPr3TN559/nv79+7PJJpvQrVs3TjjhBL7++msgM43uz372Mzp37ky7du3YZZddePnll/Pzy5AkNWhFn3xIUlNwyy238OCDD/L222/zxhtvcN5557Fy5UpGjBjBO++8w7x582jVqhUnnHBCpffdeuut3HjjjXz00Ud8/fXXjBs3DoBXX32V0aNHM2HCBD744AP+/e9/V0pcmjVrxmWXXcaCBQt45plneOSRR7j66qsBmDJlCtOmTeONN95g0aJF3H777Wy22Wb5+2VIkhoskw9JagJOOOEEevbsSYcOHTjzzDO57bbb2GyzzTjiiCNo3bo1G2+8MWeeeSaPP/54pfeNGDGCbbfdllatWvH973+fmTNnAnDnnXdy8MEHM2DAADbccEPOPffcStPi9uvXj912243mzZvTq1cvjj/++PK6W7RowWeffcbrr79OSokddtiBbt265e13IUlquEw+JKkJ6NmzZ/nrLbbYgg8++IAvv/yS448/ni222IJ27doxYMAAPv30U1asWFFetmvXruWvW7duzeeffw7ABx98UKnONm3aVGq9eOONNzj44IPp2rUr7dq141e/+lV5l62BAwdywgkn8JOf/ITOnTszatQoFi9enLN7lyQ1HkWffLjOh6Sm4N133y1/PW/ePLp3784ll1zCP//5T5577jkWL17MtGnTgMyYjLXp1q1bpTq//PJL/v3vf5fvjx49mu23354333yTxYsXc8EFF1Sq96c//SkzZszg1Vdf5Y033uDiiy+uj9uUJDVyRZ98OOBcUlNw1VVX8d5777Fw4ULOP/98hg4dymeffUarVq3YZJNNWLhwIeecc06t6zvyyCP529/+xpNPPsnXX3/N2WefzcqVK8vPf/bZZ7Rr1462bdvy+uuv88c//rH83AsvvMBzzz3HsmXLaNOmDRtttJErmUuSAJMPSWoSfvCDHzB48GC22mortt56a8466yxOPvlklixZQseOHdltt9347ne/W+v6dtppJ6666ip+8IMf0K1bNzbddFO+8Y1vlJ8fN24ct956KxtvvDEjR45k6NCh5ecWL17MyJEj2XTTTctny/rFL35Rr/crSWqcojbN78WgtLQ0TZ8+vdBhSGqAXnvtNXbYYYdCh1GjXr16cd111zFo0KBCh7JOavr9RsSMlFJpLarwHzKtlet81A/X+VAtRU0nbPmQJElSUbrqqqvo3bs37dq1o127dvTv35/777+/2rLHH388EVE+JfkqX331FSeeeCIdO3akTZs2HHLIIZWmJp8yZQotWrTgueeeq/S+6667jrZt2/L222/X/401YEWffDjgXJIkqTh94xvf4He/+x0vvvgi06dPZ+DAgXzve99j1qxZlcrdeeedPP/883Tv3n21Ok4++WTuuusubrvtNp544gkWL17MwQcfXD6z4ODBgznuuOMYNmwYS5YsAWDu3LmccsopjBs3jq233jr3N9qAFH3y4YBzSY3d3LlzG22XK0kqpEMPPZQDDjiAkpIStt12W84//3w23nhjnnnmmfIy77zzDieddBK33norLVq0qPT+RYsWcf3113PxxRez33770bdvXyZMmMCsWbN4+OGHy8uNGzeO5cuXc/rpp5NSYvjw4ey+++78+Mc/ztu9NhTNCx2AJEmSVGgrVqzgjjvu4PPPP2f33XcHYPny5fzP//wPZ511VrVj02bMmMGyZcsYPHhw+bGePXuyww478PTTT7P//vsDmbWSxo8fz957783HH3/MP/7xD15++eX83FgDY/IhSZKkojV79mz69+/P0qVLadu2Lffccw+77LILAGPHjqVjx46MHj262vfOnz+fZs2a0bFjx0rHu3Tpwvz58ysd23PPPTn66KO56aabuP766+nRo0dubqiBM/mQJElS0dpuu+2YOXMmixYt4s4772TYsGFMnTqVBQsWMH78eGbOnFkv1ykrK+P++++ndevWTJs2jR/+8If1Um9jU/RjPiRJklS8WrZsSUlJCf369ePCCy+kT58+XHbZZUydOpUPP/yQbt260bx5c5o3b84777zDaaedVr7uUdeuXVmxYgULFiyoVGdZWRldu3atdGzUqFFss802PPzww/zlL39h0qRJebvHhsTkQ5IkScpauXIlX331FWPGjGHWrFnMnDmzfOvevTs/+9nPeOSRRwDo168fLVq04KGHHip//3vvvcdrr71WPm4EYPz48Tz88MPcdNNN9O/fn9NOO43jjz+ehQsX5v3+Cs1uV5IkSSpKp59+OgcddBA9e/bks88+49Zbb2Xq1Kncf//9dO7cmc6dO1cq36JFC7p27cp2220HQPv27fnRj37EL3/5Szp37sxmm23GKaecQu/evctnIXz33Xc56aSTuOiii9hmm22AzFiSSZMmceKJJ3LLLbfk96YLrOiTj4gYAgwpKSkpdCiSGpFcr5bsKsKSlHvz58/n6KOPZv78+bRv357evXvzwAMPlM9SVRuXX345zZs3Z+jQoSxZsoR9992Xm2++mWbNmpFS4oc//CGlpaWccMIJ5e9p2bIlN998M9/61rc48sgjOeyww3Jxew1SpJQKHUODUFpamqZPn17oMCQ1QK+99tpqUyyafNSf6n6/ABExI6VUWosq/IdMa5Xr/2eLRTE9m7ReoqYTjvmQpEauV69ejBs3jt69e9O+fXuGDh3K0qVLGT9+PHvuuWelshHBW2+9BcDw4cMZM2YMBxxwAG3btmWPPfZg/vz5nHzyyWy66aZsv/32vPTSS5Wuc+GFF7Ljjjuy6aabMmLECJYuXQrAzjvvXGnw5LJly+jYsWOl90uSZPIhSU3A7bffzt///nfmzJnDrFmzGD9+fK3fd95557FgwQI23HBD+vfvT9++fVmwYAFHHnkkp5xySqXyt9xyCw8++CBvv/02b7zxBueddx4Axx57LH/5y1/Ky02ePJlu3bqx66671ts9SpIaP5MPSWoCfvrTn9K9e3c6dOjAkCFDaj0v/WGHHUa/fv3YaKONOOyww9hoo4049thjadasGUOHDl2t5eKEE06gZ8+edOjQgTPPPJPbbrsNgKOPPprJkyezePFiACZMmMAxxxxTr/coSWr8TD4kqQmoOJ9869at+fzzz2v1vi5dupS/btWq1Wr7Vevp2bNn+estttiCDz74AIDu3buzxx57cNddd/Hpp5/ywAMPcNRRR63TvUiSmi6TD0lqotq0acOXX35Zvj9//vz1rvPdd98tfz1v3jy6d+9evj9s2DD+8pe/cMcdd9C/f3969Oix3tcrRldddRW9e/emXbt2tGvXjv79+3P//feXn7/77rvZf//96dSpExHB1KlTK71/7ty5RES128UXXwxk/lvo2LEjl1xySaX3vvLKK2y00Ub83//9X87vU1JxKvqpdiWpqfrmN7/JK6+8wsyZM9l+++35zW9+s951XnXVVRx88MG0bt2a888/n6FDh5af+973vseYMWMoKyvjl7/85Xpfq1h94xvf4He/+x3bbLMNK1eu5KabbuJ73/seM2bMoHfv3nzxxRfsvvvuHH300Rx77LGrvb9nz558+OGHlY7dc889/OQnP+HII48EMi1lV111FcOHD+eAAw5gxx13ZNmyZRx77LF873vf47//+7/zcq/S2jhLWf1oSLOUNdmWj4i4JyI+iYg7Cx2LJBXCtttuy9lnn82gQYPYZpttVpv5al384Ac/YPDgwWy11VZsvfXWnHXWWeXnWrVqxRFHHMGcOXM4/PDD1/taxerQQw/lgAMOoKSkhG233Zbzzz+fjTfemGeeeQaAY445hrFjx3LAAQdU+/5mzZrRtWvXStvdd9/NoEGD2HLLLcvLDR06lEMPPZRjjz2W5cuXc+655/Lhhx9y9dVX5+U+JRWnptzycQVwAzCs0IFIanoa0rdIc+fOrbRfsYXjzDPP5MwzzyzfP/roo8tfV50R67jjjuO4444r3y8pKWH58uWVyvzXf/0XZ5xxRo2xbL755hx22GG0bdu2DnegmqxYsYI77riDzz//nN13332d6vjXv/7FI488wu23377auauvvpqddtqJo446irvvvpv77ruPDh06rG/YklSjJpt8pJSmRsTehY5DkorFwoULuf7665kwYUKhQ2n0Zs+eTf/+/Vm6dClt27blnnvuYZdddlmnuq677jo6derEoYceutq5Dh06cOGFFzJixAiOOeYYDjzwwPUNXZLWKO/driJiQERMjIj3IyJFxPBqyoyJiDkRsTQiZkTEXvmOU5JU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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import OrdinalMonthOfYear\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [OrdinalMonthOfYear(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"OrdinalMonthOfYear\")" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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tgdezZb7e0QcAdweEXsCvyWTzFR4r1RX1ankY20iYiNgd2BEpVOPA3tlX78I7BgRHckMOD8YuHgtdQ4GBgM0b9589+222662w5YkraPJkyfPSymVVKNow5k5RfXW8OHDufLKK+nQoUNq0qQJe+yxB5dddhnbbLPNamW/+uorWrRowfDhw2Et/34nTJhAjx49+PDDD6eWP/7pp5/StWtXevbsueyBBx7goYce4pBDDnFyHdUlsaYT9Sb5ANoAGwCllY6XAr0AUkrLs/0gx5LpUnbl2ma6SindCNwI0L179zRp0qRcxC1JWgcR8X6hY5Cqa4899mD06NFst912zJ07l0suuYS99tqL1157jdatW1coe9ddd7F06VKOP/74Nda3dOlSzjzzTPr27cu3vvWtCuc233xzLr/8cgYOHMixxx7LIYcckpN7knKhPiUf1ZJSGgOMqW75iOgL9O3SpUvugpIkSQ3awQcfXGF/zz33ZJtttuG2227jjDPOqHBu1KhRHH744ZSUVN2wt3z5cn7605/y+eefM2bM6r/SrFy5kltvvZVmzZrx0ksvsWTJEjbeeOPauxkph+ragPO1mQesANpVOt4OqLJ/ZXWklB5OKQ3ebLPN1ic2SZKkMi1atKBr1668/fbbFY5PmTKFSZMmMWjQoCrft3z5cn784x8zdepUnnrqqdVaTQCuueYaXn31VV566SW++uorhg0blpN7kHKh3iQfKaWlZBYNrDygqjeZWa/WSUT0jYgbFyxYsD7hSZIklVmyZAlvvvkm7du3r3D8xhtvZOutt6ZXr16rvWfZsmX079+fqVOnMnbsWLbYYovVyrzxxhsMGzaMP/3pT+ywww7cfPPNXHvttYwfPz5n9yLVpjqVfEREi4jYJSJ2IRPbVtn9VVPpXg0MiIgTImL7iLiWzNoeN6zrNW35kCRJ6+uss87i2WefZebMmbzwwgv069ePhQsXVhjXsWjRIu68805+/vOfE1FxPO7y5cv50Y9+xMSJE/nb3/5GRDBnzhzmzJnD4sWLy8ocf/zx/O///i/HHHMMAH369OGEE05g4MCBLFq0KH83LK2jujbmozuZweKrXJjdbgMGZKeXaw2cR2ZauWnAISklByVKypmVK1cyb948Pv/8c1asWFHocBqMDTbYgJYtW9KmTRsaNapTfwuTauyjjz7ixz/+MfPmzaOkpIQ999yTiRMn0qlTp7Iyf//731m4cCEDBw6s8v0PPfQQALvvvnuFc7feeisDBgzg8ssv5/333+ef//xnhfMjRoygW7dunHPOOVx77bU5uDup9kRKxT1DYbkB54Mq98uUJIAPPviAiKBdu3Y0btx4tb9YquZSSixbtozS0lJSSmy11eprxUbE5JRS9+pUV/sRSpLWwxp/UBb9n5rsdiXpmyxcuJCOHTuy0UYbmXjUkohgo402omPHjixcuLDQ4UiS8qTokw9Jqg67BeWG31dJKi5F/9R3titJkiQpP4o++bDblSRVT+fOnXnyyScLHYYkqR6ra7NdSVK9MLHntjmtf8/nZuS0fkmSCqHok49ys10VOhRJkpQj8ZtPCh1Cg5CuKCl0CKrn7HZltytJ9Vznzp25/PLL2WGHHWjVqhUDBw5kyZIlfPbZZxx66KGUlJTQqlUrDj30UD766KOy9+2333789re/Ze+992aTTTahT58+zJs3r+z8HXfcQadOnWjdujWXXnpphWu++OKL9OjRg5YtW9K+fXtOPvlkli5dCmSm0T399NNp27Ytm266KTvttBPTpk3LzzdDklSnFX3yIUkNwZ133sljjz3GjBkzmD59OpdccgkrV65k4MCBvP/++3zwwQc0bdqUk08+ucL77rrrLm699Vbmzp3L0qVLGTFiBACvv/46J510EnfccQezZ8/m008/rZC4bLDBBvzhD39g3rx5TJgwgaeeeoqRI0cC8Pjjj/Pcc88xffp0FixYwD333EPr1q3z982QJNVZJh+S1ACcfPLJbLnllmy++eYMGzaMv/3tb7Ru3ZqjjjqKZs2asckmmzBs2DCeffbZCu8bOHAg3/nOd2jatClHH300U6ZMAeC+++7j0EMPpWfPnjRp0oSLL764wrS4u+++O3vuuScbbrghnTt35sQTTyyru3Hjxnz55Ze8+eabpJTYfvvtad++fd6+F5KkusvkQ5IagC233LLsdadOnZg9ezaLFi3ixBNPpFOnTmy66ab07NmTzz//nBUrVpSV3WKLLcpeN2vWjK+++gqA2bNnV6izefPmFVovpk+fzqGHHsoWW2zBpptuyrnnnlvWZeuAAw7g5JNP5pe//CVt27Zl8ODBfPHFFzm7d0lS/VH0yYfrfEhqCD788MOy1x988AEdOnTgqquu4q233uKFF17giy++4LnnngMyYzK+Sfv27SvUuWjRIj799NOy/ZNOOontttuOt99+my+++ILLLrusQr2/+tWvmDx5Mq+//jrTp0/n97//fW3cpiSpniv65MMB55Iaguuvv56PPvqI+fPnc+mll9K/f3++/PJLmjZtSsuWLZk/fz4XXnhhtevr168f//jHPxg3bhxLly7l/PPPZ+XKlWXnv/zySzbddFNatGjBm2++yZ///Oeycy+99BIvvPACy5Yto3nz5my88cauZC5JAkw+JKlB+MlPfkKfPn3YZptt2HbbbTnvvPM47bTTWLx4MW3atGHPPffkoIMOqnZ9Xbt25frrr+cnP/kJ7du3p1WrVnzrW98qOz9ixAjuuusuNtlkEwYNGkT//v3Lzn3xxRcMGjSIVq1alc2WNXTo0Fq934bsggsuICIqbOW7xz3wwAMceOCBlJSUEBE888wzq9UxY8YMjjjiCEpKSth00005+uijKS0tLTs/bdo0Nt54Y+6///4K73vyySdp3Lgx48ePz9n9SSpuUZ3m92LQvXv3NGnSpEKHIakOeuONN9h+++0LHcYade7cmZtuuolevXoVOpR1sqbvb0RMTil1r0YVDeoH2QUXXMDdd99dIanYYIMNKCnJrK9wxx138O6777LNNttw3HHHMXbsWPbbb7+ysgsXLqRbt27stNNOXHzxxQD89re/Zfbs2UycOLGsFep3v/sdI0aMYNq0abRr144FCxaw4447cswxx3DFFVfk7X7zxXU+aofrfKiaYk0nin6RQUmS6poNN9ywQmtHecceeyxAhTVZyhs/fjwzZ85k0qRJtGrVCoDbbruNVq1a8fTTT5clqUOHDmXMmDEMHjyYhx56iFNOOYVWrVpx0UUX5eCOJCmj6LtdOeBcklTXvPvuu3To0IGtt96a//f//h/vvvtutd/79ddfExFsvPHGZcdWjbsZN25c2bFGjRpx22238eSTT3LMMcdw9913c/vtt7PRRhvV6r1IUnlFn3w44FxSfffee+/V2y5XWt0ee+zB6NGj+de//sWoUaOYM2cOe+21V4XZxtZmzz33pEWLFgwdOpSFCxeycOFCzjrrLFasWMHHH39coWyXLl0YOnQod911F7/5zW/YZZddcnBHkvRfRZ98SJJUlxx88MEcffTRdOvWjV69evGPf/yDlStXctttt1Xr/SUlJdx77708+uijbLLJJmy22WZ8/vnn7LbbbqvNOrZ48WL+9re/0axZM8aNG1etaZglaX2YfEiSVIe1aNGCrl278vbbb1f7PX369GHGjBnMnTuXefPmcccddzBr1iy22WabCuXOPvtsli9fzosvvsikSZO47rrrajt8SarA5EOSpDpsyZIlvPnmm7Rv377G723Tpg0tW7bk6aefZu7cuRx22GFl58aOHcvIkSMZPXo0Xbt25aqrruI3v/kNM2bMqM3wJakCkw9JkuqQs846i2effZaZM2fywgsv0K9fPxYuXMjxxx8PwPz585kyZQrTpk0D4J133mHKlCnMmTOnrI5bb72VCRMmMGPGDP7617/yox/9iNNPP53vfve7QGaRyIEDB3Lqqaey7777AjBo0CD23XdfBg4cWGFBSUmqTSYfkiTVIR999BE//vGP+e53v8uRRx5JkyZNmDhxIp06dQJgzJgx7Lrrruy///5AJmnYddddueGGG8rqeOuttzjiiCPYfvvtueiiixg2bBgjRowoO3/aaafRrFkzLr300grXvvnmm3n11Ve59tpr83CnkoqRyYckSXXI3XffzezZs1m6dCmzZs3i/vvvZ4cddig7P2DAAFJKq20XXHBBWZkrrriCOXPmsHTpUqZPn84ZZ5xBxH/X/Lr55pt5/fXXK0zHC9CxY0c+++wzTj/99Jzfp1QXXX755UQEJ598ctmx0tJSBgwYQIcOHWjWrBkHHXRQlWOwXnzxRXr37k2LFi3YZJNN2GuvvcrW45k2bRobb7wx999/f4X3PPnkkzRu3Jjx48fn9sbqkKJfZDAi+gJ9u3TpUuhQJNUjuV4t2VWEJSm/Jk6cyI033ki3bt3KjqWU+OEPf0ijRo148MEH2Wyzzbj66qvp1asXr7/+Os2bNwfghRde4MADD2To0KH84Q9/YKONNmLatGk0btwYgB133JELL7yQX/ziF+yzzz60a9eOBQsWMHDgQM4880z23nvvgtxzIRR9y4frfEiSJBW3BQsWcMwxx3DLLbfQqlWrsuNvv/02EydOZOTIkXz/+9/nu9/9Ln/+85/Lpqle5fTTT+eXv/wlw4YNY8cdd+Q73/kORx55JOV/vxw6dCjf+c53GDx4MACnnHIKrVq14qKLLsrfjdYBRZ98SFJ917lzZ0aMGEG3bt3YbLPN6N+/P0uWLGH06NHss88+FcpGBO+88w6Q6b4zZMgQDj74YFq0aMHee+/NnDlzOO2002jVqhXbbbcdr7zySoXrXH755eywww60atWKgQMHsmTJEiDzV72HH364rOyyZcto06ZNhfdLUl01ePBg+vXrVzaWapWvv/4aoEIXxUaNGtGkSRPGjRsHwNy5c5kwYQLt27dnn332oW3btuy777489dRTFepq1KgRt912G08++STHHHMMd999N7fffjsbbbRRju+ubjH5kKQG4J577uFf//oXM2fOZOrUqYwePbra77vkkkuYN28eTZo0oUePHuy2227MmzePfv36ccYZZ1Qof+edd/LYY48xY8YMpk+fziWXXALAcccdx1//+teyco888gjt27dn1113rbV7lKRcGDVqFO+8807Z86y87bbbjq222opzzz2X+fPns3TpUn73u9/x0Ucf8fHHHwPw7rvvAjB8+HB+9rOf8dhjj7Hvvvty4IEH8p///KdCfV26dGHo0KHcdddd/OY3v2GXXXbJ+f3VNSYfktQA/OpXv6JDhw5svvnm9O3blylTplTrfUcccQS77747G2+8MUcccQQbb7wxxx13HBtssAH9+/dfreXi5JNPZsstt2TzzTdn2LBhZd0OfvrTn/LII4/wxRdfAHDHHXdw7LHH1uo9SlJte+uttzj33HO56667ysZnlNe4cWMeeOABZsyYQevWrWnWrBljx47l4IMPplGjzK/Rq6amPvHEE/nZz37GrrvuymWXXcb3vve9CrPQAWXdtZo1a8a4ceNIKeX+JuuYoh9wLkkNwRZbbFH2ulmzZsyePbta72vXrl3Z66ZNm662/9VXX1Uov+WWW5a97tSpU9l1OnTowN57783999/PEUccwaOPPtpgp2vN9WQDxcJJFVQXTJgwgXnz5tG1a9eyYytWrOC5557jhhtuYOHChey+++5MmTKFBQsWsHTpUkpKSthjjz3o3r07QNkCoOVnpVu1/8EHH1Q4dvbZZ7N8+XJefPFFevTowXXXXccpp5yS47usW0w+JKmBat68OYsWLSrbL78I3br68MMPy15/8MEHdOjQoWz/+OOP56abbmL58uX06NGDjh07rvf1JCmXfvjDH5YlEasMHDiQb3/725x77rkVxmOsGjz+9ttvM2nSJC6++GIgMx6uQ4cOvPXWWxXqmT59OjvttFPZ/tixYxk5ciRjx46la9euXHXVVZx2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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import CyclicMinuteOfHour\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [CyclicMinuteOfHour(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CyclicMinuteOfHour\")" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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wLCU0osppbfJ/O3SBPhZmffvAVybUnohpfR+SukK4CMy3cpX+QMwA7gxu38N8BlwXu3dllRzGuY7gKqKiI2BnsCocqceIfM/K8CLwA4R0ZHMgPODgAvXUudQYChAs2bNem633XY1HbYkaT1NnTp1fkqpTRWKFs7MKaq3RowYweWXX06HDh1S48aN2W233bjkkkvYZpttmDZtGjvttBNvvfXWq6vKp5TYaqut2H///UcDowEOOOAAIuKWBQsW3NKyZUvGjx9PkyZNePbZZ/9AJukgpcS7777LzjvvzFFHHZUaNWrEiy++SI8ePb7Oy41LFYvKTtSb5ANoDTQASsodLwH6AqSUVkTE6cBEMq06l69tpquU0o1kvzno1atXmjJlSm3ELUlaDxHxYb5jkKpqt912Y8yYMWy33XbMmzePiy66iD322IPXX3+d7bbbjk6dOvG73/2O0aNH07x5c/74xz8ye/ZsPvnkk9I67rrrLv73f/+X1q1b07BhQxo3bsydd95Jjx49VrtW165dOfPMMxk5ciS///3v1zgv1WX1KfmokpTSOGBcVctHxABgQNeuXWsvKEmSVNAOOuig1fZ79+7NNttsw2233cZpp53Gfffdxy9+8QtatWpFgwYN6Nu3LwcddBBllzw499xzmT9/Po899hitW7fm/vvv55hjjmHSpEnsvPPOpeWWLl3KnXfeSdOmTXnmmWdIKZEZViLVfXVqzMc6zAe+BdqVO94OmLtm8apJKY1PKQ1t0aLFhsQmSZJUqnnz5nTv3p133nkHgJ49e/Lqq6+yaNEiPvnkEx566CEWLFjANttsA8B7773HNddcw+jRo9l///3ZeeedGTFiBD/4wQ+45pprVqv7rLPOYsWKFbz44otMmTKFP//5zzm/P2l91ZvkI6X0DZlFA/uVO9WPzKxX6yUiBkTEjYsXL96Q8CRJkkotW7aMt956i/bt2692vEWLFrRp04Z33nmHKVOmcOihhwKwZMkSABo0aLBa+QYNGrBy5X/m4Jk4cSLXXXcdY8aMoXv37lxxxRWcffbZvPfee7V8R1LNqFMrnEdEc2BV/6dngcvIdKFamFKalZ1qdywwDJgM/BL4BdA9pbRBfYMd8yFJdUtETE0p9apC0brzi0xF64wzzmDAgAF06tSJefPmceGFFzJp0iSmT59O586dufvuu2ndujWdO3dm+vTpnHLKKfTs2ZN7770XgOXLl9OtWzfat2/PqFGjaNWqFffffz9nnnkmDzzwAAMGDOCLL75gxx135PDDD+eKK64ovfaBBx7IkiVLePLJJ9loo3rzvbIKW70ZcN6LzGDxVUZmt9uAQSmlf0REK+BcMvNnvwYcvKGJhyStzcqVK5k/fz6LFi3i22+/zXc4BaNBgwZsvvnmtG7d2j+YVO/Nnj2bn/3sZ8yfP582bdrQu3dvnn/+eTp37gzAJ598wmmnnUZJSQnt27fnmGOO4fe//33p+xs1asSECRM4++yzGTBgAF9++SVdu3bl1ltvZcCAAQAMHz6cpk2bcvHFF6927ZtvvpkddtiBq6++mlNPPTV3Ny2thzrV8pEPZQacD1nVL1OSypo1axYRQbt27WjUqJEDO2tASonly5dTUlJCSolOndZcK9aWD0mqtyr9RVn0XzU54FzSunz11Vd07NiRjTfe2MSjhkQEG2+8MR07duSrr77KdziSpBwp+uRDkqrCbkG1w5+rJBWXon/qO9uVJEmSlBtFn3zY7UqSqqZLly489thj+Q5DklSP1bXZriSpXni+z7a1Wn/vSc7ZL0kqPEWffJSZ7SrfoUiSpFoSZ3+a7xAKQrqsTb5DUD1ntyu7XUmq57p06cKll15Kt27daNmyJYMHD2bZsmV89tlnHHLIIbRp04aWLVtyyCGHMHv27NL37bPPPvz+979nzz33ZNNNN6V///7Mnz+/9PzYsWPp3LkzrVq1WmNdgRdffJHdd9+dzTffnPbt23PSSSfxzTffAJlpdE899VTatm3LZpttxo477shrr72Wmx+GJKlOK/rkQ5IKwe23387DDz/Me++9x4wZM7joootYuXIlgwcP5sMPP2TWrFk0adKEk046abX33XHHHdx6663MmzePb775hlGjRgHwxhtvcOKJJzJ27FjmzJnDggULVktcGjRowB//+Efmz5/Pc889x+OPP851110HwCOPPMKkSZOYMWMGixcv5q677qJVq1a5+2FIkuoskw9JKgAnnXQSW221FVtssQXnnHMOd955J61ateLwww+nadOmbLrpppxzzjk89dRTq71v8ODBfO9736NJkyb89Kc/5dVXXwXgnnvu4ZBDDqFPnz40btyYCy+8cLVpcXv27Env3r1p2LAhXbp04YQTTiitu1GjRnzxxRe89dZbpJTYfvvtad++fc5+FpKkusvkQ5IKwFZbbVX6unPnzsyZM4clS5Zwwgkn0LlzZzbbbDP69OnDokWL+Pbbb0vLbrnllqWvmzZtypdffgnAnDlzVquzWbNmq7VezJgxg0MOOYQtt9ySzTbbjN/97nelXbb2228/TjrpJH71q1/Rtm1bhg4dyueff15r9y5Jqj+KPvlwnQ9JheCjjz4qfT1r1iw6dOjAFVdcwdtvv80LL7zA559/zqRJk4DMmIx1ad++/Wp1LlmyhAULFpTun3jiiWy33Xa88847fP7551xyySWr1fvrX/+aqVOn8sYbbzBjxgz+8Ic/1MRtSpLquaJPPhxwLqkQXHvttcyePZuFCxdy8cUXM3DgQL744guaNGnC5ptvzsKFCxk5cmSV6zviiCP45z//yTPPPMM333zDeeedx8qVK0vPf/HFF2y22WY0b96ct956i7/85S+l51566SVeeOEFli9fTrNmzdhkk01cyVySBJh8SFJBOPLII+nfvz/bbLMN2267Leeeey7Dhw9n6dKltG7dmt69e3PggQdWub7u3btz7bXXcuSRR9K+fXtatmzJd77zndLzo0aN4o477mDTTTdlyJAhDBw4sPTc559/zpAhQ2jZsmXpbFlnnnlmjd6vJKl+iqo0vxeDXr16pSlTpuQ7DEl10Jtvvsn222+f7zAq1aVLF2666Sb69u2b71DWS2U/34iYmlLqVYUq/EWmdXKdj5rhOh+qoqjshC0fkiRJknKi6JMPB5xLkiRJudEw3wHkW0ppPDC+V69eQ/IdiyStjw8++CDfIUiSVCVF3/IhSZIkKTdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfkiRJKkrnn38+EbHatuWWWwKwfPlyzjrrLHbaaSeaNWtG+/btOfLII5k1a9Zqddx4443su+++bL755kTEGpOAvPbaa2yyySbce++9qx1/7LHHaNSoEZMnT67Ve6xrTD4kSZJUtL7//e/zySeflG7Tp08HYMmSJbz88succ845vPzyyzzwwAN89NFHHHjggaxYsaL0/UuWLKF///6cf/75Fda/ww47MHLkSH75y19SUlICwOLFixk8eDCnn346e+65Z63fY11S9FPtRsQAYEDXrl3zHYqkeqS2V0t2FWFJyo2GDRuWtnaU1aJFCx599NHVjt1www10796dN998kx133BGA4cOHAzBlypRKr3HmmWcybtw4hg4dygMPPMDJJ59My5YtueCCC2ruRuqJom/5SCmNTykNbdGiRb5DkSRprd1AAO677z4OOOAA2rRpQ0Tw5JNPVljPiy++SL9+/WjevDmbbrope+yxB/PnzwfsBiKV9f7779OhQwe23npr/vd//5f333+/0rKff/45AC1btqzWNTbaaCNuu+02HnvsMY466ij+/ve/89e//pWNN954g2Kvj4o++ZCk+q5Lly6MGjWKnXbaiRYtWjBw4ECWLVvGmDFj2GuvvVYrGxG8++67AAwaNIhhw4Zx0EEH0bx5c/bcc0/mzp3L8OHDadmyJdtttx2vvPLKate59NJL6datGy1btmTw4MEsW7YMyHQrGD9+fGnZ5cuX07p169Xer6qrrBsIwFdffcUee+zBlVdeWen7X3jhBfr3788+++zD888/z9SpUznjjDNo1KgRYDcQaZXddtuNMWPG8NBDDzF69Gjmzp3LHnvswYIFC9Yo+80333D66aczYMAAvvOd71T7Wl27duXMM8/kjjvu4Oyzz6ZHjx41cAf1j8mHJBWAu+66i4ceeoiZM2cybdo0xowZU+X3XXTRRcyfP5/GjRuz++67s+uuuzJ//nyOOOIITjvttNXK33777Tz88MO89957zJgxg4suugiAY445hr/97W+l5SZMmED79u3ZZZddauwei8mqbiCrtjZt/tMN7+ijj2bEiBEcdNBBlb7/1FNP5Ve/+hXnnHMOO+ywA9/73vc47LDDKNvKf+aZZ/K9732PoUOHAhR1NxAVr4MOOoif/vSn7LTTTvTt25d//vOfrFy5kttuu221citWrODnP/85ixYt4tZbb12vay1dupQ777yTpk2b8swzz5BSqolbqHdMPiSpAPz617+mQ4cObLHFFgwYMIBXX321Su/7yU9+Qs+ePdlkk034yU9+wiabbMIxxxxDgwYNGDhw4BotFyeddBJbbbUVW2yxBeeccw533nknAD//+c+ZMGFCaZeEsWPHcvTRR9foPRaT6nQDKW/evHk899xztG/fnr322ou2bduy99578/jjj69Wzm4g0pqaN29O9+7deeedd0qPrVixgp/97GdMmzaNxx9/nFatWq1X3WeddRYrVqzgxRdfZMqUKfz5z3+uqbDrFZMPSSoAZccENG3alC+//LJK72vXrl3p6yZNmqyxX76erbbaqvR1586dmTNnDgAdOnRgzz335N5772XRokU8+OCDHHXUUet1L8WuOt1AKrIqURkxYgTHHXccDz/8MHvvvTcHHHAA//73v1crazcQaXXLli3jrbfeon379kCmC+nAgQOZNm0aEydOrHBgelVMnDiR6667jjFjxtC9e3euuOIKzj77bN57772aDL9eKPrZriSpUDVr1owlS5aU7s+dO3eD6/zoo49KX8+aNYsOHTqU7h977LHcdNNNrFixgt13352OHTtu8PWKUfnuVL1792abbbbhtttuW6MbXEVWrlwJwAknnMBxxx0HwC677MLEiRO5/vrr+ctf/lJatqJuIBFRg3cj1W1nnHEGAwYMoFOnTsybN48LL7yQr776imOPPZYVK1bwP//zP7z00kuMHz+eiCh9jrZo0YImTZoAmWfr3LlzmTFjBgBvvPEGixYtolOnTmyxxRZ88cUXDB48mFNOOYW9994bgCFDhnDvvfcyePBgnnzySTbaqHjaA4rnTiWpyOy88868/vrrvPrqqyxbtqzSOeir49prr2X27NksXLiQiy++mIEDB5ae+/GPf8zLL7/M1VdfzTHHHLPB11JGRd1A1mbVN7bdunVb7Xi3bt3WWBzNbiAqdrNnz+ZnP/sZ3//+9znssMNo3Lgxzz//PJ07d2b27Nk88MADzJkzh549e9K+ffvS7R//+EdpHddffz277LJLaWvvf//3f7PLLrswbtw4IDMVb9OmTbn44otXu/bNN9/M9OnTufrqq3N3w3VAwbZ8RMT/AfsAj6eUjshzOJKUc9/73vc477zz6Nu3L02aNOHSSy/lhhtu2KA6jzzySPr378+cOXM49NBDOffcc0vPNWnShMMPP5w777yTww47bEPDV9aqbiD77rtvlcp36dKFDh068Pbbb692fMaMGaXrEsB/uoFMnDixtBvI8OHDOfjgg9l2221r9B6kuurvf/97pee6dOlSpUHh559//lq/3Ln55psrPN6xY0c+++yzddZfaKJQR9pHxD7ApsCxVUk+evXqlda2OIyk4vXmm2+y/fbb5zuMvOvSpQs33XQTffv2rbTMBRdcwIwZM1ab+WpdKvv5RsTUlFKvKlRRUL/IKuoGMmnSJKZPn07nzp1ZuHAhs2bNYtGiRey7776MHj2aXr16lc6MBXDVVVcxYsQIbrrpJnbZ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tnxExKbVqay65SVJyocmTZrw2Wdrrp/71ltv0bZt2wreIUmqCetq+XgnIv4MjEkpza6oQERsBBwAnEZmEPplNRuiVDc832fbfIdQJb0nvZfvEKQ679BDD2XkyJHcfffdAEQEH3zwAWeddRaHH354nqOTpMK1ruRjb+Bi4P3slLpTgDnAMqAl0A3oDSwFLgFG116okrR+6kPiaNKYW6NGjeLggw+mTZs2LFmyhL322ouSkhL23HNPLrroonyHJ0kFa63JR0rpHeCnEbEVmUUF9wZ+CDQB5gOvADcCE1JKK2s51oJRH/4QAv8YklS4NttsM5555hmeeOIJXn75ZVauXMmuu+5K37598x2aJBW0Kg04Tyl9RGYV83q7knllImIAMKBr1675DkWSlGP77bcf++23X77DkKSiUZ2pdgtSSml8SmloixYt8h2KJCmHrrvuOrp3707Tpk15//33Abjsssu466678hyZJBWuok8+JEnF56qrruKiiy5i6NChpJRKj3fs2JE///nPeYxMkgqbyYckqehcf/31jB49mlNOOYWGDf/TA3nXXXfl9ddfz2NkklTYTD4kSUXnww8/ZIcddljjeKNGjVi6dGkeIpKk4mDyIUkqOttssw0vv/zyGscnTJhAt27d8hCRJBWHKs12tUpEtAOOBrYFfp9Smh8RewJzUkozayNASZJq2hlnnMFJJ53EkiVLSCnx3HPPMXbsWC6//HJuueWWfIcnSQWryslHRPQks4L5TKA78Acya330A74HHFkbAUqSVNMGDx7MihUr+N3vfseSJUs4+uij6dChA3/6058YOHBgvsOTpIJVnZaPUcDVKaUREfFFmeMPA4NrNqzccZ0PSSpOQ4YMYciQIcyfP5+VK1fStm3bfIckSQWvOmM+egK3VXD8E6BdzYSTe67zIUnF67333uP555/nxRdfLF3rQ5JUe6rT8rEUaFnB8e2AeTUTjiRJtW/BggX84he/YNy4cWy0UeZ7uJQShxxyCLfccgutWrXKc4SSVJiq0/LxADAiIhpn91NEdAH+H3BvTQcmSVJtOf7443n33Xd5+umnWbZsGcuWLWPSpEnMnDmTIUOG5Ds8SSpY1Wn5OAOYAHwKNAWeIdPdajJwbs2HJklS7Xj44Yd5/PHH2X333UuP7bnnntxwww307ds3j5FJUmGrcvKRUvoc2Csi9gN2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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import CyclicMinuteOfHour\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [CyclicMinuteOfHour(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CyclicMinuteOfHour\")" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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dwoDzvcEzl5KncOB4QDt2rXbdtNNN23osCVJy2ny5MkzM7NTHYq2nJlT1GydccYZXHDBBXTr1i1bt27Ndtttx3nnnceGG27IggULaN++PSeffDJ77LHH/pMnT6Znz54cf/zxDBkypNb6Xn31VSKCG2+8EWr8N/7++++zxRZb0L9//3m33HILt912G3vttZeT6yyHM844gxtuuIH77ruv6tjKK6/cheLvfOrUqXTs2JEDDzyQAw44gDXXXJMXXnihz1ZbbfXcwvK//vWvmTNnDm3atOGYY45h6tSpU6tfIzP5xS9+wahRo26eMWMGXbp04aOPPuK//uu/OOCAAzj//PMfLNHtllIs8URTne0qIj4FjszMMcX9heM5vpGZE6uVOx04IDM3Ke5/h0KCshJwQWZeVpfr9e3bNydNmtSwNyFJWm4RMTkz+9ahaNP8h0wV5fbbb+eTTz5h00035d133+Wcc87hhRde4Nlnn2XevHl07dqVtm3bcvbZZzNgwADuueceTjzxRG677Ta+/e1vL1bfT37yE6644grefPNNWrVqtdj5MWPGcPDBB/PDH/6Qq6++uhS32CKdeeaZ3HzzzTzzzDO1nt9///2JCK699tpl1jVp0iS+9rWvMXXqVHr27LnIuQULFrDzzjvTsWNHbrvtNg488ECmTJnCpEmTWHXVVRviVpqaJSYfTarbVUPIzLGZ+ZXM7FWXxCMiBkXEZR999FEpwpMkSS3QnnvuyX777cfWW2/Nbrvtxt///ncWLFjAVVddxYIFhZ7k3/3udzn22GPp3bs3xx57LPvttx+/+93vFqvryy+/5Morr+Sggw6qNfFYsGABV155JW3btuXxxx9n7ty5jX5/Ldmrr75Kt27d2GCDDfif//kfXn31VaDwex43bhybb745e+yxB506deJrX/saf/nLX+p9jZVWWomrrrqKu+++mwMOOIAbbriBq6++uqUmHkvVnJKPmcB8oEuN412A6YsXr5vMHJeZwzt06LAisUmSJFVp3749W2yxBS+//DIdO3ZklVVWYfPNN1+kzGabbca0adMWe++4ceOYPn06hx5a+1rJF110EU8//TSPP/44n376Kaeeemqj3EMl2G677RgzZgx33HEHo0ePZvr06eywww68//77vPvuu3z66aecd955DBw4kLvuuovvf//7HHDAAfzjH/+o97V69erFCSecwHXXXcfJJ59M7969G/6GmoFmM+YjM7+IiMnA7sBN1U7tDvx1eeuNiEHAoF69eq1ghJIkSQVz587lhRdeYNddd2XVVVfla1/7Gi+++OIiZV566SV69Oix2HtHjx7NN77xDb7yla8sdu7555/n1FNP5fLLL2fzzTfniiuuYK+99mKfffZhxx0ratxyg9hzzz0X2e/Xrx8bbrghV111Ff/zP4WZixe2WAH07t2bSZMm8bvf/a7W7nJLM2fOHK6//nratm3Lgw8+SGYSscTeSS1Wk2r5iIj2EdE7InpTiG394v7CqXR/BQyNiEMjYrOIuJjC2h5/WN5r2vIhSZJW1PHHH8/999/P1KlTefTRR9l333357LPPOOiggwA48cQT+ctf/sJll13Gf/7zH0aPHs0NN9zAEUccsUg906ZN484772TYsGGLXePLL7/koIMO4tvf/jYHHHAAAAMHDuTQQw/l4IMPZvbs2Y1/oy3cirRYLctJJ53El19+yWOPPVaVwFSiptby0Re4t9r+WcXtKmBoZv4lItahMC92VwprguyVma+XPFJJFWPBggXMnDmTDz/8kPnz55c7nBZj5ZVXZs0116Rjx46stFKT+i5Mqrc333yT73//+8ycOZNOnTrRr18/HnnkkaqWjf/+7//msssu47zzzuPoo49m44035uqrr17s2/MrrriCDh06MHjw4MWu8fOf/5zXX399sS4/o0aNYuutt+aUU07h4osvbrybrAAr0mK1NPfeey+XXnop9957L1tssQUXXnghI0eOZK+99mKjjTZqyFto8prsbFelUq3b1bCXX3653OFIaoKmTZtGRNClSxdatWpVkc3kDS0zmTdvHjNmzCAzWX/9xdeKdbYrSY3t+OOPZ9CgQay//vq8++67nH322UycOJGnn36aHj16cOutt1ZNDDBgwADuvfdeRowYwa233lqVOE6fPp3p06fz3HPPVY0H6datG+uvvz5rr702n3zyCVtttRWDBw/mwgsvrLr2HnvswezZs7nvvvta4hcwlTPbVX3Z7UrSsnz22Wd0796dVVdd1cSjgUQEq666Kt27d+ezzz4rdziSKtTCFqtNNtmEffbZh9atW9faYjVq1Ci22morfvvb3y7WYvWHP/yBPn36VHWF+/a3v02fPn0YO3YsACNHjqRt27ace+65i1z7iiuu4Omnn6641qqKb/lYyHU+JC3J888/z2abbbbsglouS/r92vIhSc2WLR9L4jofkiRJUmlUfPJhtytJqpuePXty9913lzsMSVIz1tRmu5KkZuGR/o07O0m/ia80av2SJJVDxScfLjIoSVLLFye/V+4QWoQ8v1O5Q1AzZ7cru11JauZ69uzJz3/+czbffHPWWmstDj74YObOncsHH3zA3nvvTadOnVhrrbXYe++9efPNN6vet8suu/DTn/6UHXfckdVXX52BAwcyc+bMqvPXXHMNPXr0YJ111llslpbHHnuM7bffnjXXXJOuXbty5JFH8sUXXwCFaXSPOeYYOnfuzBprrMFWW23FM888U5pfhiSpSav4lg9JagmuvfZa7rzzTtq1a8egQYM455xzOOaYYzj44IO58cYbmT9/PocccghHHnkkt956a9X7rrvuOm6//XbWW2899txzT0aNGsX555/Pc889x+GHH8748ePZbrvtOOWUUxZJXFZeeWV+/etf07dvX95880323HNPLr30UkaOHMmECROYOHEiL730Eh06dOCFF15gzTXXLP0vRVKzZ4tVw2hKLVYV3/IhSS3BkUceyXrrrcfaa6/NqaeeyvXXX88666zD4MGDadu2Lauvvjqnnnoq999//yLvO/jgg/nKV75CmzZt2G+//ZgyZQoAN998M3vvvTf9+/endevWnH322YssgrXtttvSr18/VlllFXr27Mlhhx1WVXerVq345JNPeOGFF8hMNttsM7p27Vqy34Ukqeky+ZCkFmC99daret2jRw/efvttZs+ezWGHHUaPHj1YY4016N+/Px9++CHz58+vKrvuuutWvW7bti2ffvopAG+//fYidbZr14511lmnav+ll15i7733Zt1112WNNdbgJz/5SVWXrQEDBnDkkUdyxBFH0LlzZ4YPH87HH3/caPcuSWo+Kj75cJ0PSS3BG2+8UfV62rRpdOvWjQsvvJAXX3yRRx99lI8//piJEycChTEZy9K1a9dF6pw9ezbvv/9+1f7hhx/Opptuyssvv8zHH3/Meeedt0i9P/7xj5k8eTLPPfccL730Er/85S8b4jYlSc1cxScfDjiX1BJccsklvPnmm8yaNYtzzz2XIUOG8Mknn9CmTRvWXHNNZs2axVlnnVXn+vbdd1/+/ve/8+CDD/LFF19w+umns2DBgqrzn3zyCWussQbt27fnhRde4Pe//33Vuccff5xHH32UefPm0a5dO1ZbbbVFumxJkiqX/xpIUguw//77M3DgQDbccEM22mgjTjvtNEaOHMmcOXPo2LEj/fr1Y4899qhzfVtssQWXXHIJ+++/P127dmWttdbiv/7rv6rOjxo1iuuuu47VV1+dYcOGMWTIkKpzH3/8McOGDWOttdaqmi3rhBNOaND7lSQ1T1GX5vdK0Ldv35w0aVK5w5DUBD3//PNsttlm5Q5jiXr27Mnll1/ObrvtVu5QlsuSfr8RMTkz+9ahCv8h0zI5a1LDKPWsSX5uDaMMs13Fkk7Y8iFJkiSpJCo++XDAuSRJklQaFb/IYGaOA8b17dt3WLljkaTl8dprr5U7BEmS6qTiWz4kSZIklYbJhyRJTciZZ55JRCyyVV8MMjM588wz6datG23atGGXXXbh2WefXaSOc889lx133JF27doRsfi4zwkTJtCqVSseffTRRY5ffvnltG/fnldeeaVxbk5SxTP5kCSpidlkk0145513qrann3666twFF1zAhRdeyG9/+1sef/xxOnfuzO67784nn3xSVebzzz9nn332YeTIkbXWP3DgQA499FAOOugg5syZAxS67x177LGMGjWKjTbaqFHvT1LlMvmQJKmJWWWVVVh33XWrtk6dCtNkZiYXXXQRJ598MoMHD2bLLbfkqquu4pNPPuG6666rev/PfvYzjjvuOPr06bPEa4waNYovv/ySk08+mcxk6NCh7LDDDvzoRz9q9PuTVLkqfsC5JElNzauvvkq3bt1o3bo12223Heeddx4bbrghU6dOZfr06QwcOLCqbJs2bejfvz//+te/OOyww+p8jXbt2jFmzBh22WUX3nvvPf7973/zzDPPNMbtSFIVWz4kSWpCtttuO8aMGcMdd9zB6NGjmT59OjvssAPvv/8+06dPB6BLly6LvKdLly5V5+pjp5124gc/+AHXX389F154Id27d2+Qe5CkJan4lo+IGAQM6tWrV7lDkdSMNPaqu2VYjVZNxJ577rnIfr9+/dhwww256qqr6NevX4Nea8aMGfzjH/+gbdu2TJw4kUMOOaRB65ekmiq+5SMzx2Xm8A4dOpQ7FEmSFtO+fXu22GILXn755apZr2bMmLFImRkzZiwyI1ZdDR8+nI033pi7776bP//5z4wbN65BYpakJan45EOSmruePXsyatQott56azp06MCQIUOYO3cuY8aMYaeddlqkbETwn//8B4ChQ4cyYsQI9txzT9q3b8+OO+7I9OnTGTlyJGuttRabbropTz755CLX+fnPf87mm2/OWmutxcEHH8zcuXMB2HLLLRf5w3XevHl07Nhxkfdr+cydO5cXXniBrl27ssEGG7Duuuty1113LXL+gQceYIcddqhXvWPGjOHuu+/mqquuYvvtt+ekk07isMMOY9asWQ19C5JUxeRDklqAG2+8kTvuuIOpU6fy1FNPMWbMmDq/75xzzmHmzJm0bt2a7bffnm222YaZM2ey7777cuyxxy5S/tprr+XOO+/klVde4aWXXuKcc84B4MADD+TPf/5zVbnx48fTtWvXpc62pNodf/zx3H///UydOpVHH32Ufffdl88++4yDDjqIiGDkyJH84he/4JZbbuGZZ55h6NChtG/fnv3337+qjmnTpjFlyhRee+01AKZMmcKUKVP49NNPAXjjjTc4+uijOf/889l4440BOOOMM+jYsSNHHXVUye9ZUuUw+ZCkFuDHP/4x3bp1Y+2112bQoEFMmTKlTu/73ve+x7bbbstqq63G9773PVZbbTUOPPBAVl55ZYYMGbJYy8WRRx7Jeuutx9prr82pp57K9ddfD8APfvADxo8fz8cffwzANddcww9/+MMGvcdK8eabb/L973+fTTbZhH322YfWrVvzyCOP0KNHDwBOPPFEjjnmGI444gj69u3LO++8w4QJE1h99dWr6jj99NPp06cPJ5xwAgB9+vShT58+TJo0iczkkEMOoW/fvhx55JFV71l11VW5+uqruemmm/jb3/5W2puWVDEqfsC5JLUE1fv7t23blrfffrtO76s+a1KbNm0W21/4TflC6623XtXrHj16VF2nW7du7Ljjjvz1r3/le9/7HrfffjsXX3zxct1LpbvhhhuWej4iOPPMMznzzDOXWGbMmDFLbf2q3m2rut69e/PFF1/UJUxJWi4mH5LUQrVr147Zs2dX7S/PVKw1vfHGG1Wvp02bRrdu3ar2DzroIC6//HK+/PJLtt9+e6dtlSQtxm5XktRCffWrX+XZZ59lypQpzJ07d6nflNfVJZdcwptvvsmsWbM499xzGTJkSNW5//7v/+aJJ57g4osv5sADD1zha0mSWp4Wm3xExN8i4oOIuLncsUhSOXzl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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import CyclicHourOfDay\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [CyclicHourOfDay(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CyclicHourOfDay\")" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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EXHNkiVLNiY8SZKkUsuXL+fll1+mTZs2NGjQgG9/+9u88sora9R59dVX6dixIwBjx45lzpw5zJ49u3QDGDduHDfffHPpe6ZNm8b48eOZMGECXbt25bLLLmP06NG88cYbObs3aWPUqm5XEdEUWN3/aROgQ0R0AxanlOYDlwMTI+IpMtPVnUBmbY+rv+k1U0qTgck9evQYtjGxS5Kk4jVq1CgGDhxIhw4d+OCDD7jwwgv54osvOOaYYwD4xS9+wRFHHEHv3r3p27cv06ZN4/bbb+fvf/87AO3ataNdu7WXJmvfvj2dO3cGMgPShw4dyogRI+jdO7PM2bBhw7j77rsZOnQojzzyCJtsUme+V1aRqlXJB9CDzGDx1cZkt5uAISmlv0bE1mTmxW5DZk2Qg1JKDkqUVGNWrVrFokWL+OSTT1i5cmW+wykYm266KVtuuSUtWrTwDybVee+++y4//vGPWbRoES1btqRnz5488cQTpS0bP/jBD7jmmmu4+OKLGTFiBNtvvz0333xz6WDzyhg5ciSNGzdm7Nixaxy//vrr2WWXXbjyyis57bTTqvW+pOoWKRX3DIVlBpwPe+211/IdjqRaaP78+UQErVu3pn79+g7srAYpJVasWEFJSQkpJTp0WHut2IiYlVLqUZnTVX+EkqSNsM5/KIv+qyYHnEvakC+++IJ27drRoEEDE49qEhE0aNCAdu3a8cUXX+Q7HElSjhR98iFJlWG3oJrh71WSikvRP/Wd7UqSJEnKjaJPPux2JUmV06lTJx588MF8hyFJqsNq22xXklQnPNFnuxo9f8/pztkvSSo8RZ98lJntKt+hSJKkGhKjP8x3CAUhXdIy3yGojrPbld2uJNVxnTp14je/+Q0777wzzZs3Z+jQoSxfvpyPP/6Ygw8+mJYtW9K8eXMOPvhg3n333dL37bfffvzqV79in332YfPNN2fAgAEsWrSotHzixIl07NiRrbfeeq11BZ566il69erFlltuSZs2bTjllFP46quvgMw0uqeddhqtWrWiWbNm7LrrrsydOzc3vwxJUq1W9MmHJBWCW265hfvvv5833niDV199lYsuuohVq1YxdOhQ3n77bebPn0+jRo045ZRT1njfrbfeyo033sgHH3zAV199xbhx4wB46aWXOPHEE5k4cSILFy7ko48+WiNx2XTTTfn973/PokWLePzxx3nooYcYP348AFOnTmX69Om8+uqrLFmyhDvuuIOtt946d78MSVKtZfIhSQXglFNOoX379my11Vacc8453HbbbWy99dYMGjSIxo0bs/nmm3POOefw6KOPrvG+oUOH8q1vfYtGjRpxxBFHMHv2bADuuusuDj74YPr06UPDhg258MIL15gWd88996Rnz57Uq1ePTp06cfzxx5eeu379+nz22We8/PLLpJTYaaedaNOmTc5+F5Kk2svkQ5IKQPv27Utfd+zYkYULF7J06VKOP/54OnbsSLNmzejTpw+ffPIJK1euLK27zTbblL5u3Lgxn3/+OQALFy5c45xNmjRZo/Xi1Vdf5eCDD2abbbahWbNm/PKXvyztstW3b19OOeUUTj75ZFq1asXw4cP59NNPa+zeJUl1R9EnH67zIakQvPPOO6Wv58+fT9u2bbnssst45ZVXePLJJ/n000+ZPn06kBmTsSFt2rRZ45xLly7lo48+Kt0/8cQT2XHHHXnttdf49NNPufjii9c4789//nNmzZrFSy+9xKuvvsrvfve76rhNSVIdV/TJhwPOJRWCq666infffZfFixczduxYBg8ezGeffUajRo3YcsstWbx4MWPGjKn0+Q4//HDuvfdeZsyYwVdffcV5553HqlWrSss/++wzmjVrRtOmTXn55Zf585//XFr29NNP8+STT7JixQqaNGnCZptt5krmkiTA5EOSCsKRRx7JgAED6Ny5M9tttx3nnnsuI0eOZNmyZbRo0YKePXtywAEHVPp8Xbt25aqrruLII4+kTZs2NG/enP/6r/8qLR83bhy33norm2++OcOGDWPw4MGlZZ9++inDhg2jefPmpbNlnXnmmdV6v5JUHS644AIiYo2tbHfUe+65h+9973u0bNmSiOCRRx5Z57lSShx44IFEBHfddVfp8blz57LZZptx9913r1H/wQcfpH79+sycObPa76s2i8o0vxeDHj16pGeeeSbfYUiqhf7973+z00475TuMderUqRPXXXcd/fr1y3co38i6fr8RMSul1KMSp/AfMm2Q63xUj0Jb5+OCCy7g9ttvXyOp2HTTTWnZMnOfEydO5M0336Rz584cffTRTJs2jf3226/Cc40bN45p06YxZcoU7rzzTg4//PDSst/+9reMGzeOuXPn0rp1a5YsWcIuu+zCUUcdxSWXXFKTt5gvsa6Col9kUJIkScWrXr16a7R2lPXTn/4UYI01kCry9NNPc+WVVzJr1ixat269VvmZZ57JpEmTGD58OP/4xz849dRTad68Ob/+9a83/gbqmKLvduWAc0mSpOL15ptv0rZtW7bddlt+9KMf8eabb1bp/Z999hlHHnkk11xzDa1ataqwziabbMJNN93Egw8+yFFHHcXtt9/OzTffTIMGDarjFuqUok8+HHAuqa5766236myXK0nKp7322osJEybwz3/+k2uvvZb333+fvffee43Z/TbkhBNO4IADDuDAAw9cb70uXbpw5plncuuttzJ69Gi6deu2kdHXTUWffEiSVJtsaABsSokLLriAtm3b0qhRI/bbbz9efPHF0vJVq1ZxyCGH0KFDBzbbbDPatGnDT37yExYsWFBaZ+rUqdSvX58nn3xyjWtfd911NG3alDfeeKPmb1SqBQ488ECOOOIIdtttN/r168e9997LqlWruOmmmyr1/okTJ/L8889XajrxZcuWcdttt9G4cWNmzJhRqWnPC5HJhyRJtcwOO+zAe++9V7q98MILpWWXXnopl112GX/84x95+umnadWqFf379+ezzz4rrdO3b1/uuOMOXnnlFe6++27efPNNfvjDH5aWDxgwgOOOO45jjjmGZcuWAZkWtNNPP51x48ax3Xbb5e5mpVqkadOmdO3alddee61S9R966CFeeuklmjZtSr169ahXLzOcevDgwey7775r1D3rrLP4+uuveeqpp3jmmWf405/+VO3x1wUmH5Ik1TKrB8Cu3lbPvJNS4oorrmD06NEMGjSIXXbZhZtuuonPPvuMW2+9Fcj0LR85ciQ9e/akY8eO7L333owePZqnn36a5cuXl15j3LhxfP3114wePZqUEkOGDGHvvffmhBNOyMs9S7XB8uXLefnll2nTpk2l6o8dO5Y5c+Ywe/bs0g0y/3/dfPPNpfWmTZvG+PHjmTBhAl27duWyyy5j9OjRRdnK6GxXkiTVMqsHwDZs2JC99tqLiy++mM6dOzNv3jzef/99BgwYUFq3UaNG9OnTh3/9618cf/zxa51r8eLF3HLLLey1115sttlmpcebNGnChAkT2G+//fjwww95/vnnmTt3bk7uT6otRo0axcCBA+nQoQMffPABF154IV988QXHHHMMkPn/Z/78+XzyyScAvP7662y55ZalXwy0a9eOdu3arXXe9u3b07lzZyAzIH3o0KGMGDGC3r17AzBs2DDuvvtuhg4dyiOPPFJUC7EWz51KklQHrG8A7Pvvvw+w1lSerVu3Li1b7ayzzqJJkyZsvfXWzJ8/n3vvvXeta+2777785Cc/4bbbbuOyyy6r8I8oqZC9++67/PjHP2aHHXbgsMMOo2HDhjzxxBN07NgRgEmTJrHHHnuw//77A5mkYY899uDqq6+u9DVGjhxJ48aNGTt27BrHr7/+el544QWuvPLK6ruhOsBFBrNcZFDSutT2RQbrOhcZXL/PP/+czp07M3r0aHr27Mk+++zD22+/TYcOHUrrHHvssSxYsID777+/9NiiRYtYvHgxb7/9NmPGjKFp06bcd999RPxn7a+SkhJ22WUXli5dyv/8z/8wYcKEXN5aTrnIYPUotEUGVWNcZHBdImIgMLBLly75DkVSHVLTf8j4D7xWKzsA9gc/+AGQSRrKJh8lJSVrLZLWokULWrRowbe+9S122mkn2rdvz4wZM0q7fQAMHz6c7bffnssuu4zevXszaNAgBg4cmJP7klScir7blet8SJJqs7IDYLfddlu22WYbHnjggTXKH3vsMfbee+91nmPVqlUAfPnll6XHJkyYwIMPPshNN91Er169OOusszj++ONZvHhxzd2MpKJX9MmHJNV1nTp1Yty4cey2225sscUWDB48mOXLlzNhwoS1pnqMCF5//XUAhgwZwkknncSBBx5I06ZN2WeffXj//fcZOXIkzZs3Z8cdd+S5555b4zq/+c1v2HnnnWnevDlDhw4tnT1pl112YfLkyaV1V6xYQYsWLdZ4vypn1KhRPProo8ybN48nn3ySww8/vHQAbEQwcuRIfvvb33LPPfcwd+5chgwZQtOmTTnyyCMBePzxx7nqqqt4/vnnefvtt3n44Yf58Y9/TKdOnUr/e3jnnXcYMWIEl1xyCdtvvz0A559/Pi1atODUU0/N271LKnwmH5JUAO644w7++c9/Mm/ePObMmVPpvvt33HEHF110EYsWLaJhw4b06tWL7t27s2jRIg4//HBOP/30Nerfcsst3H///bzxxhu8+uqrXHTRRQAcffTR/O///m9pvSlTptCmTRv22GOParvHYrGhAbC/+MUvOO200zj55JPp0aMH7733HlOnTmXzzTcHMrNf3XXXXfTt25cddtiBn/3sZ+y222489thjbLbZZqSUOPbYY+nRowennHJK6XUbNGjAzTffzJ133snf/va3vNy7pMJX9GM+JKkQ/PznP6dt27YADBw4kNmzZ9OzZ88Nvu+HP/whe+65Z+nr8ePHc/TRRwOZRbLKL4J1yimn0L59ewDOOeccTj31VC666CJ+8pOfcOGFF/Lpp5/SrFkzJk6cyE9/+tPqvMWicfvtt6+3PCK44IILuOCCCyos79atG9OmTVvv+8t22yr/3q+++qrSsUo1zYkCqkdtGkdoy4ckFYCyg40bN27M559/Xqn3lZ2ytVGjRmvtlz/P6sQDoGPHjixcuBCAtm3bss8++3D33XfzySefcN9993HUUUd9o3uRJBUuWz4kqUA1adKEpUuXlu6XXwfim3jnnXdKX8+fP7+0tQXgmGOO4brrruPrr7+mV69erhkhSVqLLR+SVKB23313XnzxRWbPns3y5cvX2U2nKq666ireffddFi9ezNixYxk8eHBp2Q9+8AOeffZZrrzyytKuW5IklVWwyUdE/C0iPo6Iu/IdiyTlw7e+9S3OO+88+vXrx/bbb7/WzFffxJFHHsmAAQPo3Lkz2223Heeee25pWaNGjRg0aBDz5s3jsMMO2+hrSZIKT8GucB4R+wGbA8eklA7fUH1XOJe0Lq5wntGpUyeuu+46+vXrt846v/71r3n11VfXmPlqQ+raCucOgK0euR4A6+dWPfzc6qY8DDhf5wrnBdvykVJ6BPgs33FIUrFYvHgx119/PcOHD893KJKkWirnyUdE9ImISRGxICJSRAypoM5JETEvIpZHxKyI6J3rOCVJlXfttdfSvn17DjzwQPr06ZPvcCRJtVQ+ZrtqCswFbs5ua4iIwcCVwEnAjOzP+yJi55TS/Gyd2VQc+4CU0sIailuSitpbb721zrJhw4YxbNiw3AUjSaqTcp58pJSmAFMAImJCBVVOByaklK7N7p8aEQcAJwJnZ8/RrTpiiYjhwHCADh06VMcpJUmSJK1DrRrzERENgD2BqeWKpgJ7V/f1UkrXpJR6pJR6tGxZe1Z+lFT7FOrkHPnm71WSikutSj6AFsCmQEm54yXANmtXX7eIeBC4EzgoIt6NiF7rqDcwIq5ZsmTJN4lXUhGoX78+y5Yty3cYBWnZsmXUr18/32FIknKktiUf1Sal1C+l1DKl1Dil9F8ppcfXUW9ySmn4FltskesQJdURrVq1YsGCBSxdutRv6qtJSomlS5eyYMECWrVqle9wJEk5ko8B5+uzCFgJtC53vDXwfu7DkSRo1qwZAAsXLmTFihV5jqZw1K9fn9atW5f+fiVJha9WJR8ppa8iYhbQn0yXqdX6A3fXxDUjYiAwsEuXLjVxekkFolmzZv6RLEnSRsrHOh9NI6JbRHTLXr9Ddn/1dFOXA0Mi4riI2CkirgTaAlfXRDx2u5IkSZJyIx9jPnoAz2W3RsCY7OtfA6SU/gqMBM4FZgP7AgellN6uiWAccC5JkiTlRs6Tj5TSIymlqGAbUqbO+JRSp5RSw5TSniml6TUYjy0fkiRJUg4U7GxXkiRJkmqXok8+7HYlSZIk5UbRJx92u5IkSZJyo+iTD0mSJEm5YfIhSZIkKSeKPvlwzIckSZKUG0WffDjmQ5IkScqNok8+JEmSJOWGyYckSZKknCj65MMxH5IkSVJuFH3y4ZgPSZIkKTeKPvmQJEmSlBsmH5IkSZJywuRDkiRJUk4UffLhgHNJkiQpN4o++XDAuSRJkpQbRZ98SJIkScoNkw9JkiRJOWHyIUmSJCkn6uU7AEmS8mXZsmW88cYbAGy33XY0atQozxFJUmGz5UOSVHS+/PJLRo4cyVZbbcXuu+/ObrvtxlZbbcWIESNYvnx5vsOTpIJly4ckqeiceOKJTJ06leuuu45evXoB8Pjjj3P22Wfz2WefccMNN+Q5QkkqTEWffETEQGBgly5d8h2KJClH7rzzTu655x769+9feqxz5860atWKQYMGmXxIUg0p+m5XrvMhScWnSZMmtGvXbq3j7dq1c9yHJNWgok8+JEnF59RTT2XMmDEsW7as9NiyZcu48MILOfXUU/MYmSQVtqLvdiVJKj5PPPEEjz76KO3atWO33XYD4IUXXuDrr7/miy++4JBDDimtO2nSpHyFKUkFx+RDklR0WrRowaBBg9Y4tu222+YpGkkqHiYfkqSic+ONN+Y7BEkqSo75kCRJkpQTtnxIkorOrrvuSkSss3zOnDk5jEaSikdBJh8R0R6YCLQCvgYuTCndmd+oJEm1xeGHH77G/ooVK5g9ezYzZ87k5JNPzlNUklT4CjL5IJNwjEwpzY6IbYBZETElpfRFvgOTJOXf+eefX+Hx3/3ud7z99ts5jkaSikdBjvlIKb2XUpqdff0+sAjYKq9BSZJqvcMOO4xbbrkl32FIUsHKefIREX0iYlJELIiIFBFDKqhzUkTMi4jlETErInpvxPX2BDZNKb2zMXFLkgrf9OnTady4cb7DkKSClY9uV02BucDN2W0NETEYuBI4CZiR/XlfROycUpqfrTObimMfkFJaWOZcW2WvMaya70GSVIeVXUQQIKXEe++9x3PPPbfOLlmSpI2X8+QjpTQFmAIQERMqqHI6MCGldG12/9SIOAA4ETg7e45uG7pORDQE/g5cklL610YHLkkqGFtvvfUa+5tssgldu3bl4osvZsCAAXmKSpIKX60acB4RDYA9gXHliqYCe1fhPAFMAB5OKU1cT73hwHCADh06VDVcSVId5SKDkpQftW3AeQtgU6Ck3PESYJsqnGcfYDDwg4iYnd12LV8ppXRNSqlHSqlHy5Ytv3HQkqS665JLLuGTTz7JdxiSVBRqW/JRLVJKM1JKm6SUupXZXqiobkQMjIhrlixZkuswJUm1wMUXX8zixYvzHYYkFYXalnwsAlYCrcsdbw28XxMXTClNTikN32KLLWri9JKkWi6llO8QJKlo1KrkI6X0FTAL6F+uqD9QI4PGbfmQJEmSciMf63w0jYhuEdEte/0O2f3VI74vB4ZExHERsVNEXAm0Ba6uiXhs+ZCk4vbSSy/RsWPHfIchSUUhH7Nd9QCmldkfk91uAoaklP4aEVsD5wJtyKwJclBK6e2aCCYiBgIDu3TpUhOnlyTVcu3bt893CJJUNCqVfETETsCPgf8GOgGNgA+BZ4H7gLtTSl9W5lwppUeA2ECd8cD4ypxvY6WUJgOTe/To4UKEklTANtlkEzIzsW/YypUrazgaSSpO600+IqI7cCmwLzCTzLiLu4BlwFbALsBY4I8RcSlwRWWTEEmScumOO+4oTT5KSko477zz+OEPf0ivXr0AePzxx/n73//OmDFj8hmmJBW0DbV8/I1M8vE/KaWP11UpInoBpwGjyCQjdYbdriSpOBx++OGlrw855BB+85vfMGzYfxq9jz32WL7zne/w97//nZNOOikfIUpSwdvQgPPtU0pXrS/xAEgpPZ5SOgL4XfWFlhsOOJek4vPwww+z//77r3V8//3355FHHsl9QJJUJNabfGSnvl2niKhflfqSJNUGLVq04K677lrr+F133UXLli3zEJEkFYdKz3YVET8HFqSU7s7uXw8cExFvAIeklF6poRglSapWv/71rxk6dCjTpk0rHfPxxBNP8OCDD3L99dfnOTpJKlxVWefj52RmuCIi+gBHAEcCs4HLqj2yHHGRQUkqPkcffTT/+te/aNGiBZMmTWLSpElsvfXWzJw5k2OOOSbf4UlSwarKOh/tgHnZ1wOBO1NKd0TEC8Bj1R5ZjjjVriQVp7322otbbrkl32FIUlGpSsvHp0Cr7Ov+wEPZ1yuAzaozKEmSalpJSQnjxo3jpJNOYtGiRQDMnDmTefPmbeCdkqRvqirJx1Tg2oi4DuhCZnFBgK78p0VEkqRab9asWeywww7ccsstXHfddXz66acAPPDAA5xzzjl5jk6SCldVko+TySw02BI4PKW0OHu8O3BbdQeWK475kKTiM2rUKEaMGMFzzz1Hw4YNS49/73vfY+bMmXmMTJIKW6XHfKSUPgVOreD4+dUaUY455kOSis+sWbMqnNWqTZs2lJSU5CEiSSoO6235iIjNq3KyqtaXJCkfGjVqxMcfr71+7ssvv0yrVq0qeIckqTpsqOXjtYj4EzAhpfRuRRUiYhPge8DpZAahX1K9IUq1wxN9tst3CJXSc/ob+Q6h1qkLn52fW24deuihjBkzhjvvvBOAiOCtt97irLPOYtCgQXmOTpIK14aSj97AWODN7JS6zwALgeVAc2BnoCewDLgYuLbmQpUkqXqMGzeOgw46iJYtW7J06VL23XdfSkpK2GeffbjooovyHZ4kFaz1Jh8ppdeAIyKiPZlFBXsD3wEaAYuA54BrgCkppVU1HKskSdWiWbNmzJgxg4cffphnn32WVatW0b17d/r165fv0CSpoFVqwHlK6R0yq5jX2ZXM1yUiBgIDu3TpkrNr1oUuIGA3EEmFr2/fvvTt2zffYUhS0ajKVLsFKaU0OaU0fIsttsh3KJKkHBo/fjxdu3alcePGvPnmmwBccskl3HHHHXmOTJIKV9EnH5Kk4nPFFVdw0UUXMXz4cFJKpcfbtWvHn/70pzxGJkmFzeRDklR0rr76aq699lpGjBhBvXr/6YHcvXt3XnzxxTxGJkmFzeRDklR03n77bXbZZZe1jtevX59ly5blISJJKg4mH5KkotO5c2eeffbZtY5PmTKFnXfeOQ8RSVJxqNRsV6tFRGvgp8B2wK9SSosiYh9gYUppXk0EKElSdRs1ahSnnHIKS5cuJaXE448/zsSJE7n00ku54YYb8h2eJBWsSicfEbEnmRXM5wFdgd+RWeujP/At4MiaCFCSpOo2dOhQvv76a375y1+ydOlSfvrTn9K2bVv+8Ic/MHjw4HyHJ0kFqyotH+OAK1NK50fEZ2WO3w8Mrd6wcicf63xIkvJv2LBhDBs2jEWLFrFq1SpatWqV75AkqeBVZczHnsBNFRx/D2hdPeHknut8SFLxeuONN3jiiSd46qmnStf6kCTVnKq0fCwDmldwfEfgg+oJR5KkmvfRRx/xs5/9jEmTJrHJJpnv4VJKHHzwwdxwww1svfXWeY5QkgpTVVo+/gGcHxENs/spIjoBvwXuru7AJEmqKccddxyvv/46jz32GMuXL2f58uVMnz6defPmMWzYsHyHJ0kFqyotH6OAKcCHQGNgBpnuVjOBc6s/NEmSasb999/PQw89RK9evUqP7bPPPvzlL3+hX79+eYxMkgpbpZOPlNKnwL4R0RfoTqbV5NmU0oM1FZwkSTWhZcuWNGnSZK3jjRs3tsuVJNWgKi8ymFJ6OKU0LqV0qYmHJKkuOu+88xg5ciQLFiwoPbZgwQLOOOMMzjvvvDxGJkmFraqLDO4B7A+0olziklL6RTXG9Y1FxJbAg2TurR6Z6YGvzWtQkqRa5YorruCtt96iU6dOtGvXDsgkH5ttthkffPABf/jDH0rrzpkzJ19hSlLBqcoig78ALgHeBkqAVKY4Vfim/PgM6JNSWhoRTYC5EXFPSumjfAcmSaodDj/88HyHIElFqSotH6cBJ6aU/lJTwVSHlNJKYGl2tyEQ2U2SJADOP//8fIcgSUWpKmM+NgEe2piLRUSfiJgUEQsiIkXEkArqnBQR8yJieUTMioje3+A6W0bE88C7wO9SSos2Jm5JUmH58MMP+fDDD0v3X3jhBc4991xuu+22PEYlSYWvKsnHn4GhG3m9psBcYASZRQvXEBGDgSuBi4E9gH8B90VEhzJ1ZkfE3Aq2tqvrpJQ+SSntDmwLHBkRdXYFdklS9TviiCOYPHkyAIsWLaJPnz787W9/44QTTuCyyy7Lc3SSVLiq0u1qDDAlIp4jk0CsKFuYUjp2QydIKU0hs1YIETGhgiqnAxPKDBA/NSIOAE4Ezs6eo1tlA04plWRbQHoDd1X2fZKkwjZnzhx69uwJwF133UWXLl14+umn+cc//sGZZ57JGWeckecIJakwVaXlYywwAPgaaA60LLdtlIhoAOwJTC1XNBXYuwrnaR0Rm2dfbwH0AV5ZR93hEfFMRDxTtvldklTYli1bRtOmTQF48MEHOeSQQwDo3r0777zzTj5Dk6SCVpXk4yTgyJTSt1NKB6eUBpbdqiGWFsCmZGbSKqsE2KYK5+kIPJZt8XgM+GNK6YWKKqaUrkkp9Ugp9WjZcqPzJ0lSHbH99ttzzz338M477zB16lQGDBgAQElJCVtuuWV+g5OkAlaV5GMZ8FxNBVJdUkpPpZS6pZR2TynttqHZuSJiYERcs2TJklyFKEnKs/PPP5+zzjqLTp060bNnT/baay8A7r//fvbYY488RydJhasqycfvgZERUVPT1i4CVgLlB4e3Bt6voWuSUpqcUhq+xRZb1NQlJEm1zGGHHcb8+fN55pln+Oc//1l6vF+/flx++eV5jEySCltVBpz3JjN+4vsR8RJrDzg/ZGMCSSl9FRGzgP7AnWWK+gN3b8y51yciBgIDu3TpUlOXkCTVQq1bt6Z16zW/71rdAiJJqhlVST4WAfdszMUioimw+q/8TYAOEdENWJxSmg9cDkyMiKeAmcAJQFvg6o257vqklCYDk3v06DGspq4hSZIkqQrJR0ppY9f4AOgBTCuzPya73QQMSSn9NSK2Bs4F2pCZ0veglNLb1XBtSZIkSXlUlZaPjZZSegRY75iRlNJ4YHxOAsJuV5IkSVKurDf5iIg5wH+nlD6OiBeAtK66KaXdqju4XLDblSRJkpQbG2r5uBv4sszrdSYfkiTVJSUlJUycOJE33niDCy+8kBYtWjBz5kzatm3Ltttum+/wJKkgrTf5SCmNKfP6ghqPJg/sdiVJxWfWrFl897vfZdttt+XFF1/kzDPPpEWLFjzwwAO8+uqr3HrrrfkOUZIKUqXX+YiIhyNiywqON4uIh6s1qhxynQ9JKj6jRo1ixIgRPPfcczRs2LD0+Pe+9z1mzpyZx8gkqbBVZZHB/YAGFRzfjMwaIJIk1QmzZs3imGOOWet4mzZtKCkpyUNEklQcNjjbVUR0L7O7W0QsLrO/KfA9YEF1B5YrdruSpOLTqFEjPv7447WOv/zyy7Rq1SoPEUlScahMy8czwNNkBptPze6v3p4EzgZ+XVMB1jS7XUlS8Tn00EMZM2YMX36ZmVMlInjrrbc466yzGDRoUJ6jk6TCVZnkY1tgOzLrc3wnu796awc0SyndUGMRSpJUzcaNG8fixYtp2bIlS5cuZd9996VLly5sueWWXHTRRfkOT5IK1ga7XZVZXbwq40MkSaq1mjVrxowZM3j44Yd59tlnWbVqFd27d6dfv375Dk2SClqVVjiPiP8C+gCtKJeMpJQur8a4JEmqcX379qVv3775DkOSikalk4+IOAq4Afga+JA1FxxMQJ1MPhxwLknF6bnnnmPatGl88MEHrFq1ao2ySy+9NE9RSVJhq0rLx6+By4BfpZRW1lA8OZdSmgxM7tGjx7B8xyJJyo1LL72U0aNH07FjR1q3bk1ElJaVfS1Jql5VST5aA9cVUuIhSSpOv//97/nzn//M8ccfn+9QJKmoVGUQ+RRgr5oKRJKkXFm1ahXf/e538x2GJBWdqrR8PAD8NiK6Ai8AK8oWppTuqc7AJEmqKSeeeCI33ngjY8eOzXcoklRUqpJ8/CX785cVlCUyq53XOQ44l6Tic/7553PQQQexxx57sMsuu1C/fv01ym+4weWrJKkmVLrbVUppk/VsdTLxAFc4l6RidM455zB16lTq1avHxx9/zIcffrjGJkmqGVVa50OSpEIwfvx4br31VgYPHpzvUCSpqFRlnY/T11fuIoOSpLqiUaNG7LHHHvkOQ5KKTlVaPk4tt18faAMsAz6gji4yKEkqPqeddhpXXHEFV111let6SFIOVTr5SCltW/5YRLQGbgSurc6gJEmqSY899hjTp0/n//7v/9h5553XGnA+adKkPEUmSYVto8Z8pJRKIuIc4A7gb9UTkiRJNatFixYcdthh+Q5DkopOdQw434TM6ueSJNUJN954Y75DkKSiVJUB5+W/IgoyYz5OBh6rzqByyXU+JEmSpNyoSsvHXeX2E/Ah8DBwRrVFlGMppcnA5B49egzLdyySpJqz22678eijj9K8eXN23XXX9Q40nzNnTg4jk6TiUZUB55VekFCSpNpm0KBBNGzYsPS1s1xJUu5VKvmIiPrADODolNIrNRuSJEnV7/zzzy99fcEFF+QvEEkqYpVqzUgprQC2JdPVSpKkOq1v37588sknax3/9NNP6du3b+4DkqQiUZWuVDcBjouQJNV5jzzyCF999dVax5cvX85jj9XZOVQkqdaryoDzJsBREdEfmAV8UbYwpfTz6gxMkqTq9uyzz5a+njNnDltttVXp/sqVK7n//vtp165dPkKTpKJQleRjJ2D1U7tzubJa1x0rIhoD/wbuTCmNync8kqT869GjBxFBRDBgwIC1yhs1asQf//jHPEQmScWhKrNd7V+TgdSAc4An8h2EJKn2mDdvHiklOnfuzFNPPUXLli1Lyxo0aECrVq3YdNNN8xihJBW26ljhvNaJiO2BHYHJwC55DkeSVEt07NgRgFWrVuU5EkkqTjlNPiKiDzAK2BNoCwxNKU0oV+ck4Ewyq6e/CIxMKVV19N+47Dn23tiYJUmF6d1332X69Ol88MEHayUjp59+ep6ikqTCluuWj6bAXODm7LaGiBgMXAmcRGZdkZOA+yJi55TS/Gyd2VQc94CU0sKIOBR4NaX0akSYfEiS1nLLLbdw7LHHUq9ePVq2bLnGgoMRYfIhSTUkp8lHSmkKMAUgIiZUUOV0YEJK6drs/qkRcQBwInB29hzdNnCZnsCPIuJ/yCQ79SPi05TSrzf+DiRJheC8887jjDPO4MILL3SMhyTlUFXW+ahREdGATHesqeWKplKF7lMppbNTSu1TSp3IdPG6dl2JR0QMj4hnIuKZDz/88BtGLkmqa0pKSjjuuONMPCQpx2pN8gG0ADYFSsodLwG2qYkLppSuSSn1SCn1KDvjiSSpsB100EE8+eST+Q5DkopOQc52tVr5wewViYiBwMAuXbrUfECSpFqhf//+nHXWWbz44ovsuuuu1K9ff43yww47LE+RSVJhq03JxyJgJdC63PHWwPs1ddGU0mRgco8ePYbV1DUkSbXL8ccfD8DFF1+8VllEsHLlylyHJElFodZ0u0opfQXMAvqXK+oP/KumrhsRAyPimiVLltTUJSRJtcyqVavWuZl4SFLNyWnyERFNI6JbRHTLXrtDdr9DtsrlwJCIOC4idoqIK8msB3J1TcWUUpqcUhq+xRZb1NQlJEmSJJH7blc9gGll9sdkt5uAISmlv0bE1sC5ZBYZnAsclFJ6O8dxSpIK2OWXX77ectf5kKSaket1Ph4BYgN1xgPjcxIQDjiXpGL0xz/+cY39FStW8N5779GoUSNatWpl8iFJNaQ2DTjPCwecS1LxmTdv3lrHSkpKGDp0KMOG+c+BJNWUWjPgXJKkfGrdujVjx47lF7/4Rb5DkaSCVfTJh7NdSZJWW7VqFSUl5de6lSRVF7td2e1KkorOPffcs8Z+Son33nuPq666it69e+cpKkkqfEWffEiSis/hhx++xn5E0LJlS/r27ctll12Wp6gkqfCZfEiSis6qVavyHYIkFSXHfDjmQ5KKyooVK9hrr7145ZVX8h2KJBWdok8+XOFckopL/fr1mTdvHhHrXXZKklQDij75kCQVn2OOOYZrr70232FIUtFxzIckqeh88cUX3HLLLTzwwAPsueeeNGnSZI3yP/zhD3mKTJIKW9EnHxExEBjYpUuXfIciScqRf//733Tv3h2AN998c40yu2NJUs0p+uTDdT4kqfhMmzYt3yFIUlFyzIckSZKknDD5kCRJkpQTJh+SJEmScqLokw8XGZQkSZJyo+iTDxcZlCRJknKj6JMPSZIkSblh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScqLokw/X+ZAkSZJyo+iTD9f5kCRJknKj6JMPSZIkSblh8iFJkiQpJ0w+JEmSJOWEyYckSZKknDD5kCRJkpQTJh+SJEmScqJevgOoCRHxFvApsAr4OKW0f34jkiRJklSQyUfW3imlz/MdhCRJkqQMu11JkiRJyomcJh8R0SciJkXEgohIETGkgjonRcS8iFgeEbMiovc3uFQCHo2IpyPiqI0OXJIkSdJGy3W3q6bAXODm7LaGiBgMXAmcBMzI/rwvInZOKc3P1plNxXEPSCktzL7eN6W0ICLaAA9GxAsppTnVfjeSJEmSKi2nyUdKaQowBSAiJlRQ5XRgQkrp2uz+qRFxAHAicHb2HN0qcZ0F2Z/vRcQUoDtg8iFJkiTlUa0Z8xERDYA9ganliqYCe1fhPE0iYvPs66ZAX+DFddQdHhHPRMQzH3744TcLXJIkSVKl1JrkA2gBbAqUlDteAmxThfO0BmZExPPAE8DNKaWnK6qYUrompdQjpdSjZcuW3yRmSZIkSZVUcFPtppTeBHavbP2IGAgM7NKlS80FJUmSJKlWtXwsAlaSabkoqzXwfk1dNKU0OaU0fIsttqipS0iSJEmiFiUfKaWvgFlA/3JF/YF/1dR1I2JgRFyzZMmSmrqEJEmSJHK/zkfTiOgWEd2y1+6Q3e+QrXI5MCQijouInSLiSqAtcHVNxWTLhyRJkpQbuW756AE8l90aAWOyr38NkFL6KzASOBeYDewLHJRSerumArLlQ5IkScqNXK/z8QgQG6gzHhifk4Ay15sMTO7Ro8ewXF1TksqL0bV/uu90ibMCSpI2Tq0Z8yFJkiSpsBXcVLtV5VS7KjR+gy5Jkmqrok8+7Ha1bv4RK0mSpOpktytJkiRJOWHyIUmSJCknij75cKpdSZIkKTeKPvlwkUFJkiQpN4o++ZAkSZKUGyYfkiRJknKi6JMPx3xIkiRJuVH0yYdjPiRJkqTcKPrkQ5IkSVJumHxIkiRJygmTD0mSJEk5YfIhSZIkKSeKPvlwtitJkiQpN4o++XC2K0mSJCk3ij75kCRJkpQbJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5UfTJh1PtSpIkSblR9MmHU+1KkiRJuVH0yYckSZKk3DD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5UZDJR0RsGxHTIuKliHghIprkOyZJkiSp2NXLdwA1ZAJwbkrpsYjYCvgyz/FIkiRJRa/gko+I6AqsSCk9BpBSWpznkCRJkiSR425XEdEnIiZFxIKISBExpII6J0XEvIhYHhGzIqJ3FS+zPfB5REyOiGcj4pfVErwkSZKkjZLrlo+mwFzg5uy2hogYDFwJnATMyP68LyJ2TinNz9aZTcVxD0gpLcyW9Qa6AR8A/4yIp1NKD1T73UiSJEmqtJwmHymlKcAUgIiYUEGV04EJKaVrs/unRsQBwInA2dlzdNvAZRYAz6SU3sleZwqZRMTkQ5IkScqjSCnl58IRnwOnpJQmZPcbAEuBH6eU7ixT7ypgl5TSf1fyvPWAp4G+wBLgH8BfUkr3VlB3ODA8u7sD8Mo3vqHC1AJYlO8gVGV+bnWTn9vaOqaUWuY7iLooIoanlK7JdxyqGj+3usnPrWpq04DzFsCmQEm54yVAv8qeJKX0dXacx3QggKkVJR7ZutcA/seyDhHxTEqpR77jUNX4udVNfm6qZsPx37e6yM+tbvJzq4LalHxUm5TSfcB9+Y5DkiRJ0n/UpkUGFwErgdbljrcG3s99OJIkSZKqU61JPlJKXwGzgP7livoD/8p9RMImxLrKz61u8nNTdfK/p7rJz61u8nOrgpwOOI+IpkCX7O6/gEuAScDilNL87FS7E8lMsTsTOAH4GdA1pfR2zgKVJEmSVO1ynXzsB0yroOimlNKQbJ2TgF8AbcisCXJaSml6jkKUJEmSVEPyNtWuJEmSpOJSa8Z8qHaIiD4RMSkiFkREiogh+Y5Ja9rQZxQZF0TEwohYFhGPRETXPIVbtKrjc4qI5hExMSKWZLeJEbFlLu9DdYfP77rBZ3jd4DO85ph8qLymZLq7jQCW5TkWVWxDn9EvgDOAU4FvAx8AD0TE5jmLUFA9n9OtQHfggOzWncy4OKkiPr/rBp/hdYPP8BpityutU/lV6FX7lP+MIiKAhcCfUkpjs8cakXkojkop/SVfsRazb/I5RcROwEvAvimlmdk6+wKPATumlF7J/Z2orvD5XTf4DK8bfIZXL1s+pMKyLbANMHX1gZTSMmA6sHe+gtJaKvM59QI+Z82pxmcCX+BnKRUqn+F1g8/wjWDyIRWWbbI/S8odLylTpvyrzOe0DfBhKtM8nX39AX6WUqHyGV43+AzfCCYfkiRJknLC5EMqLO9nf7Yud7x1mTLlX2U+p/eBltm+xUBpP+NW+FlKhcpneN3gM3wjmHxIhWUemYda/9UHImIzoDdr9jtVflXmc3qczGwrvcq8rxfQBD9LqVD5DK8bfIZvhHr5DkC1S0Q0BbpkdzcBOkREN2BxSml+3gJTqQ19RhFxBfDLiHgZeBU4l8ygt1vzEG7R2tjPKaX074j4J/CXiBiePc9fgHuLeZYUrZvP77rBZ3jd4DO85jjVrtYQEfsB0yoouimlNCSnwahCG/qMss265wPHA82BJ4GTU0pzcxakquVziojmwB+BQ7KHJpGZ7vGTmotcdZXP77rBZ3jd4DO85ph8SJIkScoJx3xIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJww+ZAkSZKUEyYfUh5FxDYRMTUivoiIGpn3OiL2i4gUES1q4vySVKx8hktVZ/IhVUJEtIyIryKiSUTUz/5D06EaTj0KaAt0A9pUw/kkSeX4DJdqj3r5DkCqI3oBz6eUvoiIvYDFKaX51XDeLsCslNJr1XAuSVLFfIZLtYQtH1Ll7A3MzL7et8zr9YqI4yPi9ew3bq9HxLAyZW8BhwJHZ5vUJ6znPAdFxJMRsSwiPoqIyRGxWbaseUTcFBEfZ8sfjIiu6znXkIj4vNyxNZr1V9eJiAMj4uWIWBoRkyJii4g4PCJei4glETExIhqVOc8jETE+Ii6OiEUR8UFEjIuITcrUOSwi5mRjXRwRj0ZE68r8PiXpG/IZ7jNctYQtH9I6ZJvk52R3GwMrI2II0AhIEfEJcGtK6aR1vP+HwJ+A04CpwPeA8RHxfkppMvBt4FZgMTACWLaO8xwATAIuAYaS+f92AP/58mACsAOZfwQ/BsYC/4yIb6WUKjxnJTUEzgCOAhoAd2e3ZcAgYGvgHuAk4LIy7zsKuJLMP/bdsvc4C7gtIrYBbgfOzp6rKdBzI2KUpAr5DPcZrloqpeTm5lbBRuYfiE7AbsBX2Z/bAZ8BfbJlLdbz/pnADeWOTQBmlNm/F5iwgThmArevo2x7IAF9yhzbAlgCHJfd3y9bp0V2fwjwebnzVFQnATuUqTMOWFn2nrP3c2+Z/UeAx8ud+wHguuzr7tnzdsz35+vm5lbYm89wn+FutXOz25W0Dimlr1NKbwE7Ak+nlOYA2wAlKaXpKaW3UkqL1nOKnVi7aX8GsHMVQ9kDeGg911gFPF4m7iXAC9/gOuV9mVJ6pcx+CfB+uXsuAVqVe9+ccvsLy9R5HngQmBsRd0fEiRHRciPjlKS1+Az3Ga7ayW5X0jpExItAR6A+sEm2j209oF729dsppXX2y12PGpmOsQrXWQVEuWP1K6j3dQXnW1HBsfJfYqyzTkppZUQMINNMPwD4GfCbiPjvlNLz64hXkqrMZ7jPcNVOtnxI63YQmf6u7wM/yb6eC4zMvj5oA+//N7BPuWP7Ai9VMY7ngO+u5xqbkJnJBYCIaAbsup7rfAg0ztZbrVsVY/rGUsbjKaUxZPpMLwQG5+r6koqGz/Aa4DNcG8uWD2kdUkpvZwfXtQb+Qebbn67A3Sml9ypxit8Bd0bELDKDFQ8gM5DvsCqGMhaYHBGvkxn4F2S+cfpLSum1iPgH8JeIGA58kq3/abZuRZ4EviDzbdXvgd3JDDiscRHRE+gH3E+muX8PoD1V/8dcktbLZ3j18xmu6mDLh7R++5HpK7wc+A7wbiX/0SKl9HfgVDIzpbxEZjaUk1JmlpRKSylNAX4IHEjmG7RHgf3JNL1DZvaUp8jMpvIUmVldDkjrmCUlpbSYzD+g/cn0Kx4O/KoqMW2EJWS+SbwXeI3MDCsXppT+N0fXl1Rc9sNneHXyGa6NFinlquuiJEmSpGJmy4ckSZKknDD5kCRJkpQTJh+SJEmScsLkQ5IkSVJOmHxIkiRJygmTD0mSJEk5YfIhSZIkKSdMPiRJkiTlhMmHJEmSpJz4f29nzokOepa2AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import CyclicDayOfWeek\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [CyclicDayOfWeek(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CyclicDayOfWeek\")" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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vEhmCsH/JrO2x5+/6zVTSuOAcb169Rq2zsKSJOVASonRo0dzzDHH0Lx583LnBg4cyFVXXUWXLl3o3r07r7zyCtdddx2DBw8uLfOrX/2Ko48+mv33358+ffrw1FNPce+99/L3v/8dgBUrVnDCCSfwwx/+kOOOy0yI1a9fP0488USGDh3K9OnTadq0ac7uV1LxqFNT7UbEAWQGi1d0R0ppSLbMCOBXZOY+fx34ZUpp0vpe2wHnktZk5cqVzJs3jy+//JJvv/023+EUjAYNGrDpppvSunVrNthg9Yb4iJiWUupVharqzi+yGvLUU0/Rp08fXnjhBfbYY49y5xYtWsQFF1zAQw89xKeffkqHDh045phjuPDCC8uN1xgzZgxXXHEFH330Edtssw3nnntuaSvKpZdeyo033sjrr79Omzb/mVDsq6++Yuedd2bgwIHccMMNublZSYVojbNd1ankIx/KDDgf9t577+U7HEl10KxZs4gI2rVrR6NGjYhY4zNVVZRSYvny5ZSUlJBSYsstV18rtpiTD9U/nTt3ZubM1SdoGzBgAP/85z/57W9/y8UXX1zuXLt27Zg79z/DVocMGcIdd9xRrsyee+7J888/D8DcuXPZcccdOffccznrrP8sTv/GG2/Qs2dPxowZwzHHuDi96oSCmGq3VtjtStK6fP3112y33XaV/nVe301EsOGGG7L55puvNjZBqo9eeumlci2jn3zyCT179uToo48uPbbddtsxceLE0v2KY3cA+vbty9ixY0v3N9xww9LX7du356abbmLIkCH84Ac/oFu3bixfvpzBgwfz4x//2MRD9ULRJx+SVBUmHrXDf1cVirLd1wBuvfVWWrRoUS75aNiwIe3bt19rPY0bN15rmUGDBvHQQw8xePBgnn/+eS699FI++eQTHn/88fW7ASlHiv6p72xXkiSpJqWUuPXWW/npT39KkyZNSo9/8MEHdOzYkS5dunDMMcfwwQcfrPbeyZMn07ZtW7bddluGDRvGp59+ulqZUaNGMXv2bI477jiuvPJKRo8eTatWrWr1nqSaUvTJh+t8SFLVdO7cmSeeeCLfYUh1XmUr0++5556MGTOGf/3rX9xyyy3MnTuXffbZh88//7y0TP/+/bnzzjv597//zbXXXsuLL75Inz59+Oabb8rVv2pl+vvuu4+f/OQnrkyvesVuV5L0HTzfe+tarX+vSe/Xav2Sak9lK9P/4Ac/KFdmr732YquttuKOO+4oXYm+7JiNnXbaiZ49e9KpUyf++c9/csQRR5Sec2V61WdFn3yUme0q36FIkuqB+PVn+Q6hIKSr2qy7UD20amX6m266aa3lmjdvTvfu3VnbTJsdO3bke9/73mplyq5Mf8ghh3Deeedx7bXX1kj8Um2z25XdriTVc507d+bKK6+kW7dutGzZkqFDh7J06VK++OILDj30UNq0aUPLli059NBD+fjjj0vfd8ABB3DBBRew7777svHGG9OvXz/mzZtXen7s2LF06tSJzTbbjMsvv7zcNV988UX23ntvNt10Uzp06MCpp57KsmXLgEx/91/+8pe0bduWFi1asNNOO/H666/n5h9DyrM1rUxf0dKlS3n77bfp0KHDGsvMmzeP2bNnlyvjyvSq74o++ZCkQnDXXXfx2GOP8f777/Puu+9y2WWXsXLlSoYOHcrMmTOZNWsWTZo04dRTTy33vrvvvpvbb7+dTz/9lGXLlnHNNdcA8Oabb3LyySczduxY5syZw+eff14ucWnQoAG///3vmTdvHs899xz//ve/GTVqFAATJkxg0qRJvPvuuyxYsID77ruPzTbbLHf/GFKerG1l+pEjR/L0008zY8YMXnjhBY466ii+/vprTjjhBCCzwOPIkSN57rnn+PDDD5k4cSIDBw6kbdu2HH744cC6V6ZfvHhxbm9Y+g5MPiSpAJx66qlsscUWtGrVivPOO4977rmHzTbbjCOPPJKmTZuy8cYbc9555/H000+Xe9/QoUPZdtttadKkCUcffTTTp08H4P777+fQQw+ld+/eNG7cmEsvvbTctLg9e/Zkr732omHDhnTu3JmTTjqptO5GjRqxaNEi3n77bVJK7LDDDmv9665UKCZOnMh7771XbqD5Kh9//DE/+clP2G677TjiiCNo3Lgxzz//PJ06dQIyCf1rr73GYYcdxrbbbssJJ5zAdtttx3PPPcfGG28MwJVXXsnMmTP505/+VK7ua665hhUrVnDuuefW/k1K68nkQ5IKwBZbbFH6ulOnTsyZM4fFixdz0kkn0alTJ1q0aEHv3r358ssvyy2EVnY9gaZNm/LVV18BMGfOnHJ1NmvWrFzrxbvvvsuhhx5K+/btadGiBb/5zW9Ku2z16dOHU089lVNOOYW2bdsyfPhwFi5cWGv3LtUVBx54ICkl9thjj9XO3XvvvcyZM4dly5Yxe/ZsHnjgAbp161Z6vkmTJjz22GOlrZAzZ85kzJgx5f4/vOCCCygpKVltTZHmzZvzwQcfcMMNN9TezRWozp07ExGrbT/84Q+BTMK3++6706JFC9q0acPAgQNX60Z6wQUXsP3229OsWTNatmzJQQcdxLPPPlt6fu7cubRu3Xq1cTlvvPEGG220Effee2/t32gdUvTJh+t8SCoEH330UenrWbNm0bFjR6699lreeecdXnjhBRYuXMikSZOATNeQdenQoUO5OhcvXlxuStCTTz6Z7bffnvfee4+FCxdyxRVXlKv3F7/4BdOmTePNN9/k3Xff5Xe/+11N3KYk1aiXXnqJTz75pHR7+eWXiYjSxSEnTpzIiBEjePbZZ3nyySdp2LAhffv2Zf78+aV1bLfddtx000289tprTJ48mS5dutC/f39KSkqA/6xMf/755/Pmm28CFPXK9EWffDjgXFIhuOmmm/j444+ZP38+l19+OYMGDWLRokU0adKETTfdlPnz53PxxRdXub6jjjqKf/zjH0yePJlly5Zx4YUXsnLlytLzixYtokWLFjRv3py33367XDeQl156iRdeeIHly5fTrFkzNtpoI1cyl1QntWnThvbt25du48ePL7cy/WOPPcbQoUPZcccd2WmnnRg7diyfffZZuQH+P/3pTznooIPYaqut6N69O9dddx2LFi0q7cYKmZXpDzvsMAYPHsyKFStKV6ZfNVaumPjbQJIKwLHHHku/fv3Yaqut2HrrrTn//PM544wzWLJkCa1bt2avvfaif//+Va6ve/fu3HTTTRx77LF06NCBli1b8r3vfa/0/DXXXMPdd9/NxhtvzLBhwxg0aFDpuYULFzJs2DBatmxZOlvW2WefXaP3K0k1bU0r05e1aNEiVq5cScuWLSs9v2zZMm6++WZatGhBjx49yp1zZfqMqErzezHo1atXmjp1ar7DkFQHvfXWW+ywww75DmONOnfuzOjRo+nbt2++Q/lO1vTvGxHTUkq9qlBFTn+Ruc5HzSjUdT5Uf02YMIFDDjmE6dOnl1sgsqyjjz6a9957j6lTp9KgQYPS4//4xz845phjWLx4MR06dOChhx6qdOzPmDFjGDp0KMcffzx33nlnrd1LHRBrOmHLhyRJkopeZSvTl3XmmWcyefJkHnjggXKJB2QmG5g+fTrPPvss/fv35+ijj+aTTz4pV6aylemLkSucu8K5JEkFzxarmlGoLVbrWpn+l7/8Jffeey9PPfUUW2211WrnmzVrRteuXenatSt77bUX22yzDaNHj+aCCy4oLePK9BlF3/LhgHNJ9d2HH35Yb7tcSVJdsLaV6U8//XTuuecennzySbbffvsq1bdy5Uq++eab0n1Xpv+Pok8+JEmSVLzWtjL9Kaecwu23387dd99Ny5YtmTt3LnPnzi1dE2nhwoWcf/75vPDCC8yaNYtp06bxs5/9jI8//rh0xixXpi/P5EOSJElFa20r048aNYpFixZx0EEH0aFDh9LtmmuuAaBhw4a88cYbHH744WyzzTYMHDiQzz//nEmTJrHzzjsDrkxfUdGP+ZAkSVLxWrUyfWXWNSts06ZNeeihh9Za5oILLig39mOVVSvTFxtbPiRJkiTlhMmHJEmSpJww+ZAkSZKUE0U/5sN1PiR9F7W9ZkChzqUvSSpuRd/y4TofkiRJUm4UfcuHJNV3nTt35tRTT+XOO+9k5syZ9O/fnzvuuIN7772X0aNHM3ny5NKyEcF7771H165dGTJkCE2bNmXGjBk888wz7LLLLjzwwANcddVV3HHHHbRr14577rmHXXfdtfQ6J510EmPHjuWTTz7hxz/+MX/605/YaKON2HHHHbnyyisZOHAgAMuXL6dDhw48/vjjpe+XpOpyZfqaUZda04u+5UOSCsF9993Hv/71L2bMmMGrr77KmDFjqvy+yy67jHnz5tG4cWP23ntvdtttN+bNm8dRRx3FmWeeWa78XXfdxWOPPcb777/Pu+++y2WXXQbA4MGD+Z//+Z/ScuPHj6dDhw4mHpKkckw+JKkA/OIXv6Bjx460atWKgQMHMn369Cq97/DDD6dnz55stNFGHH744Wy00UYMHjyYBg0aMGjQIF555ZVy5U899VS22GILWrVqxXnnncc999wDwE9/+lPGjx/PwoULARg7dizHH398jd6jJKn+M/mQpALQvn370tdNmzblq6++qtL72rVrV/q6SZMmq+1XrGeLLbYofd2pUyfmzJkDQMeOHdl333154IEH+PLLL3n00Uc57rjjvtO9SJIKl2M+JKlANWvWjMWLF5fuz507d73r/Oijj0pfz5o1i44dO5bun3DCCYwePZoVK1aw9957s/nm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woULAXj88cc577zz8hydJBWu6iQfp5BZaLANcFRKaX72+G7APTUdWK5ExMCIuHnBggX5DkWSlCMjR47k9NNP55VXXqFx48alxw855BCmTJmSx8gkqbBVudtVSmkhcFolxy+q0YhyzDEfklR8pk2bVumsVh06dKCkpCQPEUlScVhry0dEbFydyqpbXpKkfGjSpAlffLH6+rlvv/02bdu2zUNEklQc1tXt6r2IOD8ivremAhGxQUT8ICIeJ9M1S5KkOu2www7j4osv5ptvvgEgIvjwww8555xzOPLII/McnSQVrnV1u9ofuBz4IDul7lRgDrAUaAl0A/YClgBXALfUXqiSJNWMa665hgEDBtCmTRsWL17MfvvtR0lJCfvuuy+XXXZZvsOTpIK11uQjpfQecHREbEFmUcH9gT2AJsA84BXgZmB8SmllLccqSVKNaNGiBZMnT+bJJ5/k5ZdfZuXKley222707ds336FJUkGr0oDzlNJHZFYxv7Z2w8k9VziXpOLVp08f+vTpk+8wJKloVGeq3YKUUhqXUhq+ySab5DsUSVIOjRo1iu7du9O0aVM++OADAK666iruu+++PEcmSYWr6JMPSVLxuf7667nssssYPnw4KaXS45tvvjk33nhjHiOTpMJm8iFJKjp//vOfueWWWzj99NNp2PA/PZB322033njjjTxGJkmFzeRDklR0Zs6cyY477rja8UaNGrFkyZI8RCRJxcHkQ5JUdLbaaitefvnl1Y6PHz+ebt265SEiSSoOVZrtapWIaAccD2wNXJBSmhcR+wJzUkozaiNASZJq2siRIzn11FNZvHgxKSWee+45xo4dy9VXX81tt92W7/AkqWBVOfmIiJ7Av4EZQHfgd2TW+jgY2BY4tjYClCSppg0dOpQVK1bwm9/8hsWLF3P88cfTsWNH/vCHPzBo0KB8hydJBas6LR/XADeklC6KiEVljj8GDK3ZsHLHdT4kqTgNGzaMYcOGMW/ePFauXEnbtm3zHZIkFbzqjPnoCdxRyfFPgHY1E07uuc6HJBWv999/n+eff54XX3yxdK0PSVLtqU7LxxKgZSXHtwc+rZlwJEmqfZ9//jk///nPeeSRR9hgg8zf4VJKHHroodx2221sttlmeY5QkgpTdVo+HgYuiojG2f0UEZ2B/wc8UNOBSZJUW0488UT+7//+j2eeeYalS5ey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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import CyclicDayOfMonth\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [CyclicDayOfMonth(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CyclicDayOfMonth\")" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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atq1awfAQw89xNNPP535vosvvjjzdf369bntttv48MMPGThwIGXLlmXPnj2sWLGCSy65RDOFSVx44IEHGDFiRLZjSUlJbN68mUOHDnHvvffy3nvvsWbNGqpUqcLll1/OI488cswCm4sXL2bYsGEsXLgQM+P8889n6tSpJCQksHz5cpKTk5k8eXK2/9uzZs3iyiuvZN68ebRu3TqQ+w2KujkWjeLUzVEtHyIiMeBo4gFQr149Nm3axP79+7ntttuoV68eVapUoV27duzcuZMjR45klq1Vq1bm64oVK7J3714ANm3alK3OSpUqZWu9WLVqFVdffTW1atWiSpUq/OlPf8rsstW+fXvuuOMObr/9dmrWrEmfPn3YvXt3xO5dpLg455xz+PHHHzO3L7/8EoD9+/ezdOlShg0bxtKlS3nnnXf44Ycf6Ny5M4cPH858/6effkqnTp247LLLWLRoESkpKQwePJiyZcsC0LRpU0aMGMHvf/97UlNTAdi1axe9evVi0KBBMZd4SGyK++TDzLqY2fhdu3ZFOxQRkZP2ww8/ZL5ev349derU4bHHHmPlypV8+umn7N69m/nz5wOhMRknUrt27Wx17t+/n23btmXu9+3bl3PPPZfVq1eze/duRo8ena3eP/zhD6SkpPD111+zatUq/vKXvxTFbYoUa2XKlKFWrVqZW2Ji6K/NVatWZebMmXTr1o1zzjmHSy65hOeee45vvvmGb775JvP9d955J7fffjvDhg2jadOmnH322Vx33XVkHZc6ZMgQzj77bPr06QNA//79qV69Og8++GCwNytykuI++dCAcxGJBc888wwbNmxg+/btjBo1im7durFnzx4qVKhAtWrV2L59+zFdQo6na9euvPvuu3z88cccPHiQ+++/n4yMjMzze/bsoUqVKlSuXJkVK1bw7LPPZp777LPP+PTTTzl06BCVKlXilFNO0UrmEhe+++476tSpQ4MGDfjd737Hd999l2fZo62B1atXB2DLli0sXLiQ2rVr06ZNG2rWrEnbtm2ZPXt2tveVKlWKl19+mVmzZtGjRw9effVVXnnlFcqVKxe5GxMpQvppICISA2644QY6depEw4YNOfPMM7n33nsZOHAg6enpJCQkcOmll9K5c+d819ekSROeeeYZbrjhBmrXrk316tX5n//5n8zzY8aMYcqUKZx66qn07t2bbt26ZZ7bvXs3vXv3pnr16pmzZQ0ZMqRI71ekuGnRogUTJ07k/fffZ8KECWzevJlWrVplazE86uDBgwwaNIguXbpk/r86mqgMHz6cW265hQ8++IC2bdtyxRVX8J///Cfb+xs1asSQIUOYMmUKQ4cOpVmzZhG/P5GiYvlpfo8HycnJvmTJkmiHISLF0DfffFOsB03Xr1+f559/ng4dOkQ7lJOS1/fXzFLcPTkfVQT6g0wDYItGcRoAGwl79+6lYcOGDB06lLvuuivz+OHDh7nhhhv46quvmD9/fuZYqk8++YTWrVtzzz33MHr06MzyLVu2pFmzZtlaF9PT02nWrBkbNmygRYsWzJ49GzML7uYCpP9vRSMK/9/y/Aeplg8RERGRIla5cmWaNGnC6tWrM48dPnyY7t27s2zZMmbPnp1tEofatWsD0Lhx42z1NG7cmPXr12c7dvfdd3P48GEWL17MkiVLss1EJ1LcxX3yoQHnIiIiUtQOHDjAihUrMpOKQ4cO0a1bN5YtW8bcuXOzzTQHoRbMOnXqsHLlymzHV61aRb169TL3586dy7hx45g4cSJNmjThscceY+jQoaxZsybyNyVSBOI++dCAcxEp6datW1diu1yJxIrBgwfz4YcfsnbtWj799FO6du3Kvn37uPnmmzl8+DC/+c1vWLRoEf/4xz8wMzZv3szmzZtJT08HwMwYMmQITz75JG+88Qbffvsto0ePZtGiRdx2221AaKKHXr16MWDAANq2bQtA7969adu2Lb169co2KYRIcaVFBkVEREQKacOGDXTv3p20tDQSExO59NJLWbRoEfXq1WPdunW88847QPYFOgFeeuklevbsCcDAgQP56aefGDRoENu2baNJkya89957XHjhhZnnK1asyKhRo7LV8cILL9C0aVPGjh3LnXfeGfmbFSkEDTgP04BzEclLcR9wXtJpwHl8ivUB51I09P+taGjAuYiIiIiIxB0lHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEoi4n+3KzLoAXRo1ahTtUESkBIn0IEgNxhURkVgU98mHu08DpiUnJ/eOdiwiIiISGZo1qWjoDyNSWOp2JSJSwtWvX58xY8ZwwQUXULVqVbp168aBAweYOHEibdq0yVbWzPj2228B6NmzJ/369ePKK6+kcuXKtG7dms2bNzNw4ECqV6/Oueeey+eff57tOg8//DCNGzemevXq9OrViwMHDgDQtGlTpk2blln20KFDJCQkZHu/iIiIkg8RkRjw+uuv8/7777N27VqWLVvGxIkT8/2+kSNHkpaWRvny5WnZsiXNmzcnLS2Nrl27ctddd2UrP3nyZD744APWrFnDqlWrGDlyJAA33XQTf//73zPLTZ8+ndq1a3PRRRcV2T2KiEjJp+RDRCQG/OEPf6BOnTqcdtppdOnShS+++CJf77v22mu5+OKLOeWUU7j22ms55ZRTuOmmmyhdujTdunU7puXijjvu4PTTT+e0005j2LBh/OMf/wDgf//3f5k+fTq7d+8GYNKkSdx4441Feo8iIlLyKfkQEYkBtWrVynxdsWJF9u7dm6/3JSUlZb6uUKHCMfs56zn99NMzX9erV49NmzYBUKdOHVq3bs1bb73Fzp07ee+99+jRo8dJ3YuIiMSuuB9wLiISqypVqsT+/fsz9zdv3lzoOn/44YfM1+vXr6dOnTqZ+zfffDPPP/88hw8fpmXLltStW7fQ1xMRkdiilg8RkRh14YUX8tVXX/HFF19w4MABHnjggULX+cwzz7Bhwwa2b9/OqFGj6NatW+a5X//61yxdupSxY8dy0003FfpaIiISe2I2+TCzf5rZDjN7M9qxiIhEw9lnn839999Phw4dOOuss46Z+epk3HDDDXTq1ImGDRty5plncu+992aeq1ChAtdffz1r167luuuuK/S1REQk9pi7RzuGiDCzy4BTgZvdveuJyicnJ/uSJUsiHZaIlEDffPMN5513XrTDiLr69evz/PPP06FDhzzLPPjgg6xatSrbzFcnktf318xS3D05H1UE+oNM60UUjaDXi9DnVjT0uZVMUVifxfI6EbMtH+4+D9gT7ThEROLF9u3beeGFF+jTp0+0QxERkWIq8OTDzNqZ2VQz22hmbmY9cynTz8zWmtkBM0sxs7ZBxykiIvk3YcIETj/9dK688kratWsX7XBERKSYisZsV5WB5cAr4S0bM+sGjAX6AR+Hv75nZo3dfX24zBfkHnsnd98UobhFROLaunXr8jzXu3dvevfuHVwwIiJSIgWefLj7dGA6gJlNzKXIXcBEd58Q3u9vZp2BvsA94TqaFUUsZtYH6ANwxhlnFEWVIiIiIiKSh2I15sPMygEXAzNynJoBtCrq67n7eHdPdvfkxMTAB+KISAkS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Q4f48ccfqVChAjVr1lTyISISIcVpwHlUaMC5iEj8Wbt27THHUlNT6dWrF71768eBiEikFJsB5yIiItGUlJTEqFGj+OMf/xjtUEREYlbcJx+a7UpERI7KyMggNTXnWrciIlJU1O1K3a5EROLO22+/nW3f3fnxxx955plnaNu2bZSiEhGJfXGffIiISPzp2rVrtn0zIzExkfbt2/PYY49FKSoRkdin5ENEROJORkZGtEMQEYlLGvOhMR8iInHl0KFDtGjRgpUrV0Y7FBGRuBP3yYdWOBcRiS9ly5Zl7dq1mB132SkREYmAuE8+REQk/tx8881MmDAh2mGIiMQdjfkQEZG4s2/fPiZPnszMmTO5+OKLqVSpUrbzTz75ZJQiExGJbXGffJhZF6BLo0aNoh2KiIgE5JtvvqF58+YAfPfdd9nOqTuWiEjkxH3yoXU+RETiz9y5c6MdgohIXNKYDxERERERCYSSDxERERERCYSSDxERERERCUTcJx9aZFBEREREJBhxn3xokUERERERkWDEffIhIiIiIiLBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBUPIhIiIiIiKBiPvkQ+t8iIiIiIgEI+6TD63zISIiIiISjLhPPkREREREJBhKPkREREREJBBKPkREREREJBBKPkREREREJBBKPkREREREJBBKPkREREREJBBloh1AJJjZOmA3kAHscPfLoxuRiIiIiIjEZPIR1srd90Y7CBERERERCVG3KxERERERCUSgyYeZtTOzqWa20czczHrmUqafma01swNmlmJmbU/iUg58aGafmVmPQgcuIiIiIiKFFnS3q8rAcuCV8JaNmXUDxgL9gI/DX98zs8buvj5c5gtyj7uTu28Kv27j7hvNrDYwy8y+dPdlRX43IiIiIiKSb4EmH+4+HZgOYGYTcylyFzDR3SeE9/ubWWegL3BPuI5m+bjOxvDXH81sOtAcUPIhIiIiIhJFxWbMh5mVAy4GZuQ4NQNoVYB6KpnZqeHXlYH2wFd5lO1jZkvMbMnWrVtPLnAREREREcmXYpN8AAlAaSA1x/FUoFYB6kkCPjaz/wCLgFfc/bPcCrr7eHdPdvfkxMTEk4lZRERERETyKeam2nX374AL81vezLoAXRo1ahS5oEREREREpFi1fKQBRwi1XGSVBGyO1EXdfZq796latWqkLiEiIiIiIhSj5MPdDwIpQMccpzoCn0TqumbWxczG79q1K1KXEBERERERgl/no7KZNTOzZuFrnxHePyNc5HGgp5ndambnmdlYoA7wt0jFpJYPEREREZFgBN3ykQx8Ht4qACPCrx8EcPfXgIHAvcAXQBvgKnf/PlIBqeVDRERERCQYQa/zMQ+wE5QZB4wLJKDQ9aYB05KTk3sHdU0RkZxsaPGf7tsf0ayAIiJSODE325VIvNMvsSIiIlJcFZsB59GiblciIiIiIsGI+5YPdbvKm/6CLiIiIiJFKe5bPkREREREJBhKPkREREREJBBxn3xozIeIiIiISDDiPvnQIoMiIiIiIsGI++RDRERERESCoeRDREREREQCEffJh8Z8iIiIiIgEI+6TD435EBEREREJRtwnHyIiIiIiEgwlHyIiIiIiEgglHyIiIiIiEgglHyIiIiIiEoi4Tz4025WIiIiISDDiPvnQbFciIiIiIsGI++RDRERERESCoeRDREREREQCoeRDREREREQCoeRDREREREQCoeRDREREREQCEffJh6baFREREREJRtwnH5pqV0REREQkGHGffIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCBiMvkwswZmNtfMvjazL82sUrRjEhERERGJd2WiHUCETATudfePzOw04KcoxyMiIiIiEvdiLvkwsybAIXf/CMDdt0c5JBERERERIeBuV2bWzsymmtlGM3Mz65lLmX5mttbMDphZipm1LeBlzgL2mtk0M1tqZn8qkuBFRERERKRQgm75qAwsB14Jb9mYWTdgLNAP+Dj89T0za+zu68NlviD3uDu5+6bwubZAM2AL8L6ZfebuM4v8bkREREREJN8CTT7cfTowHcDMJuZS5C5gortPCO/3N7POQF/gnnAdzU5wmY3AEnf/IXyd6YQSESUfIiIiIiJRZO4enQub7QXucPeJ4f1ywH6gu7u/kaXcM0BTd/95PustA3wGtAd2Ae8Az7n7u7mU7QP0Ce+eA6w86RuKTQlAWrSDkALT51Yy6XM7Vj13T4x2ECWRmfVx9/HRjkMKRp9byaTPrWCK04DzBKA0kJrjeCrQIb+VuPvh8DiP+YABM3JLPMJlxwP6x5IHM1vi7snRjkMKRp9byaTPTYpYH/Tz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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import CyclicMonthOfYear\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [CyclicMonthOfYear(columns = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CyclicMonthOfYear\")" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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vvtu7r33Xvbbbz8n01FDFqs60WiSD6A90ASoqHG8AhgIkFL6Ktsv8hEyXcouXd1MVyml64HrAcrLy9Nzzz2Xi7glSesgIt4tdAzSujrjjDNYtGgR2267LU2aNOGrr77i7LPPZsSIEXWuq127dlx88cUMHTqUI444gv322y8HEUv50ZiSj7WSUpoATFjb8hExGBjcq1ev3AUlSZJKyl/+8hf+9Kc/cdttt9GnTx9mzJjBCSecQM+ePfnZz35Wp7pWrFjBLbfcQsuWLXn22WdZunQpG220UY4il3KroQ04X515wHKgY43jHYEP17XSlNLElNLwtm3brk9skiRJlU477TROPfVUDj30ULbffnuOOOIITj75ZC6++OI613XllVfy4osv8uyzz/LZZ59x9tln5yBiKT8aTfKRUvqSzKKBNQdY7UNmpoh1EhGDI+L6BQsWrE94kiTlTI8ePYiIlbbvf//7ACxatIgTTzyR7t2706JFC3bbbTeeffbZyvcvXryYrbfempEjR1art6KigrKyMi655JK83k8pWLx4MU2aNKl2rEmTJqxYsaJO9bz66qucffbZXH311Wy77bbcdNNNXHXVVUydOrU+w5XypkF1u4qI1sDX/Z82ALaIiB2B+SmlWcAVwPiIeAaYCvyczNoef1jXa2ZnoZhYXl4+bH1ilyQpV5599lmWL19euf/BBx/Qt29fDjnkEACOOeYYXnjhBcaNG8fmm2/On//8ZwYOHMgrr7xC165dadmyJePGjaN///788Ic/5Dvf+U7l+7beemtOP/30gtxXMRs8eDCXXHIJPXv2pE+fPkyfPp0rrriCI488srLM/PnzmTVrFp9++ikAb775JptssgmdOnWiU6dOfPXVVxx11FF8//vf58c//jEAgwYN4phjjmHo0KHMmDGDli1bFuL2pHUWKTWcSUKyi+vUNtPDuJTS0dkyI4DTyUwz9xJwUkppyvpe2wHnklZlxYoVzJs3j08//bTaPwC1fpo0acImm2xC+/bt2WCDlRviI2JaSql8LapqOF9keTJmzBguu+wyPvjgAwA23nhj7rrrLg444IDKMn379uV73/seo0ePrjx25plnctttt/Hiiy9y1113MXLkSP71r3/huMf6t2jRIn79619zzz33MHfuXDp37syhhx7KueeeWzleY+zYsQwdOnSl95533nmcf/75XHjhhVxzzTW89NJLlJX9Z+K3zz77jB122IHBgwdz1VVX5e2epDpY5WxXDSr5KIQqA86HvfHGG4UOR1IDNGvWLCKCjh070qxZMyJW+UzVWkopsWzZMioqKkgpscUWK68Va/JRu5QSW221Ffvttx/XXHMNixYtok2bNvzjH/9g3333rSy3xx570LRpUx599NHKY19++SV9+/alZ8+ePPbYY1x88cXrNPuSJK3BKr8oG82Yj1xxwLmkNfn888/p2rUrG264oYlHPYkINtxwQ7p27crnn39e6HAalQceeICZM2cybFimt/DGG29Mv379GD16NLNnz2b58uX8+c9/5sknn6xsGfnahhtuyNVXX83EiRPZcccdOe644wpxC5JKWMknH5K0NmrrFqT15++17m644Qb+67/+i29961uVx8aPH88GG2zA5ptvTvPmzfnd737HYYcdVuvv96abbqJly5a8+uqrzJs3L5+hS5LJh7NdSZIai7lz53LvvfdWtnp8bauttuKxxx7js88+47333uOZZ55h2bJlbLnlltXK3XPPPdxxxx089thjdOvWzZYPSXlX8smH3a4kae306NGDBx98sNBhlLSxY8fSvHlzDjvssFrPt2rVis6dO/PJJ59w//33VxuAPnfuXI499ljOPfdcysvLGTduHBMnTuT222/PV/iS1LCm2pWkxuKp/lvltP5dp7yV0/rV+KSUuPHGGzn00ENp3bp1tXP3338/K1asoHfv3rz55pucdtpp9O7du9pMSj//+c/p2bMnZ555JgDbbbcdo0aNYuTIkQwYMICOHWuu4StJ9a/kk48qs10VOhRJklbp0Ucf5Y033uDPf/7zSucWLFjAWWedxfvvv0+7du046KCDGDNmDM2aNQMyY0Luu+8+pk+fXm3hu9NOO417772X4cOHc++99+btXgohzvyo0CEUhXRJ2ZoLSathtyu7XUlq5Hr06MHFF1/Mtttuy6abbsrQoUNZunQpn3zyCfvvvz9lZWVsuumm7L///rz//vuV79trr7349a9/ze67787GG2/MoEGDqg1AHj9+PN27d2ezzTZjzJgx1a75zDPP0K9fPzbZZBM6d+7M8ccfz5dffglk/kJ/0kkn0aFDB9q0acP222/PSy+9lJ9fRhHbe++9SSnx7W9/e6VzhxxyCG+99RZffPEFH3zwAddccw1Vv9eOOOIIlixZQu/evau9r0mTJjz55JNFn3hIajhKPvmQpGJw6623cv/99/PWW2/x+uuvM3r0aFasWMHQoUN59913mTVrFi1atOD444+v9r7bbruNW265hblz5/Lll19y+eWXA/DKK69w3HHHMX78eObMmcPHH39cLXFp0qQJv/3tb5k3bx5PPvkkDz30ENdddx0AkydPZsqUKbz++ussWLCAO+64g8022yx/vwxJUoNl8iFJReD444+nW7dutGvXjrPPPpvbb7+dzTbbjIMOOoiWLVuy8cYbc/bZZ/PYY49Ve9/QoUPZeuutadGiBYcccggzZswA4M4772T//fenf//+NG/enAsvvLDatK19+/Zl1113pWnTpvTo0YNjjz22su5mzZqxaNEiXnvtNVJKbLPNNnTu3DlvvwtJWh89evQgIlbavv/97wNw/vnnr3SuU6dOle9fvHgxW2+9NSNHjqxWb0VFBWVlZVxyySV5vZ+GxuRDkopAt27dKl93796dOXPmsHjxYo499li6d+9OmzZt6N+/P59++inLly+vLFv1C7Nly5Z89tlnAMyZM6dana1atarWevH666+z//7706lTJ9q0acOvfvWryi5bAwYM4Pjjj+cXv/gFHTp0YPjw4SxcuDBn9y5J9enZZ5/lgw8+qNyef/55IoJDDjmkssw3v/nNamVefPHFynMtW7Zk3Lhx/OEPf+Chhx6qPH7MMcew9dZbc/rpp+f1fhqakk8+XOdDUjF47733Kl/PmjWLLl268Jvf/IZ///vfPP300yxcuJApU6YAmTEZa9K5c+dqdS5evJiPP/64cv+4446jd+/evPHGGyxcuJCLLrqoWr2//OUvmTZtGq+88gqvv/46l112WX3cpiTlXFlZGZ06darcJk2aRJs2baolH02bNq1Wpqys+kD8fv36ccoppzB06FAWLFjAzTffzMMPP8y4ceNKfnHV0r57HHAuqThce+21vP/++8yfP58xY8YwZMgQFi1aRIsWLdhkk02YP38+o0aNWuv6Dj74YP7+97/zxBNP8OWXX3LuueeyYsWKyvOLFi2iTZs2tG7dmtdee43f//73leeeffZZnn76aZYtW0arVq3YaKONSv7LVlLjlFLipptu4ic/+QktWrSoPP7222/TpUsXevbsyaGHHsrbb7+90nsvuOAC2rZtyxFHHMFJJ53EZZddhrOrOtWuJBWFww8/nEGDBjFnzhwOOOAAzjnnHD799FMOP/xw2rdvT5cuXTjllFP429/+tlb19enTh2uvvZbDDz+czz//nJNPPpnNN9+88vzll1/O8OHDufTSS9lpp50YMmQIDz/8MAALFy7kpJNO4u2332ajjTZi33335bTTTsvFbReEU7bWD6dsVWPwwAMPMHPmTIYNG1Z5bJdddmHs2LH07t2buXPnMnr0aHbbbTdefvnlat1TN9xwQ66++mr23ntv+vfvz3HHHVeIW2hwYm2a30tBeXl5eu655wodhqQG6NVXX2WbbbYpdBir1KNHD2688UYGDhxY6FDWyap+vxExLaVUvhZV5PWLzOSjfuQ7+fBzqx+lljT+z//8D++++y7PPPPMKst89tlnbLnllpx55pmcfPLJ1c4dccQR3H333bRq1YqXX355pe5ZRSxWdcJ2cEmSJKmGuXPncu+991Zr9ahN69at6dOnD2+88Ua14/fccw933HEHjz32GN26dbPlI6vkkw8HnEuSJKmmsWPH0rx5cw477LDVllu6dCmvvfZatSnF586dy7HHHsu5555LeXk548aNY+LEidx+++25DrvBK/nkwwHnkhq7d955p9F2uZKkhiilxI033sihhx5K69atq5079dRTeeyxx5g5cyZPP/00Bx98MJ9//jlHHXVUZZmf//zn9OzZkzPPPBOA7bbbjlGjRjFy5EgqKiryei8NTcknH5IkSVJVjz76KG+88UatXa7ef/99DjvsML75zW9y4IEH0rx5c5566im6d+8OwPjx47nvvvsYN24cTZo0qXzfaaedxje+8Q2GDx+et/toiJztSpIkSapi7733XuWaSP/3f/+32vceccQRHHHEESsdb9KkCU8++WS9xNeY2fIhSZIkKS9MPiRJkiTlhcmHJEmSpLww+ZAkSZKUFyU/4DwiBgODe/XqVehQJDUiuV4tudRWEZYklYaSTz5SShOBieXl5atfvlKSJEl5les/9JSKhvQHLbtdSVIj16NHDy6//HJ22GEH2rZty5AhQ1i6dCljx45ljz32qFY2InjzzTcBOProoxkxYgTf+973aN26NbvvvjsffvghJ554Iptuuim9e/dm+vTp1a5z8cUXs+2227LpppsydOhQli5dCmQW0Jo4cWJl2WXLltG+fftq75ckyeRDkorAHXfcwT/+8Q9mzpzJCy+8wNixY9f6faNHj2bevHk0b96cfv36sfPOOzNv3jwOPvhgTj755Grlb731Vu6//37eeustXn/9dUaPHg3AkUceyZ///OfKcpMmTaJz587stNNO9XaPkqTGz+RDkorAL3/5S7p06UK7du0YPHgwM2bMWKv3/ehHP6Jv375stNFG/OhHP2KjjTbiyCOPpEmTJgwZMmSllovjjz+ebt260a5dO84++2xuv/12AH7yk58wadIkFi5cCGRW+K1tkS1JUmkz+ZCkItCpU6fK1y1btuSzzz5bq/d17Nix8nWLFi1W2q9ZT7du3Spfd+/enTlz5gDQpUsXdt99d+666y4+/fRT7rvvPn784x+v071IkopXyQ84l6Ri1apVKxYvXly5/+GHH653ne+9917l61mzZtGlS5fK/aOOOoobb7yRr776in79+tG1a9f1vp4kqbjY8iFJRepb3/oWL7/8MjNmzGDp0qWcf/75613ntddey/vvv8/8+fMZM2YMQ4YMqTz3wx/+kOeff56rrrqKI488cr2vJUkqPkWbfETEPRHxSUTcWehYJKkQtt56a84991wGDhzIN77xjZVmvloXhx9+OIMGDWLLLbdkq6224pxzzqk816JFCw466CBmzpzJgQceuN7XkiQVn0gpFTqGnIiIvYCNgaNSSgevqXx5eXl67rnnch2WpEbo1VdfZZtttil0GAXXo0cPbrzxRgYOHLjKMhdccAGvv/56tZmv1mRVv9+ImJZSKl+LKvL6Rea6A/Uj3+sO+LnVDz+3xqkA63zEqk4UbctHSulRYFGh45CkUjF//nxuuukmhg8fXuhQJEkNVN6Tj4joHxETImJ2RKSIOLqWMiMiYmZELI2IaRGxZ77jlCStvRtuuIFu3brxve99j/79+xc6HElSA1WI2a5aAy8Bf8pu1UTEEOAqYATwRPbnfRGxbUppVrbMDGqPfVBKaU6O4pakkvbOO++s8tywYcMYNmxY/oKRJDVKeU8+UkqTgEkAETG2liInA2NTSjdk90dGxHeB44CzsnXsWB+xRMRwYDjAFltsUR9VSpIkSVqFBjXmIyI2BPoCk2ucmgzsVt/XSyldn1IqTymVl5XlfSCOpEakWCfnKDR/r5JUWhpU8gG0B5oAFTWOVwCdVi6+ahHxIPBXYL+IeD8i+q2i3OCIuH7BggXrEq+kEtCs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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.feature_generation_dt import DeltaTime\n", - "sf_crime_df = pd.read_parquet(sf_crime_file_location)\n", - "columns = [\"Dates\"]\n", - "sf_crime_df[\"Dates\"] = sf_crime_df[\"Dates\"].astype(np.datetime64)\n", - "objs = [DeltaTime(columns_a = [\"Dates\"], columns_b = [\"Dates\"])]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"DeltaTime\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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1QuAVq1asXTpUu6888711tG7d29uu+02AObMmcPs2bMB+OSTT2jevDktW7akpKSE++67D4ClS5eyZMkSBg4cyJ///Geee+652vhokqR6ouC7XUlSodh111256qqrGDp0KJ06deLEE0/ko48+okuXLrRt25Y999xzvXWceOKJDBkyhI4dO9KxY0d69uwJwB577EH37t3ZbbfdVuve9emnn3LYYYexfPlyUkpceumltfoZJUl1W8GvcL5KcXFxcq56SbXhpZdeWmP17lybN28ehxxyCHPmzMlrHGtT2e/IFc4lOeajZuRhzIcrnK9NRAyKiLFLlizJdyiSJElSg1bwyYcDziUVgvbt29fZVg9JUuEo+ORDkiRJUm6YfEiSJEnKCZMPSZIkSTlR8MmHA84lSZKk3Cj45MMB55IkSVJuuMigJOVYTc9bn4f52yVJ2iAF3/IhSYVg3rx5dOzYkWHDhtG5c2f69+/PsmXL6NOnD6sWWF24cCHt27cHYNy4cXz3u9+lX79+tG/fniuvvJJLL72U7t27s/fee7N48WIA+vTpw8knn0y3bt3o0qUL06dPp7S0lF122YUFCzJJVmlpKR06dCjblyQVLpMPSSoQr732Gj//+c954YUX2HLLLbnrrrvWWX7OnDmMHz+ep59+mnPPPZdmzZrx7LPPss8++3DzzTeXlfv888+ZNWsWY8aMYejQoTRq1IijjjqKW2+9FYCHHnqIPfbYg6IiW2gkqdCZfEhSgdhpp53o1q0bAD179mTevHnrLN+3b1++9rWvUVRURMuWLRk0aBAAu++++2rv/fGPfwxA7969+eSTT/j4448ZOnRoWYJy4403MmTIkBr/PJKk+sfkQ5IKxGabbVb2unHjxqxYsYJNNtmE0tJSAJYvX77W8o0aNSrbb9SoEStWrCg7FxGrvS8i2H777WnTpg2PPPII06dP59vf/naNfx5JUv1j8iFJBax9+/bMnDkTgDvvvHOD6vjHP/4BwJQpU2jZsiWrZg887rjjOOqoo/j+979P48aNayZgSVK9VvDJh+t8SCpkp59+OldffTXdu3dn4cKFG1TH5ptvTvfu3TnhhBO44YYbyo4feuihLF261C5XkqQykVLKdwx1QnFxcVo144sk1aSXXnqJjh075juMWtGnTx9Gjx5NcXHxGudmzJjBr371Kx5//PH11lPZ7ygiZqaU1qx4Tf4hkxqomp6avFDlYUr2WNsJ1/mQJNW4iy66iKuvvrpsxitJksDkQ5K0ESZNmlTp8bPOOouzzjort8FIkuq8gh/zIUmSJCk3TD4kKQccX7d2/m4kqXCYfEhSLdt8881ZtGiR/8iuREqJRYsWsfnmm+c7FElSDjjmQ5Jq2de//nXeeecdFixw1pbKbL755nz961/PdxiSpBxosMlHRPwT6AM8nFI6Ms/hSCpgTZo0Yaeddsp3GJIk5V1D7nZ1OXBMvoOQJEmSlNFgk4+U0iTg03zHIUmSJCkj58lHRPSOiLsj4t2ISBExuJIyIyJibkQsj4iZEbF/ruOUJEmSVLPyMeajBTAHuDm7rSYifkimy9QIYEr2530R0SmlND9bZhaVx94/pfReLcUtSZIkaSPkPPlIKd0L3AsQEeMqKXIqMC6ldF12/6SIGACcCJydraNbTcQSEcOB4QA77LBDTVQpSZIkaS3q1JiPiNgU6AlMrHBqIrBvTV8vpTQ2pVScUiouKiqq6eolSZIklVOnkg+gFdAYKKlwvARoW52KIuIh4A5gYES8ExH7rKXcoIgYu2TJkg2JV5IkSVIV1bXko8aklA5KKRWllJqllL6eUpq2lnITUkrDW7ZsmesQJUmSpIJS15KPhcBKoE2F422AD3IfjiRJkqSaUqeSj5TSl8BMoF+FU/2AJ2rjmna7kiRJknIjH+t8tIiIbhHRLXv9HbL7q6abuhQYHBHHRUTHiLgc2A64pjbisduVJEmSlBv5aPkoBp7Nbk2BUdnXvwVIKf0DOAU4D5gF9AIGppTeqo1gbPmQJEmSciPnyUdKaVJKKSrZBpcrMyal1D6ltFlKqWdKaXItxmPLhyRJkpQDdWrMhyRJkqSGq+CTD7tdSZIkSblR8MmH3a4kSZKk3Cj45EOSJElSbph8SJIkScqJgk8+HPMhSZIk5UbBJx+O+ZAkSZJyo+CTD0mSJEm5YfIhSZIkKScKPvlwzIckSZKUGwWffDjmQ5IkScqNgk8+JEmSJOWGyYckSZKknDD5kCRJkpQTBZ98OOBckiRJyo2CTz4ccC5JkiTlRsEnH5IkSZJyw+RDkiRJUk6YfEiSJEnKiU3yHYAkSfmybNky3njjDQC+8Y1v0LRp0zxHJEkNmy0fkqSC88UXX3DKKaew9dZbs8cee9C1a1e23nprTj75ZJYvX57v8CSpwbLlQ5JUcE488UQmTpzI9ddfzz777APAtGnTOPvss/n000+58cYb8xyhJDVMBZ98RMQgYFCHDh3yHYokKUfuuOMOxo8fT79+/cqO7bzzzrRu3ZojjjjC5EOSaknBd7tynQ9JKjzNmzenXbt2axxv166d4z4kqRYVfPIhSSo8J510EqNGjWLZsmVlx5YtW8bvfvc7TjrppDxGJkkNW8F3u5LU8D3Z+xv5DmG99p78Rr5DKChPPvkkjz32GO3ataNr164APP/886xYsYLPPvuMQw89tKzs3Xffna8wJanBMfmQJBWcVq1accQRR6x2bKeddspTNJJUOEw+JEkF56abbsp3CJJUkBzzIUmSJCknbPmQJBWc3XffnYhY6/nZs2fnMBpJKhwNMvmIiO2BW4DWwArgdymlO/IblSSprjjyyCNX2//qq6+YNWsWU6dO5ec//3meopKkhq9BJh9kEo5TUkqzIqItMDMi7k0pfZbvwCRJ+Tdy5MhKj//pT3/irbfeynE0klQ4GuSYj5TS+ymlWdnXHwALga3zGpQkqc47/PDDufXWW/MdhiQ1WDlPPiKid0TcHRHvRkSKiMGVlBkREXMjYnlEzIyI/Tfiej2BximltzcmbklSwzd58mSaNWuW7zAkqcHKR7erFsAc4ObstpqI+CFwOTACmJL9eV9EdEopzc+WmUXlsfdPKb1Xrq6ts9cYVsOfQZJUj5VfRBAgpcT777/Ps88+u9YuWZKkjZfz5COldC9wL0BEjKukyKnAuJTSddn9kyJiAHAicHa2jm7ru05EbAb8C7gopfTERgcuSWowttlmm9X2GzVqROfOnbnwwgvp379/nqKSpIavTg04j4hNgZ7A6AqnJgL7VqOeAMYBj6SUbllHueHAcIAddtihuuFKkuopFxmUpPyoawPOWwGNgZIKx0uAttWoZz/gh8B3I2JWdtu9YqGU0tiUUnFKqbioqGiDg5Yk1V8XXXQRH3/8cb7DkKSCUNeSjxqRUpqSUmqUUupWbnu+srIRMSgixi5ZsiTXYUqS6oALL7yQxYsX5zsMSSoIdS35WAisBNpUON4G+KA2LphSmpBSGt6yZcvaqF6SVMellPIdgiQVjDqVfKSUvgRmAv0qnOoH1MqgcVs+JEmSpNzIxzofLSKiW0R0y15/h+z+qhHflwKDI+K4iOgYEZcD2wHX1EY8tnxIUmF78cUX2XHHHfMdhiQVhHzMdlUMPFpuf1R2+yswOKX0j4jYBjgP2JbMmiADU0pv1UYwETEIGNShQ4faqF6SVMdtv/32+Q5BkgpGlZKPiOgI/Bj4FtAeaAosAJ4B7gPuSil9UZW6UkqTgFhPmTHAmKrUt7FSShOACcXFxS5EqHV6svc38h1Clew9+Y18hyDVSY0aNSIzE/v6rVy5spajkaTCtM7kIyJ6ABcDvYCpZMZd3AksA7YGugAXAFdExMXAZVVNQiRJyqXbb7+9LPkoKSnh17/+Nd/73vfYZ599AJg2bRr/+te/GDVqVD7DlKQGbX0tH/8kk3x8P6X00doKRcQ+wK+A08kkI/WG3a4kqTAceeSRZa8PPfRQ/vCHPzBs2H8bvYcOHco3v/lN/vWvfzFixIh8hChJDd76BpzvklK6al2JB0BKaVpK6QfAn2outNxwwLkkFZ5HHnmEvn37rnG8b9++TJo0KfcBSVKBWGfLR3bq27WKiCYppa+qWl4Zjh2QpPxq1aoVd955J2edddZqx++8806KioryFJUkNXxVnu0qIn4JvJtSuiu7fwNwbES8ARyaUnqllmKUJKlG/fa3v2XIkCE8+uijZWM+nnzySR566CFuuOGGPEcnSQ1Xddb5+CWZGa6IiN7AD4CfALOAS2o8shxxkUFJKjzHHHMMTzzxBK1ateLuu+/m7rvvZptttmHq1Kkce+yx+Q5Pkhqs6qzz0Q6Ym309CLgjpXR7RDwPPF7jkeWIU+1KUmHaa6+9uPXWW/MdhiQVlOq0fHwCtM6+7gc8nH39FbB5TQYlSVJtKykpYfTo0YwYMYKFCxcCMHXqVObOnbued0qSNlR1ko+JwHURcT3QgcziggCd+W+LiCRJdd7MmTPZddddufXWW7n++uv55JNPAHjwwQc599xz8xydJDVc1Uk+fk5mocEi4MiU0uLs8R7A32o6sFxxzIckFZ7TTz+dk08+mWeffZbNNtus7PjBBx/M1KlT8xiZJDVsVR7zkVL6BDipkuMjazSiHHPMhyQVnpkzZ1Y6q9W2225LSUlJHiKSpMKwzpaPiPhadSqrbnlJkvKhadOmfPTRmuvnvvzyy7Ru3bqSd0iSasL6ul29FhHnRcTX11YgIhpFxLcj4kEyXbMkSarTDjvsMEaNGsUXX3wBQEQwb948zjzzTI444og8RydJDdf6ul3tD1wAvJmdUncG8B6wHNgK6ATsDSwDLgSuq71QJUmqGaNHj2bgwIEUFRXx+eef06tXL0pKSthvv/34/e9/n+/wJKnBWmfykVJ6DfhBRGxPZlHB/YFvAk2BhcCzwFjg3pRSaS3HKklSjdhiiy2YMmUKjzzyCM888wylpaX06NGDgw46KN+hSVKDVqUB5ymlt8msYl5vVzJfm4gYBAzq0KFDvkORJOXYAQccwAEHHJDvMCSpYFRnqt0GKaU0IaU0vGXLlvkORZKUQ2PGjKFz5840a9aMN998E4CLLrqI22+/Pc+RSVLDVfDJhySp8Fx22WX8/ve/Z/jw4aSUyo63a9eOK6+8Mo+RSVLDZvIhSSo411xzDddddx0nn3wym2zy3x7IPXr04IUXXshjZJLUsJl8SJIKzltvvUWXLl3WON6kSROWLVuWh4gkqTCYfEiSCs7OO+/MM888s8bxe++9l06dOuUhIkkqDFWa7WqViGgDHA18Azg/pbQwIvYD3kspza2NACVJqmmnn346v/jFL/j8889JKTFt2jRuueUWLr74Ym688cZ8hydJDVaVk4+I6Ak8DMwFOgN/IrPWRz/gf4Cf1EaAkiTVtCFDhrBixQrOOeccPv/8c44++mi22247/vKXv/DDH/4w3+FJUoNVnZaP0cDlKaWREfFpueMPAENqNqzccZ0PSSpMw4YNY9iwYSxcuJDS0lJat26d75AkqcGrzpiPnsBfKzn+PtCmZsLJPdf5kKTC9cYbb/Dkk08yffr0srU+JEm1pzotH8uArSo5vhvwYc2EI0lS7Vu0aBE/+9nPuPvuu2nUKPM9XEqJQw45hBtvvJFtttkmzxFKUsNUnZaPfwMjI2Kz7H6KiPbAH4G7ajowSZJqy3HHHcfrr7/O448/zvLly1m+fDmTJ09m7ty5DBs2LN/hSVKDVZ2Wj9OBe4EFQDNgCpnuVlOB82o+NEmSascDDzzAww8/zD777FN2bL/99uPaa6/loIMOymNkktSwVTn5SCl9AvSKiAOAHmRaTZ5JKT1UW8FJklQbioqKaN68+RrHmzVrZpcrSapF1V5kMKX0SEppdErpYhMPSVJ99Otf/5pTTjmFd999t+zYu+++y2mnncavf/3rPEYmSQ1bdRcZ7A70BVpTIXFJKf1vDca1wSJiS+AhMp9tEzLTA1+X16AkSXXKZZddxrx582jfvj3t2rUDMsnH5ptvzocffshf/vKXsrKzZ8/OV5iS1OBUZ5HB/wUuAt4CSoBU7nSq9E358SnQO6X0eUQ0B+ZExPiU0qJ8ByZJqhuOPPLIfIcgSQWpOi0fvwJOTCldW1vB1ISU0krg8+zuZkBkN0mSABg5cmS+Q5CkglSdMR+NgIc35mIR0Tsi7o6IdyMiRcTgSsqMiIi5EbE8ImZGxP4bcJ0tI+I54B3gTymlhRsTtySpYVmwYAELFiwo23/++ec577zz+Nvf/pbHqCSp4atO8nE1MGQjr9cCmAOcTGbRwtVExA+By4ELge7AE8B9EbFDuTKzImJOJdt2q8qklD5OKe0B7AT8JCLq7QrskqSa94Mf/IAJEyYAsHDhQnr37s0///lPTjjhBC655JI8RydJDVd1ul2NAu6NiGfJJBBflT+ZUhq6vgpSSveSWSuEiBhXSZFTgXHlBoifFBEDgBOBs7N1dKtqwCmlkmwLyP7AnVV9nySpYZs9ezZ77703AHfeeScdOnTg6aef5t///jdnnHEGp512Wp4jlKSGqTotHxcA/YEVwFZAUYVto0TEpkBPYGKFUxOBfatRT5uI+Fr2dUugN/DKWsoOj4gZETGjfPO7JKlhW7ZsGS1atADgoYce4tBDDwWgR48evP322/kMTZIatOokHyOAn6SU9kwpHZJSGlR+q4FYWgGNycykVV4J0LYa9ewIPJ5t8XgcuCKl9HxlBVNKY1NKxSml4qKijc6fJEn1xC677ML48eN5++23mThxIv379wegpKSELbfcMr/BSVIDVp3kYxnwbG0FUlNSStNTSt1SSnuklLqub3auiBgUEWOXLFmSqxAlSXk2cuRIzjzzTNq3b8/ee+/NXnvtBcADDzxA9+7d8xydJDVc1Uk+/gycEhG1NW3tQmAlUHFweBvgg1q6JimlCSml4S1btqytS0iS6pjDDz+c+fPnM2PGDO6///6y4wcddBCXXnppHiOTpIatOgPO9yczfuI7EfEiaw44P3RjAkkpfRkRM4F+wB3lTvUD7tqYutclIgYBgzp06FBbl5Ak1UFt2rShTZvVv+9a1QIiSaod1Uk+FgLjN+ZiEdECWPWv/EbADhHRDVicUpoPXArcEhHTganACcB2wDUbc911SSlNACYUFxcPq61rSJIkSapG8pFS2tg1PgCKgUfL7Y/Kbn8FBqeU/hER2wDnAduSmdJ3YErprRq4tiRJkqQ8qk7Lx0ZLKU0C1jlmJKU0BhiTk4Cw25UkSZKUK+sccB4RsyNiq+zr57P7lW65CbfmOeBckiRV1+TJkzn00ENp164dEcG4ceNWO3/++eez22670bx5c7baaisOPPBAnnjiiTXqmT59Ov369aNFixZ87WtfY99992XhwoVl5z/66COOPvpoWrZsScuWLTn66KP5+OOPy85fd911bLHFFsybN2+1es877zzatWvH4sWLa/JjSxttfbNd3QV8Ue71ujZJkuqNkpISRo8ezYknnlj2j72pU6cyd+7cPEem+mDp0qV06dKFyy+/nKZNm65xftddd+Wqq67i+eefZ8qUKey0004MGDCAkpL/Lmf21FNP0b9/f/r06cOTTz7JzJkzOf3002nSpElZmZ/85Cc888wz3H///dx///0888wzHH300WXnhw0bRq9evRg8eDAppbJ6//jHP3L99dez9dZb1+JvQaq+WPUfaqEq1+1q2GuvvZaTaz7Z+xs5uc7G2nvyG/kOoU7xvtVf9eHeed/WFBEzU0rFVSha7T9kM2fO5MADD2SnnXbihRde4OWXX2bnnXfmN7/5Da+++iq33XbbBkSsQtWiRQuuvPJKBg8evNYyn3zyCS1btuT+++/n4IMPBmDfffelb9++XHDBBZW+56WXXqJTp05MmTKF/fbbD4ApU6aw//778/LLL7PrrrsC8N5779GlSxfOP/98TjjhBLp37863vvUtrr12nUud1Qtx1oJ8h9AgpItyvpj2WodZVHmdj4h4JCK2rOT4FhHxyAYGlnd2u5KkwnP66adz8skn8+yzz7LZZpuVHT/44IOZOnVqHiNTQ/Tll18yduxYtthiC7p16wbAhx9+yLRp09h2223p1asXrVu3Zv/99+fhhx8ue9+0adNo0aIF++67b9mx/fbbj+bNm6/WhWu77bbjyiuv5JxzzuGoo47iyy+/5JJLLsnZ55OqozqLDPYBNq3k+OZk1gCRJKlemDlzJscee+wax7fddtvVusVIG+Oee+6hRYsWbL755vz5z3/mwQcfLFtb5s033wRg5MiRDB06lAceeID999+fgw8+mOeeew6ADz74gKKiIsqv7xwRtG7dmg8+WH395Z/85CfstddejB8/nuuvv54WLVrk6FNK1bPe5CMiekREj+xu11X72W1PYDjwbq1GWYsiYlBEjF2yZEm+Q5Ek5UjTpk356KOP1jj+8ssv07p16zxEpIaob9++zJo1iyeeeIIBAwbwgx/8gPfffx+A0tJSAI4//niGDh1K9+7dufDCC9lzzz255prqL2/2wgsv8OSTT9KsWTMmT55co59DqklVafmYATxNpk/txOz+qu0p4Gzgt7UVYG2z25UkFZ7DDjuMUaNG8cUXmTlVIoJ58+Zx5plncsQRR+Q5OjUUzZs3p0OHDuy9997ccMMNNGnShOuvvx7ItLIBdOrUabX3dOrUifnz5wPQtm1bFixYQPnxuSklPvzwQ9q2bVt2bMWKFRxzzDEcdthh3HLLLVx44YU8++yztf3xpA1SleRjJ+AbZAaOfDO7v2prB2yRUrqx1iKUJKmGjR49msWLF1NUVMTnn39Or1696NChA1tuuSW///3v8x2eGqjS0tKyhLd9+/Zst912vPLKK6uVefXVV9lxxx0B2GeffVi6dCnTpk0rOz9t2jQ+++yz1caB/P73v+e9995jzJgxHH744Xz/+9/n2GOP5csvv8zBp5KqZ72LDJZbXbw640MkSaqztthiC6ZMmcIjjzzCM888Q2lpKT169OCggw7Kd2iqJ5YuXcrrr78OZJKK+fPnM2vWLLbeemu23HJLLr74YgYNGsS2227LggULuOqqq3jnnXf4wQ9+AGRa28444wxGjhxJ165d6d69O7fffjtPPvkkV155JQAdO3ZkwIABHH/88YwdOxbIdNM65JBDyma6mjlzJhdccAHjx49nm222AeCKK66gS5cujBo1aq0zaUn5Uq0VziPi60BvoDUVkpGU0qU1GJckSbXugAMO4IADDsh3GKqHZsyYQd++fcv2R44cyciRIzn22GMZM2YML7zwAjfeeCOLFi1im222Yc8992Ty5Ml07dq17D2nnHIKX3zxBaeddhqLFi2ic+fO3Hfffeyxxx5lZW677TZOOumksul5Dz300LLk5IsvvuCYY47hqKOOYtCgQWXv2Xrrrbnuuuv47ne/y3e/+1323HPP2v51SFVW5XU+IuKnwI3ACmABq8+rnlJKO9d8eLXPdT7WznUHVud9q7/qw73zvq2pNtf5AHj22Wd59NFH+fDDD8sG/65y8cUXb0iVkmqY63zUjLq0zkd1Wj5+C1wCnJ9SWrnRIdURKaUJwITi4uJh+Y5FkpQbF198MWeddRY77rgjbdq0WWMqU0lS7ahO8tEGuL4hJR6SpML05z//mauvvprjjz8+36FIUkGpziDye4G9aisQSZJypbS0lAMPPDDfYUhSwalOy8eDwB8jojPwPPBV+ZMppfE1GZgkSbXlxBNP5KabbnImIEnKseokH9dmf55TybkENN74cHKv3IDzfIciScqRkSNHMnDgQLp3706XLl1o0qTJaudvvNHlqySpNlQ5+UgpNch1PhxwLkmF59xzz2XixIn06NGDjz76yEHmBcBZk2pGHmZNUgPTIBMKSZLWZcyYMdx22208/fTT3HPPPUyYMGG1LZcmT57MoYceSrt27YgIxo0bt9r58ePHc/DBB1NUVEREMGnSpDXq6NOnDxGx2vajH/2o7Py8efP42c9+xs4770zTpk3ZeeedOfvss1m2bFlZmYkTJ9KkSROeeuqp1eq+/vrradGiBW+84XTQkjZelVs+IuLUdZ13kUFJUn3RtGlTunfvnu8wgMxK2V26dOGYY47hmGOOWeP8Z599xr777stRRx1V6flVhgwZwoUXXli237Rp07LXL7/8MitXruTqq69ml1124aWXXmL48OEsWrSobOXs/v37c9xxx3Hsscfy7LPP0rRpU+bNm8epp57K6NGj+cY36v56OZLqvuqM+Tipwn4TYFtgGfAhYPIhSaoXfvWrX3HZZZdx1VVX5b3L1cCBAxk4cCAAgwcPXuP80UcfDcDChQvXWU+zZs1o27ZtpecGDBjAgAEDyvZ33nlnzj33XM4///yy5ANg9OjR7LHHHpx11llcdtllDB48mH333ZcTTjihuh9LkipVnTEfO1U8FhFtgJuA62oyKEmSatPjjz/O5MmT+c9//kOnTp3WGHB+99135ymyDff3v/+dv//977Rp04Zvf/vbjBw5kq997WtrLf/JJ5+w1VZbrXasefPmjBs3jj59+rBgwQKee+455syZU9uhSyog1Wn5WENKqSQizgVuB/5ZMyFJklS7WrVqxeGHH57vMGrMT37yE3bccUe22247XnjhBc4++2xmz57NxIkTKy3/1ltvMXr0aM45Z80JLHv16sVRRx3FX//6V2644QbatWtX2+FLKiAblXxkNSKz+rkkSfXCTTfdlO8QatTw4cPLXu++++7svPPO7LXXXjzzzDP06NFjtbIlJSUMGDCA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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.data_cleaning import Replace\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "columns = [\"RoofStyle\", \"HouseStyle\"]\n", - "to_replace_dict = {'RoofStyle': {'Gable': 'Non-Gable', 'Flat': 'Apartment'}, 'HouseStyle': {'2Story': '2Floors'}}\n", - "objs = [Replace(to_replace_dict=to_replace_dict)]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"Replace\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['Gable', 'Hip', 'Gambrel', 'Mansard', 'Flat', 'Shed'], dtype=object)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "housing_df['RoofStyle'].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 1460.000000\n", - "mean 10516.828082\n", - "std 9981.264932\n", - "min 1300.000000\n", - "25% 7553.500000\n", - "50% 9478.500000\n", - "75% 11601.500000\n", - "max 215245.000000\n", - "Name: LotArea, dtype: float64" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "housing_df['LotArea'].describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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q5l9YmZVwucah+vulu09HcItWa2jf6cih694rAPIKzMrCbQARmU7NQNoFX79OdDYzGoRGnB+PjDsIHX2AfoAlC1btsWpp55a0GGLiMhhWrhwYZq7V81D0fiZOQVo0KABnTt3JiUlxWfPnk3NmjW5/vrruemmmzAzMjIyKFeuHPfccw+dO3e+cuHChdStW5c77riDlJQUAN5//33OPfdcNm3a9CLwIoC706hRI7p37/7u/mu5O3PnzuXss8++9fLLL7/1nXfe4auvvoI4+50GYevWrdSrV482bdpw8803U7VqVX744YcGNWvW/HB/mR49erBu3TomTZqU+b6SJUueScTv+7PPPqNChQrceeedXHzxxZQsWZKvvvqq5bnnnvszhD6zv//974waNeq11NRUkpKS2LZtG8cddxxXXXUVI0eOnBvgbYvkxnI94+6FciPUdNwzYr8mof8522UrNxhYHrF/EbAC+B7ok9frtWjRwkVEpPAAFnjenuFxpVSpUl6qVCm/5557fNGiRf7cc8952bJl/fHHH3d39w0bNjjgZcqU8dGjR/vixYt99OjRXqxYMX/77bfd3X3y5MlerFgxz8jIyFL3Oeec43369Dngmj169HDAn3322ejfYJy69957vVWrVgct06NHD7/gggsOWqZly5Z+3333HbTMvn37vFWrVn7RRRe5u/vVV1/tp512mv/+++/5C1okenJ9ZheqblcFwd2nuvvJ7l7f3ccdqryZdTWzcdu2bQsiPBERkYPKyMigefPmPPjggzRr1oxevXpx6623MmbMmMzzABdffDEDBgygadOmDBgwgMsvv5wnnngi39dLTU3lP//5D2XKlGHOnDkFei+J5M033+TMM88kJSWFatWq0bRpU5544on9X4xmmjt3LtWqVePkk0+md+/ebNqUOZSHTZs2MX/+fGrUqEGbNm2oVq0abdu25f33389Sx1FHHcXzzz/PrFmzuOqqq3j55Zd54YUXKFmyZCD3KnIkilLykQbsA5KyHU8CNh5upe4+zd37VKhQ4UhiExERKRA1atSgYcOGWY41aNCANWvWAFClShWKFy9+0DLVq1dn3759pKWlZSmTmppK9erVsxzr06cPJ510ErNmzeLFF19k2rRpBX1LCeGHH35g7NixnHDCCbz33nv069ePe+65JzNpBOjcuTMvvPAC77//PqNHj+bzzz+nffv2/P7775l1AAwZMoRrr72W9957j7Zt23Leeefx3//+N8v16tevz5133smUKVO45557aNq0aWD3KnIkisyYD3ffbWYLgY7AqxGnOgKvH269ZtYV6Fq/fv0jjFBEROTItW7dmuXLl2c5tmLFCurUqQNAyZIl+cMf/nDQMi1atKBEiRLMnDmTK6+8EoCffvqJZcuW0apVq8z3TJw4kVmzZrFkyRJOOukk7r77bm644QZat25NpUqVonmbcScjI4Pk5GQefPBBAJo1a8Z3333HmDFjuPnmmwG44oorMsufdtpptGjRgjp16vCf//yHyy67LLNV64YbbuDaa6/NrGf27Nk89dRTPPnkk5nvT09P56WXXqJMmTLMnTsXdyc0Z4BI4VaoWj7MrJyZNTWzpoRiqx3e3z+V7sNAz/Ac5A3M7FFCY0EOe1YOtXyIiEhhctttt/Hpp58yfPhwvv/+e1599VUee+wxbrrppswyd911F//6178YN24c33//PePHj+fll1/OLFOhQgWuu+467rrrLmbNmsXixYu5+uqradKkCR06hCa7Wrt2Lf369WPkyJGcdNJJQOgb9ypVqnDLLbcEf+NF3KFarHJSs2ZNjjvuOL777rvMOoAD6mnYsOEB9dx9993s3buXzz//nAULFhxWlzuRWChsLR/JwOyI/aHh7XlCg8//ZWaVCc1lXoPQmiBd3P3HwCMVkYSRkZFBWloaW7duZd++fbEOJ24UK1aMY489lipVqnDUUYXqu7CY+sMf/sCbb77Jfffdx7Bhw6hduzbDhg2jb9++mWUuueQSxo0bx4gRI+jXrx8nnXQSL7zwAhdccEFmmUceeYTixYuTkpJCeno65557Li+88ALFihXD3bn22mtJTk7O/FYeQq0qL7zwAmeccQbdu3fn0ksvDfTei7JDtVjlJC0tjXXr1mUmHXXr1qVmzZo51nPaaadl7s+ePZuxY8cye/ZsGjVqxOjRo+nfvz9dunThxBO1NqQUbpZ9IFSiieh21Xv/Nw8iIpHWrFmDmZGUlESJEiXUtaEAuDt79uwhNTUVd6d27QPXijWzhe6enJfqCj5Ckfz54osvaNWqFffffz8pKSksXryY66+/nhEjRnDTTTexY8cO7r//frp160aNGjVYvXo19957L2vXrmXZsmUcc8wxQChpHDJkCM888wzNmjXjlVdeYciQISxYsIDTTz+dX3/9ldNOO41u3boxevTozOt37tyZnTt38uGHHyqZl8Ig1z+UCZ987JecnOwLFiyIdRgiUggtW7aMU045RX/QoyAjI4Ply5fToEGDA84p+ZCi5j//+Q/33Xcfy5cvp3bt2tx8883ccsstmBnp6elccsklLF68mK1bt1KjRg3OOecchg0bxvHHH5+lnr///e+MGTOGzZs306hRI0aMGJHZXe66665j/vz5LFq0iKOPPjrzPevWraNx48YMHjyY2267LdD7FsmBko9DUfIhIrlZtmxZjv84loKR2+9XyYeISJGVa/KR8F/jaZ0PEREREZFgJHzyodmuRETypm7dusyaNSvWYYiISBFW2Ga7EhEpEj5tF90ZZc6aszKq9YuIiMRCwicfWmRQRETyw+75OdYhxAUfWTXWIYhIDCR88uHu04BpycnJvWMdi4jI4ahbty433HADkyZNYsOGDVxyySU8+eSTpKenc/XVV/PZZ5+xd+9eWrduzVNPPcVxxx0HwNlnn03btm354IMPWLp0KS1btmTKlClUqVIFgEmTJjFo0CB27NjBgAEDslzz888/p1+/fixbtozSpUvTrVs3Hn74YUqWLIm7M2DAACZPnsyuXbuoU6cOL730Eo0bNw78dyOyn5LGgqGkUY5Uwo/5EBGJB5MnT+a9995j5cqVrFixggceeICMjAx69erFjz/+yJo1ayhdunSWBeUApkyZwoQJE9i0aRO7d+9m1KhRAHzzzTfceOONTJo0ifXr17N582Z++umnzPcVK1aMf/7zn6SlpTF//nzef/99xo4dC8CMGTOYM2cOK1asYNu2bbzyyitUrlw5uF+GiIgUWko+RETiwM0338zxxx9PpUqVGDhwIC+99BKVK1emW7dulClThmOOOYaBAwfy0UcfZXlfr169OPnkkyldujSXX345S5YsAeC1117jwgsvpF27dpQqVYphw4ZlWeekRYsWnHXWWRQvXjyz5WV/3SVKlODXX3/l22+/xd1p0KBB5grOIiKS2JR8iIjEgchFyurUqcP69evZuXMnN9xwA3Xq1KF8+fK0a9eOrVu3sm/fvsyy1atXz3xdpkwZduzYAcD69euz1Fm2bNksrRcrVqzgwgsvpHr16pQvX5777ruPtLQ0ANq3b8/NN9/MTTfdRLVq1ejTpw/bt2+P2r2L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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.binning import CustomDiscretizer\n", - "bins = {'LotArea':[1300, 13000, 216000]}\n", - "column = [\"LotArea\"]\n", - "objs = [CustomDiscretizer(bins=bins)]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"CustomDiscretizer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAFkCAYAAABB3oaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA9OklEQVR4nO3deZxVdf348dcbQRYxXFhE3DBKBMWFKXEjNTElsVLLTEswoaRMU0r9aiLuGZpkYu6oP83cxcJCc0FRUlBjEc0UVBAGccEFEJHP7497mYZhwBmZe+7Mva/n43Eec885n/s578PVc+c9ny1SSkiSJElSoTUrdgCSJEmSyoPJhyRJkqRMmHxIkiRJyoTJhyRJkqRMmHxIkiRJyoTJhyRJkqRMmHxIUiMUEQMjIkVEt3q+79sRcXItx7fJ13dcw0XZsCJin4g4OyL8bpKkEuUDXpJKy7eB1ZKPJmIfYDh+N0lSyfIBL0kqWRHRstgxSJL+x+RDkpqAiHg0Ip6IiP0j4tmIWBwR0yPiO9XKjAGOAbrku1iliJi9ljrPzpfpHhH/iIiPIuL1iBiUP//DiHgxIj6MiEci4os13j87Iv5fRAyOiP9GxNJ8bPvWEvujtVx/dj5mIuJscq0eAJ+sjL9a2TYR8duImBURy/I/z6jeRSvfbStFxKERcU1EvAVU1u1fWJKUhebFDkCSVGdfBEYBFwILgVOAOyKie0rpv8C5QAfgK8Ah+fd8XId67wCuAUYCQ4HrI+JL5LpBnQa0yF/3VmC3Gu/dB+gNnJG/1qnAAxGxU0rppXrc27XAFsCPgb2AT1eeiIjmwD+AHvl7nAb0AX4DbELu36G6y4EHgB8CreoRgySpwEw+JKnpaA/0TSm9DBARzwLzgO8BF6SUXsn/tX9ZSmlSPer9XUrppnydk4EBwE+Ariml9/PHOwOjImLrlNJr1d7bEdg9pfRGvtw/gdeAM8n98l8nKaU5ETEnv/uvlNLyaqePJJeQfC2lNCF/7J8RATA8In6bUlpQrfzTKaVGO7BeksqZ3a4kqel4eWXiAZD/hXsBsNU61vtAtTrfzdc5aWXikfdi/ueWNd47aWXikX//B8DfgN3XMabqDiSX0DwZEc1XbsB4cq0yfWqUv6cBry1JakC2fEhS0/FOLcc+Zt27Fr1bY3/ZGo5Ry7VqG1NRCXRZx5iq6whsDXyyhvOb1tif14DXliQ1IJMPSdK66LSGY3Or7S8FvlBLuU3qeI23gVnkupfVZnaN/VRbIUlS8Zl8SFJp+RhoneH1+kTEltXGfGwIfJNc16uVXgMOi4j1U0rL8uX6AhvWqGvl4PjWwAfVjv8dOAz4MKX0IpKkJssxH5JUWl4ANomI4yPiKxGxY4GvVwmMj4gjIuLb5MZhbEBuVqqVbiPXNer6/FTBg4GrgEW1xA5wSkTsFhEV+f1bgCfJDTI/OSK+HhEHRcTPI2J8RLQp0L1JkhqYLR+SVFquJTcA+wJgI3KtDtsU8HqPAY/mr7cFuQTioJTSf1YWSCk9EhE/BYaRa8F4DjgauKtGXX8FRpOb7vcsIIBIKX0SEd8gN+3vEKAr8BHwCrkWlmVIkpqESMmusZKk+ssvYPhESunoYsciSWoa7HYlSZIkKRMmH5IkSZIyYbcrSZIkSZmw5UOSJElSJkw+JEmSJGXC5EOSJElSJkw+JEmSJGXC5EOSJElSJkw+JEmSJGXC5EOSJElSJkw+JEmSJGXC5EOSJElSJkw+JEmSJGXC5EOSJElSJkw+JEmSJGXC5EOSJElSJkw+JEmSJGXC5EOSJElSJkou+YiIgyPipYh4OSKOK3Y8kiRJknIipVTsGBpMRDQHXgD2BRYBU4A9UkpvFzUwSZIkSSXX8vFVYEZKaW5K6UPgAeCAIsckSZIkiUaWfERE34gYGxFzIyJFxMBaygyNiFkRsTQipkTE3tVObw7MrbY/F+hS4LAlSZJUIiLi7PzvodW3+dXOj6nl/KRq5zeLiIURcUqNenvmf3/9fpb309g0quQDaAtMB04EltQ8GRFHAKOAC4BdgCeBByJiqyyDlCRJUkl7CehcbduxxvmHapzvv/JESmk+8DPgvIjoARARLYCbgHtTSrcVPPpGrHmxA6gupTQOGAe5rLKWIicDY1JK1+T3T4iIA4HjgdOBN1m1paML8HTBApYkSVIpWp5PItbk47WdTyn9JSK+A9wUEX2A35BLUvo1cJxNTqNKPtYmItYHegMja5waD+yRf/00sENEdCE34Pwg4Ny11DkEGAKwwQYb9O7evXtDhy1J+pymTJmyMKXUoQ5FS2fmFElFN3z4cC6++GI233zz1LJlS3bbbTcuuOACtt12WwCOOeYY7r33Xjp27Jg22mgjvva1r3H++efTsWPHVep5++236dmzJ3379v3k7rvv5r777qN///7lMglSrPFEY53tKiI+BH6eUhqT3185nuNrKaUJ1cqdBRyVUtouv38IuQSlGXBxSunqulyvoqIiTZ48uWFvQpL0uUXElJRSRR2KNs4vMklN0gMPPMAHH3xA9+7dWbBgAeeddx4vvvgiM2bMYNNNN+W2226jTZs2dO3aldmzZ3PmmWfy6aefMmXKFFq2bLlKXWPGjGHQoEH88Ic/5KabbirSHRXFGpOPJtPyUVcppbHA2LqWj4gBwIBu3boVLihJkiQ1CQcddNAq+3369GHbbbflxhtv5OSTT+b73//fePEdd9yR3r17s/XWW/O3v/2NQw89tOrcihUruOGGG2jTpg3PPPMMS5cupVWrVpndR2PV2Aacr81C4FOgU43jnYC19clbq5TS/SmlIe3atVuX2CRJklSC2rZtS8+ePXn55ZdrPb/55puzxRZbrHb+sssuY9q0aTzzzDN8+OGHnHHGGVmE2+g1meQjpbSM3KKBNQfq9CM369XnEhEDIuLqRYsWrUt4kiRJKkFLly7lxRdfpHPnzrWeX7hwIXPnzl3l/MyZMznjjDO4/PLL6dGjB9dddx2jRo1i4sSJWYXdaDWqMR8R0RZY2f/pSeAicl2o3kkpvZ6favdmYCgwEfgp8GOgZ0rptXW5tmM+JBXKJ598wpw5c1i6dGmxQ2mUWrVqxRZbbEGLFi1WOe6YD0nFMGzYMAYMGMBWW23FggULOPfcc5kwYQLTpk1j00035eyzz+awww6jc+fOzJ49m9NPP5033niDmTNnsuGGG7J8+XL22GMPttpqK+68886qen/605/y8MMP8/zzz9OmTZsi3mEmmsyYjwrgkWr7I/LbjcDA/LRlmwJnkpuubDrQf10TD0kqpDlz5rDhhhuyzTbbELHG53FZSinx9ttvM2fOHLp27VrscCSJOXPmcOSRR7Jw4UI6dOhAnz59mDRpEltvvTVLlixh2rRp3HTTTbz33nt07tyZfffdl9tvv50NN9wQgAsvvJDXXnuNv/3tb6vUO3LkSHr16sXpp5/OqFGjinFrjUKjavkohmoDzgevqS+fJK2LmTNn0r17dxOPNUgp8eKLL7L99tuvctyWD0lqstb4hddkxnwUigPOJWXBxGPN/LeRpPJR9smHJOnz22effXC8nCSprhrbmI/Muc6HpKxN6vvFBq2vz4RXGrQ+SZIKpexbPux2JakczJ49m+7du3PUUUex/fbbc/jhh7N48WLOOeccvvKVr7DDDjswZMgQVo4D3GeffTj11FP56le/ype//GUef/xxAJYsWcL3v/99tt9+e77zne+wZMmSqmscf/zxVFRU0LNnT4YPH151/LTTTqNHjx706tWLYcOGZXvjJeLss88mIlbZNttsMyA3m9qpp55Kr1692GCDDejcuTM/+MEPeP3116veP3/+fNq3b88ll1yySr0zZsygVatW3HbbbZnej6TyVfbJhySVi5deeomhQ4cyc+ZMvvCFLzB69Gh+/vOf88wzzzB9+nSWLFnCX//616ryy5cv5+mnn+ayyy5jxIgRAFx55ZW0adOGmTNnMmLECKZMmVJV/vzzz2fy5MlMnTqVxx57jKlTp/L2229zzz33MGPGDKZOncqZZ56Z+X2Xiu2224558+ZVbdOmTQNg8eLFPPvss5xxxhk8++yz3HfffbzxxhsceOCBLF++HIDNNtuMK664gjPPPJMXXngByCUtP/rRj/j2t7+9yorNklRIdruy25WkMrHllluy5557AnD00Ufzhz/8ga5du3LxxRezePFi3nnnHXr27MmAAQMAOPTQQwHo3bs3s2fPBmDChAn84he/AKBXr1706tWrqv7bb7+dq6++muXLlzNv3jxeeOEFevToQatWrfjxj3/MwQcfzMEHH5zhHZeW5s2bV7V2VNeuXTsefPDBVY5dddVV9OzZk5kzZ7LjjjsCcMQRR3DPPffwox/9iEmTJnHuuecyb9681d4rNSZx2lvFDqEkpIs6FDuEKmXf8mG3K0nlouasUhHB0KFDufPOO5k2bRqDBw9eZSHEli1bArDeeutV/QV9TWbNmsXIkSP55z//ydSpU/nmN7/J0qVLad68OU8//TSHH344f/3rXznwwAMb/sbKxKuvvsrmm29O165d+f73v8+rr766xrLvv/8+ABtvvPEqx0ePHs3cuXM56qijuPDCC7n22mvZZJNNChq3JFVX9smHJJWL119/naeeegqAW2+9lb322guA9u3b8+GHH66yEu+a9O3bl1tvvRWA6dOnM3XqVCD3y+4GG2xAu3btqKys5IEHHgDgww8/ZNGiRfTv35/f//73/Pvf/y7ErZW83XbbjTFjxvD3v/+da665hvnz57PHHnvw9ttvr1Z22bJlnHLKKQwYMIAttthilXObbLIJF154IbfffjtHHnkk/fv3z+oWJAmw25UklY3tttuOK664gmOPPZYePXpw/PHH8+6777LDDjuw2Wab8ZWvfOUz6zj++OMZNGgQ22+/Pdtvvz29e/cGYKeddmKXXXahe/fuq3Tv+uCDD/jWt77F0qVLSSlx6aWXFvQeS9VBBx20yn6fPn3YdtttufHGGzn55JOrji9fvpyjjz6a9957j7Fjx65Wz4oVK7jhhhto06YNzzzzDEuXLqVVq1YFj1+SVir7Fc5XqqioSM5VL6kQZs6cudrq3VmbPXs2Bx98MNOnTy9qHGtS27+RK5yv3b777kv37t258sorgVziceSRRzJt2jQeffTRWseHXHrppZx33nk88cQTfOMb3+B73/veajNgSY2JYz4aRhHGfLjC+ZpExICIuHrRokXFDkWSpDpZunQpL774Ip07dwZyM1cdccQRTJ06lUceeaTWxGPmzJmcccYZXH755fTo0YPrrruOUaNGMXHixKzDl1TGyj75cMC5pHKwzTbbNNpWD322YcOG8dhjjzFr1iz+9a9/cfjhh/PRRx9xzDHHsHz5cr773e8yadIk/vznPxMRzJ8/n/nz51etw7J8+XKOOeYYvvnNb3LUUUcBcMABB3DccccxaNAgFi9eXMzbk1RGyj75kCSpsZszZw5HHnkk2223HYceeigtW7Zk0qRJbL311syZM4f77ruPN998k969e9O5c+eq7S9/+QsAF154Ia+99lpVF62VRo4cyfLlyzn99NOLcVuSypDJhyRJjdxtt93Gm2++ybJly5g7dy533XUXPXr0AHKtWimlWreBAwcC8Jvf/IbKyko6dFi133fbtm159dVXGTVqVNa3VBbWtjI9QEqJs88+m80335zWrVuzzz77MGPGjKrz06dPp1WrVtx1112r1PvQQw/RokULu8ypSTL5kCRJKpA1rUwPcPHFF3PJJZdw+eWX88wzz9CxY0f69evHBx98AMAOO+zAiBEj+OlPf0plZSUAixYtYtCgQZxyyilVs8pJTUnZJx8OOJckSYWycmX6ldvK1qeUEpdddhmnnXYahx12GDvssAM33ngjH3zwQdVaOgC/+tWv+PKXv8yQIUMAOOGEE9h4440555xzinI/0roq++TDAeeSJKlQ1rQy/axZs5g/fz4HHHBAVdnWrVvTt29fnnzyyapjzZo148Ybb+Shhx7iqKOO4rbbbuOmm25i/fXXz/xepIbgIoOSlLGGnre+CPO3S6qDlSvTd+/enQULFnDeeeexxx57MGPGDObPnw9Ap06dVnlPp06dmDt37irHunXrxq9+9StGjBjBb37zG3beeeesbkFqcCYfklQGZs+ezUEHHcRee+3Fk08+SZcuXbjvvvs46KCDGDlyJBUVFSxcuJCKigpmz57NmDFjuPfee/noo494+eWXGTZsGMuWLePmm2+mZcuWjBs3jk022YR99tmHnXbaiccee4zly5dz/fXXU1FRwXbbbceTTz5Jhw4dWLFiBV/+8pd56qmnVhvw3BS56FnDKIekeW0r0/fp06fO9SxZsoQ///nPtGnThieeeIKUEhFrXMNNatTKvtuVJJWLl19+mZ/97GfMmDGDjTbaaLUZdGqaPn06d999N8888wxnnHEGbdq04bnnnmP33Xfnpptuqiq3ePFinn/+eUaPHs2xxx5Ls2bNOProo7nllluA3Mw8O+20U0kkHtK6aNu2LT179uTll1+umvVq5UDylSorK1dbJPLUU09l+fLlPP3000yePJk//vGPmcUsNTSTD0kqE127dq3qrtG7d29mz5691vL77rsvG264IR06dKBdu3YMGDAAgB133HGV9x555JEA9O3bl/fff5/33nuPY489tipBuf766xk0aFCD34/U1FRfmb5r165sttlmPPjgg6ucf/zxx9ljjz2qjj3yyCOMHj2aMWPG0LNnTy655BJOO+00XnnllWLcgrTOTD4kqUy0bNmy6vV6663H8uXLad68OStWrAByv/isqXyzZs2q9ps1a8by5curztXs/hERbLnllnTq1ImHH36Yp59+erXuJ1I5WNvK9BHBSSedxG9/+1vuvvtupk+fzsCBA2nbti0/+MEPAPjggw8YNGgQJ554InvvvTcAgwcPZu+992bQoEFV/+9KTYnJhySVsW222YYpU6YAcOedd36uOlauov3EE0/Qrl07Vs4eeNxxx3H00Ufz3e9+l/XWW69hApaakLWtTA/w61//ml/+8pf87Gc/o6Kignnz5jF+/Hg23HBDAE466STatGnD+eefv0q91113HdOmTXNxSDVJZT/gPCIGAAO6detW7FAkKXPDhg3je9/7HldffTXf/OY3P1cdrVq1YpddduGT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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.imputers import IntImputer\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "columns = [\"MasVnrArea\", \"GarageYrBlt\", \"LotFrontage\"]\n", - "housing_df = housing_df[columns]\n", - "objs = [IntImputer(strategy='median')]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"IntImputer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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bci8efOICDp27EijRo3K/aDQl5NSYuXKlZSUlJBSKv1rYFkmH5JUbxXEgPNaYbcrSRvy6aef0rVrVxo3bmziUUMigsaNG9O1a1c+/fTTfIcjScqRok8+JKkqKusWpI3n5ypJxaXon/rOdiVJkiTlRtEnH3a7kqSq6dmzJ9OmTct3GJKkeqzhhotIkip6YuCWtVr/rtPfrNX6JUnKh6JPPsrMdpXvUCRJklRGnPFhvkMoCOni9vkOoZTdrux2Jame69mzJ7/85S/Zdtttad26NSNGjGDFihV8/PHHHHjggbRv357WrVtz4IEH8s4775S+b9CgQfziF79g9913Z7PNNmPw4MEsWLCg9PykSZPo0aMHbdu25aKLLip3zaeeeooBAwaw+eab07lzZ44//vjSBbZSSpx44ol06NCBli1bsv322/PCCy/k5sOQJNVpRZ98SFIhuPnmm7nvvvt48803ee2117jwwgtZvXo1I0aMYO7cucybN4+mTZty/PHHl3vfLbfcwg033MAHH3zA559/zoQJEwB46aWXOPbYY5k0aRLvvfceH330UbnEpUGDBlx22WUsWLCAxx9/nH//+99cffXVAEydOpXp06fz2muvsWjRIm6//Xbatm2buw9DklRnmXxIUgE4/vjj6datG23atOGss87i1ltvpW3bthx66KE0a9aMzTbbjLPOOouHH3643PtGjBjBV7/6VZo2bcr3v/99Zs+eDcCdd97JgQceyMCBA2nSpAkXXHBBuWlxd955Z3bddVcaNmxIz549OeaYY0rrbtSoEUuWLOGVV14hpcQ222xD586dc/ZZSJLqLpMPSSoA3bp1K33do0cP3nvvPZYtW8YxxxxDjx49aNmyJQMHDuSTTz5h1apVpWU7depU+rpZs2YsXboUgPfee69cnc2bNy/XevHaa69x4IEH0qlTJ1q2bMnPf/7z0i5b++yzD8cffzzHHXccHTp0YNSoUSxevLjW7l2SVH8UffLhOh+SCsHbb79d+nrevHl06dKFSy+9lFdffZUnn3ySxYsXM336dCAzJmNDOnfuXK7OZcuW8dFHH5XuH3vssWy99da8/vrrLF68mPHjx5er92c/+xmzZs3ipZde4rXXXuPXv/51TdymJKmeK/rkwwHnkgrBVVddxTvvvMPChQu56KKLGDp0KEuWLKFp06ZsvvnmLFy4kPPO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kiRJyo2iTz4kSZIk5YbJhyRJkqScMPmQJEmqpunTp3PQQQfRtWtXIoKJEyeWO59S4txzz6VLly40bdqUQYMG8eKLL5aef+utt/jJT35Cr169aNq0Kb169eLMM89k+fLl5eqZN28eQ4YMoXnz5rRr146f/exnfP7556XnzzrrLLp160bFsas/+tGP6Nu3b7myUl1g8iFJklRNS5cupU+fPlxxxRU0bdp0rfOXXHIJl156KVdeeSVPP/00HTp0YL/99mPJkiUAvPLKK6xatYrf//73vPjii1x55ZXcdNNNnHDCCaV1rFq1iu985zssWbKERx55hFtvvZU777yTk08+ubTMuHHjaNOmDWPGjCk9dtddd3HHHXdw00030bhx41r8FKTqi5RSvmOoE/r3759mzpyZk2s9MXDLnFxnY+06/c18h1Cn+L3VX/Xhu/N7W1tEzEop9a9CUX+QKa9atGjB7373O4YPHw5kWj26dOnC8ccfz1lnnQXA8uXL6dChAxMmTOCYY46ptJ6rr76aX/ziF3z00UcA3HvvvXznO99h7ty5dOvWDYA///nPHH300XzwwQe0bNkSgP/85z984xvf4LbbbmO33XajT58+nHTSSZx55pm1fOe1L874MN8hFIR0cftcXzLWdcKWD0mSpBo0Z84c5s+fz+DBg0uPNW3alIEDB/LYY4+t832LFy+mdevWpfuPP/4422yzTWniAfCtb32Lzz77jFmzZpUe69u3L+PGjeOYY47hyCOPpHfv3px22mk1fFdSzSj65MN1PiRJUk2aP38+AB07dix3vGPHjqXnKpo7dy4TJkxg9OjR5eqpWEe7du1o0KDBWvWcfvrptGzZkgceeIAbb7yRBg0a1MStSDWu6JMP1/mQJEn5VFJSwv77789+++3HiSee+KXqePDBB5k7dy4NGzZcb+uKlG9Fn3xIkiTVpE6dOgGZpKKskpKS0nNrzJ8/n7333ps+ffowadIkIqJcPRXrWLBgAatWrSpXz6JFi/jxj3/MSSedxPjx4xk7dizvvPNOTd+WVCNMPiRJkmrQFltsQadOnbj//vtLj61YsYJHHnmE3XbbrfTY+++/z6BBg9hmm2249dZbadiwYbl6BgwYwMsvv1wukbj//vtp0qQJO++8c+mxE044gVatWnH++eczduxYtt9+e44++uhavEPpy2u44SKSJEkqa+nSpbzxxhsArF69mnnz5jF79mzatGlD9+7dGTt2LOPHj2frrbfmq1/9KhdeeCEtWrTg8MMPB+C9995j0KBBdOnShcsvv5wFCxaU1t2+fXsaNGjA4MGD2W677Rg2bBiXXnopH330EaeeeiojR44snenq7rvv5pZbbuGJJ56gSZMmAEycOJG+ffty7bXXMnLkyBx/MtL62fIhSZJUTTNnzqRfv37069eP5cuXM27cOPr168c555wDwGmnncaJJ57IcccdR//+/Xn//feZOnUqm222GQBTp07l9ddf5+GHH6Z79+507ty5dHv77bcBaNCgAf/85z9p1qwZu+++O0OHDuXQQw9lwoQJQKYL1jHHHMNZZ53FTjvtVBrblltuya9+9StOPvlk5s6dm+NPRlo/1/nIcp2PtbnuQHl+b/VXffju/N7W5jofklzno2a4zockSZKkolOQYz4i4i1gMbAa+DiltHd+I5IkSZJUkMlH1m4ppaX5DkKSJElSht2uJEmSJOVETpOPiBgYEfdExLsRkSJieCVlRkfEnIhYERGzImLPL3GpBDwcEU9HxBEbHbgkSZKkjZbrblctgBeAm7JbORExFLgCGA08mv333ojYNqU0L1tmNpXHPTil9F729R4ppXcjojMwLSKeTyk9V+N3I0mS6gVnTaoZeZg1SQUmp8lHSmkKMAUgIiZWUuQkYGJK6drs/piI2B84FjgzW8eOVbjOu9l/34+IKcBOgMmHpDqrPvxi5C8dkqSNVWfGfEREY2BnYGqFU1OB3apRT/OI2Cz7ugWwD/DiOsqOioiZETHzww/r/g9+SZIkqT6rM8kH0A5oAJRUOF4CdKpGPR2BRyPiP8ATwE0ppacrK5hSuial1D+l1L99e/+iJ0mSJNWmgptqN6X0X6BvVctHxBBgSO/evWsvKEmSJEl1quVjAbCKTMtFWR2B+bV10ZTS5JTSqFatWtXWJSRJkiRRh5KPlNLnwCxgvwqn9gMeq63rRsSQiLhm0aJFtXUJSZIkSeR+nY8WEbFjROyYvXb37H73bJHfAMMj4uiI2CYirgC6AH+orZhs+ZAkSZJyI9ctH/2BZ7NbU+C87OvzAVJKfwHGAmcDs4E9gANSSnNrKyBbPiRJkqTcyGnykVJ6KKUUlWzDy5S5OqXUM6XUJKW0c0ppei3HZMuHJEmSlAN1ZsyHJEmSpMJWcFPtVpdT7arQuFK2JEmqq4q+5cNuV5IkSVJuFH3Lh9bNv6BLkiSpJhV9y4ckSZKk3Cj65MOpdiVJkqTcKPrkwzEfkiRJUm4UffIhSZIkKTdMPiRJkiTlRNEnH475kCRJknKj6JMPx3xIkiRJuVH0yYckSZKk3DD5kCSpjpk+fToHHXQQXbt2JSKYOHFiufNLly5lzJgxfOUrX6Fp06Z87Wtf47LLLitXZv78+Rx55JF06tSJZs2a0bdvX26++ebS8y+88AKbbropd911V7n3TZs2jUaNGjFjxoxauz9JxcvkQ5KkOmbp0qX06dOHK664gqZNm651/qSTTuKf//wnkyZN4uWXX+ass87ijDPOYNKkSaVlhg0bxssvv8zdd9/NCy+8wLBhwzjyyCOZPn06AH369OG8887jpz/9KSUlJQAsWrSIESNGcPLJJ7P77rvn5mYlFRWTD0mS6pgDDjiA8ePHc9hhh7HJJmv/qH7sscc48sgj2XvvvenZsyfDhg1j11135cknnyxX5rjjjmOXXXahV69enHzyyXTr1o2nnnqqtMypp57KV7/6VUaNGgXAmDFjaN26Neeff37t36SkolT0yYezXUmS6ps99tiDyZMn8/bbbwOZRGP27Nnsv//+5crcfvvtfPTRR6xevZq7776bDz/8kH333be0zCabbMKNN97ItGnTOOKII7jtttu46aabaNy4cc7vSVJxKPrkw9muJEn1zW9/+1v69u1L9+7dadSoEXvttRe/+tWvOPDAA0vL3H777UQE7dq1o0mTJhxxxBHceuut7LjjjuXq6t27N6eeeiq33HILZ5xxxlrnJakmNcx3AJIkqXquvPJKHnvsMe655x569OjB9OnTOeWUU+jZs2dp68fZZ5/NggULmDZtGu3atePvf/87w4YNY/r06fTt27e0ruXLl3PrrbfSrFkzHn30UVJKRES+bk1SgTP5kCSpHlm+fDlnnnkmd9xxB0OGDAFghx12YPbs2UyYMIH999+fN998kyuvvJLZs2eXJhp9+/blkUce4corr+S6664rre/000/niy++4KmnnmLAgAH87ne/Y8yYMXm5N0mFr+i7XUmSVJ+sXLmSlStX0qBBg3LHGzRowOrVqwFYtmxZ6bF1lQF48MEHufrqq5k4cSLbbbcdl156KWeccQZvvvlmLd+FpGJly4ckSXXM0qVL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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.encoders import TargetEncoder\n", - "housing_df = pd.read_parquet(housing_file_location)\n", - "y = pd.Series(list(np.random.randint(0, high=2, size=1460)), name='TARGET')\n", - "columns = [\"RoofStyle\"]\n", - "housing_df = housing_df[columns]\n", - "objs = [TargetEncoder()]\n", - "bench_scalers = benchmark.run_X(objs, housing_df, columns, n_vec=n_vec, y=y)\n", - "plot_all(bench_scalers, name= \"TargetEncoder\")" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 891 entries, 1 to 891\n", - "Data columns (total 11 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 Survived 891 non-null int64 \n", - " 1 Pclass 891 non-null int64 \n", - " 2 Name 891 non-null object \n", - " 3 Sex 891 non-null object \n", - " 4 Age 714 non-null float64\n", - " 5 SibSp 891 non-null int64 \n", - " 6 Parch 891 non-null int64 \n", - " 7 Ticket 891 non-null object \n", - " 8 Fare 891 non-null float64\n", - " 9 Cabin 204 non-null object \n", - " 10 Embarked 889 non-null object \n", - "dtypes: float64(2), int64(4), object(5)\n", - "memory usage: 83.5+ KB\n", - "None\n", - "\n", - "Int64Index: 891 entries, 1 to 891\n", - "Data columns (total 2 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 Sex 891 non-null object\n", - " 1 Survived 891 non-null int64 \n", - "dtypes: int64(1), object(1)\n", - "memory usage: 20.9+ KB\n", - "None\n" - ] - }, - { - "data": { - "image/png": "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9epFvXr1qFatGrfcckt2k60uXbowZMgQrrrqKurUqcOgQYPYvHlzzK5dRERKj4RPPjTPh4jEgxUrVmS/Xr58OQ0aNODBBx/kp59+4vPPP2fz5s3MmjULiPTJOJD69evnOub27dtZv3599vqVV17JUUcdxeLFi9m8eTP33HNPruNeffXVzJ8/n++//55FixbxwAMPFMdliohIKZfwyYc6nItIPHjyySdZuXIlGzZsYNSoUfTt25ctW7ZQqVIlatSowYYNGxg5cmShj9enTx/eeustZs+eza5du7jjjjvIysrK3r9lyxaqVatG1apV+fHHH3nqqaey93355Zd8/vnn7N69mypVqlCxYkXNZC4iIoCSDxGRuHDhhRfSvXt3mjVrxhFHHMFtt93GNddcQ2ZmJsnJybRv354ePXoU+njHHnssTz75JBdeeCH169enZs2a/OlPf8reP3r0aF566SUOO+wwBg4cSN++fbP3bd68mYEDB1KzZs3s0bJuuOGGYr1eEREpnaww1e+JIDU11efNmxd2GCJSAv3www8cffTRYYdRoKZNmzJu3Di6du0adigHpaDP18zmu3tqIQ6hP2QicUrzfBSPEOb5sIJ2qOZDREREREQCkfDJhzqci4iIiIgEo1zYAYTN3acCU1NTUweGHYuIyMFYtmxZ2CGIiIgUSsLXfIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCASfqhdM+sN9G7evHnYoYhIKRLrWXdDmI1WREQk5hK+5sPdp7r7oOrVq4cdioiIiIhIXEv45ENEpLRr2rQpo0ePpmXLllSvXp2+ffuyY8cOxo8fT8eOHXOVNTN+/vlnAPr378/gwYM588wzqVq1KieffDJr167lmmuuoWbNmhx11FF8/fXXuc5z7733cswxx1CzZk0GDBjAjh07ADjuuOOYOnVqdtndu3eTnJyc6/0iIiJKPkRE4sDLL7/Mu+++y9KlS1mwYAHjx48v9PvuvvtuMjIyqFChAh06dKBt27ZkZGTQp08fhg8fnqv8pEmTeO+991iyZAmLFi3i7rvvBqBfv368+OKL2eWmTZtG/fr1adOmTbFdo4iIlH5KPkRE4sDVV19NgwYNqFWrFr179yYtLa1Q7zv33HNp164dFStW5Nxzz6VixYr069ePsmXL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61akaObOncszzzxDy5Yts7e5O+eccw6LFy/mjTfe4Ouvv6ZJkyZ07dqVbdu2ZZe75ppreO2115g8eTKffPIJmzdvplevXtmjsHXv3p3LLruMSy+9lMzMTACWLVvG8OHDGT16NEcccUSwFytSRGp2pWZXIiIJ5/XXX8+17u6sWbOGJ598klNOOSWkqCQebNq0iYsuuojnnnuOkSNHZm9fvHgxc+fOJS0tjVatWgHw1FNPUa9ePSZPnsxll13Gpk2bePbZZ3n++efp1i0y88DEiRNp0qQJM2bM4IwzzgBg9OjRtGrViptuuolHHnmE/v37c9JJJ3HFFVcEf8EiRZTwyYeIiCSePn365Fo3M1JSUujSpQsPPvhgSFFJPBg0aBB9+vThtNNOy5V87Ny5E4CKFStmbytTpgwVKlRg9uzZXHbZZcyfP5/du3fTvXv37DKNGjXi6KOP5tNPP81OPqpUqcL48ePp3Lkz69at45tvvmHhwoUBXaHIoVHyISIiCScrKyvsECQOjR07lp9//pkXX3xxn31HHXUUjRs35pZbbmHs2LFUrVqVhx9+mJUrV7JmzRoA1q5dS9myZUlOTs713rp167J27dpc2zp27MjFF1/MhAkTePbZZ2nYsGHsLkykGKnPh/p8iIgklN27d3PiiSfy008/hR2KxJGffvqJW265hZdeeomkpKR99iclJfH666+zZMkSateuTeXKlZk5cyZnnnkmZcoU/etYeno6b7/9NpUrV2bWrFnFcQkigUj45EMznIuIJJakpCSWLl2K2X6nnRIpks8++4yMjAyOPfZYypUrR7ly5fj4448ZM2YM5cqVY+fOnbRr1460tDQ2btzImjVrePfdd1m/fj3NmjUDoF69euzZs4eMjIxcx05PT6devXq5tg0aNIgWLVowY8YMXnzxRaZOnRrYtYocioRPPkREJPFceumljB07NuwwJI6cc845fPvtt6SlpWUvqamp/O///i9paWmUL18+u2z16tVJSUlh8eLFzJs3j7PPPhuAdu3akZSUxPvvv59dduXKlfzwww+cdNJJ2dvGjx/PjBkzmDBhAh06dODGG2/k8ssvZ8OGDcFdsMhBUp8PERFJONu2bWPSpEm8//77tGvXjipVquTa/9hjj4UUmZRWNWrUoEaNGrm2ValShVq1anHccccB8Morr5CcnEyTJk349ttvGTZsGOecc052B/Pq1avzt7/9jb///e/UqVOH2rVrM3z4cFq2bEnXrl0BWLFiBcOGDeO+++6jRYsWAIwYMYKpU6cydOhQJk2aFNxFixyEhE8+zKw30Lt58+ZhhyIiIgH54YcfaNu2LQC//PJLrn1qjiWxsmbNGoYPH056ejr169enX79+3H777bnKPPLII5QrV46+ffuSmZnJ6aefzgsvvEDZsmVxd/7617+Smpqaa/LC8uXL88ILL3DCCSfQp08fzj333KAvTaTQzN3DjqFESE1N9Xnz5gVyrrmdSscEQO1naZbUnHTfSq/ScO903/ZlZvPdPbUQRfWHTCRO2U3rwg4hLvh9KUGfssBfcdTnQ0REREREAqHkQ0REREREAqHkQ0REREREApHwyYcmGRQRERERCUbCj3bl7lOBqampqQPDjkVERERiQx2Xi0cIHZclziR88iEiUhKUhi9G+tIhIiKHKuGbXYmIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCASPvnQPB8iIiIiIsFI+OTD3ae6+6Dq1auHHYqIiIiISFxL+ORDRERERESCoeRDREREREQCoRnOReKMZsoWERGRkkrJhxRIX2JFREREpDip2ZWIiIiIiARCyYeIiIiIiAQiLptdmdkyYDOQBfzu7qeFG5GIiIiIiMRl8hF1krtvDTsIERERERGJULMrEREREREJRKDJh5l1MrMpZrbKzNzM+udTZrCZLTWzHWY238xOOYhTOfCxmX1pZhcdcuAiIiIiInLIgm52VRVYCLwQXXIxs77Ao8BgYHb033fM7Bh3Xx4tk0b+cXd399XR1x3dfZWZ1QdmmNm37r6g2K9GREREREQKLdDkw92nAdMAzGx8PkWGA+PdfWx0faiZ9QCuBG6OHqN1Ic6zKvrvGjObBrQFlHyIiIiIiISoxPT5MLPyQDtgep5d04GTinCcKmZ2WPR1VaAL8F0BZQeZ2Twzm7duXcmfUE9EREREpDQrMckHkAyUBdLzbE8H6hXhOHWB2Wb2DTAXeMHdv8yvoLs/4+6p7p6akqKZskVEREREYinuhtp191+AVoUtb2a9gd7NmzePXVAiIiIiIlKiaj4ygD1Eai5yqgusjdVJ3X2quw+qXr16rE4hIiJSJLNmzeKss86iYcOGmBnjx4/PtX/r1q0MHTqUP/3pT1SqVIk///nPPPzww7nKrF27lksuuYR69epRuXJlWrVqxaRJk7L3L1y4kIoVK/Laa6/let+MGTNISkpizpw5Mbs+EUlcJSb5cPddwHygW55d3YBPY3VeM+ttZs9s2rQpVqcQEREpkq1bt3Lcccfx6KOPUqlSpX32Dx8+nLfffpuJEyfyww8/cOutt3LTTTcxceLE7DL9+vXjhx9+4M0332ThwoX069ePSy65hFmzZgFw3HHHMXLkSK644grS0yMtnjdt2sSAAQO47rrrOPnkk4O5WBFJKEHP81HVzFqbWevouRtH1xtHizwE9Dezy8zsaDN7FGgA/DNWManmQ0RESpqePXtyzz330KdPH8qU2fdP9aeffsoll1zCaaedRtOmTenXrx/t27fn888/z1Xmqquu4sQTT6RZs2Zcd911NGrUiC+++CK7zA033MCRRx7JoEGDABg6dCg1a9bkzjvvjP1FikhCCrrmIxX4OrpUAkZGX98J4O7/Bq4BbgPSgI5AT3f/NVYBqeZDRERKm44dOzJ16lRWrFgBRBKNtLQ0evTokavMyy+/zPr168nKyuLNN99k3bp1dO3aNbtMmTJlmDBhAjNmzOCiiy7iX//6Fy+88ALly5cP/JpEJDEEmny4+0fubvks/XOUGePuTd29gru3c/dZMY5JNR8iIlKqPPbYY7Rq1YrGjRuTlJTEqaeeyv/93//Rq1ev7DIvv/wyZkZycjIVKlTgoosuYvLkybRu3TrXsZo3b84NN9zASy+9xE033bTPfhGR4hR3o12JiIjEu8cff5xPP/2UKVOm0KRJE2bNmsX1119P06ZNs2s/brvtNjIyMpgxYwbJycm88cYb9OvXj1mzZtGq1X8HhczMzGTy5MlUrlyZ2bNn4+6YWViXJiJxLuGTDw21KyIipUlmZiY333wzr7zyCr179wagZcuWpKWlMXr0aHr06MGSJUt4/PHHSUtLy040WrVqxSeffMLjjz/OuHHjso9344038scff/DFF1/QoUMHnnjiCYYOHRrKtYlI/Csxo12FRc2uRESkNNm9eze7d++mbNmyubaXLVuWrKwsALZv3569raAyADNnzmTMmDGMHz+eY489lgcffJCbbrqJJUuWxPgqRCRRJXzNh4iISEmzdetWfv75ZwCysrJYvnw5aWlp1KpVi8aNG3Pqqady0003UbVqVZo0acLHH3/MCy+8wP333w/AUUcdRfPmzRk8eDCjR4+mdu3avPHGG7z//vu8+eabAGzZsoUBAwYwbNgwTjnlFAAGDhzIa6+9xoABA/joo4/yHWlLRORQ6KkiIiJSwsybN482bdrQpk0bMjMzGTFiBG3atOGOO+4A4F//+hd/+ctfuOiiizjmmGO47777uOuuuxgyZAgASUlJTJs2jZSUFHr37k3Lli154YUXeP7557Obal1zzTVUrlyZUaNG5Tr3s88+y7fffsujjz4a7EWLSEJI+JoP9fkQEZGSpnPnzrh7gfvr1avH888/v99jtGjRYp/Zy3N69tln893esGFDfv/998IFKiJSRAlf86E+HyIiIiIiwUj45ENERERERIKh5ENERERERAKR8MmHmfU2s2c2bdoUdigiIiIiInEt4ZMP9fkQEREREQlGwo92JSIiUhR207qwQ4gLfl9K2CGISAgSvuZDRERERESCoeRDREREREQCoeRDREREREQCkfDJh0a7EhEREREJRsInHxrtSkREREQkGAmffIiIiIiISDCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCCUfIiIiIiISCASPvnQULsiIiIiIsFI+ORDQ+2KiIiIiAQj4ZMPEREREREJhpIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJhJIPEREREREJRFwmH2Z2uJnNNLPvzexbM6sSdkwiIiIiIomuXNgBxMh44DZ3/8TMagE7Q45HRERERCThxV3yYWbHArvd/RMAd98QckgiIiIiIkLAza7MrJOZTTGzVWbmZtY/nzKDzWypme0ws/lmdkoRT9MC2GpmU83sKzO7pViCFxERERGRQxJ0zUdVYCHwQnTJxcz6Ao8Cg4HZ0X/fMbNj3H15tEwa+cfd3d1XR/edArQGfgPeNbMv3f39Yr8aEREREREptECTD3efBkwDMLPx+RQZDox397HR9aFm1gO4Erg5eozWBzjNKmCeu6+InmcakUREyYeIiIiISIjM3cM5sdlWYIi7j4+ulwe2A/+fu7+So9yTwHHufmohj1sO+BLoAmwC3gSedve38ik7CBgUXf0z8NNBX1B8SgYywg5Cikz3rXTSfdtXE3dPCTuI0sjMBrn7M2HHIUWj+1Y66b4VTUnqcJ4MlAXS82xPB7oW9iDu/ke0n8cs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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.encoders import RegressionEncoder\n", - "from gators.encoders import WOEEncoder\n", - "from gators.imputers import ObjectImputer\n", - "from gators.binning import QuantileDiscretizer\n", - "titanic_df = pd.read_parquet(titanic_file_location)\n", - "print(titanic_df.info())\n", - "#imputer = ObjectImputer(strategy='most_frequent')\n", - "#titanic_df = imputer.fit_transform(titanic_df)\n", - "columns = [\"Sex\", \"Survived\"]\n", - "sf_crime_df = titanic_df[columns]\n", - "objs = [RegressionEncoder(encoder=WOEEncoder(), discretizer=QuantileDiscretizer(n_bins=3, inplace=True))]\n", - "bench_scalers = benchmark.run_X(objs, sf_crime_df, columns, n_vec=n_vec, y=titanic_df[\"Survived\"])\n", - "plot_all(bench_scalers, name= \"RegressionEncoder\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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lbWu2z0i3o2In2T9niSVryaVfADtgGeBE4GltQsjYgRwBXAhsCvwT+DuiNgyyyAlScrYi0CPattO1cp61NqG58/fBpBSWgKMBL4XEV+p9rrrgJeASwoauSRV06SSj5TSlJTST1NKtwOr6qhyCjAxpXRtSun5lNIJwNvAcfnyt6jZ0tErf06SpOZsRUppfrXt3dUFtc7PBw4BXkopPVStzgzgMuD6iOgQEd8BhgAjU0p1/b2VypatjYW1cbEDqK+I2AQYCEyoVTQV2CO//ziwY0T0Ijfg/ADgvHVccywwFqBt27YDt91228YOW5L0Gc2aNWtBSqlrPaqWzswpdRg/fjyXXHIJPXv2TK1atWK33XbjwgsvZKuttlqj7scff0y7du0YP3481Pq9fPLJJwwcOJB+/fp98NBDD3HRRRcxbty4f2f0NqRmY/z48dx66608+OCDVedatGjRnfz/U2+//XaN+jNnzmT48OE8+OCD44BxKSVmzJjB4MGDv/CPf/zj+K98JdfgeNBBB7Fw4UIefvjhi4CLMno7xRJrK2g2yQfQBWgBVNY6XwkMBUgprYiIU4EHyLXqXLKuma5SStcA1wBUVFSkmTNnFiJuSdJnEBGvFTuGpmC33XZj4sSJbLvttrzzzjucf/757LHHHsyZM4fOnTvXqHvzzTfz6aefMnLkyDWus8kmm3DllVey7777MnjwYI477rg16kjK2Xjjjdliiy3qLKt9/q677mLrrbfmy1/+ctW5QYMGceqppzJ69GieeeYZ7rjjDu6//37+9a9/sdFGTarjUeZK7t2nlCallLZOKfXPJxfrFBHDI+KaRYsWZRGeJEkNcsABB/CNb3yDnXfemaFDh/LXv/6VVatWccMNN6xR99prr+WQQw6ha9e6G4x++9vf0qZNG55//nkWLFhQ6NClZuuVV16hZ8+e9OvXj29+85u88sorddb7+OOPufXWWxkzZswaZeeeey4dOnTgqKOO4uSTT+bSSy+lf//+hQ69yWtOyccCYCXQvdb57sD8NavXT0ppckppbIcOHTYkNkmSMtGuXTt22GEH/v3vmj2mZs+ezcyZM+v8RxDAn//8Z2677TYeeughevfubcuHtBarWxv//ve/c+211zJ//nz22GMP3ntvzc409WltnDx5Mrvssov/z+U1m+QjpfQpuUUD96tVtB+5Wa8+E1s+JEnNybJly3jhhRfo0aNHjfPXXHMN/fr1Y+jQoWu85p133uHYY4/lrLPOoqKightuuIHJkydzyy23ZBW21GzY2lhYTSr5iIh2EbFLROxCLrYt88erp9L9OTAqIo6JiO0i4gpya3v8+rPe05YPSVJTdtppp/HQQw8xd+5cHnvsMY444ggWL15c45vWJUuWcNNNN/Hd736XiDXHeX7ve9+jX79+/OQnuUl2dtxxR8455xxOOOEEKitrD6WUVJ2tjY2rqQ04ryA3WHy1c/LbDcColNIfI6IzcCa5ucyfBQ5MKTkoUVLBrFq1igULFvDBBx+wcuXKYodTMlq0aMHmm29Oly5dyn4A5rq8+eabfOtb32LBggV07dqV3XffnUcffZQ+ffpU1fnjH//I4sWLGT169Bqvv/HGG7n77rt56qmnaNGiRdX5H/7wh9x1112MHTuWu+66K5P3IjVHq1sb99133xrnG9raOHDgQG655Ra+9a1vZRV6kxQplfQMhesVEcOB4f379x9TO6OVJIDXX3+diKB79+60bNmyzm+W1TApJZYvX05lZSUpJbbccs21YiNiVkqpoj6Xa/wIJZWr0047jeHDh7PlllvyzjvvcN555zFt2jSeeeaZqqR/yZIl9OjRgx/96EecccYZa1zjsMMOY968efzzn/+sSvovvvhiJkyYwJw5c+jevfYQ5pKz1j+UZf9Vk92uJK3P4sWL6dWrF5tssomJRyOJCDbZZBN69erF4sWLix2OJFVZ3dq4zTbbcNhhh9GqVavP1Np4ww03rNHa+IUvfIGxY8dm8j6aqrJPPiSpPuwWVBj+XlXKzj77bCKixlZ9jYhRo0atUb777rtXlc+fP58uXbpw2WWX1bjunDlz2HTTTbn11lszey/l5NZbb+Wtt97i008/Zd68edxxxx1sv/32NeqMHj2aFStW0LNnzzVef9RRR7F06VJqL17dokULZsyYUfbdHJvamI/MVet2VexQJElSidlmm21qr5Rdo3zo0KHceOONVcebbLJJ1f4WW2zBVVddxahRozjggAPYfvvtWb58OUcffTRf//rX+eY3v1nw+KXGVvZfOdntSpLqp2/fvtx3333FDkNqVlavlL16qz0la6tWrWqUd+rUqUb5iBEjOOSQQzj66KNZsWIF5513Hm+//TZXX311lm9DajRl3/IhSZ/Fo4M/X9Dr7z7t5YJeX1I2Vq+U3apVK3bbbTcuvPBCttpqq6ryRx55hG7durH55pvz5S9/mQsuuIBu3brVuMbVV1/NDjvswJFHHsmdd97JXXfdtUaSIjUXZZ982O1KktQQ8ZN3ix1CSUgX170oWylZvVL2tttuyzvvvMP555/PHnvswZw5c+jcuTP7778/hx12GP369ePVV1/lzDPPZMiQIcyaNYtWrVpVXadTp05cdNFFjB49mqOOOooDDzywiO9K2jB2u7LblaRmrm/fvlx00UVsv/32dOzYkdGjR7Ns2TLef/99DjroILp27UrHjh056KCDePPNN6tet88++/Czn/2MPffck80224xhw4bVWIH3xhtvpE+fPnTu3JkLLrigxj0ff/xxBg0axOabb06PHj04/vjj+fTTT4HcNLonn3wy3bp1o3379uy00048++yz2fwypCZkfStlf/Ob3+Tggw9mp512Yvjw4dx99928+OKL/O1vf6txnVWrVnH99dfTpk0bnnjiCZYtW1aMtyM1irJv+ZCkUnDTTTdxzz330LZtW4YPH87555/PySefzOjRo7nttttYuXIl3/nOdzj++OP5y1/+UvW6m2++mbvvvpvevXtzwAEHMGHCBC6++GKee+45jjvuOKZMmcJuu+3G6aefXiNxadGiBb/4xS+oqKjgzTff5IADDuDqq6/mpJNOYurUqUybNo2XXnqJDh068MILL7D55ptn/0uRmpi1rZS9Ws+ePfnc5z63Rvnll1/OM888wxNPPMFXv/pVzjjjjDVmwCpVtjQ2jqbU0lj2LR+SVAqOP/54evfuTadOnTjjjDO45ZZb6Ny5M4cffjht2rRhs80244wzzuChhx6q8brRo0ez9dZb07p1a77xjW8we/ZsAG6//XYOOuggBg8eTKtWrTjvvPNqTIs7cOBAdt99dzbeeGP69u3LscceW3Xtli1b8tFHH/HCCy+QUmK77bajR48emf0upKZq9UrZa/v/YcGCBcybN69G+fPPP88ZZ5zBlVdeyfbbb89vf/tbrrjiCqZPn55V2FKjMvmQpBLQu3fvqv0+ffrw1ltvsWTJEo499lj69OlD+/btGTx4MB988AErV66sqlt9zYE2bdrw8ccfA/DWW2/VuGbbtm3p3Llz1fFLL73EQQcdxBZbbEH79u356U9/WtVla8iQIRx//PF8//vfp1u3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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from gators.imputers import FloatImputer\n", - "X = pd.DataFrame({'A':[1.0,2.1, np.nan, 2.2]})\n", - "columns = [\"A\"]\n", - "objs = [FloatImputer(strategy='mean')]\n", - "bench_scalers = benchmark.run_X(objs, X, columns, n_vec=n_vec)\n", - "plot_all(bench_scalers, name= \"FloatImputer\")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "housing_df = pd.read_parquet(housing_file_location)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "housing_df = pd.read_parquet(housing_file_location)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 1201.000000\n", - "mean 70.049958\n", - "std 24.284752\n", - "min 21.000000\n", - "25% 59.000000\n", - "50% 69.000000\n", - "75% 80.000000\n", - "max 313.000000\n", - "Name: LotFrontage, dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "housing_df[\"LotFrontage\"].describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "gators", - "language": "python", - "name": "gator" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/data/house_prices.parquet b/examples/data/house_prices.parquet new file mode 100644 index 00000000..1e310648 Binary files /dev/null and b/examples/data/house_prices.parquet differ diff --git a/examples/data/sf_crime.csv b/examples/data/sf_crime.csv new file mode 100644 index 00000000..86f828bd --- /dev/null +++ b/examples/data/sf_crime.csv @@ -0,0 +1,10081 @@ +,Dates,Category,PdDistrict,Address,X,Y +61,2015-05-13 19:26:00,DRUNKENNESS,CENTRAL,900 Block of BUSH ST,-122.41292895522,37.7896868265784 +242,2015-05-13 12:21:00,KIDNAPPING,INGLESIDE,1500 Block of DOLORES ST,-122.424347725679,37.7450456172368 +280,2015-05-13 09:00:00,RUNAWAY,INGLESIDE,5700 Block of MISSION ST,-122.449674980499,37.709762526111 +328,2015-05-13 04:45:00,KIDNAPPING,SOUTHERN,1500 Block of MARKET ST,-122.419666717917,37.7746823329875 +374,2015-05-12 22:25:00,KIDNAPPING,CENTRAL,200 Block of KEARNY ST,-122.403915681571,37.790538993725 +661,2015-05-12 01:46:00,ARSON,BAYVIEW,1400 Block of SELBY ST,-122.401152370981,37.738362825899294 +664,2015-05-12 01:40:00,DRUNKENNESS,RICHMOND,4700 Block of GEARY BL,-122.470190415901,37.7808757916602 +685,2015-05-12 00:10:00,DRUNKENNESS,INGLESIDE,3100 Block of MISSION ST,-122.418609719102,37.7474453071495 +875,2015-05-11 16:00:00,KIDNAPPING,INGLESIDE,100 Block of STONERIDGE LN,-122.426222140045,37.710019035369 +981,2015-05-11 11:45:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +1060,2015-05-11 07:30:00,KIDNAPPING,NORTHERN,1200 Block of SUTTER ST,-122.420941906085,37.7875961622012 +1076,2015-05-11 05:00:00,ARSON,SOUTHERN,200 Block of FOLSOM ST,-122.392347671978,37.7890603555993 +1203,2015-05-03 19:05:00,DRUNKENNESS,TENDERLOIN,HYDE ST / EDDY ST,-122.415885065788,37.783516056415294 +1332,2015-05-03 13:00:00,KIDNAPPING,TARAVAL,9TH AV / LINCOLN WY,-122.46644268420602,37.7659245297691 +1428,2015-05-03 02:35:00,DRUNKENNESS,TARAVAL,700 Block of FONT BL,-122.483569270838,37.7230650556781 +1430,2015-05-03 02:30:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +1465,2015-05-03 00:40:00,KIDNAPPING,CENTRAL,900 Block of HYDE ST,-122.417044292614,37.78959527743221 +1478,2015-05-03 00:09:00,DRUNKENNESS,TARAVAL,200 Block of ARBALLO DR,-122.482571730558,37.7214219003204 +1757,2015-05-02 10:40:00,KIDNAPPING,NORTHERN,1500 Block of EDDY ST,-122.433155869003,37.78126734681 +1800,2015-05-02 05:48:00,DRUNKENNESS,TARAVAL,200 Block of ARBALLO DR,-122.482571730558,37.7214219003204 +1802,2015-05-02 05:39:00,ARSON,RICHMOND,200 Block of 11TH AV,-122.469906688039,37.7836161897605 +1825,2015-05-02 02:27:00,DRUNKENNESS,MISSION,3000 Block of 16TH ST,-122.421662616877,37.7648758178404 +1899,2015-05-01 22:07:00,KIDNAPPING,TARAVAL,200 Block of HOLLOWAY AV,-122.45564374772,37.7217922825182 +1917,2015-05-01 21:15:00,ARSON,TENDERLOIN,200 Block of MCALLISTER ST,-122.416577792446,37.780614876154 +1933,2015-05-01 20:00:00,ARSON,SOUTHERN,1800 Block of MARKET ST,-122.423715048532,37.7717810622866 +2268,2015-04-30 23:00:00,KIDNAPPING,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +2278,2015-04-30 22:50:00,KIDNAPPING,CENTRAL,500 Block of STOCKTON ST,-122.407233499106,37.7905223625299 +2366,2015-04-30 19:12:00,KIDNAPPING,MISSION,800 Block of CHURCH ST,-122.428078855496,37.75768610032871 +2511,2015-04-30 13:00:00,DRUNKENNESS,TENDERLOIN,500 Block of HYDE ST,-122.416459785313,37.7860170554787 +2653,2015-04-30 00:50:00,KIDNAPPING,TARAVAL,2400 Block of 46TH AV,-122.504484775464,37.7408208732724 +2787,2015-04-29 18:49:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +2808,2015-04-29 18:00:00,KIDNAPPING,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +2809,2015-04-29 18:00:00,KIDNAPPING,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +2814,2015-04-29 18:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +2890,2015-04-29 14:45:00,KIDNAPPING,BAYVIEW,3RD ST / NEWCOMB AV,-122.390416955474,37.7355926105862 +2982,2015-04-29 10:39:00,KIDNAPPING,TENDERLOIN,LEAVENWORTH ST / TURK ST,-122.414056291891,37.7827931071006 +3052,2015-04-29 06:35:00,ARSON,RICHMOND,700 Block of 23RD AV,-122.482184155412,37.77357976865471 +3071,2015-04-29 04:17:00,DRUNKENNESS,MISSION,4500 Block of 18TH ST,-122.440485645784,37.7605003986524 +3096,2015-04-29 01:05:00,ARSON,CENTRAL,1200 Block of UNION ST,-122.419593646454,37.7991861177677 +3173,2015-04-28 20:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +3449,2015-04-28 01:25:00,ARSON,SOUTHERN,1100 Block of MISSION ST,-122.411626152299,37.77858957403121 +3919,2015-04-19 21:40:00,DRUNKENNESS,MISSION,3900 Block of 17TH ST,-122.433500504054,37.7625297461241 +4073,2015-04-19 15:20:00,DRUNKENNESS,TENDERLOIN,100 Block of POWELL ST,-122.40801449292,37.7859507767613 +4094,2015-04-19 14:51:00,DRUNKENNESS,CENTRAL,STOCKTON ST / UNION ST,-122.409193904616,37.800443875105294 +4105,2015-04-19 14:30:00,KIDNAPPING,BAYVIEW,400 Block of TUNNEL AV,-122.401399497577,37.70911172039371 +4228,2015-04-19 04:37:00,DRUNKENNESS,PARK,FELL ST / DIVISADERO ST,-122.437612766191,37.7740604119579 +4232,2015-04-19 04:15:00,KIDNAPPING,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +4233,2015-04-19 04:15:00,KIDNAPPING,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +4246,2015-04-19 03:00:00,DRUNKENNESS,SOUTHERN,800 Block of MISSION ST,-122.404636264759,37.7842645474624 +4311,2015-04-18 23:59:00,DRUNKENNESS,PARK,GEARY BL / BAKER ST,-122.442795743643,37.7828833959001 +4324,2015-04-18 23:13:00,DRUNKENNESS,SOUTHERN,NEWMONTGOMERY ST / MARKET ST,-122.402070243227,37.788719868813295 +4348,2015-04-18 22:27:00,DRUNKENNESS,BAYVIEW,4800 Block of 3RD ST,-122.390965298144,37.7344291807899 +4637,2015-04-18 09:09:00,ARSON,NORTHERN,2900 Block of DIVISADERO ST,-122.442254995811,37.7967153758518 +4708,2015-04-18 01:30:00,KIDNAPPING,TARAVAL,1200 Block of 20TH AV,-122.478187458009,37.764441968542 +4729,2015-04-18 00:01:00,KIDNAPPING,MISSION,3800 Block of 18TH ST,-122.429490357681,37.761276012999296 +4733,2015-04-18 00:01:00,KIDNAPPING,NORTHERN,HAYES ST / POLK ST,-122.418045452768,37.7775118895695 +4877,2015-04-17 18:30:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +5163,2015-04-17 01:50:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 19TH AV,-122.475644251197,37.7430505534925 +5314,2015-04-16 17:50:00,KIDNAPPING,INGLESIDE,700 Block of MOSCOW ST,-122.431690484339,37.7157728286068 +5557,2015-04-16 01:13:00,ARSON,INGLESIDE,2400 Block of ALEMANY BL,-122.445255696193,37.7157170897971 +5570,2015-04-16 00:30:00,ARSON,PARK,100 Block of PARNASSUS AV,-122.450480413582,37.7647201806273 +5635,2015-04-15 21:14:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421876488492,37.7640888944532 +5849,2015-04-15 12:25:00,RUNAWAY,TENDERLOIN,300 Block of TAYLOR ST,-122.411302813025,37.7855355791102 +5942,2015-04-15 07:42:00,KIDNAPPING,NORTHERN,1800 Block of UNION ST,-122.429741294345,37.7977645712284 +5974,2015-04-15 02:58:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +5976,2015-04-15 02:49:00,DRUNKENNESS,TARAVAL,0 Block of CAMBON DR,-122.474444639595,37.718302204766005 +6095,2015-04-14 21:00:00,KIDNAPPING,MISSION,16TH ST / POTRERO AV,-122.407538332319,37.7657827544276 +6265,2015-04-14 13:00:00,ARSON,TARAVAL,0 Block of CHUMASERO DR,-122.472875861339,37.713317784448 +6343,2015-04-14 08:00:00,RUNAWAY,PARK,0 Block of VEGA ST,-122.445893581212,37.7801242878056 +6372,2015-04-14 04:15:00,DRUNKENNESS,TENDERLOIN,500 Block of OFARRELL ST,-122.413820070176,37.7857382950322 +6725,2015-04-13 07:30:00,RUNAWAY,INGLESIDE,5700 Block of MISSION ST,-122.449674980499,37.709762526111 +6800,2015-04-05 23:40:00,DRUNKENNESS,CENTRAL,1000 Block of BUSH ST,-122.414576897,37.7894768075723 +6832,2015-04-05 21:44:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +6871,2015-04-05 20:00:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +7104,2015-04-05 04:42:00,ARSON,CENTRAL,1900 Block of LEAVENWORTH ST,-122.417429817096,37.799176058463296 +7145,2015-04-05 00:25:00,DRUNKENNESS,NORTHERN,400 Block of HAYES ST,-122.423749669429,37.776729432919005 +7175,2015-04-04 23:40:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.422388599852,37.7648319521443 +7202,2015-04-04 22:50:00,ARSON,NORTHERN,1700 Block of FILBERT ST,-122.428306500557,37.7990143347959 +7234,2015-04-04 21:50:00,DRUNKENNESS,NORTHERN,1200 Block of POLK ST,-122.420326993863,37.7884521578132 +7391,2015-04-04 14:19:00,DRUNKENNESS,RICHMOND,5600 Block of GEARY BL,-122.479912728919,37.78018134996579 +7416,2015-04-04 13:28:00,DRUNKENNESS,SOUTHERN,VALENCIA ST / MCCOPPIN ST,-122.422526328922,37.7715962069104 +7526,2015-04-04 08:08:00,KIDNAPPING,TENDERLOIN,LEAVENWORTH ST / TURK ST,-122.414056291891,37.7827931071006 +7568,2015-04-04 01:15:00,RUNAWAY,MISSION,2600 Block of MISSION ST,-122.41860030588998,37.7546255872838 +7576,2015-04-04 00:30:00,ARSON,CENTRAL,600 Block of UNION ST,-122.40968720575,37.8003260482415 +7688,2015-04-03 20:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +8053,2015-04-02 23:56:00,DRUNKENNESS,MISSION,16TH ST / RONDEL PL,-122.421240281394,37.76495589279121 +8065,2015-04-02 23:00:00,ARSON,NORTHERN,2400 Block of FILBERT ST,-122.439793801245,37.7974418348099 +8125,2015-04-02 20:58:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +8202,2015-04-02 18:10:00,ARSON,SOUTHERN,0 Block of SHERMAN ST,-122.405924386123,37.7766015774052 +8417,2015-04-02 07:00:00,RUNAWAY,RICHMOND,600 Block of 37TH AV,-122.497454405818,37.7766263429845 +8565,2015-04-01 18:37:00,DRUNKENNESS,MISSION,CHURCH ST / LIBERTY ST,-122.427972178216,37.757291921351 +8586,2015-04-01 17:59:00,DRUNKENNESS,MISSION,2900 Block of 24TH ST,-122.411426024108,37.7526019706042 +8609,2015-04-01 17:15:00,KIDNAPPING,MISSION,MISSION ST / 20TH ST,-122.419052694349,37.7586324051562 +8649,2015-04-01 16:00:00,KIDNAPPING,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +8782,2015-04-01 08:30:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +8897,2015-03-31 21:00:00,ARSON,SOUTHERN,MCCOPPIN ST / STEVENSON ST,-122.421748892194,37.7716418466942 +9109,2015-03-31 12:58:00,DRUNKENNESS,TENDERLOIN,200 Block of TAYLOR ST,-122.411115854179,37.78460808188871 +9288,2015-03-30 22:23:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.419814593811,37.7658427213372 +9496,2015-03-30 14:30:00,KIDNAPPING,TARAVAL,1700 Block of 9TH AV,-122.465793842323,37.7556246702007 +9641,2015-03-30 04:45:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +9731,2015-03-22 20:15:00,DRUNKENNESS,RICHMOND,300 Block of 5TH AV,-122.463348348807,37.7820081056628 +9756,2015-03-22 19:00:00,KIDNAPPING,MISSION,1300 Block of YORK ST,-122.407890160743,37.7504458171938 +9864,2015-03-22 14:05:00,RUNAWAY,MISSION,1700 Block of FOLSOM ST,-122.415543452448,37.7689495838525 +9892,2015-03-22 13:10:00,KIDNAPPING,BAYVIEW,400 Block of AMHERST ST,-122.415247116726,37.7239096674854 +9940,2015-03-22 10:30:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +10037,2015-03-22 01:32:00,KIDNAPPING,RICHMOND,SUTTER ST / SCOTT ST,-122.438207824401,37.7854586086809 +10044,2015-03-22 01:25:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423637302048,37.7648666651043 +10120,2015-03-21 22:04:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +10318,2015-03-21 14:11:00,DRUNKENNESS,TARAVAL,33RD AV / TARAVAL ST,-122.490691492512,37.7423880046588 +10331,2015-03-21 13:45:00,DRUNKENNESS,SOUTHERN,600 Block of MARKET ST,-122.403070886779,37.7877867423496 +10412,2015-03-21 08:00:00,DRUNKENNESS,SOUTHERN,200 Block of FOLSOM ST,-122.392347671978,37.7890603555993 +10451,2015-03-21 02:05:00,DRUNKENNESS,BAYVIEW,2400 Block of SAN BRUNO AV,-122.404952461327,37.7307376243582 +10461,2015-03-21 01:32:00,DRUNKENNESS,TARAVAL,CRESPI DR / 19TH AV,-122.475223128467,37.7204418078734 +10522,2015-03-20 23:00:00,DRUNKENNESS,MISSION,3100 Block of 22ND ST,-122.41821569477,37.7554138872049 +10534,2015-03-20 22:38:00,DRUNKENNESS,NORTHERN,2500 Block of SACRAMENTO ST,-122.434876844289,37.789785369956896 +10745,2015-03-20 14:45:00,RUNAWAY,NORTHERN,700 Block of GOLDEN GATE AV,-122.42291369529,37.7806600950548 +10888,2015-03-20 06:30:00,ARSON,NORTHERN,BAY ST / BUCHANAN ST,-122.433332271053,37.8030557323315 +10929,2015-03-20 01:10:00,KIDNAPPING,BAYVIEW,900 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +11384,2015-03-19 00:20:00,DRUNKENNESS,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +11517,2015-03-18 17:30:00,KIDNAPPING,CENTRAL,600 Block of STOCKTON ST,-122.407354509443,37.7917926375029 +11540,2015-03-18 17:00:00,KIDNAPPING,BAYVIEW,1000 Block of LECONTE AV,-122.39800417734,37.7190331787318 +11744,2015-03-18 02:55:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +11756,2015-03-18 01:39:00,ARSON,CENTRAL,300 Block of SUTTER ST,-122.40618184105,37.7894765068014 +11769,2015-03-18 00:30:00,KIDNAPPING,CENTRAL,BATTERY ST / CALIFORNIA ST,-122.399962950879,37.7932093101245 +11834,2015-03-17 21:30:00,RUNAWAY,CENTRAL,1000 Block of CHESTNUT ST,-122.420666812024,37.8028627711287 +12238,2015-03-16 22:25:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +12371,2015-03-16 17:07:00,DRUNKENNESS,SOUTHERN,600 Block of MINNA ST,-122.41108692372,37.7781634278768 +12389,2015-03-16 16:47:00,DRUNKENNESS,TARAVAL,0 Block of WESTPORTAL AV,-122.466448582438,37.7403329886376 +12549,2015-03-16 08:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +12550,2015-03-16 08:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +12584,2015-03-16 05:11:00,ARSON,BAYVIEW,1200 Block of PENNSYLVANIA AV,-122.392623643609,37.7517100089534 +12621,2015-03-16 00:08:00,ARSON,MISSION,600 Block of VALENCIA ST,-122.421609674066,37.7627519883966 +12660,2015-03-08 22:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +12698,2015-03-08 20:43:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +12764,2015-03-08 17:38:00,DRUNKENNESS,TENDERLOIN,JONES ST / OFARRELL ST,-122.412970537591,37.78578837668879 +12906,2015-03-08 11:20:00,DRUNKENNESS,CENTRAL,GEARY ST / STOCKTON ST,-122.406592269796,37.7875673013055 +12933,2015-03-08 10:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +12966,2015-03-08 07:40:00,DRUNKENNESS,NORTHERN,600 Block of LINDEN ST,-122.428666208752,37.7757342027431 +12990,2015-03-08 03:10:00,KIDNAPPING,NORTHERN,1500 Block of LOMBARD ST,-122.427042151546,37.8011054678398 +13002,2015-03-08 01:30:00,DRUNKENNESS,SOUTHERN,0 Block of 9TH ST,-122.414953043045,37.7765019124574 +13031,2015-03-08 00:01:00,KIDNAPPING,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +13074,2015-03-07 22:30:00,DRUNKENNESS,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +13235,2015-03-07 16:00:00,KIDNAPPING,RICHMOND,800 Block of 26TH AV,-122.48525926398,37.7734393135661 +13326,2015-03-07 12:20:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +13413,2015-03-07 04:38:00,ARSON,RICHMOND,1100 Block of 9TH AV,-122.466504397113,37.7662014296859 +13433,2015-03-07 03:15:00,ARSON,BAYVIEW,CRISP RD / PALOU AV,-122.379995240287,37.7277878205458 +13566,2015-03-06 21:31:00,KIDNAPPING,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.411268613368,37.782250087316704 +13901,2015-03-06 06:00:00,RUNAWAY,INGLESIDE,1500 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +13912,2015-03-06 04:30:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +13996,2015-03-05 22:23:00,ARSON,MISSION,300 Block of SANCARLOS ST,-122.419832741614,37.7577669901356 +14425,2015-03-04 22:46:00,KIDNAPPING,INGLESIDE,1600 Block of DOLORES ST,-122.42449818088998,37.743411584037 +14535,2015-03-04 18:55:00,DRUNKENNESS,PARK,1100 Block of DIVISADERO ST,-122.438957266063,37.7801176641601 +14839,2015-03-04 01:30:00,ARSON,NORTHERN,1700 Block of SACRAMENTO ST,-122.421720672696,37.7914446364385 +15000,2015-03-03 18:27:00,KIDNAPPING,NORTHERN,700 Block of LAGUNA ST,-122.426431627648,37.7776339847429 +15033,2015-03-03 17:30:00,ARSON,BAYVIEW,1100 Block of INGALLS ST,-122.380662772054,37.7304510220681 +15068,2015-03-03 16:15:00,DRUNKENNESS,CENTRAL,1000 Block of COLUMBUS AV,-122.415115800125,37.8037807941664 +15131,2015-03-03 14:21:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +15547,2015-03-02 13:37:00,DRUNKENNESS,INGLESIDE,100 Block of BRAZIL AV,-122.43358909542,37.7241677671483 +15973,2015-02-22 11:45:00,DRUNKENNESS,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +16070,2015-02-22 03:31:00,ARSON,MISSION,SHOTWELL ST / 17TH ST,-122.416230392543,37.7636337702985 +16153,2015-02-21 23:40:00,DRUNKENNESS,RICHMOND,6200 Block of GEARY BL,-122.486347492453,37.779894591415 +16186,2015-02-21 22:30:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +16213,2015-02-21 21:30:00,KIDNAPPING,INGLESIDE,3000 Block of ALEMANY BL,-122.454409729267,37.710517108365394 +16560,2015-02-21 01:30:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413287527194,37.7711962032376 +16581,2015-02-21 00:05:00,DRUNKENNESS,INGLESIDE,MISSION ST / POWERS AV,-122.419506076125,37.7461841911818 +16603,2015-02-20 23:45:00,KIDNAPPING,CENTRAL,LEAVENWORTH ST / GEARY ST,-122.414809966357,37.7865194111614 +16619,2015-02-20 23:10:00,KIDNAPPING,SOUTHERN,1900 Block of MARKET ST,-122.425669041358,37.7702451976438 +16702,2015-02-20 20:00:00,ARSON,MISSION,1500 Block of BRYANT ST,-122.410738097315,37.767524308783 +16884,2015-02-20 13:40:00,KIDNAPPING,TARAVAL,1300 Block of 47TH AV,-122.506994366516,37.761292552214 +16993,2015-02-20 09:30:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +17075,2015-02-20 01:06:00,ARSON,SOUTHERN,400 Block of JESSIE ST,-122.408437135288,37.781954394999794 +17175,2015-02-19 20:17:00,DRUNKENNESS,TARAVAL,1200 Block of 9TH AV,-122.466444373211,37.7649596797552 +17594,2015-02-18 19:00:00,ARSON,BAYVIEW,1900 Block of CARROLL AV,-122.399768270061,37.72888128178671 +17723,2015-02-18 15:00:00,DRUNKENNESS,TARAVAL,19TH AV / IRVING ST,-122.477172370751,37.763558459678 +17835,2015-02-18 10:02:00,DRUNKENNESS,CENTRAL,600 Block of FILBERT ST,-122.410220142966,37.8013225692058 +18006,2015-02-17 19:45:00,DRUNKENNESS,BAYVIEW,1400 Block of OAKDALE AV,-122.387527753438,37.73305496510249 +18317,2015-02-17 03:30:00,KIDNAPPING,INGLESIDE,BAY SHORE BL / SUNNYDALE AV,-122.405109485404,37.7088563076781 +18346,2015-02-17 00:33:00,DRUNKENNESS,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +18461,2015-02-16 18:53:00,DRUNKENNESS,SOUTHERN,200 Block of FOLSOM ST,-122.392347671978,37.7890603555993 +18534,2015-02-16 16:05:00,KIDNAPPING,NORTHERN,600 Block of LARCH ST,-122.428129865519,37.7814240041364 +18616,2015-02-16 13:02:00,KIDNAPPING,BAYVIEW,1800 Block of BAY SHORE BL,-122.398604184321,37.718274811427605 +18617,2015-02-16 13:02:00,KIDNAPPING,BAYVIEW,1800 Block of BAY SHORE BL,-122.398604184321,37.718274811427605 +18684,2015-02-16 10:00:00,DRUNKENNESS,CENTRAL,600 Block of FILBERT ST,-122.410220142966,37.8013225692058 +18815,2015-02-08 22:25:00,KIDNAPPING,CENTRAL,600 Block of GEARY ST,-122.414010814727,37.7866770011071 +19051,2015-02-08 09:30:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +19088,2015-02-08 07:10:00,ARSON,BAYVIEW,900 Block of INGERSON AV,-122.392493074979,37.718903919212 +19089,2015-02-08 07:10:00,ARSON,BAYVIEW,1200 Block of FITZGERALD AV,-122.392216911504,37.7215602036508 +19133,2015-02-08 01:50:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.414224026965,37.7715982798716 +19316,2015-02-07 15:46:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421644478447,37.7429970144076 +19389,2015-02-07 12:06:00,DRUNKENNESS,SOUTHERN,1600 Block of MARKET ST,-122.421522300696,37.7732180675925 +19462,2015-02-07 08:00:00,ARSON,NORTHERN,2700 Block of POLK ST,-122.423064957893,37.8020242365357 +19562,2015-02-06 21:35:00,DRUNKENNESS,PARK,DIVISADERO ST / FULTON ST,-122.438180582321,37.77685569004471 +19571,2015-02-06 21:00:00,ARSON,CENTRAL,700 Block of BAY ST,-122.419359266314,37.8048384367685 +19703,2015-02-06 16:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +19985,2015-02-05 21:29:00,DRUNKENNESS,BAYVIEW,1500 Block of NEWCOMB AV,-122.388817917114,37.734752508079296 +20108,2015-02-05 15:57:00,DRUNKENNESS,SOUTHERN,1ST ST / HOWARD ST,-122.396039441019,37.78853681880009 +20656,2015-02-04 12:23:00,DRUNKENNESS,CENTRAL,600 Block of FILBERT ST,-122.410199135855,37.8012139881945 +20767,2015-02-04 07:00:00,RUNAWAY,INGLESIDE,500 Block of CARTER ST,-122.423628041297,37.70880618460679 +20974,2015-02-03 18:00:00,ARSON,INGLESIDE,700 Block of ROLPH ST,-122.431015257276,37.7117445002313 +21036,2015-02-03 15:59:00,KIDNAPPING,TENDERLOIN,8TH ST / MARKET ST,-122.414743835382,37.77871926278901 +21067,2015-02-03 14:01:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +21080,2015-02-03 13:15:00,DRUNKENNESS,INGLESIDE,300 Block of SAWYER ST,-122.414200995694,37.7137889657104 +21081,2015-02-03 13:15:00,ARSON,INGLESIDE,300 Block of SAWYER ST,-122.414200995694,37.7137889657104 +21121,2015-02-03 11:49:00,DRUNKENNESS,CENTRAL,FILBERT ST / STOCKTON ST,-122.409373489901,37.8013694186977 +21217,2015-02-03 05:08:00,ARSON,BAYVIEW,0 Block of MIDDLEPOINT RD,-122.37934537972,37.73574190685721 +21318,2015-02-02 21:30:00,KIDNAPPING,NORTHERN,3000 Block of BUCHANAN ST,-122.432231936901,37.7979906413415 +21346,2015-02-02 20:30:00,ARSON,BAYVIEW,0 Block of REARDON RD,-122.376900658814,37.72948746365589 +21554,2015-02-02 12:56:00,ARSON,MISSION,200 Block of SHOTWELL ST,-122.416374835778,37.7644225165568 +21567,2015-02-02 12:00:00,DRUNKENNESS,CENTRAL,600 Block of FILBERT ST,-122.410220142966,37.8013225692058 +21610,2015-02-02 10:20:00,KIDNAPPING,INGLESIDE,200 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +21612,2015-02-02 10:05:00,ARSON,MISSION,500 Block of VALENCIA ST,-122.421876488492,37.7640888944532 +21654,2015-02-02 08:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +21690,2015-02-02 02:06:00,ARSON,BAYVIEW,INGERSON AV / GRIFFITH ST,-122.389279211854,37.716962016099 +21962,2015-01-25 10:59:00,DRUNKENNESS,SOUTHERN,5TH ST / MISSION ST,-122.406481972743,37.782731788488704 +22260,2015-01-24 17:00:00,RUNAWAY,TARAVAL,200 Block of MINERVA ST,-122.46089518582,37.715691664110295 +22437,2015-01-24 04:00:00,KIDNAPPING,PARK,900 Block of HAIGHT ST,-122.43788240956002,37.7711056996825 +22464,2015-01-24 02:15:00,KIDNAPPING,PARK,GOLDEN GATE AV / CENTRAL AV,-122.445156824183,37.777886258457 +22468,2015-01-24 02:03:00,DRUNKENNESS,SOUTHERN,300 Block of 2ND ST,-122.396331365685,37.7851663341318 +22497,2015-01-24 01:00:00,DRUNKENNESS,NORTHERN,2100 Block of CHESTNUT ST,-122.438701348232,37.8004498859761 +22582,2015-01-23 22:00:00,KIDNAPPING,INGLESIDE,30TH ST / MISSION ST,-122.421970919029,37.74237522452549 +22597,2015-01-23 21:33:00,ARSON,CENTRAL,1500 Block of JONES ST,-122.414985611799,37.795432562454 +22780,2015-01-23 15:36:00,DRUNKENNESS,RICHMOND,GEARY BL / ARGUELLO BL,-122.45886061567,37.7812550935484 +22875,2015-01-23 09:46:00,ARSON,MISSION,3100 Block of CESAR CHAVEZ ST,-122.412594354828,37.748166005622295 +22945,2015-01-23 01:55:00,ARSON,CENTRAL,1500 Block of JONES ST,-122.414985611799,37.795432562454 +23052,2015-01-22 20:00:00,KIDNAPPING,CENTRAL,700 Block of GEARY ST,-122.415654629547,37.7864672409674 +23236,2015-01-22 12:22:00,RUNAWAY,MISSION,3500 Block of CESAR CHAVEZ ST,-122.420832650303,37.7479994493226 +23363,2015-01-22 01:59:00,ARSON,CENTRAL,600 Block of CALIFORNIA ST,-122.405025778458,37.792508340252 +23435,2015-01-21 21:42:00,DRUNKENNESS,MISSION,200 Block of JERSEY ST,-122.430701301778,37.7506391353781 +23440,2015-01-21 21:10:00,DRUNKENNESS,PARK,HAIGHT ST / BUENAVISTAWEST AV,-122.443311949602,37.7704697548539 +23594,2015-01-21 14:00:00,RUNAWAY,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +23826,2015-01-20 21:10:00,ARSON,NORTHERN,1600 Block of CHESTNUT ST,-122.430493910342,37.8014931881504 +23905,2015-01-20 18:59:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +24069,2015-01-20 10:55:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +24093,2015-01-20 10:15:00,KIDNAPPING,INGLESIDE,800 Block of PARIS ST,-122.439164844648,37.716170199358 +24177,2015-01-20 03:01:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +24215,2015-01-19 23:57:00,ARSON,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +24219,2015-01-19 23:51:00,ARSON,CENTRAL,1000 Block of BUSH ST,-122.414554947333,37.789368344193896 +24225,2015-01-19 23:27:00,ARSON,INGLESIDE,300 Block of SUNRISE WY,-122.415720972438,37.7096906265635 +24229,2015-01-19 23:15:00,KIDNAPPING,SOUTHERN,0 Block of ISIS ST,-122.414683702768,37.7701114351492 +24345,2015-01-19 18:15:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +24612,2015-01-19 05:30:00,ARSON,TENDERLOIN,700 Block of OFARRELL ST,-122.417107256373,37.7853238292094 +24620,2015-01-19 04:34:00,ARSON,MISSION,0 Block of HARTFORD ST,-122.434051954938,37.7617484575612 +24625,2015-01-19 03:45:00,ARSON,MISSION,4000 Block of 19TH ST,-122.434314706976,37.759266711096295 +24708,2015-01-11 22:45:00,ARSON,TARAVAL,10TH AV / LINCOLN WY,-122.467514101042,37.7658764339105 +24749,2015-01-11 20:15:00,KIDNAPPING,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +24939,2015-01-11 09:31:00,DRUNKENNESS,PARK,1300 Block of HAIGHT ST,-122.444524277297,37.7703704336439 +24977,2015-01-11 04:45:00,DRUNKENNESS,BAYVIEW,JAMESTOWN AV / HARNEY WY,-122.386452097316,37.7111618712449 +24994,2015-01-11 03:10:00,DRUNKENNESS,BAYVIEW,1000 Block of OAKDALE AV,-122.380268162997,37.7289171340996 +25033,2015-01-11 01:00:00,ARSON,NORTHERN,2500 Block of CLAY ST,-122.43505280002,37.7906587149859 +25055,2015-01-10 23:51:00,DRUNKENNESS,MISSION,100 Block of COLLINGWOOD ST,-122.435964918002,37.7600122429873 +25145,2015-01-10 19:33:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +25258,2015-01-10 15:23:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +25450,2015-01-10 01:00:00,KIDNAPPING,SOUTHERN,11TH ST / FOLSOM ST,-122.41402726268998,37.7718636177154 +25453,2015-01-10 00:56:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +25461,2015-01-10 00:01:00,KIDNAPPING,NORTHERN,700 Block of ELLIS ST,-122.418562097105,37.78418470913029 +25612,2015-01-09 18:10:00,DRUNKENNESS,SOUTHERN,JONES ST / MARKET ST,-122.411979487494,37.7809039696758 +25696,2015-01-09 15:10:00,DRUNKENNESS,TENDERLOIN,LEAVENWORTH ST / TURK ST,-122.414056291891,37.7827931071006 +25754,2015-01-09 13:30:00,DRUNKENNESS,CENTRAL,200 Block of COLUMBUS AV,-122.405926769801,37.7972783315762 +25825,2015-01-09 10:16:00,KIDNAPPING,INGLESIDE,1900 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +25922,2015-01-09 01:35:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +25993,2015-01-08 21:55:00,DRUNKENNESS,NORTHERN,EDDY ST / FILLMORE ST,-122.432329732386,37.7814292195409 +26037,2015-01-08 20:00:00,ARSON,TARAVAL,CHUMASERO DR / GALINDO AV,-122.473183932765,37.7139711457355 +26190,2015-01-08 12:28:00,KIDNAPPING,SOUTHERN,1100 Block of FOLSOM ST,-122.409184636157,37.7756080205266 +26199,2015-01-08 12:15:00,DRUNKENNESS,CENTRAL,700 Block of FILBERT ST,-122.411854046278,37.801009939896296 +26245,2015-01-08 10:00:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +26387,2015-01-07 21:10:00,ARSON,TARAVAL,ALEMANY BL / CRYSTAL ST,-122.460622701872,37.7104779877599 +26406,2015-01-07 20:28:00,ARSON,PARK,1100 Block of SCOTT ST,-122.437236101904,37.7803348745141 +26704,2015-01-07 03:00:00,KIDNAPPING,PARK,1100 Block of PIERCE ST,-122.435590528188,37.7805435736467 +26964,2015-01-06 13:49:00,ARSON,NORTHERN,HAYES ST / POLK ST,-122.418045452768,37.7775118895695 +27105,2015-01-06 03:20:00,ARSON,CENTRAL,500 Block of SANSOME ST,-122.401469604468,37.7950962606048 +27111,2015-01-06 01:21:00,DRUNKENNESS,MISSION,800 Block of SHOTWELL ST,-122.415464220212,37.7548143096921 +27199,2015-01-05 20:10:00,ARSON,NORTHERN,2600 Block of STEINER ST,-122.436407559729,37.7936146828234 +27269,2015-01-05 17:52:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +27302,2015-01-05 16:50:00,ARSON,TENDERLOIN,200 Block of ELLIS ST,-122.410345341262,37.785230998983295 +27522,2015-01-05 05:30:00,ARSON,MISSION,800 Block of POTRERO AV,-122.407001198315,37.7585409046629 +27552,2015-01-05 01:18:00,KIDNAPPING,INGLESIDE,200 Block of EXCELSIOR AV,-122.43168151491,37.7252465703356 +27565,2015-01-05 00:25:00,ARSON,CENTRAL,0 Block of VANDEWATER ST,-122.412692501299,37.8052004417085 +27855,2014-12-28 07:10:00,DRUNKENNESS,NORTHERN,400 Block of DUBOCE AV,-122.429522203036,37.7694867849847 +28314,2014-12-27 00:01:00,DRUNKENNESS,NORTHERN,OFARRELL ST / POLK ST,-122.419549568783,37.7849590112628 +28360,2014-12-26 21:30:00,RUNAWAY,BAYVIEW,3200 Block of INGALLS ST,-122.393324841737,37.71882642599621 +28673,2014-12-26 05:00:00,RUNAWAY,INGLESIDE,0 Block of RUSSIA AV,-122.436724043712,37.721435763041 +28689,2014-12-26 02:55:00,KIDNAPPING,NORTHERN,3000 Block of FILLMORE ST,-122.435654173631,37.797555304959104 +28879,2014-12-25 12:44:00,DRUNKENNESS,BAYVIEW,100 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +28901,2014-12-25 09:52:00,ARSON,RICHMOND,2600 Block of CALIFORNIA ST,-122.437978008235,37.7884353561249 +28918,2014-12-25 07:25:00,ARSON,INGLESIDE,900 Block of ELLSWORTH ST,-122.416517427405,37.7330103867416 +29096,2014-12-24 17:28:00,DRUNKENNESS,TENDERLOIN,HYDE ST / EDDY ST,-122.415885065788,37.783516056415294 +29359,2014-12-23 23:45:00,KIDNAPPING,PARK,0 Block of LOMAVISTA TR,-122.443202707017,37.764941429917705 +29440,2014-12-23 20:13:00,ARSON,MISSION,2100 Block of MARKET ST,-122.429788986988,37.7666521474762 +29458,2014-12-23 19:51:00,RUNAWAY,NORTHERN,FILLMORE ST / OFARRELL ST,-122.432706975892,37.7832909416362 +29631,2014-12-23 13:04:00,DRUNKENNESS,MISSION,3200 Block of 17TH ST,-122.417913861876,37.7635887638425 +30103,2014-12-22 10:56:00,KIDNAPPING,RICHMOND,600 Block of 29TH AV,-122.488737802456,37.7770245596282 +30247,2014-12-14 22:30:00,KIDNAPPING,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +30275,2014-12-14 21:30:00,DRUNKENNESS,TARAVAL,2300 Block of 24TH AV,-122.48118317163,37.7437268170337 +30323,2014-12-14 20:00:00,KIDNAPPING,BAYVIEW,0 Block of KAREN CT,-122.406774805811,37.7233730849414 +30684,2014-12-13 20:39:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +30800,2014-12-13 15:00:00,DRUNKENNESS,TARAVAL,1200 Block of TARAVAL ST,-122.479455329571,37.7429394638526 +30894,2014-12-13 09:30:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +31008,2014-12-13 00:05:00,DRUNKENNESS,MISSION,2400 Block of MARIPOSA ST,-122.407807660132,37.7630994299538 +31024,2014-12-12 23:18:00,DRUNKENNESS,NORTHERN,HAYES ST / POLK ST,-122.418045452768,37.7775118895695 +31026,2014-12-12 23:10:00,ARSON,BAYVIEW,1300 Block of FAIRFAX AV,-122.384404223333,37.739674117404 +31060,2014-12-12 22:30:00,ARSON,NORTHERN,3200 Block of BAKER ST,-122.446509476572,37.8009526568789 +31182,2014-12-12 18:00:00,KIDNAPPING,NORTHERN,2700 Block of LARKIN ST,-122.421548609762,37.8031114742317 +31390,2014-12-12 06:30:00,ARSON,INGLESIDE,1800 Block of FELTON ST,-122.422821814188,37.7252119760864 +31420,2014-12-12 02:25:00,ARSON,NORTHERN,2400 Block of CHESTNUT ST,-122.443708020997,37.7999239241576 +31446,2014-12-12 00:01:00,RUNAWAY,TARAVAL,2100 Block of 27TH AV,-122.484656534419,37.7473134158105 +31745,2014-12-11 01:00:00,DRUNKENNESS,RICHMOND,6100 Block of GEARY BL,-122.485290737594,37.7801886709059 +31799,2014-12-10 22:00:00,KIDNAPPING,BAYVIEW,400 Block of BAY SHORE BL,-122.406825183678,37.741054981526 +31888,2014-12-10 18:55:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +31897,2014-12-10 18:27:00,ARSON,SOUTHERN,12TH ST / MARKET ST,-122.420254960348,37.774358171070105 +31958,2014-12-10 16:00:00,KIDNAPPING,NORTHERN,300 Block of FULTON ST,-122.422536478306,37.7787958771466 +32116,2014-12-10 07:40:00,KIDNAPPING,TARAVAL,TARAVAL ST / 23RD AV,-122.490691492512,37.7423880046588 +32148,2014-12-10 03:10:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.505923256341,37.761339931633 +32208,2014-12-09 22:15:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +32266,2014-12-09 20:00:00,ARSON,TARAVAL,3300 Block of NORIEGA ST,-122.499522719635,37.7532791383099 +32395,2014-12-09 14:30:00,KIDNAPPING,BAYVIEW,300 Block of WILLIAMS AV,-122.399443658942,37.73017601616471 +32524,2014-12-09 05:00:00,KIDNAPPING,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +32660,2014-12-08 19:11:00,KIDNAPPING,INGLESIDE,VISITACION AV / HAHN ST,-122.415290820623,37.7135038263013 +32711,2014-12-08 17:55:00,DRUNKENNESS,INGLESIDE,4600 Block of MISSION ST,-122.435621772842,37.7234913181355 +32715,2014-12-08 17:54:00,KIDNAPPING,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +32853,2014-12-08 11:03:00,KIDNAPPING,CENTRAL,1100 Block of GRANT AV,-122.406912053867,37.7976543484414 +32860,2014-12-08 10:50:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +32914,2014-12-08 07:30:00,KIDNAPPING,MISSION,25TH ST / MISSION ST,-122.418289276866,37.750640293923 +32934,2014-12-08 04:55:00,ARSON,MISSION,100 Block of HARTFORD ST,-122.433891506792,37.7601358672289 +33310,2014-11-29 23:10:00,ARSON,RICHMOND,2600 Block of CALIFORNIA ST,-122.437956067718,37.788326891872 +33426,2014-11-29 17:15:00,DRUNKENNESS,CENTRAL,0 Block of JEFFERSON ST,-122.413349164272,37.8084667368908 +33678,2014-11-29 00:01:00,ARSON,BAYVIEW,0 Block of HARE ST,-122.378991849151,37.73453622329961 +33832,2014-11-28 18:00:00,KIDNAPPING,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +34171,2014-11-27 18:51:00,DRUNKENNESS,NORTHERN,2500 Block of VANNESS AV,-122.424249150245,37.799006273448 +34248,2014-11-27 14:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +34334,2014-11-27 07:08:00,ARSON,BAYVIEW,1200 Block of PENNSYLVANIA AV,-122.392523253571,37.750725918225896 +34394,2014-11-27 00:24:00,KIDNAPPING,MISSION,1800 Block of 15TH ST,-122.425864046062,37.7662536102334 +34486,2014-11-26 19:59:00,ARSON,SOUTHERN,200 Block of FREMONT ST,-122.394688229661,37.7889437645084 +34595,2014-11-26 16:01:00,KIDNAPPING,INGLESIDE,LISBON ST / EXCELSIOR AV,-122.431252746655,37.7251072655052 +34637,2014-11-26 14:40:00,KIDNAPPING,BAYVIEW,0 Block of BERTHA LN,-122.380990356551,37.7331435009212 +34675,2014-11-26 12:48:00,KIDNAPPING,INGLESIDE,1500 Block of FELTON ST,-122.419909661436,37.726089371406495 +34684,2014-11-26 12:30:00,KIDNAPPING,MISSION,3200 Block of 24TH ST,-122.41762315876998,37.7523434069025 +34806,2014-11-26 05:05:00,ARSON,INGLESIDE,BOSWORTH ST / LYELL ST,-122.431955738461,37.732993205473 +35002,2014-11-25 18:10:00,KIDNAPPING,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +35137,2014-11-25 13:20:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +35253,2014-11-25 04:50:00,KIDNAPPING,BAYVIEW,0 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +35620,2014-11-24 08:45:00,KIDNAPPING,BAYVIEW,1500 Block of KIRKWOOD AV,-122.388879303147,37.73748619494771 +35687,2014-11-24 01:17:00,DRUNKENNESS,RICHMOND,GEARY BL / 3RD AV,-122.461062711176,37.7811580519204 +35700,2014-11-24 00:30:00,KIDNAPPING,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +35782,2014-11-16 20:15:00,DRUNKENNESS,NORTHERN,3200 Block of FILLMORE ST,-122.435845205677,37.7991942427575 +35804,2014-11-16 19:30:00,KIDNAPPING,SOUTHERN,0 Block of 3RD ST,-122.402835528142,37.7868009028384 +36005,2014-11-16 04:51:00,ARSON,CENTRAL,100 Block of KEARNY ST,-122.403772249989,37.78912092500261 +36060,2014-11-16 00:20:00,DRUNKENNESS,PARK,500 Block of DIVISADERO ST,-122.437591748763,37.7745506356497 +36104,2014-11-15 22:08:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / JONES ST,-122.412224164736,37.7820729312029 +36107,2014-11-15 22:05:00,DRUNKENNESS,INGLESIDE,0 Block of ALLISON ST,-122.442281645825,37.71417143925221 +36224,2014-11-15 18:30:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +36501,2014-11-15 01:45:00,KIDNAPPING,NORTHERN,1700 Block of PINE ST,-122.424606849092,37.7890426863656 +36587,2014-11-14 22:00:00,KIDNAPPING,INGLESIDE,CHURCH ST / VALLEY ST,-122.426747708063,37.744497508955895 +36779,2014-11-14 15:45:00,KIDNAPPING,INGLESIDE,0 Block of BURLWOOD DR,-122.454363730782,37.7347598143379 +36784,2014-11-14 15:30:00,KIDNAPPING,RICHMOND,2100 Block of SUTTER ST,-122.435764153945,37.7858242341974 +36941,2014-11-14 06:32:00,KIDNAPPING,MISSION,3600 Block of CESAR CHAVEZ ST,-122.421402486894,37.7481788673566 +36951,2014-11-14 04:00:00,ARSON,CENTRAL,500 Block of PACIFIC AV,-122.404677401547,37.7971157930221 +36966,2014-11-14 02:30:00,ARSON,TARAVAL,800 Block of LAWTON ST,-122.472149533606,37.7590240328632 +37483,2014-11-12 19:07:00,DRUNKENNESS,MISSION,16TH ST / DOLORES ST,-122.426384450806,37.764643937262 +37543,2014-11-12 17:00:00,KIDNAPPING,TENDERLOIN,LEAVENWORTH ST / GOLDEN GATE AV,-122.413869632554,37.7818621883021 +37549,2014-11-12 17:00:00,KIDNAPPING,NORTHERN,100 Block of LARKIN ST,-122.416607695115,37.7791387543353 +37820,2014-11-11 23:25:00,ARSON,MISSION,1100 Block of POTRERO AV,-122.406324313914,37.7536322498822 +37836,2014-11-11 22:10:00,ARSON,MISSION,200 Block of CAPP ST,-122.418277910521,37.762695287595 +38028,2014-11-11 13:50:00,KIDNAPPING,MISSION,2500 Block of 17TH ST,-122.409408330008,37.76442279558111 +38029,2014-11-11 13:50:00,KIDNAPPING,MISSION,2500 Block of 17TH ST,-122.409408330008,37.76442279558111 +38174,2014-11-11 00:29:00,DRUNKENNESS,MISSION,2900 Block of HARRISON ST,-122.411599088523,37.7502239140329 +38186,2014-11-10 23:41:00,KIDNAPPING,NORTHERN,2500 Block of LOMBARD ST,-122.44352039096,37.7989993135254 +38215,2014-11-10 21:53:00,DRUNKENNESS,TENDERLOIN,200 Block of OFARRELL ST,-122.408519707346,37.7864044708209 +38230,2014-11-10 21:30:00,KIDNAPPING,RICHMOND,2700 Block of SUTTER ST,-122.445563733491,37.784580195927 +38249,2014-11-10 20:24:00,ARSON,RICHMOND,2600 Block of PINE ST,-122.439420802591,37.7871624114352 +38376,2014-11-10 15:00:00,KIDNAPPING,TARAVAL,3500 Block of MORAGA ST,-122.50072547795,37.75508214577121 +38631,2014-11-02 22:00:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +38642,2014-11-02 21:24:00,DRUNKENNESS,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +38910,2014-11-02 03:09:00,KIDNAPPING,TARAVAL,0 Block of BRIGHTON AV,-122.45518407113998,37.7191534375561 +38972,2014-11-01 23:47:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +39014,2014-11-01 22:21:00,DRUNKENNESS,RICHMOND,4100 Block of FULTON ST,-122.476168271877,37.77299199390021 +39054,2014-11-01 20:10:00,ARSON,PARK,1600 Block of HAYES ST,-122.443584639717,37.7741979150087 +39108,2014-11-01 18:00:00,KIDNAPPING,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +39327,2014-11-01 03:35:00,DRUNKENNESS,CENTRAL,100 Block of GEARY ST,-122.405819515169,37.7876106365854 +39343,2014-11-01 02:35:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +39347,2014-11-01 02:29:00,KIDNAPPING,NORTHERN,1000 Block of LAGUNA ST,-122.427179879518,37.7806552772342 +39349,2014-11-01 02:28:00,DRUNKENNESS,PARK,600 Block of FREDERICK ST,-122.456202166027,37.765905864994 +39373,2014-11-01 01:39:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +39388,2014-11-01 01:20:00,KIDNAPPING,CENTRAL,JOICE ST / PINE ST,-122.40806332103,37.7912051249673 +39414,2014-11-01 00:30:00,KIDNAPPING,PARK,2200 Block of TURK ST,-122.445710421174,37.7788462167992 +39416,2014-11-01 00:26:00,DRUNKENNESS,TARAVAL,700 Block of GONZALEZ DR,-122.480606348865,37.7175185873081 +39455,2014-10-31 23:15:00,DRUNKENNESS,RICHMOND,100 Block of SUTROHEIGHTS AV,-122.508631807014,37.7760694890282 +39467,2014-10-31 23:00:00,DRUNKENNESS,NORTHERN,1900 Block of UNION ST,-122.431831857814,37.7976099463654 +39598,2014-10-31 18:51:00,KIDNAPPING,SOUTHERN,600 Block of 3RD ST,-122.393559121228,37.7794201313347 +39607,2014-10-31 18:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +39611,2014-10-31 18:00:00,RUNAWAY,TENDERLOIN,600 Block of OFARRELL ST,-122.41533612902,37.7854364798696 +39630,2014-10-31 17:02:00,DRUNKENNESS,SOUTHERN,8TH ST / MISSION ST,-122.41316085097,37.7774566611807 +39653,2014-10-31 16:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +39825,2014-10-31 08:30:00,KIDNAPPING,NORTHERN,1000 Block of POST ST,-122.419104424644,37.78687648416079 +39911,2014-10-30 21:47:00,DRUNKENNESS,TARAVAL,1300 Block of 25TH AV,-122.483417995949,37.762333153248 +40133,2014-10-30 11:51:00,ARSON,SOUTHERN,9TH ST / JESSIE ST,-122.415322108652,37.7767183581051 +40194,2014-10-30 06:30:00,RUNAWAY,NORTHERN,800 Block of LAGUNA ST,-122.426805156627,37.7787935169228 +40211,2014-10-30 02:40:00,DRUNKENNESS,RICHMOND,3RD AV / GEARY BL,-122.461062711176,37.7811580519204 +40237,2014-10-30 00:28:00,DRUNKENNESS,MISSION,16TH ST / VALENCIA ST,-122.421886357981,37.7649178909424 +40241,2014-10-30 00:27:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.414634473592,37.7525276230522 +40262,2014-10-29 23:50:00,DRUNKENNESS,MISSION,2100 Block of MISSION ST,-122.419470488515,37.7622701739914 +40616,2014-10-29 12:12:00,DRUNKENNESS,MISSION,16TH ST / DOLORES ST,-122.426384450806,37.764643937262 +40671,2014-10-29 09:30:00,DRUNKENNESS,CENTRAL,2200 Block of MASON ST,-122.41322559209,37.8041078088354 +40792,2014-10-28 22:15:00,DRUNKENNESS,TARAVAL,0 Block of GRAFTON AV,-122.453594266394,37.720094319576 +40835,2014-10-28 20:30:00,KIDNAPPING,NORTHERN,900 Block of OFARRELL ST,-122.42037536821998,37.7848006211991 +40854,2014-10-28 19:44:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / RODGERS ST,-122.40948237086,37.7754506238157 +40983,2014-10-28 15:20:00,KIDNAPPING,NORTHERN,2000 Block of POLK ST,-122.421608893207,37.7955038710773 +41086,2014-10-28 08:28:00,ARSON,BAYVIEW,1400 Block of QUESADA AV,-122.386849266637,37.73066480545821 +41183,2014-10-27 22:04:00,ARSON,INGLESIDE,BRAZIL AV / LAGRANDE AV,-122.42547895155,37.7202325556594 +41188,2014-10-27 21:54:00,KIDNAPPING,SOUTHERN,700 Block of HARRISON ST,-122.399045655841,37.7813197113532 +41514,2014-10-27 02:30:00,KIDNAPPING,MISSION,MISSION ST / 18TH ST,-122.419360352761,37.7618358012376 +41544,2014-10-19 23:52:00,KIDNAPPING,NORTHERN,3100 Block of DIVISADERO ST,-122.442491287129,37.7985732400589 +41612,2014-10-19 21:00:00,KIDNAPPING,NORTHERN,3200 Block of STEINER ST,-122.437621392217,37.7989248224108 +41846,2014-10-19 08:40:00,DRUNKENNESS,CENTRAL,1200 Block of BUSH ST,-122.417841550946,37.7889536872317 +41897,2014-10-19 01:55:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +42008,2014-10-18 20:55:00,DRUNKENNESS,CENTRAL,0 Block of SUTTER ST,-122.400344691288,37.7902143401629 +42244,2014-10-18 12:00:00,RUNAWAY,NORTHERN,1100 Block of TURK ST,-122.428818526724,37.7808642652455 +42413,2014-10-17 22:55:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436194484896,37.7227270383576 +42441,2014-10-17 21:35:00,DRUNKENNESS,INGLESIDE,400 Block of CORTLAND AV,-122.417450548901,37.7392070733909 +42517,2014-10-17 19:00:00,KIDNAPPING,BAYVIEW,4600 Block of 3RD ST,-122.390412132668,37.7360102192532 +42541,2014-10-17 18:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +42568,2014-10-17 17:10:00,ARSON,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +42681,2014-10-17 12:13:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 7TH ST,-122.407844136792,37.7767462195389 +42702,2014-10-17 11:02:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +42832,2014-10-16 23:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +42967,2014-10-16 17:27:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435664298117,37.762319163767 +43060,2014-10-16 13:36:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +43104,2014-10-16 12:00:00,RUNAWAY,BAYVIEW,1600 Block of THOMAS AV,-122.391648699288,37.7306822385776 +43372,2014-10-15 17:45:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +43622,2014-10-15 04:00:00,RUNAWAY,PARK,1700 Block of EDDY ST,-122.43644305449,37.7808493247624 +43648,2014-10-15 00:01:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +43651,2014-10-15 00:01:00,KIDNAPPING,NORTHERN,1500 Block of VANNESS AV,-122.422062730264,37.789920001484106 +43727,2014-10-14 20:30:00,KIDNAPPING,PARK,1500 Block of TURK ST,-122.434631237377,37.7802343955112 +43958,2014-10-14 11:17:00,KIDNAPPING,MISSION,18TH ST / VALENCIA ST,-122.42158168137,37.7617007179518 +43971,2014-10-14 10:30:00,RUNAWAY,BAYVIEW,1200 Block of REVERE AV,-122.383679778616,37.7279208527818 +44009,2014-10-14 08:53:00,KIDNAPPING,MISSION,1400 Block of SOUTH VAN NESS AV,-122.416098641422,37.7499521390889 +44216,2014-10-13 18:30:00,ARSON,BAYVIEW,1100 Block of OAKDALE AV,-122.382192583973,37.7298874272325 +44316,2014-10-13 15:23:00,DRUNKENNESS,INGLESIDE,400 Block of NEVADA ST,-122.411603127254,37.7363597677397 +44381,2014-10-13 12:40:00,DRUNKENNESS,CENTRAL,200 Block of COLUMBUS AV,-122.40583874581002,37.7973631784416 +44514,2014-10-13 01:10:00,ARSON,CENTRAL,VALLEJO ST / BATTERY ST,-122.401242889477,37.7995312586369 +44542,2014-10-05 23:45:00,DRUNKENNESS,MISSION,24TH ST / TREAT AV,-122.41299748806802,37.7525722462226 +44585,2014-10-05 21:21:00,DRUNKENNESS,MISSION,1100 Block of SOUTH VAN NESS AV,-122.416557578218,37.75474851103979 +44714,2014-10-05 15:20:00,DRUNKENNESS,MISSION,1400 Block of VALENCIA ST,-122.420359911899,37.749695007739 +44920,2014-10-05 01:55:00,DRUNKENNESS,NORTHERN,POLK ST / PINE ST,-122.42049728879,37.789618819255 +45155,2014-10-04 17:00:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +45195,2014-10-04 15:50:00,ARSON,BAYVIEW,1500 Block of WALLACE AV,-122.390150409785,37.72700062241029 +45213,2014-10-04 15:19:00,DRUNKENNESS,SOUTHERN,8TH ST / MISSION ST,-122.41316085097,37.7774566611807 +45306,2014-10-04 10:30:00,KIDNAPPING,RICHMOND,6900 Block of GEARY BL,-122.493845140241,37.7795627160126 +45325,2014-10-04 09:06:00,ARSON,INGLESIDE,100 Block of 27TH ST,-122.423564005365,37.747156107970206 +45492,2014-10-03 22:26:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +45496,2014-10-03 22:17:00,ARSON,BAYVIEW,1200 Block of NEWHALL ST,-122.391316749675,37.7365594026335 +45637,2014-10-03 16:30:00,KIDNAPPING,NORTHERN,100 Block of LARKIN ST,-122.416607695115,37.7791387543353 +45755,2014-10-03 11:49:00,ARSON,PARK,400 Block of PIERCE ST,-122.434135082799,37.774030093363 +45951,2014-10-02 21:18:00,DRUNKENNESS,PARK,ELLIS ST / PIERCE ST,-122.435814436411,37.7819406662153 +45967,2014-10-02 20:35:00,DRUNKENNESS,NORTHERN,2400 Block of CHESTNUT ST,-122.44368609814,37.7998154571094 +45975,2014-10-02 20:13:00,DRUNKENNESS,NORTHERN,900 Block of LARKIN ST,-122.418065082006,37.7863419196668 +46097,2014-10-02 14:30:00,DRUNKENNESS,RICHMOND,700 Block of 30TH AV,-122.489815422525,37.7751037239617 +46551,2014-10-01 13:00:00,ARSON,TARAVAL,1500 Block of SLOAT BL,-122.489713969124,37.7339497680852 +46672,2014-10-01 06:45:00,ARSON,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +46853,2014-09-30 18:46:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +47100,2014-09-30 07:15:00,RUNAWAY,NORTHERN,1600 Block of WEBSTER ST,-122.431612703437,37.78583294760129 +47293,2014-09-29 16:58:00,DRUNKENNESS,SOUTHERN,3RD ST / MISSION ST,-122.402027706948,37.7862483456629 +47451,2014-09-29 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +47493,2014-09-29 07:20:00,KIDNAPPING,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +47648,2014-09-21 19:15:00,KIDNAPPING,SOUTHERN,VERMONT ST / 15TH ST,-122.404752558962,37.7672561981064 +47661,2014-09-21 18:47:00,DRUNKENNESS,MISSION,1800 Block of MISSION ST,-122.419970859857,37.7674540344176 +47665,2014-09-21 18:45:00,KIDNAPPING,CENTRAL,400 Block of DAVIS CT,-122.398324392842,37.7966976738334 +47686,2014-09-21 18:00:00,DRUNKENNESS,BAYVIEW,0 Block of REDDY ST,-122.395152325764,37.7303311430947 +47703,2014-09-21 17:32:00,DRUNKENNESS,BAYVIEW,1000 Block of FITZGERALD AV,-122.388335559443,37.719284994140295 +48193,2014-09-20 17:45:00,DRUNKENNESS,CENTRAL,0 Block of DRUMM ST,-122.396556426173,37.7941169057941 +48242,2014-09-20 15:19:00,DRUNKENNESS,MISSION,2900 Block of CESAR CHAVEZ ST,-122.408302107239,37.7484547781028 +48387,2014-09-20 08:24:00,RUNAWAY,TARAVAL,200 Block of HOLLOWAY AV,-122.455644220333,37.7219021358315 +48450,2014-09-20 01:29:00,KIDNAPPING,PARK,1600 Block of HAIGHT ST,-122.449101011701,37.7696756290578 +48697,2014-09-19 16:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +48876,2014-09-19 07:50:00,RUNAWAY,BAYVIEW,CONKLING ST / SILVER AV,-122.401808957191,37.734728042827 +48908,2014-09-19 02:30:00,DRUNKENNESS,NORTHERN,LARKIN ST / SUTTER ST,-122.418467747931,37.7879652569797 +48969,2014-09-18 21:45:00,KIDNAPPING,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +48978,2014-09-18 21:08:00,DRUNKENNESS,BAYVIEW,3RD ST / KIRKWOOD AV,-122.389588165314,37.7379572653415 +49038,2014-09-18 19:08:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +49354,2014-09-17 23:50:00,KIDNAPPING,NORTHERN,CALIFORNIA ST / LAGUNA ST,-122.428909653942,37.789533690429394 +49384,2014-09-17 22:15:00,DRUNKENNESS,SOUTHERN,0 Block of NEWMONTGOMERY ST,-122.401817240144,37.788440503956 +49430,2014-09-17 20:29:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +49435,2014-09-17 20:16:00,ARSON,SOUTHERN,STILLMAN ST / 2ND ST,-122.394152747236,37.7835046149776 +49473,2014-09-17 19:00:00,RUNAWAY,CENTRAL,500 Block of FRANCISCO ST,-122.41426677512,37.8046348825476 +49630,2014-09-17 11:08:00,DRUNKENNESS,NORTHERN,0 Block of TOLEDO WY,-122.438483262382,37.8011850167559 +49669,2014-09-17 09:00:00,KIDNAPPING,MISSION,2600 Block of MISSION ST,-122.41860030588998,37.7546255872838 +49807,2014-09-16 20:12:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +49809,2014-09-16 20:10:00,ARSON,MISSION,DOLORES ST / CUMBERLAND ST,-122.425844437514,37.7590298040848 +49944,2014-09-16 14:10:00,KIDNAPPING,MISSION,17TH ST / SHOTWELL ST,-122.416230392543,37.7636337702985 +50136,2014-09-16 00:50:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +50245,2014-09-15 20:00:00,ARSON,RICHMOND,JOHNFKENNEDY DR / TRANSVERSE DR,-122.479893513106,37.77049279878271 +50342,2014-09-15 15:19:00,KIDNAPPING,INGLESIDE,900 Block of DUNCAN ST,-122.442155766765,37.74518509432379 +50360,2014-09-15 13:47:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +50567,2014-09-07 22:00:00,KIDNAPPING,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +50592,2014-09-07 20:30:00,ARSON,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +50633,2014-09-07 18:20:00,DRUNKENNESS,MISSION,0 Block of DEARBORN ST,-122.423094962345,37.7627059498635 +50839,2014-09-07 02:24:00,DRUNKENNESS,CENTRAL,400 Block of MASON ST,-122.409925328419,37.7877640990096 +50855,2014-09-07 01:50:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +50897,2014-09-06 23:50:00,DRUNKENNESS,CENTRAL,700 Block of POST ST,-122.41417943719,37.787502483207 +50930,2014-09-06 22:10:00,KIDNAPPING,BAYVIEW,1100 Block of KEY AV,-122.398674069507,37.720360884728606 +51031,2014-09-06 18:21:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +51047,2014-09-06 17:45:00,KIDNAPPING,BAYVIEW,3000 Block of SAN BRUNO AV,-122.401898005335,37.7233482212763 +51087,2014-09-06 16:25:00,DRUNKENNESS,RICHMOND,2900 Block of GEARY BL,-122.450591365057,37.78192652036979 +51226,2014-09-06 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +51238,2014-09-06 08:30:00,ARSON,RICHMOND,800 Block of LA PLAYA ST,-122.509895418239,37.7723131976814 +51312,2014-09-06 00:30:00,KIDNAPPING,NORTHERN,FERN ST / POLK ST,-122.420211964949,37.7882225424263 +51379,2014-09-05 21:36:00,KIDNAPPING,SOUTHERN,4TH ST / MISSION ST,-122.404270179486,37.78447885387449 +51380,2014-09-05 21:36:00,KIDNAPPING,SOUTHERN,4TH ST / MISSION ST,-122.404270179486,37.78447885387449 +51545,2014-09-05 14:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +51641,2014-09-05 10:15:00,DRUNKENNESS,CENTRAL,CHESTNUT ST / MASON ST,-122.413225873549,37.8037599622506 +51718,2014-09-05 03:55:00,ARSON,BAYVIEW,800 Block of INGERSON AV,-122.390713923618,37.717724598154994 +51826,2014-09-04 21:40:00,KIDNAPPING,MISSION,3000 Block of 16TH ST,-122.421082850193,37.764910844226 +51944,2014-09-04 17:20:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +52143,2014-09-04 09:30:00,KIDNAPPING,TARAVAL,1800 Block of 9TH AV,-122.465527322613,37.7537653741938 +52144,2014-09-04 09:30:00,KIDNAPPING,TARAVAL,1800 Block of 9TH AV,-122.465527322613,37.7537653741938 +52197,2014-09-04 04:45:00,DRUNKENNESS,INGLESIDE,100 Block of MILTON ST,-122.429290422253,37.7329695122285 +52203,2014-09-04 03:00:00,KIDNAPPING,INGLESIDE,5600 Block of MISSION ST,-122.447095289615,37.7111225502685 +52222,2014-09-04 01:13:00,ARSON,PARK,CLAYTON ST / TWINPEAKS BL,-122.446434498728,37.7610072307256 +52395,2014-09-03 16:30:00,KIDNAPPING,RICHMOND,GEARY BL / 33RD AV,-122.49329712988998,37.7796862364357 +52396,2014-09-03 16:30:00,KIDNAPPING,RICHMOND,GEARY BL / 33RD AV,-122.49329712988998,37.7796862364357 +52485,2014-09-03 13:00:00,KIDNAPPING,NORTHERN,300 Block of FULTON ST,-122.422536478306,37.7787958771466 +52642,2014-09-02 22:53:00,KIDNAPPING,MISSION,15TH ST / CHURCH ST,-122.428820922736,37.7661286357813 +52811,2014-09-02 14:55:00,DRUNKENNESS,SOUTHERN,MINNA ST / RUSS ST,-122.409286020933,37.7796593209531 +52982,2014-09-02 04:40:00,DRUNKENNESS,PARK,1700 Block of MCALLISTER ST,-122.440879521853,37.77753219352179 +53045,2014-09-01 23:10:00,KIDNAPPING,MISSION,POTRERO AV / 24TH ST,-122.406338412685,37.7530042877223 +53046,2014-09-01 23:10:00,KIDNAPPING,MISSION,POTRERO AV / 24TH ST,-122.406338412685,37.7530042877223 +53065,2014-09-01 22:10:00,DRUNKENNESS,PARK,1300 Block of HAIGHT ST,-122.444524277297,37.7703704336439 +53067,2014-09-01 22:00:00,RUNAWAY,PARK,500 Block of CENTRAL AV,-122.444432207954,37.77463542236271 +53161,2014-09-01 17:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +53245,2014-09-01 12:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +53353,2014-09-01 03:03:00,KIDNAPPING,MISSION,1300 Block of ALABAMA ST,-122.410801868648,37.7502715391981 +53376,2014-09-01 01:39:00,DRUNKENNESS,NORTHERN,1600 Block of NORTHPOINT ST,-122.434351689759,37.8038720106925 +53400,2014-09-01 00:01:00,KIDNAPPING,TARAVAL,1400 Block of 20TH AV,-122.478067213175,37.7606979828387 +53436,2014-08-24 22:05:00,DRUNKENNESS,BAYVIEW,1100 Block of FITZGERALD AV,-122.39036028161,37.7205064590363 +53506,2014-08-24 18:50:00,KIDNAPPING,SOUTHERN,MORRIS ST / HARRISON ST,-122.403532272846,37.7777004247867 +53618,2014-08-24 14:30:00,KIDNAPPING,INGLESIDE,100 Block of LAURA ST,-122.451966034443,37.7111023433435 +53653,2014-08-24 12:00:00,KIDNAPPING,CENTRAL,900 Block of CLAY ST,-122.408322788185,37.79406255571049 +53738,2014-08-24 06:00:00,KIDNAPPING,NORTHERN,600 Block of VANNESS AV,-122.420337977211,37.7812881245951 +53742,2014-08-24 04:35:00,ARSON,NORTHERN,1400 Block of PINE ST,-122.419672954945,37.789668941238 +53845,2014-08-23 23:06:00,ARSON,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +53856,2014-08-23 22:41:00,DRUNKENNESS,MISSION,VALENCIA ST / 17TH ST,-122.421733767763,37.7632996945938 +53898,2014-08-23 21:30:00,KIDNAPPING,BAYVIEW,1500 Block of MCKINNON AV,-122.388358368929,37.73530492784071 +54224,2014-08-23 06:24:00,ARSON,MISSION,0 Block of LANDERS ST,-122.427717709395,37.766980071165904 +54374,2014-08-22 20:56:00,DRUNKENNESS,MISSION,MARKET ST / SANCHEZ ST,-122.431028702713,37.7658672394532 +54444,2014-08-22 18:12:00,DRUNKENNESS,MISSION,700 Block of CAPP ST,-122.417649959736,37.7546827649656 +54447,2014-08-22 18:00:00,KIDNAPPING,NORTHERN,2400 Block of SACRAMENTO ST,-122.433800051784,37.7898100005704 +54584,2014-08-22 13:30:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +55102,2014-08-21 06:45:00,KIDNAPPING,CENTRAL,1200 Block of GRANT AV,-122.407110077805,37.7986457830055 +55119,2014-08-21 02:00:00,DRUNKENNESS,PARK,600 Block of BUENAVISTAWEST AV,-122.443870666134,37.767235991034 +55293,2014-08-20 18:13:00,DRUNKENNESS,SOUTHERN,1500 Block of MISSION ST,-122.417523396516,37.7738670346175 +55369,2014-08-20 15:30:00,DRUNKENNESS,NORTHERN,LINDEN ST / OCTAVIA ST,-122.424531750489,37.7762057770439 +55532,2014-08-20 08:00:00,KIDNAPPING,INGLESIDE,PERSIA AV / PRAGUE ST,-122.427191891813,37.7189436957878 +55999,2014-08-18 22:23:00,DRUNKENNESS,MISSION,0 Block of DIAMOND ST,-122.43731366203698,37.7613226593514 +56076,2014-08-18 19:11:00,ARSON,BAYVIEW,1800 Block of 25TH ST,-122.397486915671,37.752197092814 +56124,2014-08-18 17:30:00,KIDNAPPING,RICHMOND,4400 Block of BALBOA ST,-122.506427128345,37.77524374602249 +56211,2014-08-18 15:20:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +56435,2014-08-18 00:33:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +56867,2014-08-10 01:35:00,DRUNKENNESS,MISSION,3000 Block of 16TH ST,-122.421662616877,37.7648758178404 +56933,2014-08-09 23:00:00,KIDNAPPING,RICHMOND,3100 Block of TURK ST,-122.457728489499,37.777236094020296 +56954,2014-08-09 22:07:00,ARSON,INGLESIDE,800 Block of ELLSWORTH ST,-122.416446124049,37.7329162539537 +57007,2014-08-09 20:29:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +57096,2014-08-09 17:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +57100,2014-08-09 17:24:00,ARSON,NORTHERN,GEARY BL / GOUGH ST,-122.424688703591,37.7853339640306 +57105,2014-08-09 17:10:00,DRUNKENNESS,TENDERLOIN,200 Block of JONES ST,-122.412573643201,37.7834687204586 +57164,2014-08-09 15:12:00,KIDNAPPING,RICHMOND,700 Block of LA PLAYA ST,-122.510032525985,37.7741786514476 +57287,2014-08-09 10:00:00,KIDNAPPING,BAYVIEW,2500 Block of SAN BRUNO AV,-122.404280402051,37.7294531060335 +57301,2014-08-09 09:00:00,KIDNAPPING,INGLESIDE,600 Block of MOSCOW ST,-122.430517952798,37.7173273823993 +57304,2014-08-09 09:00:00,KIDNAPPING,SOUTHERN,300 Block of CLEMENTINA ST,-122.40232147638,37.78203871461721 +57343,2014-08-09 03:20:00,DRUNKENNESS,TENDERLOIN,GEARY ST / TAYLOR ST,-122.411518820359,37.7869408998805 +57374,2014-08-09 01:31:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +57420,2014-08-08 23:43:00,ARSON,SOUTHERN,1300 Block of MISSION ST,-122.415757039196,37.7754692820041 +57681,2014-08-08 15:05:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +57683,2014-08-08 15:05:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +57686,2014-08-08 15:00:00,KIDNAPPING,NORTHERN,1300 Block of WEBSTER ST,-122.431046366089,37.7830295716044 +58057,2014-08-07 18:25:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +58063,2014-08-07 18:07:00,DRUNKENNESS,TARAVAL,3500 Block of 20TH AV,-122.420918498518,37.7585749373667 +58140,2014-08-07 15:40:00,DRUNKENNESS,INGLESIDE,300 Block of EXCELSIOR AV,-122.430881156902,37.7248650933984 +58323,2014-08-07 03:15:00,ARSON,BAYVIEW,600 Block of MENDELL ST,-122.386178373766,37.739322006639206 +58364,2014-08-07 00:30:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +58426,2014-08-06 22:00:00,ARSON,MISSION,4100 Block of 23RD ST,-122.43537342142,37.75287894366179 +58445,2014-08-06 21:10:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +58457,2014-08-06 20:50:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +58647,2014-08-06 12:23:00,KIDNAPPING,BAYVIEW,1400 Block of DEHARO ST,-122.40045629876002,37.75186233587209 +58775,2014-08-06 02:00:00,RUNAWAY,TARAVAL,600 Block of HEAD ST,-122.464519701074,37.718824586123 +58781,2014-08-06 01:50:00,DRUNKENNESS,MISSION,3200 Block of 18TH ST,-122.415543548355,37.7621213524354 +58792,2014-08-06 00:50:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +59127,2014-08-05 06:10:00,KIDNAPPING,CENTRAL,1200 Block of BROADWAY ST,-122.417905159205,37.7965406141378 +59128,2014-08-05 06:10:00,KIDNAPPING,CENTRAL,1200 Block of BROADWAY ST,-122.417905159205,37.7965406141378 +59145,2014-08-05 03:00:00,KIDNAPPING,CENTRAL,800 Block of CALIFORNIA ST,-122.407814772426,37.7922694289836 +59345,2014-08-04 16:45:00,KIDNAPPING,SOUTHERN,FOLSOM ST / 3RD ST,-122.398932711095,37.7837848211584 +59376,2014-08-04 15:17:00,KIDNAPPING,RICHMOND,400 Block of 6TH AV,-122.464279879446,37.7800332991006 +59458,2014-08-04 10:30:00,KIDNAPPING,TARAVAL,200 Block of SUMMIT ST,-122.454275425409,37.7172112128612 +59589,2014-07-27 22:08:00,DRUNKENNESS,NORTHERN,1500 Block of FILLMORE ST,-122.432880595215,37.7838255788976 +59765,2014-07-27 14:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +59816,2014-07-27 12:30:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +59883,2014-07-27 08:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +59927,2014-07-27 02:24:00,DRUNKENNESS,INGLESIDE,700 Block of 27TH ST,-122.43694126248998,37.7462459121668 +60039,2014-07-26 21:15:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +60102,2014-07-26 17:30:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +60205,2014-07-26 12:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +60297,2014-07-26 02:35:00,ARSON,NORTHERN,2700 Block of SCOTT ST,-122.440209833789,37.7950655883181 +60319,2014-07-26 01:35:00,KIDNAPPING,CENTRAL,GEARY ST / MASON ST,-122.409876622532,37.787148807979 +60407,2014-07-25 22:00:00,KIDNAPPING,TARAVAL,200 Block of SUMMIT ST,-122.454275425409,37.7172112128612 +60556,2014-07-25 16:30:00,KIDNAPPING,TARAVAL,700 Block of GARFIELD ST,-122.469409628128,37.71960053092521 +60561,2014-07-25 16:18:00,DRUNKENNESS,MISSION,300 Block of BARTLETT ST,-122.419545976524,37.75135238699001 +60626,2014-07-25 13:17:00,DRUNKENNESS,SOUTHERN,5TH ST / BRYANT ST,-122.400302421513,37.777799229041904 +60667,2014-07-25 11:35:00,DRUNKENNESS,MISSION,24TH ST / BARTLETT ST,-122.419560437883,37.7521716091721 +60683,2014-07-25 10:45:00,KIDNAPPING,CENTRAL,300 Block of THE EMBARCADERONORTH ST,-122.396374439116,37.79805325280579 +60726,2014-07-25 07:51:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418360181974,37.783149897821104 +60789,2014-07-25 00:01:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.40860321116,37.7995998106551 +60816,2014-07-24 23:10:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.41481714113002,37.77118289477021 +60894,2014-07-24 19:59:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +60981,2014-07-24 16:45:00,KIDNAPPING,TARAVAL,11TH AV / JUDAH ST,-122.468320110335,37.7620804256086 +61052,2014-07-24 13:05:00,DRUNKENNESS,CENTRAL,900 Block of COLUMBUS AV,-122.414263444238,37.8031918743285 +61091,2014-07-24 11:30:00,RUNAWAY,MISSION,800 Block of CAPP ST,-122.417499429971,37.753084671409 +61100,2014-07-24 11:16:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +61178,2014-07-24 04:15:00,KIDNAPPING,INGLESIDE,4500 Block of MISSION ST,-122.433743692364,37.7259707375737 +61217,2014-07-24 00:26:00,DRUNKENNESS,INGLESIDE,MISSION ST / PERSIA AV,-122.43597721703,37.7231288306727 +61353,2014-07-23 18:00:00,DRUNKENNESS,CENTRAL,500 Block of SUTTER ST,-122.409445484488,37.789173205941 +61361,2014-07-23 17:54:00,DRUNKENNESS,MISSION,3300 Block of 24TH ST,-122.419295493114,37.752132345798 +61568,2014-07-23 04:35:00,ARSON,BAYVIEW,BANCROFT AV / JENNINGS ST,-122.390924446041,37.724544596177005 +62142,2014-07-21 21:00:00,KIDNAPPING,CENTRAL,1500 Block of SACRAMENTO ST,-122.418429189106,37.79186550750161 +62479,2014-07-21 03:28:00,ARSON,NORTHERN,2000 Block of CALIFORNIA ST,-122.428087689719,37.7895820615822 +62480,2014-07-21 03:21:00,ARSON,CENTRAL,SUTTER ST / MASON ST,-122.410246553741,37.7890162035598 +62577,2014-07-13 21:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +62685,2014-07-13 16:28:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +62697,2014-07-13 15:45:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +62699,2014-07-13 15:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +62808,2014-07-13 06:53:00,ARSON,BAYVIEW,2500 Block of MARIN ST,-122.40275678107,37.74811081228179 +62812,2014-07-13 06:11:00,KIDNAPPING,MISSION,300 Block of SHOTWELL ST,-122.416082198307,37.76282326743871 +62859,2014-07-13 01:00:00,KIDNAPPING,BAYVIEW,1100 Block of PENNSYLVANIA AV,-122.392677608377,37.752239007523706 +62860,2014-07-13 01:00:00,KIDNAPPING,BAYVIEW,1100 Block of PENNSYLVANIA AV,-122.392677608377,37.752239007523706 +62872,2014-07-13 00:20:00,ARSON,TARAVAL,100 Block of FONT BL,-122.473644075533,37.7155536666978 +62905,2014-07-12 23:05:00,KIDNAPPING,BAYVIEW,PALOU AV / KEITH ST,-122.38716770759,37.7318594482631 +63132,2014-07-12 13:00:00,KIDNAPPING,CENTRAL,700 Block of JACKSON ST,-122.406897266866,37.79604960327461 +63224,2014-07-12 04:50:00,DRUNKENNESS,MISSION,16TH ST / CAPP ST,-122.418701003284,37.76510987862221 +63258,2014-07-12 01:28:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +63434,2014-07-11 16:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +63538,2014-07-11 11:45:00,DRUNKENNESS,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.41126513685,37.78213926815221 +63861,2014-07-10 15:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +63973,2014-07-10 10:15:00,DRUNKENNESS,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +64030,2014-07-10 07:10:00,KIDNAPPING,RICHMOND,4300 Block of ANZA ST,-122.494789201702,37.7777554185294 +64231,2014-07-09 17:59:00,KIDNAPPING,MISSION,4400 Block of 18TH ST,-122.43880605381,37.7606041298135 +64278,2014-07-09 16:12:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +64374,2014-07-09 11:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +64382,2014-07-09 11:15:00,KIDNAPPING,INGLESIDE,LONDON ST / EXCELSIOR AV,-122.432856568129,37.7258720829741 +64520,2014-07-09 00:33:00,ARSON,NORTHERN,1300 Block of GOLDEN GATE AV,-122.432800615342,37.7795115909237 +64584,2014-07-08 21:00:00,KIDNAPPING,SOUTHERN,1200 Block of STEVENSON ST,-122.421068389167,37.7728555805164 +64604,2014-07-08 19:45:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +64676,2014-07-08 17:00:00,DRUNKENNESS,PARK,900 Block of COLE ST,-122.449793795131,37.7653329767786 +64812,2014-07-08 10:35:00,DRUNKENNESS,MISSION,1200 Block of VALENCIA ST,-122.420806049169,37.7528840217529 +64854,2014-07-08 07:30:00,KIDNAPPING,SOUTHERN,700 Block of MINNA ST,-122.413361136168,37.77636280535 +64880,2014-07-08 04:28:00,DRUNKENNESS,MISSION,400 Block of VALENCIA ST,-122.421935077177,37.7661343875141 +64951,2014-07-07 22:00:00,KIDNAPPING,MISSION,300 Block of JERSEY ST,-122.432916242704,37.750505591016 +64987,2014-07-07 20:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +65138,2014-07-07 14:25:00,KIDNAPPING,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +65208,2014-07-07 11:45:00,ARSON,MISSION,200 Block of SHOTWELL ST,-122.416374835778,37.7644225165568 +65269,2014-07-07 08:00:00,KIDNAPPING,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +65287,2014-07-07 07:42:00,KIDNAPPING,PARK,5TH AV / JUDAH ST,-122.461902150841,37.7623632346529 +65459,2014-06-29 20:21:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5THSTNORTH ST,-122.408068345148,37.7839916768161 +65481,2014-06-29 19:30:00,KIDNAPPING,SOUTHERN,100 Block of BLUXOME ST,-122.399063980262,37.775012206354106 +65482,2014-06-29 19:30:00,KIDNAPPING,SOUTHERN,100 Block of BLUXOME ST,-122.399063980262,37.775012206354106 +65607,2014-06-29 16:11:00,DRUNKENNESS,PARK,HAIGHT ST / STANYAN ST,-122.45353456066002,37.76916629780521 +65723,2014-06-29 11:54:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +65754,2014-06-29 10:25:00,DRUNKENNESS,BAYVIEW,4800 Block of 3RD ST,-122.390965298144,37.7344291807899 +65811,2014-06-29 02:20:00,DRUNKENNESS,MISSION,4300 Block of 20TH ST,-122.436366237421,37.75764383898171 +65842,2014-06-29 00:45:00,RUNAWAY,NORTHERN,100 Block of FELL ST,-122.420332099593,37.7762075768262 +65844,2014-06-29 00:32:00,DRUNKENNESS,MISSION,MARKET ST / 16TH ST,-122.433075152403,37.76419377902421 +65985,2014-06-28 20:16:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +66021,2014-06-28 19:04:00,DRUNKENNESS,MISSION,19TH ST / CHURCH ST,-122.428203997155,37.759691691831 +66033,2014-06-28 18:58:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +66094,2014-06-28 17:20:00,KIDNAPPING,INGLESIDE,0 Block of BENTON AV,-122.426650237315,37.7323038077662 +66100,2014-06-28 17:00:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.412320907436,37.7807642254398 +66154,2014-06-28 15:30:00,KIDNAPPING,TENDERLOIN,200 Block of JONES ST,-122.412436901867,37.7834857455601 +66320,2014-06-28 02:28:00,DRUNKENNESS,TARAVAL,19TH AV / HOLLOWAY AV,-122.475222189932,37.7210571460375 +66536,2014-06-27 17:00:00,ARSON,MISSION,3100 Block of MARKET ST,-122.444393082786,37.760065921027 +66709,2014-06-27 09:30:00,KIDNAPPING,INGLESIDE,0 Block of OCEAN AV,-122.43792168681802,37.7235824292084 +66741,2014-06-27 08:00:00,RUNAWAY,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +66784,2014-06-27 03:38:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +66789,2014-06-27 03:20:00,DRUNKENNESS,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +66933,2014-06-26 20:00:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +67172,2014-06-26 05:00:00,KIDNAPPING,NORTHERN,1000 Block of LARKIN ST,-122.418346670325,37.787735689101794 +67199,2014-06-26 01:57:00,DRUNKENNESS,INGLESIDE,200 Block of MAYNARD ST,-122.424915560486,37.72950801788271 +67214,2014-06-26 00:30:00,ARSON,MISSION,300 Block of CAPP ST,-122.418124262331,37.7610901240738 +67495,2014-06-25 11:00:00,ARSON,SOUTHERN,0 Block of 4TH ST,-122.405582629186,37.7854659679151 +67510,2014-06-25 10:00:00,KIDNAPPING,BAYVIEW,1400 Block of VANDYKE AV,-122.389668091859,37.727536918318 +67532,2014-06-25 08:35:00,ARSON,SOUTHERN,200 Block of MARKET ST,-122.396853499969,37.79267911710721 +67560,2014-06-25 05:46:00,DRUNKENNESS,RICHMOND,FULTON ST / PARKPRESIDIO BL,-122.471762293488,37.7731370565281 +67619,2014-06-25 00:01:00,ARSON,MISSION,0 Block of DIAMOND ST,-122.437174308795,37.7613164774097 +67637,2014-06-24 22:20:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +67641,2014-06-24 22:00:00,KIDNAPPING,MISSION,3200 Block of CESAR CHAVEZ ST,-122.415397960717,37.7481084356047 +67717,2014-06-24 18:45:00,DRUNKENNESS,CENTRAL,400 Block of STOCKTON ST,-122.407114491118,37.7899019822508 +67996,2014-06-23 22:50:00,DRUNKENNESS,MISSION,24TH ST / SHOTWELL ST,-122.415173665801,37.7524407589917 +68016,2014-06-23 21:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +68022,2014-06-23 21:29:00,DRUNKENNESS,CENTRAL,MASON ST / BEACH ST,-122.413979577586,37.8074807657832 +68198,2014-06-23 14:15:00,KIDNAPPING,BAYVIEW,300 Block of SELBY ST,-122.394559471382,37.74549865483721 +68221,2014-06-23 12:26:00,DRUNKENNESS,CENTRAL,100 Block of JACKSON ST,-122.398919477596,37.79695357446701 +68369,2014-06-23 01:36:00,DRUNKENNESS,NORTHERN,OFARRELL ST / POLK ST,-122.419549568783,37.7849590112628 +68386,2014-06-23 00:20:00,DRUNKENNESS,SOUTHERN,400 Block of JESSIE ST,-122.408534383763,37.7820325646934 +68423,2014-06-15 22:01:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +68607,2014-06-15 13:25:00,KIDNAPPING,NORTHERN,1900 Block of BUSH ST,-122.429351472017,37.7874894540184 +68615,2014-06-15 13:00:00,RUNAWAY,TARAVAL,ULLOA ST / 31ST AV,-122.488416343575,37.7406161638658 +68798,2014-06-14 22:30:00,ARSON,INGLESIDE,ELLSWORTH ST / ALEMANY BL,-122.418968700591,37.7322083101759 +68900,2014-06-14 17:50:00,DRUNKENNESS,MISSION,3900 Block of 24TH ST,-122.430794211054,37.75155749992229 +69007,2014-06-14 12:15:00,KIDNAPPING,BAYVIEW,0 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +69053,2014-06-14 09:55:00,RUNAWAY,INGLESIDE,200 Block of PUTNAM ST,-122.410985121891,37.7363241269838 +69204,2014-06-13 20:58:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739951,37.7978641744394 +69558,2014-06-12 22:45:00,ARSON,SOUTHERN,100 Block of MAIN ST,-122.394110175454,37.7912542147568 +69597,2014-06-12 21:20:00,KIDNAPPING,INGLESIDE,200 Block of PUTNAM ST,-122.411123069982,37.73633223644861 +69703,2014-06-12 15:57:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +70052,2014-06-11 16:00:00,KIDNAPPING,MISSION,1700 Block of 15TH ST,-122.422667886722,37.7665569549171 +70080,2014-06-11 14:39:00,KIDNAPPING,SOUTHERN,700 Block of NATOMA ST,-122.412904380868,37.7759981805312 +70100,2014-06-11 13:11:00,ARSON,SOUTHERN,0 Block of 3RD ST,-122.403284843106,37.787306416019 +70121,2014-06-11 12:30:00,KIDNAPPING,MISSION,400 Block of VALENCIA ST,-122.421935077177,37.7661343875141 +70270,2014-06-10 23:05:00,ARSON,SOUTHERN,200 Block of FOLSOM ST,-122.392250041709,37.7889824799132 +70354,2014-06-10 17:32:00,DRUNKENNESS,BAYVIEW,1400 Block of MENDELL ST,-122.390577977348,37.7342439948771 +70389,2014-06-10 16:24:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +70615,2014-06-10 00:32:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +70655,2014-06-09 22:30:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +70846,2014-06-09 13:00:00,KIDNAPPING,BAYVIEW,1400 Block of VANDYKE AV,-122.389668091859,37.727536918318 +70974,2014-06-09 01:30:00,KIDNAPPING,TENDERLOIN,HYDE ST / ELLIS ST,-122.416075285051,37.78444966127911 +70989,2014-06-09 00:02:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +71186,2014-06-01 13:22:00,KIDNAPPING,INGLESIDE,100 Block of TUCKER AV,-122.407000497181,37.716172774552 +71187,2014-06-01 13:15:00,KIDNAPPING,BAYVIEW,0 Block of BRIDGEVIEW DR,-122.394537691058,37.7346923893626 +71239,2014-06-01 10:59:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +71280,2014-06-01 04:45:00,ARSON,BAYVIEW,0 Block of CASHMERE ST,-122.382745395519,37.73565878863421 +71314,2014-06-01 01:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +71453,2014-05-31 18:10:00,RUNAWAY,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +71474,2014-05-31 17:40:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +71530,2014-05-31 15:00:00,KIDNAPPING,INGLESIDE,100 Block of PERALTA AV,-122.407822050638,37.747128691456496 +71531,2014-05-31 15:00:00,KIDNAPPING,INGLESIDE,100 Block of PERALTA AV,-122.407822050638,37.747128691456496 +71646,2014-05-31 03:15:00,KIDNAPPING,INGLESIDE,1700 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +71679,2014-05-31 01:05:00,DRUNKENNESS,MISSION,3200 Block of 22ND ST,-122.419297189961,37.7553465863701 +71721,2014-05-30 23:30:00,KIDNAPPING,MISSION,200 Block of DOUGLASS ST,-122.439224765726,37.7601918385723 +71749,2014-05-30 22:30:00,KIDNAPPING,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +71773,2014-05-30 21:05:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +71823,2014-05-30 19:00:00,KIDNAPPING,CENTRAL,700 Block of BUSH ST,-122.40961459678302,37.7899992253577 +72009,2014-05-30 08:00:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +72054,2014-05-30 02:00:00,KIDNAPPING,NORTHERN,1800 Block of WASHINGTON ST,-122.423721283984,37.792997949977 +72472,2014-05-28 23:41:00,KIDNAPPING,INGLESIDE,200 Block of PRECITA AV,-122.415479005904,37.7473718419863 +72512,2014-05-28 22:00:00,ARSON,SOUTHERN,500 Block of NATOMA ST,-122.409325210496,37.77881574264271 +72901,2014-05-27 21:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +73082,2014-05-27 14:00:00,KIDNAPPING,SOUTHERN,0 Block of OAK GROVE ST,-122.402234133558,37.777495798913606 +73083,2014-05-27 14:00:00,KIDNAPPING,SOUTHERN,0 Block of OAK GROVE ST,-122.402234133558,37.777495798913606 +73185,2014-05-27 09:11:00,KIDNAPPING,PARK,7TH AV / LAWTON ST,-122.463783615777,37.758535617256896 +73222,2014-05-27 04:25:00,ARSON,BAYVIEW,NEWHALL ST / 3RD ST,-122.389310644607,37.738741839511 +73266,2014-05-26 23:45:00,KIDNAPPING,CENTRAL,1600 Block of LEAVENWORTH ST,-122.416610149911,37.7958064032456 +73361,2014-05-26 18:04:00,DRUNKENNESS,MISSION,200 Block of 13TH ST,-122.417949217834,37.769720863045706 +73391,2014-05-26 17:08:00,DRUNKENNESS,CENTRAL,2600 Block of MASON ST,-122.414003178329,37.8079694729269 +73498,2014-05-26 12:48:00,KIDNAPPING,BAYVIEW,0 Block of OSCEOLA LN,-122.383187458704,37.7316757960484 +73601,2014-05-26 06:07:00,DRUNKENNESS,RICHMOND,CLEMENT ST / 3RD AV,-122.461210550383,37.7830866899279 +73637,2014-05-26 03:18:00,KIDNAPPING,RICHMOND,800 Block of 27TH AV,-122.486330976731,37.7733904017767 +73661,2014-05-26 00:30:00,KIDNAPPING,TENDERLOIN,600 Block of ELLIS ST,-122.416916142188,37.78439444920679 +73694,2014-05-18 22:42:00,DRUNKENNESS,NORTHERN,1800 Block of GEARY BL,-122.432035315509,37.7842501079896 +73811,2014-05-18 17:45:00,ARSON,MISSION,3200 Block of 22ND ST,-122.419308328755,37.75545608348821 +73815,2014-05-18 17:30:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +73923,2014-05-18 13:00:00,KIDNAPPING,RICHMOND,2600 Block of SACRAMENTO ST,-122.436522576409,37.7895777003024 +73976,2014-05-18 11:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +74025,2014-05-18 08:00:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +74076,2014-05-18 01:43:00,DRUNKENNESS,CENTRAL,FILBERT ST / JONES ST,-122.415947162592,37.8005458602274 +74092,2014-05-18 00:15:00,DRUNKENNESS,INGLESIDE,3400 Block of MISSION ST,-122.422286651689,37.7420041169835 +74173,2014-05-17 20:57:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +74292,2014-05-17 15:50:00,DRUNKENNESS,TARAVAL,46TH AV / NORIEGA ST,-122.505405273955,37.7529616147664 +74469,2014-05-17 06:07:00,ARSON,SOUTHERN,400 Block of HARRISON ST,-122.392454483167,37.7863708799476 +74485,2014-05-17 03:15:00,KIDNAPPING,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +74486,2014-05-17 03:15:00,KIDNAPPING,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +74921,2014-05-16 04:25:00,ARSON,PARK,0 Block of LINCOLN WY,-122.45840217758,37.766107620539714 +74938,2014-05-16 01:15:00,KIDNAPPING,NORTHERN,1200 Block of TURK ST,-122.428818526724,37.7808642652455 +74972,2014-05-15 23:47:00,KIDNAPPING,INGLESIDE,100 Block of BRITTON ST,-122.412741397426,37.7123588004385 +75035,2014-05-15 20:32:00,DRUNKENNESS,BAYVIEW,3RD ST / MISSIONROCK ST,-122.389731237453,37.77309890383261 +75162,2014-05-15 15:20:00,KIDNAPPING,CENTRAL,2500 Block of MASON ST,-122.413814292432,37.80703620711829 +75337,2014-05-15 04:40:00,ARSON,BAYVIEW,2000 Block of OAKDALE AV,-122.398725523286,37.7394292585009 +75361,2014-05-15 00:30:00,KIDNAPPING,NORTHERN,SACRAMENTO ST / GOUGH ST,-122.425804925314,37.7908727425161 +75481,2014-05-14 19:00:00,KIDNAPPING,RICHMOND,100 Block of FUNSTON AV,-122.472048255203,37.7853902153809 +75529,2014-05-14 17:13:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +75559,2014-05-14 16:30:00,RUNAWAY,NORTHERN,1200 Block of EDDY ST,-122.428245242312,37.7820044139073 +75683,2014-05-14 10:45:00,ARSON,TENDERLOIN,0 Block of GRANT AV,-122.404858516174,37.7872026250974 +75742,2014-05-14 07:30:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +76141,2014-05-13 04:00:00,KIDNAPPING,SOUTHERN,200 Block of KING ST,-122.392773013909,37.7770867759344 +76163,2014-05-13 00:12:00,KIDNAPPING,TENDERLOIN,JONES ST / TURK ST,-122.412414263581,37.7830037964534 +76207,2014-05-12 21:08:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +76324,2014-05-12 16:18:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.407975093043,37.7803099082814 +76473,2014-05-12 07:20:00,KIDNAPPING,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +76552,2014-05-04 21:04:00,DRUNKENNESS,CENTRAL,VALLEJO ST / COLUMBUS AV,-122.407871572784,37.7986962742997 +76670,2014-05-04 15:00:00,KIDNAPPING,INGLESIDE,200 Block of DAY ST,-122.427726315745,37.7428843122262 +76672,2014-05-04 14:40:00,DRUNKENNESS,NORTHERN,STEINER ST / UNION ST,-122.437138552293,37.796878640587295 +76746,2014-05-04 10:40:00,KIDNAPPING,TARAVAL,3900 Block of ALEMANY BL,-122.467790638694,37.7113240638545 +76794,2014-05-04 06:15:00,KIDNAPPING,MISSION,2000 Block of HARRISON ST,-122.413123030178,37.7647659461051 +76942,2014-05-03 20:30:00,KIDNAPPING,TENDERLOIN,500 Block of ELLIS ST,-122.415414178631,37.784476659022005 +76949,2014-05-03 19:51:00,DRUNKENNESS,MISSION,1200 Block of POTRERO AV,-122.406256546868,37.7513737062303 +76971,2014-05-03 19:08:00,DRUNKENNESS,TENDERLOIN,8TH ST / MARKET ST,-122.414743835382,37.77871926278901 +77025,2014-05-03 16:30:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +77176,2014-05-03 05:30:00,KIDNAPPING,BAYVIEW,1500 Block of SHAFTER AV,-122.389768984951,37.7305636925712 +77207,2014-05-03 01:20:00,DRUNKENNESS,INGLESIDE,OCEAN AV / SAN JOSE AV,-122.444746663003,37.7229679041125 +77210,2014-05-03 01:15:00,DRUNKENNESS,SOUTHERN,KING ST / 2ND ST,-122.389595283252,37.7798611974198 +77215,2014-05-03 01:00:00,KIDNAPPING,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +77314,2014-05-02 20:00:00,DRUNKENNESS,TENDERLOIN,200 Block of POWELL ST,-122.408201657254,37.7868849113107 +77519,2014-05-02 13:00:00,DRUNKENNESS,CENTRAL,LEAVENWORTH ST / JEFFERSON ST,-122.419087676747,37.8078015516515 +78069,2014-05-01 03:15:00,ARSON,MISSION,900 Block of VALENCIA ST,-122.421162358049,37.7580892252137 +78074,2014-05-01 02:32:00,DRUNKENNESS,MISSION,18TH ST / GUERRERO ST,-122.423803001901,37.7615655928045 +78167,2014-04-30 21:57:00,DRUNKENNESS,NORTHERN,FERN ST / VANNESS AV,-122.421861006168,37.78801163189621 +78218,2014-04-30 19:59:00,DRUNKENNESS,NORTHERN,1300 Block of WEBSTER ST,-122.431046366089,37.7830295716044 +78234,2014-04-30 19:00:00,DRUNKENNESS,BAYVIEW,4800 Block of 3RD ST,-122.390965298144,37.7344291807899 +78257,2014-04-30 18:00:00,KIDNAPPING,PARK,1700 Block of MCALLISTER ST,-122.440879521853,37.77753219352179 +78376,2014-04-30 11:56:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +78625,2014-04-29 17:45:00,DRUNKENNESS,MISSION,3300 Block of 24TH ST,-122.418726093459,37.75216718442029 +78647,2014-04-29 16:30:00,KIDNAPPING,BAYVIEW,BLANKEN AV / TUNNEL AV,-122.40078877656,37.71201641774029 +78841,2014-04-29 04:50:00,ARSON,NORTHERN,STEINER ST / POST ST,-122.434733246333,37.7849443169969 +78852,2014-04-29 02:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +78954,2014-04-28 19:00:00,KIDNAPPING,INGLESIDE,3300 Block of MISSION ST,-122.421644478447,37.7429970144076 +79067,2014-04-28 15:00:00,RUNAWAY,CENTRAL,800 Block of GEARY ST,-122.417273344939,37.7861493947594 +79176,2014-04-28 10:00:00,ARSON,BAYVIEW,0 Block of DOUBLEROCK ST,-122.387775002515,37.7204658651293 +79240,2014-04-28 06:45:00,ARSON,CENTRAL,800 Block of HYDE ST,-122.416992162344,37.7886442171326 +79421,2014-04-20 17:30:00,DRUNKENNESS,MISSION,23RD ST / UTAH ST,-122.405455789224,37.7543370820935 +79432,2014-04-20 17:00:00,KIDNAPPING,MISSION,400 Block of VALENCIA ST,-122.42207304894,37.766125945480105 +79498,2014-04-20 14:00:00,RUNAWAY,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +79541,2014-04-20 11:37:00,DRUNKENNESS,MISSION,1200 Block of TREAT AV,-122.412692441179,37.7501577446795 +79643,2014-04-20 00:30:00,DRUNKENNESS,SOUTHERN,1000 Block of FOLSOM ST,-122.405834032593,37.778254811523 +79697,2014-04-19 23:00:00,ARSON,INGLESIDE,200 Block of MADRID ST,-122.429818570223,37.7254602788122 +79740,2014-04-19 21:00:00,KIDNAPPING,INGLESIDE,400 Block of HANOVER ST,-122.445973865206,37.7082584554561 +79825,2014-04-19 17:56:00,DRUNKENNESS,PARK,100 Block of JOHNFKENNEDY DR,-122.457507583541,37.7711332354432 +79866,2014-04-19 16:06:00,KIDNAPPING,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +80100,2014-04-19 00:58:00,DRUNKENNESS,CENTRAL,0 Block of ROMOLO ST,-122.406370265394,37.79824541416429 +80373,2014-04-18 13:24:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +80429,2014-04-18 11:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +80431,2014-04-18 11:00:00,KIDNAPPING,INGLESIDE,100 Block of FAITH ST,-122.406474459826,37.7441517603038 +80689,2014-04-17 18:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +80943,2014-04-17 00:46:00,DRUNKENNESS,RICHMOND,7TH AV / CABRILLO ST,-122.464943755452,37.7753193587288 +80970,2014-04-17 00:01:00,KIDNAPPING,TENDERLOIN,500 Block of OFARRELL ST,-122.413798415869,37.7856297942374 +80976,2014-04-16 23:46:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423001696251,37.7649050761616 +81347,2014-04-16 08:21:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +81350,2014-04-16 08:14:00,DRUNKENNESS,SOUTHERN,SHIPLEY ST / 5TH ST,-122.402842748428,37.7798294192767 +81412,2014-04-16 02:00:00,KIDNAPPING,MISSION,21ST ST / CAPP ST,-122.417812558787,37.7571005796428 +81420,2014-04-16 01:49:00,DRUNKENNESS,MISSION,18TH ST / LAPIDGE ST,-122.422414209663,37.761648685096 +81577,2014-04-15 16:20:00,ARSON,TARAVAL,2000 Block of 42ND AV,-122.500859638237,37.7484700842065 +81788,2014-04-15 00:47:00,DRUNKENNESS,INGLESIDE,100 Block of HAHN ST,-122.415717533547,37.7127125219215 +81819,2014-04-14 23:00:00,KIDNAPPING,TENDERLOIN,ELLIS ST / JONES ST,-122.412784096502,37.78486569395261 +81834,2014-04-14 22:05:00,DRUNKENNESS,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +82131,2014-04-14 02:00:00,KIDNAPPING,TARAVAL,1500 Block of 37TH AV,-122.496154807465,37.7580279337414 +82139,2014-04-14 01:45:00,DRUNKENNESS,MISSION,CASTRO ST / 18TH ST,-122.435002864298,37.7608878061194 +82142,2014-04-14 01:33:00,KIDNAPPING,TARAVAL,300 Block of SERRANO DR,-122.480450749459,37.7190118676786 +82187,2014-04-06 22:55:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +82267,2014-04-06 19:00:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +82320,2014-04-06 17:00:00,KIDNAPPING,MISSION,100 Block of 13TH ST,-122.416709701266,37.769594417868 +82505,2014-04-06 03:46:00,DRUNKENNESS,NORTHERN,1400 Block of BROADWAY ST,-122.420967976295,37.796134085967296 +82525,2014-04-06 02:04:00,DRUNKENNESS,CENTRAL,300 Block of BROADWAY ST,-122.40367998233,37.7981913307058 +82559,2014-04-06 00:23:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +82607,2014-04-05 22:56:00,ARSON,CENTRAL,SUTTER ST / GRANT AV,-122.405402610955,37.789630226693504 +82676,2014-04-05 20:08:00,DRUNKENNESS,MISSION,25TH ST / MISSION ST,-122.418289276866,37.750640293923 +82820,2014-04-05 13:01:00,DRUNKENNESS,BAYVIEW,4900 Block of 3RD ST,-122.391243431227,37.7336342023099 +82959,2014-04-05 01:50:00,ARSON,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +82960,2014-04-05 01:50:00,ARSON,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +82969,2014-04-05 01:22:00,DRUNKENNESS,NORTHERN,1200 Block of POLK ST,-122.420326993863,37.7884521578132 +83047,2014-04-04 21:35:00,KIDNAPPING,CENTRAL,200 Block of BEACH ST,-122.413178958845,37.8076387530515 +83392,2014-04-04 00:43:00,DRUNKENNESS,PARK,MASONIC AV / FULTON ST,-122.446472679005,37.7758015943912 +83574,2014-04-03 16:37:00,DRUNKENNESS,SOUTHERN,600 Block of HOWARD ST,-122.39998852115,37.78548734122921 +83636,2014-04-03 14:30:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 6TH ST,-122.407163046954,37.7797376338991 +83639,2014-04-03 14:10:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.40787711735202,37.7803875013555 +83847,2014-04-03 00:09:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +83862,2014-04-02 23:40:00,ARSON,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +83873,2014-04-02 22:55:00,DRUNKENNESS,BAYVIEW,OAKDALE AV / INGALLS ST,-122.382888987083,37.730342936363705 +83979,2014-04-02 18:00:00,KIDNAPPING,TARAVAL,2400 Block of 31ST AV,-122.488411655956,37.7415356898844 +84239,2014-04-02 00:10:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +84291,2014-04-01 21:46:00,DRUNKENNESS,TARAVAL,4000 Block of JUDAH ST,-122.505398845381,37.760392815309295 +84427,2014-04-01 15:45:00,DRUNKENNESS,MISSION,2100 Block of MISSION ST,-122.419424383763,37.7632323869521 +84483,2014-04-01 12:52:00,DRUNKENNESS,TENDERLOIN,200 Block of JONES ST,-122.412573643201,37.7834687204586 +84497,2014-04-01 12:10:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +84760,2014-03-31 19:09:00,ARSON,BAYVIEW,MENDELL ST / GALVEZ AV,-122.385835676499,37.7396105936444 +84884,2014-03-31 13:04:00,DRUNKENNESS,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +84982,2014-03-31 03:50:00,DRUNKENNESS,CENTRAL,1000 Block of LOMBARD ST,-122.41842677135,37.802061075493896 +84995,2014-03-31 02:17:00,DRUNKENNESS,SOUTHERN,MINT ST / MISSION ST,-122.407258776463,37.7821176524238 +85002,2014-03-31 01:24:00,ARSON,NORTHERN,FILLMORE ST / POST ST,-122.433084166837,37.7851499161537 +85054,2014-03-23 22:00:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +85063,2014-03-23 21:38:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +85364,2014-03-23 04:35:00,DRUNKENNESS,SOUTHERN,100 Block of 2ND ST,-122.398572324987,37.7869524495987 +85396,2014-03-23 01:25:00,ARSON,SOUTHERN,200 Block of 11TH ST,-122.414258651144,37.77197236875789 +85414,2014-03-23 00:25:00,KIDNAPPING,CENTRAL,700 Block of KEARNY ST,-122.404847847867,37.7951006528052 +85416,2014-03-23 00:10:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +85520,2014-03-22 20:27:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +85575,2014-03-22 18:00:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +85687,2014-03-22 13:52:00,KIDNAPPING,SOUTHERN,1200 Block of MARKET ST,-122.415444159886,37.7780245674641 +85750,2014-03-22 09:35:00,DRUNKENNESS,TENDERLOIN,MARKET ST / 8TH ST,-122.414743835382,37.77871926278901 +85796,2014-03-22 04:00:00,ARSON,INGLESIDE,0 Block of SGTJOHNVYOUNG LN,-122.444707063455,37.7249307267936 +85900,2014-03-21 22:10:00,RUNAWAY,RICHMOND,FULTON ST / 33RD AV,-122.492759924406,37.7721768876173 +86009,2014-03-21 18:00:00,KIDNAPPING,PARK,1200 Block of HAIGHT ST,-122.442678874433,37.770606135285504 +86091,2014-03-21 14:50:00,KIDNAPPING,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413069926397,37.7820204255866 +86133,2014-03-21 12:50:00,DRUNKENNESS,NORTHERN,CEDAR ST / LARKIN ST,-122.418182397674,37.7865662290665 +86142,2014-03-21 12:35:00,DRUNKENNESS,CENTRAL,300 Block of BAY ST,-122.412803753,37.8057739875696 +86210,2014-03-21 07:30:00,RUNAWAY,TARAVAL,0 Block of LEE AV,-122.454019795696,37.7191063131951 +86409,2014-03-20 17:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +86684,2014-03-19 23:05:00,KIDNAPPING,BAYVIEW,2300 Block of LANE ST,-122.393876045338,37.7276227776946 +86689,2014-03-19 22:48:00,DRUNKENNESS,INGLESIDE,100 Block of DELVALE AV,-122.447016495626,37.7411067780718 +86737,2014-03-19 20:08:00,ARSON,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +86949,2014-03-19 13:45:00,RUNAWAY,INGLESIDE,300 Block of ALPHA ST,-122.405104738804,37.7129148055909 +87020,2014-03-19 11:20:00,DRUNKENNESS,BAYVIEW,MCKINNON AV / 3RD ST,-122.39014671644,37.7363908050669 +87045,2014-03-19 10:07:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +87059,2014-03-19 09:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +87079,2014-03-19 09:00:00,RUNAWAY,BAYVIEW,0 Block of TURNER TR,-122.395106891925,37.7566305834521 +87222,2014-03-18 20:38:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +87428,2014-03-18 11:03:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +87455,2014-03-18 10:00:00,RUNAWAY,BAYVIEW,1200 Block of SHAFTER AV,-122.384161286185,37.7273840237408 +87476,2014-03-18 09:05:00,DRUNKENNESS,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +87658,2014-03-17 18:56:00,DRUNKENNESS,CENTRAL,500 Block of VALLEJO ST,-122.405902369559,37.7989931128976 +87766,2014-03-17 14:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +87803,2014-03-17 13:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +87894,2014-03-17 08:55:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +87901,2014-03-17 08:30:00,RUNAWAY,PARK,0 Block of VEGA ST,-122.445893581212,37.7801242878056 +87978,2014-03-09 23:00:00,RUNAWAY,NORTHERN,900 Block of BUCHANAN ST,-122.42845383696002,37.7785841286585 +88001,2014-03-09 21:51:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +88270,2014-03-09 04:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +88295,2014-03-09 01:57:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +88329,2014-03-09 00:30:00,DRUNKENNESS,CENTRAL,2800 Block of LEAVENWORTH ST,-122.419067224379,37.8073339305952 +88360,2014-03-08 23:21:00,KIDNAPPING,INGLESIDE,3100 Block of MISSION ST,-122.418609719102,37.7474453071495 +88406,2014-03-08 21:45:00,KIDNAPPING,INGLESIDE,300 Block of OSHAUGHNESSY BL,-122.449172649249,37.74278187456071 +88479,2014-03-08 19:00:00,KIDNAPPING,MISSION,WIESE ST / 16TH ST,-122.420580440111,37.7649968622937 +88907,2014-03-07 18:30:00,KIDNAPPING,NORTHERN,2500 Block of LOMBARD ST,-122.44352039096,37.7989993135254 +88924,2014-03-07 17:24:00,DRUNKENNESS,NORTHERN,POLK ST / GEARY ST,-122.419739837805,37.7858926099715 +89001,2014-03-07 14:00:00,KIDNAPPING,BAYVIEW,GILMAN AV / GRIFFITH ST,-122.388139317244,37.718235637361495 +89131,2014-03-07 08:08:00,DRUNKENNESS,SOUTHERN,200 Block of 6TH ST,-122.406926278297,37.7794747749628 +89315,2014-03-06 19:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +89545,2014-03-06 11:30:00,KIDNAPPING,TARAVAL,2300 Block of 37TH AV,-122.495112170742,37.7431135950577 +89603,2014-03-06 09:21:00,DRUNKENNESS,SOUTHERN,6TH ST / TEHAMA ST,-122.406629602508,37.779314997977295 +89683,2014-03-06 00:48:00,KIDNAPPING,BAYVIEW,1100 Block of WISCONSIN ST,-122.39847312276,37.7531483460231 +89927,2014-03-05 13:00:00,RUNAWAY,INGLESIDE,1500 Block of TREAT AV,-122.41250614556002,37.745680288147504 +89934,2014-03-05 12:53:00,DRUNKENNESS,TENDERLOIN,HYDE ST / MARKET ST,-122.414743835382,37.77871926278901 +90033,2014-03-05 09:00:00,RUNAWAY,NORTHERN,700 Block of GOLDEN GATE AV,-122.42291369529,37.7806600950548 +90057,2014-03-05 07:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +90092,2014-03-05 01:49:00,ARSON,INGLESIDE,300 Block of MOSCOW ST,-122.427127092149,37.72205469469471 +90109,2014-03-05 00:01:00,KIDNAPPING,NORTHERN,2400 Block of SACRAMENTO ST,-122.433800051784,37.7898100005704 +90145,2014-03-04 22:15:00,KIDNAPPING,SOUTHERN,BRANNAN ST / 8TH ST,-122.405427162783,37.7712969876277 +90194,2014-03-04 19:45:00,ARSON,BAYVIEW,0 Block of WATCHMAN WY,-122.395251009931,37.75534435195679 +90460,2014-03-04 07:39:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +90501,2014-03-04 02:11:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +90518,2014-03-04 00:10:00,KIDNAPPING,BAYVIEW,1500 Block of REVERE AV,-122.389206215932,37.7311894334281 +90542,2014-03-03 22:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +90563,2014-03-03 21:20:00,KIDNAPPING,INGLESIDE,200 Block of FOOTE AV,-122.447734125329,37.7149438536609 +90657,2014-03-03 17:13:00,DRUNKENNESS,BAYVIEW,1400 Block of MENDELL ST,-122.390577977348,37.7342439948771 +90775,2014-03-03 11:39:00,DRUNKENNESS,SOUTHERN,200 Block of 6TH ST,-122.405839959524,37.7787626372516 +90847,2014-03-03 06:23:00,DRUNKENNESS,SOUTHERN,STEVENSON ST / 7TH ST,-122.411935615745,37.780006442029794 +90894,2014-03-03 01:30:00,KIDNAPPING,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +91102,2014-02-23 15:00:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +91151,2014-02-23 12:00:00,KIDNAPPING,INGLESIDE,0 Block of BLYTHDALE AV,-122.417720424652,37.710661234774896 +91199,2014-02-23 06:59:00,DRUNKENNESS,SOUTHERN,3RD ST / HOWARD ST,-122.400473580152,37.7850290611875 +91218,2014-02-23 03:17:00,DRUNKENNESS,RICHMOND,0 Block of SPRUCE ST,-122.454248940382,37.7902563662996 +91239,2014-02-23 02:23:00,DRUNKENNESS,MISSION,MISSION ST / ERIE ST,-122.420034521733,37.769043728757 +91241,2014-02-23 02:13:00,ARSON,MISSION,DOLORES ST / 20TH ST,-122.425768246873,37.7582261992584 +91286,2014-02-22 23:13:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +91650,2014-02-22 02:05:00,DRUNKENNESS,CENTRAL,KEARNY ST / PACIFIC AV,-122.405320552012,37.7970893815548 +91740,2014-02-21 21:41:00,ARSON,INGLESIDE,0 Block of OLIVER ST,-122.450102910761,37.7089456366141 +92038,2014-02-21 09:40:00,KIDNAPPING,PARK,MASONIC AV / GEARY BL,-122.448043124454,37.7823710354886 +92060,2014-02-21 08:30:00,RUNAWAY,NORTHERN,700 Block of GOLDEN GATE AV,-122.42291369529,37.7806600950548 +92096,2014-02-21 03:15:00,DRUNKENNESS,SOUTHERN,0 Block of DORE ST,-122.413045971966,37.7738617771611 +92112,2014-02-21 02:10:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +92168,2014-02-20 22:00:00,DRUNKENNESS,SOUTHERN,0 Block of 3RD ST,-122.403284843106,37.787306416019 +92288,2014-02-20 16:50:00,DRUNKENNESS,SOUTHERN,500 Block of 3RD ST,-122.395729616259,37.781152902723896 +92357,2014-02-20 13:45:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +92450,2014-02-20 09:00:00,KIDNAPPING,PARK,1000 Block of 14TH ST,-122.436076649741,37.7672446280514 +92460,2014-02-20 08:10:00,DRUNKENNESS,PARK,300 Block of CORBETT AV,-122.446010215716,37.759090515644296 +92523,2014-02-20 00:30:00,ARSON,TARAVAL,400 Block of DEWEY BL,-122.46034732469,37.74645068150271 +92809,2014-02-19 12:13:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +93250,2014-02-18 11:00:00,RUNAWAY,INGLESIDE,700 Block of BRUNSWICK ST,-122.44880842782,37.7087429493491 +93307,2014-02-18 07:45:00,KIDNAPPING,BAYVIEW,1400 Block of SHAFTER AV,-122.387977804168,37.7294150332369 +93453,2014-02-17 20:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +93597,2014-02-17 14:35:00,KIDNAPPING,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +93744,2014-02-17 02:25:00,DRUNKENNESS,INGLESIDE,1600 Block of BACON ST,-122.418915377858,37.7236825333993 +93789,2014-02-17 00:01:00,KIDNAPPING,BAYVIEW,0 Block of SANTAFE AV,-122.400850244004,37.7340839384311 +93841,2014-02-09 21:00:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +94026,2014-02-09 11:05:00,ARSON,NORTHERN,0 Block of MYRTLE ST,-122.418822449574,37.7854811371963 +94094,2014-02-09 03:00:00,KIDNAPPING,SOUTHERN,0 Block of 3RD ST,-122.402835528142,37.7868009028384 +94099,2014-02-09 02:22:00,ARSON,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +94130,2014-02-09 00:25:00,DRUNKENNESS,NORTHERN,1400 Block of VALLEJO ST,-122.421143711132,37.796948073613 +94180,2014-02-08 22:55:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435664298117,37.762319163767 +94198,2014-02-08 21:45:00,DRUNKENNESS,SOUTHERN,5TH ST / MINNA ST,-122.405934320038,37.782295644598 +94226,2014-02-08 20:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +94415,2014-02-08 11:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +94417,2014-02-08 11:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +94519,2014-02-08 01:25:00,DRUNKENNESS,MISSION,700 Block of VALENCIA ST,-122.421431349205,37.7608899230496 +94528,2014-02-08 00:14:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +94551,2014-02-07 23:10:00,DRUNKENNESS,RICHMOND,3000 Block of JACKSON ST,-122.445324238926,37.7911558079508 +94593,2014-02-07 21:30:00,RUNAWAY,MISSION,4000 Block of 24TH ST,-122.43300956477,37.7514239412017 +94617,2014-02-07 20:45:00,KIDNAPPING,TENDERLOIN,600 Block of ELLIS ST,-122.416916142188,37.78439444920679 +94652,2014-02-07 19:30:00,KIDNAPPING,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +94653,2014-02-07 19:30:00,KIDNAPPING,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +94704,2014-02-07 17:46:00,ARSON,NORTHERN,2300 Block of LARKIN ST,-122.420719281985,37.79945462832 +94856,2014-02-07 09:30:00,KIDNAPPING,INGLESIDE,0 Block of PATTON ST,-122.423001467283,37.7378834676306 +94949,2014-02-06 23:43:00,DRUNKENNESS,MISSION,16TH ST / RONDEL PL,-122.421240281394,37.76495589279121 +95060,2014-02-06 19:20:00,RUNAWAY,CENTRAL,1100 Block of POWELL ST,-122.409880214664,37.7951763917246 +95300,2014-02-06 02:43:00,ARSON,PARK,1200 Block of WILLARD ST,-122.454428345535,37.7656989744852 +95316,2014-02-06 00:48:00,DRUNKENNESS,TARAVAL,300 Block of BUCKINGHAM WY,-122.478840965775,37.725949257136605 +95357,2014-02-05 23:19:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +95650,2014-02-05 10:22:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345148,37.7839916768161 +95681,2014-02-05 09:00:00,RUNAWAY,BAYVIEW,700 Block of LECONTE AV,-122.39669772632,37.7168306127154 +95707,2014-02-05 07:30:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +95712,2014-02-05 07:15:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +95715,2014-02-05 07:13:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +95747,2014-02-05 01:40:00,DRUNKENNESS,NORTHERN,2100 Block of VALLEJO ST,-122.432653227021,37.7954834153794 +95754,2014-02-05 00:56:00,DRUNKENNESS,MISSION,15TH ST / CHURCH ST,-122.428820922736,37.7661286357813 +95797,2014-02-04 23:00:00,KIDNAPPING,MISSION,1300 Block of UTAH ST,-122.405337194755,37.7524089409576 +95800,2014-02-04 23:00:00,KIDNAPPING,NORTHERN,600 Block of POLK ST,-122.419020964349,37.782652976077 +95874,2014-02-04 19:00:00,KIDNAPPING,INGLESIDE,200 Block of TEDDY AV,-122.407583029168,37.7148189169113 +96014,2014-02-04 13:00:00,KIDNAPPING,INGLESIDE,0 Block of PATTON ST,-122.423001467283,37.7378834676306 +96056,2014-02-04 11:30:00,KIDNAPPING,INGLESIDE,5000 Block of MISSION ST,-122.440777706243,37.716880652494105 +96057,2014-02-04 11:25:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +96118,2014-02-04 07:50:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +96145,2014-02-04 02:47:00,ARSON,BAYVIEW,QUINT ST / NEWCOMB AV,-122.395382931364,37.73840533514429 +96329,2014-02-03 16:47:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +96529,2014-02-03 05:20:00,ARSON,BAYVIEW,0 Block of OSCEOLA LN,-122.383085144615,37.7317523387371 +96578,2014-01-26 23:10:00,DRUNKENNESS,TENDERLOIN,LEAVENWORTH ST / MCALLISTER ST,-122.413679376888,37.7809258336852 +96654,2014-01-26 18:44:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +96713,2014-01-26 16:00:00,ARSON,MISSION,2800 Block of HARRISON ST,-122.411752574468,37.751820136318 +96825,2014-01-26 11:00:00,KIDNAPPING,CENTRAL,300 Block of UNION ST,-122.404861124167,37.801037926081904 +96921,2014-01-26 02:00:00,KIDNAPPING,INGLESIDE,600 Block of 29TH ST,-122.435095535842,37.7432442886535 +96968,2014-01-26 00:01:00,ARSON,INGLESIDE,400 Block of MANGELS AV,-122.447758654898,37.7330178512547 +97034,2014-01-25 21:48:00,DRUNKENNESS,INGLESIDE,400 Block of MADRID ST,-122.432290064854,37.7224064713036 +97242,2014-01-25 13:20:00,ARSON,CENTRAL,400 Block of STOCKTON ST,-122.406977563692,37.789918101686 +97267,2014-01-25 12:15:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +97324,2014-01-25 10:05:00,ARSON,CENTRAL,2500 Block of TAYLOR ST,-122.415270023651,37.8058980113661 +97352,2014-01-25 08:20:00,RUNAWAY,CENTRAL,1700 Block of MASON ST,-122.412277228876,37.7994155542754 +97372,2014-01-25 06:41:00,DRUNKENNESS,BAYVIEW,1000 Block of OAKDALE AV,-122.380348349699,37.7288276251864 +97434,2014-01-25 00:06:00,KIDNAPPING,CENTRAL,500 Block of SUTTER ST,-122.409423604675,37.7890647342848 +97435,2014-01-25 00:06:00,KIDNAPPING,CENTRAL,500 Block of SUTTER ST,-122.409423604675,37.7890647342848 +97646,2014-01-24 16:00:00,ARSON,RICHMOND,2100 Block of SCOTT ST,-122.439118214706,37.789644642101706 +97662,2014-01-24 15:30:00,KIDNAPPING,INGLESIDE,400 Block of RAYMOND AV,-122.412457953057,37.7147347356846 +97845,2014-01-24 05:31:00,ARSON,MISSION,15TH ST / JULIAN AV,-122.421057854839,37.7665987781478 +98145,2014-01-23 14:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +98252,2014-01-23 08:32:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +98264,2014-01-23 08:20:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +98387,2014-01-22 21:15:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 1ST ST,-122.396039441019,37.78853681880009 +98542,2014-01-22 15:58:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +98704,2014-01-22 07:30:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +98742,2014-01-22 01:00:00,KIDNAPPING,INGLESIDE,GENEVA AV / PARIS ST,-122.439438100189,37.7156743568308 +98830,2014-01-21 19:30:00,KIDNAPPING,NORTHERN,1500 Block of VANNESS AV,-122.422062730264,37.789920001484106 +98898,2014-01-21 16:40:00,RUNAWAY,BAYVIEW,3RD ST / LASALLE AV,-122.389865610332,37.73716994462029 +98962,2014-01-21 13:40:00,DRUNKENNESS,TARAVAL,OCEAN AV / HAROLD AV,-122.453105673099,37.72324440258609 +99001,2014-01-21 11:36:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.40787711735202,37.7803875013555 +99045,2014-01-21 08:44:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +99203,2014-01-20 20:21:00,ARSON,TARAVAL,0 Block of BYXBEE ST,-122.469738991974,37.715188066657 +99485,2014-01-20 07:10:00,KIDNAPPING,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +99501,2014-01-20 02:16:00,KIDNAPPING,CENTRAL,400 Block of NORTHPOINT ST,-122.414635954342,37.806501229113 +99551,2014-01-12 22:34:00,DRUNKENNESS,MISSION,24TH ST / CASTRO ST,-122.434089046473,37.7513050185724 +99627,2014-01-12 19:47:00,ARSON,TARAVAL,0 Block of BRIGHTON AV,-122.455045708672,37.7191365323626 +99637,2014-01-12 19:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +99650,2014-01-12 18:26:00,DRUNKENNESS,MISSION,24TH ST / FOLSOM ST,-122.414089000708,37.75250507857579 +99690,2014-01-12 16:30:00,KIDNAPPING,TARAVAL,2000 Block of 23RD AV,-122.480501104514,37.7493678022353 +99810,2014-01-12 09:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +99838,2014-01-12 03:10:00,KIDNAPPING,MISSION,300 Block of 14TH ST,-122.42038431515,37.768304409458295 +99892,2014-01-12 00:01:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +99990,2014-01-11 19:55:00,ARSON,SOUTHERN,0 Block of MARKET ST,-122.395097774181,37.79405904855621 +100129,2014-01-11 12:59:00,DRUNKENNESS,BAYVIEW,100 Block of JERROLD AV,-122.371625370398,37.728776681812704 +100185,2014-01-11 10:00:00,KIDNAPPING,INGLESIDE,300 Block of RUSSIA AV,-122.434341722729,37.720297265608 +100228,2014-01-11 07:04:00,DRUNKENNESS,INGLESIDE,SANTAROSA AV / CAYUGA AV,-122.436805296384,37.7271697165227 +100269,2014-01-11 01:00:00,DRUNKENNESS,CENTRAL,700 Block of GEARY ST,-122.415654629547,37.7864672409674 +100397,2014-01-10 20:30:00,KIDNAPPING,CENTRAL,HYDE ST / UNION ST,-122.419052260492,37.79919883280221 +100401,2014-01-10 20:18:00,DRUNKENNESS,MISSION,1000 Block of SOUTH VAN NESS AV,-122.416572667483,37.7563562905072 +100461,2014-01-10 18:13:00,ARSON,RICHMOND,300 Block of 25TH AV,-122.484872200768,37.782939257871 +100636,2014-01-10 11:00:00,ARSON,RICHMOND,400 Block of 30TH AV,-122.490093437359,37.7807920840194 +100662,2014-01-10 09:00:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +101073,2014-01-09 08:21:00,KIDNAPPING,RICHMOND,3500 Block of CALIFORNIA ST,-122.452586938656,37.7864601412645 +101152,2014-01-08 23:47:00,DRUNKENNESS,MISSION,1200 Block of HAMPSHIRE ST,-122.40714465605,37.7520972558707 +101543,2014-01-08 03:00:00,KIDNAPPING,MISSION,700 Block of NOE ST,-122.432570638926,37.75754170129171 +101582,2014-01-07 23:32:00,DRUNKENNESS,INGLESIDE,4100 Block of MISSION ST,-122.429801668764,37.7303819548591 +101895,2014-01-07 07:26:00,DRUNKENNESS,TENDERLOIN,0 Block of EDDY ST,-122.408890252742,37.78434676132729 +101938,2014-01-07 00:01:00,ARSON,BAYVIEW,1300 Block of SHAFTER AV,-122.386109619077,37.7283547937407 +101957,2014-01-06 23:40:00,DRUNKENNESS,BAYVIEW,300 Block of BAY SHORE BL,-122.406825183678,37.741054981526 +102047,2014-01-06 19:56:00,DRUNKENNESS,BAYVIEW,GILMAN AV / INGALLS ST,-122.391872492835,37.7203513038826 +102331,2014-01-06 02:00:00,ARSON,MISSION,1200 Block of CHURCH ST,-122.427247070911,37.7505006388269 +102398,2013-12-29 21:30:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +102452,2013-12-29 18:30:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +102508,2013-12-29 16:40:00,KIDNAPPING,BAYVIEW,900 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +102664,2013-12-29 06:00:00,RUNAWAY,TARAVAL,200 Block of FAXON AV,-122.460282668156,37.71914274631629 +102668,2013-12-29 05:04:00,ARSON,MISSION,1400 Block of VALENCIA ST,-122.420359911899,37.749695007739 +102713,2013-12-29 00:30:00,KIDNAPPING,MISSION,400 Block of CHURCH ST,-122.4286109134,37.7632288973036 +102764,2013-12-28 22:45:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +102827,2013-12-28 20:00:00,KIDNAPPING,BAYVIEW,0 Block of LILLIAN ST,-122.380835135185,37.7317397777806 +102839,2013-12-28 19:22:00,ARSON,BAYVIEW,1600 Block of ARMSTRONG AV,-122.392955826995,37.726563702951005 +102975,2013-12-28 14:00:00,RUNAWAY,CENTRAL,1700 Block of MASON ST,-122.412277228876,37.7994155542754 +103030,2013-12-28 12:00:00,KIDNAPPING,MISSION,1100 Block of YORK ST,-122.408195421597,37.7536414673004 +103065,2013-12-28 09:00:00,KIDNAPPING,BAYVIEW,0 Block of COMMER CT,-122.38499543409,37.7325333188542 +103151,2013-12-28 00:22:00,DRUNKENNESS,TENDERLOIN,POWELL ST / OFARRELL ST,-122.408040474858,37.7864094033618 +103153,2013-12-28 00:14:00,ARSON,TARAVAL,1300 Block of OCEAN AV,-122.45683034911,37.724115436248496 +103180,2013-12-27 23:10:00,DRUNKENNESS,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +103246,2013-12-27 19:30:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +103571,2013-12-26 23:38:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.409184636157,37.7756080205266 +103651,2013-12-26 17:27:00,DRUNKENNESS,BAYVIEW,1300 Block of DEHARO ST,-122.400275091514,37.7528631152157 +103732,2013-12-26 12:00:00,KIDNAPPING,BAYVIEW,0 Block of HUDSON CT,-122.379091692307,37.7324208265708 +103739,2013-12-26 12:00:00,KIDNAPPING,MISSION,4200 Block of 19TH ST,-122.436502740795,37.759134651045706 +103870,2013-12-25 18:50:00,ARSON,CENTRAL,0 Block of WAVERLY PL,-122.406802310999,37.7937562170081 +103948,2013-12-25 07:07:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +103950,2013-12-25 07:07:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +104187,2013-12-23 19:10:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +104189,2013-12-23 19:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +104205,2013-12-23 18:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +104281,2013-12-23 09:00:00,KIDNAPPING,TENDERLOIN,400 Block of JONES ST,-122.412993783039,37.78556296952871 +104315,2013-12-23 01:53:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +104647,2013-12-15 02:00:00,KIDNAPPING,CENTRAL,700 Block of STOCKTON ST,-122.407637360065,37.7924858740008 +104685,2013-12-15 00:03:00,KIDNAPPING,PARK,900 Block of BAKER ST,-122.441810132336,37.7808612802925 +105407,2013-12-13 09:00:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +105668,2013-12-12 14:30:00,KIDNAPPING,MISSION,15TH ST / SHOTWELL ST,-122.416552635487,37.7668698952007 +105862,2013-12-11 22:33:00,KIDNAPPING,INGLESIDE,3300 Block of MISSION ST,-122.421264331104,37.743584765874 +106044,2013-12-11 14:58:00,ARSON,MISSION,2900 Block of 16TH ST,-122.418049946137,37.7650940324026 +106119,2013-12-11 10:30:00,KIDNAPPING,INGLESIDE,GENEVA AV / NAPLES ST,-122.436177137685,37.7142089386085 +106156,2013-12-11 08:00:00,RUNAWAY,TARAVAL,1200 Block of 14TH AV,-122.471663398777,37.7647297486264 +106197,2013-12-11 02:28:00,DRUNKENNESS,NORTHERN,2200 Block of UNION ST,-122.436340530766,37.79703639636929 +106241,2013-12-10 23:25:00,KIDNAPPING,CENTRAL,500 Block of SUTTER ST,-122.409445484488,37.789173205941 +106250,2013-12-10 22:00:00,KIDNAPPING,INGLESIDE,100 Block of PRAGUE ST,-122.426559586503,37.7196754130899 +106271,2013-12-10 21:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +106343,2013-12-10 17:31:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +106373,2013-12-10 16:42:00,DRUNKENNESS,TENDERLOIN,LEAVENWORTH ST / EDDY ST,-122.414242955907,37.7837240254478 +106410,2013-12-10 15:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +106539,2013-12-10 08:21:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +106708,2013-12-09 18:00:00,KIDNAPPING,TARAVAL,4500 Block of IRVING ST,-122.5066010597,37.762206004187 +106789,2013-12-09 14:17:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +106823,2013-12-09 12:15:00,RUNAWAY,SOUTHERN,800 Block of HARRISON ST,-122.400799947914,37.7799338672319 +106826,2013-12-09 12:14:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.416650482064,37.808166053356295 +107050,2013-12-01 18:51:00,KIDNAPPING,SOUTHERN,DUBOCE AV / VALENCIA ST,-122.422367409563,37.76986823924551 +107056,2013-12-01 18:20:00,DRUNKENNESS,SOUTHERN,4TH ST / MARKET ST,-122.405832474482,37.7857446545609 +107093,2013-12-01 16:18:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +107204,2013-12-01 12:00:00,KIDNAPPING,NORTHERN,0 Block of POLK ST,-122.41799760821002,37.776955113843606 +107407,2013-11-30 23:11:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +107506,2013-11-30 19:16:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +107587,2013-11-30 15:20:00,KIDNAPPING,TARAVAL,2100 Block of 48TH AV,-122.507024575938,37.7463260498322 +107779,2013-11-30 00:55:00,ARSON,RICHMOND,2700 Block of CABRILLO ST,-122.488084288982,37.7743199544177 +107885,2013-11-29 19:39:00,KIDNAPPING,NORTHERN,1700 Block of LOMBARD ST,-122.43028553713002,37.8004551160034 +107921,2013-11-29 18:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +108226,2013-11-28 21:10:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +108237,2013-11-28 20:45:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +108239,2013-11-28 20:45:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449101011701,37.7696756290578 +108319,2013-11-28 15:50:00,KIDNAPPING,NORTHERN,700 Block of ELLIS ST,-122.418562097105,37.78418470913029 +108386,2013-11-28 11:17:00,RUNAWAY,TARAVAL,0 Block of MIRAMAR AV,-122.458100917325,37.7191297288314 +108440,2013-11-28 03:45:00,ARSON,PARK,1400 Block of 6TH AV,-122.462974789143,37.7613630987066 +108526,2013-11-27 21:32:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +108771,2013-11-27 11:15:00,KIDNAPPING,TARAVAL,2400 Block of 37TH AV,-122.494982423686,37.7412457589036 +108784,2013-11-27 10:45:00,ARSON,MISSION,100 Block of UTAH ST,-122.406805624892,37.7677621719718 +108821,2013-11-27 08:01:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +108832,2013-11-27 07:39:00,DRUNKENNESS,TENDERLOIN,0 Block of EDDY ST,-122.408890252742,37.78434676132729 +108907,2013-11-26 22:10:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +109102,2013-11-26 13:29:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +109171,2013-11-26 09:56:00,DRUNKENNESS,TENDERLOIN,MASON ST / EDDY ST,-122.409313111431,37.784347851315104 +109292,2013-11-25 22:40:00,DRUNKENNESS,SOUTHERN,8TH ST / NATOMA ST,-122.412160931881,37.7766597984985 +109371,2013-11-25 17:50:00,KIDNAPPING,BAYVIEW,2900 Block of SAN BRUNO AV,-122.402288649686,37.7246523794049 +109532,2013-11-25 08:49:00,DRUNKENNESS,TENDERLOIN,0 Block of EDDY ST,-122.408890252742,37.78434676132729 +109582,2013-11-25 02:00:00,DRUNKENNESS,NORTHERN,PINE ST / POLK ST,-122.42049728879,37.789618819255 +109596,2013-11-25 01:23:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +109684,2013-11-17 20:09:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +109944,2013-11-17 01:42:00,DRUNKENNESS,INGLESIDE,MISSION ST / EXCELSIOR AV,-122.433623421746,37.72623583047221 +110044,2013-11-16 21:00:00,ARSON,BAYVIEW,900 Block of LECONTE AV,-122.39601391156602,37.718069432086295 +110115,2013-11-16 18:02:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.447783070559,37.769954950346495 +110123,2013-11-16 18:00:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +110295,2013-11-16 11:07:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +110632,2013-11-15 15:09:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +110700,2013-11-15 11:55:00,DRUNKENNESS,RICHMOND,5500 Block of GEARY BL,-122.478861040049,37.7804830223849 +110841,2013-11-15 00:05:00,ARSON,BAYVIEW,ESPANOLA ST / BEATRICE LN,-122.380150135518,37.7309030959087 +111035,2013-11-14 16:15:00,ARSON,MISSION,1800 Block of FOLSOM ST,-122.415605496237,37.767717752066496 +111204,2013-11-14 08:06:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +111227,2013-11-14 06:45:00,DRUNKENNESS,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +111234,2013-11-14 05:15:00,KIDNAPPING,TENDERLOIN,0 Block of TAYLOR ST,-122.410689907787,37.7824948907735 +111248,2013-11-14 02:30:00,KIDNAPPING,RICHMOND,800 Block of 42ND AV,-122.502535195853,37.7726499206261 +111275,2013-11-13 23:50:00,KIDNAPPING,SOUTHERN,600 Block of MARKET ST,-122.403246158601,37.787926900451104 +111287,2013-11-13 22:56:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435664298117,37.762319163767 +111289,2013-11-13 22:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +111450,2013-11-13 17:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +111451,2013-11-13 17:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +111491,2013-11-13 15:30:00,KIDNAPPING,SOUTHERN,3RD ST / CHANNEL ST,-122.389898139551,37.7748981937461 +111551,2013-11-13 12:54:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +111701,2013-11-13 00:30:00,DRUNKENNESS,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291891,37.7827931071006 +111750,2013-11-12 21:10:00,KIDNAPPING,CENTRAL,900 Block of PACIFIC AV,-122.41069062983,37.79636449500569 +111793,2013-11-12 20:00:00,KIDNAPPING,INGLESIDE,5100 Block of MISSION ST,-122.440659593804,37.7168235156302 +111795,2013-11-12 20:00:00,KIDNAPPING,INGLESIDE,5100 Block of MISSION ST,-122.440659593804,37.7168235156302 +111822,2013-11-12 19:21:00,DRUNKENNESS,TARAVAL,600 Block of IRVING ST,-122.46471492926202,37.76405203136579 +111993,2013-11-12 13:27:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +112159,2013-11-12 07:49:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407902468508,37.784253176872 +112200,2013-11-12 01:53:00,DRUNKENNESS,RICHMOND,2300 Block of CLEMENT ST,-122.484353420174,37.782105404547 +112218,2013-11-12 00:08:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +112290,2013-11-11 19:45:00,KIDNAPPING,BAYVIEW,1600 Block of OAKDALE AV,-122.391493955999,37.7351844916326 +112348,2013-11-11 17:30:00,KIDNAPPING,BAYVIEW,1000 Block of HOLLISTER AV,-122.391549170299,37.7191791974582 +112349,2013-11-11 17:30:00,KIDNAPPING,BAYVIEW,1000 Block of HOLLISTER AV,-122.391549170299,37.7191791974582 +112450,2013-11-11 12:39:00,KIDNAPPING,INGLESIDE,0 Block of ROTTECK ST,-122.431018033492,37.7329432860793 +112496,2013-11-11 10:27:00,ARSON,NORTHERN,HEMLOCK ST / POLK ST,-122.420021471047,37.7872807076108 +112497,2013-11-11 10:27:00,ARSON,NORTHERN,HEMLOCK ST / POLK ST,-122.420021471047,37.7872807076108 +112502,2013-11-11 10:00:00,ARSON,CENTRAL,700 Block of GEARY ST,-122.415654629547,37.7864672409674 +112519,2013-11-11 08:30:00,KIDNAPPING,MISSION,500 Block of SANCHEZ ST,-122.430466314217,37.760760560539495 +112547,2013-11-11 06:00:00,ARSON,NORTHERN,3200 Block of DIVISADERO ST,-122.4428172375,37.7994896740468 +112549,2013-11-11 05:50:00,ARSON,NORTHERN,2500 Block of GREENWICH ST,-122.441660006786,37.7982703821018 +112727,2013-11-03 17:36:00,KIDNAPPING,SOUTHERN,1200 Block of MISSION ST,-122.413583483648,37.7770436202636 +112846,2013-11-03 09:33:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +112851,2013-11-03 09:24:00,KIDNAPPING,INGLESIDE,100 Block of TUCKER AV,-122.406955614145,37.716276682291706 +112870,2013-11-03 08:14:00,KIDNAPPING,INGLESIDE,0 Block of VIENNA ST,-122.425025030815,37.7277502372406 +112872,2013-11-03 08:14:00,KIDNAPPING,INGLESIDE,0 Block of VIENNA ST,-122.425025030815,37.7277502372406 +112900,2013-11-03 01:45:00,DRUNKENNESS,SOUTHERN,100 Block of 3RD ST,-122.400916029025,37.7854574902997 +112985,2013-11-02 23:12:00,KIDNAPPING,MISSION,100 Block of SAN JOSE AV,-122.42150630458,37.752438612527705 +112990,2013-11-02 23:05:00,ARSON,TARAVAL,0 Block of BRUCE AV,-122.452632789956,37.7221777092988 +113006,2013-11-02 22:40:00,DRUNKENNESS,MISSION,HARRISON ST / 26TH ST,-122.411595216432,37.7494360392756 +113163,2013-11-02 13:21:00,DRUNKENNESS,SOUTHERN,5TH ST / HARRISON ST,-122.401846367522,37.7790324136251 +113215,2013-11-02 10:06:00,ARSON,PARK,700 Block of CLARENDON AV,-122.459031845907,37.75199756201009 +113244,2013-11-02 07:10:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410928353347,37.7836778741124 +113326,2013-11-01 23:45:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +113349,2013-11-01 22:50:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +113427,2013-11-01 19:45:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +113450,2013-11-01 19:05:00,DRUNKENNESS,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +113752,2013-11-01 09:00:00,KIDNAPPING,RICHMOND,600 Block of 8TH AV,-122.466015811908,37.7761891997855 +113819,2013-11-01 02:15:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +113833,2013-11-01 02:00:00,KIDNAPPING,INGLESIDE,MISSION ST / PARK ST,-122.424235953591,37.736737256489214 +113863,2013-11-01 00:54:00,DRUNKENNESS,TARAVAL,700 Block of FONT BL,-122.483569270838,37.7230650556781 +113867,2013-11-01 00:45:00,DRUNKENNESS,TARAVAL,0 Block of CAMBON DR,-122.474444639595,37.718302204766005 +113984,2013-10-31 23:00:00,DRUNKENNESS,TARAVAL,300 Block of ARBALLO DR,-122.482968064573,37.7201188078634 +114107,2013-10-31 18:00:00,KIDNAPPING,INGLESIDE,400 Block of ATHENS ST,-122.429086132374,37.72087595156521 +114192,2013-10-31 14:30:00,KIDNAPPING,CENTRAL,800 Block of VALLEJO ST,-122.411302650354,37.798321225099 +114197,2013-10-31 14:30:00,RUNAWAY,BAYVIEW,1400 Block of MENDELL ST,-122.390577977348,37.7342439948771 +114205,2013-10-31 13:58:00,DRUNKENNESS,SOUTHERN,THE EMBARCADEROSOUTH ST / HOWARD ST,-122.391004273278,37.7925182655105 +114220,2013-10-31 13:19:00,DRUNKENNESS,BAYVIEW,1600 Block of NEWCOMB AV,-122.391089615241,37.7359045006314 +114294,2013-10-31 09:17:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +114328,2013-10-31 08:00:00,KIDNAPPING,NORTHERN,1900 Block of FRANKLIN ST,-122.42436259754,37.7924205101736 +114355,2013-10-31 04:05:00,KIDNAPPING,NORTHERN,WASHINGTON ST / GOUGH ST,-122.426158657654,37.7926332287606 +114577,2013-10-30 16:20:00,KIDNAPPING,BAYVIEW,1400 Block of 22ND ST,-122.480070771196,37.7606096787079 +114736,2013-10-30 09:50:00,DRUNKENNESS,CENTRAL,2800 Block of JONES ST,-122.41742346242,37.8075434625252 +114772,2013-10-30 07:53:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +114855,2013-10-29 23:00:00,ARSON,NORTHERN,700 Block of FILLMORE ST,-122.431361636424,37.7762972389613 +115069,2013-10-29 12:38:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.409336821846,37.7848337315521 +115109,2013-10-29 10:35:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345148,37.7839916768161 +115130,2013-10-29 09:35:00,KIDNAPPING,TARAVAL,2100 Block of 24TH AV,-122.481305019184,37.747461318190496 +115219,2013-10-29 01:30:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +115248,2013-10-29 00:01:00,KIDNAPPING,TENDERLOIN,400 Block of JONES ST,-122.412899249686,37.7850974904289 +115271,2013-10-28 22:16:00,KIDNAPPING,MISSION,200 Block of SOUTH VAN NESS AV,-122.41771302219,37.76880168033379 +115358,2013-10-28 18:33:00,ARSON,RICHMOND,14TH AV / FULTON ST,-122.472298088823,37.7731143584551 +115362,2013-10-28 18:30:00,DRUNKENNESS,BAYVIEW,4900 Block of 3RD ST,-122.390978248429,37.7335884807714 +115370,2013-10-28 18:04:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +115550,2013-10-28 11:36:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / MASON ST,-122.409499861107,37.7852842684318 +115596,2013-10-28 09:12:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +115688,2013-10-28 01:10:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +115855,2013-10-20 16:33:00,DRUNKENNESS,BAYVIEW,700 Block of KIRKWOOD AV,-122.374100613159,37.7291144726553 +115929,2013-10-20 13:51:00,KIDNAPPING,NORTHERN,1300 Block of WEBSTER ST,-122.431046366089,37.7830295716044 +116035,2013-10-20 05:15:00,KIDNAPPING,INGLESIDE,100 Block of OCEAN AV,-122.440465803423,37.723495361094606 +116052,2013-10-20 02:40:00,KIDNAPPING,INGLESIDE,SUNNYDALE AV / HAHN ST,-122.416000227907,37.7119155437754 +116121,2013-10-20 00:01:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +116408,2013-10-19 12:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +116425,2013-10-19 11:30:00,KIDNAPPING,INGLESIDE,ALEMANY BL / NORTON ST,-122.436680924005,37.72544942422911 +116474,2013-10-19 07:01:00,ARSON,MISSION,300 Block of SAN JOSE AV,-122.421406672969,37.7494022896942 +116508,2013-10-19 02:40:00,KIDNAPPING,SOUTHERN,0 Block of NEWMONTGOMERY ST,-122.400593259668,37.7876024687437 +116724,2013-10-18 17:45:00,ARSON,MISSION,3100 Block of CESAR CHAVEZ ST,-122.412594354828,37.748166005622295 +116835,2013-10-18 12:36:00,DRUNKENNESS,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +116864,2013-10-18 11:28:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +116880,2013-10-18 10:53:00,DRUNKENNESS,SOUTHERN,5TH ST / FOLSOM ST,-122.403390364796,37.7802655777189 +116887,2013-10-18 10:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +116926,2013-10-18 08:05:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +116964,2013-10-18 05:30:00,ARSON,CENTRAL,1300 Block of PINE ST,-122.418028132982,37.7898812870744 +116967,2013-10-18 04:34:00,ARSON,SOUTHERN,700 Block of 6TH ST,-122.46388023993,37.7744766269335 +116985,2013-10-18 02:40:00,DRUNKENNESS,BAYVIEW,4900 Block of 3RD ST,-122.391243431227,37.7336342023099 +116992,2013-10-18 01:58:00,DRUNKENNESS,MISSION,3000 Block of 21ST ST,-122.415089059899,37.7573197989318 +117015,2013-10-18 00:25:00,DRUNKENNESS,INGLESIDE,4300 Block of MISSION ST,-122.431600311794,37.728524805863 +117133,2013-10-17 19:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +117137,2013-10-17 19:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +117173,2013-10-17 18:20:00,DRUNKENNESS,MISSION,5100 Block of DIAMONDHEIGHTS BL,-122.440381634481,37.746820831681205 +117383,2013-10-17 10:57:00,DRUNKENNESS,SOUTHERN,STEVENSON ST / 7TH ST,-122.411935615745,37.780006442029794 +117388,2013-10-17 10:30:00,DRUNKENNESS,SOUTHERN,6TH ST / NATOMA ST,-122.407693108529,37.7801630691196 +117458,2013-10-17 02:02:00,DRUNKENNESS,TENDERLOIN,HYDE ST / TURK ST,-122.415694922134,37.7825851968467 +117486,2013-10-16 23:39:00,DRUNKENNESS,NORTHERN,1900 Block of LARKIN ST,-122.419955910836,37.7956830656712 +117512,2013-10-16 22:30:00,ARSON,PARK,800 Block of PIERCE ST,-122.43502821575,37.7777469477364 +117602,2013-10-16 18:23:00,DRUNKENNESS,TARAVAL,4000 Block of JUDAH ST,-122.505398845381,37.760392815309295 +117669,2013-10-16 15:30:00,KIDNAPPING,BAYVIEW,700 Block of JERROLD AV,-122.37337604924,37.7297692117678 +117743,2013-10-16 12:30:00,KIDNAPPING,MISSION,100 Block of DUBOCE AV,-122.422760608099,37.76989903268221 +117795,2013-10-16 10:26:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +117806,2013-10-16 09:48:00,DRUNKENNESS,SOUTHERN,NATOMA ST / 6TH ST,-122.407693108529,37.7801630691196 +117809,2013-10-16 09:40:00,DRUNKENNESS,SOUTHERN,5TH ST / HOWARD ST,-122.404934413339,37.7814987213218 +117843,2013-10-16 07:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +117928,2013-10-15 22:27:00,KIDNAPPING,NORTHERN,200 Block of PAGE ST,-122.424851402509,37.773829832494 +118006,2013-10-15 18:19:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +118012,2013-10-15 17:58:00,KIDNAPPING,MISSION,SHOTWELL ST / 22ND ST,-122.415473931513,37.75563329793221 +118046,2013-10-15 16:46:00,DRUNKENNESS,TARAVAL,SAN JOSE AV / BROAD ST,-122.453457575203,37.713212153484 +118191,2013-10-15 11:48:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +118211,2013-10-15 11:00:00,KIDNAPPING,MISSION,15TH ST / MISSION ST,-122.419827929961,37.766673755183504 +118216,2013-10-15 10:42:00,DRUNKENNESS,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +118339,2013-10-15 00:31:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +118429,2013-10-14 19:38:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.447783070559,37.769954950346495 +118690,2013-10-14 09:20:00,KIDNAPPING,BAYVIEW,1500 Block of VANDYKE AV,-122.391540162424,37.72859534894911 +118865,2013-10-06 19:41:00,DRUNKENNESS,NORTHERN,1900 Block of UNION ST,-122.430987283243,37.79760610926 +118866,2013-10-06 19:40:00,ARSON,BAYVIEW,100 Block of WESTPOINT RD,-122.380382266471,37.7353538209895 +118886,2013-10-06 18:48:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +118908,2013-10-06 18:10:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +118968,2013-10-06 16:16:00,DRUNKENNESS,MISSION,21ST ST / SHOTWELL ST,-122.415629332446,37.757232227914 +119167,2013-10-06 01:59:00,DRUNKENNESS,CENTRAL,300 Block of BROADWAY ST,-122.402656907923,37.79832023835471 +119197,2013-10-06 00:44:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +119392,2013-10-05 17:00:00,KIDNAPPING,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.414302052544,37.781863316866 +119556,2013-10-05 10:45:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +119751,2013-10-04 21:36:00,ARSON,BAYVIEW,GRIFFITH ST / GILMAN AV,-122.388139317244,37.718235637361495 +119753,2013-10-04 21:35:00,ARSON,SOUTHERN,400 Block of THE EMBARCADEROSOUTH ST,-122.39670853026,37.79787288559329 +119821,2013-10-04 18:45:00,RUNAWAY,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +119828,2013-10-04 18:33:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +119860,2013-10-04 17:55:00,ARSON,TARAVAL,2700 Block of 36TH AV,-122.493403241013,37.7357663349494 +119881,2013-10-04 17:00:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +119890,2013-10-04 17:00:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +119908,2013-10-04 16:24:00,DRUNKENNESS,RICHMOND,JOHNFKENNEDY DR / 30TH AV,-122.489804747862,37.7708917848848 +119982,2013-10-04 14:32:00,DRUNKENNESS,PARK,OAK ST / COLE ST,-122.450601497864,37.7714591179274 +120006,2013-10-04 13:00:00,KIDNAPPING,INGLESIDE,0 Block of BROOKDALE AV,-122.420864146521,37.71219982598 +120064,2013-10-04 10:42:00,DRUNKENNESS,SOUTHERN,CLEMENTINA ST / 6TH ST,-122.406166691396,37.7789434105098 +120108,2013-10-04 09:00:00,KIDNAPPING,MISSION,17TH ST / HOFF ST,-122.420434724553,37.7633758058059 +120110,2013-10-04 09:00:00,RUNAWAY,INGLESIDE,4600 Block of MISSION ST,-122.435621772842,37.7234913181355 +120151,2013-10-04 07:48:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +120211,2013-10-04 01:46:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +120349,2013-10-03 19:54:00,DRUNKENNESS,SOUTHERN,100 Block of BLUXOME ST,-122.399160890306,37.7750906332503 +120379,2013-10-03 18:59:00,DRUNKENNESS,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +120395,2013-10-03 18:10:00,KIDNAPPING,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +120578,2013-10-03 10:19:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / LEAVENWORTH ST,-122.413869632554,37.7818621883021 +120610,2013-10-03 08:56:00,DRUNKENNESS,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +120616,2013-10-03 08:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +120673,2013-10-03 02:00:00,KIDNAPPING,NORTHERN,300 Block of FULTON ST,-122.422536478306,37.7787958771466 +120766,2013-10-02 21:00:00,KIDNAPPING,TARAVAL,3600 Block of IRVING ST,-122.496955695749,37.7626324263918 +120781,2013-10-02 20:40:00,DRUNKENNESS,SOUTHERN,7TH ST / MARKET ST,-122.41251534135598,37.78047774805079 +120906,2013-10-02 16:22:00,DRUNKENNESS,NORTHERN,GOUGH ST / HAIGHT ST,-122.421944172802,37.7730368445535 +120955,2013-10-02 15:23:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +121037,2013-10-02 11:11:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +121045,2013-10-02 10:48:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +121075,2013-10-02 09:12:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +121134,2013-10-02 05:27:00,KIDNAPPING,CENTRAL,DRUMM ST / WASHINGTON ST,-122.396962385547,37.7963478739442 +121235,2013-10-01 20:40:00,DRUNKENNESS,CENTRAL,200 Block of BEACH ST,-122.413178958845,37.8076387530515 +121272,2013-10-01 19:30:00,KIDNAPPING,INGLESIDE,0 Block of TEDDY AV,-122.403252361212,37.713430704116 +121373,2013-10-01 15:59:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +121450,2013-10-01 12:20:00,DRUNKENNESS,SOUTHERN,HOWARD ST / MARY ST,-122.405721454567,37.7808789360214 +121466,2013-10-01 12:00:00,RUNAWAY,CENTRAL,400 Block of UNION ST,-122.406362541513,37.80073652785129 +121529,2013-10-01 09:20:00,ARSON,BAYVIEW,400 Block of BURROWS ST,-122.407544978737,37.7278745037778 +121594,2013-10-01 06:41:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +121722,2013-09-30 22:00:00,KIDNAPPING,SOUTHERN,1000 Block of HOWARD ST,-122.408520791815,37.7785853155801 +121788,2013-09-30 19:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +121981,2013-09-30 11:57:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +122006,2013-09-30 10:20:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +122012,2013-09-30 10:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +122033,2013-09-30 09:00:00,KIDNAPPING,SOUTHERN,300 Block of MARKET ST,-122.39792044402,37.7921256222625 +122065,2013-09-30 07:39:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +122067,2013-09-30 07:33:00,DRUNKENNESS,SOUTHERN,0 Block of 7TH ST,-122.411385962592,37.7796475431341 +122104,2013-09-30 02:35:00,DRUNKENNESS,CENTRAL,200 Block of GEARY ST,-122.407434989523,37.787515874162295 +122109,2013-09-30 01:42:00,DRUNKENNESS,MISSION,ALBION ST / CAMP ST,-122.422777080471,37.7640380834483 +122126,2013-09-30 00:11:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +122130,2013-09-30 00:01:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +122207,2013-09-22 18:53:00,DRUNKENNESS,CENTRAL,1100 Block of THE EMBARCADERONORTH ST,-122.40256476079,37.8047715653509 +122255,2013-09-22 16:40:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +122298,2013-09-22 14:55:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +122312,2013-09-22 14:20:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +122339,2013-09-22 13:15:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +122427,2013-09-22 07:30:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +122495,2013-09-22 00:57:00,DRUNKENNESS,SOUTHERN,1500 Block of MISSION ST,-122.417523396516,37.7738670346175 +122580,2013-09-21 21:55:00,KIDNAPPING,NORTHERN,2000 Block of FRANKLIN ST,-122.42453937013,37.7933007783531 +122660,2013-09-21 17:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +122768,2013-09-21 11:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +122781,2013-09-21 11:00:00,RUNAWAY,CENTRAL,500 Block of FRANCISCO ST,-122.41426677512,37.8046348825476 +122822,2013-09-21 08:24:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +123134,2013-09-20 16:22:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +123190,2013-09-20 14:15:00,KIDNAPPING,NORTHERN,VANNESS AV / OAK ST,-122.419257894814,37.7751462916539 +123278,2013-09-20 10:10:00,DRUNKENNESS,BAYVIEW,3RD ST / NEWCOMB AV,-122.390416955474,37.7355926105862 +123283,2013-09-20 10:02:00,ARSON,NORTHERN,3600 Block of LYON ST,-122.448192619246,37.8046166061201 +123303,2013-09-20 09:06:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +123305,2013-09-20 09:02:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.413401299155,37.780906077687 +123316,2013-09-20 08:35:00,DRUNKENNESS,SOUTHERN,500 Block of STEVENSON ST,-122.410891754793,37.7809097652868 +123327,2013-09-20 07:32:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +123372,2013-09-20 01:55:00,DRUNKENNESS,PARK,17TH ST / MARKET ST,-122.435187699349,37.7626702770872 +123425,2013-09-19 23:15:00,DRUNKENNESS,SOUTHERN,HARRIET ST / FOLSOM ST,-122.406151482163,37.77808112789121 +123594,2013-09-19 16:35:00,DRUNKENNESS,NORTHERN,1800 Block of GREEN ST,-122.429574683713,37.7969397346952 +123675,2013-09-19 12:30:00,RUNAWAY,TARAVAL,1200 Block of 14TH AV,-122.471663398777,37.7647297486264 +123708,2013-09-19 11:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +123729,2013-09-19 10:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +123784,2013-09-19 07:44:00,KIDNAPPING,NORTHERN,1200 Block of GOLDEN GATE AV,-122.431119958372,37.779725610058605 +123806,2013-09-19 06:33:00,ARSON,NORTHERN,1000 Block of STEINER ST,-122.433571772367,37.7788887614902 +123949,2013-09-18 19:14:00,ARSON,RICHMOND,2700 Block of FULTON ST,-122.46110740446998,37.7740161252649 +123981,2013-09-18 18:08:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +124076,2013-09-18 15:19:00,DRUNKENNESS,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413069926397,37.7820204255866 +124127,2013-09-18 13:30:00,ARSON,NORTHERN,700 Block of ELLIS ST,-122.418562097105,37.78418470913029 +124272,2013-09-18 06:56:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +124281,2013-09-18 04:51:00,ARSON,SOUTHERN,1100 Block of HOWARD ST,-122.410165356485,37.777283890395104 +124364,2013-09-17 22:50:00,KIDNAPPING,INGLESIDE,1000 Block of PERSIA AV,-122.427620930727,37.7190833085485 +124442,2013-09-17 19:30:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +124446,2013-09-17 19:30:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +124466,2013-09-17 18:40:00,ARSON,NORTHERN,700 Block of ELLIS ST,-122.418562097105,37.78418470913029 +124717,2013-09-17 03:45:00,KIDNAPPING,SOUTHERN,200 Block of BERRY ST,-122.394438381217,37.774853325726106 +124770,2013-09-16 23:50:00,KIDNAPPING,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +124781,2013-09-16 23:08:00,KIDNAPPING,INGLESIDE,100 Block of TRUMBULL ST,-122.427240184736,37.73079224766129 +124803,2013-09-16 22:00:00,RUNAWAY,RICHMOND,600 Block of 22ND AV,-122.481109480209,37.7755013000664 +124948,2013-09-16 15:45:00,DRUNKENNESS,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.414302052544,37.781863316866 +125138,2013-09-16 07:02:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +125179,2013-09-16 00:30:00,KIDNAPPING,TARAVAL,3600 Block of OCEAN AV,-122.484087457971,37.7323897461212 +125233,2013-09-08 21:51:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +125348,2013-09-08 16:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +125349,2013-09-08 16:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +125521,2013-09-08 08:52:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +125576,2013-09-08 02:30:00,KIDNAPPING,INGLESIDE,1000 Block of PERSIA AV,-122.427620930727,37.7190833085485 +125723,2013-09-07 20:48:00,DRUNKENNESS,INGLESIDE,4500 Block of MISSION ST,-122.43455277287,37.7249007364814 +125790,2013-09-07 18:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +125803,2013-09-07 17:54:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +125834,2013-09-07 17:00:00,KIDNAPPING,RICHMOND,600 Block of 9TH AV,-122.467221148771,37.7761343245369 +125932,2013-09-07 12:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +125986,2013-09-07 10:05:00,DRUNKENNESS,SOUTHERN,STEVENSON ST / 6TH ST,-122.409696355558,37.7817540588712 +125992,2013-09-07 10:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +126037,2013-09-07 04:57:00,ARSON,TARAVAL,48TH AV / JUDAH ST,-122.508067688112,37.760327629048 +126064,2013-09-07 02:04:00,DRUNKENNESS,CENTRAL,BROADWAY ST / ROMOLO ST,-122.406235011205,37.7979206468132 +126080,2013-09-07 01:30:00,KIDNAPPING,INGLESIDE,0 Block of COLLEGE TR,-122.426462947425,37.7354561237323 +126200,2013-09-06 21:00:00,KIDNAPPING,TARAVAL,300 Block of ARBALLO DR,-122.483066441234,37.7208318410205 +126331,2013-09-06 17:00:00,KIDNAPPING,INGLESIDE,100 Block of LONDON ST,-122.43238182556,37.7266052914251 +126479,2013-09-06 11:14:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +126498,2013-09-06 10:52:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.408913229808,37.781211650766295 +126574,2013-09-06 03:49:00,ARSON,RICHMOND,3500 Block of FULTON ST,-122.469641697587,37.7732875002688 +126608,2013-09-06 00:15:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +126621,2013-09-06 00:01:00,ARSON,PARK,1100 Block of SCOTT ST,-122.43709942831998,37.7803522156893 +126698,2013-09-05 20:30:00,KIDNAPPING,BAYVIEW,1100 Block of HOLLISTER AV,-122.39333133786998,37.7203256859376 +126707,2013-09-05 20:00:00,KIDNAPPING,BAYVIEW,1500 Block of OAKDALE AV,-122.389471535682,37.7340319720999 +126831,2013-09-05 15:30:00,DRUNKENNESS,MISSION,17TH ST / CAPP ST,-122.418486296575,37.7634954373144 +127148,2013-09-04 21:30:00,KIDNAPPING,INGLESIDE,300 Block of SAWYER ST,-122.414200995694,37.7137889657104 +127211,2013-09-04 19:00:00,ARSON,SOUTHERN,1200 Block of FOLSOM ST,-122.410802477808,37.7743299153836 +127328,2013-09-04 13:39:00,DRUNKENNESS,SOUTHERN,6TH ST / MARKET ST,-122.41029351969,37.7822305870036 +127468,2013-09-04 08:00:00,KIDNAPPING,INGLESIDE,0 Block of GLADSTONE DR,-122.420306723417,37.7304026570113 +127477,2013-09-04 07:38:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / MASON ST,-122.409499861107,37.7852842684318 +127484,2013-09-04 07:14:00,DRUNKENNESS,SOUTHERN,5THSTNORTH ST / MARKET ST,-122.408068345148,37.7839916768161 +127486,2013-09-04 07:06:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +127633,2013-09-03 19:21:00,DRUNKENNESS,SOUTHERN,400 Block of NATOMA ST,-122.407039055082,37.78075651835911 +127734,2013-09-03 15:45:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +127790,2013-09-03 13:21:00,DRUNKENNESS,MISSION,800 Block of SHOTWELL ST,-122.415326257835,37.7548226306308 +127868,2013-09-03 08:48:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +127872,2013-09-03 08:39:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +127908,2013-09-03 07:28:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +127947,2013-09-03 00:50:00,DRUNKENNESS,INGLESIDE,MISSION ST / PERSIA AV,-122.43597721703,37.7231288306727 +128004,2013-09-02 21:00:00,KIDNAPPING,MISSION,2200 Block of MARKET ST,-122.431957685196,37.7649357189679 +128107,2013-09-02 16:02:00,KIDNAPPING,BAYVIEW,0 Block of NICHOLS WY,-122.38724435334,37.7195130001474 +128179,2013-09-02 13:00:00,DRUNKENNESS,SOUTHERN,1400 Block of MARKET ST,-122.418480564808,37.775898446204 +128289,2013-09-02 05:00:00,KIDNAPPING,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +128351,2013-08-25 23:15:00,DRUNKENNESS,RICHMOND,2500 Block of SUTTER ST,-122.442364696255,37.7848750530811 +128393,2013-08-25 21:38:00,DRUNKENNESS,PARK,OAK ST / SCOTT ST,-122.435753024583,37.7733438011236 +128402,2013-08-25 21:00:00,KIDNAPPING,BAYVIEW,400 Block of TUNNEL AV,-122.401399497577,37.70911172039371 +128441,2013-08-25 19:40:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +128444,2013-08-25 19:22:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +128556,2013-08-25 15:45:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +128574,2013-08-25 15:05:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +128580,2013-08-25 14:33:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +128688,2013-08-25 05:30:00,KIDNAPPING,INGLESIDE,0 Block of RUTLAND ST,-122.405103470633,37.717588974255904 +128748,2013-08-25 00:53:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +128894,2013-08-24 18:30:00,KIDNAPPING,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.414302052544,37.781863316866 +129031,2013-08-24 11:45:00,KIDNAPPING,TARAVAL,12TH AV / LAWTON ST,-122.469130005097,37.7583035716828 +129064,2013-08-24 09:20:00,ARSON,BAYVIEW,3RD ST / CHINABASIN ST,-122.390027243495,37.7762997888042 +129082,2013-08-24 08:40:00,DRUNKENNESS,BAYVIEW,1400 Block of MENDELL ST,-122.390577977348,37.7342439948771 +129105,2013-08-24 05:20:00,KIDNAPPING,MISSION,3500 Block of CESAR CHAVEZ ST,-122.420832650303,37.7479994493226 +129153,2013-08-24 00:01:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +129209,2013-08-23 22:03:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +129261,2013-08-23 19:54:00,KIDNAPPING,BAYVIEW,700 Block of INNES AV,-122.372926079722,37.730459961039706 +129279,2013-08-23 19:09:00,KIDNAPPING,MISSION,2800 Block of 23RD ST,-122.409741838345,37.7544242915077 +129572,2013-08-23 06:50:00,DRUNKENNESS,SOUTHERN,6TH ST / NATOMA ST,-122.407693108529,37.7801630691196 +129574,2013-08-23 06:37:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.40787711735202,37.7803875013555 +129803,2013-08-22 16:30:00,KIDNAPPING,TARAVAL,4000 Block of IRVING ST,-122.501240780463,37.76244308035261 +129941,2013-08-22 09:46:00,DRUNKENNESS,SOUTHERN,MISSION ST / 8TH ST,-122.41316085097,37.7774566611807 +129944,2013-08-22 09:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +129956,2013-08-22 09:15:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +130018,2013-08-22 03:00:00,KIDNAPPING,TARAVAL,300 Block of HOWTH ST,-122.451882643621,37.7191893908295 +130082,2013-08-21 22:15:00,KIDNAPPING,CENTRAL,500 Block of POST ST,-122.410882825551,37.787920937553295 +130245,2013-08-21 17:00:00,KIDNAPPING,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +130248,2013-08-21 16:48:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +130373,2013-08-21 10:33:00,DRUNKENNESS,SOUTHERN,HOWARD ST / MARY ST,-122.405721454567,37.7808789360214 +130509,2013-08-20 21:45:00,DRUNKENNESS,TARAVAL,800 Block of URBANO DR,-122.463421633503,37.723517646765 +130518,2013-08-20 21:15:00,DRUNKENNESS,NORTHERN,700 Block of FRANKLIN ST,-122.42230632339,37.7815164967782 +130575,2013-08-20 19:05:00,KIDNAPPING,INGLESIDE,1700 Block of FELTON ST,-122.421880457136,37.7255738014945 +130579,2013-08-20 19:05:00,KIDNAPPING,INGLESIDE,1700 Block of FELTON ST,-122.421880457136,37.7255738014945 +130758,2013-08-20 12:40:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +130803,2013-08-20 10:45:00,KIDNAPPING,PARK,FULTON ST / MASONIC AV,-122.446472679005,37.7758015943912 +130804,2013-08-20 10:45:00,KIDNAPPING,PARK,FULTON ST / MASONIC AV,-122.446472679005,37.7758015943912 +130820,2013-08-20 09:42:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +130876,2013-08-20 03:00:00,DRUNKENNESS,SOUTHERN,300 Block of BEALE ST,-122.391985513707,37.788020382906296 +131032,2013-08-19 18:38:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.418587172219,37.75301865374461 +131117,2013-08-19 16:41:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +131194,2013-08-19 14:01:00,DRUNKENNESS,MISSION,1000 Block of SHOTWELL ST,-122.415160761593,37.7516186563287 +131310,2013-08-19 08:55:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +131335,2013-08-19 06:29:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +131356,2013-08-19 02:45:00,KIDNAPPING,MISSION,22ND ST / CAPP ST,-122.417660640341,37.7555043420028 +131503,2013-08-11 19:20:00,DRUNKENNESS,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +131512,2013-08-11 19:00:00,DRUNKENNESS,MISSION,700 Block of CAPP ST,-122.417511996621,37.754691084878 +131818,2013-08-11 01:25:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436867932617,37.7220486455317 +131832,2013-08-11 00:46:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +131861,2013-08-10 23:51:00,KIDNAPPING,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +132044,2013-08-10 17:00:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +132192,2013-08-10 11:05:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +132271,2013-08-10 04:19:00,KIDNAPPING,MISSION,600 Block of SOUTH VAN NESS AV,-122.417185210419,37.7627583408182 +132285,2013-08-10 02:50:00,DRUNKENNESS,SOUTHERN,HARRISON ST / 3RD ST,-122.397388784826,37.7825543452426 +132289,2013-08-10 02:00:00,KIDNAPPING,CENTRAL,800 Block of BUSH ST,-122.411259228464,37.789789421954495 +132305,2013-08-10 01:40:00,DRUNKENNESS,SOUTHERN,1300 Block of STEVENSON ST,-122.42173251154,37.7707590888754 +132334,2013-08-10 00:01:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +132346,2013-08-09 23:30:00,ARSON,NORTHERN,1600 Block of PINE ST,-122.422984865337,37.7893598360149 +132690,2013-08-09 12:00:00,RUNAWAY,INGLESIDE,0 Block of COSTA ST,-122.406324317133,37.74472510739879 +132706,2013-08-09 11:38:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +132715,2013-08-09 11:15:00,ARSON,BAYVIEW,QUINT ST / NEWCOMB AV,-122.395382931364,37.73840533514429 +132718,2013-08-09 11:00:00,DRUNKENNESS,MISSION,4200 Block of 18TH ST,-122.436668010553,37.760845185793706 +132732,2013-08-09 10:25:00,DRUNKENNESS,MISSION,0 Block of HOFF ST,-122.420575720933,37.7641819463712 +132742,2013-08-09 09:48:00,DRUNKENNESS,SOUTHERN,100 Block of 5TH ST,-122.406141248372,37.7825406642524 +132755,2013-08-09 09:01:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +132773,2013-08-09 07:33:00,DRUNKENNESS,SOUTHERN,MARKET ST / MASON ST,-122.408953598279,37.783287873572 +132781,2013-08-09 06:30:00,ARSON,CENTRAL,0 Block of DASHIELL HAMMETT ST,-122.408034830311,37.7907401544868 +132888,2013-08-08 21:50:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +132930,2013-08-08 20:05:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +132948,2013-08-08 19:16:00,KIDNAPPING,SOUTHERN,600 Block of MISSION ST,-122.401692292616,37.786588859076296 +132966,2013-08-08 18:45:00,DRUNKENNESS,PARK,1600 Block of MCALLISTER ST,-122.439201396009,37.77763423137971 +133262,2013-08-07 23:00:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +133409,2013-08-07 18:05:00,DRUNKENNESS,MISSION,25TH ST / TREAT AV,-122.412838554019,37.7509678760759 +133532,2013-08-07 13:00:00,KIDNAPPING,RICHMOND,900 Block of CABRILLO ST,-122.468706870862,37.7752040514383 +133534,2013-08-07 12:58:00,DRUNKENNESS,SOUTHERN,200 Block of 6TH ST,-122.406830073947,37.77955378317321 +133597,2013-08-07 08:55:00,DRUNKENNESS,BAYVIEW,500 Block of BAY SHORE BL,-122.407139235455,37.7393186205107 +133617,2013-08-07 07:37:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +133634,2013-08-07 05:50:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +133701,2013-08-06 22:45:00,ARSON,PARK,0 Block of HENRY ST,-122.432239209019,37.7666730659112 +133795,2013-08-06 18:25:00,KIDNAPPING,INGLESIDE,100 Block of ALEMANY BL,-122.40921525596902,37.7361732498955 +133898,2013-08-06 13:55:00,DRUNKENNESS,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +133977,2013-08-06 10:00:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.413753670487,37.78373004094 +134158,2013-08-05 18:40:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +134181,2013-08-05 17:30:00,DRUNKENNESS,INGLESIDE,100 Block of DALEWOOD WY,-122.456617190599,37.7378950760453 +134267,2013-08-05 12:49:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +134313,2013-08-05 10:30:00,KIDNAPPING,SOUTHERN,300 Block of MAIN ST,-122.391024911564,37.7887786674397 +134354,2013-08-05 07:38:00,DRUNKENNESS,SOUTHERN,HOWARD ST / MARY ST,-122.405721454567,37.7808789360214 +134379,2013-08-05 04:55:00,ARSON,NORTHERN,1000 Block of GEARY ST,-122.420571110949,37.7857331120575 +134398,2013-08-05 02:25:00,DRUNKENNESS,SOUTHERN,1600 Block of MARKET ST,-122.421619493654,37.773433937273005 +134478,2013-07-28 21:30:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +134524,2013-07-28 19:49:00,DRUNKENNESS,NORTHERN,1700 Block of SACRAMENTO ST,-122.421720672696,37.7914446364385 +134572,2013-07-28 17:24:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +134706,2013-07-28 13:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +134739,2013-07-28 12:00:00,KIDNAPPING,BAYVIEW,1200 Block of HOLLISTER AV,-122.395098403651,37.7213030940671 +134755,2013-07-28 11:09:00,ARSON,CENTRAL,700 Block of POWELL ST,-122.409007369565,37.7915837065255 +134965,2013-07-27 21:20:00,DRUNKENNESS,SOUTHERN,100 Block of STEUART ST,-122.392349764257,37.7926450897756 +135270,2013-07-27 04:00:00,KIDNAPPING,INGLESIDE,1100 Block of PERALTA AV,-122.409678079531,37.7357223682795 +135354,2013-07-27 00:01:00,DRUNKENNESS,INGLESIDE,PERSIA AV / NAPLES ST,-122.431204527214,37.72085578178 +135533,2013-07-26 17:34:00,DRUNKENNESS,MISSION,2800 Block of 26TH ST,-122.407394656476,37.7496315886349 +135759,2013-07-26 08:19:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +135865,2013-07-25 22:05:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +136055,2013-07-25 13:42:00,DRUNKENNESS,SOUTHERN,COLUMBIASQUARE ST / HARRISON ST,-122.404899281944,37.7766207855265 +136153,2013-07-25 09:04:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +136157,2013-07-25 08:45:00,KIDNAPPING,TARAVAL,0 Block of BELLE AV,-122.469858048347,37.7087236355003 +136221,2013-07-25 01:13:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.40856429774,37.7760967348453 +136258,2013-07-24 23:23:00,ARSON,CENTRAL,600 Block of CALIFORNIA ST,-122.405025778458,37.792508340252 +136280,2013-07-24 22:35:00,KIDNAPPING,INGLESIDE,4600 Block of MISSION ST,-122.435161640813,37.7243102435436 +136336,2013-07-24 20:53:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +136341,2013-07-24 20:03:00,KIDNAPPING,CENTRAL,800 Block of GRANT AV,-122.406460320184,37.7947041509893 +136501,2013-07-24 14:14:00,DRUNKENNESS,CENTRAL,200 Block of THE EMBARCADERONORTH ST,-122.396374439116,37.79805325280579 +136623,2013-07-24 08:59:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +136631,2013-07-24 08:25:00,KIDNAPPING,MISSION,1800 Block of MISSION ST,-122.419970859857,37.7674540344176 +136787,2013-07-23 19:41:00,ARSON,BAYVIEW,LASALLE AV / EARL ST,-122.37376866328,37.7280078822916 +136831,2013-07-23 18:05:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +136907,2013-07-23 14:30:00,ARSON,CENTRAL,300 Block of BAY ST,-122.412803753,37.8057739875696 +136924,2013-07-23 13:27:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.408913229808,37.781211650766295 +137053,2013-07-23 06:33:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.407387172098,37.7810688918781 +137060,2013-07-23 06:15:00,DRUNKENNESS,NORTHERN,1300 Block of WEBSTER ST,-122.431046366089,37.7830295716044 +137105,2013-07-23 01:25:00,ARSON,NORTHERN,100 Block of CHURCH ST,-122.429080297019,37.7681979747465 +137130,2013-07-22 23:30:00,KIDNAPPING,MISSION,900 Block of VALENCIA ST,-122.421085159058,37.7572895293911 +137228,2013-07-22 19:35:00,KIDNAPPING,CENTRAL,1300 Block of GRANT AV,-122.407370965267,37.79924012538321 +137260,2013-07-22 18:26:00,DRUNKENNESS,INGLESIDE,5900 Block of MISSION ST,-122.45346119546998,37.7084753872645 +137280,2013-07-22 17:25:00,ARSON,NORTHERN,0 Block of DANIELBURNHAM CT,-122.422540554174,37.78690886580221 +137302,2013-07-22 16:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +137545,2013-07-22 02:00:00,ARSON,TARAVAL,2200 Block of IRVING ST,-122.48195981416,37.763403841317 +137548,2013-07-22 01:30:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +137558,2013-07-22 00:17:00,KIDNAPPING,BAYVIEW,1600 Block of PALOU AV,-122.39192940892,37.7344910991058 +137632,2013-07-14 21:13:00,DRUNKENNESS,MISSION,200 Block of SANCARLOS ST,-122.419837816387,37.7593751579447 +137854,2013-07-14 09:35:00,KIDNAPPING,CENTRAL,200 Block of SUTTER ST,-122.404013943546,37.7897518225049 +137870,2013-07-14 08:50:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +137896,2013-07-14 04:20:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +137911,2013-07-14 02:40:00,ARSON,TENDERLOIN,0 Block of JONES ST,-122.412192555721,37.7816045741252 +137918,2013-07-14 02:03:00,KIDNAPPING,MISSION,1000 Block of TREAT AV,-122.41313563097,37.7533494192093 +137948,2013-07-14 00:38:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +138250,2013-07-13 11:16:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +138271,2013-07-13 10:13:00,DRUNKENNESS,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +138404,2013-07-12 23:20:00,KIDNAPPING,SOUTHERN,MARKET ST / 3RD ST,-122.403434086745,37.78764305018 +138436,2013-07-12 22:15:00,DRUNKENNESS,RICHMOND,5600 Block of GEARY BL,-122.479912728919,37.78018134996579 +138777,2013-07-12 04:04:00,ARSON,MISSION,2800 Block of CESAR CHAVEZ ST,-122.406548471122,37.7487265521144 +138988,2013-07-11 14:50:00,DRUNKENNESS,TENDERLOIN,0 Block of TAYLOR ST,-122.41055128181002,37.78250255901021 +139123,2013-07-11 07:36:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +139211,2013-07-10 20:49:00,DRUNKENNESS,TENDERLOIN,100 Block of POWELL ST,-122.40801449292,37.7859507767613 +139304,2013-07-10 16:15:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +139342,2013-07-10 14:44:00,DRUNKENNESS,SOUTHERN,5TH ST / SHIPLEY ST,-122.402842748428,37.7798294192767 +139389,2013-07-10 12:48:00,DRUNKENNESS,CENTRAL,2000 Block of MASON ST,-122.412810150813,37.80204733378471 +139810,2013-07-09 13:30:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.412320907436,37.7807642254398 +139885,2013-07-09 10:00:00,ARSON,RICHMOND,400 Block of 30TH AV,-122.490093437359,37.7807920840194 +139892,2013-07-09 09:26:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 5TH ST,-122.404934413339,37.7814987213218 +140001,2013-07-08 22:54:00,DRUNKENNESS,MISSION,2800 Block of 16TH ST,-122.415873491231,37.7653356122581 +140004,2013-07-08 22:43:00,DRUNKENNESS,SOUTHERN,0 Block of SUMNER ST,-122.410447258669,37.7763230906676 +140049,2013-07-08 20:46:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +140112,2013-07-08 18:05:00,DRUNKENNESS,CENTRAL,300 Block of POST ST,-122.407612885387,37.7884486019705 +140173,2013-07-08 15:35:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +140363,2013-07-08 02:00:00,DRUNKENNESS,NORTHERN,FILLMORE ST / PIXLEY ST,-122.435775002745,37.7984860019922 +140467,2013-06-30 20:52:00,DRUNKENNESS,PARK,HAIGHT ST / STANYAN ST,-122.45353456066002,37.76916629780521 +140511,2013-06-30 19:30:00,KIDNAPPING,PARK,900 Block of OAK ST,-122.434956691087,37.77349986212271 +140571,2013-06-30 17:41:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410928353347,37.7836778741124 +140622,2013-06-30 16:00:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / HYDE ST,-122.415508242782,37.7816542806076 +140634,2013-06-30 15:45:00,DRUNKENNESS,TARAVAL,300 Block of SLOAT BL,-122.476112101091,37.734780118103 +140648,2013-06-30 15:23:00,DRUNKENNESS,NORTHERN,POLK ST / GROVE ST,-122.418229899721,37.7784895366813 +140822,2013-06-30 02:40:00,KIDNAPPING,TARAVAL,ALEMANY BL / SAGAMORE ST,-122.462542742654,37.7111712111054 +140846,2013-06-30 01:33:00,DRUNKENNESS,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +140860,2013-06-30 01:00:00,KIDNAPPING,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +140873,2013-06-30 00:52:00,ARSON,NORTHERN,1800 Block of BEACH ST,-122.438656503133,37.80421202393 +140898,2013-06-29 23:53:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +140937,2013-06-29 23:00:00,DRUNKENNESS,MISSION,2300 Block of MISSION ST,-122.419058868103,37.7594227506297 +140943,2013-06-29 22:55:00,DRUNKENNESS,SOUTHERN,200 Block of 7TH ST,-122.408550681867,37.7773885566219 +140990,2013-06-29 21:15:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435773846395,37.7624591846215 +141011,2013-06-29 20:37:00,DRUNKENNESS,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291891,37.7827931071006 +141022,2013-06-29 20:08:00,DRUNKENNESS,MISSION,500 Block of CHURCH ST,-122.42846162216,37.76168443008071 +141167,2013-06-29 14:23:00,KIDNAPPING,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +141236,2013-06-29 11:55:00,KIDNAPPING,SOUTHERN,100 Block of STEVENSON ST,-122.401126742997,37.7884921218688 +141269,2013-06-29 09:45:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +141345,2013-06-29 00:58:00,DRUNKENNESS,TARAVAL,500 Block of FONT BL,-122.480527193164,37.7200686016034 +141549,2013-06-28 17:40:00,KIDNAPPING,MISSION,2100 Block of MISSION ST,-122.419331147814,37.76226433574229 +141729,2013-06-28 09:09:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411071423064,37.7817511307229 +141740,2013-06-28 08:25:00,DRUNKENNESS,SOUTHERN,5TH ST / SHIPLEY ST,-122.402842748428,37.7798294192767 +141790,2013-06-28 03:00:00,KIDNAPPING,NORTHERN,ELLIS ST / GOUGH ST,-122.424295891275,37.7833983074976 +141935,2013-06-27 19:45:00,DRUNKENNESS,RICHMOND,3800 Block of GEARY BL,-122.460529994973,37.7810649023765 +142050,2013-06-27 15:00:00,KIDNAPPING,NORTHERN,1100 Block of LARKIN ST,-122.418580508889,37.7881906054546 +142095,2013-06-27 13:29:00,DRUNKENNESS,SOUTHERN,MARY ST / HOWARD ST,-122.405721454567,37.7808789360214 +142226,2013-06-27 01:30:00,KIDNAPPING,BAYVIEW,0 Block of ARDATH CT,-122.382247020863,37.7345025151708 +142241,2013-06-27 00:39:00,DRUNKENNESS,RICHMOND,2700 Block of MCALLISTER ST,-122.457462124422,37.7753049145132 +142365,2013-06-26 18:00:00,RUNAWAY,INGLESIDE,0 Block of PARK ST,-122.424836824804,37.7367285261242 +142512,2013-06-26 10:54:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +142539,2013-06-26 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +142558,2013-06-26 09:32:00,DRUNKENNESS,SOUTHERN,0 Block of MINT ST,-122.407829844146,37.7826402567843 +142576,2013-06-26 08:15:00,KIDNAPPING,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +142625,2013-06-26 01:55:00,DRUNKENNESS,TARAVAL,600 Block of IRVING ST,-122.46471492926202,37.76405203136579 +142635,2013-06-26 01:06:00,ARSON,NORTHERN,1600 Block of FILLMORE ST,-122.433068689791,37.7847514954484 +142729,2013-06-25 20:00:00,KIDNAPPING,MISSION,3100 Block of 16TH ST,-122.423622537404,37.7647573853335 +142761,2013-06-25 18:40:00,KIDNAPPING,INGLESIDE,700 Block of PRAGUE ST,-122.433020893915,37.7112001962243 +142882,2013-06-25 13:17:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +142917,2013-06-25 11:07:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +142963,2013-06-25 07:51:00,DRUNKENNESS,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +142976,2013-06-25 05:16:00,ARSON,NORTHERN,600 Block of VANNESS AV,-122.420433293071,37.781770080046 +143018,2013-06-24 23:30:00,ARSON,TENDERLOIN,400 Block of JONES ST,-122.412758759499,37.7850960963726 +143040,2013-06-24 22:12:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +143361,2013-06-24 03:38:00,DRUNKENNESS,BAYVIEW,900 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +143365,2013-06-24 03:04:00,KIDNAPPING,NORTHERN,500 Block of STEINER ST,-122.432631414378,37.7742247517444 +143368,2013-06-24 02:57:00,KIDNAPPING,MISSION,21ST ST / MISSION ST,-122.418904204517,37.7570361132269 +143432,2013-06-16 21:50:00,KIDNAPPING,TENDERLOIN,600 Block of OFARRELL ST,-122.414850480524,37.78560875883029 +143470,2013-06-16 19:00:00,KIDNAPPING,INGLESIDE,0 Block of CIELITO DR,-122.421899204973,37.7095752019048 +143482,2013-06-16 18:45:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414269361877,37.7842081124308 +143645,2013-06-16 09:42:00,DRUNKENNESS,SOUTHERN,200 Block of SHIPLEY ST,-122.403313163388,37.779377841254 +143669,2013-06-16 07:04:00,DRUNKENNESS,TENDERLOIN,HYDE ST / EDDY ST,-122.415885065788,37.783516056415294 +143711,2013-06-16 02:07:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +143726,2013-06-16 01:30:00,KIDNAPPING,TARAVAL,0 Block of CHUMASERO DR,-122.472875861339,37.713317784448 +143727,2013-06-16 01:30:00,KIDNAPPING,TARAVAL,0 Block of CHUMASERO DR,-122.472875861339,37.713317784448 +143736,2013-06-16 01:15:00,DRUNKENNESS,CENTRAL,0 Block of CAMPTON PL,-122.406092233116,37.7891339284094 +143843,2013-06-15 20:00:00,KIDNAPPING,PARK,1700 Block of MCALLISTER ST,-122.440879521853,37.77753219352179 +143933,2013-06-15 15:00:00,RUNAWAY,CENTRAL,200 Block of GEARY ST,-122.407434989523,37.787515874162295 +144034,2013-06-15 08:37:00,ARSON,INGLESIDE,SAN JOSE AV / SENECA AV,-122.445856281114,37.721628294594495 +144084,2013-06-15 02:25:00,KIDNAPPING,SOUTHERN,0 Block of 2ND ST,-122.401142939794,37.789001152446 +144149,2013-06-14 23:50:00,DRUNKENNESS,TARAVAL,4000 Block of JUDAH ST,-122.505398845381,37.760392815309295 +144156,2013-06-14 23:20:00,DRUNKENNESS,SOUTHERN,100 Block of MINNA ST,-122.399566190584,37.787256096877705 +144196,2013-06-14 21:40:00,DRUNKENNESS,NORTHERN,1800 Block of GREENWICH ST,-122.430117489363,37.7996273227524 +144331,2013-06-14 16:00:00,DRUNKENNESS,PARK,1700 Block of FULTON ST,-122.445652525154,37.7759612670837 +144366,2013-06-14 14:30:00,KIDNAPPING,PARK,GEARY BL / DIVISADERO ST,-122.439480772242,37.7833088100846 +144386,2013-06-14 14:00:00,ARSON,BAYVIEW,24TH ST / ILLINOIS ST,-122.386942103872,37.75416798376661 +144494,2013-06-14 08:43:00,DRUNKENNESS,SOUTHERN,6TH ST / NATOMA ST,-122.407693108529,37.7801630691196 +144616,2013-06-13 21:09:00,DRUNKENNESS,TENDERLOIN,400 Block of TURK ST,-122.416342977622,37.7824465135592 +144810,2013-06-13 12:19:00,DRUNKENNESS,SOUTHERN,MARY ST / HOWARD ST,-122.405721454567,37.7808789360214 +144835,2013-06-13 11:25:00,DRUNKENNESS,SOUTHERN,HOWARD ST / MARY ST,-122.405721454567,37.7808789360214 +144940,2013-06-13 02:00:00,KIDNAPPING,SOUTHERN,0 Block of MISSION ST,-122.392889145798,37.7935385958356 +144995,2013-06-12 22:50:00,DRUNKENNESS,SOUTHERN,500 Block of 5TH ST,-122.39998111123998,37.7776242389287 +145028,2013-06-12 20:45:00,KIDNAPPING,BAYVIEW,100 Block of BACON ST,-122.404081477692,37.7274495137668 +145120,2013-06-12 16:45:00,ARSON,TARAVAL,100 Block of CAINE AV,-122.451871901484,37.71579411137429 +145163,2013-06-12 14:40:00,KIDNAPPING,TARAVAL,2800 Block of SLOAT BL,-122.504756153505,37.7356169338764 +145281,2013-06-12 10:18:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +145358,2013-06-12 04:00:00,KIDNAPPING,RICHMOND,2400 Block of SUTTER ST,-122.440709912722,37.7850854508959 +145370,2013-06-12 02:31:00,RUNAWAY,NORTHERN,2000 Block of VANNESS AV,-122.422968948382,37.7944069848967 +145393,2013-06-12 00:25:00,ARSON,SOUTHERN,1000 Block of BRANNAN ST,-122.407343295373,37.7698568217817 +145691,2013-06-11 12:38:00,DRUNKENNESS,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +145700,2013-06-11 12:25:00,DRUNKENNESS,SOUTHERN,MARY ST / HOWARD ST,-122.405721454567,37.7808789360214 +145759,2013-06-11 09:28:00,DRUNKENNESS,SOUTHERN,6TH ST / CLEMENTINA ST,-122.406166691396,37.7789434105098 +145801,2013-06-11 07:21:00,DRUNKENNESS,SOUTHERN,500 Block of JESSIE ST,-122.409776479312,37.7810558831366 +145987,2013-06-10 17:26:00,DRUNKENNESS,TENDERLOIN,0 Block of SHANNON ST,-122.412175591421,37.7863725295221 +146011,2013-06-10 17:00:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +146013,2013-06-10 16:55:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406412115335,37.780252457697394 +146120,2013-06-10 12:47:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +146150,2013-06-10 11:31:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345148,37.7839916768161 +146202,2013-06-10 08:34:00,DRUNKENNESS,SOUTHERN,MARY ST / HOWARD ST,-122.405721454567,37.7808789360214 +146329,2013-06-02 22:05:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +146332,2013-06-02 22:00:00,DRUNKENNESS,CENTRAL,1300 Block of STOCKTON ST,-122.408646942187,37.7981171266965 +146472,2013-06-02 15:56:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +146481,2013-06-02 15:11:00,DRUNKENNESS,NORTHERN,GREEN ST / BUCHANAN ST,-122.43201771436,37.7965753370172 +146669,2013-06-01 23:38:00,DRUNKENNESS,INGLESIDE,MISSION ST / GENEVA AV,-122.441018108888,37.7164586830811 +146676,2013-06-01 23:28:00,DRUNKENNESS,CENTRAL,700 Block of KEARNY ST,-122.404847847867,37.7951006528052 +146700,2013-06-01 22:18:00,DRUNKENNESS,MISSION,4000 Block of 19TH ST,-122.433196416882,37.7594445682563 +146731,2013-06-01 21:00:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +146793,2013-06-01 18:04:00,DRUNKENNESS,MISSION,22ND ST / MISSION ST,-122.418748733523,37.755437187509706 +146846,2013-06-01 16:00:00,KIDNAPPING,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +147132,2013-06-01 00:30:00,KIDNAPPING,NORTHERN,700 Block of LAGUNA ST,-122.426431627648,37.7776339847429 +147140,2013-06-01 00:15:00,DRUNKENNESS,TENDERLOIN,300 Block of MASON ST,-122.409756223507,37.786912692426704 +147213,2013-05-31 22:49:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +147273,2013-05-31 19:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +147309,2013-05-31 19:00:00,KIDNAPPING,NORTHERN,1000 Block of GEARY ST,-122.420571110949,37.7857331120575 +147330,2013-05-31 17:46:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +147487,2013-05-31 11:23:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411593095704,37.78305295107821 +147498,2013-05-31 10:35:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +147561,2013-05-31 04:10:00,ARSON,BAYVIEW,JAMESTOWN AV / GILROY ST,-122.389440639195,37.715558495062496 +147617,2013-05-31 00:01:00,KIDNAPPING,BAYVIEW,GOETTINGEN ST / BACON ST,-122.406566957339,37.7268581085141 +147680,2013-05-30 20:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +147698,2013-05-30 19:30:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +147700,2013-05-30 19:30:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +147926,2013-05-30 08:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +148191,2013-05-29 14:26:00,DRUNKENNESS,SOUTHERN,5TH ST / NATOMA ST,-122.405467934272,37.781924110513 +148240,2013-05-29 12:00:00,KIDNAPPING,CENTRAL,100 Block of JEFFERSON ST,-122.414988252591,37.8082613305439 +148295,2013-05-29 09:56:00,DRUNKENNESS,SOUTHERN,400 Block of NATOMA ST,-122.407039055082,37.78075651835911 +148371,2013-05-29 00:35:00,DRUNKENNESS,MISSION,1200 Block of CHURCH ST,-122.427247070911,37.7505006388269 +148563,2013-05-28 16:20:00,ARSON,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +148615,2013-05-28 14:36:00,DRUNKENNESS,SOUTHERN,MISSION ST / MINT ST,-122.407258776463,37.7821176524238 +148723,2013-05-28 08:58:00,DRUNKENNESS,SOUTHERN,JESSIE ST / 6TH ST,-122.409247675547,37.7813987340892 +148787,2013-05-28 00:35:00,DRUNKENNESS,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +149127,2013-05-27 00:33:00,KIDNAPPING,INGLESIDE,100 Block of RIPLEY ST,-122.412324243492,37.7442629265303 +149149,2013-05-19 23:09:00,DRUNKENNESS,CENTRAL,400 Block of POWELL ST,-122.408431861057,37.7887772719153 +149217,2013-05-19 20:02:00,DRUNKENNESS,PARK,1200 Block of 3RD AV,-122.459849854174,37.76477167883621 +149219,2013-05-19 20:00:00,KIDNAPPING,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +149227,2013-05-19 19:45:00,KIDNAPPING,BAYVIEW,3800 Block of 3RD ST,-122.387939452192,37.7422600519555 +149230,2013-05-19 19:40:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +149246,2013-05-19 19:01:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +149249,2013-05-19 19:00:00,KIDNAPPING,CENTRAL,BAY ST / TAYLOR ST,-122.415245418291,37.8054165242789 +149310,2013-05-19 16:20:00,KIDNAPPING,NORTHERN,800 Block of OFARRELL ST,-122.418729600557,37.785007503993 +149319,2013-05-19 16:02:00,DRUNKENNESS,MISSION,CESAR CHAVEZ ST / HAMPSHIRE ST,-122.406758995794,37.748767227274605 +149355,2013-05-19 14:58:00,DRUNKENNESS,INGLESIDE,4500 Block of MISSION ST,-122.434155711353,37.7254258506536 +149366,2013-05-19 14:30:00,DRUNKENNESS,PARK,CLAYTON ST / HAIGHT ST,-122.448578484966,37.769797716883104 +149434,2013-05-19 12:28:00,DRUNKENNESS,PARK,FELL ST / CENTRAL AV,-122.444217653151,37.7732099933428 +149471,2013-05-19 10:55:00,DRUNKENNESS,PARK,1300 Block of FELL ST,-122.440126155736,37.77379339658521 +149555,2013-05-19 02:10:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +149564,2013-05-19 01:53:00,DRUNKENNESS,TARAVAL,700 Block of FONT BL,-122.483569270838,37.7230650556781 +149588,2013-05-19 00:42:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +149603,2013-05-19 00:01:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +149649,2013-05-18 21:46:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +150014,2013-05-17 23:23:00,KIDNAPPING,MISSION,GUERRERO ST / 17TH ST,-122.423962124277,37.7631671994684 +150086,2013-05-17 21:00:00,KIDNAPPING,BAYVIEW,3900 Block of 3RD ST,-122.388475895424,37.7415220401097 +150089,2013-05-17 21:00:00,KIDNAPPING,BAYVIEW,3900 Block of 3RD ST,-122.388475895424,37.7415220401097 +150095,2013-05-17 21:00:00,KIDNAPPING,BAYVIEW,3900 Block of 3RD ST,-122.388475895424,37.7415220401097 +150207,2013-05-17 16:55:00,KIDNAPPING,MISSION,300 Block of TREAT AV,-122.413445535807,37.764637017181286 +150414,2013-05-17 04:30:00,DRUNKENNESS,SOUTHERN,200 Block of 2ND ST,-122.396920775993,37.7857918163181 +150459,2013-05-17 00:59:00,ARSON,BAYVIEW,1200 Block of THOMAS AV,-122.384804441062,37.7266675090896 +150487,2013-05-16 23:45:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +150576,2013-05-16 18:37:00,DRUNKENNESS,TARAVAL,800 Block of FONT BL,-122.483569270838,37.7230650556781 +150638,2013-05-16 15:45:00,DRUNKENNESS,BAYVIEW,1600 Block of KIRKWOOD AV,-122.390952930587,37.7386625599684 +150770,2013-05-16 11:40:00,ARSON,TENDERLOIN,400 Block of JONES ST,-122.412857126524,37.7855804361702 +150891,2013-05-16 00:40:00,KIDNAPPING,MISSION,400 Block of CAPP ST,-122.417970955091,37.7594884557036 +151163,2013-05-15 12:23:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +151216,2013-05-15 10:15:00,ARSON,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +151345,2013-05-14 22:18:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +151454,2013-05-14 17:00:00,KIDNAPPING,INGLESIDE,4500 Block of MISSION ST,-122.433743692364,37.7259707375737 +151520,2013-05-14 14:19:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +151579,2013-05-14 10:16:00,DRUNKENNESS,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +151731,2013-05-13 21:00:00,KIDNAPPING,PARK,2100 Block of GEARY BL,-122.43861644522,37.7833516158109 +151812,2013-05-13 16:10:00,DRUNKENNESS,TARAVAL,0 Block of LENOX WY,-122.464741958044,37.7430172936494 +151817,2013-05-13 16:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +151821,2013-05-13 15:33:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +151961,2013-05-13 01:56:00,DRUNKENNESS,MISSION,2500 Block of MISSION ST,-122.418753848152,37.7562250119744 +152017,2013-05-05 22:55:00,ARSON,BAYVIEW,1200 Block of THOMAS AV,-122.38472402721,37.7267568878388 +152041,2013-05-05 21:58:00,KIDNAPPING,TARAVAL,1300 Block of 8TH AV,-122.465109543504,37.7631379674712 +152093,2013-05-05 19:28:00,DRUNKENNESS,MISSION,2300 Block of MISSION ST,-122.419058868103,37.7594227506297 +152095,2013-05-05 19:28:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +152207,2013-05-05 14:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +152293,2013-05-05 11:50:00,KIDNAPPING,INGLESIDE,1700 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +152311,2013-05-05 10:55:00,DRUNKENNESS,NORTHERN,3100 Block of FILLMORE ST,-122.43575101831,37.79872821788229 +152367,2013-05-05 03:55:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +152503,2013-05-04 21:10:00,KIDNAPPING,NORTHERN,600 Block of TURK ST,-122.419842456494,37.7821172596318 +152511,2013-05-04 20:56:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +152537,2013-05-04 19:25:00,DRUNKENNESS,NORTHERN,1900 Block of UNION ST,-122.431831857814,37.7976099463654 +152605,2013-05-04 16:30:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +152753,2013-05-04 03:05:00,DRUNKENNESS,TARAVAL,3600 Block of ORTEGA ST,-122.502602943274,37.7511597552502 +152788,2013-05-04 01:18:00,DRUNKENNESS,RICHMOND,500 Block of 33RD AV,-122.493300380647,37.778709879325 +153187,2013-05-03 02:07:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +153191,2013-05-03 01:37:00,DRUNKENNESS,BAYVIEW,2000 Block of THOMAS AV,-122.398897723272,37.73446961053271 +153229,2013-05-02 23:50:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +153326,2013-05-02 18:45:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +153453,2013-05-02 13:00:00,KIDNAPPING,BAYVIEW,0 Block of POMONA ST,-122.393512077492,37.7317446899121 +153463,2013-05-02 13:00:00,KIDNAPPING,BAYVIEW,0 Block of POMONA ST,-122.393512077492,37.7317446899121 +153520,2013-05-02 09:34:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +153538,2013-05-02 08:55:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +153547,2013-05-02 08:26:00,DRUNKENNESS,SOUTHERN,5TH ST / HOWARD ST,-122.404934413339,37.7814987213218 +153558,2013-05-02 07:30:00,KIDNAPPING,TENDERLOIN,300 Block of EDDY ST,-122.413790972781,37.7838365565348 +153625,2013-05-02 00:18:00,ARSON,CENTRAL,0 Block of CAMPTON PL,-122.406092233116,37.7891339284094 +153638,2013-05-01 23:47:00,DRUNKENNESS,RICHMOND,6TH AV / CLEMENT ST,-122.464425476951,37.7829397704938 +153646,2013-05-01 23:21:00,DRUNKENNESS,NORTHERN,FILLMORE ST / GREEN ST,-122.435302322073,37.796156136246296 +153690,2013-05-01 20:02:00,KIDNAPPING,MISSION,0 Block of HOFF ST,-122.420575720933,37.7641819463712 +153734,2013-05-01 18:00:00,DRUNKENNESS,MISSION,3000 Block of 20TH ST,-122.411182350223,37.7591632978171 +153785,2013-05-01 15:54:00,DRUNKENNESS,SOUTHERN,200 Block of 6TH ST,-122.406830073947,37.77955378317321 +153848,2013-05-01 13:00:00,KIDNAPPING,RICHMOND,400 Block of ARGUELLO BL,-122.458857560736,37.78220007231379 +153900,2013-05-01 10:50:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / COLUMBIASQUARE ST,-122.406439890677,37.7778567118034 +153929,2013-05-01 09:15:00,ARSON,TARAVAL,2200 Block of 14TH AV,-122.470359608661,37.7460753397163 +154035,2013-05-01 01:30:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +154230,2013-04-30 17:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +154248,2013-04-30 16:39:00,DRUNKENNESS,CENTRAL,1600 Block of STOCKTON ST,-122.409212768605,37.8009250806392 +154288,2013-04-30 14:59:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +154308,2013-04-30 14:00:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +154319,2013-04-30 13:40:00,DRUNKENNESS,TARAVAL,9TH AV / IRVING ST,-122.466309668238,37.7640368477306 +154394,2013-04-30 11:00:00,DRUNKENNESS,TENDERLOIN,300 Block of HYDE ST,-122.415910622743,37.7839999167561 +154397,2013-04-30 11:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +154637,2013-04-29 17:25:00,DRUNKENNESS,CENTRAL,100 Block of CLAY ST,-122.397395668672,37.7954422931634 +154659,2013-04-29 16:12:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +154769,2013-04-29 11:13:00,DRUNKENNESS,SOUTHERN,5THSTNORTH ST / MARKET ST,-122.408068345148,37.7839916768161 +154887,2013-04-29 00:06:00,DRUNKENNESS,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +154926,2013-04-21 22:40:00,ARSON,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +154933,2013-04-21 22:00:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +154988,2013-04-21 19:00:00,KIDNAPPING,BAYVIEW,CARROLL AV / INGALLS ST,-122.389622643943,37.722854152198 +154994,2013-04-21 19:00:00,KIDNAPPING,BAYVIEW,CARROLL AV / INGALLS ST,-122.389622643943,37.722854152198 +155102,2013-04-21 14:18:00,KIDNAPPING,BAYVIEW,800 Block of INNES AV,-122.374882420332,37.731431829647 +155704,2013-04-20 02:41:00,KIDNAPPING,CENTRAL,800 Block of GEARY ST,-122.417273344939,37.7861493947594 +155716,2013-04-20 02:03:00,DRUNKENNESS,TARAVAL,100 Block of CAMBON DR,-122.474170989826,37.7166569724342 +155821,2013-04-19 22:15:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +155941,2013-04-19 18:00:00,DRUNKENNESS,PARK,100 Block of LYON ST,-122.442353059832,37.772037861030505 +155951,2013-04-19 17:58:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617192,37.778124778322 +156278,2013-04-18 20:39:00,DRUNKENNESS,PARK,0 Block of BEULAH ST,-122.450921866698,37.7676456022387 +156391,2013-04-18 16:10:00,DRUNKENNESS,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +156490,2013-04-18 11:34:00,DRUNKENNESS,SOUTHERN,1000 Block of MISSION ST,-122.409795194505,37.7800356268394 +156498,2013-04-18 11:00:00,DRUNKENNESS,SOUTHERN,0 Block of MINT ST,-122.407829844146,37.7826402567843 +156599,2013-04-18 01:33:00,DRUNKENNESS,INGLESIDE,300 Block of WILDE AV,-122.403694587646,37.7168087091051 +156609,2013-04-18 00:57:00,DRUNKENNESS,MISSION,3200 Block of 16TH ST,-122.424368416112,37.7648224781504 +156640,2013-04-17 23:04:00,DRUNKENNESS,MISSION,200 Block of CHURCH ST,-122.428813616546,37.7668081482188 +156672,2013-04-17 21:52:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +156848,2013-04-17 14:00:00,KIDNAPPING,SOUTHERN,0 Block of VERONA PL,-122.448307079193,37.73565063989479 +157044,2013-04-17 00:01:00,KIDNAPPING,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +157108,2013-04-16 21:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +157281,2013-04-16 13:11:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / JONES ST,-122.412784096502,37.78486569395261 +157491,2013-04-15 21:15:00,DRUNKENNESS,BAYVIEW,1500 Block of LASALLE AV,-122.387860308012,37.736162689487706 +157571,2013-04-15 17:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +157632,2013-04-15 15:01:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +157722,2013-04-15 12:00:00,KIDNAPPING,PARK,1800 Block of EDDY ST,-122.438098378037,37.7806388583762 +157747,2013-04-15 10:25:00,RUNAWAY,BAYVIEW,400 Block of MANSELL ST,-122.406079770608,37.72041061847521 +157849,2013-04-15 00:55:00,KIDNAPPING,TARAVAL,300 Block of ORIZABA AV,-122.462674073198,37.71459536479271 +157858,2013-04-15 00:06:00,KIDNAPPING,MISSION,3400 Block of 18TH ST,-122.421200855641,37.7617789684305 +158278,2013-04-06 23:30:00,DRUNKENNESS,RICHMOND,300 Block of CLEMENT ST,-122.462820934738,37.7829584656072 +158507,2013-04-06 14:00:00,RUNAWAY,MISSION,1000 Block of SHOTWELL ST,-122.415022828589,37.7516272270745 +158629,2013-04-06 07:20:00,ARSON,NORTHERN,LARKIN ST / MYRTLE ST,-122.417999278691,37.7856407526644 +158637,2013-04-06 06:00:00,KIDNAPPING,NORTHERN,700 Block of ELLIS ST,-122.418562097105,37.78418470913029 +158716,2013-04-06 00:10:00,DRUNKENNESS,NORTHERN,VANNESS AV / CLAY ST,-122.422695629365,37.7921733284528 +158832,2013-04-05 20:07:00,DRUNKENNESS,MISSION,900 Block of FLORIDA ST,-122.410379498133,37.756729101756896 +158848,2013-04-05 20:00:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +158874,2013-04-05 19:08:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +158981,2013-04-05 14:55:00,DRUNKENNESS,SOUTHERN,400 Block of 7TH ST,-122.405118197249,37.7746534767072 +158995,2013-04-05 14:00:00,DRUNKENNESS,TARAVAL,1900 Block of IRVING ST,-122.478742819999,37.7635454765989 +159016,2013-04-05 12:40:00,KIDNAPPING,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +159019,2013-04-05 12:40:00,KIDNAPPING,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +159158,2013-04-05 03:40:00,KIDNAPPING,NORTHERN,POLK ST / AUSTIN ST,-122.420402463683,37.7891643767731 +159167,2013-04-05 02:56:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +159428,2013-04-04 15:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +159514,2013-04-04 09:10:00,ARSON,TENDERLOIN,600 Block of ELLIS ST,-122.416916142188,37.78439444920679 +159532,2013-04-04 07:00:00,KIDNAPPING,PARK,1100 Block of OAK ST,-122.438282677734,37.773079947774896 +159691,2013-04-03 17:34:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +159692,2013-04-03 17:34:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +159894,2013-04-03 01:34:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 42ND AV,-122.500331146184,37.7419582977637 +160041,2013-04-02 15:30:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +160073,2013-04-02 14:00:00,KIDNAPPING,NORTHERN,800 Block of TURK ST,-122.423105855786,37.7815834072995 +160130,2013-04-02 11:38:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +160194,2013-04-02 07:30:00,RUNAWAY,BAYVIEW,1200 Block of THOMAS AV,-122.38472402721,37.7267568878388 +160209,2013-04-02 05:51:00,ARSON,INGLESIDE,1000 Block of MANSELL ST,-122.410308134525,37.7189479999326 +160274,2013-04-01 23:59:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421550176461,37.7621307247611 +160390,2013-04-01 17:21:00,DRUNKENNESS,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +160540,2013-04-01 11:30:00,RUNAWAY,TARAVAL,2500 Block of 25TH AV,-122.481853774286,37.7399560599886 +160623,2013-04-01 07:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +160650,2013-04-01 04:30:00,KIDNAPPING,NORTHERN,700 Block of LAGUNA ST,-122.426431627648,37.7776339847429 +160769,2013-03-24 21:00:00,DRUNKENNESS,NORTHERN,1200 Block of POLK ST,-122.420326993863,37.7884521578132 +160787,2013-03-24 20:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +160789,2013-03-24 20:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +160860,2013-03-24 17:45:00,DRUNKENNESS,NORTHERN,POLK ST / TURK ST,-122.418996371999,37.7821689138292 +161008,2013-03-24 10:43:00,DRUNKENNESS,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +161023,2013-03-24 09:45:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +161049,2013-03-24 08:00:00,ARSON,TARAVAL,1700 Block of 27TH AV,-122.485178290099,37.7547753194976 +161149,2013-03-23 23:38:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421550176461,37.7621307247611 +161194,2013-03-23 21:35:00,DRUNKENNESS,SOUTHERN,GOLDEN GATE AV / TAYLOR ST,-122.41029351969,37.7822305870036 +161259,2013-03-23 19:10:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414269361877,37.7842081124308 +161358,2013-03-23 15:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +161421,2013-03-23 12:12:00,KIDNAPPING,SOUTHERN,500 Block of MINNA ST,-122.40877066526,37.7801357011746 +161443,2013-03-23 11:41:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +161551,2013-03-23 02:00:00,KIDNAPPING,MISSION,RONDEL PL / 16TH ST,-122.421240281394,37.76495589279121 +161552,2013-03-23 02:00:00,KIDNAPPING,CENTRAL,600 Block of POWELL ST,-122.409016349321,37.790942136582 +161603,2013-03-22 23:34:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406861140307,37.7978967044381 +161738,2013-03-22 18:24:00,DRUNKENNESS,MISSION,100 Block of 13TH ST,-122.416709701266,37.769594417868 +161777,2013-03-22 16:40:00,DRUNKENNESS,MISSION,3200 Block of 22ND ST,-122.419297189961,37.7553465863701 +162010,2013-03-22 03:05:00,ARSON,PARK,1400 Block of 6TH AV,-122.462974789143,37.7613630987066 +162071,2013-03-21 22:59:00,DRUNKENNESS,SOUTHERN,900 Block of MISSION ST,-122.406819073383,37.7823859229171 +162099,2013-03-21 21:45:00,KIDNAPPING,INGLESIDE,100 Block of SANJUAN AV,-122.437456745833,37.725048366581895 +162181,2013-03-21 18:00:00,KIDNAPPING,MISSION,3200 Block of 21ST ST,-122.41932208977,37.7570651494219 +162523,2013-03-20 23:40:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +162668,2013-03-20 17:14:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +162710,2013-03-20 15:35:00,DRUNKENNESS,RICHMOND,700 Block of 7TH AV,-122.464944716156,37.774384171507 +162716,2013-03-20 15:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +162719,2013-03-20 15:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +162896,2013-03-20 03:00:00,KIDNAPPING,TARAVAL,43RD AV / JUDAH ST,-122.502710973749,37.7605643626003 +162909,2013-03-20 01:00:00,ARSON,MISSION,17TH ST / MISSION ST,-122.419515708406,37.7634292328496 +162987,2013-03-19 20:26:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.419520367886,37.764228935718 +163046,2013-03-19 19:00:00,KIDNAPPING,TENDERLOIN,JONES ST / TURK ST,-122.412414263581,37.7830037964534 +163127,2013-03-19 15:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +163134,2013-03-19 14:50:00,KIDNAPPING,SOUTHERN,0 Block of SHERIDAN ST,-122.411343205591,37.772587665974896 +163274,2013-03-19 07:30:00,RUNAWAY,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +163308,2013-03-19 02:32:00,DRUNKENNESS,SOUTHERN,MISSION ST / 5TH ST,-122.406481972743,37.782731788488704 +163320,2013-03-19 00:55:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413189430011,37.77127369135761 +163327,2013-03-19 00:35:00,DRUNKENNESS,SOUTHERN,200 Block of MARKET ST,-122.397034190089,37.7928236509312 +163399,2013-03-18 20:00:00,KIDNAPPING,RICHMOND,700 Block of GREAT HY,-122.511079116635,37.7739918429694 +163446,2013-03-18 18:00:00,RUNAWAY,BAYVIEW,2300 Block of SAN BRUNO AV,-122.406417416535,37.733714974663 +163473,2013-03-18 17:00:00,KIDNAPPING,MISSION,500 Block of POTRERO AV,-122.40710239862,37.762557938669794 +163596,2013-03-18 12:00:00,KIDNAPPING,SOUTHERN,JULIA ST / MINNA ST,-122.411874120577,37.77761762810261 +163688,2013-03-18 02:04:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +163701,2013-03-18 01:00:00,KIDNAPPING,CENTRAL,700 Block of STOCKTON ST,-122.407500737639,37.7925035706535 +163994,2013-03-10 06:53:00,DRUNKENNESS,INGLESIDE,100 Block of NEWMAN ST,-122.417277279164,37.7376808535315 +164000,2013-03-10 05:15:00,ARSON,NORTHERN,100 Block of ROSE ST,-122.42302997814,37.7735839956115 +164066,2013-03-09 23:45:00,DRUNKENNESS,INGLESIDE,MISSION ST / EUGENIA AV,-122.421970919029,37.74237522452549 +164069,2013-03-09 23:42:00,DRUNKENNESS,MISSION,3300 Block of 17TH ST,-122.42109970654,37.7632815650321 +164103,2013-03-09 21:45:00,ARSON,INGLESIDE,LYELL ST / BOSWORTH ST,-122.431955738461,37.732993205473 +164155,2013-03-09 18:35:00,DRUNKENNESS,MISSION,18TH ST / NOE ST,-122.432795347224,37.761020169708296 +164388,2013-03-09 05:00:00,KIDNAPPING,MISSION,TREAT AV / 16TH ST,-122.413107622693,37.7654480180266 +164398,2013-03-09 03:09:00,ARSON,TARAVAL,2600 Block of 37TH AV,-122.494723494119,37.7375179574235 +164399,2013-03-09 03:06:00,DRUNKENNESS,TARAVAL,700 Block of FONT BL,-122.483569270838,37.7230650556781 +164407,2013-03-09 02:46:00,DRUNKENNESS,NORTHERN,1500 Block of FILLMORE ST,-122.432743822617,37.7838424505847 +164408,2013-03-09 02:30:00,KIDNAPPING,MISSION,0 Block of LUCKY ST,-122.413509818711,37.7517329980946 +164511,2013-03-08 21:32:00,DRUNKENNESS,MISSION,2800 Block of HARRISON ST,-122.411890526714,37.75181175925661 +164671,2013-03-08 16:30:00,DRUNKENNESS,INGLESIDE,100 Block of COLERIDGE ST,-122.419200129034,37.7446306934522 +164891,2013-03-08 03:06:00,DRUNKENNESS,NORTHERN,VANNESS AV / CALIFORNIA ST,-122.422330464198,37.790369068882 +164906,2013-03-08 02:00:00,KIDNAPPING,CENTRAL,200 Block of BEACH ST,-122.413178958845,37.8076387530515 +164912,2013-03-08 00:50:00,DRUNKENNESS,RICHMOND,200 Block of 4TH AV,-122.462415303344,37.783951474920286 +164934,2013-03-07 23:40:00,KIDNAPPING,BAYVIEW,2100 Block of 23RD ST,-122.401111536834,37.7545443114144 +165077,2013-03-07 16:36:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +165080,2013-03-07 16:36:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +165293,2013-03-07 03:18:00,DRUNKENNESS,SOUTHERN,600 Block of MINNA ST,-122.412315780647,37.777343040466 +165326,2013-03-07 00:01:00,ARSON,TARAVAL,1500 Block of 26TH AV,-122.484367644079,37.75854795337969 +165416,2013-03-06 20:00:00,RUNAWAY,INGLESIDE,2100 Block of CAYUGA AV,-122.454269264868,37.7104830193095 +165689,2013-03-06 03:47:00,KIDNAPPING,BAYVIEW,1500 Block of WALLACE AV,-122.390150409785,37.72700062241029 +165690,2013-03-06 03:47:00,KIDNAPPING,BAYVIEW,1500 Block of WALLACE AV,-122.390150409785,37.72700062241029 +165696,2013-03-06 03:04:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +165787,2013-03-05 20:15:00,KIDNAPPING,TENDERLOIN,0 Block of ELLIS ST,-122.406852525575,37.7856720367472 +165794,2013-03-05 20:03:00,DRUNKENNESS,TARAVAL,800 Block of IRVING ST,-122.466861035773,37.764067832215794 +165806,2013-03-05 19:40:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +165831,2013-03-05 18:30:00,RUNAWAY,SOUTHERN,1100 Block of HOWARD ST,-122.411359138357,37.7764944808779 +165942,2013-03-05 13:25:00,DRUNKENNESS,SOUTHERN,0 Block of THE EMBARCADEROSOUTH ST,-122.388379873919,37.783310406701496 +166026,2013-03-05 08:30:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +166103,2013-03-05 02:10:00,DRUNKENNESS,CENTRAL,1500 Block of CLAY ST,-122.419000308188,37.792700185160896 +166178,2013-03-04 21:51:00,DRUNKENNESS,NORTHERN,JACKSON ST / VANNESS AV,-122.423049294192,37.7939338236045 +166195,2013-03-04 20:58:00,ARSON,TENDERLOIN,ELLIS ST / JONES ST,-122.412784096502,37.78486569395261 +166196,2013-03-04 20:58:00,ARSON,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +166206,2013-03-04 20:21:00,ARSON,TENDERLOIN,ELLIS ST / JONES ST,-122.412784096502,37.78486569395261 +166217,2013-03-04 19:36:00,ARSON,TENDERLOIN,300 Block of EDDY ST,-122.413790972781,37.7838365565348 +166218,2013-03-04 19:33:00,ARSON,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +166394,2013-03-04 12:09:00,ARSON,MISSION,2600 Block of MISSION ST,-122.418738265772,37.7546172382083 +166488,2013-03-04 07:45:00,KIDNAPPING,SOUTHERN,100 Block of VALENCIA ST,-122.422375026857,37.7707188965808 +166495,2013-03-04 06:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +166534,2013-03-04 01:05:00,DRUNKENNESS,INGLESIDE,4800 Block of MISSION ST,-122.437216421378,37.7213272618826 +166582,2013-02-24 22:25:00,KIDNAPPING,RICHMOND,600 Block of 22ND AV,-122.481109480209,37.7755013000664 +166671,2013-02-24 17:23:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +166676,2013-02-24 17:20:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418360181974,37.783149897821104 +166734,2013-02-24 15:00:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +166780,2013-02-24 12:15:00,DRUNKENNESS,PARK,CASTRO ST / MARKET ST,-122.435187699349,37.7626702770872 +166857,2013-02-24 05:00:00,ARSON,BAYVIEW,QUINT ST / JERROLD AV,-122.393118683606,37.7409029737082 +166871,2013-02-24 03:00:00,KIDNAPPING,NORTHERN,POST ST / POLK ST,-122.419930111611,37.7868262082156 +166920,2013-02-24 00:25:00,DRUNKENNESS,MISSION,3900 Block of 18TH ST,-122.431710082584,37.76114188133271 +166936,2013-02-23 23:40:00,DRUNKENNESS,NORTHERN,POLK ST / CLAY ST,-122.421056878203,37.7923840813812 +166963,2013-02-23 22:43:00,DRUNKENNESS,TARAVAL,HOLLOWAY AV / LEE AV,-122.454106542409,37.721851576758 +166973,2013-02-23 22:15:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +167060,2013-02-23 18:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +167073,2013-02-23 18:00:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.409282266623,37.7756858832791 +167114,2013-02-23 16:37:00,ARSON,TARAVAL,0 Block of DELONG ST,-122.45989642253,37.70971585659071 +167115,2013-02-23 16:37:00,ARSON,TARAVAL,0 Block of DELONG ST,-122.45989642253,37.70971585659071 +167175,2013-02-23 13:28:00,ARSON,TARAVAL,3200 Block of 20TH AV,-122.475647460786,37.7285280627465 +167277,2013-02-23 03:40:00,ARSON,CENTRAL,0 Block of MAIDEN LN,-122.40435958711,37.7882726542513 +167377,2013-02-22 22:50:00,ARSON,INGLESIDE,500 Block of CORTLAND AV,-122.416211933886,37.7389766851898 +167784,2013-02-22 01:00:00,DRUNKENNESS,SOUTHERN,900 Block of FOLSOM ST,-122.40509433812,37.7789940710712 +167835,2013-02-21 22:27:00,DRUNKENNESS,SOUTHERN,1200 Block of HOWARD ST,-122.412447373124,37.775633673443 +168065,2013-02-21 13:11:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +168188,2013-02-21 02:09:00,DRUNKENNESS,TENDERLOIN,OFARRELL ST / POWELL ST,-122.408040474858,37.7864094033618 +168199,2013-02-21 00:40:00,ARSON,SOUTHERN,0 Block of 9TH ST,-122.414953043045,37.7765019124574 +168215,2013-02-21 00:01:00,KIDNAPPING,BAYVIEW,0 Block of WHITFIELD CT,-122.381757562453,37.7310148735637 +168236,2013-02-20 22:25:00,KIDNAPPING,BAYVIEW,1300 Block of QUESADA AV,-122.384900862378,37.729694047172 +168297,2013-02-20 19:20:00,KIDNAPPING,MISSION,20TH ST / CAPP ST,-122.41796448376002,37.7586968166489 +168624,2013-02-19 22:57:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +168646,2013-02-19 22:00:00,ARSON,BAYVIEW,1300 Block of QUESADA AV,-122.384900862378,37.729694047172 +169179,2013-02-18 15:40:00,KIDNAPPING,NORTHERN,BUCHANAN ST / TURK ST,-122.428855383483,37.780914754285895 +169181,2013-02-18 15:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +169336,2013-02-18 09:00:00,KIDNAPPING,BAYVIEW,1900 Block of 25TH ST,-122.397497373637,37.75230663222629 +169479,2013-02-10 21:00:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410928353347,37.7836778741124 +169528,2013-02-10 19:05:00,KIDNAPPING,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +169547,2013-02-10 18:18:00,DRUNKENNESS,PARK,FULTON ST / MASONIC AV,-122.446472679005,37.7758015943912 +169604,2013-02-10 15:57:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +169637,2013-02-10 14:00:00,KIDNAPPING,INGLESIDE,MISSION ST / 29TH ST,-122.420896598735,37.7440381549154 +169644,2013-02-10 14:00:00,KIDNAPPING,INGLESIDE,MISSION ST / 29TH ST,-122.420896598735,37.7440381549154 +169758,2013-02-10 03:46:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +169760,2013-02-10 03:05:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +169799,2013-02-10 01:11:00,DRUNKENNESS,SOUTHERN,MARKET ST / 7TH ST,-122.41251534135598,37.78047774805079 +169869,2013-02-09 22:18:00,DRUNKENNESS,MISSION,1000 Block of SOUTH VAN NESS AV,-122.416572667483,37.7563562905072 +170134,2013-02-09 08:28:00,ARSON,CENTRAL,1000 Block of SUTTER ST,-122.417672923626,37.7881242734432 +170159,2013-02-09 06:40:00,DRUNKENNESS,MISSION,400 Block of GUERRERO ST,-122.424146866925,37.763953010283 +170259,2013-02-08 23:10:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +170312,2013-02-08 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +170390,2013-02-08 17:44:00,ARSON,MISSION,1000 Block of DOUGLASS ST,-122.438274166152,37.7482361406763 +170446,2013-02-08 15:15:00,RUNAWAY,INGLESIDE,0 Block of DELANO AV,-122.440045871066,37.7270306071318 +170456,2013-02-08 15:00:00,KIDNAPPING,BAYVIEW,5400 Block of 3RD ST,-122.392931662742,37.7280754569094 +170462,2013-02-08 15:00:00,KIDNAPPING,BAYVIEW,5400 Block of 3RD ST,-122.392931662742,37.7280754569094 +170516,2013-02-08 12:10:00,KIDNAPPING,RICHMOND,3200 Block of FULTON ST,-122.466431521519,37.7734290464792 +170564,2013-02-08 10:19:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +170667,2013-02-08 00:47:00,DRUNKENNESS,RICHMOND,4600 Block of GEARY BL,-122.469114632847,37.7809207816412 +170715,2013-02-07 21:39:00,ARSON,BAYVIEW,200 Block of BRIDGEVIEW DR,-122.397590096788,37.7342093398821 +170819,2013-02-07 17:00:00,KIDNAPPING,INGLESIDE,900 Block of HURON AV,-122.452541421279,37.70964971489421 +170905,2013-02-07 12:00:00,KIDNAPPING,CENTRAL,1200 Block of CLAY ST,-122.413654405257,37.7932715347608 +171410,2013-02-06 01:58:00,DRUNKENNESS,NORTHERN,700 Block of EDDY ST,-122.420025955939,37.7830500140737 +171463,2013-02-05 22:43:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +171478,2013-02-05 21:35:00,DRUNKENNESS,CENTRAL,400 Block of POST ST,-122.409256096494,37.788239899778 +171557,2013-02-05 18:00:00,KIDNAPPING,RICHMOND,700 Block of 37TH AV,-122.497318509404,37.7747609872428 +171569,2013-02-05 17:30:00,RUNAWAY,PARK,400 Block of STANYAN ST,-122.454403066889,37.773817829478105 +171648,2013-02-05 14:00:00,ARSON,BAYVIEW,600 Block of DEHARO ST,-122.401191922623,37.7616428225519 +171812,2013-02-05 03:00:00,KIDNAPPING,MISSION,2700 Block of MARKET ST,-122.438875927055,37.7614966992762 +171874,2013-02-04 23:10:00,ARSON,INGLESIDE,0 Block of JUNIOR TR,-122.440654113872,37.7195368737652 +171894,2013-02-04 21:30:00,RUNAWAY,TARAVAL,100 Block of WAWONA ST,-122.467244523327,37.7405957499546 +171904,2013-02-04 20:56:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +171923,2013-02-04 19:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +171930,2013-02-04 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +171941,2013-02-04 18:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +171949,2013-02-04 18:08:00,DRUNKENNESS,PARK,2500 Block of 15TH ST,-122.437848713459,37.766031150913705 +171981,2013-02-04 16:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +171998,2013-02-04 15:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +172013,2013-02-04 14:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +172019,2013-02-04 14:15:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +172108,2013-02-04 10:29:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.4138307659,37.7525754079659 +172215,2013-02-04 01:13:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423637302048,37.7648666651043 +172507,2013-01-27 09:54:00,ARSON,NORTHERN,900 Block of OFARRELL ST,-122.42037536821998,37.7848006211991 +172554,2013-01-27 04:35:00,DRUNKENNESS,MISSION,SOUTH VAN NESS AV / 19TH ST,-122.417028392106,37.7603656931573 +172567,2013-01-27 02:53:00,DRUNKENNESS,TARAVAL,19TH AV / HOLLOWAY AV,-122.475222189932,37.7210571460375 +172837,2013-01-26 15:37:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +172987,2013-01-26 07:45:00,ARSON,NORTHERN,900 Block of OFARRELL ST,-122.42037536821998,37.7848006211991 +172999,2013-01-26 06:43:00,ARSON,BAYVIEW,0 Block of ARKANSAS ST,-122.398833182161,37.7656573854206 +173028,2013-01-26 02:56:00,DRUNKENNESS,SOUTHERN,0 Block of STILLMAN ST,-122.395237696668,37.7825710705311 +173039,2013-01-26 02:05:00,ARSON,NORTHERN,FELL ST / OCTAVIA ST,-122.424436633246,37.7757403536826 +173157,2013-01-25 21:45:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +173159,2013-01-25 21:45:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +173292,2013-01-25 17:52:00,DRUNKENNESS,TENDERLOIN,FULTON ST / HYDE ST,-122.415127837608,37.7797870676495 +173451,2013-01-25 11:12:00,KIDNAPPING,TARAVAL,2100 Block of 24TH AV,-122.481305019184,37.747461318190496 +173489,2013-01-25 09:26:00,DRUNKENNESS,SOUTHERN,5THSTNORTH ST / MARKET ST,-122.408068345148,37.7839916768161 +173909,2013-01-24 10:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +173910,2013-01-24 10:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +173984,2013-01-24 07:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +174162,2013-01-23 18:00:00,KIDNAPPING,NORTHERN,1500 Block of FRANKLIN ST,-122.423572929852,37.788521470325705 +174282,2013-01-23 13:07:00,RUNAWAY,MISSION,2500 Block of 24TH ST,-122.404851256515,37.7530372984263 +174436,2013-01-23 05:00:00,ARSON,PARK,1400 Block of 6TH AV,-122.462974789143,37.7613630987066 +174512,2013-01-22 22:00:00,ARSON,INGLESIDE,3100 Block of MISSION ST,-122.419650193312,37.74583865848409 +174516,2013-01-22 22:00:00,ARSON,INGLESIDE,3100 Block of MISSION ST,-122.419650193312,37.74583865848409 +174517,2013-01-22 21:58:00,DRUNKENNESS,TARAVAL,LA PLAYA ST / LINCOLN WY,-122.509399613079,37.764029830097 +174768,2013-01-22 09:18:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +174834,2013-01-22 02:00:00,KIDNAPPING,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +175031,2013-01-21 15:00:00,RUNAWAY,PARK,1800 Block of GROVE ST,-122.447107026839,37.7748215107321 +175085,2013-01-21 12:17:00,DRUNKENNESS,BAYVIEW,1000 Block of GILMAN AV,-122.389056277059,37.71882202740071 +175091,2013-01-21 12:00:00,ARSON,INGLESIDE,RICHLAND AV / MISSION ST,-122.42446746767,37.7360604757326 +175171,2013-01-21 02:00:00,ARSON,INGLESIDE,100 Block of BANKS ST,-122.412704829011,37.74084124443901 +175205,2013-01-21 00:01:00,KIDNAPPING,NORTHERN,1700 Block of PACIFIC AV,-122.424054298376,37.7946560840208 +175228,2013-01-13 22:55:00,ARSON,NORTHERN,2000 Block of POLK ST,-122.421608893207,37.7955038710773 +175271,2013-01-13 20:00:00,KIDNAPPING,MISSION,FOLSOM ST / 20TH ST,-122.414693065257,37.758895594757206 +175304,2013-01-13 19:00:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +175307,2013-01-13 18:45:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +175580,2013-01-12 22:32:00,DRUNKENNESS,BAYVIEW,1600 Block of 17TH ST,-122.400162362987,37.7649810093866 +175630,2013-01-12 20:38:00,DRUNKENNESS,PARK,600 Block of STANYAN ST,-122.453563238036,37.7696403896003 +175633,2013-01-12 20:14:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +175665,2013-01-12 19:20:00,DRUNKENNESS,MISSION,FOLSOM ST / 15TH ST,-122.415464372874,37.7669370292874 +175678,2013-01-12 18:45:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +175680,2013-01-12 18:43:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +175697,2013-01-12 18:15:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +175716,2013-01-12 17:35:00,KIDNAPPING,MISSION,0 Block of BROSNAN ST,-122.423356925403,37.7686357546846 +175881,2013-01-12 05:00:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +175901,2013-01-12 02:23:00,DRUNKENNESS,CENTRAL,KEARNY ST / BUSH ST,-122.404033177237,37.7907593489246 +175904,2013-01-12 02:21:00,DRUNKENNESS,TARAVAL,100 Block of FONT BL,-122.473644075533,37.7155536666978 +175973,2013-01-11 23:02:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +176146,2013-01-11 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +176299,2013-01-11 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +176326,2013-01-11 02:35:00,ARSON,NORTHERN,CHURCH ST / HERMANN ST,-122.429224670397,37.770349545865 +176375,2013-01-10 22:14:00,ARSON,BAYVIEW,1400 Block of HUDSON AV,-122.385215479529,37.7382444962471 +176397,2013-01-10 21:17:00,DRUNKENNESS,TENDERLOIN,HYDE ST / OFARRELL ST,-122.416261836834,37.78537508463761 +176481,2013-01-10 18:30:00,ARSON,BAYVIEW,1500 Block of REVERE AV,-122.389286347131,37.7310998921861 +176639,2013-01-10 13:00:00,KIDNAPPING,TARAVAL,300 Block of SERRANO DR,-122.480450749459,37.7190118676786 +176716,2013-01-10 07:55:00,ARSON,INGLESIDE,500 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +176856,2013-01-09 19:00:00,KIDNAPPING,INGLESIDE,2300 Block of DIAMOND ST,-122.436478703236,37.738041087193295 +177046,2013-01-09 12:20:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +177154,2013-01-09 05:25:00,ARSON,NORTHERN,600 Block of POLK ST,-122.419020964349,37.782652976077 +177187,2013-01-09 00:20:00,KIDNAPPING,MISSION,18TH ST / COLLINGWOOD ST,-122.436115302042,37.7608228396674 +177222,2013-01-08 23:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +177372,2013-01-08 15:38:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +177390,2013-01-08 15:00:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410928353347,37.7836778741124 +177426,2013-01-08 11:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +177440,2013-01-08 10:40:00,ARSON,MISSION,18TH ST / SOUTH VAN NESS AV,-122.417180448635,37.76196742181021 +177468,2013-01-08 08:53:00,ARSON,MISSION,1100 Block of SOUTH VAN NESS AV,-122.416557578218,37.75474851103979 +177589,2013-01-07 22:00:00,KIDNAPPING,CENTRAL,600 Block of STOCKTON ST,-122.407354509443,37.7917926375029 +177663,2013-01-07 18:45:00,DRUNKENNESS,PARK,HAIGHT ST / BUENAVISTAWEST AV,-122.443311949602,37.7704697548539 +177946,2013-01-07 00:30:00,KIDNAPPING,RICHMOND,400 Block of 39TH AV,-122.499730086785,37.780350026839706 +177968,2012-12-30 22:46:00,ARSON,INGLESIDE,0 Block of CHENERY ST,-122.425624488895,37.7409495166569 +178122,2012-12-30 16:05:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +178133,2012-12-30 16:00:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +178295,2012-12-30 06:10:00,KIDNAPPING,SOUTHERN,300 Block of 9TH ST,-122.410416664036,37.7727234013654 +178308,2012-12-30 04:40:00,DRUNKENNESS,TENDERLOIN,700 Block of OFARRELL ST,-122.417085357424,37.7852153590471 +178341,2012-12-30 02:27:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +178609,2012-12-29 14:50:00,DRUNKENNESS,SOUTHERN,100 Block of KING ST,-122.390858609124,37.779096360374 +178763,2012-12-29 03:48:00,DRUNKENNESS,MISSION,300 Block of CAPP ST,-122.418262236032,37.7610817998691 +178778,2012-12-29 02:27:00,DRUNKENNESS,CENTRAL,400 Block of CALIFORNIA ST,-122.401548064995,37.79295092140779 +178816,2012-12-29 00:10:00,ARSON,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +178839,2012-12-28 23:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +179037,2012-12-28 16:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +179055,2012-12-28 15:00:00,DRUNKENNESS,BAYVIEW,200 Block of CAMERON WY,-122.38837455031602,37.7204312224247 +179060,2012-12-28 15:00:00,DRUNKENNESS,BAYVIEW,0 Block of NICHOLS WY,-122.387234795761,37.7194008333885 +179217,2012-12-28 02:00:00,KIDNAPPING,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +179245,2012-12-27 23:20:00,DRUNKENNESS,SOUTHERN,100 Block of VALENCIA ST,-122.422375026857,37.7707188965808 +179313,2012-12-27 20:30:00,KIDNAPPING,TARAVAL,14TH AV / PORTOLA DR,-122.468310160145,37.737415658948 +179456,2012-12-27 14:30:00,KIDNAPPING,SOUTHERN,7TH ST / MARKET ST,-122.41251534135598,37.78047774805079 +179480,2012-12-27 13:45:00,KIDNAPPING,MISSION,1200 Block of HAMPSHIRE ST,-122.40714465605,37.7520972558707 +179577,2012-12-27 08:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +179653,2012-12-26 23:40:00,ARSON,BAYVIEW,1500 Block of QUESADA AV,-122.388723051056,37.7317262860764 +179654,2012-12-26 23:40:00,ARSON,CENTRAL,100 Block of GRANT AV,-122.40502080789,37.7880208011824 +179656,2012-12-26 23:32:00,DRUNKENNESS,MISSION,VALENCIA ST / 18TH ST,-122.42158168137,37.7617007179518 +179940,2012-12-26 03:03:00,DRUNKENNESS,MISSION,24TH ST / FOLSOM ST,-122.414089000708,37.75250507857579 +180029,2012-12-25 16:15:00,DRUNKENNESS,RICHMOND,5300 Block of GEARY BL,-122.476719025527,37.7805797943167 +180133,2012-12-25 06:35:00,KIDNAPPING,CENTRAL,400 Block of GEARY ST,-122.41072162587,37.78709664956629 +180165,2012-12-25 00:54:00,DRUNKENNESS,PARK,FELL ST / MASONIC AV,-122.445904271169,37.7729953727174 +180168,2012-12-25 00:40:00,DRUNKENNESS,PARK,500 Block of WALLER ST,-122.433121252603,37.7707538383927 +180206,2012-12-24 20:30:00,KIDNAPPING,BAYVIEW,100 Block of VENUS ST,-122.397847684487,37.73072290720261 +180334,2012-12-24 14:27:00,DRUNKENNESS,MISSION,1300 Block of VALENCIA ST,-122.420653354736,37.7512851170191 +180360,2012-12-24 13:25:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +180407,2012-12-24 11:28:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410928353347,37.7836778741124 +180540,2012-12-16 21:53:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +180780,2012-12-16 09:00:00,KIDNAPPING,SOUTHERN,0 Block of MOSS ST,-122.40811239746,37.7777588128811 +180954,2012-12-15 22:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +181192,2012-12-15 09:15:00,ARSON,INGLESIDE,200 Block of JOHNFSHELLEY DR,-122.423170347301,37.7226431761767 +181244,2012-12-15 02:04:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.408368579345,37.7807784253732 +181279,2012-12-15 00:02:00,DRUNKENNESS,RICHMOND,400 Block of CLEMENT ST,-122.463902072852,37.7830189318905 +181452,2012-12-14 16:00:00,KIDNAPPING,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +181483,2012-12-14 14:55:00,KIDNAPPING,CENTRAL,800 Block of BROADWAY ST,-122.41113936187,37.7973778387449 +181658,2012-12-14 03:40:00,DRUNKENNESS,TARAVAL,3100 Block of ALEMANY BL,-122.455973288187,37.7101255439309 +181800,2012-12-13 20:00:00,ARSON,SOUTHERN,TURK ST / MASON ST,-122.408953598279,37.783287873572 +181907,2012-12-13 15:39:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +181973,2012-12-13 12:30:00,DRUNKENNESS,INGLESIDE,SANTOS ST / GENEVA AV,-122.420084075242,37.7083109744591 +182100,2012-12-13 01:30:00,KIDNAPPING,RICHMOND,19TH AV / LINCOLN WY,-122.477309120603,37.765446071582495 +182289,2012-12-12 16:00:00,KIDNAPPING,BAYVIEW,0 Block of WESTBROOK CT,-122.382425286055,37.7350385061864 +182298,2012-12-12 15:30:00,ARSON,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +182299,2012-12-12 15:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +182321,2012-12-12 14:34:00,ARSON,CENTRAL,0 Block of SANSOME ST,-122.400719785797,37.7907124695865 +182418,2012-12-12 08:00:00,KIDNAPPING,PARK,1400 Block of MCALLISTER ST,-122.435901090932,37.7781618593837 +182430,2012-12-12 05:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +182466,2012-12-12 00:01:00,ARSON,NORTHERN,ROSE ST / GOUGH ST,-122.422315670749,37.7736186276456 +182510,2012-12-11 21:01:00,RUNAWAY,MISSION,3500 Block of CESAR CHAVEZ ST,-122.420832650303,37.7479994493226 +182939,2012-12-10 17:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +183266,2012-12-02 17:20:00,ARSON,BAYVIEW,100 Block of KISKA RD,-122.375989158092,37.7301576924252 +183324,2012-12-02 15:00:00,RUNAWAY,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +183337,2012-12-02 14:20:00,DRUNKENNESS,NORTHERN,FILLMORE ST / TURK ST,-122.432142776025,37.780495583709005 +183586,2012-12-01 20:02:00,DRUNKENNESS,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +183743,2012-12-01 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +183750,2012-12-01 12:57:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +183825,2012-12-01 09:15:00,DRUNKENNESS,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +183892,2012-12-01 01:30:00,KIDNAPPING,MISSION,18TH ST / HARTFORD ST,-122.433904330322,37.7609552808387 +183897,2012-12-01 00:44:00,DRUNKENNESS,RICHMOND,2700 Block of ANZA ST,-122.47764718543002,37.77853547244551 +184035,2012-11-30 20:01:00,DRUNKENNESS,PARK,STANYAN ST / HAIGHT ST,-122.45353456066002,37.76916629780521 +184242,2012-11-30 10:51:00,DRUNKENNESS,PARK,FULTON ST / MASONIC AV,-122.446472679005,37.7758015943912 +184255,2012-11-30 10:06:00,ARSON,INGLESIDE,1000 Block of CAYUGA AV,-122.440006611531,37.721804883554704 +184708,2012-11-29 06:24:00,KIDNAPPING,SOUTHERN,MINNA ST / JULIA ST,-122.411874120577,37.77761762810261 +184750,2012-11-29 00:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +184876,2012-11-28 17:30:00,ARSON,BAYVIEW,2600 Block of INGALLS ST,-122.389962980534,37.7225641172396 +185023,2012-11-28 09:00:00,RUNAWAY,BAYVIEW,600 Block of VERMONT ST,-122.404126459271,37.7614652487171 +185088,2012-11-28 00:55:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +185450,2012-11-27 07:30:00,ARSON,NORTHERN,100 Block of OLIVE ST,-122.420240108072,37.78434564911179 +185517,2012-11-26 22:50:00,KIDNAPPING,TENDERLOIN,500 Block of ELLIS ST,-122.415436031905,37.784585134714 +185529,2012-11-26 22:00:00,KIDNAPPING,MISSION,0 Block of LILAC ST,-122.417870588888,37.7514683381676 +185565,2012-11-26 20:00:00,ARSON,TARAVAL,100 Block of VERNON ST,-122.467937380221,37.715202740551895 +185897,2012-11-18 22:40:00,KIDNAPPING,RICHMOND,3300 Block of CABRILLO ST,-122.494517892719,37.7740257106908 +185983,2012-11-18 18:50:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +186180,2012-11-18 07:30:00,KIDNAPPING,INGLESIDE,4000 Block of FOLSOM ST,-122.413462831526,37.736466334010295 +186214,2012-11-18 02:59:00,DRUNKENNESS,SOUTHERN,2ND ST / MINNA ST,-122.399258163927,37.7875785395081 +186281,2012-11-17 23:29:00,DRUNKENNESS,PARK,HAIGHT ST / BELVEDERE ST,-122.449647662955,37.76966191958461 +186491,2012-11-17 13:47:00,DRUNKENNESS,SOUTHERN,MCALLISTER ST / JONES ST,-122.411979487494,37.7809039696758 +186503,2012-11-17 12:30:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411593095704,37.78305295107821 +186645,2012-11-17 01:50:00,DRUNKENNESS,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +186718,2012-11-16 22:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +187071,2012-11-16 03:00:00,DRUNKENNESS,MISSION,21ST ST / VALENCIA ST,-122.421118473704,37.7569011511725 +187154,2012-11-15 22:15:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +187321,2012-11-15 15:05:00,RUNAWAY,BAYVIEW,1600 Block of LANE ST,-122.389831629821,37.7319385163154 +187409,2012-11-15 11:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +187513,2012-11-15 00:09:00,ARSON,CENTRAL,100 Block of MAIDEN LN,-122.405911236484,37.7880756774805 +187608,2012-11-14 20:44:00,DRUNKENNESS,PARK,HAIGHT ST / STANYAN ST,-122.45353456066002,37.76916629780521 +187777,2012-11-14 13:21:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +187953,2012-11-13 23:20:00,DRUNKENNESS,CENTRAL,BROADWAY ST / GRANT AV,-122.40701831326,37.7978228282537 +188159,2012-11-13 15:43:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +188160,2012-11-13 15:43:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +188161,2012-11-13 15:43:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +188234,2012-11-13 11:20:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.416650482064,37.808166053356295 +188338,2012-11-13 03:45:00,DRUNKENNESS,NORTHERN,800 Block of OFARRELL ST,-122.418729600557,37.785007503993 +188734,2012-11-12 00:01:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +189045,2012-11-04 03:52:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.41487855905,37.7826335031541 +189072,2012-11-04 01:45:00,DRUNKENNESS,CENTRAL,MONTGOMERY ST / BROADWAY ST,-122.403864541976,37.798222643742704 +189087,2012-11-04 01:06:00,ARSON,RICHMOND,200 Block of 8TH AV,-122.466558183255,37.7837676393143 +189130,2012-11-03 23:50:00,DRUNKENNESS,MISSION,3200 Block of 22ND ST,-122.419297189961,37.7553465863701 +189383,2012-11-03 13:37:00,DRUNKENNESS,CENTRAL,CALIFORNIA ST / SANSOME ST,-122.401129085393,37.79305866351429 +189441,2012-11-03 11:09:00,DRUNKENNESS,SOUTHERN,100 Block of BERRY ST,-122.392210875634,37.7766144466104 +189508,2012-11-03 06:32:00,DRUNKENNESS,INGLESIDE,0 Block of CRESCENT AV,-122.423668820338,37.7353404814069 +189551,2012-11-03 02:00:00,KIDNAPPING,PARK,FELL ST / ASHBURY ST,-122.447497699759,37.7727905081944 +189564,2012-11-03 01:35:00,DRUNKENNESS,CENTRAL,600 Block of SUTTER ST,-122.411068869703,37.78885570426971 +189795,2012-11-02 17:35:00,DRUNKENNESS,MISSION,MISSION ST / 14TH ST,-122.419983447697,37.768272676361896 +189898,2012-11-02 13:45:00,DRUNKENNESS,INGLESIDE,MISSION ST / PERSIA AV,-122.43597721703,37.7231288306727 +190428,2012-11-01 07:00:00,RUNAWAY,MISSION,1300 Block of YORK ST,-122.407890160743,37.7504458171938 +190535,2012-10-31 23:50:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +190618,2012-10-31 20:00:00,ARSON,MISSION,100 Block of LANDERS ST,-122.427798605971,37.76590072101 +190679,2012-10-31 17:45:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +190831,2012-10-31 12:36:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412054141237,37.7816136403158 +190862,2012-10-31 11:20:00,DRUNKENNESS,TENDERLOIN,HYDE ST / MCALLISTER ST,-122.415317966992,37.7807179285998 +190889,2012-10-31 10:10:00,DRUNKENNESS,NORTHERN,VANNESS AV / MCALLISTER ST,-122.420250482603,37.7800745746334 +190957,2012-10-31 06:30:00,RUNAWAY,INGLESIDE,400 Block of PARIS ST,-122.435066260529,37.7216178242752 +191031,2012-10-30 22:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +191240,2012-10-30 13:00:00,RUNAWAY,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +191294,2012-10-30 10:00:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +191398,2012-10-29 23:21:00,DRUNKENNESS,TENDERLOIN,LEAVENWORTH ST / ELLIS ST,-122.414433155063,37.7846576329256 +191440,2012-10-29 20:08:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435664298117,37.762319163767 +191671,2012-10-29 08:00:00,RUNAWAY,TARAVAL,0 Block of MIRAMAR AV,-122.458100917325,37.7191297288314 +191687,2012-10-29 07:15:00,RUNAWAY,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +191721,2012-10-29 02:06:00,DRUNKENNESS,TARAVAL,RAMSELL ST / ALEMANY BL,-122.466163337162,37.7117069206552 +191727,2012-10-29 01:51:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +191733,2012-10-29 01:30:00,ARSON,SOUTHERN,100 Block of 3RD ST,-122.400916029025,37.7854574902997 +191775,2012-10-29 00:42:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +191786,2012-10-29 00:30:00,ARSON,SOUTHERN,3RD ST / MARKET ST,-122.403434086745,37.78764305018 +191805,2012-10-29 00:20:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +191884,2012-10-21 20:50:00,DRUNKENNESS,NORTHERN,1800 Block of POST ST,-122.432230255169,37.7852054554152 +192099,2012-10-21 02:39:00,DRUNKENNESS,TARAVAL,0 Block of STANLEY ST,-122.463030494503,37.7125743442401 +192123,2012-10-21 01:00:00,KIDNAPPING,INGLESIDE,0 Block of WHITTIER ST,-122.448254406498,37.7100065420886 +192143,2012-10-21 00:10:00,DRUNKENNESS,CENTRAL,900 Block of CALIFORNIA ST,-122.409999361883,37.79188233556 +192230,2012-10-20 20:38:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / HYDE ST,-122.415508242782,37.7816542806076 +192249,2012-10-20 19:49:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +192547,2012-10-20 00:51:00,DRUNKENNESS,PARK,PAGE ST / BRODERICK ST,-122.438901450781,37.771990014561794 +192553,2012-10-20 00:43:00,DRUNKENNESS,SOUTHERN,3RD ST / BRANNAN ST,-122.394304475194,37.7800905305924 +192606,2012-10-19 22:18:00,DRUNKENNESS,NORTHERN,1000 Block of VANNESS AV,-122.421203512,37.785481204644704 +192749,2012-10-19 17:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +192819,2012-10-19 15:00:00,KIDNAPPING,NORTHERN,VANNESS AV / GROVE ST,-122.419884939457,37.77825108324121 +192996,2012-10-19 07:00:00,RUNAWAY,INGLESIDE,600 Block of PARIS ST,-122.437443109934,37.718522879998005 +193019,2012-10-19 02:43:00,ARSON,NORTHERN,0 Block of GOUGH ST,-122.422344796838,37.7734091793677 +193023,2012-10-19 02:11:00,DRUNKENNESS,TARAVAL,1600 Block of HOLLOWAY AV,-122.478278206332,37.7209451616295 +193160,2012-10-18 20:11:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +193185,2012-10-18 18:56:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +193217,2012-10-18 17:52:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +193220,2012-10-18 17:43:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +193222,2012-10-18 17:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +193251,2012-10-18 16:40:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +193504,2012-10-18 00:10:00,RUNAWAY,MISSION,3200 Block of 26TH ST,-122.414593171104,37.7491990535295 +193551,2012-10-17 21:54:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +193776,2012-10-17 13:55:00,KIDNAPPING,INGLESIDE,4400 Block of MISSION ST,-122.433559427453,37.72642778067821 +194071,2012-10-16 21:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +194355,2012-10-16 08:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +194393,2012-10-16 07:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +194398,2012-10-16 07:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +194419,2012-10-16 03:29:00,ARSON,CENTRAL,HARLAN PL / GRANT AV,-122.405500663892,37.7900791337552 +194436,2012-10-16 01:06:00,ARSON,BAYVIEW,1300 Block of DONNER AV,-122.389235739237,37.72175477339989 +194887,2012-10-15 00:45:00,ARSON,TENDERLOIN,100 Block of POWELL ST,-122.407877787733,37.785968007677496 +194989,2012-10-07 20:00:00,DRUNKENNESS,TARAVAL,2200 Block of TARAVAL ST,-122.490170246651,37.7424682353625 +195104,2012-10-07 15:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +195148,2012-10-07 13:31:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +195159,2012-10-07 12:54:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +195303,2012-10-07 02:20:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929231,37.7980180687744 +195372,2012-10-06 23:47:00,DRUNKENNESS,SOUTHERN,600 Block of 3RD ST,-122.393559121228,37.7794201313347 +195444,2012-10-06 21:30:00,DRUNKENNESS,SOUTHERN,1700 Block of MARKET ST,-122.422188261426,37.7726948236861 +195476,2012-10-06 20:08:00,DRUNKENNESS,MISSION,17TH ST / GUERRERO ST,-122.423962124277,37.7631671994684 +195500,2012-10-06 19:30:00,KIDNAPPING,INGLESIDE,0 Block of EASTWOOD DR,-122.457254651092,37.726914084371295 +195628,2012-10-06 15:40:00,DRUNKENNESS,TENDERLOIN,200 Block of JONES ST,-122.412573643201,37.7834687204586 +195766,2012-10-06 10:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +195810,2012-10-06 04:20:00,ARSON,NORTHERN,LOMBARD ST / POLK ST,-122.422903989743,37.801556112203606 +196308,2012-10-05 00:01:00,RUNAWAY,INGLESIDE,300 Block of MOSCOW ST,-122.427127092149,37.72205469469471 +196629,2012-10-04 07:00:00,KIDNAPPING,BAYVIEW,300 Block of BAY SHORE BL,-122.406825183678,37.741054981526 +196690,2012-10-03 22:55:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +196782,2012-10-03 18:41:00,DRUNKENNESS,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +196847,2012-10-03 15:54:00,DRUNKENNESS,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +196969,2012-10-03 09:40:00,RUNAWAY,TENDERLOIN,0 Block of TAYLOR ST,-122.410689907787,37.7824948907735 +197006,2012-10-03 07:30:00,ARSON,TARAVAL,400 Block of CAPITOL AV,-122.459110001394,37.7144894576542 +197031,2012-10-03 04:45:00,DRUNKENNESS,BAYVIEW,0 Block of WESTVIEW AV,-122.418240102107,37.7311402768386 +197081,2012-10-02 23:00:00,KIDNAPPING,MISSION,FOLSOM ST / 19TH ST,-122.414845139206,37.7605000725995 +197105,2012-10-02 22:25:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +197423,2012-10-02 07:50:00,ARSON,SOUTHERN,500 Block of MARKET ST,-122.400194768944,37.7900527936016 +197447,2012-10-02 03:45:00,KIDNAPPING,NORTHERN,1500 Block of VANNESS AV,-122.422404422276,37.789876481740606 +197507,2012-10-01 22:36:00,DRUNKENNESS,BAYVIEW,QUESADA AV / 3RD ST,-122.391245623019,37.7332252032804 +197710,2012-10-01 14:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +197737,2012-10-01 14:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +197812,2012-10-01 11:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +197820,2012-10-01 11:00:00,RUNAWAY,MISSION,100 Block of LILAC ST,-122.41757648018,37.74986342403921 +198021,2012-10-01 00:01:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617192,37.778124778322 +198061,2012-09-23 22:00:00,ARSON,INGLESIDE,2900 Block of DIAMOND ST,-122.434363909417,37.7330448919252 +198136,2012-09-23 18:45:00,DRUNKENNESS,SOUTHERN,0 Block of LAFAYETTE ST,-122.417223311452,37.7729316891676 +198273,2012-09-23 13:30:00,DRUNKENNESS,PARK,600 Block of STANYAN ST,-122.453745875122,37.7705839128497 +198406,2012-09-23 00:59:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +198470,2012-09-22 22:00:00,ARSON,BAYVIEW,1100 Block of WISCONSIN ST,-122.398402739289,37.7524030056629 +198495,2012-09-22 21:00:00,KIDNAPPING,SOUTHERN,9TH ST / HOWARD ST,-122.413163134276,37.7749926445385 +198565,2012-09-22 17:45:00,ARSON,NORTHERN,1000 Block of POLK ST,-122.419858277339,37.786137125238 +198639,2012-09-22 14:30:00,RUNAWAY,TARAVAL,0 Block of CAMBON DR,-122.474584301346,37.7183032721698 +198694,2012-09-22 11:30:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +198901,2012-09-21 21:25:00,KIDNAPPING,RICHMOND,3100 Block of WASHINGTON ST,-122.445121767117,37.7901663418509 +198928,2012-09-21 20:23:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.431979576386,37.7800478529923 +198958,2012-09-21 19:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +199186,2012-09-21 09:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +199224,2012-09-21 08:00:00,RUNAWAY,BAYVIEW,1300 Block of PALOU AV,-122.386204568859,37.73137906797621 +199266,2012-09-21 00:30:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.399045655841,37.7813197113532 +199393,2012-09-20 18:17:00,ARSON,TARAVAL,LAKE MERCED BL / SUNSET BL,-122.493468495006,37.7295950708457 +199497,2012-09-20 15:15:00,KIDNAPPING,NORTHERN,STEINER ST / TURK ST,-122.433784764382,37.7802873652863 +199626,2012-09-20 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +199720,2012-09-19 21:21:00,DRUNKENNESS,SOUTHERN,3RD ST / CHANNEL ST,-122.389898139551,37.7748981937461 +199722,2012-09-19 21:20:00,DRUNKENNESS,CENTRAL,1300 Block of PINE ST,-122.418028132982,37.7898812870744 +199765,2012-09-19 19:00:00,DRUNKENNESS,SOUTHERN,300 Block of 4TH ST,-122.399833846531,37.781043217933394 +199904,2012-09-19 13:39:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +200036,2012-09-19 03:00:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +200047,2012-09-19 02:15:00,ARSON,BAYVIEW,1500 Block of SHAFTER AV,-122.389849114797,37.7304741509374 +200159,2012-09-18 20:50:00,DRUNKENNESS,MISSION,SHOTWELL ST / 24TH ST,-122.415173665801,37.7524407589917 +200304,2012-09-18 14:15:00,DRUNKENNESS,CENTRAL,JEFFERSON ST / MASON ST,-122.414166515093,37.808419917271 +200404,2012-09-18 02:15:00,ARSON,NORTHERN,300 Block of FELL ST,-122.423581857437,37.7759042673828 +200495,2012-09-17 20:03:00,DRUNKENNESS,SOUTHERN,KING ST / 2ND ST,-122.389595283252,37.7798611974198 +200503,2012-09-17 20:00:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +200541,2012-09-17 18:00:00,RUNAWAY,RICHMOND,400 Block of 5TH AV,-122.463073040058,37.780088890954 +200599,2012-09-17 16:15:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.450492384367,37.7696094511519 +200666,2012-09-17 12:48:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +200775,2012-09-17 03:49:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.41072162587,37.78709664956629 +200786,2012-09-17 02:53:00,DRUNKENNESS,PARK,2300 Block of FULTON ST,-122.455797073389,37.7746727324633 +200812,2012-09-17 00:01:00,DRUNKENNESS,TENDERLOIN,200 Block of OFARRELL ST,-122.408496298209,37.786296190453 +200875,2012-09-09 21:00:00,KIDNAPPING,BAYVIEW,100 Block of JERROLD AV,-122.371625370398,37.728776681812704 +200923,2012-09-09 18:42:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +201032,2012-09-09 14:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +201053,2012-09-09 13:23:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +201155,2012-09-09 04:40:00,ARSON,TENDERLOIN,100 Block of LEAVENWORTH ST,-122.414029821727,37.7823291237659 +201195,2012-09-09 01:05:00,DRUNKENNESS,TARAVAL,SERRANO DR / TAPIA DR,-122.481421262126,37.7190548750588 +201362,2012-09-08 18:29:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +201452,2012-09-08 14:05:00,DRUNKENNESS,NORTHERN,700 Block of 14TH ST,-122.429519876751,37.767640877805206 +201470,2012-09-08 13:30:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406681057265,37.755343095442 +201519,2012-09-08 10:04:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +201570,2012-09-08 04:15:00,KIDNAPPING,TENDERLOIN,500 Block of ELLIS ST,-122.414615262229,37.784689282473 +201583,2012-09-08 02:20:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405862214655,37.7979117105028 +201686,2012-09-07 21:10:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +201711,2012-09-07 19:55:00,DRUNKENNESS,TENDERLOIN,0 Block of ELLIS ST,-122.406850401437,37.7855610975205 +201803,2012-09-07 16:15:00,RUNAWAY,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +201852,2012-09-07 14:16:00,KIDNAPPING,INGLESIDE,300 Block of WILDE AV,-122.40375548345,37.716710079211296 +201999,2012-09-07 01:07:00,ARSON,RICHMOND,6700 Block of GEARY BL,-122.491699061109,37.7796499277867 +202020,2012-09-06 23:51:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +202439,2012-09-05 22:30:00,RUNAWAY,BAYVIEW,100 Block of MADDUX AV,-122.399264458603,37.73292615365229 +202458,2012-09-05 21:28:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +202717,2012-09-05 09:00:00,ARSON,TARAVAL,2100 Block of 24TH AV,-122.481305019184,37.747461318190496 +202771,2012-09-05 01:00:00,KIDNAPPING,TENDERLOIN,500 Block of ELLIS ST,-122.415414178631,37.784476659022005 +202806,2012-09-04 23:00:00,RUNAWAY,NORTHERN,600 Block of LINDEN ST,-122.428644258416,37.7756257396589 +202850,2012-09-04 21:44:00,ARSON,BAYVIEW,500 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +202866,2012-09-04 20:58:00,KIDNAPPING,NORTHERN,1200 Block of EDDY ST,-122.428245242312,37.7820044139073 +202869,2012-09-04 20:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +202886,2012-09-04 20:00:00,KIDNAPPING,INGLESIDE,100 Block of LELAND AV,-122.40604991915,37.7121574282644 +203087,2012-09-04 11:30:00,RUNAWAY,RICHMOND,2700 Block of SUTTER ST,-122.445541993542,37.7844717061048 +203191,2012-09-04 00:01:00,KIDNAPPING,MISSION,3000 Block of 21ST ST,-122.416178123149,37.7572542986223 +203243,2012-09-03 21:05:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +203246,2012-09-03 21:04:00,DRUNKENNESS,NORTHERN,1400 Block of POLK ST,-122.420660609645,37.7900998202351 +203258,2012-09-03 20:29:00,ARSON,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +203275,2012-09-03 19:54:00,DRUNKENNESS,RICHMOND,800 Block of LA PLAYA ST,-122.509895418239,37.7723131976814 +203309,2012-09-03 18:45:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +203318,2012-09-03 18:00:00,RUNAWAY,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +203489,2012-09-03 11:06:00,ARSON,SOUTHERN,1300 Block of MARKET ST,-122.416991089644,37.777074192256 +203490,2012-09-03 11:06:00,ARSON,SOUTHERN,1300 Block of MARKET ST,-122.416991089644,37.777074192256 +203548,2012-09-03 05:00:00,KIDNAPPING,PARK,700 Block of BURNETT AV,-122.445470487829,37.7506825120195 +203893,2012-08-26 06:10:00,ARSON,BAYVIEW,0 Block of HARE ST,-122.378991849151,37.73453622329961 +203896,2012-08-26 04:45:00,DRUNKENNESS,RICHMOND,400 Block of 6TH AV,-122.464279879446,37.7800332991006 +203985,2012-08-25 23:14:00,ARSON,BAYVIEW,400 Block of HAWES ST,-122.377420574148,37.7334168528467 +204000,2012-08-25 22:45:00,ARSON,CENTRAL,2800 Block of LEAVENWORTH ST,-122.418930302924,37.80735025163229 +204026,2012-08-25 21:50:00,ARSON,INGLESIDE,500 Block of ARGONAUT AV,-122.4145828668,37.7089357649813 +204092,2012-08-25 19:00:00,RUNAWAY,BAYVIEW,0 Block of LATONA ST,-122.392627218053,37.7316182572491 +204133,2012-08-25 18:00:00,DRUNKENNESS,RICHMOND,300 Block of 9TH AV,-122.46762610569598,37.781819339314 +204383,2012-08-25 02:15:00,DRUNKENNESS,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +204448,2012-08-24 22:50:00,KIDNAPPING,MISSION,16TH ST / FLORIDA ST,-122.411456231268,37.765548976206006 +204470,2012-08-24 22:00:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +204535,2012-08-24 19:16:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +204750,2012-08-24 09:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +204751,2012-08-24 09:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +204834,2012-08-24 01:55:00,DRUNKENNESS,RICHMOND,4100 Block of GEARY BL,-122.463764261964,37.7811749336778 +205108,2012-08-23 13:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +205215,2012-08-23 07:30:00,DRUNKENNESS,SOUTHERN,4TH ST / TOWNSEND ST,-122.394985875925,37.77709095340229 +205239,2012-08-23 03:00:00,KIDNAPPING,RICHMOND,700 Block of 40TH AV,-122.500518618666,37.7746146396384 +205259,2012-08-23 01:02:00,DRUNKENNESS,SOUTHERN,400 Block of NATOMA ST,-122.405832621645,37.7815571576096 +205299,2012-08-22 22:35:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +205516,2012-08-22 13:35:00,KIDNAPPING,INGLESIDE,400 Block of WILDE AV,-122.40633225923,37.7175038575459 +205554,2012-08-22 11:10:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +205629,2012-08-22 07:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +205686,2012-08-22 00:01:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +205689,2012-08-21 23:58:00,DRUNKENNESS,PARK,800 Block of DIVISADERO ST,-122.438393115334,37.777318694956 +205813,2012-08-21 18:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +205896,2012-08-21 14:39:00,DRUNKENNESS,BAYVIEW,3800 Block of 3RD ST,-122.388192921769,37.742315306831 +206228,2012-08-20 17:45:00,KIDNAPPING,TARAVAL,1000 Block of VICENTE ST,-122.478123232418,37.7392610223747 +206417,2012-08-20 10:00:00,KIDNAPPING,CENTRAL,600 Block of MASON ST,-122.410271349769,37.7895016291913 +206479,2012-08-20 02:07:00,DRUNKENNESS,RICHMOND,200 Block of 18TH AV,-122.477371441024,37.7832768267645 +206485,2012-08-20 01:40:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +206567,2012-08-12 21:14:00,DRUNKENNESS,RICHMOND,1600 Block of JOHNFKENNEDY DR,-122.498344199765,37.7687579641824 +206671,2012-08-12 16:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +206863,2012-08-12 00:01:00,DRUNKENNESS,BAYVIEW,800 Block of INNES AV,-122.374882420332,37.731431829647 +206944,2012-08-11 20:00:00,KIDNAPPING,NORTHERN,1000 Block of GOLDEN GATE AV,-122.428651252158,37.7800402061663 +207020,2012-08-11 16:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +207042,2012-08-11 15:54:00,DRUNKENNESS,TENDERLOIN,JONES ST / OFARRELL ST,-122.412970537591,37.78578837668879 +207162,2012-08-11 10:00:00,KIDNAPPING,BAYVIEW,1600 Block of LANE ST,-122.389831629821,37.7319385163154 +207226,2012-08-11 01:20:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423637302048,37.7648666651043 +207314,2012-08-10 21:30:00,KIDNAPPING,MISSION,3100 Block of 22ND ST,-122.41821569477,37.7554138872049 +207331,2012-08-10 20:45:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +207341,2012-08-10 20:36:00,DRUNKENNESS,BAYVIEW,0 Block of WESTBROOK CT,-122.382452903681,37.7349303029099 +207347,2012-08-10 20:20:00,DRUNKENNESS,RICHMOND,JOHNFKENNEDY DR / 36TH AV,-122.489804747862,37.7708917848848 +207631,2012-08-10 00:01:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +207765,2012-08-09 18:20:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +207768,2012-08-09 18:20:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +207801,2012-08-09 16:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +207848,2012-08-09 14:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406870402082,37.7572895904578 +207907,2012-08-09 10:55:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +208003,2012-08-09 01:19:00,ARSON,BAYVIEW,0 Block of NAPOLEON ST,-122.399112963442,37.74687962237 +208056,2012-08-08 21:44:00,ARSON,BAYVIEW,VANDYKE AV / INGALLS ST,-122.386800717671,37.7259869217106 +208370,2012-08-08 01:26:00,DRUNKENNESS,TARAVAL,200 Block of BUCKINGHAM WY,-122.478884586609,37.7258438313416 +208422,2012-08-07 21:00:00,ARSON,MISSION,500 Block of CAPP ST,-122.417955821717,37.7578801214437 +208448,2012-08-07 19:15:00,DRUNKENNESS,RICHMOND,2200 Block of CLEMENT ST,-122.483283388072,37.7821536162857 +208498,2012-08-07 17:01:00,DRUNKENNESS,BAYVIEW,NEWCOMB AV / MENDELL ST,-122.389774683064,37.735226586208 +208563,2012-08-07 13:25:00,KIDNAPPING,NORTHERN,1000 Block of MCALLISTER ST,-122.428442307611,37.7789982847524 +208619,2012-08-07 10:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +208680,2012-08-07 04:00:00,KIDNAPPING,NORTHERN,2300 Block of WASHINGTON ST,-122.431920661893,37.791847812460105 +208728,2012-08-06 22:34:00,ARSON,BAYVIEW,900 Block of IOWA ST,-122.391708193948,37.7538716329607 +209060,2012-08-06 01:35:00,DRUNKENNESS,CENTRAL,STOCKTON ST / COLUMBUS AV,-122.409017007613,37.7994880717633 +209209,2012-07-29 17:28:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +209367,2012-07-29 07:45:00,DRUNKENNESS,INGLESIDE,0 Block of SGTJOHNVYOUNG LN,-122.444707063455,37.7249307267936 +209378,2012-07-29 06:32:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +209410,2012-07-29 02:49:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +209753,2012-07-28 10:00:00,KIDNAPPING,NORTHERN,1500 Block of EDDY ST,-122.433177816267,37.7813758100318 +209769,2012-07-28 08:47:00,DRUNKENNESS,BAYVIEW,1100 Block of NEWHALL ST,-122.390866172562,37.7372499015533 +209822,2012-07-28 02:02:00,DRUNKENNESS,SOUTHERN,12TH ST / HARRISON ST,-122.413049740894,37.77005278785961 +210240,2012-07-27 08:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +210282,2012-07-27 01:45:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +210400,2012-07-26 18:35:00,RUNAWAY,NORTHERN,1100 Block of TURK ST,-122.428840433603,37.780972734343706 +210427,2012-07-26 17:40:00,ARSON,SOUTHERN,300 Block of RITCH ST,-122.394097734639,37.7789944686376 +210651,2012-07-26 03:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +210898,2012-07-25 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +210977,2012-07-25 10:06:00,ARSON,SOUTHERN,700 Block of HARRISON ST,-122.398929855632,37.7812561963316 +211110,2012-07-24 21:48:00,DRUNKENNESS,SOUTHERN,500 Block of MARKET ST,-122.401833062479,37.7890397716649 +211374,2012-07-24 06:17:00,ARSON,BAYVIEW,1300 Block of UNDERWOOD AV,-122.387153625351,37.7271911468699 +211396,2012-07-24 03:10:00,DRUNKENNESS,CENTRAL,600 Block of STOCKTON ST,-122.407354509443,37.7917926375029 +211425,2012-07-24 00:01:00,ARSON,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +211721,2012-07-23 09:00:00,KIDNAPPING,MISSION,3400 Block of 24TH ST,-122.420909192406,37.7521438061204 +211770,2012-07-23 02:18:00,ARSON,NORTHERN,100 Block of SANCHEZ ST,-122.431007143745,37.7664004342884 +211825,2012-07-15 22:06:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.413753670487,37.78373004094 +212041,2012-07-15 12:00:00,KIDNAPPING,BAYVIEW,1000 Block of GRIFFITH ST,-122.378920771859,37.7286119710993 +212083,2012-07-15 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +212421,2012-07-14 13:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +212441,2012-07-14 12:43:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +212461,2012-07-14 12:18:00,ARSON,INGLESIDE,200 Block of PUTNAM ST,-122.410985121891,37.7363241269838 +212585,2012-07-14 00:57:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +212709,2012-07-13 19:10:00,ARSON,INGLESIDE,1500 Block of VALENCIA ST,-122.420272135283,37.7473316298785 +212782,2012-07-13 16:43:00,DRUNKENNESS,MISSION,3400 Block of 25TH ST,-122.418579871188,37.7506771297941 +212881,2012-07-13 13:00:00,KIDNAPPING,BAYVIEW,0 Block of CAMERON WY,-122.387247607197,37.7208692407802 +212898,2012-07-13 11:30:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +212985,2012-07-13 01:47:00,DRUNKENNESS,CENTRAL,BROADWAY ST / ROMOLO ST,-122.406235011205,37.7979206468132 +213087,2012-07-12 20:00:00,ARSON,CENTRAL,100 Block of GRANT AV,-122.40502080789,37.7880208011824 +213378,2012-07-12 00:01:00,KIDNAPPING,TARAVAL,1600 Block of 10TH AV,-122.466857142543,37.7574509870817 +213380,2012-07-12 00:01:00,ARSON,TARAVAL,600 Block of JOHNMUIR DR,-122.49206801734,37.714361549875605 +213529,2012-07-11 15:50:00,DRUNKENNESS,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +213753,2012-07-10 21:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +213774,2012-07-10 20:00:00,RUNAWAY,MISSION,200 Block of 14TH ST,-122.418885184858,37.7682847825555 +213981,2012-07-10 09:00:00,RUNAWAY,BAYVIEW,1200 Block of PALOU AV,-122.384417093311,37.73022960107609 +213988,2012-07-10 08:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +214084,2012-07-09 22:15:00,DRUNKENNESS,PARK,CASTRO ST / MARKET ST,-122.435187699349,37.7626702770872 +214089,2012-07-09 22:00:00,KIDNAPPING,INGLESIDE,3300 Block of MISSION ST,-122.421644478447,37.7429970144076 +214232,2012-07-09 14:48:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +214374,2012-07-09 04:58:00,ARSON,BAYVIEW,1400 Block of HAWES ST,-122.382916662508,37.7270737337453 +214431,2012-07-01 22:55:00,KIDNAPPING,INGLESIDE,100 Block of FLORENTINE AV,-122.443007115209,37.7113255872448 +214469,2012-07-01 20:00:00,RUNAWAY,BAYVIEW,1700 Block of NEWCOMB AV,-122.392643753605,37.736784880051296 +214507,2012-07-01 18:00:00,RUNAWAY,PARK,1000 Block of SHRADER ST,-122.451237848192,37.7651488651911 +214530,2012-07-01 17:20:00,DRUNKENNESS,TARAVAL,ULLOA ST / 18TH AV,-122.474492434891,37.7412321400763 +214539,2012-07-01 17:00:00,KIDNAPPING,TENDERLOIN,400 Block of JONES ST,-122.412857126524,37.7855804361702 +214589,2012-07-01 14:15:00,DRUNKENNESS,CENTRAL,UNION ST / STOCKTON ST,-122.409193904616,37.800443875105294 +214718,2012-07-01 02:50:00,KIDNAPPING,BAYVIEW,0 Block of HARBOR RD,-122.378268018481,37.7323807302226 +214839,2012-06-30 21:25:00,KIDNAPPING,INGLESIDE,CORTLAND AV / PROSPECT AV,-122.42085671633998,37.7402205692099 +214850,2012-06-30 20:40:00,ARSON,INGLESIDE,800 Block of PRAGUE ST,-122.434233140481,37.71042450912472 +214966,2012-06-30 14:15:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +215023,2012-06-30 12:00:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +215025,2012-06-30 12:00:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +215092,2012-06-30 07:16:00,DRUNKENNESS,MISSION,0 Block of WIESE ST,-122.420629159814,37.7658091937535 +215100,2012-06-30 06:00:00,ARSON,RICHMOND,2600 Block of FULTON ST,-122.460040578709,37.774151965617705 +215164,2012-06-30 00:01:00,RUNAWAY,INGLESIDE,2100 Block of CAYUGA AV,-122.454269264868,37.7104830193095 +215183,2012-06-29 23:53:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +215359,2012-06-29 16:30:00,KIDNAPPING,NORTHERN,1500 Block of OFARRELL ST,-122.430610535316,37.7834963710489 +215522,2012-06-29 02:30:00,ARSON,BAYVIEW,NEWCOMB AV / BARNEVELD AV,-122.403276063199,37.7431236721444 +215535,2012-06-29 01:41:00,DRUNKENNESS,SOUTHERN,5TH ST / WELSH ST,-122.399765430206,37.77737112614079 +215776,2012-06-28 15:50:00,RUNAWAY,PARK,1800 Block of WALLER ST,-122.454330105396,37.7681530111159 +215816,2012-06-28 14:00:00,KIDNAPPING,INGLESIDE,DIAMOND ST / KERN ST,-122.434050860058,37.7338900455815 +215982,2012-06-28 01:59:00,ARSON,BAYVIEW,1000 Block of CONNECTICUT ST,-122.397089183868,37.753598788032704 +216072,2012-06-27 20:00:00,RUNAWAY,BAYVIEW,1700 Block of NEWCOMB AV,-122.392643753605,37.736784880051296 +216095,2012-06-27 19:00:00,KIDNAPPING,BAYVIEW,1400 Block of MCKINNON CT,-122.386995296821,37.7345066503794 +216171,2012-06-27 16:07:00,DRUNKENNESS,INGLESIDE,COLERIDGE ST / KINGSTON ST,-122.421265449989,37.7413126786018 +216199,2012-06-27 15:13:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +216330,2012-06-27 11:00:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +216470,2012-06-26 23:00:00,DRUNKENNESS,SOUTHERN,100 Block of VALENCIA ST,-122.422375026857,37.7707188965808 +216501,2012-06-26 21:44:00,DRUNKENNESS,PARK,400 Block of DIVISADERO ST,-122.437631568454,37.7735923085037 +216634,2012-06-26 16:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +216655,2012-06-26 15:30:00,ARSON,SOUTHERN,700 Block of HARRISON ST,-122.399045655841,37.7813197113532 +216854,2012-06-26 00:10:00,KIDNAPPING,PARK,500 Block of MASONIC AV,-122.446631889885,37.7762539364381 +216875,2012-06-25 23:10:00,KIDNAPPING,BAYVIEW,1100 Block of QUESADA AV,-122.380933670061,37.727442350503104 +216914,2012-06-25 20:30:00,KIDNAPPING,RICHMOND,400 Block of 6TH AV,-122.464279879446,37.7800332991006 +216955,2012-06-25 19:00:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +216966,2012-06-25 18:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +217004,2012-06-25 16:42:00,DRUNKENNESS,BAYVIEW,3RD ST / LASALLE AV,-122.389865610332,37.73716994462029 +217189,2012-06-25 03:35:00,ARSON,TARAVAL,3000 Block of 25TH AV,-122.480876861074,37.7318051229286 +217193,2012-06-25 02:50:00,ARSON,BAYVIEW,1300 Block of GRIFFITH ST,-122.380598750274,37.7267028585173 +217204,2012-06-25 01:06:00,ARSON,TARAVAL,CAPITOL AV / THRIFT ST,-122.459070767349,37.71745364071009 +217208,2012-06-25 01:00:00,KIDNAPPING,MISSION,2800 Block of 24TH ST,-122.408664686116,37.7528787651491 +217272,2012-06-17 21:47:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +217308,2012-06-17 19:45:00,DRUNKENNESS,MISSION,16TH ST / VALENCIA ST,-122.421886357981,37.7649178909424 +217313,2012-06-17 19:25:00,DRUNKENNESS,TARAVAL,500 Block of SKYLINEBLVD HY,-122.498098202551,37.7145772172019 +217356,2012-06-17 16:45:00,DRUNKENNESS,TENDERLOIN,100 Block of POWELL ST,-122.407877787733,37.785968007677496 +217436,2012-06-17 11:24:00,ARSON,SOUTHERN,0 Block of 3RD ST,-122.403284843106,37.787306416019 +217494,2012-06-17 04:35:00,DRUNKENNESS,TARAVAL,2600 Block of 23RD AV,-122.47958980257098,37.7381857061106 +217515,2012-06-17 03:00:00,DRUNKENNESS,MISSION,2600 Block of MISSION ST,-122.41860030588998,37.7546255872838 +217527,2012-06-17 02:15:00,KIDNAPPING,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739951,37.7978641744394 +217536,2012-06-17 01:45:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +217563,2012-06-17 00:46:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.407505446721,37.7811304562104 +217566,2012-06-17 00:30:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.407521730924,37.7983830790911 +217655,2012-06-16 20:30:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +217750,2012-06-16 14:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +217800,2012-06-16 11:50:00,DRUNKENNESS,CENTRAL,200 Block of NORTHPOINT ST,-122.411324519026,37.806804272619296 +217863,2012-06-16 03:30:00,ARSON,INGLESIDE,400 Block of EDNA ST,-122.446640339924,37.730303355746 +217873,2012-06-16 02:32:00,DRUNKENNESS,NORTHERN,100 Block of SANCHEZ ST,-122.431099974967,37.7659212870548 +217967,2012-06-15 21:00:00,KIDNAPPING,TENDERLOIN,300 Block of GOLDEN GATE AV,-122.41635198735202,37.7816031438671 +218019,2012-06-15 18:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +218165,2012-06-15 11:25:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +218195,2012-06-15 09:00:00,RUNAWAY,BAYVIEW,100 Block of ALBATROSS CT,-122.372202831457,37.728381194358704 +218240,2012-06-15 01:16:00,DRUNKENNESS,RICHMOND,3900 Block of GEARY BL,-122.461620169101,37.7812597610597 +218333,2012-06-14 20:23:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449101011701,37.7696756290578 +218397,2012-06-14 17:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +218611,2012-06-13 23:00:00,RUNAWAY,INGLESIDE,100 Block of APPLETON AV,-122.42189877187,37.737950084707606 +218624,2012-06-13 22:14:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +218667,2012-06-13 20:00:00,ARSON,BAYVIEW,2400 Block of GRIFFITH ST,-122.386437671186,37.7191834462785 +218782,2012-06-13 14:38:00,ARSON,PARK,4000 Block of 17TH ST,-122.435824053865,37.7625528315766 +218928,2012-06-13 04:50:00,ARSON,BAYVIEW,1400 Block of LASALLE AV,-122.385550124688,37.733998953092 +218935,2012-06-13 04:00:00,KIDNAPPING,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +218942,2012-06-13 03:10:00,ARSON,MISSION,2400 Block of MARKET ST,-122.435773846395,37.7624591846215 +218988,2012-06-12 22:20:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.415724213925,37.7524609846175 +219183,2012-06-12 11:07:00,DRUNKENNESS,TENDERLOIN,POWELL ST / OFARRELL ST,-122.408040474858,37.7864094033618 +219254,2012-06-12 00:22:00,ARSON,CENTRAL,500 Block of TAYLOR ST,-122.411540447656,37.78740983565 +219379,2012-06-11 17:00:00,RUNAWAY,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +219652,2012-06-03 22:15:00,KIDNAPPING,TARAVAL,0 Block of BRIGHTON AV,-122.45518407113998,37.7191534375561 +219714,2012-06-03 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +219725,2012-06-03 18:15:00,KIDNAPPING,CENTRAL,900 Block of HYDE ST,-122.417044292614,37.78959527743221 +219967,2012-06-03 00:15:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +219984,2012-06-02 23:39:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929231,37.7980180687744 +220092,2012-06-02 19:18:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +220145,2012-06-02 17:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +220160,2012-06-02 16:16:00,DRUNKENNESS,RICHMOND,1000 Block of GREAT HY,-122.510225749052,37.7672442209616 +220323,2012-06-02 01:35:00,KIDNAPPING,MISSION,3300 Block of 18TH ST,-122.417742204595,37.761878431662296 +220326,2012-06-02 01:05:00,DRUNKENNESS,CENTRAL,LEAVENWORTH ST / JEFFERSON ST,-122.419087676747,37.8078015516515 +220370,2012-06-01 22:18:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +220623,2012-06-01 11:56:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +220740,2012-06-01 02:02:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +220770,2012-06-01 00:01:00,KIDNAPPING,SOUTHERN,300 Block of 9TH ST,-122.411277969882,37.7735786121372 +220846,2012-05-31 22:20:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406681057265,37.755343095442 +221166,2012-05-30 23:45:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +221298,2012-05-30 18:00:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +221541,2012-05-30 02:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +222075,2012-05-28 18:00:00,KIDNAPPING,TARAVAL,400 Block of VICTORIA ST,-122.465280575186,37.7188190833635 +222250,2012-05-28 03:44:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.399045655841,37.7813197113532 +222264,2012-05-28 01:56:00,DRUNKENNESS,TARAVAL,2400 Block of 19TH AV,-122.475732191676,37.7420951774494 +222285,2012-05-20 23:16:00,ARSON,BAYVIEW,0 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +222323,2012-05-20 21:15:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +222377,2012-05-20 18:48:00,KIDNAPPING,PARK,400 Block of LYON ST,-122.442920295847,37.774827407472 +222582,2012-05-20 11:00:00,DRUNKENNESS,RICHMOND,JOHNFKENNEDY DR / TRANSVERSE DR,-122.479893513106,37.77049279878271 +222594,2012-05-20 10:17:00,DRUNKENNESS,NORTHERN,HAYES ST / OCTAVIA ST,-122.424623480779,37.7766740025224 +222780,2012-05-19 20:40:00,KIDNAPPING,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +222831,2012-05-19 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +222961,2012-05-19 11:44:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +223082,2012-05-19 00:45:00,KIDNAPPING,CENTRAL,SPOFFORD LN / WASHINGTON ST,-122.407489700697,37.7950161151291 +223102,2012-05-19 00:01:00,DRUNKENNESS,SOUTHERN,7TH ST / MINNA ST,-122.410405602135,37.778784148603286 +223163,2012-05-18 21:10:00,DRUNKENNESS,SOUTHERN,TOWNSEND ST / 7TH ST,-122.401658145147,37.7718165835839 +223164,2012-05-18 21:10:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +223239,2012-05-18 18:00:00,KIDNAPPING,NORTHERN,2000 Block of LOMBARD ST,-122.435218147193,37.79982886606661 +223305,2012-05-18 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +223333,2012-05-18 13:34:00,ARSON,RICHMOND,4400 Block of FULTON ST,-122.47938499932,37.7728444410496 +223397,2012-05-18 10:00:00,DRUNKENNESS,TENDERLOIN,400 Block of OFARRELL ST,-122.412563218508,37.785785061938206 +223482,2012-05-18 01:45:00,ARSON,TARAVAL,SANTIAGO ST / 41ST AV,-122.477967578957,37.744821827583 +223603,2012-05-17 18:35:00,KIDNAPPING,TENDERLOIN,100 Block of LEAVENWORTH ST,-122.413893155951,37.782346520673 +223644,2012-05-17 16:46:00,ARSON,TARAVAL,SANTIAGO ST / 41ST AV,-122.477967578957,37.744821827583 +223697,2012-05-17 14:50:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +223800,2012-05-17 08:00:00,RUNAWAY,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +223826,2012-05-17 00:45:00,DRUNKENNESS,CENTRAL,100 Block of COLUMBUS AV,-122.405446187756,37.796945444827706 +223883,2012-05-16 21:21:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +223899,2012-05-16 20:48:00,RUNAWAY,MISSION,200 Block of DOLORES ST,-122.426590096146,37.7651910108919 +223910,2012-05-16 20:15:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +223924,2012-05-16 20:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +223959,2012-05-16 18:39:00,DRUNKENNESS,PARK,COLE ST / HAIGHT ST,-122.450709919144,37.7695262270693 +224030,2012-05-16 16:00:00,KIDNAPPING,NORTHERN,1000 Block of LAGUNA ST,-122.427179879518,37.7806552772342 +224406,2012-05-15 15:44:00,ARSON,NORTHERN,500 Block of LARKIN ST,-122.417367329727,37.7828626236813 +224546,2012-05-15 09:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +224551,2012-05-15 09:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +224606,2012-05-15 02:25:00,DRUNKENNESS,CENTRAL,BUSH ST / STOCKTON ST,-122.407152172242,37.7903655795398 +224615,2012-05-15 01:30:00,DRUNKENNESS,TENDERLOIN,0 Block of GRANT AV,-122.404997416043,37.7871963336348 +224687,2012-05-14 21:27:00,ARSON,NORTHERN,TURK ST / GOUGH ST,-122.423918786916,37.7815338127818 +224696,2012-05-14 20:55:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +224949,2012-05-14 04:00:00,ARSON,RICHMOND,5300 Block of GEARY BL,-122.476719025527,37.7805797943167 +224976,2012-05-14 00:15:00,DRUNKENNESS,SOUTHERN,1000 Block of HOWARD ST,-122.407376438306,37.779489776176 +225168,2012-05-06 14:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +225188,2012-05-06 13:15:00,RUNAWAY,BAYVIEW,700 Block of KIRKWOOD AV,-122.374019331833,37.729203356539 +225340,2012-05-06 00:35:00,DRUNKENNESS,SOUTHERN,6TH ST / FOLSOM ST,-122.405618998022,37.7785045190918 +225488,2012-05-05 18:44:00,DRUNKENNESS,MISSION,19TH ST / CHURCH ST,-122.428203997155,37.759691691831 +225621,2012-05-05 12:20:00,KIDNAPPING,MISSION,ALAMEDA ST / BRYANT ST,-122.410731476956,37.7681785365421 +225718,2012-05-05 02:39:00,RUNAWAY,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +225792,2012-05-04 22:50:00,KIDNAPPING,TENDERLOIN,100 Block of MCALLISTER ST,-122.41452262258,37.7808752665663 +225841,2012-05-04 21:12:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406831571685,37.7977891634087 +225954,2012-05-04 16:30:00,RUNAWAY,MISSION,700 Block of SOUTH VAN NESS AV,-122.417169894749,37.7611477647601 +226067,2012-05-04 11:45:00,DRUNKENNESS,NORTHERN,0 Block of IVY ST,-122.418951160054,37.7779227182608 +226224,2012-05-03 23:08:00,ARSON,BAYVIEW,800 Block of GILMAN AV,-122.386528277818,37.7173949536041 +226484,2012-05-03 10:45:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +226627,2012-05-02 21:45:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +226751,2012-05-02 16:30:00,KIDNAPPING,BAYVIEW,0 Block of WATCHMAN WY,-122.395251009931,37.75534435195679 +226918,2012-05-02 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +227044,2012-05-01 18:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +227182,2012-05-01 12:10:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +227198,2012-05-01 12:00:00,KIDNAPPING,PARK,900 Block of ASHBURY ST,-122.446234261409,37.7662094878819 +227311,2012-05-01 05:15:00,KIDNAPPING,PARK,TURK ST / DIVISADERO ST,-122.438741737368,37.7796593150258 +227404,2012-04-30 21:35:00,KIDNAPPING,NORTHERN,1900 Block of LOMBARD ST,-122.433622196421,37.800270294431 +227412,2012-04-30 21:30:00,ARSON,MISSION,VALENCIA ST / 18TH ST,-122.42158168137,37.7617007179518 +227693,2012-04-30 07:45:00,RUNAWAY,MISSION,100 Block of CAPP ST,-122.418549940195,37.7642837095036 +227727,2012-04-30 02:05:00,ARSON,RICHMOND,400 Block of 20TH AV,-122.479241431478,37.779356245781706 +227983,2012-04-22 11:45:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.418587172219,37.75301865374461 +227997,2012-04-22 10:55:00,KIDNAPPING,TARAVAL,100 Block of FARALLONES ST,-122.457576302609,37.7140109101974 +228056,2012-04-22 02:10:00,DRUNKENNESS,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +228069,2012-04-22 01:45:00,DRUNKENNESS,CENTRAL,600 Block of SUTTER ST,-122.411068869703,37.78885570426971 +228172,2012-04-21 21:09:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +228215,2012-04-21 19:35:00,DRUNKENNESS,CENTRAL,600 Block of FILBERT ST,-122.410220142966,37.8013225692058 +228294,2012-04-21 16:00:00,KIDNAPPING,INGLESIDE,GENEVA AV / MISSION ST,-122.441018108888,37.7164586830811 +228339,2012-04-21 13:30:00,KIDNAPPING,MISSION,3000 Block of 16TH ST,-122.420080983505,37.7650815376682 +228453,2012-04-21 03:27:00,DRUNKENNESS,NORTHERN,POLK ST / PACIFIC AV,-122.421585630416,37.795026231835706 +228464,2012-04-21 02:50:00,DRUNKENNESS,RICHMOND,1800 Block of CABRILLO ST,-122.478450170537,37.7747599131777 +228500,2012-04-21 00:15:00,KIDNAPPING,TARAVAL,100 Block of FARALLONES ST,-122.457576302609,37.7140109101974 +228768,2012-04-20 13:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +228823,2012-04-20 10:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +228860,2012-04-20 08:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +228864,2012-04-20 07:45:00,RUNAWAY,MISSION,100 Block of LILAC ST,-122.41757648018,37.74986342403921 +228876,2012-04-20 07:00:00,RUNAWAY,CENTRAL,600 Block of FRANCISCO ST,-122.41557882881,37.8044706948304 +228888,2012-04-20 04:00:00,DRUNKENNESS,MISSION,3600 Block of 17TH ST,-122.426726298223,37.7630551847744 +228890,2012-04-20 03:30:00,KIDNAPPING,MISSION,2300 Block of FOLSOM ST,-122.41469551481,37.7596861764245 +228899,2012-04-20 03:03:00,DRUNKENNESS,PARK,600 Block of DUBOCE AV,-122.434249624241,37.7692002895738 +228921,2012-04-20 00:41:00,KIDNAPPING,BAYVIEW,DAKOTA ST / 25TH ST,-122.394588601096,37.7524273767291 +228964,2012-04-19 21:55:00,DRUNKENNESS,PARK,300 Block of LAGUNAHONDA BL,-122.45868018978202,37.7481554692332 +229001,2012-04-19 20:10:00,DRUNKENNESS,MISSION,100 Block of HARTFORD ST,-122.433891506792,37.7601358672289 +229159,2012-04-19 13:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +229216,2012-04-19 10:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +229304,2012-04-19 01:30:00,KIDNAPPING,TENDERLOIN,100 Block of ELLIS ST,-122.408270724034,37.78549414241861 +229485,2012-04-18 16:29:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +229581,2012-04-18 11:30:00,DRUNKENNESS,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +229633,2012-04-18 07:30:00,RUNAWAY,TARAVAL,1000 Block of CAPITOL AV,-122.459270528471,37.720948065503705 +229651,2012-04-18 06:00:00,DRUNKENNESS,INGLESIDE,3200 Block of MISSION ST,-122.42039487496,37.744688222803 +229680,2012-04-18 01:52:00,DRUNKENNESS,TARAVAL,32ND AV / ORTEGA ST,-122.490267891055,37.7517568428242 +229747,2012-04-17 21:00:00,RUNAWAY,NORTHERN,900 Block of BUCHANAN ST,-122.42845383696002,37.7785841286585 +229949,2012-04-17 11:41:00,ARSON,TARAVAL,LAKE MERCED BL / SUNSET BL,-122.493468495006,37.7295950708457 +230022,2012-04-17 08:23:00,RUNAWAY,RICHMOND,500 Block of ARGUELLO BL,-122.458724812805,37.780279529661705 +230057,2012-04-17 04:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +230059,2012-04-17 04:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +230178,2012-04-16 18:26:00,KIDNAPPING,SOUTHERN,400 Block of BERRY ST,-122.3982226939,37.772016123181295 +230338,2012-04-16 11:00:00,ARSON,TARAVAL,1300 Block of 43RD AV,-122.502708098898,37.7614820910625 +230425,2012-04-16 02:07:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +230426,2012-04-16 02:00:00,DRUNKENNESS,CENTRAL,800 Block of BUSH ST,-122.411259228464,37.789789421954495 +230503,2012-04-08 21:00:00,ARSON,MISSION,1600 Block of BRYANT ST,-122.410478069487,37.7662463209137 +230510,2012-04-08 20:37:00,DRUNKENNESS,PARK,ASHBURY ST / HAIGHT ST,-122.446933310975,37.77000619883579 +230515,2012-04-08 20:30:00,KIDNAPPING,TARAVAL,2600 Block of 39TH AV,-122.49685717027,37.73742451856079 +230520,2012-04-08 20:15:00,DRUNKENNESS,SOUTHERN,9TH ST / HOWARD ST,-122.413163134276,37.7749926445385 +230546,2012-04-08 18:00:00,RUNAWAY,INGLESIDE,400 Block of WILDE AV,-122.406287070538,37.7176076816075 +230732,2012-04-08 02:55:00,ARSON,BAYVIEW,1100 Block of IOWA ST,-122.391662231776,37.7519529830493 +231095,2012-04-07 02:21:00,KIDNAPPING,INGLESIDE,0 Block of CAMBRIDGE ST,-122.421329610771,37.7312601795206 +231155,2012-04-06 23:50:00,DRUNKENNESS,SOUTHERN,1400 Block of FOLSOM ST,-122.413674391078,37.7720641658687 +231472,2012-04-06 02:06:00,DRUNKENNESS,TENDERLOIN,LEAVENWORTH ST / ELLIS ST,-122.414433155063,37.7846576329256 +231597,2012-04-05 19:17:00,DRUNKENNESS,TARAVAL,ORIZABA AV / RANDOLPH ST,-122.462601335079,37.7143072754952 +232028,2012-04-04 15:38:00,ARSON,INGLESIDE,300 Block of SENECA AV,-122.445147338302,37.7214113471419 +232323,2012-04-03 22:00:00,DRUNKENNESS,BAYVIEW,1600 Block of 17TH ST,-122.400162362987,37.7649810093866 +232813,2012-04-02 15:10:00,KIDNAPPING,TENDERLOIN,EDDY ST / JONES ST,-122.412597377187,37.783932027727296 +232998,2012-03-25 23:30:00,DRUNKENNESS,CENTRAL,100 Block of MONTGOMERY ST,-122.40221854007,37.7905215969161 +233011,2012-03-25 23:00:00,KIDNAPPING,INGLESIDE,100 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +233183,2012-03-25 13:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +233298,2012-03-25 01:24:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +233429,2012-03-24 19:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +233531,2012-03-24 13:20:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.407474439624,37.779911669335 +233635,2012-03-24 03:33:00,DRUNKENNESS,NORTHERN,2000 Block of BUSH ST,-122.431017557027,37.7873880712241 +233852,2012-03-23 19:15:00,ARSON,NORTHERN,100 Block of LARKIN ST,-122.416744345292,37.7791213111608 +234419,2012-03-22 11:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +234505,2012-03-22 02:20:00,KIDNAPPING,BAYVIEW,100 Block of KISKA RD,-122.378494173975,37.7304096808335 +234535,2012-03-21 23:37:00,DRUNKENNESS,MISSION,CAPP ST / 20TH ST,-122.41796448376002,37.7586968166489 +234804,2012-03-21 12:00:00,ARSON,INGLESIDE,0 Block of OTSEGO AV,-122.439151333605,37.726550783796704 +234923,2012-03-21 01:25:00,DRUNKENNESS,RICHMOND,3900 Block of GEARY BL,-122.461620169101,37.7812597610597 +234959,2012-03-20 23:00:00,ARSON,PARK,400 Block of CENTRAL AV,-122.44424387142,37.7736984221891 +235054,2012-03-20 18:13:00,KIDNAPPING,MISSION,1200 Block of POTRERO AV,-122.406345654667,37.75234836541609 +235302,2012-03-20 00:18:00,DRUNKENNESS,SOUTHERN,0 Block of 5TH ST,-122.407805288642,37.7837068386088 +235394,2012-03-19 19:36:00,KIDNAPPING,MISSION,2700 Block of MISSION ST,-122.418587172219,37.75301865374461 +235798,2012-03-11 17:45:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +235949,2012-03-11 10:00:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +236113,2012-03-10 22:19:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 3RD ST,-122.400473580152,37.7850290611875 +236187,2012-03-10 19:14:00,DRUNKENNESS,BAYVIEW,4500 Block of 3RD ST,-122.389877486888,37.7367416338184 +236205,2012-03-10 18:37:00,DRUNKENNESS,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +236240,2012-03-10 17:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +236414,2012-03-10 04:01:00,DRUNKENNESS,PARK,1500 Block of 7TH AV,-122.46391453597602,37.75945081469821 +236422,2012-03-10 03:20:00,DRUNKENNESS,RICHMOND,4100 Block of GEARY BL,-122.463744066947,37.7809170537256 +236424,2012-03-10 03:20:00,DRUNKENNESS,MISSION,2500 Block of MISSION ST,-122.418753848152,37.7562250119744 +236443,2012-03-10 01:54:00,DRUNKENNESS,CENTRAL,700 Block of TAYLOR ST,-122.411914264728,37.789291446803006 +236490,2012-03-09 22:55:00,DRUNKENNESS,CENTRAL,2800 Block of LEAVENWORTH ST,-122.419067224379,37.8073339305952 +236500,2012-03-09 22:43:00,KIDNAPPING,INGLESIDE,LONDON ST / AMAZON AV,-122.439641069255,37.7169593366497 +236782,2012-03-09 11:00:00,KIDNAPPING,INGLESIDE,400 Block of GENEVA AV,-122.447238351075,37.7208353638899 +236833,2012-03-09 07:45:00,RUNAWAY,BAYVIEW,1300 Block of GILMAN AV,-122.394646250335,37.7219920197814 +236835,2012-03-09 07:45:00,RUNAWAY,BAYVIEW,1300 Block of GILMAN AV,-122.394646250335,37.7219920197814 +236837,2012-03-09 07:45:00,RUNAWAY,BAYVIEW,1300 Block of GILMAN AV,-122.394646250335,37.7219920197814 +236935,2012-03-08 21:00:00,KIDNAPPING,NORTHERN,0 Block of VANNESS AV,-122.419234662317,37.7757784176924 +237011,2012-03-08 17:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +237029,2012-03-08 16:45:00,KIDNAPPING,TARAVAL,300 Block of SANBENITO WY,-122.467545382537,37.7297115454962 +237147,2012-03-08 11:30:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.419520367886,37.764228935718 +237156,2012-03-08 11:10:00,DRUNKENNESS,TENDERLOIN,TURK ST / HYDE ST,-122.415694922134,37.7825851968467 +237170,2012-03-08 10:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +237243,2012-03-08 03:00:00,ARSON,SOUTHERN,500 Block of JESSIE ST,-122.409678806778,37.780978048463 +237268,2012-03-08 00:01:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +237319,2012-03-07 22:00:00,KIDNAPPING,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416269089153,37.7531590161083 +237430,2012-03-07 16:30:00,RUNAWAY,BAYVIEW,1400 Block of HAWES ST,-122.382916662508,37.7270737337453 +237599,2012-03-07 02:25:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419212198636,37.7610244167023 +237606,2012-03-07 01:02:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406460643507,37.7979466732983 +237638,2012-03-06 23:00:00,ARSON,TARAVAL,600 Block of IRVING ST,-122.46471492926202,37.76405203136579 +237779,2012-03-06 15:36:00,KIDNAPPING,SOUTHERN,MARKET ST / VANNESS AV,-122.419257894814,37.7751462916539 +237816,2012-03-06 13:00:00,KIDNAPPING,RICHMOND,400 Block of ARGUELLO BL,-122.458857560736,37.78220007231379 +237879,2012-03-06 08:45:00,RUNAWAY,BAYVIEW,0 Block of KAREN CT,-122.4068026167,37.7234814213797 +237910,2012-03-06 05:45:00,RUNAWAY,BAYVIEW,100 Block of WAYLAND ST,-122.403589550497,37.7262486459366 +237967,2012-03-05 21:45:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +238295,2012-03-05 04:25:00,DRUNKENNESS,MISSION,100 Block of CAPP ST,-122.418549940195,37.7642837095036 +238379,2012-02-26 19:28:00,ARSON,BAYVIEW,1100 Block of THOMAS AV,-122.3829325908,37.7256050225653 +238468,2012-02-26 15:00:00,ARSON,TENDERLOIN,0 Block of GROVE ST,-122.415642487855,37.7788323158792 +238482,2012-02-26 14:00:00,DRUNKENNESS,SOUTHERN,400 Block of 6TH ST,-122.402898362255,37.7764157522282 +238564,2012-02-26 07:35:00,ARSON,MISSION,3000 Block of 16TH ST,-122.420762936447,37.7650403422958 +238570,2012-02-26 07:08:00,ARSON,BAYVIEW,1200 Block of FAIRFAX AV,-122.382542136125,37.7386155130251 +238604,2012-02-26 02:26:00,ARSON,MISSION,3100 Block of 16TH ST,-122.423622537404,37.7647573853335 +238711,2012-02-25 21:55:00,KIDNAPPING,SOUTHERN,300 Block of MAIN ST,-122.391024911564,37.7887786674397 +239060,2012-02-25 00:26:00,DRUNKENNESS,BAYVIEW,SAN BRUNO AV / WOOLSEY ST,-122.402603565418,37.7252355695069 +239070,2012-02-25 00:07:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / LEAVENWORTH ST,-122.414433155063,37.7846576329256 +239082,2012-02-24 23:54:00,DRUNKENNESS,PARK,700 Block of COLE ST,-122.450496476309,37.7681201154213 +239133,2012-02-24 21:59:00,DRUNKENNESS,MISSION,16TH ST / HOFF ST,-122.420580440111,37.7649968622937 +239140,2012-02-24 21:36:00,DRUNKENNESS,SOUTHERN,800 Block of MISSION ST,-122.405395493939,37.7835100715421 +239166,2012-02-24 20:30:00,ARSON,RICHMOND,2900 Block of GEARY BL,-122.450591365057,37.78192652036979 +239216,2012-02-24 18:45:00,RUNAWAY,TARAVAL,1300 Block of 24TH AV,-122.482346982716,37.7623803108896 +239237,2012-02-24 18:00:00,KIDNAPPING,NORTHERN,2200 Block of BEACH ST,-122.446095012633,37.8033321109404 +239319,2012-02-24 14:00:00,ARSON,RICHMOND,600 Block of 48TH AV,-122.509261288111,37.776547938743 +239327,2012-02-24 13:56:00,DRUNKENNESS,INGLESIDE,MISSION ST / NORTON ST,-122.434870543645,37.724589160901 +239430,2012-02-24 08:00:00,ARSON,SOUTHERN,0 Block of 9TH ST,-122.415064887666,37.7764354063246 +239488,2012-02-24 00:15:00,KIDNAPPING,MISSION,300 Block of SAN JOSE AV,-122.421406672969,37.7494022896942 +239555,2012-02-23 21:01:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +239589,2012-02-23 19:20:00,KIDNAPPING,CENTRAL,600 Block of WASHINGTON ST,-122.404163588243,37.795481553193895 +239780,2012-02-23 10:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +239782,2012-02-23 10:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +239803,2012-02-23 09:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +239810,2012-02-23 09:15:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +239863,2012-02-23 04:20:00,KIDNAPPING,NORTHERN,MARKET ST / LARKIN ST,-122.416293820935,37.777493677735 +239943,2012-02-22 21:56:00,ARSON,CENTRAL,600 Block of BUSH ST,-122.407689581502,37.7902423892742 +240046,2012-02-22 17:30:00,DRUNKENNESS,SOUTHERN,1100 Block of MISSION ST,-122.412736707425,37.7777124404316 +240253,2012-02-22 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +240356,2012-02-21 22:20:00,DRUNKENNESS,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +240620,2012-02-21 08:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +240671,2012-02-21 02:30:00,KIDNAPPING,MISSION,2200 Block of MARKET ST,-122.431957685196,37.7649357189679 +240682,2012-02-21 01:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +240685,2012-02-21 01:20:00,DRUNKENNESS,TENDERLOIN,600 Block of OFARRELL ST,-122.415972165351,37.78535651423429 +240932,2012-02-20 09:00:00,KIDNAPPING,SOUTHERN,0 Block of 9TH ST,-122.415064887666,37.7764354063246 +240934,2012-02-20 09:00:00,KIDNAPPING,SOUTHERN,0 Block of 9TH ST,-122.415064887666,37.7764354063246 +240979,2012-02-20 02:39:00,DRUNKENNESS,NORTHERN,LAGUNA ST / HAYES ST,-122.426265334521,37.776463142914295 +241015,2012-02-12 22:35:00,ARSON,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +241024,2012-02-12 22:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +241029,2012-02-12 21:40:00,KIDNAPPING,MISSION,MISSION ST / 22ND ST,-122.418748733523,37.755437187509706 +241066,2012-02-12 19:45:00,DRUNKENNESS,INGLESIDE,0 Block of 29TH ST,-122.421439883187,37.7440633473289 +241276,2012-02-12 09:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +241377,2012-02-12 00:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +241450,2012-02-11 21:30:00,KIDNAPPING,CENTRAL,800 Block of GEARY ST,-122.417295322526,37.7862578545865 +241486,2012-02-11 19:30:00,KIDNAPPING,PARK,700 Block of STANYAN ST,-122.453326877728,37.7677678622499 +241533,2012-02-11 17:21:00,KIDNAPPING,SOUTHERN,SHIPLEY ST / 5TH ST,-122.402842748428,37.7798294192767 +241534,2012-02-11 17:16:00,RUNAWAY,MISSION,1000 Block of CAPP ST,-122.417192395984,37.7498863746378 +241558,2012-02-11 16:28:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +241670,2012-02-11 10:40:00,KIDNAPPING,NORTHERN,1600 Block of FILLMORE ST,-122.432932201774,37.7847697667563 +241734,2012-02-11 05:19:00,KIDNAPPING,CENTRAL,500 Block of BROADWAY ST,-122.406861140307,37.7978967044381 +241756,2012-02-11 02:40:00,DRUNKENNESS,TARAVAL,300 Block of RANDOLPH ST,-122.465757150563,37.714228536469896 +241813,2012-02-10 22:45:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +241903,2012-02-10 18:15:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +241915,2012-02-10 18:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +242011,2012-02-10 14:00:00,RUNAWAY,RICHMOND,4400 Block of ANZA ST,-122.495859130475,37.77770686496649 +242075,2012-02-10 10:00:00,KIDNAPPING,CENTRAL,0 Block of NOBHILL CR,-122.410973853956,37.7914478545467 +242094,2012-02-10 09:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +242116,2012-02-10 07:30:00,RUNAWAY,BAYVIEW,SILVER AV / SCOTIA AV,-122.402203896504,37.7344826848394 +242132,2012-02-10 03:51:00,DRUNKENNESS,MISSION,3100 Block of 21ST ST,-122.418361693032,37.757122938493296 +242314,2012-02-09 17:15:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +242535,2012-02-09 01:39:00,KIDNAPPING,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +242773,2012-02-08 14:02:00,DRUNKENNESS,MISSION,MISSION ST / 26TH ST,-122.418137290501,37.7490413093633 +242922,2012-02-08 02:35:00,DRUNKENNESS,TENDERLOIN,GEARY ST / LEAVENWORTH ST,-122.414809966357,37.7865194111614 +242955,2012-02-07 23:10:00,DRUNKENNESS,CENTRAL,600 Block of GEARY ST,-122.413988841812,37.7865685406761 +243013,2012-02-07 20:05:00,ARSON,TARAVAL,1200 Block of CAPITOL AV,-122.459142275021,37.7241013993751 +243302,2012-02-07 01:30:00,KIDNAPPING,NORTHERN,1500 Block of VANNESS AV,-122.422062730264,37.789920001484106 +243358,2012-02-06 20:44:00,DRUNKENNESS,SOUTHERN,6TH ST / STEVENSON ST,-122.409696355558,37.7817540588712 +243601,2012-02-06 10:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +243961,2012-01-29 09:29:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +244085,2012-01-28 23:11:00,DRUNKENNESS,TENDERLOIN,500 Block of EDDY ST,-122.416710733848,37.7833570390935 +244168,2012-01-28 19:40:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +244198,2012-01-28 18:30:00,RUNAWAY,MISSION,2700 Block of MISSION ST,-122.418587172219,37.75301865374461 +244288,2012-01-28 15:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +244351,2012-01-28 11:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +244436,2012-01-28 02:30:00,KIDNAPPING,CENTRAL,JONES ST / VALLEJO ST,-122.415386922809,37.7977503747336 +244454,2012-01-28 00:51:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +244486,2012-01-27 23:50:00,DRUNKENNESS,INGLESIDE,4500 Block of MISSION ST,-122.43455277287,37.7249007364814 +244704,2012-01-27 15:10:00,KIDNAPPING,INGLESIDE,1600 Block of CHURCH ST,-122.426777257654,37.7440943615702 +245141,2012-01-26 13:00:00,ARSON,TARAVAL,2200 Block of 14TH AV,-122.470359608661,37.7460753397163 +245276,2012-01-26 02:00:00,KIDNAPPING,TARAVAL,500 Block of RAMSELL ST,-122.466197131288,37.7206928290134 +245336,2012-01-25 20:43:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +245612,2012-01-25 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +245648,2012-01-25 10:30:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +245821,2012-01-24 20:00:00,RUNAWAY,MISSION,2100 Block of MISSION ST,-122.419331147814,37.76226433574229 +245840,2012-01-24 19:30:00,RUNAWAY,MISSION,2600 Block of MISSION ST,-122.41860030588998,37.7546255872838 +245854,2012-01-24 18:50:00,DRUNKENNESS,TARAVAL,3500 Block of 19TH AV,-122.474829475772,37.72397582348211 +245872,2012-01-24 18:11:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +246085,2012-01-24 01:30:00,KIDNAPPING,CENTRAL,200 Block of BEACH ST,-122.413178958845,37.8076387530515 +246124,2012-01-23 22:27:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +246196,2012-01-23 19:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +246219,2012-01-23 17:49:00,KIDNAPPING,RICHMOND,800 Block of PARKPRESIDIO BL,-122.475838988047,37.7725621127204 +246401,2012-01-23 08:00:00,ARSON,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +246436,2012-01-23 01:15:00,DRUNKENNESS,PARK,IRVING ST / 2ND AV,-122.458816601708,37.7643648855485 +246456,2012-01-15 23:05:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +246550,2012-01-15 17:15:00,KIDNAPPING,CENTRAL,400 Block of CLAY ST,-122.400922761049,37.794959803128 +246561,2012-01-15 16:45:00,KIDNAPPING,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +246712,2012-01-15 07:00:00,KIDNAPPING,PARK,1800 Block of GOLDEN GATE AV,-122.441066374991,37.7784577020073 +246723,2012-01-15 05:00:00,ARSON,MISSION,3600 Block of CESAR CHAVEZ ST,-122.421943374355,37.7479358960534 +246792,2012-01-15 00:01:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +246803,2012-01-14 23:29:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +246871,2012-01-14 20:17:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +246949,2012-01-14 16:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +246970,2012-01-14 15:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +246976,2012-01-14 15:15:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +246998,2012-01-14 14:20:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +247017,2012-01-14 13:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +247120,2012-01-14 03:15:00,ARSON,BAYVIEW,700 Block of MISSOURI ST,-122.395771897062,37.7572927810101 +247143,2012-01-14 01:54:00,ARSON,PARK,OAK ST / SCOTT ST,-122.435753024583,37.7733438011236 +247152,2012-01-14 01:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +247163,2012-01-14 00:15:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +247182,2012-01-13 23:17:00,DRUNKENNESS,BAYVIEW,3RD ST / LASALLE AV,-122.389865610332,37.73716994462029 +247218,2012-01-13 22:12:00,ARSON,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +247259,2012-01-13 20:20:00,ARSON,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +247388,2012-01-13 15:15:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +247396,2012-01-13 15:00:00,KIDNAPPING,TARAVAL,100 Block of DESOTO ST,-122.465199103569,37.7242836537748 +247600,2012-01-12 23:53:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +247658,2012-01-12 20:40:00,DRUNKENNESS,INGLESIDE,0 Block of DESMOND ST,-122.405071542049,37.7111647275178 +247794,2012-01-12 15:30:00,KIDNAPPING,TARAVAL,400 Block of JUDAH ST,-122.46673371323,37.762238789972 +247802,2012-01-12 15:10:00,DRUNKENNESS,TENDERLOIN,100 Block of MCALLISTER ST,-122.41452262258,37.7808752665663 +247960,2012-01-12 08:00:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +248002,2012-01-12 01:45:00,DRUNKENNESS,NORTHERN,3000 Block of VANNESS AV,-122.425186870939,37.803662940810106 +248117,2012-01-11 19:47:00,DRUNKENNESS,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +248229,2012-01-11 15:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +248311,2012-01-11 11:02:00,KIDNAPPING,INGLESIDE,400 Block of RAYMOND AV,-122.412457953057,37.7147347356846 +248388,2012-01-11 05:00:00,KIDNAPPING,BAYVIEW,1300 Block of REVERE AV,-122.385465040129,37.72906911206979 +248413,2012-01-11 01:40:00,DRUNKENNESS,CENTRAL,300 Block of GEARY ST,-122.409055191364,37.7871979591062 +248442,2012-01-10 23:11:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +248468,2012-01-10 21:29:00,DRUNKENNESS,TARAVAL,3300 Block of JUDAH ST,-122.497902983702,37.7608339792543 +248498,2012-01-10 19:55:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +248499,2012-01-10 19:55:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +248517,2012-01-10 19:11:00,DRUNKENNESS,TARAVAL,2100 Block of 20TH AV,-122.47701842881,37.7476504475944 +248542,2012-01-10 18:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +248673,2012-01-10 12:25:00,KIDNAPPING,TENDERLOIN,MASON ST / ELLIS ST,-122.409499861107,37.7852842684318 +248842,2012-01-09 22:57:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436194484896,37.7227270383576 +248916,2012-01-09 18:30:00,RUNAWAY,SOUTHERN,6TH ST / MARKET ST,-122.41029351969,37.7822305870036 +248934,2012-01-09 17:47:00,DRUNKENNESS,NORTHERN,OFARRELL ST / FILLMORE ST,-122.432706975892,37.7832909416362 +249114,2012-01-09 04:10:00,ARSON,MISSION,1100 Block of POTRERO AV,-122.406463425003,37.753636505486 +249124,2012-01-09 02:30:00,ARSON,BAYVIEW,700 Block of JERROLD AV,-122.373456171525,37.7296796672727 +249218,2012-01-01 18:30:00,RUNAWAY,CENTRAL,2800 Block of TAYLOR ST,-122.415923448242,37.8085905137102 +249220,2012-01-01 18:30:00,RUNAWAY,CENTRAL,2800 Block of TAYLOR ST,-122.415923448242,37.8085905137102 +249321,2012-01-01 13:00:00,RUNAWAY,RICHMOND,400 Block of 8TH AV,-122.466425260006,37.779937612642 +249427,2012-01-01 08:00:00,DRUNKENNESS,CENTRAL,200 Block of SUTTER ST,-122.404013943546,37.7897518225049 +249498,2012-01-01 02:33:00,KIDNAPPING,TENDERLOIN,100 Block of POWELL ST,-122.407877787733,37.785968007677496 +249528,2012-01-01 01:57:00,DRUNKENNESS,CENTRAL,BROADWAY ST / MONTGOMERY ST,-122.403864541976,37.798222643742704 +249557,2012-01-01 01:00:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +249838,2011-12-31 17:30:00,RUNAWAY,CENTRAL,100 Block of BAY ST,-122.409920476881,37.8061326955531 +249839,2011-12-31 17:30:00,RUNAWAY,CENTRAL,100 Block of BAY ST,-122.409920476881,37.8061326955531 +249840,2011-12-31 17:30:00,RUNAWAY,CENTRAL,100 Block of BAY ST,-122.409920476881,37.8061326955531 +249841,2011-12-31 17:30:00,RUNAWAY,CENTRAL,100 Block of BAY ST,-122.409920476881,37.8061326955531 +249920,2011-12-31 14:00:00,KIDNAPPING,SOUTHERN,7TH ST / MINNA ST,-122.410405602135,37.778784148603286 +249974,2011-12-31 10:47:00,DRUNKENNESS,TENDERLOIN,0 Block of MASON ST,-122.409268441444,37.7837998723601 +250038,2011-12-31 02:57:00,DRUNKENNESS,INGLESIDE,700 Block of HURON AV,-122.450450654907,37.7114481484715 +250081,2011-12-31 00:34:00,DRUNKENNESS,SOUTHERN,200 Block of FOLSOM ST,-122.392347671978,37.7890603555993 +250213,2011-12-30 18:13:00,KIDNAPPING,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +250415,2011-12-30 06:45:00,KIDNAPPING,NORTHERN,1800 Block of CHESTNUT ST,-122.43378481370002,37.801074930846895 +250502,2011-12-29 22:17:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +250504,2011-12-29 22:17:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +250592,2011-12-29 17:02:00,DRUNKENNESS,BAYVIEW,1300 Block of 18TH ST,-122.396048084292,37.76255346111429 +250853,2011-12-28 21:44:00,DRUNKENNESS,TENDERLOIN,400 Block of TAYLOR ST,-122.411354159199,37.786485697765706 +250961,2011-12-28 16:42:00,KIDNAPPING,SOUTHERN,200 Block of 9TH ST,-122.412845031536,37.7748170645635 +250982,2011-12-28 15:50:00,DRUNKENNESS,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +251059,2011-12-28 12:00:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +251149,2011-12-28 02:55:00,DRUNKENNESS,MISSION,1200 Block of VALENCIA ST,-122.420806049169,37.7528840217529 +251249,2011-12-27 20:01:00,DRUNKENNESS,SOUTHERN,1200 Block of HOWARD ST,-122.412447373124,37.775633673443 +251262,2011-12-27 19:28:00,RUNAWAY,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +251546,2011-12-26 21:45:00,DRUNKENNESS,TENDERLOIN,MASON ST / ELLIS ST,-122.409499861107,37.7852842684318 +251552,2011-12-26 21:15:00,DRUNKENNESS,SOUTHERN,2ND ST / KING ST,-122.389595283252,37.7798611974198 +251566,2011-12-26 20:13:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +251598,2011-12-26 18:30:00,ARSON,BAYVIEW,700 Block of MENDELL ST,-122.386629461402,37.73863297497221 +251614,2011-12-26 17:34:00,DRUNKENNESS,TARAVAL,2100 Block of 14TH AV,-122.470497739197,37.7479299029349 +251954,2011-12-18 17:00:00,DRUNKENNESS,SOUTHERN,900 Block of FOLSOM ST,-122.40509433812,37.7789940710712 +251957,2011-12-18 17:00:00,DRUNKENNESS,CENTRAL,300 Block of GEARY ST,-122.409055191364,37.7871979591062 +251965,2011-12-18 16:34:00,DRUNKENNESS,PARK,OAK ST / SCOTT ST,-122.435753024583,37.7733438011236 +252091,2011-12-18 03:49:00,DRUNKENNESS,SOUTHERN,700 Block of 4TH ST,-122.394548293028,37.7766651941599 +252170,2011-12-17 22:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +252242,2011-12-17 19:08:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +252265,2011-12-17 17:30:00,KIDNAPPING,INGLESIDE,300 Block of SURREY ST,-122.436933566027,37.735854062434896 +252315,2011-12-17 14:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +252373,2011-12-17 11:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +252383,2011-12-17 10:21:00,ARSON,MISSION,100 Block of GRANDVIEW AV,-122.440411847156,37.75544560646609 +252400,2011-12-17 09:00:00,KIDNAPPING,BAYVIEW,0 Block of MERCURY ST,-122.40150642706,37.731922624023206 +252432,2011-12-17 04:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +252439,2011-12-17 04:00:00,ARSON,CENTRAL,0 Block of PLEASANT ST,-122.413571582846,37.7929424174961 +252546,2011-12-16 22:30:00,DRUNKENNESS,NORTHERN,1000 Block of FRANKLIN ST,-122.422723432064,37.7843237549534 +252726,2011-12-16 16:54:00,KIDNAPPING,RICHMOND,5500 Block of GEARY BL,-122.478843220108,37.7802357423473 +252870,2011-12-16 08:30:00,RUNAWAY,TARAVAL,200 Block of FARALLONES ST,-122.460846769263,37.7140971125797 +252937,2011-12-16 00:45:00,DRUNKENNESS,TARAVAL,2300 Block of 19TH AV,-122.475834301218,37.743962321829 +252966,2011-12-15 23:41:00,DRUNKENNESS,SOUTHERN,300 Block of MISSION ST,-122.396211154038,37.790761361966 +253157,2011-12-15 14:00:00,RUNAWAY,PARK,1400 Block of SCOTT ST,-122.437674432179,37.7832091367301 +253201,2011-12-15 11:30:00,KIDNAPPING,PARK,0 Block of COLE ST,-122.451192216536,37.7747209503169 +253342,2011-12-14 23:45:00,KIDNAPPING,MISSION,22ND ST / MISSION ST,-122.418748733523,37.755437187509706 +253606,2011-12-14 12:10:00,RUNAWAY,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +253737,2011-12-13 22:00:00,KIDNAPPING,SOUTHERN,800 Block of MISSION ST,-122.404636264759,37.7842645474624 +253848,2011-12-13 15:48:00,DRUNKENNESS,MISSION,400 Block of CHURCH ST,-122.4286109134,37.7632288973036 +254006,2011-12-13 05:56:00,DRUNKENNESS,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +254145,2011-12-12 18:42:00,DRUNKENNESS,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +254285,2011-12-12 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +254347,2011-12-12 06:50:00,KIDNAPPING,INGLESIDE,100 Block of LOEHR ST,-122.413546096394,37.7125799991039 +254366,2011-12-12 01:50:00,DRUNKENNESS,TARAVAL,3600 Block of TARAVAL ST,-122.505162046753,37.741685142203394 +254371,2011-12-12 01:00:00,ARSON,BAYVIEW,1200 Block of KANSAS ST,-122.402564611233,37.7538576956325 +254388,2011-12-04 23:52:00,DRUNKENNESS,SOUTHERN,0 Block of 1ST ST,-122.398918091291,37.7907551748083 +254529,2011-12-04 15:43:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +254560,2011-12-04 14:25:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +254593,2011-12-04 12:28:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +254608,2011-12-04 11:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +254619,2011-12-04 11:00:00,KIDNAPPING,BAYVIEW,OAKDALE AV / BAY SHORE BL,-122.405242467114,37.7430506903112 +254704,2011-12-04 02:35:00,KIDNAPPING,CENTRAL,300 Block of BROADWAY ST,-122.40367998233,37.7981913307058 +254730,2011-12-04 01:00:00,KIDNAPPING,SOUTHERN,700 Block of HARRISON ST,-122.399045655841,37.7813197113532 +254766,2011-12-03 23:25:00,KIDNAPPING,BAYVIEW,100 Block of BURROWS ST,-122.404583135695,37.7286500167755 +254886,2011-12-03 17:10:00,DRUNKENNESS,SOUTHERN,600 Block of MARKET ST,-122.403070886779,37.7877867423496 +254911,2011-12-03 15:35:00,DRUNKENNESS,INGLESIDE,DOLORES ST / 30TH ST,-122.424233082445,37.742236668262 +255003,2011-12-03 08:00:00,RUNAWAY,SOUTHERN,400 Block of 4TH ST,-122.398765415674,37.7801898330667 +255044,2011-12-03 02:00:00,KIDNAPPING,MISSION,3000 Block of 16TH ST,-122.420080983505,37.7650815376682 +255056,2011-12-03 01:43:00,DRUNKENNESS,RICHMOND,3800 Block of GEARY BL,-122.46055149012,37.7813140417196 +255327,2011-12-02 13:20:00,KIDNAPPING,INGLESIDE,4400 Block of MISSION ST,-122.433862258402,37.726027299009 +255330,2011-12-02 13:20:00,KIDNAPPING,INGLESIDE,4400 Block of MISSION ST,-122.433862258402,37.726027299009 +255344,2011-12-02 12:50:00,DRUNKENNESS,TENDERLOIN,500 Block of ELLIS ST,-122.415414178631,37.784476659022005 +255430,2011-12-02 09:00:00,RUNAWAY,INGLESIDE,500 Block of CARTER ST,-122.423628041297,37.70880618460679 +255679,2011-12-01 14:57:00,ARSON,CENTRAL,0 Block of CLAY ST,-122.39617056066002,37.7954869937274 +255691,2011-12-01 14:00:00,ARSON,SOUTHERN,0 Block of STEUART ST,-122.394353240888,37.7940873256363 +255839,2011-12-01 02:44:00,KIDNAPPING,TARAVAL,900 Block of QUINTARA ST,-122.475538602407,37.748724316492 +255902,2011-11-30 23:05:00,DRUNKENNESS,SOUTHERN,STEUART ST / MARKET ST,-122.394751181628,37.7944798289308 +255930,2011-11-30 21:34:00,DRUNKENNESS,SOUTHERN,MARKET ST / 4TH ST,-122.405832474482,37.7857446545609 +255974,2011-11-30 19:30:00,ARSON,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +256072,2011-11-30 14:40:00,KIDNAPPING,TENDERLOIN,400 Block of TURK ST,-122.416349428183,37.7825569563078 +256217,2011-11-30 05:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +256413,2011-11-29 15:29:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +256423,2011-11-29 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +256551,2011-11-29 07:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +256572,2011-11-29 03:30:00,KIDNAPPING,TARAVAL,OCEAN AV / LEE AV,-122.454114133559,37.72345567621321 +256771,2011-11-28 14:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +256817,2011-11-28 11:25:00,KIDNAPPING,BAYVIEW,300 Block of BAY SHORE BL,-122.406825183678,37.741054981526 +257015,2011-11-20 16:20:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +257040,2011-11-20 15:08:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +257192,2011-11-20 04:00:00,KIDNAPPING,CENTRAL,800 Block of JONES ST,-122.413705058875,37.7890640478934 +257223,2011-11-20 01:00:00,KIDNAPPING,RICHMOND,500 Block of 36TH AV,-122.496381177323,37.7785742450572 +257368,2011-11-19 16:00:00,DRUNKENNESS,NORTHERN,1700 Block of CALIFORNIA ST,-122.423156806774,37.7902088255652 +257486,2011-11-19 09:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +257615,2011-11-18 22:30:00,ARSON,BAYVIEW,2400 Block of NEWCOMB AV,-122.402209611741,37.7423447248336 +257637,2011-11-18 21:10:00,DRUNKENNESS,TENDERLOIN,0 Block of 5THSTNORTH ST,-122.408648588965,37.7849124714135 +257923,2011-11-18 04:30:00,KIDNAPPING,INGLESIDE,200 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +257926,2011-11-18 04:05:00,DRUNKENNESS,BAYVIEW,700 Block of KIRKWOOD AV,-122.374019331833,37.729203356539 +257986,2011-11-17 22:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +258051,2011-11-17 19:25:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +258057,2011-11-17 19:07:00,DRUNKENNESS,MISSION,1300 Block of FLORIDA ST,-122.409905594619,37.7503251821179 +258096,2011-11-17 17:40:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +258302,2011-11-17 04:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +258305,2011-11-17 04:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +258382,2011-11-16 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +258406,2011-11-16 19:15:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +258482,2011-11-16 14:53:00,ARSON,SOUTHERN,BERRY ST / 4TH ST,-122.393357241451,37.775787621829295 +258489,2011-11-16 14:30:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +258644,2011-11-16 00:15:00,ARSON,BAYVIEW,1000 Block of HOLLISTER AV,-122.391468771522,37.71926858093661 +259013,2011-11-15 02:00:00,KIDNAPPING,MISSION,400 Block of ALABAMA ST,-122.412301187143,37.7635382940839 +259105,2011-11-14 21:27:00,ARSON,BAYVIEW,BARNEVELD AV / OAKDALE AV,-122.403259230012,37.74192628625021 +259115,2011-11-14 21:00:00,DRUNKENNESS,CENTRAL,100 Block of SACRAMENTO ST,-122.39721366868,37.7945638654846 +259195,2011-11-14 16:09:00,ARSON,BAYVIEW,17TH ST / VERMONT ST,-122.404499252326,37.7646644599554 +259215,2011-11-14 15:05:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +259224,2011-11-14 15:03:00,KIDNAPPING,TARAVAL,2100 Block of 24TH AV,-122.481305019184,37.747461318190496 +259398,2011-11-06 23:30:00,ARSON,SOUTHERN,1700 Block of ALAMEDA ST,-122.402448598316,37.76862184291471 +259435,2011-11-06 19:50:00,KIDNAPPING,TARAVAL,900 Block of GARFIELD ST,-122.471211273343,37.7196980828972 +259457,2011-11-06 18:50:00,KIDNAPPING,NORTHERN,1400 Block of LOMBARD ST,-122.425356743295,37.8010805119223 +259465,2011-11-06 18:18:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +259473,2011-11-06 18:05:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +259529,2011-11-06 15:00:00,KIDNAPPING,NORTHERN,2000 Block of POLK ST,-122.421745585378,37.7954864877343 +259567,2011-11-06 13:00:00,RUNAWAY,TARAVAL,100 Block of RALSTON ST,-122.468976988627,37.7151943513234 +259572,2011-11-06 12:28:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +259599,2011-11-06 10:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +259700,2011-11-06 00:10:00,DRUNKENNESS,TENDERLOIN,200 Block of OFARRELL ST,-122.408496298209,37.786296190453 +259720,2011-11-05 23:50:00,KIDNAPPING,TARAVAL,1600 Block of HOLLOWAY AV,-122.478278206332,37.7209451616295 +259771,2011-11-05 21:25:00,DRUNKENNESS,TENDERLOIN,OFARRELL ST / STOCKTON ST,-122.406401668335,37.786614461336605 +259845,2011-11-05 17:30:00,KIDNAPPING,INGLESIDE,NIAGARA AV / DELANO AV,-122.445907471515,37.718828299383 +259993,2011-11-05 02:23:00,DRUNKENNESS,SOUTHERN,6TH ST / MARKET ST,-122.41029351969,37.7822305870036 +259998,2011-11-05 02:06:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +260040,2011-11-05 00:01:00,KIDNAPPING,TARAVAL,30TH AV / LINCOLN WY,-122.489042889399,37.7649272535704 +260080,2011-11-04 22:44:00,DRUNKENNESS,INGLESIDE,0 Block of JUANITA WY,-122.452210300345,37.7442200504047 +260252,2011-11-04 15:28:00,ARSON,MISSION,600 Block of POTRERO AV,-122.406991322127,37.7612944300102 +260416,2011-11-04 02:10:00,DRUNKENNESS,NORTHERN,2000 Block of LOMBARD ST,-122.435218147193,37.79982886606661 +260418,2011-11-04 02:01:00,DRUNKENNESS,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414081138014,37.7832767266062 +260710,2011-11-03 11:04:00,DRUNKENNESS,BAYVIEW,3RD ST / OAKDALE AV,-122.390697630683,37.7347969947349 +260888,2011-11-02 20:52:00,DRUNKENNESS,SOUTHERN,0 Block of STEUART ST,-122.394244418005,37.7941562815215 +261039,2011-11-02 13:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +261043,2011-11-02 12:58:00,DRUNKENNESS,CENTRAL,200 Block of GEARY ST,-122.407413025963,37.7874074125228 +261053,2011-11-02 12:30:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +261152,2011-11-02 03:35:00,DRUNKENNESS,SOUTHERN,800 Block of HOWARD ST,-122.403890955445,37.7824014072132 +261268,2011-11-01 20:00:00,KIDNAPPING,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +261314,2011-11-01 18:15:00,KIDNAPPING,TARAVAL,300 Block of CARDENAS AV,-122.475182025103,37.7189473544116 +261410,2011-11-01 14:50:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +261580,2011-11-01 05:30:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +261589,2011-11-01 03:14:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +261732,2011-10-31 20:50:00,KIDNAPPING,NORTHERN,1100 Block of MCALLISTER ST,-122.431321447148,37.7786327618285 +261775,2011-10-31 18:50:00,DRUNKENNESS,CENTRAL,SUTTER ST / STOCKTON ST,-122.406958660602,37.789434763004 +261801,2011-10-31 17:51:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +261804,2011-10-31 17:45:00,RUNAWAY,BAYVIEW,200 Block of HOLYOKE ST,-122.409346430586,37.728114941149705 +261865,2011-10-31 15:23:00,DRUNKENNESS,RICHMOND,1100 Block of CABRILLO ST,-122.470841822583,37.77499676714071 +261962,2011-10-31 10:00:00,RUNAWAY,BAYVIEW,1500 Block of QUESADA AV,-122.388723051056,37.7317262860764 +261977,2011-10-31 08:50:00,KIDNAPPING,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +261984,2011-10-31 08:10:00,RUNAWAY,TARAVAL,1900 Block of OCEAN AV,-122.463973921586,37.7260309165896 +262004,2011-10-31 07:00:00,KIDNAPPING,TENDERLOIN,ELLIS ST / LEAVENWORTH ST,-122.414433155063,37.7846576329256 +262036,2011-10-31 02:41:00,ARSON,BAYVIEW,0 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +262123,2011-10-23 20:43:00,DRUNKENNESS,NORTHERN,1100 Block of EDDY ST,-122.42577891406,37.7823192392643 +262223,2011-10-23 14:59:00,DRUNKENNESS,NORTHERN,GROVE ST / LARKIN ST,-122.416583456133,37.7786591541508 +262265,2011-10-23 12:55:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +262276,2011-10-23 12:00:00,KIDNAPPING,TARAVAL,100 Block of STRATFORD DR,-122.473627835651,37.722184947356 +262318,2011-10-23 10:03:00,KIDNAPPING,BAYVIEW,1400 Block of LASALLE AV,-122.386304220968,37.7349050342849 +262340,2011-10-23 08:30:00,KIDNAPPING,MISSION,100 Block of GUERRERO ST,-122.424322834824,37.7683035981657 +262394,2011-10-23 02:25:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +262419,2011-10-23 01:40:00,DRUNKENNESS,MISSION,3000 Block of CESAR CHAVEZ ST,-122.411016004131,37.74840805500371 +262484,2011-10-22 22:35:00,DRUNKENNESS,NORTHERN,400 Block of LARKIN ST,-122.41717581526,37.7819310783177 +262491,2011-10-22 22:30:00,DRUNKENNESS,INGLESIDE,400 Block of GENEVA AV,-122.447125045686,37.7210305914202 +262496,2011-10-22 22:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +262530,2011-10-22 20:29:00,DRUNKENNESS,TARAVAL,2700 Block of JUDAH ST,-122.491466660491,37.76100790770379 +262591,2011-10-22 17:15:00,DRUNKENNESS,INGLESIDE,5300 Block of DIAMONDHEIGHTS BL,-122.436266870505,37.7427715592858 +262592,2011-10-22 17:00:00,KIDNAPPING,MISSION,1300 Block of VERMONT ST,-122.403414326013,37.752524020261 +262654,2011-10-22 13:58:00,DRUNKENNESS,MISSION,2900 Block of 16TH ST,-122.419212958008,37.7651339672499 +262696,2011-10-22 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +262791,2011-10-22 01:32:00,DRUNKENNESS,TARAVAL,800 Block of FONT BL,-122.483569270838,37.7230650556781 +262812,2011-10-22 00:27:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +262928,2011-10-21 19:20:00,KIDNAPPING,INGLESIDE,0 Block of INA CT,-122.424766345074,37.7235405243946 +263174,2011-10-21 00:30:00,KIDNAPPING,NORTHERN,800 Block of FULTON ST,-122.431149073441,37.777698406901 +263184,2011-10-21 00:09:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +263338,2011-10-20 18:20:00,DRUNKENNESS,SOUTHERN,STEUART ST / MARKET ST,-122.394751181628,37.7944798289308 +263367,2011-10-20 16:26:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +263416,2011-10-20 14:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +263430,2011-10-20 13:44:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +263441,2011-10-20 13:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +263534,2011-10-20 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +263536,2011-10-20 05:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +263546,2011-10-20 04:10:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406681057265,37.755343095442 +263581,2011-10-20 00:10:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / LEAVENWORTH ST,-122.414433155063,37.7846576329256 +263662,2011-10-19 19:30:00,ARSON,RICHMOND,9TH AV / LAKE ST,-122.467898698969,37.786532532197214 +263680,2011-10-19 19:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +263895,2011-10-19 12:00:00,KIDNAPPING,TARAVAL,1600 Block of 35TH AV,-122.493881969847,37.756260302109496 +264015,2011-10-18 23:15:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +264137,2011-10-18 17:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +264194,2011-10-18 14:48:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +264364,2011-10-18 00:15:00,DRUNKENNESS,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +264502,2011-10-17 16:40:00,DRUNKENNESS,PARK,HAIGHT ST / CENTRAL AV,-122.443649925124,37.7704257255243 +264549,2011-10-17 14:00:00,KIDNAPPING,SOUTHERN,1500 Block of HOWARD ST,-122.416667284185,37.772123277472 +264759,2011-10-09 20:33:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +264764,2011-10-09 20:00:00,KIDNAPPING,PARK,1700 Block of TURK ST,-122.437493921383,37.779870435121104 +264766,2011-10-09 20:00:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +264787,2011-10-09 19:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +264895,2011-10-09 13:05:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +264976,2011-10-09 04:40:00,DRUNKENNESS,INGLESIDE,0 Block of SGTJOHNVYOUNG LN,-122.444707063455,37.7249307267936 +264997,2011-10-09 02:14:00,DRUNKENNESS,MISSION,1300 Block of SOUTH VAN NESS AV,-122.416254017272,37.7515522899856 +265123,2011-10-08 20:55:00,DRUNKENNESS,SOUTHERN,MARKET ST / SPEAR ST,-122.395630116231,37.7937899670889 +265344,2011-10-08 04:36:00,DRUNKENNESS,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291891,37.7827931071006 +265394,2011-10-08 00:01:00,DRUNKENNESS,TENDERLOIN,0 Block of GROVE ST,-122.415642487855,37.7788323158792 +265427,2011-10-07 22:20:00,DRUNKENNESS,CENTRAL,MARKET ST / SANSOME ST,-122.400316057286,37.790099627367 +265438,2011-10-07 21:55:00,DRUNKENNESS,SOUTHERN,300 Block of MISSION ST,-122.396211154038,37.790761361966 +265447,2011-10-07 21:20:00,DRUNKENNESS,TARAVAL,700 Block of FONT BL,-122.483569270838,37.7230650556781 +265448,2011-10-07 21:20:00,DRUNKENNESS,TARAVAL,700 Block of FONT BL,-122.483569270838,37.7230650556781 +265458,2011-10-07 20:30:00,KIDNAPPING,TARAVAL,18TH AV / MORAGA ST,-122.475535977887,37.7561526316014 +265470,2011-10-07 19:45:00,DRUNKENNESS,TENDERLOIN,0 Block of 5THSTNORTH ST,-122.408648588965,37.7849124714135 +265512,2011-10-07 18:00:00,KIDNAPPING,BAYVIEW,SILVER AV / REVERE AV,-122.398556318222,37.736434147176 +265586,2011-10-07 14:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +265589,2011-10-07 14:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +265590,2011-10-07 14:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +265611,2011-10-07 12:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +265704,2011-10-07 02:25:00,KIDNAPPING,NORTHERN,800 Block of LARKIN ST,-122.417885441042,37.7854378471968 +265714,2011-10-07 01:54:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +265737,2011-10-07 00:24:00,DRUNKENNESS,NORTHERN,2200 Block of CHESTNUT ST,-122.439895933785,37.8002979847002 +265762,2011-10-06 23:10:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +266109,2011-10-05 21:05:00,DRUNKENNESS,SOUTHERN,1600 Block of MARKET ST,-122.420958448413,37.773955543025 +266120,2011-10-05 21:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +266215,2011-10-05 16:10:00,KIDNAPPING,TARAVAL,WINSTON DR / STONECREST DR,-122.474232354486,37.7268863343008 +266316,2011-10-05 09:45:00,RUNAWAY,INGLESIDE,1500 Block of TREAT AV,-122.41250614556002,37.745680288147504 +266381,2011-10-05 02:13:00,DRUNKENNESS,CENTRAL,200 Block of SUTTER ST,-122.404013943546,37.7897518225049 +266593,2011-10-04 13:36:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +266771,2011-10-03 22:50:00,DRUNKENNESS,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +266774,2011-10-03 22:30:00,DRUNKENNESS,RICHMOND,400 Block of CLEMENT ST,-122.463902072852,37.7830189318905 +266781,2011-10-03 22:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +266807,2011-10-03 20:00:00,KIDNAPPING,NORTHERN,3600 Block of WEBSTER ST,-122.435196724815,37.8043076852694 +266898,2011-10-03 15:30:00,RUNAWAY,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +266930,2011-10-03 12:50:00,ARSON,MISSION,3300 Block of 23RD ST,-122.420253564524,37.7536816295495 +267279,2011-09-25 12:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +267372,2011-09-25 01:50:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +267420,2011-09-24 23:26:00,ARSON,BAYVIEW,400 Block of MARIPOSA ST,-122.388387661292,37.7642952908325 +267497,2011-09-24 21:02:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +267516,2011-09-24 20:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +267634,2011-09-24 14:30:00,DRUNKENNESS,BAYVIEW,4800 Block of 3RD ST,-122.390965298144,37.7344291807899 +267766,2011-09-24 02:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +267841,2011-09-23 23:00:00,KIDNAPPING,TARAVAL,100 Block of LAKEVIEW AV,-122.451570815685,37.7167385387816 +267952,2011-09-23 18:30:00,RUNAWAY,BAYVIEW,1600 Block of MCKINNON AV,-122.389660701177,37.7361786073283 +267995,2011-09-23 17:12:00,KIDNAPPING,TARAVAL,3600 Block of TARAVAL ST,-122.505162046753,37.741685142203394 +268116,2011-09-23 12:00:00,KIDNAPPING,PARK,1800 Block of EDDY ST,-122.438098378037,37.7806388583762 +268286,2011-09-22 22:01:00,DRUNKENNESS,SOUTHERN,300 Block of 9TH ST,-122.410416664036,37.7727234013654 +268318,2011-09-22 20:30:00,ARSON,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +268405,2011-09-22 17:01:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +268429,2011-09-22 15:55:00,KIDNAPPING,BAYVIEW,100 Block of ATOLL CR,-122.373096309808,37.7283699059089 +268570,2011-09-22 08:30:00,KIDNAPPING,PARK,2000 Block of OFARRELL ST,-122.438885953102,37.782558661635896 +268713,2011-09-21 20:45:00,DRUNKENNESS,NORTHERN,1100 Block of LAGUNA ST,-122.427415796369,37.78181074904449 +268840,2011-09-21 16:00:00,KIDNAPPING,NORTHERN,0 Block of IVY ST,-122.418951160054,37.7779227182608 +268855,2011-09-21 15:20:00,KIDNAPPING,TARAVAL,1500 Block of 22ND AV,-122.47994003717,37.7587430391155 +269050,2011-09-21 02:00:00,KIDNAPPING,TARAVAL,100 Block of LOBOS ST,-122.45758514144,37.7148630090118 +269075,2011-09-20 23:54:00,DRUNKENNESS,SOUTHERN,0 Block of 5TH ST,-122.407805288642,37.7837068386088 +269328,2011-09-20 12:00:00,KIDNAPPING,TENDERLOIN,400 Block of JONES ST,-122.412993783039,37.78556296952871 +269445,2011-09-20 02:51:00,KIDNAPPING,MISSION,300 Block of NOE ST,-122.432955532301,37.7633958260603 +269657,2011-09-19 12:05:00,DRUNKENNESS,SOUTHERN,MISSION ST / NEWMONTGOMERY ST,-122.40050441968,37.78745132896621 +269704,2011-09-19 09:30:00,ARSON,INGLESIDE,1500 Block of TREAT AV,-122.41250614556002,37.745680288147504 +269875,2011-09-11 19:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +269910,2011-09-11 18:00:00,KIDNAPPING,NORTHERN,600 Block of VANNESS AV,-122.420337977211,37.7812881245951 +269969,2011-09-11 15:57:00,KIDNAPPING,NORTHERN,800 Block of WEBSTER ST,-122.430095242111,37.77837628364711 +270007,2011-09-11 13:20:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +270012,2011-09-11 13:15:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +270047,2011-09-11 11:13:00,KIDNAPPING,MISSION,400 Block of DIAMOND ST,-122.436601323123,37.75515073088361 +270062,2011-09-11 10:30:00,DRUNKENNESS,PARK,0 Block of KEZAR DR,-122.45512727517,37.7695200227183 +270109,2011-09-11 06:00:00,KIDNAPPING,NORTHERN,1100 Block of ELLIS ST,-122.425944356826,37.7831367499779 +270159,2011-09-11 00:30:00,KIDNAPPING,PARK,0 Block of JUDAH ST,-122.462440101232,37.76239410141649 +270171,2011-09-11 00:15:00,DRUNKENNESS,NORTHERN,1200 Block of SUTTER ST,-122.420941906085,37.7875961622012 +270370,2011-09-10 14:22:00,DRUNKENNESS,CENTRAL,200 Block of GREEN ST,-122.403966475272,37.800081122495 +270396,2011-09-10 13:00:00,KIDNAPPING,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +270447,2011-09-10 10:30:00,ARSON,BAYVIEW,1000 Block of GILMAN AV,-122.389056277059,37.71882202740071 +270537,2011-09-10 00:45:00,DRUNKENNESS,TARAVAL,2000 Block of JUDAH ST,-122.483973759835,37.7614480495621 +270641,2011-09-09 20:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +270673,2011-09-09 19:20:00,KIDNAPPING,INGLESIDE,0 Block of GOLDMINE DR,-122.437205780009,37.7439230820758 +270689,2011-09-09 19:00:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +270874,2011-09-09 10:40:00,ARSON,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +270916,2011-09-09 08:25:00,DRUNKENNESS,SOUTHERN,400 Block of STEVENSON ST,-122.408658469653,37.7826632207573 +270943,2011-09-09 06:30:00,ARSON,MISSION,1300 Block of CASTRO ST,-122.433978272453,37.7508960319364 +271001,2011-09-08 23:30:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +271124,2011-09-08 16:04:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.450492384367,37.7696094511519 +271267,2011-09-08 04:50:00,ARSON,TARAVAL,100 Block of ARCH ST,-122.467014572296,37.713365798221 +271270,2011-09-08 03:50:00,ARSON,MISSION,200 Block of SANCHEZ ST,-122.431021427806,37.7651022454799 +271283,2011-09-08 02:20:00,ARSON,TENDERLOIN,LEAVENWORTH ST / OFARRELL ST,-122.414619686906,37.785583058847 +271284,2011-09-08 02:15:00,ARSON,TENDERLOIN,400 Block of HYDE ST,-122.416235852379,37.784912573847606 +271615,2011-09-07 06:02:00,ARSON,BAYVIEW,1500 Block of GRIFFITH ST,-122.381719720362,37.72544807413321 +271664,2011-09-06 23:00:00,ARSON,BAYVIEW,1500 Block of PALOU AV,-122.389979849085,37.733521608374296 +271715,2011-09-06 19:45:00,KIDNAPPING,NORTHERN,1100 Block of EDDY ST,-122.42577891406,37.7823192392643 +271719,2011-09-06 19:26:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +271787,2011-09-06 16:20:00,DRUNKENNESS,BAYVIEW,100 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +271946,2011-09-06 07:20:00,RUNAWAY,RICHMOND,300 Block of 9TH AV,-122.46762610569598,37.781819339314 +272003,2011-09-05 23:08:00,DRUNKENNESS,PARK,100 Block of DELMAR ST,-122.445277515746,37.7663556154167 +272011,2011-09-05 22:51:00,DRUNKENNESS,RICHMOND,4100 Block of GEARY BL,-122.463764261964,37.7811749336778 +272099,2011-09-05 17:00:00,KIDNAPPING,NORTHERN,900 Block of VANNESS AV,-122.421289351475,37.7845202739273 +272106,2011-09-05 16:51:00,DRUNKENNESS,MISSION,25TH ST / BARTLETT ST,-122.41940150486,37.750572739313895 +272125,2011-09-05 15:30:00,RUNAWAY,SOUTHERN,600 Block of NATOMA ST,-122.411118243435,37.7775607137405 +272131,2011-09-05 15:23:00,KIDNAPPING,TENDERLOIN,600 Block of ELLIS ST,-122.416893710739,37.7842860480389 +272261,2011-09-05 07:25:00,RUNAWAY,RICHMOND,FULTON ST / 12TH AV,-122.470161896544,37.773207765913895 +272592,2011-08-28 10:00:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +272614,2011-08-28 07:47:00,DRUNKENNESS,SOUTHERN,6TH ST / STEVENSON ST,-122.409696355558,37.7817540588712 +272784,2011-08-27 20:05:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +272836,2011-08-27 18:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +273065,2011-08-27 01:59:00,DRUNKENNESS,MISSION,4000 Block of 24TH ST,-122.43300956477,37.7514239412017 +273094,2011-08-27 00:25:00,DRUNKENNESS,SOUTHERN,200 Block of BEALE ST,-122.39353370026,37.7892558270831 +273108,2011-08-27 00:01:00,KIDNAPPING,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +273137,2011-08-26 23:22:00,DRUNKENNESS,TENDERLOIN,0 Block of TAYLOR ST,-122.410689907787,37.7824948907735 +273146,2011-08-26 22:56:00,DRUNKENNESS,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +273274,2011-08-26 16:32:00,ARSON,INGLESIDE,SUNNYDALE AV / PERSIA AV,-122.425836398247,37.718279128022296 +273343,2011-08-26 14:18:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +273388,2011-08-26 11:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +273459,2011-08-26 04:59:00,KIDNAPPING,INGLESIDE,29TH ST / DIAMOND ST,-122.435561696254,37.7431608894223 +273472,2011-08-26 02:00:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +273572,2011-08-25 21:41:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +273601,2011-08-25 20:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +273630,2011-08-25 18:20:00,ARSON,CENTRAL,2100 Block of POWELL ST,-122.411607253459,37.8044472417935 +273637,2011-08-25 18:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +273701,2011-08-25 15:15:00,DRUNKENNESS,BAYVIEW,TOLAND ST / MCKINNON AV,-122.400429675851,37.7421972030468 +273776,2011-08-25 10:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +273811,2011-08-25 08:54:00,ARSON,INGLESIDE,5000 Block of MISSION ST,-122.440388229194,37.7174580136719 +273842,2011-08-25 07:00:00,KIDNAPPING,BAYVIEW,THORNTON AV / POMONA ST,-122.393647818284,37.7308544829257 +273951,2011-08-24 19:45:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +273986,2011-08-24 18:30:00,ARSON,SOUTHERN,300 Block of 11TH ST,-122.413189430011,37.77127369135761 +274014,2011-08-24 17:45:00,DRUNKENNESS,SOUTHERN,700 Block of MISSION ST,-122.40284363862,37.7857184692369 +274048,2011-08-24 16:10:00,KIDNAPPING,TENDERLOIN,500 Block of OFARRELL ST,-122.413798415869,37.7856297942374 +274355,2011-08-23 17:00:00,KIDNAPPING,CENTRAL,300 Block of BAY ST,-122.412782236976,37.8056654684523 +274518,2011-08-23 05:53:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +274530,2011-08-23 03:17:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411965795229,37.78491418595621 +274606,2011-08-22 20:50:00,RUNAWAY,INGLESIDE,3600 Block of MISSION ST,-122.423926267404,37.7381082133659 +274620,2011-08-22 19:57:00,ARSON,SOUTHERN,MARKET ST / STOCKTON ST,-122.405832474482,37.7857446545609 +274658,2011-08-22 17:50:00,DRUNKENNESS,SOUTHERN,500 Block of MARKET ST,-122.400194768944,37.7900527936016 +274863,2011-08-22 01:05:00,KIDNAPPING,MISSION,3900 Block of 18TH ST,-122.431710082584,37.76114188133271 +275043,2011-08-14 14:34:00,KIDNAPPING,MISSION,1200 Block of POTRERO AV,-122.406207709177,37.752356841294 +275126,2011-08-14 07:50:00,DRUNKENNESS,TARAVAL,IRVING ST / 9TH AV,-122.466309668238,37.7640368477306 +275491,2011-08-13 08:00:00,KIDNAPPING,INGLESIDE,200 Block of RUTLAND ST,-122.40568949764,37.7162366070822 +275585,2011-08-12 23:00:00,KIDNAPPING,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +275594,2011-08-12 23:00:00,KIDNAPPING,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +275634,2011-08-12 20:30:00,KIDNAPPING,PARK,CASTRO ST / 17TH ST,-122.435187699349,37.7626702770872 +275656,2011-08-12 20:00:00,RUNAWAY,PARK,PAGE ST / LYON ST,-122.442188391633,37.77157056324271 +275843,2011-08-12 12:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +275922,2011-08-12 04:45:00,KIDNAPPING,TARAVAL,3100 Block of TARAVAL ST,-122.499811443246,37.7420373353196 +275975,2011-08-11 23:19:00,DRUNKENNESS,CENTRAL,BROADWAY ST / SANSOME ST,-122.402232454222,37.7984302773598 +276198,2011-08-11 13:35:00,ARSON,MISSION,200 Block of CUMBERLAND ST,-122.429163243569,37.7588827167621 +276281,2011-08-11 09:02:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +276321,2011-08-11 06:00:00,ARSON,BAYVIEW,GILMAN AV / JENNINGS ST,-122.393739160349,37.721409092511394 +276353,2011-08-11 01:52:00,KIDNAPPING,SOUTHERN,MISSION ST / 9TH ST,-122.414714295579,37.7762310404758 +276379,2011-08-11 00:02:00,DRUNKENNESS,TARAVAL,700 Block of IRVING ST,-122.465791800721,37.764114780327 +276702,2011-08-10 00:56:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +276769,2011-08-09 21:01:00,ARSON,BAYVIEW,2400 Block of GRIFFITH ST,-122.386437671186,37.7191834462785 +276810,2011-08-09 19:14:00,DRUNKENNESS,PARK,1400 Block of FULTON ST,-122.440692992903,37.77659175510311 +276974,2011-08-09 09:07:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +277003,2011-08-09 06:00:00,ARSON,CENTRAL,900 Block of PINE ST,-122.411638240183,37.79069661417179 +277101,2011-08-08 20:40:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +277285,2011-08-08 10:38:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +277286,2011-08-08 10:38:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +277302,2011-08-08 09:22:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +277358,2011-08-08 02:33:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +277378,2011-08-08 01:00:00,KIDNAPPING,CENTRAL,0 Block of MAIDEN LN,-122.40435958711,37.7882726542513 +277500,2011-07-31 16:35:00,KIDNAPPING,TENDERLOIN,500 Block of ELLIS ST,-122.415414178631,37.784476659022005 +277660,2011-07-31 02:04:00,DRUNKENNESS,SOUTHERN,HARRISON ST / 4TH ST,-122.399617558782,37.78079065500671 +277672,2011-07-31 01:40:00,DRUNKENNESS,SOUTHERN,1500 Block of MISSION ST,-122.417523396516,37.7738670346175 +277695,2011-07-31 00:56:00,DRUNKENNESS,CENTRAL,HYDE ST / CALIFORNIA ST,-122.417392830334,37.7909741243591 +277760,2011-07-30 22:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +277818,2011-07-30 18:24:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.402849079555,37.7758599616408 +277902,2011-07-30 13:55:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +277983,2011-07-30 09:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +278058,2011-07-29 23:55:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +278060,2011-07-29 23:38:00,DRUNKENNESS,MISSION,CAPP ST / 21ST ST,-122.417812558787,37.7571005796428 +278167,2011-07-29 18:35:00,KIDNAPPING,INGLESIDE,0 Block of LEO ST,-122.437067915291,37.722759886626704 +278168,2011-07-29 18:35:00,KIDNAPPING,INGLESIDE,0 Block of LEO ST,-122.437067915291,37.722759886626704 +278185,2011-07-29 18:10:00,ARSON,TARAVAL,3000 Block of 23RD AV,-122.479111707519,37.73183351447629 +278466,2011-07-28 20:20:00,DRUNKENNESS,CENTRAL,1500 Block of STOCKTON ST,-122.409035282337,37.7999845229184 +278487,2011-07-28 19:35:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +278772,2011-07-27 23:54:00,KIDNAPPING,CENTRAL,2100 Block of TAYLOR ST,-122.414520235774,37.8021725258528 +278932,2011-07-27 16:40:00,RUNAWAY,BAYVIEW,2000 Block of QUESADA AV,-122.398364817035,37.73719328136821 +279030,2011-07-27 12:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +279156,2011-07-27 00:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +279470,2011-07-26 09:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +279508,2011-07-26 05:55:00,KIDNAPPING,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +279636,2011-07-25 18:47:00,DRUNKENNESS,PARK,MASONIC AV / HAIGHT ST,-122.4453467866,37.7702081959172 +279687,2011-07-25 16:00:00,RUNAWAY,MISSION,400 Block of VALENCIA ST,-122.42207304894,37.766125945480105 +279771,2011-07-25 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +279865,2011-07-17 23:45:00,ARSON,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +279874,2011-07-17 23:19:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421550176461,37.7621307247611 +279879,2011-07-17 23:00:00,ARSON,INGLESIDE,500 Block of MADRID ST,-122.433347616605,37.7207975379192 +279933,2011-07-17 19:07:00,DRUNKENNESS,NORTHERN,2100 Block of UNION ST,-122.434695000374,37.7972457460489 +280090,2011-07-17 07:45:00,DRUNKENNESS,BAYVIEW,LASALLE AV / 3RD ST,-122.389865610332,37.73716994462029 +280125,2011-07-17 02:35:00,KIDNAPPING,PARK,300 Block of BAKER ST,-122.440949589926,37.7741190407726 +280150,2011-07-17 01:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +280221,2011-07-16 21:35:00,KIDNAPPING,SOUTHERN,800 Block of HOWARD ST,-122.403793259489,37.7823235897616 +280258,2011-07-16 19:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +280259,2011-07-16 19:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +280330,2011-07-16 14:45:00,KIDNAPPING,CENTRAL,400 Block of DAVIS CT,-122.398187664281,37.7967148853927 +280439,2011-07-16 03:45:00,DRUNKENNESS,RICHMOND,2100 Block of LAKE ST,-122.482481325825,37.7859138779688 +280611,2011-07-15 19:00:00,RUNAWAY,INGLESIDE,300 Block of COLERIDGE ST,-122.421448279256,37.7409115488324 +280797,2011-07-15 08:25:00,RUNAWAY,TARAVAL,1300 Block of 43RD AV,-122.502708098898,37.7614820910625 +280825,2011-07-15 04:06:00,ARSON,CENTRAL,200 Block of COLUMBUS AV,-122.40583874581002,37.7973631784416 +280827,2011-07-15 04:00:00,ARSON,CENTRAL,100 Block of COLUMBUS AV,-122.405446187756,37.796945444827706 +280906,2011-07-14 21:45:00,DRUNKENNESS,CENTRAL,700 Block of KEARNY ST,-122.404904447841,37.7946478828923 +280942,2011-07-14 19:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +281170,2011-07-14 05:50:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +281346,2011-07-13 18:02:00,KIDNAPPING,CENTRAL,900 Block of STOCKTON ST,-122.407924523261,37.7945175317794 +281463,2011-07-13 13:08:00,DRUNKENNESS,TARAVAL,2200 Block of IRVING ST,-122.481952149221,37.7632941560241 +281592,2011-07-13 01:20:00,KIDNAPPING,CENTRAL,1000 Block of BUSH ST,-122.414576897,37.7894768075723 +281656,2011-07-12 20:24:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +281706,2011-07-12 17:09:00,DRUNKENNESS,NORTHERN,600 Block of WEBSTER ST,-122.429785425672,37.7767312560644 +281884,2011-07-12 00:29:00,ARSON,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +282136,2011-07-11 02:26:00,ARSON,INGLESIDE,0 Block of MELROSE AV,-122.44318148994,37.7337779831808 +282171,2011-07-03 22:40:00,DRUNKENNESS,SOUTHERN,0 Block of ELGINPARK ST,-122.423294751714,37.7706495415688 +282191,2011-07-03 21:18:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +282273,2011-07-03 15:20:00,RUNAWAY,RICHMOND,0 Block of ALMADEN CT,-122.45777349257,37.7799753796869 +282342,2011-07-03 11:50:00,DRUNKENNESS,TARAVAL,1000 Block of OCEAN AV,-122.453592242997,37.723431715229296 +282353,2011-07-03 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +282404,2011-07-03 03:55:00,DRUNKENNESS,SOUTHERN,300 Block of KING ST,-122.395318802588,37.77555632107849 +282464,2011-07-02 23:45:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +282527,2011-07-02 21:05:00,DRUNKENNESS,SOUTHERN,MARKET ST / 2ND ST,-122.401378067544,37.7892639310458 +282530,2011-07-02 21:05:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +282585,2011-07-02 18:05:00,DRUNKENNESS,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +282753,2011-07-02 10:11:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.419520367886,37.764228935718 +282759,2011-07-02 10:00:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +282792,2011-07-02 07:30:00,RUNAWAY,BAYVIEW,2400 Block of SAN BRUNO AV,-122.404952461327,37.7307376243582 +282812,2011-07-02 03:20:00,KIDNAPPING,TENDERLOIN,100 Block of MCALLISTER ST,-122.41452262258,37.7808752665663 +283148,2011-07-01 10:23:00,ARSON,SOUTHERN,200 Block of MARKET ST,-122.396853499969,37.79267911710721 +283239,2011-07-01 02:40:00,DRUNKENNESS,MISSION,DUBOCE AV / MARKET ST,-122.426312365708,37.7696033128096 +283300,2011-06-30 23:30:00,KIDNAPPING,MISSION,3000 Block of HARRISON ST,-122.411638550839,37.7491884934163 +283559,2011-06-30 11:05:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +283786,2011-06-29 19:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +283960,2011-06-29 10:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +284256,2011-06-28 11:35:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +284344,2011-06-28 03:57:00,DRUNKENNESS,TENDERLOIN,200 Block of JONES ST,-122.412436901867,37.7834857455601 +284360,2011-06-28 01:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +284440,2011-06-27 20:00:00,KIDNAPPING,RICHMOND,PARKPRESIDIO BL / CALIFORNIA ST,-122.472588659363,37.78444614444821 +284544,2011-06-27 15:30:00,KIDNAPPING,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +284743,2011-06-19 22:49:00,DRUNKENNESS,TARAVAL,0 Block of GATEVIEW CT,-122.466821112882,37.748249580463 +284749,2011-06-19 22:40:00,DRUNKENNESS,RICHMOND,2000 Block of DIVISADERO ST,-122.440417586058,37.7885552325694 +284972,2011-06-19 09:18:00,KIDNAPPING,INGLESIDE,0 Block of CASSANDRA CT,-122.448709310437,37.7093911042026 +285227,2011-06-18 16:15:00,DRUNKENNESS,RICHMOND,800 Block of LA PLAYA ST,-122.509895418239,37.7723131976814 +285250,2011-06-18 15:15:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +285414,2011-06-18 02:12:00,DRUNKENNESS,CENTRAL,0 Block of KEARNY ST,-122.403552860945,37.7886749669059 +285610,2011-06-17 16:30:00,DRUNKENNESS,PARK,2300 Block of OFARRELL ST,-122.442741702575,37.7820263746708 +285648,2011-06-17 14:35:00,KIDNAPPING,INGLESIDE,1700 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +285777,2011-06-17 02:50:00,KIDNAPPING,MISSION,1300 Block of SOUTH VAN NESS AV,-122.416116085651,37.7515608619924 +285779,2011-06-17 02:33:00,DRUNKENNESS,MISSION,500 Block of CASTRO ST,-122.434856780211,37.760077705313705 +285841,2011-06-16 21:55:00,KIDNAPPING,TARAVAL,1500 Block of 18TH AV,-122.47566088117,37.7589317612045 +285844,2011-06-16 21:35:00,KIDNAPPING,INGLESIDE,300 Block of BRADFORD ST,-122.409793435492,37.7372605984107 +285944,2011-06-16 16:02:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +286032,2011-06-16 11:51:00,KIDNAPPING,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +286071,2011-06-16 10:15:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +286136,2011-06-16 03:00:00,RUNAWAY,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +286175,2011-06-15 23:44:00,DRUNKENNESS,CENTRAL,1000 Block of COLUMBUS AV,-122.415115800125,37.8037807941664 +286328,2011-06-15 15:45:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.407975093043,37.7803099082814 +286503,2011-06-15 05:30:00,KIDNAPPING,CENTRAL,1100 Block of BATTERY ST,-122.401774710336,37.8018464851371 +286672,2011-06-14 18:00:00,RUNAWAY,INGLESIDE,300 Block of ELLINGTON AV,-122.446458828047,37.71234935054839 +287026,2011-06-13 16:45:00,RUNAWAY,MISSION,26TH ST / MISSION ST,-122.418137290501,37.7490413093633 +287119,2011-06-13 11:48:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.412320907436,37.7807642254398 +287174,2011-06-13 07:00:00,KIDNAPPING,NORTHERN,2000 Block of PINE ST,-122.429538846712,37.7884164529371 +287179,2011-06-13 06:05:00,DRUNKENNESS,RICHMOND,ANZA ST / 15TH AV,-122.473832945005,37.7786512395385 +287203,2011-06-13 00:27:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446143672039,37.7700527182372 +287313,2011-06-05 18:35:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +287440,2011-06-05 11:50:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +287464,2011-06-05 09:30:00,RUNAWAY,PARK,200 Block of PIERCE ST,-122.43389861042,37.7721545740792 +287638,2011-06-04 22:37:00,DRUNKENNESS,TENDERLOIN,200 Block of HYDE ST,-122.415858343095,37.7830505366842 +287686,2011-06-04 21:00:00,ARSON,RICHMOND,300 Block of 23RD AV,-122.482592898737,37.7811403162951 +287705,2011-06-04 20:02:00,ARSON,PARK,0 Block of NOE ST,-122.433419665092,37.7683076620028 +287732,2011-06-04 18:39:00,DRUNKENNESS,SOUTHERN,5TH ST / SHIPLEY ST,-122.402842748428,37.7798294192767 +287919,2011-06-04 03:46:00,KIDNAPPING,TENDERLOIN,400 Block of LEAVENWORTH ST,-122.414593831954,37.7851199839553 +287921,2011-06-04 03:46:00,KIDNAPPING,TENDERLOIN,400 Block of LEAVENWORTH ST,-122.414593831954,37.7851199839553 +287929,2011-06-04 03:16:00,ARSON,BAYVIEW,1100 Block of THOMAS AV,-122.382852175823,37.7256943991515 +287933,2011-06-04 02:30:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +287944,2011-06-04 01:31:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +287957,2011-06-04 00:41:00,ARSON,BAYVIEW,0 Block of MIDDLEPOINT RD,-122.37934537972,37.73574190685721 +288016,2011-06-03 22:00:00,DRUNKENNESS,SOUTHERN,200 Block of FOLSOM ST,-122.392250041709,37.7889824799132 +288067,2011-06-03 19:24:00,DRUNKENNESS,SOUTHERN,400 Block of TEHAMA ST,-122.405488408396,37.7801398610181 +288128,2011-06-03 16:19:00,ARSON,BAYVIEW,0 Block of CAMERON WY,-122.387247607197,37.7208692407802 +288230,2011-06-03 12:08:00,DRUNKENNESS,MISSION,26TH ST / TREAT AV,-122.412690142308,37.7493688284532 +288345,2011-06-03 01:39:00,DRUNKENNESS,MISSION,17TH ST / MARKET ST,-122.435187699349,37.7626702770872 +288346,2011-06-03 01:30:00,KIDNAPPING,TARAVAL,2200 Block of 45TH AV,-122.503676555746,37.7446058160434 +288454,2011-06-02 19:09:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.41371122073,37.7796660426062 +288484,2011-06-02 18:11:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +288617,2011-06-02 11:00:00,RUNAWAY,TARAVAL,0 Block of MIRAMAR AV,-122.458100917325,37.7191297288314 +288725,2011-06-02 00:37:00,DRUNKENNESS,MISSION,500 Block of CASTRO ST,-122.434856780211,37.760077705313705 +288779,2011-06-01 20:37:00,DRUNKENNESS,CENTRAL,1000 Block of BUSH ST,-122.414576897,37.7894768075723 +288853,2011-06-01 18:05:00,KIDNAPPING,RICHMOND,2600 Block of CALIFORNIA ST,-122.437978008235,37.7884353561249 +288854,2011-06-01 18:05:00,KIDNAPPING,RICHMOND,2600 Block of CALIFORNIA ST,-122.437978008235,37.7884353561249 +289111,2011-06-01 07:00:00,RUNAWAY,BAYVIEW,1400 Block of RANKIN ST,-122.398721955589,37.7379276447447 +289143,2011-06-01 02:05:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +289346,2011-05-31 16:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +289585,2011-05-30 20:40:00,DRUNKENNESS,MISSION,400 Block of DOLORES ST,-122.425956929318,37.76180867893621 +289624,2011-05-30 18:34:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.422399101985,37.7649414890121 +289688,2011-05-30 14:16:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +289749,2011-05-30 10:00:00,KIDNAPPING,CENTRAL,500 Block of POST ST,-122.410882825551,37.787920937553295 +289821,2011-05-30 00:32:00,DRUNKENNESS,INGLESIDE,MISSION ST / EXCELSIOR AV,-122.433623421746,37.72623583047221 +289871,2011-05-22 21:05:00,KIDNAPPING,INGLESIDE,4000 Block of SAN BRUNO AV,-122.402166015437,37.7132467797366 +289972,2011-05-22 16:35:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +290084,2011-05-22 07:24:00,KIDNAPPING,INGLESIDE,COLERIDGE ST / VIRGINIA AV,-122.420387542374,37.7426784803209 +290110,2011-05-22 03:10:00,KIDNAPPING,TARAVAL,3100 Block of TARAVAL ST,-122.499811443246,37.7420373353196 +290137,2011-05-22 01:35:00,DRUNKENNESS,MISSION,16TH ST / VALENCIA ST,-122.421886357981,37.7649178909424 +290144,2011-05-22 01:30:00,KIDNAPPING,RICHMOND,3500 Block of FULTON ST,-122.469641697587,37.7732875002688 +290158,2011-05-22 00:44:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / HYDE ST,-122.415508242782,37.7816542806076 +290361,2011-05-21 17:00:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +290429,2011-05-21 13:40:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.407474439624,37.779911669335 +290431,2011-05-21 13:30:00,KIDNAPPING,BAYVIEW,2200 Block of 25TH ST,-122.400893870064,37.751991040770896 +290611,2011-05-21 00:31:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +290622,2011-05-21 00:20:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +290634,2011-05-21 00:01:00,KIDNAPPING,INGLESIDE,200 Block of EDINBURGH ST,-122.429137822416,37.7251352806915 +290685,2011-05-20 21:38:00,DRUNKENNESS,MISSION,2300 Block of 16TH ST,-122.409519465141,37.7656088991582 +290692,2011-05-20 21:05:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +290751,2011-05-20 18:19:00,DRUNKENNESS,PARK,600 Block of STANYAN ST,-122.453563238036,37.7696403896003 +290803,2011-05-20 15:55:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +290832,2011-05-20 14:20:00,KIDNAPPING,TARAVAL,1800 Block of 34TH AV,-122.492550483345,37.752576045719294 +290845,2011-05-20 13:45:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +290976,2011-05-20 02:00:00,KIDNAPPING,TENDERLOIN,200 Block of OFARRELL ST,-122.408519707346,37.7864044708209 +291018,2011-05-19 23:46:00,KIDNAPPING,INGLESIDE,900 Block of TOMPKINS AV,-122.410676593198,37.73696573725729 +291022,2011-05-19 23:46:00,KIDNAPPING,INGLESIDE,900 Block of TOMPKINS AV,-122.410676593198,37.73696573725729 +291201,2011-05-19 15:15:00,DRUNKENNESS,SOUTHERN,300 Block of 7TH ST,-122.406841835314,37.77587129042521 +291223,2011-05-19 14:08:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +291236,2011-05-19 13:30:00,KIDNAPPING,SOUTHERN,100 Block of 2ND ST,-122.399477770814,37.7878321941049 +291237,2011-05-19 13:30:00,RUNAWAY,MISSION,0 Block of SYCAMORE ST,-122.420562762663,37.7627003582299 +291239,2011-05-19 13:30:00,KIDNAPPING,SOUTHERN,100 Block of 2ND ST,-122.399477770814,37.7878321941049 +291379,2011-05-19 02:39:00,DRUNKENNESS,CENTRAL,700 Block of STOCKTON ST,-122.407500737639,37.7925035706535 +291396,2011-05-19 01:09:00,DRUNKENNESS,MISSION,2100 Block of MISSION ST,-122.419528998826,37.762877666705606 +291417,2011-05-19 00:05:00,KIDNAPPING,INGLESIDE,500 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +291473,2011-05-18 21:50:00,DRUNKENNESS,MISSION,2400 Block of 24TH ST,-122.403888410312,37.7530945718721 +291510,2011-05-18 19:45:00,KIDNAPPING,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +291583,2011-05-18 17:29:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +291758,2011-05-18 06:45:00,RUNAWAY,PARK,1600 Block of TURK ST,-122.43627497948098,37.7800247331065 +291861,2011-05-17 20:00:00,DRUNKENNESS,TARAVAL,100 Block of BROAD ST,-122.45756787173,37.7132375345136 +292330,2011-05-16 14:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +292481,2011-05-08 23:35:00,DRUNKENNESS,INGLESIDE,700 Block of GENEVA AV,-122.442699859429,37.7179975907525 +292594,2011-05-08 16:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +292620,2011-05-08 14:06:00,DRUNKENNESS,NORTHERN,SACRAMENTO ST / LARKIN ST,-122.419225511064,37.7917052017931 +292753,2011-05-08 01:05:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +292821,2011-05-07 22:54:00,DRUNKENNESS,SOUTHERN,1100 Block of HOWARD ST,-122.410732972926,37.7768349106122 +292863,2011-05-07 20:40:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +292891,2011-05-07 19:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +292902,2011-05-07 18:45:00,KIDNAPPING,CENTRAL,200 Block of NORTHPOINT ST,-122.411324519026,37.806804272619296 +293079,2011-05-07 03:07:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739951,37.7978641744394 +293117,2011-05-07 00:37:00,ARSON,INGLESIDE,100 Block of OMAR WY,-122.45000773418,37.7392685680033 +293121,2011-05-07 00:35:00,DRUNKENNESS,SOUTHERN,3RD ST / TOWNSEND ST,-122.392753573574,37.7788518670227 +293217,2011-05-06 19:55:00,DRUNKENNESS,BAYVIEW,800 Block of CHINABASIN ST,-122.386775025935,37.765377517215 +293277,2011-05-06 16:40:00,KIDNAPPING,BAYVIEW,600 Block of DEHARO ST,-122.401191922623,37.7616428225519 +293332,2011-05-06 13:20:00,KIDNAPPING,BAYVIEW,22ND ST / 3RD ST,-122.388318045049,37.757939423202 +293484,2011-05-06 01:12:00,DRUNKENNESS,NORTHERN,2900 Block of FILLMORE ST,-122.435329238216,37.7966412627605 +293517,2011-05-05 23:40:00,ARSON,TARAVAL,100 Block of BRIGHTON AV,-122.455191970394,37.7209593589555 +293654,2011-05-05 18:45:00,RUNAWAY,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +293778,2011-05-05 13:00:00,RUNAWAY,INGLESIDE,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +294106,2011-05-04 15:30:00,KIDNAPPING,TENDERLOIN,200 Block of OFARRELL ST,-122.409155386902,37.7863245885511 +294257,2011-05-04 07:20:00,KIDNAPPING,INGLESIDE,500 Block of ARLINGTON ST,-122.430723754242,37.73443231351671 +294269,2011-05-04 03:28:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +294292,2011-05-04 00:50:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435773846395,37.7624591846215 +294315,2011-05-03 23:20:00,DRUNKENNESS,SOUTHERN,THE EMBARCADEROSOUTH ST / BRYANT ST,-122.388007401911,37.7871027247566 +294456,2011-05-03 14:20:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.409795194505,37.7800356268394 +294568,2011-05-03 06:30:00,RUNAWAY,BAYVIEW,800 Block of MISSOURI ST,-122.395565360141,37.7563302749024 +294577,2011-05-03 04:57:00,ARSON,BAYVIEW,200 Block of MIDDLEPOINT RD,-122.379366554289,37.73427869154129 +294628,2011-05-02 23:25:00,ARSON,TARAVAL,100 Block of APTOS AV,-122.466758005159,37.7291845796038 +294707,2011-05-02 17:34:00,KIDNAPPING,MISSION,3300 Block of 22ND ST,-122.422333037882,37.7552726735094 +294914,2011-05-02 02:20:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423637302048,37.7648666651043 +294995,2011-04-24 20:29:00,DRUNKENNESS,TARAVAL,1300 Block of 9TH AV,-122.466313420543,37.763085116614 +295036,2011-04-24 18:00:00,KIDNAPPING,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +295234,2011-04-24 00:07:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +295304,2011-04-23 21:00:00,KIDNAPPING,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +295317,2011-04-23 20:00:00,RUNAWAY,INGLESIDE,500 Block of PRENTISS ST,-122.412223978237,37.736395364488295 +295344,2011-04-23 18:42:00,DRUNKENNESS,NORTHERN,CHESTNUT ST / PIERCE ST,-122.439504944797,37.8004024933613 +295582,2011-04-23 01:00:00,KIDNAPPING,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +295646,2011-04-22 22:35:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +295767,2011-04-22 16:41:00,DRUNKENNESS,NORTHERN,400 Block of HAIGHT ST,-122.429644614552,37.7722642986091 +295902,2011-04-22 09:00:00,KIDNAPPING,CENTRAL,1100 Block of BROADWAY ST,-122.416042904272,37.7967523408109 +295906,2011-04-22 08:55:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +295945,2011-04-22 03:47:00,DRUNKENNESS,MISSION,3000 Block of 21ST ST,-122.416178123149,37.7572542986223 +295979,2011-04-22 00:41:00,DRUNKENNESS,SOUTHERN,200 Block of MISSION ST,-122.395336395079,37.79145189700071 +295987,2011-04-22 00:30:00,ARSON,RICHMOND,TRANSVERSE DR / OVERLOOK DR,-122.479465285418,37.769876432032106 +296079,2011-04-21 19:40:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +296193,2011-04-21 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +296307,2011-04-21 07:00:00,KIDNAPPING,BAYVIEW,100 Block of ELMIRA ST,-122.403733561327,37.7353069209821 +296591,2011-04-20 11:56:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +296624,2011-04-20 09:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +296657,2011-04-20 08:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +296677,2011-04-20 06:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +296901,2011-04-19 17:00:00,ARSON,INGLESIDE,200 Block of ALPHA ST,-122.404716179761,37.7135457124599 +297136,2011-04-19 00:05:00,KIDNAPPING,CENTRAL,HYDE ST / CHESTNUT ST,-122.419799431133,37.8029252064148 +297169,2011-04-18 22:20:00,DRUNKENNESS,MISSION,17TH ST / MISSION ST,-122.419515708406,37.7634292328496 +297331,2011-04-18 13:15:00,ARSON,CENTRAL,CALIFORNIA ST / STOCKTON ST,-122.407539774357,37.79224917725779 +297456,2011-04-18 00:27:00,ARSON,BAYVIEW,100 Block of BARNEVELD AV,-122.402841680867,37.7450364333137 +297550,2011-04-10 19:04:00,KIDNAPPING,NORTHERN,600 Block of FILLMORE ST,-122.431038532157,37.7753861665924 +297595,2011-04-10 16:00:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +297684,2011-04-10 09:20:00,ARSON,TARAVAL,1500 Block of 43RD AV,-122.502445754989,37.7577525400824 +297723,2011-04-10 04:27:00,ARSON,BAYVIEW,2100 Block of QUESADA AV,-122.399852840312,37.7381735692778 +297826,2011-04-09 22:20:00,DRUNKENNESS,SOUTHERN,KING ST / 4TH ST,-122.394102624525,37.7763827130285 +297931,2011-04-09 17:25:00,DRUNKENNESS,SOUTHERN,1400 Block of MARKET ST,-122.418480564808,37.775898446204 +298054,2011-04-09 12:00:00,KIDNAPPING,SOUTHERN,6TH ST / HOWARD ST,-122.407163046954,37.7797376338991 +298063,2011-04-09 11:36:00,DRUNKENNESS,MISSION,700 Block of YORK ST,-122.408898068211,37.7598867336721 +298205,2011-04-08 23:11:00,DRUNKENNESS,NORTHERN,600 Block of LINDEN ST,-122.428666208752,37.7757342027431 +298226,2011-04-08 22:45:00,KIDNAPPING,SOUTHERN,0 Block of SHERIDAN ST,-122.411257162898,37.7725006562501 +298262,2011-04-08 21:14:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +298319,2011-04-08 19:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +298368,2011-04-08 17:30:00,RUNAWAY,INGLESIDE,700 Block of ATHENS ST,-122.43261172424,37.7162133317028 +298468,2011-04-08 13:23:00,ARSON,SOUTHERN,900 Block of MARKET ST,-122.409536662692,37.78269112134721 +298469,2011-04-08 13:08:00,DRUNKENNESS,MISSION,700 Block of ALABAMA ST,-122.411572788477,37.7597252282091 +298604,2011-04-08 01:18:00,DRUNKENNESS,TENDERLOIN,100 Block of HYDE ST,-122.415669661443,37.7821198488931 +298673,2011-04-07 21:00:00,KIDNAPPING,MISSION,200 Block of 14TH ST,-122.419629390005,37.7683500078704 +298861,2011-04-07 12:20:00,ARSON,CENTRAL,1700 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +299027,2011-04-06 21:41:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +299090,2011-04-06 19:11:00,DRUNKENNESS,MISSION,2800 Block of MISSION ST,-122.418434028318,37.7514199300011 +299120,2011-04-06 17:47:00,DRUNKENNESS,PARK,0 Block of CASTRO ST,-122.435637436721,37.7681694346175 +299303,2011-04-06 09:00:00,RUNAWAY,SOUTHERN,1300 Block of MISSION ST,-122.415757039196,37.7754692820041 +299321,2011-04-06 08:00:00,RUNAWAY,TARAVAL,200 Block of MONTICELLO ST,-122.470673521408,37.7187815894447 +299393,2011-04-05 23:36:00,KIDNAPPING,INGLESIDE,1200 Block of SUNNYDALE AV,-122.414017542167,37.7112967864555 +299395,2011-04-05 23:36:00,KIDNAPPING,INGLESIDE,1200 Block of SUNNYDALE AV,-122.414017542167,37.7112967864555 +299412,2011-04-05 22:15:00,DRUNKENNESS,TARAVAL,1200 Block of 9TH AV,-122.466444373211,37.7649596797552 +299463,2011-04-05 19:10:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +299558,2011-04-05 15:12:00,ARSON,NORTHERN,2900 Block of VANNESS AV,-122.424656302023,37.8027754871782 +299611,2011-04-05 12:00:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +299656,2011-04-05 09:36:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +299731,2011-04-05 00:01:00,KIDNAPPING,TARAVAL,2600 Block of 46TH AV,-122.504361268704,37.73709550857429 +299757,2011-04-04 22:30:00,KIDNAPPING,BAYVIEW,100 Block of CAMERON WY,-122.387181635995,37.7209669615499 +299802,2011-04-04 19:30:00,ARSON,INGLESIDE,600 Block of CAYUGA AV,-122.436317943981,37.7279249997202 +299877,2011-04-04 15:21:00,RUNAWAY,BAYVIEW,0 Block of HILLVIEW CT,-122.385120101084,37.7354837756996 +299962,2011-04-04 10:00:00,RUNAWAY,INGLESIDE,100 Block of OCEAN AV,-122.43934468789,37.723624467748 +300076,2011-03-27 23:55:00,KIDNAPPING,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +300083,2011-03-27 23:30:00,KIDNAPPING,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +300105,2011-03-27 22:00:00,KIDNAPPING,MISSION,2200 Block of MISSION ST,-122.419212198636,37.7610244167023 +300106,2011-03-27 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +300359,2011-03-27 01:19:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +300444,2011-03-26 22:34:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +300491,2011-03-26 20:13:00,DRUNKENNESS,MISSION,3100 Block of 22ND ST,-122.418208517373,37.755524488206 +300557,2011-03-26 17:00:00,DRUNKENNESS,MISSION,HARRISON ST / 22ND ST,-122.412199182895,37.7558320631383 +300572,2011-03-26 16:50:00,DRUNKENNESS,MISSION,100 Block of BARTLETT ST,-122.419711251166,37.7545565620279 +300605,2011-03-26 14:54:00,RUNAWAY,BAYVIEW,1400 Block of LASALLE AV,-122.386304220968,37.7349050342849 +300743,2011-03-26 01:50:00,KIDNAPPING,SOUTHERN,1200 Block of HARRISON ST,-122.409065690706,37.773248092065 +300765,2011-03-26 00:40:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +300799,2011-03-25 23:30:00,ARSON,TARAVAL,300 Block of SERRANO DR,-122.480450749459,37.7190118676786 +300814,2011-03-25 23:00:00,ARSON,MISSION,100 Block of SHOTWELL ST,-122.416535463075,37.7660406107786 +300915,2011-03-25 19:17:00,DRUNKENNESS,BAYVIEW,3RD ST / NEWCOMB AV,-122.390416955474,37.7355926105862 +300967,2011-03-25 17:45:00,KIDNAPPING,TARAVAL,100 Block of HOLLOWAY AV,-122.454626813785,37.7219048931886 +300973,2011-03-25 17:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +301171,2011-03-25 01:53:00,DRUNKENNESS,SOUTHERN,0 Block of NEWMONTGOMERY ST,-122.401817240144,37.788440503956 +301183,2011-03-25 00:21:00,DRUNKENNESS,BAYVIEW,1600 Block of 17TH ST,-122.400162362987,37.7649810093866 +301231,2011-03-24 22:30:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +301256,2011-03-24 21:32:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +301646,2011-03-23 18:50:00,KIDNAPPING,INGLESIDE,500 Block of MOULTRIE ST,-122.415829928155,37.737815542051294 +301743,2011-03-23 14:46:00,DRUNKENNESS,INGLESIDE,500 Block of BOSWORTH ST,-122.433536099752,37.7335561383577 +302315,2011-03-21 19:32:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +302331,2011-03-21 18:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +302347,2011-03-21 17:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +302425,2011-03-21 13:11:00,DRUNKENNESS,PARK,HAIGHT ST / BUENAVISTAWEST AV,-122.443311949602,37.7704697548539 +302536,2011-03-21 02:02:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +302549,2011-03-21 00:50:00,KIDNAPPING,BAYVIEW,1300 Block of 16TH ST,-122.400272764667,37.7662745684538 +302581,2011-03-13 23:35:00,DRUNKENNESS,CENTRAL,2500 Block of POWELL ST,-122.412360253337,37.8081755740357 +302643,2011-03-13 20:00:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +302685,2011-03-13 16:50:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +302691,2011-03-13 16:07:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +302835,2011-03-13 04:34:00,DRUNKENNESS,SOUTHERN,900 Block of BRYANT ST,-122.405926775837,37.7734271309539 +302851,2011-03-13 03:14:00,DRUNKENNESS,MISSION,500 Block of CASTRO ST,-122.434994783089,37.76006971065671 +302854,2011-03-13 03:10:00,KIDNAPPING,INGLESIDE,ONONDAGA AV / MISSION ST,-122.437461502349,37.7211650807414 +302855,2011-03-13 03:10:00,KIDNAPPING,INGLESIDE,ONONDAGA AV / MISSION ST,-122.437461502349,37.7211650807414 +302945,2011-03-12 23:00:00,KIDNAPPING,CENTRAL,500 Block of POST ST,-122.410904846406,37.788029392285104 +302992,2011-03-12 20:15:00,DRUNKENNESS,NORTHERN,2900 Block of BAKER ST,-122.44581311621,37.798175526468896 +303271,2011-03-12 01:13:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +303292,2011-03-12 00:05:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +303335,2011-03-11 23:00:00,ARSON,NORTHERN,100 Block of CHURCH ST,-122.429080297019,37.7681979747465 +303345,2011-03-11 22:58:00,KIDNAPPING,INGLESIDE,0 Block of ADDISON ST,-122.432513268341,37.7377582824808 +303393,2011-03-11 20:34:00,ARSON,BAYVIEW,700 Block of JAMESTOWN AV,-122.389039223072,37.7151390330171 +303418,2011-03-11 19:29:00,DRUNKENNESS,SOUTHERN,0 Block of THE EMBARCADEROSOUTH ST,-122.388379873919,37.783310406701496 +303675,2011-03-11 05:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +303679,2011-03-11 04:25:00,ARSON,NORTHERN,1300 Block of VANNESS AV,-122.421734189838,37.7882961275539 +303704,2011-03-11 01:40:00,DRUNKENNESS,MISSION,3300 Block of 18TH ST,-122.418830499608,37.7618127068587 +303724,2011-03-11 00:05:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +303754,2011-03-10 21:35:00,KIDNAPPING,TARAVAL,200 Block of BROAD ST,-122.460830178051,37.71310598536179 +303755,2011-03-10 21:35:00,KIDNAPPING,TARAVAL,200 Block of BROAD ST,-122.460830178051,37.71310598536179 +303835,2011-03-10 16:49:00,ARSON,MISSION,3000 Block of CESAR CHAVEZ ST,-122.410099481127,37.748427364539104 +303866,2011-03-10 15:08:00,RUNAWAY,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +304211,2011-03-09 15:57:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411965795229,37.78491418595621 +304468,2011-03-08 22:26:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +304499,2011-03-08 20:10:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +304557,2011-03-08 17:00:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +305203,2011-02-27 20:19:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552636,37.7693505381781 +305390,2011-02-27 03:05:00,KIDNAPPING,INGLESIDE,MISSION ST / TRUMBULL ST,-122.429306728376,37.7307429169559 +305400,2011-02-27 02:17:00,DRUNKENNESS,TENDERLOIN,100 Block of ELLIS ST,-122.408270724034,37.78549414241861 +305418,2011-02-27 01:08:00,DRUNKENNESS,SOUTHERN,1000 Block of FOLSOM ST,-122.405834032593,37.778254811523 +305511,2011-02-26 22:00:00,KIDNAPPING,NORTHERN,1100 Block of BUCHANAN ST,-122.4286923384,37.780466784489896 +305806,2011-02-26 02:10:00,KIDNAPPING,CENTRAL,0 Block of TELEGRAPHHILL BL,-122.405471739992,37.8022505061483 +305816,2011-02-26 02:00:00,DRUNKENNESS,MISSION,3200 Block of 22ND ST,-122.420416589297,37.7553850064785 +305825,2011-02-26 00:59:00,DRUNKENNESS,RICHMOND,3000 Block of FULTON ST,-122.464301593843,37.7736093391917 +306170,2011-02-25 06:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +306411,2011-02-24 12:20:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +306509,2011-02-24 02:00:00,KIDNAPPING,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +306527,2011-02-23 23:58:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +306588,2011-02-23 20:00:00,KIDNAPPING,BAYVIEW,4500 Block of 3RD ST,-122.390136349844,37.7368036226976 +306591,2011-02-23 20:00:00,KIDNAPPING,BAYVIEW,4500 Block of 3RD ST,-122.390136349844,37.7368036226976 +306787,2011-02-23 11:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +306833,2011-02-23 08:40:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +306924,2011-02-22 22:30:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.412320907436,37.7807642254398 +307106,2011-02-22 12:00:00,KIDNAPPING,TARAVAL,1800 Block of 33RD AV,-122.49133968179702,37.75262988413751 +307196,2011-02-22 08:00:00,RUNAWAY,MISSION,900 Block of DOLORES ST,-122.425236707185,37.7542221906773 +307243,2011-02-22 00:55:00,DRUNKENNESS,NORTHERN,VANNESS AV / EDDY ST,-122.420818330445,37.7828946450912 +307268,2011-02-21 23:50:00,DRUNKENNESS,SOUTHERN,200 Block of KING ST,-122.393110640713,37.77731032196979 +307293,2011-02-21 22:00:00,RUNAWAY,INGLESIDE,300 Block of BOCANA ST,-122.419131465235,37.7383268459839 +307428,2011-02-21 15:00:00,RUNAWAY,BAYVIEW,0 Block of JENNINGS CT,-122.397002513589,37.7172288346299 +307454,2011-02-21 14:15:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +307549,2011-02-21 09:00:00,KIDNAPPING,TARAVAL,700 Block of TARAVAL ST,-122.474095076176,37.7430648105289 +307610,2011-02-21 01:36:00,DRUNKENNESS,SOUTHERN,300 Block of 5TH ST,-122.403147883142,37.779995959798 +307621,2011-02-21 00:13:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +307692,2011-02-13 19:10:00,KIDNAPPING,SOUTHERN,0 Block of 9TH ST,-122.414953043045,37.7765019124574 +307911,2011-02-13 02:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +307915,2011-02-13 02:30:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +307916,2011-02-13 02:22:00,DRUNKENNESS,CENTRAL,900 Block of SANSOME ST,-122.402258143298,37.7989237331944 +307935,2011-02-13 01:15:00,KIDNAPPING,SOUTHERN,1800 Block of MARKET ST,-122.424336949139,37.771292378056 +307984,2011-02-12 23:05:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.419520367886,37.764228935718 +308105,2011-02-12 18:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +308159,2011-02-12 15:20:00,DRUNKENNESS,TENDERLOIN,0 Block of MASON ST,-122.409268441444,37.7837998723601 +308228,2011-02-12 11:30:00,KIDNAPPING,TARAVAL,LINCOLN WY / 47TH AV,-122.507259973388,37.764112985988895 +308251,2011-02-12 09:25:00,KIDNAPPING,TARAVAL,1200 Block of 22ND AV,-122.480470787971,37.764342052942 +308476,2011-02-11 19:00:00,KIDNAPPING,MISSION,1800 Block of MISSION ST,-122.419970859857,37.7674540344176 +308511,2011-02-11 17:45:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +308519,2011-02-11 17:29:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +308934,2011-02-10 15:00:00,ARSON,NORTHERN,1200 Block of VANNESS AV,-122.421542407955,37.7873481804938 +308972,2011-02-10 13:03:00,ARSON,BAYVIEW,600 Block of DEHARO ST,-122.401191922623,37.7616428225519 +308974,2011-02-10 13:03:00,ARSON,BAYVIEW,600 Block of DEHARO ST,-122.401191922623,37.7616428225519 +309096,2011-02-10 02:06:00,ARSON,TARAVAL,0 Block of THOMASMORE WY,-122.472937446669,37.7122522752262 +309226,2011-02-09 18:15:00,DRUNKENNESS,CENTRAL,JONES ST / BEACH ST,-122.417265053145,37.807073051215 +309311,2011-02-09 15:00:00,ARSON,TARAVAL,2100 Block of 24TH AV,-122.481305019184,37.747461318190496 +309471,2011-02-08 23:52:00,ARSON,TENDERLOIN,TAYLOR ST / ELLIS ST,-122.411141948101,37.7850736197499 +309509,2011-02-08 21:50:00,ARSON,MISSION,2900 Block of FOLSOM ST,-122.413777740935,37.7500922132283 +309536,2011-02-08 21:00:00,DRUNKENNESS,MISSION,1400 Block of VALENCIA ST,-122.420497863936,37.749686670992 +309621,2011-02-08 17:16:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +309827,2011-02-08 02:01:00,ARSON,TARAVAL,IRVING ST / 37TH AV,-122.464173729443,37.7641301468372 +309892,2011-02-07 20:50:00,KIDNAPPING,TARAVAL,200 Block of HOLLOWAY AV,-122.45564374772,37.7217922825182 +309947,2011-02-07 17:48:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +309984,2011-02-07 16:00:00,KIDNAPPING,SOUTHERN,1100 Block of HOWARD ST,-122.411359138357,37.7764944808779 +309996,2011-02-07 15:18:00,KIDNAPPING,INGLESIDE,3900 Block of MISSION ST,-122.425181516357,37.7347570904995 +310009,2011-02-07 15:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +310151,2011-02-07 02:05:00,KIDNAPPING,MISSION,3100 Block of 22ND ST,-122.418208517373,37.755524488206 +310157,2011-02-07 01:30:00,ARSON,TENDERLOIN,EDDY ST / HYDE ST,-122.415885065788,37.783516056415294 +310169,2011-02-07 00:01:00,ARSON,NORTHERN,1500 Block of GOUGH ST,-122.42512154361602,37.7878477462136 +310278,2011-01-30 17:35:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +310427,2011-01-30 02:36:00,DRUNKENNESS,PARK,4100 Block of 17TH ST,-122.437875160632,37.7622679654099 +310439,2011-01-30 02:00:00,ARSON,MISSION,1100 Block of SOUTH VAN NESS AV,-122.41641961495,37.7547568332768 +310452,2011-01-30 01:27:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435573154199,37.7609106220681 +310543,2011-01-29 21:12:00,DRUNKENNESS,SOUTHERN,200 Block of 8TH ST,-122.411386799517,37.7759688121016 +310659,2011-01-29 15:00:00,ARSON,RICHMOND,400 Block of MIDDLE DR,-122.46393260639,37.7698400411124 +310702,2011-01-29 12:15:00,ARSON,BAYVIEW,1000 Block of OAKDALE AV,-122.380268162997,37.7289171340996 +310764,2011-01-29 04:47:00,KIDNAPPING,NORTHERN,1100 Block of ELLIS ST,-122.425944356826,37.7831367499779 +310806,2011-01-29 00:37:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +310873,2011-01-28 21:55:00,DRUNKENNESS,TARAVAL,800 Block of IRVING ST,-122.466861035773,37.764067832215794 +310892,2011-01-28 21:00:00,RUNAWAY,PARK,1600 Block of TURK ST,-122.43627497948098,37.7800247331065 +311242,2011-01-27 23:09:00,DRUNKENNESS,MISSION,400 Block of POTRERO AV,-122.407292171191,37.7638291911821 +311257,2011-01-27 22:31:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +311295,2011-01-27 20:30:00,ARSON,BAYVIEW,CARROLL AV / FITCH ST,-122.384088266199,37.7196684684616 +311309,2011-01-27 20:00:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +311356,2011-01-27 18:00:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +311382,2011-01-27 16:15:00,RUNAWAY,PARK,300 Block of ROOSEVELT WY,-122.441583738163,37.76533785321821 +311507,2011-01-27 10:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +311517,2011-01-27 09:26:00,DRUNKENNESS,CENTRAL,200 Block of JEFFERSON ST,-122.415010032996,37.80836981613911 +311654,2011-01-26 21:20:00,RUNAWAY,INGLESIDE,400 Block of GATES ST,-122.414117509486,37.737719162259495 +311788,2011-01-26 15:45:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +311829,2011-01-26 14:00:00,KIDNAPPING,INGLESIDE,500 Block of SAWYER ST,-122.415591793017,37.7106745172657 +311896,2011-01-26 11:14:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +312137,2011-01-25 18:15:00,DRUNKENNESS,BAYVIEW,1500 Block of LASALLE AV,-122.387860308012,37.736162689487706 +312292,2011-01-25 09:40:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +312370,2011-01-25 00:05:00,ARSON,NORTHERN,1100 Block of SUTTER ST,-122.41931732407,37.7879136979106 +312381,2011-01-24 23:42:00,DRUNKENNESS,SOUTHERN,1100 Block of MISSION ST,-122.412736707425,37.7777124404316 +312425,2011-01-24 21:07:00,DRUNKENNESS,MISSION,3500 Block of CESAR CHAVEZ ST,-122.420832650303,37.7479994493226 +312427,2011-01-24 21:00:00,RUNAWAY,NORTHERN,1200 Block of EDDY ST,-122.428245242312,37.7820044139073 +312647,2011-01-24 07:49:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +312678,2011-01-24 00:21:00,DRUNKENNESS,SOUTHERN,100 Block of HARRIET ST,-122.405309145663,37.7774906983919 +312741,2011-01-16 21:07:00,KIDNAPPING,CENTRAL,1100 Block of BUSH ST,-122.416221156508,37.7892672343725 +312807,2011-01-16 17:55:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +312808,2011-01-16 17:55:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +312858,2011-01-16 15:17:00,DRUNKENNESS,PARK,ASHBURY ST / WALLER ST,-122.446746271794,37.7690753300241 +313018,2011-01-16 00:45:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.414328770789,37.7716700767604 +313099,2011-01-15 21:32:00,DRUNKENNESS,RICHMOND,800 Block of 25TH AV,-122.484189715414,37.7734880187429 +313181,2011-01-15 17:51:00,KIDNAPPING,INGLESIDE,1100 Block of BRUSSELS ST,-122.401913102892,37.71808868309 +313203,2011-01-15 16:35:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406460643507,37.7979466732983 +313386,2011-01-15 06:43:00,KIDNAPPING,TENDERLOIN,HYDE ST / GEARY ST,-122.416452065595,37.7863086885804 +313395,2011-01-15 04:43:00,ARSON,BAYVIEW,1200 Block of CARROLL AV,-122.386794148992,37.7213396556221 +313396,2011-01-15 04:27:00,ARSON,NORTHERN,600 Block of FULTON ST,-122.428249599273,37.7780677663985 +313553,2011-01-14 20:50:00,ARSON,BAYVIEW,1200 Block of GILMAN AV,-122.392861732871,37.720844254485 +313771,2011-01-14 11:55:00,KIDNAPPING,TENDERLOIN,700 Block of OFARRELL ST,-122.417085357424,37.7852153590471 +313797,2011-01-14 09:30:00,DRUNKENNESS,MISSION,400 Block of CHURCH ST,-122.4286109134,37.7632288973036 +314131,2011-01-13 10:10:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +314167,2011-01-13 07:36:00,ARSON,INGLESIDE,200 Block of ONEIDA AV,-122.443009986764,37.7218704825421 +314185,2011-01-13 05:00:00,KIDNAPPING,INGLESIDE,900 Block of GOETTINGEN ST,-122.403933384073,37.7203854060993 +314204,2011-01-13 01:28:00,KIDNAPPING,TENDERLOIN,300 Block of GOLDEN GATE AV,-122.41635198735202,37.7816031438671 +314207,2011-01-13 01:28:00,DRUNKENNESS,TENDERLOIN,300 Block of GOLDEN GATE AV,-122.41635198735202,37.7816031438671 +314395,2011-01-12 17:00:00,KIDNAPPING,TENDERLOIN,LARKIN ST / GROVE ST,-122.416583456133,37.7786591541508 +314576,2011-01-12 08:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +314663,2011-01-11 21:15:00,ARSON,TENDERLOIN,400 Block of OFARRELL ST,-122.411742515582,37.7858882195106 +314723,2011-01-11 18:16:00,ARSON,TARAVAL,500 Block of LAKEVIEW AV,-122.45458258634,37.7181829809 +314955,2011-01-11 02:14:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +315007,2011-01-10 23:34:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +315038,2011-01-10 22:00:00,RUNAWAY,MISSION,3800 Block of MARKET ST,-122.442794767705,37.75280293431009 +315181,2011-01-10 15:30:00,KIDNAPPING,BAYVIEW,CORTLAND AV / BAY SHORE BL,-122.40697950796302,37.739566960911 +315268,2011-01-10 11:05:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 45TH AV,-122.470233355939,37.7432867393893 +315624,2011-01-02 01:02:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +315709,2011-01-01 19:34:00,DRUNKENNESS,SOUTHERN,800 Block of MISSION ST,-122.404636264759,37.7842645474624 +315736,2011-01-01 18:00:00,KIDNAPPING,TARAVAL,300 Block of JULES AV,-122.461184430751,37.72431155989779 +315738,2011-01-01 17:58:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +315804,2011-01-01 14:20:00,DRUNKENNESS,PARK,5TH AV / HUGO ST,-122.462097175804,37.7651618744904 +315839,2011-01-01 12:16:00,DRUNKENNESS,MISSION,100 Block of UTAH ST,-122.406667637408,37.7677704791539 +315891,2011-01-01 10:44:00,KIDNAPPING,CENTRAL,1000 Block of BUSH ST,-122.414554947333,37.789368344193896 +316000,2011-01-01 02:54:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +316027,2011-01-01 02:01:00,DRUNKENNESS,RICHMOND,3900 Block of GEARY BL,-122.461603688677,37.7810177788514 +316048,2011-01-01 01:34:00,DRUNKENNESS,CENTRAL,100 Block of BARTOL ST,-122.403538079934,37.79876013123821 +316118,2011-01-01 00:05:00,KIDNAPPING,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +316310,2010-12-31 23:42:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.427682264817,37.76831480085021 +316326,2010-12-31 23:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +316437,2010-12-31 18:30:00,DRUNKENNESS,TARAVAL,1600 Block of 47TH AV,-122.506738808355,37.7556938548753 +316445,2010-12-31 18:02:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +316544,2010-12-31 13:18:00,DRUNKENNESS,CENTRAL,700 Block of POST ST,-122.41420144235,37.7876109394648 +316586,2010-12-31 11:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +316607,2010-12-31 09:10:00,RUNAWAY,INGLESIDE,0 Block of BOSWORTH ST,-122.427051144538,37.7336688790295 +316650,2010-12-31 03:45:00,DRUNKENNESS,MISSION,3800 Block of 24TH ST,-122.427997868834,37.7517260359895 +316881,2010-12-30 13:00:00,KIDNAPPING,CENTRAL,700 Block of KEARNY ST,-122.404847847867,37.7951006528052 +316992,2010-12-30 03:25:00,DRUNKENNESS,RICHMOND,400 Block of 22ND AV,-122.481515979074,37.7792471997855 +317018,2010-12-30 00:48:00,DRUNKENNESS,NORTHERN,1200 Block of POLK ST,-122.420326993863,37.7884521578132 +317067,2010-12-29 21:36:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +317282,2010-12-29 12:00:00,KIDNAPPING,PARK,1800 Block of WALLER ST,-122.454330105396,37.7681530111159 +317405,2010-12-28 23:55:00,DRUNKENNESS,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +317689,2010-12-28 02:52:00,KIDNAPPING,INGLESIDE,200 Block of NEVADA ST,-122.411499350096,37.7390087220058 +317713,2010-12-28 00:01:00,DRUNKENNESS,NORTHERN,1100 Block of OFARRELL ST,-122.42201624387,37.784594328547705 +317749,2010-12-27 21:34:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411071423064,37.7817511307229 +317831,2010-12-27 18:05:00,KIDNAPPING,NORTHERN,TURK ST / LAGUNA ST,-122.427206305932,37.78111752563769 +317853,2010-12-27 17:00:00,RUNAWAY,BAYVIEW,1000 Block of FITZGERALD AV,-122.388416108229,37.7191956969734 +317969,2010-12-27 10:07:00,DRUNKENNESS,MISSION,TREAT AV / 26TH ST,-122.412690142308,37.7493688284532 +318041,2010-12-27 00:15:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +318087,2010-12-19 21:25:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +318117,2010-12-19 20:00:00,RUNAWAY,SOUTHERN,1300 Block of MISSION ST,-122.415757039196,37.7754692820041 +318289,2010-12-19 06:30:00,ARSON,BAYVIEW,1300 Block of EGBERT AV,-122.391735595633,37.7220943663259 +318341,2010-12-19 01:21:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +318348,2010-12-19 01:10:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +318400,2010-12-18 23:00:00,DRUNKENNESS,TENDERLOIN,100 Block of ELLIS ST,-122.408270724034,37.78549414241861 +318453,2010-12-18 21:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +318526,2010-12-18 19:00:00,KIDNAPPING,INGLESIDE,5000 Block of MISSION ST,-122.44018678362,37.71740509241629 +318575,2010-12-18 16:30:00,DRUNKENNESS,NORTHERN,1800 Block of GREENWICH ST,-122.430117489363,37.7996273227524 +318981,2010-12-17 13:21:00,DRUNKENNESS,SOUTHERN,100 Block of HOWARD ST,-122.393023604356,37.7909940356997 +319133,2010-12-16 23:57:00,DRUNKENNESS,MISSION,20TH ST / YORK ST,-122.408906740626,37.7592476644594 +319326,2010-12-16 16:00:00,RUNAWAY,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +319346,2010-12-16 15:13:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +319560,2010-12-15 22:12:00,DRUNKENNESS,MISSION,200 Block of CAPP ST,-122.418415888321,37.7626869631943 +319651,2010-12-15 18:50:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +319677,2010-12-15 18:00:00,KIDNAPPING,CENTRAL,1100 Block of HYDE ST,-122.41742026115,37.79146578806 +319682,2010-12-15 18:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +319791,2010-12-15 13:15:00,ARSON,BAYVIEW,900 Block of MARIN ST,-122.385973163497,37.7491479018283 +319993,2010-12-14 22:00:00,KIDNAPPING,NORTHERN,2000 Block of POLK ST,-122.421608893207,37.7955038710773 +320205,2010-12-14 09:20:00,KIDNAPPING,INGLESIDE,600 Block of PORTOLA DR,-122.451904398893,37.745299339030296 +320294,2010-12-13 22:20:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +320311,2010-12-13 22:00:00,KIDNAPPING,NORTHERN,1200 Block of TURK ST,-122.428840433603,37.780972734343706 +320341,2010-12-13 20:35:00,DRUNKENNESS,SOUTHERN,10TH ST / HOWARD ST,-122.414370627495,37.7740418385041 +320347,2010-12-13 20:15:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.413790972781,37.7838365565348 +320623,2010-12-13 04:20:00,KIDNAPPING,INGLESIDE,500 Block of MORSE ST,-122.442856862827,37.7119776996093 +320631,2010-12-13 02:03:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421550176461,37.7621307247611 +320773,2010-12-05 16:20:00,KIDNAPPING,TARAVAL,2300 Block of 30TH AV,-122.48760931927,37.7434442719791 +320856,2010-12-05 10:18:00,ARSON,SOUTHERN,0 Block of WASHBURN ST,-122.414406294791,37.7752362231466 +321079,2010-12-04 18:35:00,DRUNKENNESS,RICHMOND,800 Block of 33RD AV,-122.49276166701,37.773096961388 +321241,2010-12-04 04:23:00,ARSON,BAYVIEW,1300 Block of UNDERWOOD AV,-122.387153625351,37.7271911468699 +321292,2010-12-03 23:47:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421738508476,37.7640972229024 +321396,2010-12-03 18:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +321700,2010-12-02 19:35:00,DRUNKENNESS,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +321714,2010-12-02 18:45:00,KIDNAPPING,MISSION,1100 Block of YORK ST,-122.40833337913,37.7536331088001 +321805,2010-12-02 15:15:00,KIDNAPPING,BAYVIEW,600 Block of DEHARO ST,-122.401191922623,37.7616428225519 +321809,2010-12-02 15:10:00,KIDNAPPING,NORTHERN,1000 Block of FILLMORE ST,-122.431790993089,37.779115741059705 +321925,2010-12-02 08:05:00,RUNAWAY,NORTHERN,1100 Block of FRANCISCO ST,-122.42412350881,37.80336133563621 +321937,2010-12-02 07:30:00,RUNAWAY,BAYVIEW,800 Block of MISSOURI ST,-122.395565360141,37.7563302749024 +321954,2010-12-02 03:12:00,DRUNKENNESS,NORTHERN,2700 Block of LOMBARD ST,-122.446640402477,37.7984867747515 +321983,2010-12-02 00:01:00,KIDNAPPING,CENTRAL,300 Block of JEFFERSON ST,-122.418270696719,37.8078519838014 +322132,2010-12-01 16:50:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +322347,2010-12-01 01:25:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +322762,2010-11-29 22:51:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +322855,2010-11-29 17:30:00,RUNAWAY,MISSION,4200 Block of 26TH ST,-122.434905968897,37.7480832493755 +322877,2010-11-29 16:40:00,DRUNKENNESS,SOUTHERN,4TH ST / BERRY ST,-122.393357241451,37.775787621829295 +322990,2010-11-29 11:00:00,RUNAWAY,MISSION,0 Block of LUCKY ST,-122.413509818711,37.7517329980946 +323111,2010-11-21 23:48:00,ARSON,TARAVAL,2900 Block of 21ST AV,-122.476943627588,37.7336184231166 +323148,2010-11-21 21:30:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +323194,2010-11-21 19:08:00,DRUNKENNESS,PARK,ROOSEVELT WY / PARKHILL AV,-122.439504049273,37.7665741417478 +323251,2010-11-21 16:15:00,DRUNKENNESS,TENDERLOIN,MARKET ST / 8TH ST,-122.414743835382,37.77871926278901 +323259,2010-11-21 15:40:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +323276,2010-11-21 15:05:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +323313,2010-11-21 12:40:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +323373,2010-11-21 07:00:00,KIDNAPPING,INGLESIDE,0 Block of VIRGINIA AV,-122.420967440564,37.742851737444894 +323406,2010-11-21 02:21:00,KIDNAPPING,RICHMOND,0 Block of BLAKE ST,-122.451352653203,37.7827982731234 +323417,2010-11-21 01:55:00,DRUNKENNESS,MISSION,3500 Block of 19TH ST,-122.421859511118,37.7600199672753 +323500,2010-11-20 21:00:00,KIDNAPPING,INGLESIDE,0 Block of MCCARTHY AV,-122.414016735122,37.7102139757025 +323729,2010-11-20 04:15:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +323777,2010-11-20 00:37:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +323781,2010-11-20 00:33:00,ARSON,INGLESIDE,100 Block of SWISS AV,-122.437982322195,37.73624116495721 +324107,2010-11-19 07:30:00,RUNAWAY,INGLESIDE,100 Block of DELMONTE ST,-122.444327662833,37.7149771344256 +324144,2010-11-19 01:00:00,ARSON,RICHMOND,800 Block of 24TH AV,-122.483116523047,37.773537051268704 +324190,2010-11-18 22:00:00,RUNAWAY,RICHMOND,800 Block of 36TH AV,-122.496111380439,37.7729435573164 +324224,2010-11-18 20:38:00,KIDNAPPING,SOUTHERN,200 Block of THE EMBARCADEROSOUTH ST,-122.396374439116,37.79805325280579 +324422,2010-11-18 09:30:00,KIDNAPPING,BAYVIEW,0 Block of WILLS ST,-122.378902736531,37.73619076744311 +324478,2010-11-18 01:10:00,DRUNKENNESS,TENDERLOIN,100 Block of ELLIS ST,-122.408270724034,37.78549414241861 +324552,2010-11-17 20:30:00,KIDNAPPING,BAYVIEW,100 Block of TOPEKA AV,-122.398088929937,37.7335006841226 +324571,2010-11-17 19:30:00,ARSON,MISSION,500 Block of 14TH ST,-122.42488784779,37.768032836315 +324634,2010-11-17 17:00:00,RUNAWAY,TARAVAL,200 Block of MONTICELLO ST,-122.470673521408,37.7187815894447 +324648,2010-11-17 16:00:00,DRUNKENNESS,NORTHERN,HAIGHT ST / FILLMORE ST,-122.430436523474,37.772106966166895 +324828,2010-11-17 06:00:00,KIDNAPPING,NORTHERN,1700 Block of OFARRELL ST,-122.43355503388,37.783240028248 +324869,2010-11-17 00:20:00,ARSON,MISSION,700 Block of ALABAMA ST,-122.411572788477,37.7597252282091 +324870,2010-11-17 00:20:00,ARSON,MISSION,700 Block of ALABAMA ST,-122.411572788477,37.7597252282091 +324898,2010-11-16 22:22:00,ARSON,INGLESIDE,700 Block of MANSELL ST,-122.40851019567,37.7197777779827 +324973,2010-11-16 18:25:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +324987,2010-11-16 17:47:00,DRUNKENNESS,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +325143,2010-11-16 09:35:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +325181,2010-11-16 07:40:00,RUNAWAY,SOUTHERN,500 Block of NATOMA ST,-122.408201798882,37.779688614432295 +325191,2010-11-16 06:00:00,KIDNAPPING,INGLESIDE,0 Block of CARRIZAL ST,-122.420689232102,37.7092487032715 +325204,2010-11-16 02:10:00,ARSON,INGLESIDE,0 Block of VALMAR TR,-122.423548336777,37.72682302194129 +325651,2010-11-07 20:25:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418360181974,37.783149897821104 +325657,2010-11-07 20:05:00,DRUNKENNESS,MISSION,4000 Block of 18TH ST,-122.434457353955,37.7609766090845 +325704,2010-11-07 18:00:00,DRUNKENNESS,TENDERLOIN,EDDY ST / JONES ST,-122.412597377187,37.783932027727296 +325872,2010-11-07 02:24:00,ARSON,BAYVIEW,2200 Block of SAN BRUNO AV,-122.406625193766,37.7340734464505 +325890,2010-11-07 01:10:00,KIDNAPPING,CENTRAL,COLUMBUS AV / FRANCISCO ST,-122.41605582427,37.8043540452454 +325935,2010-11-06 23:25:00,DRUNKENNESS,BAYVIEW,1500 Block of THOMAS AV,-122.390412274884,37.7298480138652 +325957,2010-11-06 22:10:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +326313,2010-11-05 22:45:00,DRUNKENNESS,TARAVAL,1400 Block of 20TH AV,-122.478067213175,37.7606979828387 +326466,2010-11-05 15:59:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +326512,2010-11-05 13:57:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +326620,2010-11-05 02:51:00,DRUNKENNESS,NORTHERN,1600 Block of GEARY BL,-122.429629258891,37.7848966681924 +326720,2010-11-04 20:55:00,DRUNKENNESS,SOUTHERN,1600 Block of MARKET ST,-122.421522300696,37.7732180675925 +326763,2010-11-04 19:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +326809,2010-11-04 17:00:00,RUNAWAY,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +326963,2010-11-04 09:00:00,RUNAWAY,INGLESIDE,100 Block of PERSIA AV,-122.43476428669202,37.7226161363136 +326978,2010-11-04 07:30:00,KIDNAPPING,TARAVAL,0 Block of JULES AV,-122.461301563433,37.7191418613626 +326995,2010-11-04 03:54:00,ARSON,INGLESIDE,200 Block of JOHNFSHELLEY DR,-122.423304635548,37.72266944630029 +327056,2010-11-03 23:17:00,DRUNKENNESS,SOUTHERN,MARKET ST / 7TH ST,-122.41251534135598,37.78047774805079 +327133,2010-11-03 19:55:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +327196,2010-11-03 17:22:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +327223,2010-11-03 16:15:00,DRUNKENNESS,NORTHERN,POLK ST / GREEN ST,-122.422149614358,37.7978243786265 +327253,2010-11-03 15:20:00,DRUNKENNESS,SOUTHERN,7TH ST / MARKET ST,-122.41251534135598,37.78047774805079 +327332,2010-11-03 12:07:00,KIDNAPPING,MISSION,2500 Block of 24TH ST,-122.404851256515,37.7530372984263 +327423,2010-11-03 08:00:00,RUNAWAY,INGLESIDE,200 Block of ONEIDA AV,-122.443009986764,37.7218704825421 +327493,2010-11-03 00:31:00,DRUNKENNESS,RICHMOND,FULTON ST / 3RD AV,-122.460552664492,37.7740299858693 +327508,2010-11-02 23:38:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +327519,2010-11-02 22:46:00,DRUNKENNESS,NORTHERN,POLK ST / GROVE ST,-122.418229899721,37.7784895366813 +327666,2010-11-02 15:36:00,KIDNAPPING,CENTRAL,200 Block of CALIFORNIA ST,-122.399392457561,37.7933368944757 +327786,2010-11-02 08:05:00,KIDNAPPING,BAYVIEW,2000 Block of SILVER AV,-122.399483468572,37.73605818776321 +327792,2010-11-02 07:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +327829,2010-11-02 01:45:00,DRUNKENNESS,MISSION,2500 Block of MISSION ST,-122.418891810986,37.7562166627216 +327831,2010-11-02 01:35:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421738508476,37.7640972229024 +327835,2010-11-02 01:31:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421738508476,37.7640972229024 +327859,2010-11-02 00:25:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617192,37.778124778322 +327924,2010-11-01 21:30:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345148,37.7839916768161 +328006,2010-11-01 17:12:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412054141237,37.7816136403158 +328368,2010-10-24 20:36:00,DRUNKENNESS,MISSION,3200 Block of 23RD ST,-122.416964922852,37.7539896835859 +328439,2010-10-24 16:35:00,DRUNKENNESS,SOUTHERN,0 Block of 7TH ST,-122.412272455406,37.7802039058686 +328465,2010-10-24 15:00:00,KIDNAPPING,SOUTHERN,0 Block of ZOE ST,-122.39600694226002,37.7799354795792 +328504,2010-10-24 12:45:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +328583,2010-10-24 04:50:00,ARSON,INGLESIDE,MANSELL ST / UNIVERSITY ST,-122.410942803793,37.718958445599 +328584,2010-10-24 04:48:00,DRUNKENNESS,PARK,1200 Block of HAIGHT ST,-122.442678874433,37.770606135285504 +328636,2010-10-24 01:30:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414269361877,37.7842081124308 +328681,2010-10-23 22:40:00,DRUNKENNESS,SOUTHERN,700 Block of 3RD ST,-122.392237353343,37.7785204661785 +328685,2010-10-23 22:24:00,DRUNKENNESS,SOUTHERN,0 Block of MARKET ST,-122.395097774181,37.79405904855621 +328690,2010-10-23 22:00:00,DRUNKENNESS,NORTHERN,POLK ST / BROADWAY ST,-122.421772135304,37.79594615319579 +328720,2010-10-23 20:46:00,DRUNKENNESS,SOUTHERN,100 Block of KING ST,-122.390858609124,37.779096360374 +328900,2010-10-23 11:00:00,KIDNAPPING,MISSION,3200 Block of 26TH ST,-122.414593171104,37.7491990535295 +328995,2010-10-23 02:56:00,DRUNKENNESS,BAYVIEW,SAN BRUNO AV / WOOLSEY ST,-122.402603565418,37.7252355695069 +329023,2010-10-23 01:40:00,DRUNKENNESS,TENDERLOIN,500 Block of OFARRELL ST,-122.413798415869,37.7856297942374 +329144,2010-10-22 19:35:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +329188,2010-10-22 18:00:00,ARSON,BAYVIEW,1200 Block of GRIFFITH ST,-122.380038472812,37.7273299979438 +329220,2010-10-22 17:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +329236,2010-10-22 16:25:00,KIDNAPPING,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +329393,2010-10-22 08:25:00,RUNAWAY,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +329448,2010-10-22 01:56:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +329452,2010-10-22 01:45:00,KIDNAPPING,INGLESIDE,900 Block of GENEVA AV,-122.440743149905,37.7161388666379 +329457,2010-10-22 01:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +329490,2010-10-21 23:17:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929231,37.7980180687744 +329563,2010-10-21 19:20:00,ARSON,TENDERLOIN,GROVE ST / HYDE ST,-122.414743835382,37.77871926278901 +329616,2010-10-21 16:39:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +329915,2010-10-20 21:33:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +329942,2010-10-20 20:10:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +329966,2010-10-20 18:45:00,DRUNKENNESS,BAYVIEW,0 Block of GIANTS DR,-122.38750147945,37.716878646429 +329974,2010-10-20 18:20:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +330340,2010-10-19 20:22:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405863212632,37.7980228452184 +330363,2010-10-19 19:29:00,DRUNKENNESS,BAYVIEW,CONNECTICUT ST / 20TH ST,-122.397251342762,37.7599687625377 +330437,2010-10-19 16:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +330529,2010-10-19 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +330621,2010-10-19 07:00:00,RUNAWAY,INGLESIDE,0 Block of CASSANDRA CT,-122.448818435191,37.7094597471328 +330632,2010-10-19 05:43:00,DRUNKENNESS,NORTHERN,1000 Block of MCALLISTER ST,-122.428442307611,37.7789982847524 +330644,2010-10-19 03:41:00,ARSON,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +330660,2010-10-19 01:15:00,ARSON,CENTRAL,100 Block of THE EMBARCADERONORTH ST,-122.39384397290002,37.7953080071145 +330833,2010-10-18 15:36:00,RUNAWAY,NORTHERN,2100 Block of WEBSTER ST,-122.432543133147,37.790481787417896 +330884,2010-10-18 12:00:00,KIDNAPPING,NORTHERN,FILLMORE ST / HERMANN ST,-122.430076617284,37.770242204169 +330972,2010-10-18 01:32:00,DRUNKENNESS,CENTRAL,500 Block of GEARY ST,-122.41277729699,37.7868343892701 +331073,2010-10-10 20:26:00,DRUNKENNESS,RICHMOND,400 Block of PRESIDIO AV,-122.4468133453,37.7877237373189 +331085,2010-10-10 19:48:00,DRUNKENNESS,MISSION,500 Block of CASTRO ST,-122.434994783089,37.76006971065671 +331096,2010-10-10 19:19:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +331195,2010-10-10 14:00:00,DRUNKENNESS,CENTRAL,400 Block of CLAY ST,-122.400922761049,37.794959803128 +331317,2010-10-10 02:45:00,DRUNKENNESS,RICHMOND,300 Block of SPRUCE ST,-122.453610855393,37.78778630279589 +331322,2010-10-10 02:39:00,DRUNKENNESS,SOUTHERN,400 Block of 6TH ST,-122.403671442177,37.77703244359461 +331414,2010-10-09 22:09:00,ARSON,TARAVAL,400 Block of VIDAL DR,-122.484852300285,37.716703424112 +331492,2010-10-09 19:00:00,KIDNAPPING,TENDERLOIN,400 Block of OFARRELL ST,-122.411742515582,37.7858882195106 +331609,2010-10-09 13:46:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +331816,2010-10-08 23:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +331995,2010-10-08 14:42:00,DRUNKENNESS,INGLESIDE,0 Block of CORTLAND AV,-122.422242952522,37.7408461949576 +332095,2010-10-08 08:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +332471,2010-10-07 10:35:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +332518,2010-10-07 08:30:00,KIDNAPPING,BAYVIEW,1800 Block of CESAR CHAVEZ ST,-122.395805200041,37.74982890678511 +332644,2010-10-06 20:13:00,ARSON,BAYVIEW,700 Block of INGERSON AV,-122.389247520149,37.71687590372579 +333032,2010-10-05 20:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +333370,2010-10-04 23:40:00,KIDNAPPING,NORTHERN,3300 Block of BUCHANAN ST,-122.432743727392,37.8005252171826 +333420,2010-10-04 21:23:00,DRUNKENNESS,CENTRAL,600 Block of JACKSON ST,-122.40604615148,37.796043949798005 +333446,2010-10-04 20:04:00,ARSON,BAYVIEW,1700 Block of LANE ST,-122.390507422259,37.73137596298579 +333517,2010-10-04 17:00:00,KIDNAPPING,NORTHERN,1500 Block of SUTTER ST,-122.425861480958,37.78697134176871 +333653,2010-10-04 07:30:00,RUNAWAY,MISSION,2700 Block of 22ND ST,-122.408960920166,37.7559718109451 +333724,2010-09-26 22:58:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +333753,2010-09-26 20:52:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +333762,2010-09-26 20:00:00,ARSON,BAYVIEW,1600 Block of KIRKWOOD AV,-122.390952930587,37.7386625599684 +333787,2010-09-26 19:00:00,KIDNAPPING,SOUTHERN,MARKET ST / 10TH ST,-122.417504703145,37.7765400380328 +333832,2010-09-26 16:53:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +333943,2010-09-26 07:12:00,ARSON,BAYVIEW,0 Block of SALINAS AV,-122.396737854085,37.7208617526003 +334012,2010-09-26 00:30:00,ARSON,SOUTHERN,0 Block of GRACE ST,-122.414650419926,37.7750196452844 +334062,2010-09-25 22:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +334119,2010-09-25 19:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +334127,2010-09-25 19:25:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +334133,2010-09-25 19:00:00,RUNAWAY,MISSION,900 Block of SOUTH VAN NESS AV,-122.416725586439,37.7579542740829 +334149,2010-09-25 18:28:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +334185,2010-09-25 16:36:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +334201,2010-09-25 16:00:00,ARSON,MISSION,1000 Block of FLORIDA ST,-122.410364149927,37.755121669533104 +334255,2010-09-25 13:53:00,DRUNKENNESS,SOUTHERN,200 Block of 3RD ST,-122.399899436982,37.7846480308387 +334305,2010-09-25 11:00:00,DRUNKENNESS,BAYVIEW,1700 Block of PALOU AV,-122.393777241684,37.7355378380229 +334377,2010-09-25 03:00:00,DRUNKENNESS,NORTHERN,VANNESS AV / GEARY ST,-122.421395819115,37.7856843389472 +334403,2010-09-25 01:30:00,KIDNAPPING,CENTRAL,1600 Block of GRANT AV,-122.407764273463,37.801895577690296 +334419,2010-09-25 00:54:00,DRUNKENNESS,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +334453,2010-09-24 23:15:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +334502,2010-09-24 21:03:00,DRUNKENNESS,NORTHERN,700 Block of EDDY ST,-122.420025955939,37.7830500140737 +334521,2010-09-24 20:20:00,KIDNAPPING,CENTRAL,100 Block of CALIFORNIA ST,-122.39821721889,37.793486649905 +334701,2010-09-24 12:33:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +334906,2010-09-23 22:00:00,KIDNAPPING,INGLESIDE,0 Block of GLADSTONE DR,-122.420306723417,37.7304026570113 +335043,2010-09-23 16:00:00,KIDNAPPING,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +335080,2010-09-23 14:25:00,KIDNAPPING,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +335104,2010-09-23 13:00:00,KIDNAPPING,BAYVIEW,MARIPOSA ST / RHODEISLAND ST,-122.402445290975,37.763502723082 +335191,2010-09-23 07:25:00,KIDNAPPING,NORTHERN,400 Block of GOUGH ST,-122.42309400129,37.7771077210197 +335256,2010-09-22 23:35:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +335258,2010-09-22 23:34:00,DRUNKENNESS,NORTHERN,2000 Block of FILLMORE ST,-122.433676892244,37.7884461157258 +335353,2010-09-22 19:45:00,KIDNAPPING,SOUTHERN,200 Block of 9TH ST,-122.412845031536,37.7748170645635 +335473,2010-09-22 15:29:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +335661,2010-09-22 01:00:00,KIDNAPPING,RICHMOND,500 Block of 33RD AV,-122.493300380647,37.778709879325 +335761,2010-09-21 19:23:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.408368579345,37.7807784253732 +335919,2010-09-21 12:47:00,KIDNAPPING,INGLESIDE,1000 Block of GENEVA AV,-122.439097587912,37.715401169320295 +336260,2010-09-20 15:35:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +336277,2010-09-20 14:48:00,DRUNKENNESS,TARAVAL,46TH AV / JUDAH ST,-122.505928450113,37.7604217436765 +336495,2010-09-12 22:34:00,DRUNKENNESS,TENDERLOIN,500 Block of EDDY ST,-122.416732163096,37.783465567448 +336501,2010-09-12 22:19:00,ARSON,BAYVIEW,0 Block of WHITFIELD CT,-122.381757562453,37.7310148735637 +336590,2010-09-12 17:00:00,KIDNAPPING,BAYVIEW,900 Block of MEADE AV,-122.397591424632,37.7178968379908 +336618,2010-09-12 16:15:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +336723,2010-09-12 10:30:00,KIDNAPPING,BAYVIEW,0 Block of NAVY RD,-122.379424889828,37.72949908597121 +336791,2010-09-12 02:20:00,DRUNKENNESS,NORTHERN,2100 Block of POLK ST,-122.421934733603,37.79642303725221 +337049,2010-09-11 13:50:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +337234,2010-09-10 22:54:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.416650482064,37.808166053356295 +337511,2010-09-10 11:00:00,KIDNAPPING,MISSION,100 Block of QUANE ST,-122.424674629078,37.754261567778286 +337537,2010-09-10 09:06:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +337569,2010-09-10 06:00:00,KIDNAPPING,INGLESIDE,100 Block of TRUMBULL ST,-122.427240184736,37.73079224766129 +337622,2010-09-09 23:22:00,ARSON,BAYVIEW,GRIFFITH ST / GILMAN AV,-122.388139317244,37.718235637361495 +337627,2010-09-09 23:15:00,DRUNKENNESS,CENTRAL,0 Block of DRUMM ST,-122.396421943768,37.7941447423704 +337928,2010-09-09 09:00:00,KIDNAPPING,BAYVIEW,100 Block of WHITNEYYOUNG CR,-122.385908270665,37.7360312580916 +338133,2010-09-08 19:00:00,KIDNAPPING,INGLESIDE,300 Block of LOWELL ST,-122.444692586424,37.7084494058958 +338219,2010-09-08 15:30:00,RUNAWAY,INGLESIDE,300 Block of WILDE AV,-122.40375548345,37.716710079211296 +338245,2010-09-08 14:01:00,DRUNKENNESS,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +338288,2010-09-08 12:00:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +338378,2010-09-08 03:10:00,KIDNAPPING,TARAVAL,SICKLES AV / SAN JOSE AV,-122.455815337879,37.7112226803573 +338381,2010-09-08 02:00:00,DRUNKENNESS,SOUTHERN,700 Block of MISSION ST,-122.40284363862,37.7857184692369 +338459,2010-09-07 21:30:00,ARSON,BAYVIEW,1500 Block of GALVEZ AV,-122.386829203918,37.74010586456821 +338585,2010-09-07 15:30:00,KIDNAPPING,RICHMOND,CLEMENT ST / 30TH AV,-122.490231285796,37.7817735279721 +338742,2010-09-07 03:14:00,DRUNKENNESS,MISSION,3900 Block of 17TH ST,-122.434659092708,37.762462765244 +338811,2010-09-06 22:24:00,KIDNAPPING,TENDERLOIN,600 Block of ELLIS ST,-122.416893710739,37.7842860480389 +338852,2010-09-06 20:45:00,DRUNKENNESS,CENTRAL,CLAY ST / BATTERY ST,-122.40033450691,37.7950135264428 +338975,2010-09-06 15:00:00,KIDNAPPING,INGLESIDE,0 Block of GODEUS ST,-122.421159714516,37.7425477755564 +339070,2010-09-06 09:05:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +339142,2010-09-06 00:11:00,ARSON,MISSION,3400 Block of 18TH ST,-122.419748993977,37.76186726489721 +339184,2010-08-29 22:03:00,DRUNKENNESS,TENDERLOIN,100 Block of POWELL ST,-122.40801449292,37.7859507767613 +339190,2010-08-29 22:00:00,KIDNAPPING,TARAVAL,100 Block of GARCES DR,-122.478943772791,37.715194845332704 +339371,2010-08-29 13:30:00,KIDNAPPING,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +339483,2010-08-29 04:05:00,ARSON,BAYVIEW,1900 Block of 25TH ST,-122.397486915671,37.752197092814 +339532,2010-08-29 00:10:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +339859,2010-08-28 01:18:00,DRUNKENNESS,TENDERLOIN,600 Block of OFARRELL ST,-122.415972165351,37.78535651423429 +339912,2010-08-27 22:43:00,DRUNKENNESS,RICHMOND,2100 Block of CLEMENT ST,-122.482211289161,37.782184421473495 +339929,2010-08-27 22:03:00,DRUNKENNESS,INGLESIDE,200 Block of ELLSWORTH ST,-122.41453967353998,37.7395761096677 +340072,2010-08-27 16:40:00,KIDNAPPING,SOUTHERN,600 Block of BRANNAN ST,-122.399841045579,37.77563278642821 +340197,2010-08-27 11:16:00,RUNAWAY,NORTHERN,1500 Block of OFARRELL ST,-122.430610535316,37.7834963710489 +340249,2010-08-27 07:00:00,ARSON,CENTRAL,300 Block of BROADWAY ST,-122.403286579807,37.7982414067113 +340287,2010-08-27 00:18:00,DRUNKENNESS,TENDERLOIN,500 Block of OFARRELL ST,-122.413820070176,37.7857382950322 +340288,2010-08-27 00:15:00,ARSON,BAYVIEW,2000 Block of 3RD ST,-122.388918212006,37.7636669731603 +340292,2010-08-27 00:13:00,ARSON,BAYVIEW,1100 Block of REVERE AV,-122.381528483383,37.7268348144864 +340448,2010-08-26 17:03:00,DRUNKENNESS,MISSION,3300 Block of 24TH ST,-122.420379793048,37.7521761775715 +340668,2010-08-26 07:00:00,RUNAWAY,BAYVIEW,800 Block of BRUSSELS ST,-122.403233261792,37.7216770936369 +340680,2010-08-26 03:50:00,KIDNAPPING,CENTRAL,500 Block of BROADWAY ST,-122.406460643507,37.7979466732983 +340682,2010-08-26 03:38:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +340770,2010-08-25 21:00:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +340877,2010-08-25 15:33:00,DRUNKENNESS,TENDERLOIN,OFARRELL ST / STOCKTON ST,-122.406401668335,37.786614461336605 +341078,2010-08-25 00:08:00,RUNAWAY,BAYVIEW,1200 Block of OAKDALE AV,-122.383072331337,37.7305528786961 +341195,2010-08-24 19:05:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +341400,2010-08-24 11:00:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +341512,2010-08-24 00:55:00,DRUNKENNESS,TENDERLOIN,EDDY ST / LEAVENWORTH ST,-122.414242955907,37.7837240254478 +341564,2010-08-23 22:00:00,KIDNAPPING,MISSION,1800 Block of MISSION ST,-122.419970859857,37.7674540344176 +341630,2010-08-23 19:00:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +341788,2010-08-23 10:00:00,KIDNAPPING,TARAVAL,2400 Block of 28TH AV,-122.485199732264,37.7416771549244 +341876,2010-08-23 03:00:00,KIDNAPPING,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +341928,2010-08-15 23:16:00,DRUNKENNESS,RICHMOND,800 Block of 32ND AV,-122.491823678586,37.7731396564478 +341930,2010-08-15 23:05:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +341940,2010-08-15 22:01:00,DRUNKENNESS,TARAVAL,19TH AV / PACHECO ST,-122.476164369698,37.7505108267455 +341963,2010-08-15 20:30:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +341969,2010-08-15 20:28:00,RUNAWAY,BAYVIEW,1500 Block of PALOU AV,-122.390060175267,37.733432175289 +342062,2010-08-15 15:00:00,KIDNAPPING,BAYVIEW,1500 Block of SHAFTER AV,-122.389768984951,37.7305636925712 +342116,2010-08-15 12:17:00,ARSON,BAYVIEW,1200 Block of VANDYKE AV,-122.385928988224,37.7254194674264 +342167,2010-08-15 10:18:00,DRUNKENNESS,TARAVAL,4300 Block of JUDAH ST,-122.508618537938,37.7603604579815 +342224,2010-08-15 03:34:00,DRUNKENNESS,CENTRAL,600 Block of STOCKTON ST,-122.407354509443,37.7917926375029 +342228,2010-08-15 03:30:00,KIDNAPPING,RICHMOND,CLEMENT ST / 34TH AV,-122.494521109472,37.7815746718896 +342237,2010-08-15 02:52:00,DRUNKENNESS,NORTHERN,VANNESS AV / WASHINGTON ST,-122.422874083058,37.7930494293957 +342246,2010-08-15 02:10:00,DRUNKENNESS,CENTRAL,900 Block of SANSOME ST,-122.402258143298,37.7989237331944 +342252,2010-08-15 02:07:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +342283,2010-08-15 00:10:00,ARSON,SOUTHERN,900 Block of FOLSOM ST,-122.40509433812,37.7789940710712 +342286,2010-08-15 00:03:00,DRUNKENNESS,SOUTHERN,1700 Block of MARKET ST,-122.423098219736,37.7722683129989 +342389,2010-08-14 19:20:00,DRUNKENNESS,MISSION,16TH ST / CALEDONIA ST,-122.421381948278,37.7649480897345 +342883,2010-08-13 14:30:00,KIDNAPPING,SOUTHERN,300 Block of 5TH ST,-122.402545141989,37.7796704990885 +342946,2010-08-13 10:00:00,RUNAWAY,TARAVAL,500 Block of RIVERA ST,-122.471865272668,37.7470151458269 +343049,2010-08-13 00:01:00,KIDNAPPING,CENTRAL,CALIFORNIA ST / HYDE ST,-122.417392830334,37.7909741243591 +343060,2010-08-13 00:01:00,KIDNAPPING,CENTRAL,CALIFORNIA ST / HYDE ST,-122.417392830334,37.7909741243591 +343140,2010-08-12 19:43:00,DRUNKENNESS,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +343162,2010-08-12 19:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +343168,2010-08-12 18:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +343305,2010-08-12 11:30:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5THSTNORTH ST,-122.408068345148,37.7839916768161 +343370,2010-08-12 05:42:00,ARSON,INGLESIDE,1500 Block of ALEMANY BL,-122.435682711765,37.7275173689962 +343371,2010-08-12 05:42:00,ARSON,INGLESIDE,0 Block of COTTER ST,-122.433998219387,37.72763700360071 +343399,2010-08-12 01:42:00,DRUNKENNESS,RICHMOND,3800 Block of GEARY BL,-122.46055149012,37.7813140417196 +343458,2010-08-11 22:16:00,ARSON,BAYVIEW,1400 Block of SELBY ST,-122.401152370981,37.738362825899294 +343501,2010-08-11 19:30:00,KIDNAPPING,TARAVAL,2400 Block of TARAVAL ST,-122.492316502247,37.7423737279324 +343552,2010-08-11 17:07:00,DRUNKENNESS,SOUTHERN,0 Block of DORE ST,-122.413045971966,37.7738617771611 +343771,2010-08-11 01:15:00,KIDNAPPING,PARK,500 Block of MASONIC AV,-122.446631889885,37.7762539364381 +343830,2010-08-10 21:35:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +343991,2010-08-10 12:40:00,ARSON,NORTHERN,1100 Block of TURK ST,-122.428840433603,37.780972734343706 +344111,2010-08-10 02:20:00,ARSON,BAYVIEW,600 Block of MENDELL ST,-122.386178373766,37.739322006639206 +344200,2010-08-09 20:20:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +344239,2010-08-09 18:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +344315,2010-08-09 15:00:00,RUNAWAY,RICHMOND,500 Block of 32ND AV,-122.492231359405,37.778763254392 +344439,2010-08-09 07:00:00,KIDNAPPING,MISSION,3000 Block of 16TH ST,-122.421082850193,37.764910844226 +344518,2010-08-01 22:49:00,ARSON,SOUTHERN,0 Block of CLARENCE PL,-122.392534666111,37.779613996452 +344584,2010-08-01 18:30:00,DRUNKENNESS,SOUTHERN,2ND ST / KING ST,-122.389595283252,37.7798611974198 +344613,2010-08-01 17:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +344839,2010-08-01 01:00:00,KIDNAPPING,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +344845,2010-08-01 01:00:00,DRUNKENNESS,NORTHERN,PINE ST / POLK ST,-122.42049728879,37.789618819255 +344859,2010-08-01 00:14:00,DRUNKENNESS,SOUTHERN,0 Block of TEHAMA ST,-122.39647798116998,37.7873819795737 +344904,2010-08-01 00:01:00,KIDNAPPING,TARAVAL,900 Block of TARAVAL ST,-122.476211458458,37.7429719095254 +345001,2010-07-31 19:05:00,DRUNKENNESS,NORTHERN,1200 Block of POLK ST,-122.420231590619,37.78798096196 +345181,2010-07-31 09:00:00,RUNAWAY,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +345378,2010-07-30 18:14:00,DRUNKENNESS,MISSION,1100 Block of VALENCIA ST,-122.420817675346,37.75448782255511 +345535,2010-07-30 09:42:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +345604,2010-07-30 01:40:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.414224026965,37.7715982798716 +345763,2010-07-29 16:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +345911,2010-07-29 04:00:00,ARSON,SOUTHERN,600 Block of 3RD ST,-122.393460953167,37.7794975702131 +345998,2010-07-28 21:49:00,DRUNKENNESS,SOUTHERN,300 Block of BRANNAN ST,-122.392851555469,37.7811569213596 +346018,2010-07-28 19:55:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.408913229808,37.781211650766295 +346068,2010-07-28 17:35:00,DRUNKENNESS,SOUTHERN,MINNA ST / 7TH ST,-122.410405602135,37.778784148603286 +346230,2010-07-28 09:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +346308,2010-07-28 02:00:00,KIDNAPPING,RICHMOND,3800 Block of SACRAMENTO ST,-122.456082122236,37.7870848382121 +346327,2010-07-28 00:27:00,DRUNKENNESS,NORTHERN,LARKIN ST / GEARY ST,-122.418090766692,37.7861007451645 +346382,2010-07-27 21:00:00,KIDNAPPING,BAYVIEW,700 Block of 23RD ST,-122.387547692544,37.7554722841446 +346505,2010-07-27 14:20:00,KIDNAPPING,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +346562,2010-07-27 11:30:00,RUNAWAY,TARAVAL,200 Block of MONTICELLO ST,-122.470673521408,37.7187815894447 +346730,2010-07-26 21:30:00,RUNAWAY,NORTHERN,FILLMORE ST / GOLDEN GATE AV,-122.431952436364,37.779564749866296 +346906,2010-07-26 11:35:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +347064,2010-07-18 20:04:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +347081,2010-07-18 19:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +347084,2010-07-18 19:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +347116,2010-07-18 18:00:00,ARSON,TARAVAL,400 Block of BRIGHT ST,-122.463620567059,37.71892835679071 +347173,2010-07-18 14:01:00,DRUNKENNESS,INGLESIDE,0 Block of BRONTE ST,-122.410221854229,37.73934284011701 +347271,2010-07-18 04:36:00,ARSON,BAYVIEW,400 Block of 24TH ST,-122.385037526317,37.7542885971708 +347589,2010-07-17 10:25:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +347642,2010-07-17 03:45:00,KIDNAPPING,INGLESIDE,2200 Block of BAY SHORE BL,-122.402961324239,37.7121195039057 +347759,2010-07-16 22:18:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / JONES ST,-122.412224164736,37.7820729312029 +347794,2010-07-16 20:37:00,KIDNAPPING,TARAVAL,500 Block of JOHNMUIR DR,-122.49206801734,37.714361549875605 +347831,2010-07-16 19:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +348064,2010-07-16 03:00:00,KIDNAPPING,MISSION,3300 Block of 18TH ST,-122.418820542336,37.761923480107896 +348084,2010-07-16 01:27:00,DRUNKENNESS,MISSION,MISSION ST / 18TH ST,-122.419360352761,37.7618358012376 +348149,2010-07-15 21:40:00,DRUNKENNESS,CENTRAL,BROADWAY ST / SANSOME ST,-122.402232454222,37.7984302773598 +348241,2010-07-15 17:25:00,DRUNKENNESS,RICHMOND,800 Block of LA PLAYA ST,-122.509895418239,37.7723131976814 +348468,2010-07-15 01:01:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +348490,2010-07-15 00:10:00,RUNAWAY,MISSION,3200 Block of 26TH ST,-122.414593171104,37.7491990535295 +348525,2010-07-14 22:45:00,DRUNKENNESS,CENTRAL,BELDEN ST / BUSH ST,-122.403674396287,37.790806345449 +348659,2010-07-14 16:35:00,ARSON,RICHMOND,FULTON ST / 37TH AV,-122.464812286077,37.773489338522 +348781,2010-07-14 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +348823,2010-07-14 04:33:00,DRUNKENNESS,MISSION,23RD ST / BRYANT ST,-122.409256144133,37.75439918768161 +349046,2010-07-13 16:10:00,DRUNKENNESS,BAYVIEW,1400 Block of QUESADA AV,-122.386849266637,37.73066480545821 +349183,2010-07-13 06:52:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +349518,2010-07-12 07:29:00,ARSON,BAYVIEW,1200 Block of QUINT ST,-122.395152879301,37.7387395585935 +349570,2010-07-12 00:17:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / TAYLOR ST,-122.411141948101,37.7850736197499 +349618,2010-07-04 22:18:00,DRUNKENNESS,SOUTHERN,100 Block of 11TH ST,-122.416888806563,37.7740769099338 +349699,2010-07-04 19:00:00,KIDNAPPING,BAYVIEW,1200 Block of REVERE AV,-122.383599364346,37.7280102316098 +349734,2010-07-04 17:50:00,KIDNAPPING,CENTRAL,0 Block of FRANCISCO ST,-122.406167794377,37.8056494557581 +349738,2010-07-04 17:30:00,KIDNAPPING,TARAVAL,1200 Block of 29TH AV,-122.487832749113,37.7640152190696 +349742,2010-07-04 17:15:00,KIDNAPPING,TARAVAL,1200 Block of GREAT HY,-122.50966215971,37.763035554021286 +349835,2010-07-04 11:00:00,RUNAWAY,BAYVIEW,0 Block of WILLS ST,-122.378902736531,37.73619076744311 +349865,2010-07-04 07:08:00,DRUNKENNESS,MISSION,24TH ST / SHOTWELL ST,-122.415173665801,37.7524407589917 +349875,2010-07-04 05:50:00,ARSON,INGLESIDE,500 Block of CARTER ST,-122.423628041297,37.70880618460679 +349896,2010-07-04 01:45:00,KIDNAPPING,MISSION,2200 Block of BRYANT ST,-122.409769737777,37.7588168712302 +349991,2010-07-03 21:23:00,KIDNAPPING,BAYVIEW,100 Block of BERTHA LN,-122.380898507162,37.7332256396347 +350031,2010-07-03 19:21:00,DRUNKENNESS,MISSION,2800 Block of MISSION ST,-122.418434028318,37.7514199300011 +350062,2010-07-03 18:00:00,RUNAWAY,MISSION,1400 Block of 15TH ST,-122.417102243898,37.7668931278499 +350124,2010-07-03 14:56:00,KIDNAPPING,CENTRAL,500 Block of BAY ST,-122.416069622787,37.8052582935955 +350177,2010-07-03 11:02:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +350260,2010-07-03 04:42:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +350280,2010-07-03 02:38:00,DRUNKENNESS,NORTHERN,500 Block of HAIGHT ST,-122.431289969136,37.7720549755537 +350299,2010-07-03 01:28:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +350361,2010-07-02 22:45:00,KIDNAPPING,CENTRAL,400 Block of THE EMBARCADERONORTH ST,-122.396374439116,37.79805325280579 +350413,2010-07-02 20:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +350600,2010-07-02 11:00:00,KIDNAPPING,CENTRAL,900 Block of PACIFIC AV,-122.41069062983,37.79636449500569 +350637,2010-07-02 09:01:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +350685,2010-07-02 04:00:00,KIDNAPPING,MISSION,400 Block of VALENCIA ST,-122.421935077177,37.7661343875141 +350696,2010-07-02 02:27:00,DRUNKENNESS,RICHMOND,1700 Block of LYON ST,-122.445375537244,37.786960006038 +350719,2010-07-02 01:00:00,KIDNAPPING,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +350724,2010-07-02 00:58:00,DRUNKENNESS,TENDERLOIN,400 Block of TURK ST,-122.416349428183,37.7825569563078 +350852,2010-07-01 17:35:00,DRUNKENNESS,TENDERLOIN,100 Block of POWELL ST,-122.40801449292,37.7859507767613 +350981,2010-07-01 11:39:00,RUNAWAY,MISSION,1100 Block of POTRERO AV,-122.406463425003,37.753636505486 +351235,2010-06-30 18:15:00,DRUNKENNESS,SOUTHERN,100 Block of 3RD ST,-122.401692264348,37.786064674987294 +351337,2010-06-30 12:02:00,DRUNKENNESS,TARAVAL,2000 Block of 37TH AV,-122.495502769291,37.7487068486863 +351351,2010-06-30 11:48:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +351402,2010-06-30 03:50:00,ARSON,MISSION,0 Block of 14TH ST,-122.415102358784,37.768623343813296 +351486,2010-06-29 21:14:00,DRUNKENNESS,CENTRAL,600 Block of BUSH ST,-122.407689581502,37.7902423892742 +351679,2010-06-29 11:35:00,DRUNKENNESS,TENDERLOIN,400 Block of OFARRELL ST,-122.412563218508,37.785785061938206 +351723,2010-06-29 07:30:00,KIDNAPPING,MISSION,100 Block of JULIAN AV,-122.420908468984,37.7657766621198 +351728,2010-06-29 07:00:00,ARSON,SOUTHERN,400 Block of MISSION ST,-122.397091759801,37.7900661929348 +351784,2010-06-28 23:32:00,DRUNKENNESS,SOUTHERN,0 Block of 3RD ST,-122.403413040525,37.7872743866375 +351800,2010-06-28 22:49:00,DRUNKENNESS,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +351846,2010-06-28 19:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +351891,2010-06-28 17:30:00,KIDNAPPING,INGLESIDE,1800 Block of SAN JOSE AV,-122.440883730974,37.72765772346529 +351921,2010-06-28 16:30:00,DRUNKENNESS,CENTRAL,200 Block of GEARY ST,-122.407434989523,37.787515874162295 +352056,2010-06-28 06:10:00,KIDNAPPING,RICHMOND,800 Block of 42ND AV,-122.502397032247,37.7726562501994 +352066,2010-06-28 04:30:00,ARSON,TARAVAL,200 Block of MONTANA ST,-122.461424508784,37.716636765559 +352079,2010-06-28 02:19:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 7TH ST,-122.409391574893,37.7779765037999 +352122,2010-06-20 23:30:00,RUNAWAY,BAYVIEW,1500 Block of REVERE AV,-122.389206215932,37.7311894334281 +352232,2010-06-20 16:20:00,KIDNAPPING,INGLESIDE,500 Block of SILVER AV,-122.426188770002,37.7285742828954 +352385,2010-06-20 01:45:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +352425,2010-06-19 23:38:00,DRUNKENNESS,CENTRAL,PINE ST / SANSOME ST,-122.400935150189,37.7921086172124 +352468,2010-06-19 22:10:00,DRUNKENNESS,CENTRAL,1000 Block of LEAVENWORTH ST,-122.415724826731,37.790730793722894 +352531,2010-06-19 18:05:00,DRUNKENNESS,CENTRAL,600 Block of FILBERT ST,-122.410199135855,37.8012139881945 +352862,2010-06-18 21:00:00,KIDNAPPING,CENTRAL,0 Block of JEFFERSON ST,-122.41337058114,37.8085752673964 +352932,2010-06-18 17:56:00,DRUNKENNESS,CENTRAL,300 Block of BROADWAY ST,-122.40367998233,37.7981913307058 +353093,2010-06-18 09:30:00,KIDNAPPING,CENTRAL,MASON ST / BEACH ST,-122.413979577586,37.8074807657832 +353095,2010-06-18 09:15:00,KIDNAPPING,MISSION,1800 Block of MISSION ST,-122.419832890144,37.7674625261825 +353163,2010-06-18 00:01:00,ARSON,MISSION,3000 Block of 16TH ST,-122.420762936447,37.7650403422958 +353199,2010-06-17 21:42:00,ARSON,RICHMOND,500 Block of 25TH AV,-122.48459334029,37.7791138218919 +353215,2010-06-17 20:30:00,ARSON,BAYVIEW,1500 Block of WALLACE AV,-122.390230818533,37.7269112408441 +353258,2010-06-17 18:24:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +353514,2010-06-17 01:37:00,DRUNKENNESS,NORTHERN,1200 Block of POLK ST,-122.420326993863,37.7884521578132 +353781,2010-06-16 13:20:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +353917,2010-06-16 02:22:00,ARSON,BAYVIEW,0 Block of BERTHA LN,-122.380990356551,37.7331435009212 +353919,2010-06-16 02:17:00,DRUNKENNESS,SOUTHERN,200 Block of 9TH ST,-122.412845031536,37.7748170645635 +354193,2010-06-15 12:55:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +354295,2010-06-15 04:11:00,DRUNKENNESS,NORTHERN,2000 Block of SACRAMENTO ST,-122.426629873308,37.7907144332166 +354299,2010-06-15 03:00:00,ARSON,BAYVIEW,1500 Block of CARROLL AV,-122.392403037071,37.7244986965379 +354395,2010-06-14 19:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +354457,2010-06-14 17:00:00,KIDNAPPING,INGLESIDE,500 Block of CRESCENT AV,-122.41585287617,37.7348948112529 +354468,2010-06-14 17:00:00,KIDNAPPING,INGLESIDE,500 Block of CRESCENT AV,-122.41585287617,37.7348948112529 +354654,2010-06-14 04:21:00,KIDNAPPING,BAYVIEW,100 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +354780,2010-06-06 20:05:00,DRUNKENNESS,NORTHERN,2000 Block of POLK ST,-122.421608893207,37.7955038710773 +354986,2010-06-06 06:30:00,DRUNKENNESS,BAYVIEW,23RD ST / RHODEISLAND ST,-122.401590336879,37.7545698243645 +355086,2010-06-05 23:00:00,DRUNKENNESS,MISSION,2300 Block of MISSION ST,-122.419196838603,37.7594144253287 +355099,2010-06-05 22:26:00,DRUNKENNESS,MISSION,2800 Block of FOLSOM ST,-122.413935404044,37.7516932889916 +355173,2010-06-05 19:25:00,DRUNKENNESS,CENTRAL,1100 Block of BUSH ST,-122.416221156508,37.7892672343725 +355339,2010-06-05 09:00:00,RUNAWAY,MISSION,1700 Block of 15TH ST,-122.423775038029,37.7664900497694 +355373,2010-06-05 02:44:00,ARSON,RICHMOND,2000 Block of POST ST,-122.435575820196,37.784892281882 +355383,2010-06-05 02:20:00,KIDNAPPING,SOUTHERN,300 Block of KING ST,-122.395021745914,37.7753128522284 +355384,2010-06-05 02:20:00,KIDNAPPING,SOUTHERN,300 Block of KING ST,-122.395021745914,37.7753128522284 +355461,2010-06-04 22:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +355606,2010-06-04 16:18:00,DRUNKENNESS,TENDERLOIN,100 Block of OFARRELL ST,-122.407222440955,37.7864562588009 +355787,2010-06-04 02:30:00,KIDNAPPING,NORTHERN,GOUGH ST / GEARY BL,-122.424688703591,37.7853339640306 +355849,2010-06-03 21:56:00,RUNAWAY,CENTRAL,1300 Block of JACKSON ST,-122.417021501122,37.7947626640609 +356097,2010-06-03 08:16:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +356105,2010-06-03 07:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +356423,2010-06-02 11:55:00,DRUNKENNESS,NORTHERN,POLK ST / GEARY ST,-122.419739837805,37.7858926099715 +356538,2010-06-02 00:56:00,DRUNKENNESS,MISSION,24TH ST / SHOTWELL ST,-122.415173665801,37.7524407589917 +356649,2010-06-01 19:00:00,RUNAWAY,CENTRAL,800 Block of WASHINGTON ST,-122.40715604429,37.7951133231133 +356684,2010-06-01 17:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +356760,2010-06-01 13:22:00,DRUNKENNESS,SOUTHERN,MISSION ST / 4TH ST,-122.404270179486,37.78447885387449 +356894,2010-06-01 08:00:00,RUNAWAY,INGLESIDE,400 Block of HOLLADAY AV,-122.40725042351102,37.7429247782227 +356929,2010-06-01 02:30:00,ARSON,MISSION,1100 Block of ALABAMA ST,-122.410970913175,37.7534747396472 +356941,2010-06-01 02:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +357110,2010-05-31 16:45:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +357169,2010-05-31 12:30:00,KIDNAPPING,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +357253,2010-05-31 01:39:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +357315,2010-05-23 22:30:00,ARSON,NORTHERN,2100 Block of POLK ST,-122.421934733603,37.79642303725221 +357349,2010-05-23 20:40:00,DRUNKENNESS,SOUTHERN,3RD ST / BRYANT ST,-122.395848299154,37.7813210474369 +357486,2010-05-23 14:00:00,RUNAWAY,CENTRAL,400 Block of GREEN ST,-122.407008625662,37.7996968891966 +357871,2010-05-22 13:37:00,ARSON,CENTRAL,1300 Block of POWELL ST,-122.4101460054,37.7971857276284 +357972,2010-05-22 03:43:00,ARSON,NORTHERN,1000 Block of LARKIN ST,-122.41824964748,37.7872715205959 +358007,2010-05-22 01:09:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413287527194,37.7711962032376 +358024,2010-05-22 00:27:00,DRUNKENNESS,NORTHERN,2100 Block of POLK ST,-122.421798040888,37.7964404207928 +358103,2010-05-21 21:20:00,ARSON,INGLESIDE,800 Block of RUSSIA AV,-122.430406019767,37.7182881551417 +358112,2010-05-21 21:00:00,RUNAWAY,MISSION,1100 Block of POTRERO AV,-122.406463425003,37.753636505486 +358257,2010-05-21 15:00:00,ARSON,BAYVIEW,300 Block of BAYVIEW RD,-122.396740069313,37.734115411660206 +358378,2010-05-21 08:15:00,RUNAWAY,TARAVAL,2200 Block of 48TH AV,-122.507031438787,37.7444579146653 +358456,2010-05-20 23:47:00,DRUNKENNESS,NORTHERN,1400 Block of POST ST,-122.426529714226,37.7860427680942 +358480,2010-05-20 22:08:00,DRUNKENNESS,MISSION,3300 Block of 22ND ST,-122.422333037882,37.7552726735094 +358557,2010-05-20 18:00:00,RUNAWAY,PARK,0 Block of CARL ST,-122.448900460062,37.7658792859724 +358571,2010-05-20 17:33:00,RUNAWAY,MISSION,3800 Block of 22ND ST,-122.43330183794,37.754504791899706 +358624,2010-05-20 15:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +358628,2010-05-20 15:00:00,KIDNAPPING,MISSION,4200 Block of 19TH ST,-122.436502740795,37.759134651045706 +358683,2010-05-20 13:00:00,KIDNAPPING,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +358771,2010-05-20 07:40:00,RUNAWAY,CENTRAL,1100 Block of BUSH ST,-122.416221156508,37.7892672343725 +359074,2010-05-19 14:27:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / GROVE ST,-122.416583456133,37.7786591541508 +359243,2010-05-19 07:15:00,DRUNKENNESS,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413069926397,37.7820204255866 +359346,2010-05-18 22:13:00,DRUNKENNESS,RICHMOND,300 Block of 2ND AV,-122.460136201718,37.7821534242188 +359400,2010-05-18 18:45:00,ARSON,BAYVIEW,25TH ST / ILLINOIS ST,-122.386812776307,37.7528899958678 +359638,2010-05-18 05:00:00,ARSON,NORTHERN,100 Block of FELL ST,-122.420332099593,37.7762075768262 +359640,2010-05-18 05:00:00,ARSON,NORTHERN,100 Block of FELL ST,-122.420332099593,37.7762075768262 +359702,2010-05-17 22:43:00,ARSON,SOUTHERN,JUNIPER ST / FOLSOM ST,-122.413423641551,37.7723431393714 +359763,2010-05-17 19:00:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +359902,2010-05-17 11:45:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +360138,2010-05-09 17:16:00,DRUNKENNESS,INGLESIDE,700 Block of SAN JOSE AV,-122.422851095172,37.7430731234963 +360265,2010-05-09 07:06:00,DRUNKENNESS,SOUTHERN,6TH ST / STEVENSON ST,-122.409696355558,37.7817540588712 +360268,2010-05-09 07:03:00,DRUNKENNESS,MISSION,1000 Block of SHOTWELL ST,-122.415022828589,37.7516272270745 +360293,2010-05-09 02:10:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +360339,2010-05-09 00:10:00,DRUNKENNESS,CENTRAL,700 Block of MONTGOMERY ST,-122.40334021406,37.7959918873778 +360458,2010-05-08 19:37:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +360505,2010-05-08 18:00:00,KIDNAPPING,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +360563,2010-05-08 15:25:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +360703,2010-05-08 04:36:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +360729,2010-05-08 01:58:00,DRUNKENNESS,RICHMOND,4600 Block of GEARY BL,-122.46909677255,37.7806744413446 +360825,2010-05-07 20:52:00,DRUNKENNESS,INGLESIDE,200 Block of MOSCOW ST,-122.425836642921,37.723560959315904 +361037,2010-05-07 11:30:00,RUNAWAY,RICHMOND,400 Block of ARGUELLO BL,-122.458857560736,37.78220007231379 +361091,2010-05-07 08:00:00,RUNAWAY,MISSION,2900 Block of 25TH ST,-122.408512518978,37.7512835732386 +361097,2010-05-07 07:00:00,ARSON,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +361200,2010-05-06 22:22:00,DRUNKENNESS,SOUTHERN,100 Block of VALENCIA ST,-122.422513037848,37.7707107653585 +361254,2010-05-06 19:17:00,KIDNAPPING,MISSION,3300 Block of 24TH ST,-122.420393969897,37.7520651297079 +361316,2010-05-06 17:00:00,RUNAWAY,MISSION,3300 Block of CESAR CHAVEZ ST,-122.417059385145,37.7480778892528 +361433,2010-05-06 11:00:00,RUNAWAY,TARAVAL,3000 Block of SANTIAGO ST,-122.499935173889,37.7438004984375 +361598,2010-05-05 20:00:00,KIDNAPPING,MISSION,24TH ST / FOLSOM ST,-122.414089000708,37.75250507857579 +361666,2010-05-05 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +361744,2010-05-05 15:30:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +361796,2010-05-05 13:45:00,DRUNKENNESS,SOUTHERN,4TH ST / FOLSOM ST,-122.401161555602,37.7820238478975 +361941,2010-05-05 04:36:00,DRUNKENNESS,TENDERLOIN,300 Block of HYDE ST,-122.415910622743,37.7839999167561 +361996,2010-05-04 23:00:00,DRUNKENNESS,MISSION,500 Block of CASTRO ST,-122.434856780211,37.760077705313705 +362060,2010-05-04 19:40:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.41371122073,37.7796660426062 +362096,2010-05-04 18:37:00,DRUNKENNESS,TENDERLOIN,GEARY ST / POWELL ST,-122.408231026261,37.787359494956 +362150,2010-05-04 16:29:00,DRUNKENNESS,MISSION,2800 Block of 25TH ST,-122.407598388053,37.7512278146585 +362247,2010-05-04 10:39:00,ARSON,SOUTHERN,400 Block of MINNA ST,-122.407387172098,37.7810688918781 +362313,2010-05-04 04:34:00,ARSON,BAYVIEW,0 Block of MATTHEW CT,-122.380133847121,37.7312962281442 +362364,2010-05-03 23:53:00,ARSON,BAYVIEW,MENDELL ST / HUDSON AV,-122.386400869953,37.738983491072 +362405,2010-05-03 21:15:00,DRUNKENNESS,BAYVIEW,1800 Block of PALOU AV,-122.396161114928,37.736888141479 +362453,2010-05-03 18:37:00,DRUNKENNESS,TENDERLOIN,200 Block of HYDE ST,-122.415721688006,37.7830679886919 +362480,2010-05-03 17:30:00,RUNAWAY,BAYVIEW,1500 Block of SILVER AV,-122.405086510683,37.73265201805871 +362597,2010-05-03 11:45:00,DRUNKENNESS,PARK,1600 Block of PAGE ST,-122.447950421722,37.7707765396873 +362606,2010-05-03 11:25:00,ARSON,INGLESIDE,400 Block of RAYMOND AV,-122.412457953057,37.7147347356846 +362679,2010-05-03 03:55:00,ARSON,BAYVIEW,INNES AV / FITCH ST,-122.373894389535,37.7309368356017 +362686,2010-05-03 02:20:00,DRUNKENNESS,TENDERLOIN,300 Block of TAYLOR ST,-122.411302813025,37.7855355791102 +362835,2010-04-25 17:30:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +362941,2010-04-25 11:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +362948,2010-04-25 11:27:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +362999,2010-04-25 03:57:00,DRUNKENNESS,TARAVAL,2000 Block of NORIEGA ST,-122.485595501371,37.7538935047463 +363150,2010-04-24 20:00:00,KIDNAPPING,NORTHERN,3600 Block of LYON ST,-122.44827840533002,37.804271887891005 +363327,2010-04-24 10:00:00,KIDNAPPING,INGLESIDE,100 Block of LELAND AV,-122.406950140465,37.7123826656436 +363349,2010-04-24 08:30:00,RUNAWAY,MISSION,3800 Block of 24TH ST,-122.429108515468,37.7516590981092 +363458,2010-04-23 23:29:00,ARSON,BAYVIEW,300 Block of TUNNEL AV,-122.401203019647,37.710302459627 +363506,2010-04-23 21:27:00,DRUNKENNESS,SOUTHERN,KING ST / 2ND ST,-122.389595283252,37.7798611974198 +363571,2010-04-23 17:46:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +363645,2010-04-23 14:31:00,KIDNAPPING,TARAVAL,2600 Block of 46TH AV,-122.504361268704,37.73709550857429 +363774,2010-04-23 02:24:00,DRUNKENNESS,NORTHERN,LAGUNA ST / WALLER ST,-122.425324125155,37.7717950200095 +363842,2010-04-22 21:30:00,KIDNAPPING,SOUTHERN,600 Block of NATOMA ST,-122.411118243435,37.7775607137405 +363979,2010-04-22 15:20:00,ARSON,SOUTHERN,400 Block of MINNA ST,-122.407387172098,37.7810688918781 +364480,2010-04-21 02:25:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +364487,2010-04-21 01:54:00,DRUNKENNESS,TENDERLOIN,LEAVENWORTH ST / EDDY ST,-122.414242955907,37.7837240254478 +364495,2010-04-21 01:04:00,DRUNKENNESS,INGLESIDE,0 Block of LELAND AV,-122.405202907793,37.7118274140818 +364498,2010-04-21 01:00:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +364573,2010-04-20 19:25:00,DRUNKENNESS,SOUTHERN,1ST ST / MISSION ST,-122.397576409113,37.7897619308836 +364579,2010-04-20 19:00:00,RUNAWAY,INGLESIDE,500 Block of LONDON ST,-122.436923557756,37.72038640363729 +364756,2010-04-20 10:10:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +364820,2010-04-20 02:23:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +364850,2010-04-20 00:01:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +364894,2010-04-19 20:52:00,DRUNKENNESS,SOUTHERN,3RD ST / FOLSOM ST,-122.398932711095,37.7837848211584 +365004,2010-04-19 14:30:00,ARSON,MISSION,3300 Block of 23RD ST,-122.420264022269,37.75379116926701 +365026,2010-04-19 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +365130,2010-04-19 04:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +365137,2010-04-19 02:29:00,ARSON,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +365139,2010-04-19 02:13:00,RUNAWAY,SOUTHERN,500 Block of 3RD ST,-122.394886569527,37.7804801938296 +365204,2010-04-11 22:18:00,ARSON,BAYVIEW,1400 Block of ARMSTRONG AV,-122.389406961176,37.7246885414324 +365400,2010-04-11 03:30:00,DRUNKENNESS,SOUTHERN,0 Block of NATOMA ST,-122.397662188962,37.78802600646139 +365472,2010-04-10 22:40:00,DRUNKENNESS,CENTRAL,400 Block of POWELL ST,-122.408431861057,37.7887772719153 +365657,2010-04-10 14:42:00,ARSON,BAYVIEW,1600 Block of JENNINGS ST,-122.386197160491,37.72988084830449 +365678,2010-04-10 13:18:00,DRUNKENNESS,MISSION,CESAR CHAVEZ ST / FOLSOM ST,-122.413671670593,37.7482568705647 +365714,2010-04-10 11:00:00,ARSON,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +365786,2010-04-10 01:56:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +365857,2010-04-09 21:45:00,DRUNKENNESS,CENTRAL,400 Block of COLUMBUS AV,-122.4084984361,37.7990595666353 +365964,2010-04-09 16:29:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +365979,2010-04-09 15:52:00,DRUNKENNESS,INGLESIDE,MISSION ST / 29TH ST,-122.420896598735,37.7440381549154 +366052,2010-04-09 12:27:00,DRUNKENNESS,BAYVIEW,BAY SHORE BL / SILVER AV,-122.404658361435,37.73294870431921 +366381,2010-04-08 14:31:00,DRUNKENNESS,RICHMOND,700 Block of 34TH AV,-122.493965712345,37.7749142609801 +366436,2010-04-08 11:25:00,DRUNKENNESS,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +366657,2010-04-07 18:28:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +366855,2010-04-07 08:10:00,KIDNAPPING,INGLESIDE,600 Block of VIENNA ST,-122.432239978457,37.7181513320048 +366967,2010-04-06 20:00:00,ARSON,TENDERLOIN,300 Block of EDDY ST,-122.412969489288,37.7839407423872 +367291,2010-04-05 21:23:00,DRUNKENNESS,BAYVIEW,NEWHALL ST / NEWCOMB AV,-122.391648748966,37.7362897860778 +367316,2010-04-05 20:07:00,DRUNKENNESS,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +367420,2010-04-05 14:58:00,KIDNAPPING,CENTRAL,100 Block of CALIFORNIA ST,-122.39821721889,37.793486649905 +367578,2010-04-05 02:15:00,DRUNKENNESS,INGLESIDE,5300 Block of MISSION ST,-122.443056240053,37.714283279843706 +368002,2010-03-27 19:00:00,RUNAWAY,INGLESIDE,100 Block of PRECITA AV,-122.417225757723,37.7471608234479 +368215,2010-03-27 01:52:00,ARSON,BAYVIEW,600 Block of TENNESSEE ST,-122.389722246974,37.7636150076929 +368231,2010-03-27 00:53:00,DRUNKENNESS,SOUTHERN,500 Block of MARKET ST,-122.399911318801,37.7905596637863 +368389,2010-03-26 17:00:00,KIDNAPPING,TARAVAL,1300 Block of 43RD AV,-122.502708098898,37.7614820910625 +368461,2010-03-26 13:16:00,ARSON,BAYVIEW,700 Block of JERROLD AV,-122.373456171525,37.7296796672727 +368558,2010-03-26 08:00:00,RUNAWAY,BAYVIEW,0 Block of CASHMERE ST,-122.382745395519,37.73565878863421 +368895,2010-03-25 11:03:00,DRUNKENNESS,PARK,0 Block of KEZAR DR,-122.45512727517,37.7695200227183 +369070,2010-03-24 18:29:00,DRUNKENNESS,MISSION,BARTLETT ST / 24TH ST,-122.419560437883,37.7521716091721 +369087,2010-03-24 18:00:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +369258,2010-03-24 12:35:00,KIDNAPPING,SOUTHERN,0 Block of DORE ST,-122.412933062384,37.7739274524819 +369309,2010-03-24 10:00:00,KIDNAPPING,INGLESIDE,100 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +369335,2010-03-24 07:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +369379,2010-03-24 03:00:00,KIDNAPPING,INGLESIDE,900 Block of SADDLEBACK DR,-122.426884283215,37.70889503947021 +370135,2010-03-14 21:30:00,ARSON,INGLESIDE,600 Block of SILVER AV,-122.422113767009,37.728905059874 +370154,2010-03-14 20:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +370179,2010-03-14 19:30:00,DRUNKENNESS,BAYVIEW,100 Block of SILLIMAN ST,-122.406567327132,37.73079202303679 +370332,2010-03-14 12:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +370383,2010-03-14 07:53:00,DRUNKENNESS,MISSION,CESAR CHAVEZ ST / SHOTWELL ST,-122.414919860546,37.7482311005325 +370432,2010-03-14 01:05:00,ARSON,INGLESIDE,3800 Block of SAN BRUNO AV,-122.401689976899,37.7144291854658 +370544,2010-03-13 20:35:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +370575,2010-03-13 19:35:00,DRUNKENNESS,TENDERLOIN,100 Block of POWELL ST,-122.407877787733,37.785968007677496 +370590,2010-03-13 19:15:00,DRUNKENNESS,INGLESIDE,400 Block of GENEVA AV,-122.447125045686,37.7210305914202 +370665,2010-03-13 15:00:00,RUNAWAY,INGLESIDE,1200 Block of NAPLES ST,-122.438204050421,37.711478661616 +370771,2010-03-13 09:45:00,KIDNAPPING,SOUTHERN,7TH ST / HARRISON ST,-122.406300138733,37.7755131129937 +370810,2010-03-13 03:36:00,ARSON,CENTRAL,0 Block of DRUMM ST,-122.396421943768,37.7941447423704 +370819,2010-03-13 02:40:00,KIDNAPPING,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +370838,2010-03-13 00:37:00,DRUNKENNESS,CENTRAL,1100 Block of GRANT AV,-122.407052476339,37.797655376034 +370968,2010-03-12 17:00:00,ARSON,RICHMOND,EDWARD ST / ARGUELLO BL,-122.458639957524,37.7780063857349 +371218,2010-03-11 22:09:00,DRUNKENNESS,CENTRAL,FRANCISCO ST / TAYLOR ST,-122.415055084924,37.8044801759168 +371241,2010-03-11 21:00:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +371486,2010-03-11 06:00:00,RUNAWAY,MISSION,1100 Block of VALENCIA ST,-122.420817675346,37.75448782255511 +371512,2010-03-11 01:37:00,KIDNAPPING,SOUTHERN,600 Block of MISSION ST,-122.401692292616,37.786588859076296 +371852,2010-03-10 07:50:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +371868,2010-03-10 02:46:00,DRUNKENNESS,SOUTHERN,500 Block of 5TH ST,-122.39998111123998,37.7776242389287 +372181,2010-03-09 09:48:00,DRUNKENNESS,BAYVIEW,1300 Block of REVERE AV,-122.385465040129,37.72906911206979 +372264,2010-03-08 23:06:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / RUSS ST,-122.406728226957,37.7776295492343 +372267,2010-03-08 23:00:00,KIDNAPPING,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +372279,2010-03-08 22:00:00,KIDNAPPING,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +372385,2010-03-08 17:00:00,RUNAWAY,TARAVAL,600 Block of VICTORIA ST,-122.465249094472,37.7224924132407 +372484,2010-03-08 12:00:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +372583,2010-03-08 00:50:00,DRUNKENNESS,SOUTHERN,MARKET ST / GOLDEN GATE AV,-122.41029351969,37.7822305870036 +372646,2010-02-28 21:25:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.411923692444,37.78120449731379 +372843,2010-02-28 09:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +372927,2010-02-28 01:30:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +372942,2010-02-28 00:50:00,DRUNKENNESS,CENTRAL,400 Block of STOCKTON ST,-122.407114491118,37.7899019822508 +372955,2010-02-28 00:02:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +372993,2010-02-27 22:47:00,DRUNKENNESS,PARK,HAIGHT ST / BELVEDERE ST,-122.449647662955,37.76966191958461 +373040,2010-02-27 21:00:00,RUNAWAY,BAYVIEW,1500 Block of PALOU AV,-122.389979849085,37.733521608374296 +373326,2010-02-26 22:32:00,DRUNKENNESS,SOUTHERN,1400 Block of FOLSOM ST,-122.413674391078,37.7720641658687 +373618,2010-02-26 03:16:00,KIDNAPPING,SOUTHERN,0 Block of DOW PL,-122.396171251848,37.7846027603245 +373863,2010-02-25 14:29:00,ARSON,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +373996,2010-02-25 05:40:00,ARSON,SOUTHERN,100 Block of 5TH ST,-122.40515072935,37.7817509861584 +373998,2010-02-25 05:38:00,ARSON,SOUTHERN,5TH ST / SHIPLEY ST,-122.402842748428,37.7798294192767 +374011,2010-02-25 02:45:00,KIDNAPPING,RICHMOND,3200 Block of ANZA ST,-122.483003408877,37.7782929680936 +374025,2010-02-25 01:13:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.408685885018,37.7761558110245 +374098,2010-02-24 20:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +374259,2010-02-24 13:50:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +374394,2010-02-23 23:40:00,KIDNAPPING,PARK,1900 Block of FELL ST,-122.44999176585,37.77252548618871 +374415,2010-02-23 22:00:00,KIDNAPPING,INGLESIDE,200 Block of LAIDLEY ST,-122.42815696875,37.7382179595089 +374802,2010-02-22 16:30:00,RUNAWAY,CENTRAL,500 Block of FRANCISCO ST,-122.41426677512,37.8046348825476 +374811,2010-02-22 16:00:00,KIDNAPPING,TARAVAL,1800 Block of 22ND AV,-122.479552078957,37.753151769181 +374837,2010-02-22 15:16:00,DRUNKENNESS,BAYVIEW,3800 Block of 3RD ST,-122.387939452192,37.7422600519555 +374892,2010-02-22 12:15:00,KIDNAPPING,MISSION,2500 Block of MARIPOSA ST,-122.408805452633,37.7631689864934 +374913,2010-02-22 11:00:00,RUNAWAY,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +374961,2010-02-22 08:00:00,KIDNAPPING,INGLESIDE,2000 Block of ALEMANY BL,-122.440333066301,37.719566355087295 +375012,2010-02-22 00:57:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +375137,2010-02-14 16:52:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +375152,2010-02-14 16:24:00,ARSON,BAYVIEW,600 Block of GILMAN AV,-122.383440897994,37.7156328950599 +375267,2010-02-14 11:40:00,KIDNAPPING,TENDERLOIN,400 Block of TURK ST,-122.416349428183,37.7825569563078 +375268,2010-02-14 11:40:00,KIDNAPPING,TENDERLOIN,400 Block of TURK ST,-122.416349428183,37.7825569563078 +375341,2010-02-14 03:15:00,DRUNKENNESS,NORTHERN,1300 Block of VANNESS AV,-122.42163446728,37.7878032143885 +375344,2010-02-14 03:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +375385,2010-02-14 01:12:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413189430011,37.77127369135761 +375421,2010-02-13 23:45:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +375806,2010-02-13 00:45:00,DRUNKENNESS,SOUTHERN,800 Block of HOWARD ST,-122.403890955445,37.7824014072132 +375847,2010-02-12 22:35:00,KIDNAPPING,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +375964,2010-02-12 17:30:00,KIDNAPPING,CENTRAL,1900 Block of HYDE ST,-122.41895085107,37.7990610000915 +376175,2010-02-12 02:05:00,DRUNKENNESS,MISSION,16TH ST / VALENCIA ST,-122.421886357981,37.7649178909424 +376194,2010-02-12 00:59:00,DRUNKENNESS,SOUTHERN,100 Block of 11TH ST,-122.415766785425,37.773341748485706 +376240,2010-02-11 22:22:00,DRUNKENNESS,SOUTHERN,0 Block of 9TH ST,-122.414953043045,37.7765019124574 +376281,2010-02-11 20:16:00,DRUNKENNESS,TARAVAL,800 Block of ULLOA ST,-122.466026150018,37.74092818901779 +376491,2010-02-11 09:00:00,KIDNAPPING,NORTHERN,1700 Block of OFARRELL ST,-122.433533086649,37.783131565114005 +376510,2010-02-11 07:30:00,RUNAWAY,TARAVAL,100 Block of MAJESTIC AV,-122.452480935125,37.7161793461478 +376516,2010-02-11 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +376547,2010-02-11 01:10:00,DRUNKENNESS,CENTRAL,900 Block of SACRAMENTO ST,-122.408147060581,37.79318060571929 +376557,2010-02-11 00:05:00,DRUNKENNESS,SOUTHERN,MISSION ST / 11TH ST,-122.417104895556,37.7743242867908 +376613,2010-02-10 20:56:00,DRUNKENNESS,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +377010,2010-02-09 22:25:00,DRUNKENNESS,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +377018,2010-02-09 22:19:00,ARSON,PARK,1800 Block of EDDY ST,-122.438098378037,37.7806388583762 +377733,2010-01-31 18:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +377760,2010-01-31 17:00:00,RUNAWAY,MISSION,2400 Block of BRYANT ST,-122.409436313449,37.7551775435269 +377874,2010-01-31 08:43:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +377901,2010-01-31 02:01:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436867932617,37.7220486455317 +377936,2010-01-31 00:52:00,DRUNKENNESS,SOUTHERN,7TH ST / MINNA ST,-122.410405602135,37.778784148603286 +378062,2010-01-30 18:47:00,DRUNKENNESS,PARK,0 Block of KEZAR DR,-122.45512727517,37.7695200227183 +378154,2010-01-30 12:03:00,KIDNAPPING,TARAVAL,1200 Block of OCEAN AV,-122.455615861538,37.7238590120011 +378261,2010-01-30 00:55:00,DRUNKENNESS,SOUTHERN,700 Block of MISSION ST,-122.403070000847,37.7852686309087 +378275,2010-01-30 00:10:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +378380,2010-01-29 18:58:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +378398,2010-01-29 18:08:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / EDDY ST,-122.41753069698,37.78331075399689 +378446,2010-01-29 16:00:00,KIDNAPPING,BAYVIEW,20TH ST / 3RD ST,-122.388559411328,37.7604929243617 +378498,2010-01-29 13:20:00,KIDNAPPING,CENTRAL,GRANT AV / SUTTER ST,-122.405402610955,37.789630226693504 +378499,2010-01-29 13:20:00,KIDNAPPING,CENTRAL,GRANT AV / SUTTER ST,-122.405402610955,37.789630226693504 +378541,2010-01-29 11:30:00,KIDNAPPING,TARAVAL,0 Block of GARFIELD ST,-122.463139717802,37.72004405264551 +378589,2010-01-29 07:45:00,RUNAWAY,RICHMOND,800 Block of 35TH AV,-122.494900792341,37.77299908571021 +378619,2010-01-29 02:25:00,KIDNAPPING,SOUTHERN,0 Block of GOUGH ST,-122.421642137718,37.7728765820585 +378685,2010-01-28 22:30:00,RUNAWAY,INGLESIDE,4700 Block of MISSION ST,-122.436194484896,37.7227270383576 +378701,2010-01-28 21:40:00,KIDNAPPING,BAYVIEW,500 Block of GOETTINGEN ST,-122.405750990595,37.7250650064437 +378719,2010-01-28 20:25:00,ARSON,NORTHERN,1000 Block of GOLDEN GATE AV,-122.428651252158,37.7800402061663 +378905,2010-01-28 10:30:00,RUNAWAY,INGLESIDE,800 Block of FAXON AV,-122.459851001048,37.7281704525552 +378940,2010-01-28 08:05:00,ARSON,MISSION,2900 Block of 18TH ST,-122.411574230927,37.7616166397327 +379222,2010-01-27 14:07:00,KIDNAPPING,INGLESIDE,1900 Block of SAN JOSE AV,-122.44266908779,37.7253599131116 +379372,2010-01-27 06:00:00,RUNAWAY,MISSION,1700 Block of 15TH ST,-122.423775038029,37.7664900497694 +379392,2010-01-27 02:05:00,KIDNAPPING,MISSION,1100 Block of ALABAMA ST,-122.410970913175,37.7534747396472 +379399,2010-01-27 01:15:00,ARSON,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +379403,2010-01-27 01:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +379481,2010-01-26 20:00:00,DRUNKENNESS,INGLESIDE,5400 Block of MISSION ST,-122.444314025188,37.7131083433264 +379597,2010-01-26 14:30:00,RUNAWAY,TARAVAL,1300 Block of 43RD AV,-122.502708098898,37.7614820910625 +379712,2010-01-26 07:30:00,RUNAWAY,INGLESIDE,300 Block of ARBOR ST,-122.439068711234,37.7379187530468 +379730,2010-01-26 03:48:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +380125,2010-01-25 01:25:00,KIDNAPPING,BAYVIEW,1400 Block of OAKDALE AV,-122.387527753438,37.73305496510249 +380161,2010-01-17 23:30:00,DRUNKENNESS,PARK,1500 Block of HAYES ST,-122.441959336644,37.7745153968945 +380179,2010-01-17 22:39:00,DRUNKENNESS,SOUTHERN,1100 Block of HOWARD ST,-122.411359138357,37.7764944808779 +380227,2010-01-17 19:24:00,DRUNKENNESS,SOUTHERN,MARKET ST / POWELL ST,-122.407545855931,37.784401179486 +380334,2010-01-17 12:21:00,KIDNAPPING,BAYVIEW,100 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +380453,2010-01-17 01:15:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / GREEN ST,-122.409017007613,37.7994880717633 +380460,2010-01-17 00:53:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +380487,2010-01-16 23:00:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345148,37.7839916768161 +380493,2010-01-16 23:00:00,KIDNAPPING,SOUTHERN,HARRISON ST / 2ND ST,-122.395163154488,37.7843096998676 +380578,2010-01-16 18:45:00,DRUNKENNESS,NORTHERN,700 Block of POLK ST,-122.419159190984,37.7833430636234 +380590,2010-01-16 18:20:00,KIDNAPPING,MISSION,TREAT AV / 26TH ST,-122.412690142308,37.7493688284532 +380703,2010-01-16 12:38:00,DRUNKENNESS,TARAVAL,800 Block of ULLOA ST,-122.466026150018,37.74092818901779 +380744,2010-01-16 10:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +380838,2010-01-16 00:40:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405862214655,37.7979117105028 +380892,2010-01-15 23:00:00,KIDNAPPING,RICHMOND,2000 Block of CLEMENT ST,-122.481139437535,37.7822406949796 +381037,2010-01-15 16:30:00,RUNAWAY,INGLESIDE,5200 Block of MISSION ST,-122.442127045623,37.7149977234776 +381098,2010-01-15 14:00:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +381223,2010-01-15 09:00:00,KIDNAPPING,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +381300,2010-01-15 01:00:00,ARSON,TARAVAL,1200 Block of 25TH AV,-122.483549147995,37.7642044083861 +381426,2010-01-14 18:56:00,KIDNAPPING,TENDERLOIN,TURK ST / HYDE ST,-122.415694922134,37.7825851968467 +381427,2010-01-14 18:56:00,KIDNAPPING,TENDERLOIN,TURK ST / HYDE ST,-122.415694922134,37.7825851968467 +381432,2010-01-14 18:40:00,ARSON,INGLESIDE,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +381463,2010-01-14 17:39:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +381906,2010-01-13 15:34:00,KIDNAPPING,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +381988,2010-01-13 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +382105,2010-01-13 00:50:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +382480,2010-01-12 00:23:00,DRUNKENNESS,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +382495,2010-01-11 23:20:00,KIDNAPPING,SOUTHERN,0 Block of KING ST,-122.388778001806,37.7807643532489 +382592,2010-01-11 16:38:00,ARSON,TARAVAL,RIVERA ST / 45TH AV,-122.470512186116,37.7470179441251 +382616,2010-01-11 16:00:00,DRUNKENNESS,NORTHERN,2300 Block of CHESTNUT ST,-122.4420167856,37.80002781544521 +382625,2010-01-11 15:45:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +382627,2010-01-11 15:35:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +382648,2010-01-11 14:45:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +382768,2010-01-11 08:15:00,RUNAWAY,BAYVIEW,1500 Block of VANDYKE AV,-122.391459714269,37.7286847085813 +382817,2010-01-11 01:59:00,ARSON,MISSION,VALENCIA ST / 17TH ST,-122.421733767763,37.7632996945938 +382850,2009-12-27 23:49:00,DRUNKENNESS,INGLESIDE,3100 Block of MISSION ST,-122.419374719759,37.746504037822 +382941,2009-12-27 19:15:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +383033,2009-12-27 14:15:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +383176,2009-12-27 01:30:00,KIDNAPPING,TENDERLOIN,100 Block of ELLIS ST,-122.408270724034,37.78549414241861 +383272,2009-12-26 18:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +383316,2009-12-26 15:28:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +383367,2009-12-26 12:56:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +383404,2009-12-26 10:01:00,ARSON,BAYVIEW,TURNER TR / MISSOURI ST,-122.395685389591,37.757041031858286 +383492,2009-12-25 22:11:00,DRUNKENNESS,TENDERLOIN,0 Block of 5THSTNORTH ST,-122.408294122336,37.7842476296454 +383519,2009-12-25 19:20:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +383629,2009-12-25 09:30:00,KIDNAPPING,NORTHERN,ELLIS ST / HOLLIS ST,-122.43005356191,37.7826724016215 +383662,2009-12-25 03:06:00,DRUNKENNESS,MISSION,900 Block of SOUTH VAN NESS AV,-122.416863555609,37.7579459514924 +383684,2009-12-25 00:45:00,KIDNAPPING,TARAVAL,GONZALEZ DR / CARDENAS AV,-122.475511225577,37.718920646168606 +383695,2009-12-25 00:01:00,KIDNAPPING,INGLESIDE,0 Block of POPE ST,-122.441384223845,37.71429319030009 +383696,2009-12-25 00:01:00,KIDNAPPING,INGLESIDE,700 Block of MADRID ST,-122.43581443393,37.7177438152519 +383788,2009-12-24 18:40:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +383896,2009-12-24 12:53:00,KIDNAPPING,MISSION,1300 Block of ALABAMA ST,-122.410663911381,37.7502798340035 +384021,2009-12-23 23:05:00,DRUNKENNESS,TARAVAL,4200 Block of JUDAH ST,-122.50754748028,37.7604078316909 +384036,2009-12-23 22:30:00,DRUNKENNESS,TARAVAL,19TH AV / SLOAT BL,-122.475102006298,37.734623708357 +384130,2009-12-23 18:40:00,ARSON,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +384154,2009-12-23 17:10:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +384234,2009-12-23 14:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +384446,2009-12-22 23:00:00,ARSON,TARAVAL,100 Block of RALSTON ST,-122.468838709176,37.7151954280475 +384657,2009-12-22 13:00:00,RUNAWAY,MISSION,14TH ST / FOLSOM ST,-122.41561633832,37.7685360123583 +384697,2009-12-22 11:37:00,KIDNAPPING,NORTHERN,1000 Block of VANNESS AV,-122.421203512,37.785481204644704 +384834,2009-12-21 22:15:00,ARSON,RICHMOND,3200 Block of CLAY ST,-122.446477321499,37.7892124372321 +384938,2009-12-21 17:15:00,KIDNAPPING,CENTRAL,900 Block of GRANT AV,-122.40649729336,37.7956016951648 +384948,2009-12-21 16:44:00,DRUNKENNESS,SOUTHERN,500 Block of MISSION ST,-122.398912581875,37.7886287320653 +385133,2009-12-21 00:30:00,KIDNAPPING,INGLESIDE,0 Block of CONCORD ST,-122.442769889927,37.7127587074853 +385155,2009-12-13 23:32:00,DRUNKENNESS,MISSION,22ND ST / SOUTH VAN NESS AV,-122.416569016036,37.755568796919 +385178,2009-12-13 21:00:00,KIDNAPPING,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +385226,2009-12-13 18:00:00,KIDNAPPING,INGLESIDE,0 Block of SGTJOHNVYOUNG LN,-122.444707063455,37.7249307267936 +385298,2009-12-13 13:52:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +385382,2009-12-13 05:00:00,KIDNAPPING,PARK,0 Block of CARL ST,-122.448900460062,37.7658792859724 +385405,2009-12-13 01:41:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +385591,2009-12-12 14:22:00,DRUNKENNESS,BAYVIEW,BAY SHORE BL / SUNNYDALE AV,-122.405109485404,37.7088563076781 +385627,2009-12-12 12:00:00,KIDNAPPING,NORTHERN,2200 Block of WEBSTER ST,-122.432720646252,37.7913595456593 +385702,2009-12-12 03:22:00,ARSON,PARK,600 Block of HAIGHT ST,-122.432918340311,37.7717365330369 +385707,2009-12-12 02:46:00,DRUNKENNESS,SOUTHERN,400 Block of JESSIE ST,-122.408534383763,37.7820325646934 +385721,2009-12-12 01:57:00,DRUNKENNESS,TENDERLOIN,300 Block of HYDE ST,-122.41604728066002,37.7839824654149 +385780,2009-12-11 22:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +385807,2009-12-11 20:54:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +385823,2009-12-11 20:00:00,KIDNAPPING,NORTHERN,2900 Block of LYON ST,-122.447163343762,37.798002807473296 +386010,2009-12-11 09:30:00,DRUNKENNESS,PARK,200 Block of HENRY ST,-122.43644263349,37.7664251362598 +386014,2009-12-11 09:10:00,RUNAWAY,INGLESIDE,600 Block of PARIS ST,-122.437443109934,37.718522879998005 +386045,2009-12-11 03:10:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +386067,2009-12-11 00:18:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421550176461,37.7621307247611 +386081,2009-12-10 23:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +386094,2009-12-10 21:36:00,DRUNKENNESS,SOUTHERN,0 Block of 1ST ST,-122.397990653035,37.7901719728136 +386119,2009-12-10 20:20:00,DRUNKENNESS,SOUTHERN,1600 Block of MARKET ST,-122.421522300696,37.7732180675925 +386159,2009-12-10 18:00:00,RUNAWAY,INGLESIDE,300 Block of HEARST AV,-122.445457420727,37.7306487301986 +386164,2009-12-10 17:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +386363,2009-12-10 01:10:00,DRUNKENNESS,SOUTHERN,HARRISON ST / FREMONT ST,-122.392055370759,37.7867658932764 +386396,2009-12-09 23:00:00,KIDNAPPING,SOUTHERN,100 Block of VALENCIA ST,-122.422513037848,37.7707107653585 +386474,2009-12-09 18:00:00,RUNAWAY,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +386641,2009-12-09 10:42:00,DRUNKENNESS,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +386750,2009-12-08 21:26:00,DRUNKENNESS,SOUTHERN,1300 Block of HARRISON ST,-122.411027020165,37.7718543104907 +386818,2009-12-08 18:29:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +386895,2009-12-08 14:20:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +386948,2009-12-08 11:28:00,KIDNAPPING,PARK,HAIGHT ST / STANYAN ST,-122.45353456066002,37.76916629780521 +386993,2009-12-08 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +387052,2009-12-07 23:05:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +387058,2009-12-07 23:00:00,KIDNAPPING,SOUTHERN,HOWARD ST / 9TH ST,-122.413163134276,37.7749926445385 +387069,2009-12-07 22:15:00,DRUNKENNESS,MISSION,23RD ST / MISSION ST,-122.418596727459,37.753838204850105 +387162,2009-12-07 16:56:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +387324,2009-12-07 08:30:00,KIDNAPPING,MISSION,18TH ST / MISSION ST,-122.419360352761,37.7618358012376 +387379,2009-12-07 00:01:00,KIDNAPPING,INGLESIDE,300 Block of WINFIELD ST,-122.419817175318,37.74057166063661 +387454,2009-11-29 19:35:00,ARSON,BAYVIEW,1200 Block of FAIRFAX AV,-122.382542136125,37.7386155130251 +387460,2009-11-29 19:00:00,DRUNKENNESS,PARK,800 Block of STANYAN ST,-122.453326877728,37.7677678622499 +387483,2009-11-29 18:00:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +387713,2009-11-29 00:32:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +387715,2009-11-29 00:30:00,DRUNKENNESS,TENDERLOIN,100 Block of ELLIS ST,-122.408270724034,37.78549414241861 +387725,2009-11-29 00:01:00,DRUNKENNESS,MISSION,SHOTWELL ST / 21ST ST,-122.415629332446,37.757232227914 +387780,2009-11-28 21:00:00,RUNAWAY,RICHMOND,1500 Block of BRODERICK ST,-122.4413763368,37.7845888740833 +387781,2009-11-28 21:00:00,ARSON,MISSION,900 Block of HAMPSHIRE ST,-122.407745685863,37.7568873539955 +388100,2009-11-27 23:00:00,KIDNAPPING,NORTHERN,1300 Block of VANNESS AV,-122.42163446728,37.7878032143885 +388326,2009-11-27 07:15:00,KIDNAPPING,MISSION,900 Block of YORK ST,-122.408504811909,37.7568417455748 +388385,2009-11-26 23:40:00,DRUNKENNESS,MISSION,3200 Block of 26TH ST,-122.414593171104,37.7491990535295 +388408,2009-11-26 22:03:00,DRUNKENNESS,CENTRAL,LEAVENWORTH ST / PACIFIC AV,-122.416655593468,37.795669583648 +388431,2009-11-26 21:20:00,KIDNAPPING,RICHMOND,2600 Block of MCALLISTER ST,-122.455984096274,37.775599474222105 +388482,2009-11-26 17:30:00,KIDNAPPING,TARAVAL,HOLLOWAY AV / BRIGHTON AV,-122.455126636805,37.72184838546049 +388531,2009-11-26 13:00:00,RUNAWAY,BAYVIEW,0 Block of BERTHA LN,-122.380990356551,37.7331435009212 +388540,2009-11-26 12:40:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +388626,2009-11-26 02:25:00,ARSON,PARK,100 Block of DOWNEY ST,-122.446780341512,37.7654021061194 +388627,2009-11-26 02:22:00,ARSON,PARK,700 Block of CLAYTON ST,-122.448129494514,37.7679265590444 +388786,2009-11-25 17:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +388787,2009-11-25 17:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +388885,2009-11-25 12:15:00,KIDNAPPING,SOUTHERN,MARKET ST / 7TH ST,-122.41251534135598,37.78047774805079 +388998,2009-11-25 01:48:00,KIDNAPPING,TENDERLOIN,EDDY ST / TAYLOR ST,-122.410955248906,37.7841399509594 +389078,2009-11-24 21:30:00,ARSON,TARAVAL,100 Block of LOBOS ST,-122.457586282765,37.7149728603848 +389237,2009-11-24 14:57:00,KIDNAPPING,TENDERLOIN,LEAVENWORTH ST / ELLIS ST,-122.414433155063,37.7846576329256 +389270,2009-11-24 13:00:00,KIDNAPPING,BAYVIEW,2000 Block of PALOU AV,-122.39929010698,37.738800174776 +389477,2009-11-23 22:03:00,ARSON,BAYVIEW,1300 Block of DONNER AV,-122.389235739237,37.72175477339989 +389496,2009-11-23 21:00:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +389689,2009-11-23 12:00:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +389776,2009-11-23 07:30:00,RUNAWAY,INGLESIDE,3400 Block of MISSION ST,-122.422171411306,37.741941844266 +389795,2009-11-23 03:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +389982,2009-11-15 16:10:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +390030,2009-11-15 12:35:00,DRUNKENNESS,PARK,1800 Block of WALLER ST,-122.454330105396,37.7681530111159 +390131,2009-11-15 03:07:00,ARSON,CENTRAL,1000 Block of SUTTER ST,-122.417672923626,37.7881242734432 +390165,2009-11-15 01:42:00,DRUNKENNESS,TENDERLOIN,OFARRELL ST / JONES ST,-122.412970537591,37.78578837668879 +390215,2009-11-14 23:13:00,DRUNKENNESS,PARK,600 Block of DIVISADERO ST,-122.438017163866,37.7754528195968 +390237,2009-11-14 21:30:00,KIDNAPPING,MISSION,200 Block of CLINTONPARK ST,-122.425665566837,37.7691019900231 +390409,2009-11-14 12:50:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +390446,2009-11-14 11:05:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +390506,2009-11-14 03:11:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +390579,2009-11-13 22:03:00,DRUNKENNESS,SOUTHERN,MARKET ST / OFARRELL ST,-122.404587539604,37.78673168085329 +390586,2009-11-13 21:54:00,ARSON,SOUTHERN,KING ST / 4TH ST,-122.394102624525,37.7763827130285 +390615,2009-11-13 20:03:00,DRUNKENNESS,CENTRAL,2800 Block of JONES ST,-122.41728666358,37.8075604240144 +390641,2009-11-13 19:12:00,DRUNKENNESS,PARK,3600 Block of 16TH ST,-122.434221184718,37.7642237070482 +390718,2009-11-13 15:26:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +390773,2009-11-13 12:32:00,DRUNKENNESS,SOUTHERN,MARKET ST / NEWMONTGOMERY ST,-122.402070243227,37.788719868813295 +390873,2009-11-13 07:45:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +390937,2009-11-13 00:18:00,DRUNKENNESS,NORTHERN,3200 Block of SCOTT ST,-122.441147713309,37.7997018632448 +391044,2009-11-12 19:20:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +391269,2009-11-12 06:45:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +391333,2009-11-11 23:00:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +391339,2009-11-11 22:45:00,DRUNKENNESS,RICHMOND,FULTON ST / 4TH AV,-122.461621881496,37.7738940800796 +391349,2009-11-11 22:20:00,KIDNAPPING,MISSION,2300 Block of FOLSOM ST,-122.41469551481,37.7596861764245 +391365,2009-11-11 21:25:00,DRUNKENNESS,TENDERLOIN,400 Block of JONES ST,-122.412899249686,37.7850974904289 +391477,2009-11-11 15:40:00,KIDNAPPING,TENDERLOIN,300 Block of TURK ST,-122.41487855905,37.7826335031541 +391701,2009-11-11 02:20:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +391704,2009-11-11 02:09:00,DRUNKENNESS,SOUTHERN,TOWNSEND ST / 3RD ST,-122.392753573574,37.7788518670227 +391802,2009-11-10 20:29:00,DRUNKENNESS,TENDERLOIN,OFARRELL ST / MASON ST,-122.409686191837,37.7862042105295 +391842,2009-11-10 18:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +392185,2009-11-09 20:00:00,RUNAWAY,TARAVAL,500 Block of VIDAL DR,-122.484022205168,37.7156594467984 +392307,2009-11-09 14:22:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +392409,2009-11-09 07:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +392469,2009-11-01 22:58:00,DRUNKENNESS,TENDERLOIN,EDDY ST / TAYLOR ST,-122.410955248906,37.7841399509594 +392561,2009-11-01 18:11:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +392572,2009-11-01 17:54:00,KIDNAPPING,INGLESIDE,VISITACION AV / SAWYER ST,-122.414371339423,37.71324682684849 +392659,2009-11-01 13:45:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +392765,2009-11-01 07:52:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +392770,2009-11-01 07:01:00,KIDNAPPING,INGLESIDE,1100 Block of SUNNYDALE AV,-122.412613134752,37.7109009555588 +392778,2009-11-01 06:57:00,DRUNKENNESS,TENDERLOIN,TAYLOR ST / TURK ST,-122.410768766343,37.7832145190013 +392881,2009-11-01 01:13:00,DRUNKENNESS,SOUTHERN,STILLMAN ST / 3RD ST,-122.396381836885,37.7817492235226 +392901,2009-11-01 00:56:00,DRUNKENNESS,SOUTHERN,0 Block of MINNA ST,-122.398708168891,37.788089672437 +392917,2009-11-01 00:20:00,DRUNKENNESS,SOUTHERN,0 Block of MINNA ST,-122.398708168891,37.788089672437 +393005,2009-10-31 22:30:00,DRUNKENNESS,SOUTHERN,HARRISON ST / 7TH ST,-122.406300138733,37.7755131129937 +393079,2009-10-31 19:40:00,KIDNAPPING,NORTHERN,CHESTNUT ST / SCOTT ST,-122.441178352537,37.8001881690514 +393185,2009-10-31 13:30:00,KIDNAPPING,TENDERLOIN,0 Block of TAYLOR ST,-122.410689907787,37.7824948907735 +393326,2009-10-31 03:50:00,KIDNAPPING,MISSION,300 Block of 14TH ST,-122.421797245093,37.7681088832674 +393407,2009-10-30 23:00:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +393442,2009-10-30 21:58:00,DRUNKENNESS,TARAVAL,400 Block of JUDAH ST,-122.466721267758,37.7620550505363 +393507,2009-10-30 18:55:00,DRUNKENNESS,TENDERLOIN,TURK ST / HYDE ST,-122.415694922134,37.7825851968467 +393511,2009-10-30 18:50:00,DRUNKENNESS,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +393830,2009-10-29 20:45:00,ARSON,TENDERLOIN,500 Block of ELLIS ST,-122.415436031905,37.784585134714 +393872,2009-10-29 19:00:00,KIDNAPPING,NORTHERN,800 Block of OFARRELL ST,-122.418751252829,37.7851160049429 +393883,2009-10-29 18:27:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +393919,2009-10-29 16:33:00,DRUNKENNESS,RICHMOND,GEARY BL / 18TH AV,-122.477241022391,37.7804373318996 +394082,2009-10-29 08:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +394132,2009-10-29 01:45:00,ARSON,BAYVIEW,0 Block of INDUSTRIAL ST,-122.400268422092,37.73971662750439 +394180,2009-10-28 22:00:00,RUNAWAY,BAYVIEW,1200 Block of QUESADA AV,-122.383037431906,37.728636436753 +394195,2009-10-28 20:30:00,DRUNKENNESS,NORTHERN,3100 Block of SCOTT ST,-122.440821226214,37.798785603265294 +394219,2009-10-28 19:40:00,DRUNKENNESS,CENTRAL,POWELL ST / GEARY ST,-122.408231026261,37.787359494956 +394309,2009-10-28 15:30:00,KIDNAPPING,BAYVIEW,1000 Block of INGERSON AV,-122.393894531353,37.71969931085261 +394337,2009-10-28 14:45:00,KIDNAPPING,INGLESIDE,200 Block of ONEIDA AV,-122.443009986764,37.7218704825421 +394595,2009-10-27 19:15:00,RUNAWAY,INGLESIDE,SILVER AV / MISSION ST,-122.431295002963,37.7287297938303 +394781,2009-10-27 12:00:00,RUNAWAY,INGLESIDE,0 Block of MALTA DR,-122.444172693788,37.73532958034721 +394852,2009-10-27 08:00:00,KIDNAPPING,BAYVIEW,GOETTINGEN ST / MANSELL ST,-122.404017710661,37.7207681881298 +394930,2009-10-26 23:49:00,DRUNKENNESS,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +394933,2009-10-26 23:40:00,DRUNKENNESS,NORTHERN,STEINER ST / PIXLEY ST,-122.437424299298,37.79827761996479 +395036,2009-10-26 17:48:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / JONES ST,-122.412784096502,37.78486569395261 +395075,2009-10-26 15:41:00,DRUNKENNESS,RICHMOND,0 Block of MASONIC AV,-122.447335040314,37.7824869629764 +395088,2009-10-26 15:00:00,RUNAWAY,TARAVAL,200 Block of MONTICELLO ST,-122.470673521408,37.7187815894447 +395143,2009-10-26 12:30:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +395184,2009-10-26 10:30:00,ARSON,INGLESIDE,700 Block of PORTOLA DR,-122.453725754435,37.7442209162424 +395232,2009-10-26 08:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +395468,2009-10-18 13:30:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +395525,2009-10-18 10:00:00,KIDNAPPING,NORTHERN,700 Block of EDDY ST,-122.420025955939,37.7830500140737 +395631,2009-10-18 00:17:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407707096397,37.785103454566105 +395650,2009-10-17 23:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +395686,2009-10-17 21:45:00,DRUNKENNESS,MISSION,DIAMOND ST / 18TH ST,-122.437193152373,37.76075843116929 +395720,2009-10-17 20:00:00,ARSON,CENTRAL,1100 Block of LEAVENWORTH ST,-122.415810065775,37.7918536596793 +395723,2009-10-17 19:39:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +395735,2009-10-17 19:00:00,KIDNAPPING,BAYVIEW,1900 Block of 25TH ST,-122.397486915671,37.752197092814 +395842,2009-10-17 14:00:00,RUNAWAY,BAYVIEW,700 Block of JERROLD AV,-122.373456171525,37.7296796672727 +395976,2009-10-17 03:10:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +395981,2009-10-17 02:56:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +395996,2009-10-17 02:22:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +396035,2009-10-17 00:30:00,DRUNKENNESS,SOUTHERN,600 Block of HOWARD ST,-122.399870165149,37.7854258563204 +396370,2009-10-16 10:40:00,DRUNKENNESS,PARK,300 Block of LAGUNAHONDA BL,-122.45868018978202,37.7481554692332 +396407,2009-10-16 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +396417,2009-10-16 06:02:00,ARSON,BAYVIEW,ELMIRA ST / HELENA ST,-122.403787404178,37.7366189386059 +396626,2009-10-15 16:15:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +396733,2009-10-15 10:00:00,KIDNAPPING,MISSION,1100 Block of VALENCIA ST,-122.420817675346,37.75448782255511 +396790,2009-10-15 02:29:00,DRUNKENNESS,TENDERLOIN,EDDY ST / LEAVENWORTH ST,-122.414242955907,37.7837240254478 +396889,2009-10-14 20:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +397171,2009-10-14 07:00:00,RUNAWAY,NORTHERN,3600 Block of FILLMORE ST,-122.436634731484,37.803135683639 +397181,2009-10-14 06:00:00,KIDNAPPING,INGLESIDE,3100 Block of ALEMANY BL,-122.455973288187,37.7101255439309 +397512,2009-10-13 02:30:00,KIDNAPPING,INGLESIDE,600 Block of PRECITA AV,-122.409065369078,37.7477131831685 +397549,2009-10-12 23:30:00,KIDNAPPING,SOUTHERN,0 Block of 9TH ST,-122.415064887666,37.7764354063246 +397780,2009-10-12 10:45:00,KIDNAPPING,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +397795,2009-10-12 10:00:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +397894,2009-10-12 00:01:00,RUNAWAY,CENTRAL,900 Block of SUTTER ST,-122.416032976503,37.78833512481809 +397916,2009-10-04 22:45:00,DRUNKENNESS,PARK,2500 Block of GEARY BL,-122.445217147539,37.7827388378288 +398011,2009-10-04 18:00:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.43403618214,37.7632941952462 +398073,2009-10-04 14:44:00,DRUNKENNESS,TENDERLOIN,EDDY ST / TAYLOR ST,-122.410955248906,37.7841399509594 +398103,2009-10-04 12:30:00,KIDNAPPING,NORTHERN,800 Block of OFARRELL ST,-122.418751252829,37.7851160049429 +398132,2009-10-04 11:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +398170,2009-10-04 05:00:00,KIDNAPPING,INGLESIDE,200 Block of MONTEREY BL,-122.440906571765,37.731680654848 +398224,2009-10-04 01:30:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +398262,2009-10-03 23:30:00,KIDNAPPING,MISSION,2600 Block of MISSION ST,-122.418738265772,37.7546172382083 +398263,2009-10-03 23:30:00,KIDNAPPING,MISSION,2600 Block of MISSION ST,-122.418738265772,37.7546172382083 +398606,2009-10-03 06:05:00,DRUNKENNESS,INGLESIDE,MISSION ST / SENECA AV,-122.440105592045,37.717665894930896 +398624,2009-10-03 02:30:00,KIDNAPPING,NORTHERN,POLK ST / POST ST,-122.419930111611,37.7868262082156 +398627,2009-10-03 02:30:00,KIDNAPPING,NORTHERN,POLK ST / POST ST,-122.419930111611,37.7868262082156 +398636,2009-10-03 02:00:00,DRUNKENNESS,CENTRAL,BROADWAY ST / SANSOME ST,-122.402232454222,37.7984302773598 +398717,2009-10-02 22:23:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +398730,2009-10-02 22:00:00,RUNAWAY,BAYVIEW,400 Block of GOETTINGEN ST,-122.406247835455,37.72626366396779 +398758,2009-10-02 20:30:00,DRUNKENNESS,TENDERLOIN,200 Block of MCALLISTER ST,-122.415754575208,37.780719182394 +398795,2009-10-02 18:55:00,KIDNAPPING,TENDERLOIN,300 Block of TAYLOR ST,-122.411302813025,37.7855355791102 +398850,2009-10-02 16:30:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +399008,2009-10-02 08:40:00,RUNAWAY,INGLESIDE,PERSIA AV / PRAGUE ST,-122.427191891813,37.7189436957878 +399051,2009-10-02 06:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +399065,2009-10-02 02:40:00,ARSON,BAYVIEW,NEWHALL ST / EVANS AV,-122.38655575027,37.7419504238358 +399207,2009-10-01 18:45:00,ARSON,BAYVIEW,300 Block of NEWHALL ST,-122.385390044599,37.742659782963 +399251,2009-10-01 16:34:00,KIDNAPPING,SOUTHERN,5TH ST / MISSION ST,-122.406481972743,37.782731788488704 +399352,2009-10-01 12:00:00,KIDNAPPING,TARAVAL,1500 Block of 28TH AV,-122.486376465356,37.75845938382661 +399496,2009-10-01 01:00:00,KIDNAPPING,CENTRAL,100 Block of LOMBARD ST,-122.404172784948,37.8038752032521 +399550,2009-10-01 00:01:00,KIDNAPPING,TARAVAL,500 Block of ORIZABA AV,-122.462723678063,37.7191239378637 +399687,2009-09-30 17:00:00,ARSON,NORTHERN,1600 Block of PACIFIC AV,-122.422431723545,37.794974567141 +399689,2009-09-30 16:49:00,KIDNAPPING,BAYVIEW,0 Block of GARLINGTON CT,-122.38435769838,37.7324996437285 +399856,2009-09-30 09:00:00,RUNAWAY,TARAVAL,0 Block of CAINE AV,-122.450460158907,37.7173075851019 +399981,2009-09-29 21:00:00,KIDNAPPING,SOUTHERN,0 Block of 9TH ST,-122.415064887666,37.7764354063246 +400096,2009-09-29 15:40:00,ARSON,MISSION,4100 Block of 24TH ST,-122.435209391759,37.7511723136128 +400105,2009-09-29 15:30:00,RUNAWAY,BAYVIEW,SAN BRUNO AV / BURROWS ST,-122.404099929802,37.7288373396427 +400116,2009-09-29 14:45:00,KIDNAPPING,BAYVIEW,1500 Block of OAKDALE AV,-122.389390729131,37.7341211312767 +400220,2009-09-29 10:10:00,KIDNAPPING,RICHMOND,500 Block of 41ST AV,-122.501731528999,37.77833073243779 +400269,2009-09-29 08:00:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +400308,2009-09-29 03:00:00,KIDNAPPING,NORTHERN,2000 Block of FILLMORE ST,-122.433813580387,37.7884287785616 +400314,2009-09-29 03:00:00,KIDNAPPING,NORTHERN,2000 Block of FILLMORE ST,-122.433813580387,37.7884287785616 +400346,2009-09-29 00:17:00,DRUNKENNESS,MISSION,MARKET ST / CASTRO ST,-122.435187699349,37.7626702770872 +400363,2009-09-28 23:00:00,DRUNKENNESS,SOUTHERN,400 Block of MISSION ST,-122.397091759801,37.7900661929348 +400621,2009-09-28 07:45:00,KIDNAPPING,NORTHERN,1800 Block of GREEN ST,-122.429574683713,37.7969397346952 +400651,2009-09-28 02:05:00,DRUNKENNESS,RICHMOND,25TH AV / GEARY BL,-122.484731728932,37.780091707804 +400655,2009-09-28 02:05:00,DRUNKENNESS,RICHMOND,25TH AV / GEARY BL,-122.484731728932,37.780091707804 +400821,2009-09-20 17:00:00,RUNAWAY,INGLESIDE,5200 Block of DIAMONDHEIGHTS BL,-122.438840058487,37.74445916316101 +400873,2009-09-20 14:50:00,ARSON,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +401029,2009-09-20 04:49:00,ARSON,BAYVIEW,GIANTS DR / INGERSON AV,-122.388131624111,37.7162991794211 +401061,2009-09-20 02:00:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929231,37.7980180687744 +401098,2009-09-20 00:20:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413189430011,37.77127369135761 +401235,2009-09-19 18:50:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +401241,2009-09-19 18:30:00,KIDNAPPING,TARAVAL,1200 Block of 31ST AV,-122.490117879527,37.7639167675035 +401277,2009-09-19 17:14:00,DRUNKENNESS,NORTHERN,1000 Block of POST ST,-122.419126295342,37.7869849580362 +401278,2009-09-19 17:14:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +401338,2009-09-19 13:45:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +401415,2009-09-19 09:09:00,DRUNKENNESS,BAYVIEW,REVERE AV / ROBBLEE AV,-122.398328468888,37.736045008628295 +401423,2009-09-19 08:51:00,ARSON,CENTRAL,900 Block of POST ST,-122.417641342653,37.78717352500789 +401441,2009-09-19 06:45:00,ARSON,BAYVIEW,0 Block of DOUBLEROCK ST,-122.387775002515,37.7204658651293 +401504,2009-09-19 00:56:00,ARSON,PARK,1000 Block of MASONIC AV,-122.445555834566,37.7716104916829 +401654,2009-09-18 17:55:00,DRUNKENNESS,NORTHERN,GOLDEN GATE AV / STEINER ST,-122.433597792607,37.7793537315707 +401890,2009-09-18 06:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +401940,2009-09-18 01:18:00,KIDNAPPING,CENTRAL,COLUMBUS AV / PACIFIC AV,-122.405517223277,37.7970642284992 +401959,2009-09-18 00:01:00,DRUNKENNESS,TARAVAL,WORCESTER AV / ALEMANY BL,-122.467025622477,37.7114947412005 +402114,2009-09-17 17:20:00,KIDNAPPING,TARAVAL,0 Block of BORICA ST,-122.468227979374,37.7225922041408 +402393,2009-09-17 01:15:00,DRUNKENNESS,INGLESIDE,3400 Block of MISSION ST,-122.422665047787,37.741419043576 +402520,2009-09-16 18:10:00,DRUNKENNESS,TENDERLOIN,POWELL ST / GEARY ST,-122.408231026261,37.787359494956 +402674,2009-09-16 12:00:00,KIDNAPPING,MISSION,21ST ST / SOUTH VAN NESS AV,-122.416720982004,37.7571677817188 +402802,2009-09-16 01:01:00,DRUNKENNESS,SOUTHERN,RITCH ST / TOWNSEND ST,-122.393289592936,37.7784284783975 +402902,2009-09-15 20:43:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +402926,2009-09-15 19:26:00,DRUNKENNESS,TENDERLOIN,400 Block of ELLIS ST,-122.413631253258,37.7848053746211 +402942,2009-09-15 18:40:00,DRUNKENNESS,TARAVAL,2200 Block of 29TH AV,-122.486667576213,37.7453555419744 +402974,2009-09-15 17:22:00,DRUNKENNESS,PARK,HAIGHT ST / ASHBURY ST,-122.446933310975,37.77000619883579 +403111,2009-09-15 12:30:00,KIDNAPPING,SOUTHERN,1600 Block of MARKET ST,-122.420908634584,37.773700335897296 +403113,2009-09-15 12:30:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446143672039,37.7700527182372 +403343,2009-09-14 21:50:00,KIDNAPPING,BAYVIEW,0 Block of FLORA ST,-122.394396938807,37.7318711159459 +403364,2009-09-14 20:30:00,RUNAWAY,PARK,600 Block of BRODERICK ST,-122.439683839524,37.7761964091629 +403451,2009-09-14 16:45:00,KIDNAPPING,INGLESIDE,1500 Block of FLORIDA ST,-122.409677317108,37.7479321533574 +403471,2009-09-14 15:33:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +403690,2009-09-14 00:58:00,DRUNKENNESS,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +403692,2009-09-14 00:45:00,ARSON,INGLESIDE,100 Block of PARIS ST,-122.431579212515,37.7262214019626 +403897,2009-09-06 14:00:00,ARSON,RICHMOND,400 Block of 24TH AV,-122.483662388761,37.78109449443539 +403918,2009-09-06 12:50:00,DRUNKENNESS,CENTRAL,JEFFERSON ST / MASON ST,-122.414166515093,37.808419917271 +403927,2009-09-06 12:30:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +403933,2009-09-06 12:15:00,DRUNKENNESS,RICHMOND,2100 Block of BRODERICK ST,-122.44249875978,37.7901183495566 +404030,2009-09-06 03:08:00,DRUNKENNESS,SOUTHERN,6TH ST / FOLSOM ST,-122.405618998022,37.7785045190918 +404079,2009-09-06 00:15:00,DRUNKENNESS,SOUTHERN,MARKET ST / 4TH ST,-122.405832474482,37.7857446545609 +404231,2009-09-05 18:39:00,DRUNKENNESS,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +404313,2009-09-05 15:35:00,DRUNKENNESS,SOUTHERN,MARKET ST / JONES ST,-122.411979487494,37.7809039696758 +404463,2009-09-05 07:00:00,RUNAWAY,MISSION,1200 Block of UTAH ST,-122.405460433484,37.7536841158237 +404533,2009-09-05 00:01:00,KIDNAPPING,TARAVAL,0 Block of RAVENWOOD DR,-122.461058406919,37.73503362381911 +404574,2009-09-04 22:40:00,KIDNAPPING,INGLESIDE,100 Block of PARQUE DR,-122.422592099161,37.709998706156 +404659,2009-09-04 18:44:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / LARKIN ST,-122.417146843836,37.781446350134 +404660,2009-09-04 18:40:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +404780,2009-09-04 13:48:00,DRUNKENNESS,TENDERLOIN,200 Block of POWELL ST,-122.408201657254,37.7868849113107 +404803,2009-09-04 12:55:00,ARSON,BAYVIEW,100 Block of SCOTIA AV,-122.400334531782,37.73253843351821 +404930,2009-09-04 03:00:00,ARSON,CENTRAL,600 Block of LOMBARD ST,-122.41223801741998,37.802983078398704 +405097,2009-09-03 16:07:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +405108,2009-09-03 16:00:00,KIDNAPPING,TARAVAL,PACHECO ST / 46TH AV,-122.505145491298,37.749232889311294 +405119,2009-09-03 15:09:00,DRUNKENNESS,NORTHERN,1000 Block of POLK ST,-122.419950057632,37.7865904778229 +405174,2009-09-03 12:40:00,DRUNKENNESS,CENTRAL,SACRAMENTO ST / FRONT ST,-122.39897271985,37.794282815785 +405185,2009-09-03 12:04:00,DRUNKENNESS,SOUTHERN,700 Block of MARKET ST,-122.405359371753,37.7859774761625 +405205,2009-09-03 11:15:00,KIDNAPPING,NORTHERN,1700 Block of BUSH ST,-122.426077177375,37.788018555829 +405302,2009-09-03 01:47:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +405377,2009-09-02 21:30:00,ARSON,MISSION,1800 Block of 15TH ST,-122.425864046062,37.7662536102334 +405380,2009-09-02 21:20:00,DRUNKENNESS,MISSION,2300 Block of MISSION ST,-122.419058868103,37.7594227506297 +405525,2009-09-02 14:00:00,ARSON,CENTRAL,400 Block of JEFFERSON ST,-122.419941636264,37.8077487904473 +405597,2009-09-02 10:51:00,DRUNKENNESS,NORTHERN,100 Block of HICKORY ST,-122.421899863049,37.77564311639029 +405635,2009-09-02 09:00:00,KIDNAPPING,PARK,500 Block of DIVISADERO ST,-122.437591748763,37.7745506356497 +405646,2009-09-02 08:30:00,RUNAWAY,CENTRAL,400 Block of STOCKTON ST,-122.407114491118,37.7899019822508 +405686,2009-09-02 06:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +405770,2009-09-01 22:00:00,RUNAWAY,BAYVIEW,1200 Block of QUESADA AV,-122.383037431906,37.728636436753 +405788,2009-09-01 21:25:00,DRUNKENNESS,PARK,HAIGHT ST / ASHBURY ST,-122.446933310975,37.77000619883579 +405893,2009-09-01 15:58:00,DRUNKENNESS,CENTRAL,GEARY ST / TAYLOR ST,-122.411518820359,37.7869408998805 +406422,2009-08-31 15:23:00,ARSON,NORTHERN,JACKSON ST / FILLMORE ST,-122.434558974708,37.7924709856169 +406450,2009-08-31 14:32:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +406586,2009-08-31 08:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +406654,2009-08-31 00:41:00,DRUNKENNESS,RICHMOND,GEARY BL / 28TH AV,-122.487946479231,37.7799441469992 +406656,2009-08-31 00:30:00,KIDNAPPING,MISSION,1900 Block of FOLSOM ST,-122.415452778821,37.766106166254 +406702,2009-08-23 22:20:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.407474439624,37.779911669335 +406869,2009-08-23 13:55:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +407027,2009-08-23 02:30:00,DRUNKENNESS,CENTRAL,MONTGOMERY ST / BROADWAY ST,-122.403864541976,37.798222643742704 +407164,2009-08-22 20:15:00,DRUNKENNESS,CENTRAL,JEFFERSON ST / MASON ST,-122.414166515093,37.808419917271 +407225,2009-08-22 18:06:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +407236,2009-08-22 17:57:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +407294,2009-08-22 15:22:00,DRUNKENNESS,NORTHERN,1000 Block of POLK ST,-122.419858277339,37.786137125238 +407397,2009-08-22 10:00:00,ARSON,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +407399,2009-08-22 10:00:00,ARSON,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +407536,2009-08-21 23:50:00,DRUNKENNESS,CENTRAL,800 Block of SANSOME ST,-122.402068272323,37.7979849241157 +407574,2009-08-21 22:50:00,DRUNKENNESS,TENDERLOIN,0 Block of 5THSTNORTH ST,-122.408648588965,37.7849124714135 +407650,2009-08-21 20:02:00,DRUNKENNESS,CENTRAL,NORTHPOINT ST / VANNESS AV,-122.425300930134,37.8050769933248 +407681,2009-08-21 19:15:00,DRUNKENNESS,NORTHERN,FELL ST / LAGUNA ST,-122.426071405986,37.775524118166 +407829,2009-08-21 13:00:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +407851,2009-08-21 12:00:00,KIDNAPPING,INGLESIDE,500 Block of NAPLES ST,-122.431747193424,37.72003383665911 +407965,2009-08-21 01:12:00,DRUNKENNESS,CENTRAL,NORTHPOINT ST / POLK ST,-122.423658369809,37.80528509265661 +408032,2009-08-20 22:35:00,RUNAWAY,NORTHERN,1300 Block of STEINER ST,-122.434137606289,37.7816850865094 +408081,2009-08-20 20:20:00,DRUNKENNESS,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +408148,2009-08-20 17:20:00,ARSON,BAYVIEW,3500 Block of JENNINGS ST,-122.396779750105,37.7179655981082 +408265,2009-08-20 11:58:00,KIDNAPPING,MISSION,18TH ST / CHURCH ST,-122.428355366652,37.7612577113414 +408285,2009-08-20 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +408329,2009-08-20 07:12:00,ARSON,RICHMOND,ANZA ST / 6TH AV,-122.464147081977,37.7790877048755 +408353,2009-08-20 03:14:00,ARSON,RICHMOND,BALBOA ST / 21ST AV,-122.480174664156,37.7764956640759 +408540,2009-08-19 16:27:00,KIDNAPPING,INGLESIDE,200 Block of BLYTHDALE AV,-122.420529801066,37.7110023300609 +408562,2009-08-19 15:50:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +408633,2009-08-19 13:04:00,DRUNKENNESS,PARK,ASHBURY ST / HAIGHT ST,-122.446933310975,37.77000619883579 +408641,2009-08-19 12:45:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +408653,2009-08-19 12:10:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +408692,2009-08-19 09:32:00,KIDNAPPING,BAYVIEW,500 Block of 22ND ST,-122.386844163118,37.7580831855476 +408790,2009-08-19 00:45:00,DRUNKENNESS,RICHMOND,400 Block of CLEMENT ST,-122.463902072852,37.7830189318905 +408817,2009-08-18 23:15:00,DRUNKENNESS,BAYVIEW,MISSISSIPPI ST / 25TH ST,-122.393621427055,37.75248687189 +408931,2009-08-18 18:45:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +408938,2009-08-18 18:28:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +408969,2009-08-18 17:10:00,ARSON,RICHMOND,400 Block of 18TH AV,-122.477237626959,37.7794507243979 +409005,2009-08-18 16:15:00,ARSON,RICHMOND,GEARY BL / 39TH AV,-122.499730303616,37.7794014842533 +409107,2009-08-18 12:11:00,DRUNKENNESS,MISSION,100 Block of CAPP ST,-122.418687919804,37.7642753857061 +409133,2009-08-18 10:50:00,RUNAWAY,PARK,0 Block of KEZAR DR,-122.45512727517,37.7695200227183 +409166,2009-08-18 09:00:00,KIDNAPPING,NORTHERN,1600 Block of SUTTER ST,-122.42752815823,37.7868708654501 +409203,2009-08-18 06:14:00,ARSON,RICHMOND,GEARY BL / 34TH AV,-122.494379400874,37.7796487039129 +409213,2009-08-18 04:30:00,KIDNAPPING,TENDERLOIN,ELLIS ST / TAYLOR ST,-122.411141948101,37.7850736197499 +409238,2009-08-18 01:34:00,KIDNAPPING,SOUTHERN,GOLDEN GATE AV / TAYLOR ST,-122.41029351969,37.7822305870036 +409420,2009-08-17 15:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +409467,2009-08-17 13:35:00,DRUNKENNESS,INGLESIDE,0 Block of BLYTHDALE AV,-122.417678812123,37.7107672954351 +409507,2009-08-17 11:50:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +409573,2009-08-17 06:39:00,DRUNKENNESS,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413047972078,37.7819119628298 +409598,2009-08-17 02:29:00,DRUNKENNESS,SOUTHERN,BRYANT ST / 8TH ST,-122.406970988225,37.7725273607571 +409736,2009-08-09 17:15:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.414623849785,37.75241809285711 +409939,2009-08-09 01:45:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.40860321116,37.7995998106551 +409956,2009-08-09 00:40:00,DRUNKENNESS,INGLESIDE,4500 Block of MISSION ST,-122.434263310171,37.7254969149557 +410331,2009-08-08 01:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +410359,2009-08-08 00:25:00,DRUNKENNESS,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +410387,2009-08-07 23:19:00,DRUNKENNESS,SOUTHERN,7TH ST / STEVENSON ST,-122.411935615745,37.780006442029794 +410467,2009-08-07 20:01:00,KIDNAPPING,MISSION,1200 Block of YORK ST,-122.40818042923,37.7520351527768 +410510,2009-08-07 18:25:00,KIDNAPPING,BAYVIEW,NEWCOMB AV / 3RD ST,-122.390416955474,37.7355926105862 +410571,2009-08-07 16:00:00,RUNAWAY,INGLESIDE,200 Block of PARIS ST,-122.43259469429,37.72466703273589 +410616,2009-08-07 14:45:00,KIDNAPPING,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +410799,2009-08-07 01:17:00,DRUNKENNESS,BAYVIEW,1400 Block of SILVER AV,-122.407999207868,37.7316478339655 +410845,2009-08-06 22:45:00,KIDNAPPING,TENDERLOIN,0 Block of JONES ST,-122.412192555721,37.7816045741252 +411002,2009-08-06 17:09:00,DRUNKENNESS,BAYVIEW,5000 Block of 3RD ST,-122.391257625349,37.7327899367388 +411091,2009-08-06 12:36:00,KIDNAPPING,INGLESIDE,BRAZIL AV / LISBON ST,-122.432433050303,37.723549619705295 +411253,2009-08-06 00:01:00,KIDNAPPING,INGLESIDE,BOSWORTH ST / CHILTON AV,-122.43667304283,37.7340392584863 +411403,2009-08-05 17:30:00,DRUNKENNESS,RICHMOND,2500 Block of SUTTER ST,-122.442364696255,37.7848750530811 +411453,2009-08-05 15:20:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +411660,2009-08-05 02:36:00,DRUNKENNESS,SOUTHERN,MISSION ST / 1ST ST,-122.397576409113,37.7897619308836 +411687,2009-08-05 00:39:00,DRUNKENNESS,PARK,0 Block of BELVEDERE ST,-122.44948133338,37.7692041936691 +411709,2009-08-05 00:01:00,KIDNAPPING,CENTRAL,LARKIN ST / GEARY ST,-122.418090766692,37.7861007451645 +411828,2009-08-04 17:50:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +411895,2009-08-04 13:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +411919,2009-08-04 12:00:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +411920,2009-08-04 12:00:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +412056,2009-08-04 02:00:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413631253258,37.7848053746211 +412063,2009-08-04 01:28:00,DRUNKENNESS,NORTHERN,POLK ST / HEMLOCK ST,-122.420021471047,37.7872807076108 +412118,2009-08-03 20:44:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409536662692,37.78269112134721 +412291,2009-08-03 12:30:00,RUNAWAY,TARAVAL,500 Block of LAKEVIEW AV,-122.45458258634,37.7181829809 +412300,2009-08-03 12:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +412329,2009-08-03 10:38:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +412334,2009-08-03 10:30:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +412357,2009-08-03 09:15:00,KIDNAPPING,BAYVIEW,1400 Block of CARROLL AV,-122.39053347898898,37.7234376616614 +412389,2009-08-03 03:55:00,DRUNKENNESS,INGLESIDE,300 Block of LONDON ST,-122.434691485519,37.7235534584948 +412611,2009-07-26 14:30:00,KIDNAPPING,SOUTHERN,BRYANT ST / 4TH ST,-122.398063445395,37.77956584602929 +412698,2009-07-26 09:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +412730,2009-07-26 04:00:00,ARSON,NORTHERN,OLIVE ST / VANNESS AV,-122.421096796936,37.7842937802977 +412764,2009-07-26 01:25:00,DRUNKENNESS,CENTRAL,GEARY ST / MASON ST,-122.409876622532,37.787148807979 +412774,2009-07-26 00:46:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413287527194,37.7711962032376 +412788,2009-07-25 23:37:00,ARSON,NORTHERN,FERN ST / FRANKLIN ST,-122.423499800813,37.78780635913 +412912,2009-07-25 17:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +412919,2009-07-25 17:28:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +412924,2009-07-25 17:16:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / TAYLOR ST,-122.411141948101,37.7850736197499 +413070,2009-07-25 09:40:00,KIDNAPPING,BAYVIEW,0 Block of WHITFIELD CT,-122.3818379303,37.73110435323621 +413114,2009-07-25 02:00:00,ARSON,CENTRAL,200 Block of CALIFORNIA ST,-122.399370508543,37.7932284304797 +413141,2009-07-25 00:15:00,ARSON,NORTHERN,1200 Block of POST ST,-122.42239642406,37.7864543795731 +413270,2009-07-24 18:20:00,KIDNAPPING,TENDERLOIN,LEAVENWORTH ST / MCALLISTER ST,-122.413679376888,37.7809258336852 +413470,2009-07-24 06:14:00,ARSON,SOUTHERN,0 Block of OTIS ST,-122.419234828542,37.7727271128213 +413473,2009-07-24 06:00:00,DRUNKENNESS,BAYVIEW,0 Block of GARLINGTON CT,-122.38435769838,37.7324996437285 +413475,2009-07-24 05:45:00,ARSON,NORTHERN,ELLIS ST / VANNESS AV,-122.421011927709,37.7838226942199 +413487,2009-07-24 03:15:00,ARSON,INGLESIDE,200 Block of JOHNFSHELLEY DR,-122.423304635548,37.72266944630029 +413502,2009-07-24 02:08:00,KIDNAPPING,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +413535,2009-07-24 00:05:00,RUNAWAY,INGLESIDE,400 Block of LOSPALMOS DR,-122.451789219157,37.7344301822995 +413600,2009-07-23 20:40:00,KIDNAPPING,CENTRAL,600 Block of JONES ST,-122.413298481169,37.7870578243427 +413603,2009-07-23 20:30:00,ARSON,NORTHERN,ELLIS ST / VANNESS AV,-122.421011927709,37.7838226942199 +413820,2009-07-23 08:45:00,RUNAWAY,NORTHERN,1300 Block of STEINER ST,-122.434137606289,37.7816850865094 +413840,2009-07-23 06:43:00,ARSON,NORTHERN,1100 Block of GEARY BL,-122.422215377725,37.7855278107726 +413936,2009-07-22 20:13:00,KIDNAPPING,BAYVIEW,2100 Block of REVERE AV,-122.400478916108,37.73744986651701 +413973,2009-07-22 18:50:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +414083,2009-07-22 14:00:00,ARSON,RICHMOND,500 Block of 30TH AV,-122.489953332298,37.7788663496622 +414090,2009-07-22 13:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +414099,2009-07-22 13:09:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +414110,2009-07-22 12:55:00,KIDNAPPING,INGLESIDE,0 Block of PHELAN AV,-122.452428220398,37.725717254655706 +414136,2009-07-22 12:00:00,KIDNAPPING,SOUTHERN,MARKET ST / VANNESS AV,-122.419257894814,37.7751462916539 +414224,2009-07-22 05:15:00,ARSON,CENTRAL,0 Block of POST ST,-122.402346586116,37.789003338213895 +414321,2009-07-21 20:30:00,KIDNAPPING,INGLESIDE,100 Block of COLLEGE AV,-122.426495413982,37.735348450768 +414388,2009-07-21 17:59:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +414448,2009-07-21 15:25:00,DRUNKENNESS,NORTHERN,HAYES ST / STEINER ST,-122.432832799205,37.7756249672772 +414488,2009-07-21 13:17:00,KIDNAPPING,MISSION,3300 Block of 19TH ST,-122.418656834239,37.7602134417458 +414595,2009-07-21 02:53:00,ARSON,RICHMOND,700 Block of PRESIDIO AV,-122.446264333485,37.7849034219604 +414774,2009-07-20 15:40:00,DRUNKENNESS,SOUTHERN,MASON ST / TURK ST,-122.408953598279,37.783287873572 +415067,2009-07-12 19:25:00,DRUNKENNESS,PARK,1600 Block of TURK ST,-122.436253005441,37.7799162726094 +415114,2009-07-12 17:10:00,DRUNKENNESS,PARK,500 Block of COLE ST,-122.450242113384,37.7700540212914 +415119,2009-07-12 17:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +415271,2009-07-12 03:03:00,DRUNKENNESS,TARAVAL,100 Block of PANAMA ST,-122.468382093983,37.70954218619021 +415275,2009-07-12 03:00:00,KIDNAPPING,INGLESIDE,OCEAN AV / SAN JOSE AV,-122.444746663003,37.7229679041125 +415278,2009-07-12 03:00:00,KIDNAPPING,INGLESIDE,OCEAN AV / SAN JOSE AV,-122.444746663003,37.7229679041125 +415397,2009-07-11 21:20:00,KIDNAPPING,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +415425,2009-07-11 19:15:00,DRUNKENNESS,CENTRAL,600 Block of LOMBARD ST,-122.412216422677,37.8028745703379 +415526,2009-07-11 12:44:00,ARSON,INGLESIDE,1600 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +415564,2009-07-11 10:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +415584,2009-07-11 09:00:00,KIDNAPPING,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +415617,2009-07-11 04:40:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / MASON ST,-122.409499861107,37.7852842684318 +415663,2009-07-10 23:31:00,DRUNKENNESS,NORTHERN,2500 Block of LOMBARD ST,-122.44352039096,37.7989993135254 +415837,2009-07-10 13:00:00,RUNAWAY,RICHMOND,500 Block of 39TH AV,-122.499728266456,37.7784212798479 +415941,2009-07-10 02:33:00,DRUNKENNESS,CENTRAL,800 Block of SUTTER ST,-122.414390137578,37.7885452792081 +416240,2009-07-09 11:00:00,RUNAWAY,BAYVIEW,100 Block of SCOTIA AV,-122.39966796158998,37.732040658819 +416335,2009-07-09 02:50:00,KIDNAPPING,CENTRAL,900 Block of KEARNY ST,-122.405283980519,37.796551048078896 +416353,2009-07-09 00:35:00,DRUNKENNESS,SOUTHERN,MINNA ST / SHAW AL,-122.398023280014,37.7885570916768 +416684,2009-07-08 00:50:00,DRUNKENNESS,CENTRAL,800 Block of GEARY ST,-122.417273344939,37.7861493947594 +416890,2009-07-07 14:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +417216,2009-07-06 14:10:00,DRUNKENNESS,SOUTHERN,700 Block of MINNA ST,-122.413361136168,37.77636280535 +417336,2009-07-06 07:00:00,RUNAWAY,INGLESIDE,1700 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +417460,2009-06-28 20:10:00,DRUNKENNESS,TENDERLOIN,TAYLOR ST / ELLIS ST,-122.411141948101,37.7850736197499 +417495,2009-06-28 18:20:00,KIDNAPPING,CENTRAL,900 Block of HYDE ST,-122.41718099053,37.789577973909104 +417496,2009-06-28 18:15:00,KIDNAPPING,CENTRAL,PINE ST / TAYLOR ST,-122.41226909106,37.79067276498861 +417622,2009-06-28 12:38:00,KIDNAPPING,RICHMOND,2600 Block of MCALLISTER ST,-122.455132964123,37.775593875366 +417652,2009-06-28 11:30:00,KIDNAPPING,INGLESIDE,0 Block of ROEMER WY,-122.446441582039,37.7090675968335 +417669,2009-06-28 09:57:00,DRUNKENNESS,CENTRAL,100 Block of BATTERY ST,-122.399931233001,37.792733810390295 +417674,2009-06-28 09:30:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +417690,2009-06-28 08:00:00,KIDNAPPING,TARAVAL,3300 Block of TARAVAL ST,-122.501954411252,37.741940377132295 +417697,2009-06-28 06:49:00,ARSON,INGLESIDE,2000 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +417701,2009-06-28 05:30:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +417922,2009-06-27 16:10:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.407376463936,37.7799892619986 +418035,2009-06-27 09:04:00,DRUNKENNESS,MISSION,LILAC ST / 24TH ST,-122.417878226786,37.7522731644848 +418109,2009-06-27 00:05:00,DRUNKENNESS,MISSION,POTRERO AV / 24TH ST,-122.406338412685,37.7530042877223 +418146,2009-06-26 22:30:00,KIDNAPPING,TARAVAL,2700 Block of 36TH AV,-122.493403241013,37.7357663349494 +418183,2009-06-26 19:50:00,DRUNKENNESS,MISSION,24TH ST / FLORIDA ST,-122.410067981387,37.752737880572 +418279,2009-06-26 15:00:00,KIDNAPPING,SOUTHERN,900 Block of MISSION ST,-122.407932868203,37.7815063666429 +418482,2009-06-25 21:59:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +418512,2009-06-25 20:26:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +418548,2009-06-25 18:00:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +418659,2009-06-25 12:00:00,KIDNAPPING,INGLESIDE,0 Block of ADDISON ST,-122.432513268341,37.7377582824808 +418741,2009-06-25 03:45:00,ARSON,RICHMOND,300 Block of CORNWALL ST,-122.462964132903,37.7849356789103 +418853,2009-06-24 19:18:00,ARSON,INGLESIDE,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +418904,2009-06-24 16:52:00,DRUNKENNESS,TARAVAL,SLOAT BL / 44TH AV,-122.502022932496,37.7354192139036 +418948,2009-06-24 14:11:00,DRUNKENNESS,MISSION,19TH ST / VALENCIA ST,-122.421426142995,37.7601017970525 +418993,2009-06-24 11:30:00,KIDNAPPING,INGLESIDE,200 Block of RUSSIA AV,-122.435141514107,37.7206794283659 +419078,2009-06-24 02:20:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / JONES ST,-122.412784096502,37.78486569395261 +419589,2009-06-22 16:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +419803,2009-06-14 23:00:00,KIDNAPPING,RICHMOND,500 Block of 34TH AV,-122.494239651236,37.77867228906621 +419818,2009-06-14 21:54:00,KIDNAPPING,NORTHERN,600 Block of FULTON ST,-122.428249599273,37.7780677663985 +419868,2009-06-14 18:27:00,KIDNAPPING,TARAVAL,BROAD ST / CAPITOL AV,-122.45902362242902,37.7131719025215 +419927,2009-06-14 15:35:00,KIDNAPPING,BAYVIEW,1500 Block of QUESADA AV,-122.388642824121,37.731815774366005 +419928,2009-06-14 15:35:00,KIDNAPPING,BAYVIEW,1500 Block of QUESADA AV,-122.388642824121,37.731815774366005 +419937,2009-06-14 15:17:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +419976,2009-06-14 12:30:00,KIDNAPPING,INGLESIDE,4800 Block of MISSION ST,-122.437216421378,37.7213272618826 +420020,2009-06-14 09:00:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +420089,2009-06-14 00:30:00,DRUNKENNESS,MISSION,RONDEL PL / 16TH ST,-122.421240281394,37.76495589279121 +420091,2009-06-14 00:18:00,DRUNKENNESS,MISSION,ALBION ST / CAMP ST,-122.422777080471,37.7640380834483 +420138,2009-06-13 22:00:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +420175,2009-06-13 19:30:00,KIDNAPPING,CENTRAL,COLUMBUS AV / GREENWICH ST,-122.41254519939,37.8019305813748 +420183,2009-06-13 19:00:00,KIDNAPPING,INGLESIDE,200 Block of CONGDON ST,-122.425984920503,37.72976273364071 +420206,2009-06-13 18:07:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.407945033235,37.7996867434054 +420220,2009-06-13 17:45:00,KIDNAPPING,CENTRAL,600 Block of GREEN ST,-122.409835057079,37.79934018354211 +420273,2009-06-13 14:39:00,KIDNAPPING,BAYVIEW,800 Block of BARNEVELD AV,-122.407218369691,37.7328709181863 +420418,2009-06-13 01:57:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +420422,2009-06-13 01:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +420491,2009-06-12 21:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +420497,2009-06-12 21:21:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +420499,2009-06-12 21:12:00,DRUNKENNESS,NORTHERN,1800 Block of GEARY BL,-122.432035315509,37.7842501079896 +420788,2009-06-12 02:10:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421782174033,37.7631041285272 +420789,2009-06-12 02:06:00,ARSON,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375605171962,37.730721521570295 +420803,2009-06-12 00:15:00,KIDNAPPING,RICHMOND,3200 Block of BALBOA ST,-122.493588244515,37.7759407137274 +420832,2009-06-11 23:00:00,DRUNKENNESS,BAYVIEW,1400 Block of SHAFTER AV,-122.387897392339,37.72950441589521 +420851,2009-06-11 22:16:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +420951,2009-06-11 17:17:00,DRUNKENNESS,MISSION,1300 Block of VALENCIA ST,-122.420515424398,37.7512937049848 +421114,2009-06-11 08:10:00,KIDNAPPING,NORTHERN,200 Block of PAGE ST,-122.424829503585,37.7737213634177 +421159,2009-06-11 01:40:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411593095704,37.78305295107821 +421187,2009-06-09 23:19:00,ARSON,BAYVIEW,1100 Block of FITZGERALD AV,-122.39036028161,37.7205064590363 +421188,2009-06-09 23:15:00,DRUNKENNESS,SOUTHERN,MARKET ST / FREMONT ST,-122.398266681678,37.791714850209104 +421196,2009-06-09 22:48:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +421295,2009-06-09 17:58:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +421301,2009-06-09 17:34:00,ARSON,SOUTHERN,500 Block of HARRISON ST,-122.394581130801,37.78469122927221 +421315,2009-06-09 16:41:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +421423,2009-06-09 12:12:00,DRUNKENNESS,PARK,MASONIC AV / HAIGHT ST,-122.4453467866,37.7702081959172 +421652,2009-06-08 19:05:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +421862,2009-06-08 07:30:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +421890,2009-06-08 02:00:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406460643507,37.7979466732983 +421942,2009-05-31 23:09:00,DRUNKENNESS,NORTHERN,VANNESS AV / UNION ST,-122.423985900144,37.7985525790132 +421953,2009-05-31 22:36:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +421985,2009-05-31 20:04:00,DRUNKENNESS,NORTHERN,900 Block of STEINER ST,-122.433246518836,37.777974071262896 +422181,2009-05-31 02:30:00,ARSON,INGLESIDE,0 Block of VANBUREN ST,-122.43533765398,37.736250314821 +422328,2009-05-30 19:36:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +422395,2009-05-30 16:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +422462,2009-05-30 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +422548,2009-05-30 03:08:00,ARSON,BAYVIEW,100 Block of HARBOR RD,-122.378268018481,37.7323807302226 +422609,2009-05-29 23:45:00,DRUNKENNESS,SOUTHERN,100 Block of HAWTHORNE ST,-122.397071005597,37.7840030154412 +422632,2009-05-29 22:16:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +422636,2009-05-29 22:05:00,DRUNKENNESS,PARK,OAK ST / CENTRAL AV,-122.444027612047,37.7722956522753 +422713,2009-05-29 18:00:00,ARSON,BAYVIEW,200 Block of HARBOR RD,-122.378392257534,37.7323312464378 +422722,2009-05-29 17:45:00,DRUNKENNESS,INGLESIDE,100 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +422743,2009-05-29 17:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +422796,2009-05-29 15:00:00,RUNAWAY,RICHMOND,300 Block of 29TH AV,-122.489291197507,37.7827358351213 +422800,2009-05-29 15:00:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +422881,2009-05-29 10:21:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +422970,2009-05-29 00:15:00,KIDNAPPING,MISSION,20TH ST / BRYANT ST,-122.409770376757,37.7591952167406 +423188,2009-05-28 12:55:00,KIDNAPPING,BAYVIEW,2000 Block of JERROLD AV,-122.397452866299,37.7435973530615 +423392,2009-05-27 18:12:00,DRUNKENNESS,MISSION,24TH ST / POTRERO AV,-122.406338412685,37.7530042877223 +423577,2009-05-27 09:59:00,DRUNKENNESS,TENDERLOIN,100 Block of HYDE ST,-122.415669661443,37.7821198488931 +423623,2009-05-27 07:00:00,RUNAWAY,INGLESIDE,1700 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +423648,2009-05-27 01:44:00,DRUNKENNESS,TENDERLOIN,MARKET ST / 8TH ST,-122.414743835382,37.77871926278901 +423653,2009-05-27 01:25:00,KIDNAPPING,MISSION,17TH ST / ALABAMA ST,-122.412296739398,37.7641921009332 +423739,2009-05-26 19:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +424007,2009-05-25 22:59:00,DRUNKENNESS,PARK,COLE ST / HAIGHT ST,-122.450709919144,37.7695262270693 +424028,2009-05-25 21:33:00,DRUNKENNESS,NORTHERN,1100 Block of VANNESS AV,-122.421648984394,37.7861425696729 +424137,2009-05-25 15:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +424228,2009-05-25 11:30:00,ARSON,INGLESIDE,SUNNYDALE AV / HAHN ST,-122.416000227907,37.7119155437754 +424379,2009-05-17 23:20:00,DRUNKENNESS,TARAVAL,300 Block of GARCES DR,-122.482461230031,37.716164311409 +424465,2009-05-17 18:27:00,DRUNKENNESS,TARAVAL,LINCOLN WY / 42ND AV,-122.501899746848,37.764357978563 +424515,2009-05-17 16:10:00,DRUNKENNESS,SOUTHERN,MISSION ST / 4TH ST,-122.404270179486,37.78447885387449 +424601,2009-05-17 12:01:00,DRUNKENNESS,PARK,FELL ST / MASONIC AV,-122.445904271169,37.7729953727174 +424630,2009-05-17 11:30:00,KIDNAPPING,BAYVIEW,200 Block of HARBOR RD,-122.378268018481,37.7323807302226 +424775,2009-05-17 01:49:00,ARSON,PARK,500 Block of CLAYTON ST,-122.448739865726,37.7702466927234 +424902,2009-05-16 20:10:00,DRUNKENNESS,BAYVIEW,800 Block of CHINABASIN ST,-122.386775025935,37.765377517215 +424920,2009-05-16 19:20:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +424999,2009-05-16 15:40:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +425076,2009-05-16 11:00:00,KIDNAPPING,NORTHERN,900 Block of GROVE ST,-122.432233204915,37.7767071238944 +425083,2009-05-16 10:25:00,KIDNAPPING,BAYVIEW,PALOU AV / 3RD ST,-122.390971734551,37.73401521807229 +425152,2009-05-16 02:05:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.409795194505,37.7800356268394 +425285,2009-05-15 19:30:00,ARSON,SOUTHERN,0 Block of WASHBURN ST,-122.414406294791,37.7752362231466 +425294,2009-05-15 19:05:00,DRUNKENNESS,CENTRAL,STOCKTON ST / PACIFIC AV,-122.408433097286,37.7967039278443 +425370,2009-05-15 16:12:00,DRUNKENNESS,TARAVAL,25TH AV / IRVING ST,-122.483552403515,37.76327820531221 +425391,2009-05-15 15:45:00,KIDNAPPING,TARAVAL,2300 Block of 18TH AV,-122.474756628594,37.7440093806773 +425410,2009-05-15 15:00:00,KIDNAPPING,NORTHERN,EDDY ST / LAGUNA ST,-122.427400263419,37.7820565475813 +425559,2009-05-15 07:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +425589,2009-05-15 02:18:00,DRUNKENNESS,TARAVAL,1400 Block of PORTOLA DR,-122.467321910416,37.7383653416033 +425647,2009-05-14 23:48:00,DRUNKENNESS,MISSION,24TH ST / POTRERO AV,-122.406338412685,37.7530042877223 +425674,2009-05-14 23:00:00,RUNAWAY,PARK,1600 Block of EDDY ST,-122.434821446921,37.7811662982153 +425716,2009-05-14 20:24:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +425749,2009-05-14 18:00:00,RUNAWAY,BAYVIEW,1400 Block of HUDSON AV,-122.385215479529,37.7382444962471 +425759,2009-05-14 17:45:00,DRUNKENNESS,INGLESIDE,0 Block of PHELAN AV,-122.452428220398,37.725717254655706 +425775,2009-05-14 17:12:00,DRUNKENNESS,CENTRAL,1500 Block of STOCKTON ST,-122.409035282337,37.7999845229184 +425836,2009-05-14 14:59:00,DRUNKENNESS,RICHMOND,GEARY BL / 17TH AV,-122.47616910958,37.780474533143 +425885,2009-05-14 12:45:00,DRUNKENNESS,NORTHERN,500 Block of HAIGHT ST,-122.431268066985,37.771946506645705 +425984,2009-05-14 07:00:00,RUNAWAY,PARK,2000 Block of FELL ST,-122.451637852289,37.772313893437705 +426121,2009-05-13 18:21:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +426191,2009-05-13 16:00:00,RUNAWAY,MISSION,0 Block of POTRERO AV,-122.407912641998,37.7688081103775 +426199,2009-05-13 15:55:00,DRUNKENNESS,INGLESIDE,CORTLAND AV / ELLSWORTH ST,-122.414561303897,37.7388808902985 +426412,2009-05-13 00:24:00,ARSON,INGLESIDE,4500 Block of MISSION ST,-122.434671337817,37.7249572971123 +426513,2009-05-12 19:00:00,ARSON,PARK,800 Block of ASHBURY ST,-122.446234261409,37.7662094878819 +426548,2009-05-12 17:48:00,DRUNKENNESS,MISSION,23RD ST / SAN JOSE AV,-122.421519057973,37.7536614882472 +426807,2009-05-12 00:01:00,KIDNAPPING,TENDERLOIN,300 Block of EDDY ST,-122.413790972781,37.7838365565348 +426974,2009-05-11 15:03:00,ARSON,INGLESIDE,0 Block of RESTANI WY,-122.443306259374,37.7177936388636 +427127,2009-05-11 08:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +427152,2009-05-11 05:00:00,ARSON,BAYVIEW,1300 Block of QUINT ST,-122.395612677231,37.7380557826258 +427159,2009-05-11 04:29:00,ARSON,CENTRAL,700 Block of COMMERCIAL ST,-122.405469196315,37.7938704980849 +427182,2009-05-11 01:00:00,ARSON,BAYVIEW,0 Block of LATONA ST,-122.392627218053,37.7316182572491 +427284,2009-05-03 17:55:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +427293,2009-05-03 17:13:00,DRUNKENNESS,PARK,1000 Block of FELL ST,-122.435122669886,37.7743200394152 +427340,2009-05-03 14:15:00,KIDNAPPING,NORTHERN,1200 Block of EDDY ST,-122.428245242312,37.7820044139073 +427346,2009-05-03 14:02:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453512911126,37.7686969786551 +427382,2009-05-03 11:00:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +427418,2009-05-03 08:45:00,DRUNKENNESS,TENDERLOIN,EDDY ST / TAYLOR ST,-122.410955248906,37.7841399509594 +427420,2009-05-03 08:30:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +427447,2009-05-03 03:00:00,DRUNKENNESS,SOUTHERN,200 Block of 2ND ST,-122.396920775993,37.7857918163181 +427454,2009-05-03 02:32:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 11TH ST,-122.41402726268998,37.7718636177154 +427499,2009-05-03 00:01:00,DRUNKENNESS,NORTHERN,BROADWAY ST / POLK ST,-122.421772135304,37.79594615319579 +427563,2009-05-02 21:00:00,RUNAWAY,INGLESIDE,600 Block of VIENNA ST,-122.432239978457,37.7181513320048 +427638,2009-05-02 16:47:00,DRUNKENNESS,MISSION,0 Block of ADAIR ST,-122.418093215914,37.7657739546719 +427791,2009-05-02 04:44:00,DRUNKENNESS,TENDERLOIN,JONES ST / OFARRELL ST,-122.412970537591,37.78578837668879 +427809,2009-05-02 02:51:00,DRUNKENNESS,TENDERLOIN,100 Block of MASON ST,-122.40947349732,37.784816365102 +427839,2009-05-02 01:01:00,DRUNKENNESS,MISSION,24TH ST / SHOTWELL ST,-122.415173665801,37.7524407589917 +427868,2009-05-01 23:20:00,KIDNAPPING,INGLESIDE,700 Block of PORTOLA DR,-122.453725754435,37.7442209162424 +427876,2009-05-01 23:00:00,RUNAWAY,INGLESIDE,100 Block of BLYTHDALE AV,-122.420529801066,37.7110023300609 +427881,2009-05-01 22:51:00,DRUNKENNESS,TARAVAL,19TH AV / TARAVAL ST,-122.475644251197,37.7430505534925 +427933,2009-05-01 20:00:00,DRUNKENNESS,SOUTHERN,2ND ST / KING ST,-122.389595283252,37.7798611974198 +428204,2009-05-01 02:55:00,DRUNKENNESS,NORTHERN,FILLMORE ST / HERMANN ST,-122.430076617284,37.770242204169 +428301,2009-04-30 23:26:00,DRUNKENNESS,NORTHERN,1800 Block of GEARY BL,-122.432035315509,37.7842501079896 +428328,2009-04-30 22:00:00,ARSON,SOUTHERN,100 Block of MISSION ST,-122.394459568163,37.792144044552 +428375,2009-04-30 20:00:00,KIDNAPPING,RICHMOND,300 Block of 12TH AV,-122.470849239209,37.7816664570033 +428400,2009-04-30 19:10:00,RUNAWAY,INGLESIDE,700 Block of DELTA ST,-122.410026343157,37.7111173638135 +428437,2009-04-30 17:30:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +428443,2009-04-30 17:09:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449942040795,37.7696796386185 +428519,2009-04-30 14:22:00,DRUNKENNESS,MISSION,LUCKY ST / 25TH ST,-122.413367079047,37.750937320748704 +428531,2009-04-30 13:55:00,KIDNAPPING,NORTHERN,700 Block of WEBSTER ST,-122.429918677577,37.7774431475107 +428654,2009-04-30 07:00:00,ARSON,PARK,100 Block of CENTRAL AV,-122.443676077401,37.770909822848 +428694,2009-04-30 01:25:00,DRUNKENNESS,NORTHERN,2300 Block of VANNESS AV,-122.42387180052602,37.797139554437706 +428742,2009-04-29 21:45:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +428764,2009-04-29 20:45:00,ARSON,SOUTHERN,0 Block of FREMONT ST,-122.397412916392,37.7911152838445 +428783,2009-04-29 19:30:00,KIDNAPPING,BAYVIEW,2000 Block of 20TH ST,-122.401610204052,37.75975881201821 +428815,2009-04-29 18:07:00,ARSON,NORTHERN,0 Block of MYRTLE ST,-122.418828569913,37.7855916113226 +428962,2009-04-29 12:00:00,RUNAWAY,TARAVAL,1800 Block of 36TH AV,-122.494555653048,37.7524879615071 +429081,2009-04-29 02:00:00,KIDNAPPING,NORTHERN,SUTTER ST / POLK ST,-122.420120319204,37.78775706024111 +429098,2009-04-29 00:22:00,DRUNKENNESS,PARK,WALLER ST / CLAYTON ST,-122.448391353673,37.7688641049016 +429183,2009-04-28 21:18:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +429213,2009-04-28 19:25:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +429505,2009-04-28 03:00:00,KIDNAPPING,INGLESIDE,500 Block of SAWYER ST,-122.415461474153,37.7106377857099 +429556,2009-04-27 23:10:00,DRUNKENNESS,MISSION,900 Block of CAPP ST,-122.417346825121,37.7514859649152 +429598,2009-04-27 19:27:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +429624,2009-04-27 17:54:00,DRUNKENNESS,PARK,1200 Block of 6TH AV,-122.463129947153,37.76557080231621 +429904,2009-04-19 20:47:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +430114,2009-04-19 09:30:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +430199,2009-04-19 01:02:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +430303,2009-04-18 21:00:00,KIDNAPPING,RICHMOND,4700 Block of GEARY BL,-122.470190415901,37.7808757916602 +430312,2009-04-18 20:47:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +430384,2009-04-18 17:17:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +430453,2009-04-18 13:39:00,KIDNAPPING,INGLESIDE,3300 Block of MISSION ST,-122.421644478447,37.7429970144076 +430585,2009-04-18 03:00:00,KIDNAPPING,SOUTHERN,100 Block of 7TH ST,-122.410111373792,37.7786320490341 +430608,2009-04-18 01:47:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739951,37.7978641744394 +430614,2009-04-18 01:38:00,DRUNKENNESS,MISSION,500 Block of FLORIDA ST,-122.411078396423,37.762328592655294 +430724,2009-04-17 20:43:00,DRUNKENNESS,BAYVIEW,1800 Block of PALOU AV,-122.396072849654,37.7369730787307 +430796,2009-04-17 17:10:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +430852,2009-04-17 14:35:00,DRUNKENNESS,TENDERLOIN,TAYLOR ST / TURK ST,-122.410768766343,37.7832145190013 +430868,2009-04-17 13:37:00,KIDNAPPING,SOUTHERN,4TH ST / JESSIE ST,-122.404796869057,37.7849071033956 +430879,2009-04-17 13:03:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +430954,2009-04-17 09:55:00,KIDNAPPING,INGLESIDE,100 Block of LELAND AV,-122.406905871934,37.7124867383516 +430970,2009-04-17 08:59:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / TAYLOR ST,-122.411141948101,37.7850736197499 +430997,2009-04-17 04:30:00,DRUNKENNESS,CENTRAL,1400 Block of CALIFORNIA ST,-122.418239272625,37.7909332313364 +431081,2009-04-16 21:32:00,DRUNKENNESS,INGLESIDE,100 Block of PRECITA AV,-122.417164791978,37.747062207845104 +431382,2009-04-16 07:40:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +431405,2009-04-16 02:53:00,ARSON,PARK,100 Block of DOWNEY ST,-122.446916939832,37.76538453362861 +431406,2009-04-16 02:53:00,ARSON,PARK,800 Block of CLAYTON ST,-122.447986787891,37.7665307249018 +431682,2009-04-15 12:00:00,KIDNAPPING,TENDERLOIN,OFARRELL ST / LARKIN ST,-122.417903977564,37.785167087551706 +431756,2009-04-15 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +431873,2009-04-14 20:00:00,KIDNAPPING,TENDERLOIN,400 Block of OFARRELL ST,-122.412563218508,37.785785061938206 +432164,2009-04-14 07:30:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +432166,2009-04-14 07:20:00,RUNAWAY,PARK,1700 Block of EDDY ST,-122.43644305449,37.7808493247624 +432180,2009-04-14 06:00:00,KIDNAPPING,PARK,0 Block of BRODERICK ST,-122.438683070746,37.7705913965555 +432208,2009-04-14 02:57:00,DRUNKENNESS,INGLESIDE,MISSION ST / FAIR AV,-122.419888691537,37.745595608932206 +432217,2009-04-14 01:30:00,KIDNAPPING,INGLESIDE,0 Block of CAYUGA AV,-122.430149660889,37.7312954707064 +432249,2009-04-13 23:01:00,DRUNKENNESS,RICHMOND,700 Block of 39TH AV,-122.499454618366,37.77466330068889 +432265,2009-04-13 22:00:00,DRUNKENNESS,MISSION,24TH ST / CAPP ST,-122.417360139477,37.7523063170181 +432292,2009-04-13 21:00:00,RUNAWAY,TARAVAL,200 Block of GRANADA AV,-122.457235250338,37.7229939308537 +432410,2009-04-13 14:46:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +432520,2009-04-13 08:20:00,RUNAWAY,TARAVAL,1800 Block of 36TH AV,-122.494555653048,37.7524879615071 +432543,2009-04-13 07:00:00,RUNAWAY,RICHMOND,1300 Block of BAKER ST,-122.44296138394,37.7833927127465 +432561,2009-04-13 03:05:00,DRUNKENNESS,NORTHERN,LARKIN ST / POST ST,-122.41827417166,37.7870372043685 +432577,2009-04-13 00:57:00,ARSON,BAYVIEW,500 Block of SELBY ST,-122.395970616699,37.7439242542019 +432661,2009-04-05 20:20:00,DRUNKENNESS,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +432672,2009-04-05 19:54:00,DRUNKENNESS,PARK,PIERCE ST / PAGE ST,-122.433924307791,37.7726211586507 +432735,2009-04-05 16:47:00,DRUNKENNESS,MISSION,MISSION ST / 14TH ST,-122.419983447697,37.768272676361896 +432807,2009-04-05 13:04:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +433183,2009-04-04 14:47:00,DRUNKENNESS,PARK,COLE ST / HAIGHT ST,-122.450709919144,37.7695262270693 +433251,2009-04-04 12:00:00,DRUNKENNESS,PARK,WALLER ST / BELVEDERE ST,-122.44945360075,37.7687284236871 +433314,2009-04-04 09:00:00,KIDNAPPING,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +433361,2009-04-04 03:05:00,ARSON,BAYVIEW,1100 Block of NEWHALL ST,-122.390866172562,37.7372499015533 +433375,2009-04-04 02:26:00,DRUNKENNESS,NORTHERN,VANNESS AV / GEARY BL,-122.421395819115,37.7856843389472 +433416,2009-04-04 00:22:00,DRUNKENNESS,MISSION,16TH ST / VALENCIA ST,-122.421886357981,37.7649178909424 +433479,2009-04-03 21:49:00,DRUNKENNESS,TENDERLOIN,400 Block of OFARRELL ST,-122.412569415086,37.7858955061569 +433518,2009-04-03 19:50:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +433532,2009-04-03 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +433549,2009-04-03 18:14:00,DRUNKENNESS,PARK,100 Block of JOHNFKENNEDY DR,-122.457507583541,37.7711332354432 +433595,2009-04-03 16:49:00,DRUNKENNESS,MISSION,1200 Block of TREAT AV,-122.41283040295,37.7501495078008 +433676,2009-04-03 13:11:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +433732,2009-04-03 10:49:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +433815,2009-04-03 05:17:00,KIDNAPPING,BAYVIEW,CUSTER AV / RANKIN ST,-122.391057691829,37.7463639698042 +433818,2009-04-03 04:01:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +433853,2009-04-03 00:17:00,KIDNAPPING,BAYVIEW,0 Block of POMONA ST,-122.393379855662,37.7317081525738 +433868,2009-04-02 23:30:00,KIDNAPPING,SOUTHERN,500 Block of THE EMBARCADEROSOUTH ST,-122.398586934103,37.7999893077504 +433933,2009-04-02 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +434013,2009-04-02 17:10:00,DRUNKENNESS,TENDERLOIN,FULTON ST / HYDE ST,-122.415127837608,37.7797870676495 +434154,2009-04-02 10:00:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +434189,2009-04-02 08:30:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +434301,2009-04-01 20:31:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +434371,2009-04-01 17:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +434440,2009-04-01 15:00:00,KIDNAPPING,NORTHERN,400 Block of MCALLISTER ST,-122.419448185224,37.7802091894281 +434449,2009-04-01 14:54:00,ARSON,SOUTHERN,NEWMONTGOMERY ST / MISSION ST,-122.40050441968,37.78745132896621 +434511,2009-04-01 12:27:00,ARSON,NORTHERN,1100 Block of FRANCISCO ST,-122.42412350881,37.80336133563621 +434615,2009-04-01 08:57:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.408913229808,37.781211650766295 +435006,2009-03-31 12:00:00,KIDNAPPING,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +435119,2009-03-31 02:05:00,ARSON,INGLESIDE,400 Block of LAGRANDE AV,-122.426833588598,37.716879069607 +435218,2009-03-30 20:51:00,KIDNAPPING,INGLESIDE,5400 Block of MISSION ST,-122.444314025188,37.7131083433264 +435277,2009-03-30 18:00:00,DRUNKENNESS,MISSION,0 Block of LILAC ST,-122.41773117521002,37.7514612116914 +435556,2009-03-30 02:20:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +435557,2009-03-30 02:15:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +435571,2009-03-30 00:36:00,ARSON,SOUTHERN,100 Block of 6TH ST,-122.407975093043,37.7803099082814 +435572,2009-03-30 00:33:00,ARSON,BAYVIEW,700 Block of JAMESTOWN AV,-122.389039223072,37.7151390330171 +435594,2009-03-30 00:01:00,KIDNAPPING,CENTRAL,800 Block of LEAVENWORTH ST,-122.415348738908,37.788854205046704 +435704,2009-03-22 17:57:00,ARSON,CENTRAL,100 Block of POST ST,-122.404013392454,37.788904767871706 +435729,2009-03-22 16:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +435833,2009-03-22 11:05:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.402849079555,37.7758599616408 +435884,2009-03-22 06:48:00,DRUNKENNESS,TENDERLOIN,0 Block of GROVE ST,-122.415642487855,37.7788323158792 +435936,2009-03-22 00:40:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.414224026965,37.7715982798716 +435984,2009-03-21 23:23:00,DRUNKENNESS,PARK,HAIGHT ST / BELVEDERE ST,-122.449647662955,37.76966191958461 +436054,2009-03-21 19:50:00,DRUNKENNESS,CENTRAL,400 Block of COLUMBUS AV,-122.408407397189,37.79914232652379 +436074,2009-03-21 18:24:00,KIDNAPPING,BAYVIEW,0 Block of WESTVIEW AV,-122.418240102107,37.7311402768386 +436122,2009-03-21 16:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +436367,2009-03-20 23:14:00,DRUNKENNESS,INGLESIDE,MISSION ST / 30TH ST,-122.421970919029,37.74237522452549 +436406,2009-03-20 22:00:00,KIDNAPPING,MISSION,20TH ST / DOUGLASS ST,-122.439033128791,37.7574153708663 +436453,2009-03-20 20:15:00,KIDNAPPING,INGLESIDE,200 Block of FRANCONIA ST,-122.407418253854,37.74516448653711 +436481,2009-03-20 19:00:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +436492,2009-03-20 18:51:00,KIDNAPPING,MISSION,16TH ST / HARRISON ST,-122.413107622693,37.7654480180266 +436520,2009-03-20 18:00:00,KIDNAPPING,SOUTHERN,700 Block of MARKET ST,-122.40409466245,37.787256092799296 +436607,2009-03-20 14:05:00,KIDNAPPING,TARAVAL,42ND AV / VICENTE ST,-122.500054591021,37.7382380848525 +436766,2009-03-20 07:05:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +436774,2009-03-20 05:00:00,ARSON,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +436800,2009-03-20 01:41:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +437073,2009-03-19 12:35:00,KIDNAPPING,BAYVIEW,2700 Block of SAN BRUNO AV,-122.403408669191,37.72700531963 +437199,2009-03-19 02:49:00,ARSON,PARK,1000 Block of ASHBURY ST,-122.446726440841,37.7632137032178 +437202,2009-03-19 02:49:00,ARSON,PARK,1100 Block of CLAYTON ST,-122.446837820235,37.7622550270122 +437267,2009-03-18 22:00:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +437351,2009-03-18 18:00:00,KIDNAPPING,SOUTHERN,600 Block of MINNA ST,-122.412194506024,37.7772839511772 +437355,2009-03-18 17:50:00,DRUNKENNESS,SOUTHERN,11TH ST / HARRISON ST,-122.41248326348,37.7706305910776 +437394,2009-03-18 16:48:00,DRUNKENNESS,INGLESIDE,MISSION ST / RICHLAND AV,-122.42446746767,37.7360604757326 +437627,2009-03-18 04:38:00,ARSON,BAYVIEW,0 Block of WESTPOINT RD,-122.380382266471,37.7353538209895 +437665,2009-03-18 01:03:00,DRUNKENNESS,RICHMOND,400 Block of CLEMENT ST,-122.463894088904,37.7829092614438 +437738,2009-03-17 21:33:00,ARSON,BAYVIEW,INGALLS ST / BANCROFT AV,-122.389054213243,37.723484073117 +437816,2009-03-17 17:05:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +437864,2009-03-17 15:45:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +437896,2009-03-17 14:30:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.407945033235,37.7996867434054 +437898,2009-03-17 14:10:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +438035,2009-03-17 08:00:00,RUNAWAY,NORTHERN,1100 Block of TURK ST,-122.428818526724,37.7808642652455 +438080,2009-03-17 02:18:00,DRUNKENNESS,SOUTHERN,600 Block of HOWARD ST,-122.39998852115,37.78548734122921 +438099,2009-03-17 00:15:00,KIDNAPPING,INGLESIDE,1700 Block of VISITACION AV,-122.414204367984,37.7162698383407 +438131,2009-03-16 22:45:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +438244,2009-03-16 17:58:00,DRUNKENNESS,SOUTHERN,700 Block of TEHAMA ST,-122.411912027329,37.7752065614967 +438301,2009-03-16 15:11:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +438352,2009-03-16 13:00:00,KIDNAPPING,TARAVAL,300 Block of CLAREMONT BL,-122.465271016214,37.740178074602 +438425,2009-03-16 09:30:00,KIDNAPPING,CENTRAL,800 Block of KEARNY ST,-122.405120151913,37.79576827245071 +438665,2009-03-08 15:40:00,DRUNKENNESS,CENTRAL,1400 Block of GRANT AV,-122.407560004563,37.8001710961561 +438822,2009-03-08 02:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +438846,2009-03-08 00:30:00,KIDNAPPING,SOUTHERN,600 Block of HARRISON ST,-122.396775154339,37.782958241662506 +438939,2009-03-07 19:23:00,DRUNKENNESS,MISSION,1200 Block of TREAT AV,-122.41283040295,37.7501495078008 +438980,2009-03-07 18:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +439133,2009-03-07 11:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +439213,2009-03-07 03:57:00,DRUNKENNESS,NORTHERN,2800 Block of BAKER ST,-122.445670312049,37.7974660100275 +439215,2009-03-07 03:17:00,DRUNKENNESS,SOUTHERN,400 Block of 6TH ST,-122.403671442177,37.77703244359461 +439239,2009-03-07 01:40:00,DRUNKENNESS,PARK,CARL ST / COLE ST,-122.449958075249,37.7658000842584 +439267,2009-03-07 00:01:00,DRUNKENNESS,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +439270,2009-03-07 00:01:00,KIDNAPPING,MISSION,16TH ST / HARRISON ST,-122.413107622693,37.7654480180266 +439343,2009-03-06 20:12:00,DRUNKENNESS,TENDERLOIN,400 Block of OFARRELL ST,-122.412569415086,37.7858955061569 +439433,2009-03-06 17:14:00,ARSON,NORTHERN,GOLDEN GATE AV / BUCHANAN ST,-122.428644398557,37.7799870005236 +439453,2009-03-06 16:32:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +439633,2009-03-06 08:20:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +439634,2009-03-06 08:20:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +439738,2009-03-05 23:00:00,KIDNAPPING,CENTRAL,400 Block of UNION ST,-122.406615370913,37.8008158718244 +440091,2009-03-05 06:04:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +440094,2009-03-05 06:00:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +440139,2009-03-04 23:00:00,KIDNAPPING,MISSION,400 Block of VALENCIA ST,-122.42207304894,37.766125945480105 +440157,2009-03-04 22:30:00,KIDNAPPING,NORTHERN,700 Block of POLK ST,-122.419159190984,37.7833430636234 +440176,2009-03-04 21:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +440178,2009-03-04 21:48:00,DRUNKENNESS,MISSION,17TH ST / MISSION ST,-122.419515708406,37.7634292328496 +440216,2009-03-04 20:00:00,KIDNAPPING,CENTRAL,600 Block of SUTTER ST,-122.411090752992,37.788964175606296 +440222,2009-03-04 19:40:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +440223,2009-03-04 19:40:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +440513,2009-03-04 05:39:00,ARSON,PARK,100 Block of DOWNEY ST,-122.446916939832,37.76538453362861 +440542,2009-03-04 01:28:00,DRUNKENNESS,TARAVAL,2500 Block of NORIEGA ST,-122.490952032506,37.7536574097038 +440577,2009-03-03 23:00:00,RUNAWAY,MISSION,1400 Block of 15TH ST,-122.417102243898,37.7668931278499 +440655,2009-03-03 19:09:00,DRUNKENNESS,PARK,900 Block of CORBETT AV,-122.443543211967,37.7520344922922 +440672,2009-03-03 18:37:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +440712,2009-03-03 17:06:00,KIDNAPPING,BAYVIEW,0 Block of CAMERON WY,-122.385879189053,37.7202869779119 +440748,2009-03-03 15:20:00,DRUNKENNESS,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +440783,2009-03-03 13:32:00,KIDNAPPING,TENDERLOIN,JONES ST / TURK ST,-122.412414263581,37.7830037964534 +440812,2009-03-03 12:30:00,RUNAWAY,BAYVIEW,0 Block of REUEL CT,-122.382919646324,37.7364122533313 +441053,2009-03-02 20:04:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +441097,2009-03-02 17:42:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +441128,2009-03-02 16:05:00,KIDNAPPING,BAYVIEW,6200 Block of 3RD ST,-122.395989596412,37.721313139839 +441269,2009-03-02 08:15:00,RUNAWAY,BAYVIEW,1200 Block of QUESADA AV,-122.383037431906,37.728636436753 +441381,2009-02-22 21:25:00,RUNAWAY,INGLESIDE,500 Block of MUNICH ST,-122.429639110872,37.7170365230371 +441428,2009-02-22 19:15:00,ARSON,SOUTHERN,0 Block of SOUTHPARK AV,-122.392998702818,37.7822551330244 +441487,2009-02-22 16:00:00,RUNAWAY,SOUTHERN,0 Block of DORE ST,-122.412933062384,37.7739274524819 +441493,2009-02-22 15:45:00,RUNAWAY,BAYVIEW,1000 Block of GRIFFITH ST,-122.378920771859,37.7286119710993 +441531,2009-02-22 13:37:00,DRUNKENNESS,INGLESIDE,FOLSOM ST / CORTLAND AV,-122.413311792854,37.7389835945917 +441625,2009-02-22 01:40:00,DRUNKENNESS,NORTHERN,LOMBARD ST / FILLMORE ST,-122.436049203586,37.79984122288229 +441634,2009-02-22 01:00:00,RUNAWAY,INGLESIDE,1600 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +441638,2009-02-22 00:45:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +441687,2009-02-21 22:47:00,DRUNKENNESS,TENDERLOIN,400 Block of OFARRELL ST,-122.412569415086,37.7858955061569 +441718,2009-02-21 21:45:00,DRUNKENNESS,CENTRAL,800 Block of GEARY ST,-122.417295322526,37.7862578545865 +441727,2009-02-21 21:25:00,KIDNAPPING,PARK,PIERCE ST / WALLER ST,-122.433550404022,37.7707538886682 +441858,2009-02-21 14:59:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552636,37.7693505381781 +441921,2009-02-21 12:12:00,DRUNKENNESS,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +441965,2009-02-21 10:09:00,DRUNKENNESS,SOUTHERN,400 Block of STEVENSON ST,-122.408658469653,37.7826632207573 +442028,2009-02-21 02:31:00,KIDNAPPING,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.411268613368,37.782250087316704 +442034,2009-02-21 02:20:00,DRUNKENNESS,SOUTHERN,4TH ST / FREELON ST,-122.397066698493,37.7787523253223 +442041,2009-02-21 01:56:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +442045,2009-02-21 01:47:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.413753670487,37.78373004094 +442365,2009-02-20 12:00:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +442377,2009-02-20 11:40:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +442380,2009-02-20 11:00:00,KIDNAPPING,BAYVIEW,1800 Block of PALOU AV,-122.396072849654,37.7369730787307 +442529,2009-02-19 22:59:00,KIDNAPPING,TENDERLOIN,100 Block of TAYLOR ST,-122.410928353347,37.7836778741124 +442573,2009-02-19 21:24:00,ARSON,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +442587,2009-02-19 20:55:00,KIDNAPPING,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +442687,2009-02-19 16:59:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +442790,2009-02-19 11:30:00,DRUNKENNESS,SOUTHERN,100 Block of OTIS ST,-122.420303482492,37.770896885856 +442924,2009-02-18 23:50:00,DRUNKENNESS,MISSION,VALENCIA ST / 23RD ST,-122.420814360139,37.7537031921344 +442983,2009-02-18 21:25:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +443037,2009-02-18 19:00:00,DRUNKENNESS,MISSION,900 Block of SOUTH VAN NESS AV,-122.416863555609,37.7579459514924 +443083,2009-02-18 17:03:00,DRUNKENNESS,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +443183,2009-02-18 13:30:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +443360,2009-02-17 23:53:00,ARSON,BAYVIEW,400 Block of KANSAS ST,-122.403537681373,37.76406786515879 +443507,2009-02-17 16:50:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418940110957,37.7860492230028 +443604,2009-02-17 11:00:00,KIDNAPPING,INGLESIDE,0 Block of BLYTHDALE AV,-122.417720424652,37.710661234774896 +443686,2009-02-17 00:01:00,KIDNAPPING,INGLESIDE,0 Block of POPE ST,-122.441384223845,37.71429319030009 +443720,2009-02-16 22:09:00,DRUNKENNESS,INGLESIDE,MISSION ST / 30TH ST,-122.421970919029,37.74237522452549 +443737,2009-02-16 21:47:00,DRUNKENNESS,MISSION,2800 Block of MISSION ST,-122.418296094437,37.7514284856786 +443812,2009-02-16 18:00:00,RUNAWAY,BAYVIEW,300 Block of TOPEKA AV,-122.39540386441,37.7314978851017 +443951,2009-02-16 11:58:00,RUNAWAY,NORTHERN,300 Block of BUCHANAN ST,-122.4272776443,37.7727541133707 +444123,2009-02-08 18:40:00,ARSON,CENTRAL,700 Block of CHESTNUT ST,-122.415719716089,37.8034976038312 +444196,2009-02-08 15:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +444266,2009-02-08 10:00:00,KIDNAPPING,TENDERLOIN,0 Block of EDDY ST,-122.408042037199,37.7844542987208 +444300,2009-02-08 04:00:00,KIDNAPPING,CENTRAL,1400 Block of CLAY ST,-122.416962843507,37.79296084409079 +444353,2009-02-07 23:24:00,DRUNKENNESS,MISSION,1400 Block of SOUTH VAN NESS AV,-122.416098641422,37.7499521390889 +444387,2009-02-07 22:03:00,DRUNKENNESS,TARAVAL,800 Block of IRVING ST,-122.466861035773,37.764067832215794 +444548,2009-02-07 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +444657,2009-02-07 02:00:00,KIDNAPPING,MISSION,FLORIDA ST / MARIPOSA ST,-122.411210037798,37.76297361415671 +444682,2009-02-06 23:55:00,DRUNKENNESS,MISSION,16TH ST / VALENCIA ST,-122.421886357981,37.7649178909424 +444750,2009-02-06 20:26:00,DRUNKENNESS,NORTHERN,OAK ST / FILLMORE ST,-122.430827580272,37.7739712165626 +444783,2009-02-06 19:00:00,DRUNKENNESS,MISSION,200 Block of VALENCIA ST,-122.422350411388,37.768992823432896 +444821,2009-02-06 17:30:00,RUNAWAY,TARAVAL,200 Block of GRANADA AV,-122.457235250338,37.7229939308537 +444841,2009-02-06 16:43:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +444931,2009-02-06 11:45:00,KIDNAPPING,INGLESIDE,5200 Block of MISSION ST,-122.442127045623,37.7149977234776 +444976,2009-02-06 09:00:00,ARSON,BAYVIEW,22ND ST / INDIANA ST,-122.391178496581,37.7577699479275 +445034,2009-02-06 01:30:00,DRUNKENNESS,CENTRAL,1300 Block of GRANT AV,-122.407370965267,37.79924012538321 +445036,2009-02-06 01:30:00,KIDNAPPING,CENTRAL,1300 Block of GRANT AV,-122.407370965267,37.79924012538321 +445068,2009-02-05 23:06:00,DRUNKENNESS,RICHMOND,LINCOLN WY / 9TH AV,-122.46644268420602,37.7659245297691 +445094,2009-02-05 21:47:00,DRUNKENNESS,INGLESIDE,LAIDLEY ST / 30TH ST,-122.432225748656,37.7417817366112 +445145,2009-02-05 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +445392,2009-02-05 00:31:00,ARSON,BAYVIEW,600 Block of FELTON ST,-122.410999684769,37.7283041125654 +445420,2009-02-04 23:00:00,KIDNAPPING,CENTRAL,1000 Block of CLAY ST,-122.410139707632,37.7937201264155 +445433,2009-02-04 22:00:00,KIDNAPPING,PARK,400 Block of CARL ST,-122.455570536628,37.7650284697804 +445521,2009-02-04 17:30:00,ARSON,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +445526,2009-02-04 17:13:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +445663,2009-02-04 11:00:00,DRUNKENNESS,BAYVIEW,4900 Block of 3RD ST,-122.390978248429,37.7335884807714 +445758,2009-02-04 00:40:00,KIDNAPPING,SOUTHERN,0 Block of 4TH ST,-122.404956956375,37.785117856395296 +445780,2009-02-03 23:16:00,ARSON,CENTRAL,800 Block of HYDE ST,-122.416855510185,37.7886617324098 +445786,2009-02-03 23:00:00,ARSON,TARAVAL,1400 Block of 40TH AV,-122.499498797521,37.7597537080445 +446130,2009-02-03 01:15:00,DRUNKENNESS,NORTHERN,100 Block of CHURCH ST,-122.429018189436,37.7675072901238 +446182,2009-02-02 21:35:00,DRUNKENNESS,MISSION,3300 Block of 24TH ST,-122.420379793048,37.7521761775715 +446312,2009-02-02 15:21:00,DRUNKENNESS,NORTHERN,2200 Block of VANNESS AV,-122.423682814338,37.7962046209564 +446375,2009-02-02 13:21:00,DRUNKENNESS,NORTHERN,2800 Block of VANNESS AV,-122.424808513989,37.8017849138186 +446501,2009-02-02 07:50:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +446536,2009-02-02 04:08:00,DRUNKENNESS,NORTHERN,POLK ST / SUTTER ST,-122.420120319204,37.78775706024111 +446594,2009-01-25 22:50:00,DRUNKENNESS,CENTRAL,200 Block of COLUMBUS AV,-122.406409965318,37.7977588402975 +446604,2009-01-25 22:10:00,DRUNKENNESS,TARAVAL,300 Block of SLOAT BL,-122.476112101091,37.734780118103 +446615,2009-01-25 21:26:00,DRUNKENNESS,TARAVAL,9TH AV / JUDAH ST,-122.466180771685,37.7621738188702 +446618,2009-01-25 21:10:00,DRUNKENNESS,PARK,DIVISADERO ST / PAGE ST,-122.437235589841,37.772204193971895 +446638,2009-01-25 20:05:00,DRUNKENNESS,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.414302052544,37.781863316866 +446771,2009-01-25 12:10:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +446850,2009-01-25 04:09:00,DRUNKENNESS,SOUTHERN,6TH ST / HARRISON ST,-122.404071611406,37.7772741854354 +447175,2009-01-24 12:00:00,RUNAWAY,BAYVIEW,0 Block of WATCHMAN WY,-122.395251009931,37.75534435195679 +447280,2009-01-24 00:53:00,DRUNKENNESS,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +447291,2009-01-24 00:30:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +447301,2009-01-24 00:20:00,KIDNAPPING,NORTHERN,OLIVE ST / POLK ST,-122.419458073153,37.7844990197997 +447304,2009-01-24 00:17:00,DRUNKENNESS,PARK,MASONIC AV / FELL ST,-122.445904271169,37.7729953727174 +447341,2009-01-23 22:39:00,DRUNKENNESS,PARK,3600 Block of 16TH ST,-122.434221184718,37.7642237070482 +447364,2009-01-23 21:20:00,DRUNKENNESS,MISSION,0 Block of WOODWARD ST,-122.420787082234,37.7690595236078 +447450,2009-01-23 17:10:00,DRUNKENNESS,INGLESIDE,MISSION ST / RANDALL ST,-122.42358068715,37.7398849565957 +447690,2009-01-22 20:34:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +447713,2009-01-22 19:34:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +447744,2009-01-22 18:16:00,DRUNKENNESS,INGLESIDE,BOCANA ST / CORTLAND AV,-122.418584530851,37.7392989090618 +447806,2009-01-22 15:40:00,KIDNAPPING,INGLESIDE,800 Block of NAPLES ST,-122.435104115741,37.7158046693752 +447857,2009-01-22 13:03:00,ARSON,NORTHERN,400 Block of MARINA BL,-122.441146704191,37.8060498851528 +447980,2009-01-22 02:05:00,KIDNAPPING,SOUTHERN,1100 Block of HOWARD ST,-122.411359138357,37.7764944808779 +448041,2009-01-21 21:29:00,KIDNAPPING,CENTRAL,800 Block of GEARY ST,-122.417273344939,37.7861493947594 +448081,2009-01-21 18:45:00,DRUNKENNESS,PARK,1700 Block of EDDY ST,-122.43644305449,37.7808493247624 +448104,2009-01-21 17:56:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409536662692,37.78269112134721 +448115,2009-01-21 17:00:00,ARSON,TARAVAL,600 Block of HEAD ST,-122.464519701074,37.718824586123 +448341,2009-01-21 03:17:00,ARSON,TARAVAL,SANTIAGO ST / 24TH AV,-122.481180963255,37.7446799417931 +448433,2009-01-20 20:15:00,KIDNAPPING,INGLESIDE,100 Block of BLYTHDALE AV,-122.420529801066,37.7110023300609 +448567,2009-01-20 14:45:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +448666,2009-01-20 09:25:00,RUNAWAY,BAYVIEW,1400 Block of PALOU AV,-122.388078475154,37.7324430442707 +448763,2009-01-19 23:45:00,ARSON,RICHMOND,DIVISADERO ST / JACKSON ST,-122.441155369375,37.791629148973605 +448856,2009-01-19 18:42:00,KIDNAPPING,MISSION,1200 Block of VALENCIA ST,-122.420806049169,37.7528840217529 +448919,2009-01-19 16:30:00,RUNAWAY,TARAVAL,2500 Block of 45TH AV,-122.50328313627,37.73901112748421 +449094,2009-01-19 08:10:00,KIDNAPPING,NORTHERN,200 Block of PAGE ST,-122.424829503585,37.7737213634177 +449124,2009-01-19 02:35:00,DRUNKENNESS,SOUTHERN,800 Block of HARRISON ST,-122.400799947914,37.7799338672319 +449158,2009-01-11 23:36:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406460643507,37.7979466732983 +449160,2009-01-11 23:19:00,DRUNKENNESS,NORTHERN,1000 Block of POLK ST,-122.419858277339,37.786137125238 +449166,2009-01-11 23:00:00,KIDNAPPING,NORTHERN,WEBSTER ST / GEARY BL,-122.431206932079,37.7845681170336 +449211,2009-01-11 20:00:00,RUNAWAY,BAYVIEW,1200 Block of QUESADA AV,-122.383037431906,37.728636436753 +449318,2009-01-11 15:36:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421644195835,37.7631124568674 +449395,2009-01-11 12:00:00,RUNAWAY,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +449497,2009-01-11 02:04:00,KIDNAPPING,MISSION,900 Block of TREAT AV,-122.413147019892,37.7549540482182 +449510,2009-01-11 01:20:00,DRUNKENNESS,CENTRAL,POST ST / JONES ST,-122.413358051141,37.7876637195721 +449564,2009-01-10 22:45:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +449612,2009-01-10 20:10:00,ARSON,RICHMOND,800 Block of 39TH AV,-122.499318733675,37.7727970777258 +449641,2009-01-10 19:10:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739951,37.7978641744394 +449671,2009-01-10 17:47:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +449707,2009-01-10 16:51:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.4138307659,37.7525754079659 +449924,2009-01-10 01:00:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +449974,2009-01-09 21:51:00,DRUNKENNESS,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +450057,2009-01-09 17:51:00,DRUNKENNESS,TENDERLOIN,JONES ST / EDDY ST,-122.412597377187,37.783932027727296 +450169,2009-01-09 12:10:00,ARSON,NORTHERN,1100 Block of GOLDEN GATE AV,-122.428629291515,37.779931744212 +450240,2009-01-09 07:15:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +450246,2009-01-09 06:40:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +450251,2009-01-09 04:42:00,ARSON,NORTHERN,1600 Block of UNION ST,-122.426473957204,37.798291291684 +450306,2009-01-08 23:30:00,DRUNKENNESS,PARK,200 Block of SHRADER ST,-122.452460550389,37.772647606317 +450524,2009-01-08 13:13:00,ARSON,TENDERLOIN,OFARRELL ST / TAYLOR ST,-122.411328369311,37.7859963050476 +450762,2009-01-07 18:40:00,DRUNKENNESS,TENDERLOIN,0 Block of TAYLOR ST,-122.410689907787,37.7824948907735 +450809,2009-01-07 17:00:00,KIDNAPPING,BAYVIEW,1500 Block of REVERE AV,-122.389206215932,37.7311894334281 +450967,2009-01-07 10:30:00,KIDNAPPING,PARK,2000 Block of MCALLISTER ST,-122.445840487631,37.776901812095 +451059,2009-01-07 02:25:00,ARSON,BAYVIEW,1400 Block of 25TH ST,-122.39313357102,37.7524596896067 +451067,2009-01-07 01:40:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +451070,2009-01-07 01:35:00,DRUNKENNESS,PARK,600 Block of HAIGHT ST,-122.432918340311,37.7717365330369 +451084,2009-01-07 00:01:00,KIDNAPPING,NORTHERN,1000 Block of FILLMORE ST,-122.431790993089,37.779115741059705 +451236,2009-01-06 16:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +451335,2009-01-06 12:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +451388,2009-01-06 10:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +451441,2009-01-06 06:26:00,ARSON,MISSION,3900 Block of 24TH ST,-122.430794211054,37.75155749992229 +451476,2009-01-06 02:00:00,KIDNAPPING,INGLESIDE,0 Block of SANTOS ST,-122.41867937435,37.711332789313005 +451489,2009-01-06 00:38:00,DRUNKENNESS,CENTRAL,1000 Block of KEARNY ST,-122.4055247968,37.7977714997338 +451603,2009-01-05 18:00:00,ARSON,CENTRAL,1300 Block of CALIFORNIA ST,-122.416773563916,37.7911165972854 +451693,2009-01-05 13:25:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +452023,2008-12-28 12:33:00,DRUNKENNESS,SOUTHERN,MCCOPPIN ST / VALENCIA ST,-122.422526328922,37.7715962069104 +452056,2008-12-28 11:27:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +452135,2008-12-28 02:50:00,ARSON,BAYVIEW,1100 Block of QUESADA AV,-122.381014086921,37.72735297348621 +452146,2008-12-28 01:40:00,DRUNKENNESS,SOUTHERN,600 Block of HOWARD ST,-122.399870165149,37.7854258563204 +452171,2008-12-28 00:03:00,DRUNKENNESS,NORTHERN,2200 Block of FILLMORE ST,-122.434185156356,37.7902737888877 +452179,2008-12-28 00:01:00,KIDNAPPING,INGLESIDE,1100 Block of ALEMANY BL,-122.430219990195,37.7307327608383 +452275,2008-12-27 19:32:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +452302,2008-12-27 18:05:00,DRUNKENNESS,PARK,200 Block of CENTRAL AV,-122.444000364635,37.7718270462389 +452509,2008-12-27 03:01:00,DRUNKENNESS,TENDERLOIN,EDDY ST / TAYLOR ST,-122.410955248906,37.7841399509594 +452512,2008-12-27 02:58:00,ARSON,BAYVIEW,1200 Block of ILLINOIS ST,-122.387199178599,37.7561077526854 +452518,2008-12-27 02:02:00,DRUNKENNESS,TENDERLOIN,200 Block of TAYLOR ST,-122.410979175673,37.784625434984 +452557,2008-12-27 00:01:00,KIDNAPPING,MISSION,3200 Block of 23RD ST,-122.418055151685,37.7539240929444 +452657,2008-12-26 16:12:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +452828,2008-12-26 00:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +452831,2008-12-26 00:28:00,DRUNKENNESS,MISSION,3100 Block of 19TH ST,-122.414303930522,37.7605864307207 +452836,2008-12-26 00:01:00,KIDNAPPING,BAYVIEW,0 Block of CASHMERE ST,-122.382705072801,37.7358858148594 +452912,2008-12-25 17:14:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +452941,2008-12-25 14:00:00,DRUNKENNESS,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +452976,2008-12-25 10:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +452983,2008-12-25 10:00:00,KIDNAPPING,CENTRAL,600 Block of BUSH ST,-122.408404482124,37.7902633246767 +453000,2008-12-25 04:00:00,KIDNAPPING,TARAVAL,THRIFT ST / PLYMOUTH AV,-122.456093983041,37.7174756418237 +453049,2008-12-24 23:03:00,DRUNKENNESS,MISSION,1800 Block of 15TH ST,-122.425864046062,37.7662536102334 +453091,2008-12-24 20:10:00,ARSON,BAYVIEW,1400 Block of HUDSON AV,-122.385215479529,37.7382444962471 +453310,2008-12-24 08:00:00,RUNAWAY,RICHMOND,400 Block of 9TH AV,-122.467488647124,37.7798911973996 +453368,2008-12-23 22:51:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.41371122073,37.7796660426062 +453586,2008-12-23 08:00:00,KIDNAPPING,INGLESIDE,300 Block of MADRID ST,-122.430995189317,37.7239029233141 +453635,2008-12-23 00:47:00,ARSON,CENTRAL,TAYLOR ST / ALADDIN TR,-122.414216512721,37.8002882875133 +453636,2008-12-23 00:40:00,DRUNKENNESS,BAYVIEW,2400 Block of SAN BRUNO AV,-122.404952461327,37.7307376243582 +453649,2008-12-22 23:59:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +453745,2008-12-22 18:57:00,KIDNAPPING,TARAVAL,2100 Block of 22ND AV,-122.479160707866,37.7475559158885 +453892,2008-12-22 12:09:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +453926,2008-12-22 11:30:00,KIDNAPPING,TENDERLOIN,600 Block of OFARRELL ST,-122.41533612902,37.7854364798696 +454191,2008-12-14 13:00:00,KIDNAPPING,CENTRAL,800 Block of LEAVENWORTH ST,-122.415212031352,37.788871449843 +454314,2008-12-14 00:55:00,DRUNKENNESS,CENTRAL,0 Block of CAMPTON PL,-122.406096297772,37.7890234704903 +454387,2008-12-13 21:30:00,ARSON,INGLESIDE,500 Block of MOSCOW ST,-122.429461979259,37.71894269549521 +454390,2008-12-13 21:30:00,KIDNAPPING,BAYVIEW,6600 Block of 3RD ST,-122.398315314856,37.7181339755846 +454406,2008-12-13 20:55:00,ARSON,NORTHERN,2100 Block of FRANKLIN ST,-122.424716375946,37.794183791995 +454529,2008-12-13 15:30:00,KIDNAPPING,BAYVIEW,1400 Block of PALOU AV,-122.388078475154,37.7324430442707 +454641,2008-12-13 05:05:00,DRUNKENNESS,INGLESIDE,200 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +454658,2008-12-13 02:30:00,DRUNKENNESS,TARAVAL,GREAT HWY / TARAVAL ST,-122.506864755163,37.7416713934066 +454685,2008-12-13 00:06:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +454733,2008-12-12 21:15:00,DRUNKENNESS,TARAVAL,2500 Block of 40TH AV,-122.497923307918,37.7392469351271 +454771,2008-12-12 19:46:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +454833,2008-12-12 16:20:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.414623849785,37.75241809285711 +454874,2008-12-12 14:29:00,KIDNAPPING,BAYVIEW,0 Block of REARDON RD,-122.377026608239,37.729440713500296 +454957,2008-12-12 09:48:00,DRUNKENNESS,MISSION,MARKET ST / CASTRO ST,-122.435187699349,37.7626702770872 +454993,2008-12-12 06:30:00,ARSON,NORTHERN,2400 Block of FILBERT ST,-122.439815722257,37.7975503025544 +455182,2008-12-11 17:14:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +455219,2008-12-11 15:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +455406,2008-12-11 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +455476,2008-12-10 19:36:00,KIDNAPPING,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.41126513685,37.78213926815221 +455618,2008-12-10 14:18:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +455631,2008-12-10 14:00:00,RUNAWAY,INGLESIDE,1300 Block of SUNNYDALE AV,-122.413971257366,37.7114003044694 +455918,2008-12-09 17:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +455919,2008-12-09 17:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +455986,2008-12-09 14:22:00,KIDNAPPING,BAYVIEW,1200 Block of BAY SHORE BL,-122.402410107907,37.728735379612 +456144,2008-12-09 01:07:00,KIDNAPPING,TENDERLOIN,200 Block of TURK ST,-122.413259498719,37.7829514828801 +456171,2008-12-08 23:50:00,DRUNKENNESS,SOUTHERN,6TH ST / FOLSOM ST,-122.405618998022,37.7785045190918 +456208,2008-12-08 21:00:00,KIDNAPPING,BAYVIEW,DOUBLEROCK ST / CAMERON WY,-122.388056492424,37.7206927139763 +456209,2008-12-08 21:00:00,KIDNAPPING,TARAVAL,1600 Block of 44TH AV,-122.503525571115,37.75583586943621 +456268,2008-12-08 18:12:00,DRUNKENNESS,CENTRAL,1700 Block of TAYLOR ST,-122.413907435756,37.79842250867321 +456276,2008-12-08 17:51:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552636,37.7693505381781 +456566,2008-12-08 00:10:00,KIDNAPPING,BAYVIEW,0 Block of CASHMERE ST,-122.382745395519,37.73565878863421 +456603,2008-11-30 22:29:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409212989898,37.7984669746847 +456861,2008-11-30 04:48:00,ARSON,BAYVIEW,700 Block of FITCH ST,-122.372571530798,37.73230293783379 +456878,2008-11-30 03:05:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +456890,2008-11-30 02:00:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 6TH ST,-122.407163046954,37.7797376338991 +456904,2008-11-30 01:00:00,DRUNKENNESS,BAYVIEW,400 Block of VERMONT ST,-122.404364167887,37.7640149793292 +456923,2008-11-30 00:12:00,ARSON,CENTRAL,1200 Block of FILBERT ST,-122.420066454419,37.7999724858428 +457081,2008-11-29 17:45:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5THSTNORTH ST,-122.408068345148,37.7839916768161 +457144,2008-11-29 15:09:00,DRUNKENNESS,PARK,OAK ST / DIVISADERO ST,-122.437422446098,37.7731323316038 +457191,2008-11-29 13:30:00,ARSON,INGLESIDE,1500 Block of ALABAMA ST,-122.410568705339,37.7478290562548 +457261,2008-11-29 09:12:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +457341,2008-11-28 23:35:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +457345,2008-11-28 23:13:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +457360,2008-11-28 22:55:00,DRUNKENNESS,INGLESIDE,400 Block of GATES ST,-122.414117509486,37.737719162259495 +457459,2008-11-28 17:10:00,KIDNAPPING,INGLESIDE,100 Block of LOEHR ST,-122.413546096394,37.7125799991039 +457473,2008-11-28 16:11:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +457609,2008-11-28 02:44:00,ARSON,NORTHERN,1400 Block of VALLEJO ST,-122.42116562401002,37.7970565427155 +457632,2008-11-28 00:01:00,KIDNAPPING,PARK,1200 Block of DIVISADERO ST,-122.438902727985,37.7810797684097 +457637,2008-11-27 23:37:00,DRUNKENNESS,SOUTHERN,FREMONT ST / FOLSOM ST,-122.393599296214,37.7879964380876 +457692,2008-11-27 19:15:00,ARSON,MISSION,100 Block of CHATTANOOGA ST,-122.426623405863,37.7541413014419 +457701,2008-11-27 18:30:00,RUNAWAY,INGLESIDE,100 Block of PEABODY ST,-122.407315286094,37.7103562340903 +457720,2008-11-27 16:57:00,DRUNKENNESS,MISSION,24TH ST / OSAGE ST,-122.419018144895,37.7522051632838 +457986,2008-11-26 18:32:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +458118,2008-11-26 12:45:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +458277,2008-11-25 23:30:00,RUNAWAY,TARAVAL,1900 Block of OCEAN AV,-122.46256031901,37.7252945346576 +458288,2008-11-25 23:00:00,RUNAWAY,SOUTHERN,500 Block of MINNA ST,-122.40877066526,37.7801357011746 +458305,2008-11-25 21:45:00,RUNAWAY,INGLESIDE,300 Block of EDINBURGH ST,-122.430194700261,37.7235205085999 +458339,2008-11-25 20:00:00,ARSON,RICHMOND,2700 Block of JACKSON ST,-122.440348065795,37.7917890969726 +458422,2008-11-25 16:30:00,DRUNKENNESS,NORTHERN,2000 Block of POLK ST,-122.421608893207,37.7955038710773 +458758,2008-11-24 19:55:00,KIDNAPPING,TENDERLOIN,400 Block of TURK ST,-122.416342977622,37.7824465135592 +458787,2008-11-24 18:29:00,KIDNAPPING,INGLESIDE,100 Block of LUNDYS LN,-122.419429440819,37.743146841669706 +459020,2008-11-24 07:15:00,KIDNAPPING,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +459120,2008-11-16 22:20:00,DRUNKENNESS,BAYVIEW,1600 Block of THOMAS AV,-122.391648699288,37.7306822385776 +459163,2008-11-16 19:18:00,ARSON,BAYVIEW,0 Block of HARBOR RD,-122.378392257534,37.7323312464378 +459268,2008-11-16 13:00:00,KIDNAPPING,BAYVIEW,SILLIMAN ST / CAMBRIDGE ST,-122.418902300741,37.7276275013535 +459419,2008-11-16 01:50:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +459432,2008-11-16 01:10:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929231,37.7980180687744 +459449,2008-11-16 00:28:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405862214655,37.7979117105028 +459454,2008-11-16 00:05:00,ARSON,BAYVIEW,0 Block of BEATRICE LN,-122.380833215509,37.7309396002948 +459813,2008-11-15 06:30:00,KIDNAPPING,PARK,1900 Block of MCALLISTER ST,-122.444148797257,37.7770048241397 +459845,2008-11-15 02:08:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +459846,2008-11-15 02:08:00,DRUNKENNESS,SOUTHERN,0 Block of HAWTHORNE ST,-122.398526760915,37.7853099928246 +459935,2008-11-14 22:32:00,KIDNAPPING,INGLESIDE,CONCORD ST / MORSE ST,-122.442564417847,37.7121149744585 +459981,2008-11-14 20:45:00,ARSON,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +460210,2008-11-14 11:50:00,RUNAWAY,RICHMOND,FULTON ST / PARKPRESIDIO BL,-122.471762293488,37.7731370565281 +460235,2008-11-14 10:00:00,KIDNAPPING,INGLESIDE,3100 Block of MISSION ST,-122.418609719102,37.7474453071495 +460374,2008-11-13 22:47:00,ARSON,CENTRAL,700 Block of CHESTNUT ST,-122.415699189467,37.8033889645287 +460395,2008-11-13 22:10:00,DRUNKENNESS,RICHMOND,200 Block of CLEMENT ST,-122.461749405491,37.7830075842759 +460465,2008-11-13 18:32:00,DRUNKENNESS,CENTRAL,JEFFERSON ST / JONES ST,-122.417448570419,37.8080122538321 +460503,2008-11-13 17:07:00,DRUNKENNESS,CENTRAL,600 Block of LOMBARD ST,-122.41223801741998,37.802983078398704 +460549,2008-11-13 15:40:00,KIDNAPPING,TARAVAL,2200 Block of 14TH AV,-122.470359608661,37.7460753397163 +460553,2008-11-13 15:30:00,KIDNAPPING,INGLESIDE,ATHENS ST / BRAZIL AV,-122.428430536851,37.7216346608384 +460832,2008-11-12 23:25:00,KIDNAPPING,TENDERLOIN,300 Block of HYDE ST,-122.41604728066002,37.7839824654149 +461031,2008-11-12 15:07:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +461152,2008-11-12 09:45:00,KIDNAPPING,BAYVIEW,0 Block of GARLINGTON CT,-122.38435769838,37.7324996437285 +461329,2008-11-11 20:00:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.4138307659,37.7525754079659 +461376,2008-11-11 18:10:00,ARSON,BAYVIEW,2700 Block of JENNINGS ST,-122.392286120439,37.7229390030954 +461444,2008-11-11 15:07:00,DRUNKENNESS,MISSION,OSAGE ST / 24TH ST,-122.419018144895,37.7522051632838 +461479,2008-11-11 14:15:00,RUNAWAY,RICHMOND,2500 Block of SUTTER ST,-122.442364696255,37.7848750530811 +461577,2008-11-11 09:50:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +461750,2008-11-10 19:40:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +462045,2008-11-10 05:45:00,KIDNAPPING,BAYVIEW,1600 Block of QUESADA AV,-122.390478529234,37.7327208838049 +462077,2008-11-10 02:12:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.409845783196,37.7752407085662 +462126,2008-11-02 23:00:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449944521424,37.7695680602698 +462308,2008-11-02 12:00:00,KIDNAPPING,NORTHERN,FILBERT ST / POLK ST,-122.422526899218,37.7996943649596 +462402,2008-11-02 06:30:00,ARSON,TENDERLOIN,400 Block of ELLIS ST,-122.413631253258,37.7848053746211 +462665,2008-11-01 12:40:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +462710,2008-11-01 11:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +462793,2008-11-01 05:30:00,KIDNAPPING,TENDERLOIN,OFARRELL ST / LARKIN ST,-122.417903977564,37.785167087551706 +462826,2008-11-01 02:43:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.409845783196,37.7752407085662 +462839,2008-11-01 02:10:00,DRUNKENNESS,CENTRAL,300 Block of BROADWAY ST,-122.40367998233,37.7981913307058 +462842,2008-11-01 02:03:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +462867,2008-11-01 01:25:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +462875,2008-11-01 01:00:00,KIDNAPPING,MISSION,3100 Block of 22ND ST,-122.41821569477,37.7554138872049 +462888,2008-11-01 00:45:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +462899,2008-11-01 00:20:00,DRUNKENNESS,SOUTHERN,1200 Block of HOWARD ST,-122.412447373124,37.775633673443 +462972,2008-10-31 23:15:00,DRUNKENNESS,RICHMOND,500 Block of 27TH AV,-122.486737347544,37.7790158567341 +463038,2008-10-31 21:00:00,KIDNAPPING,CENTRAL,700 Block of PACIFIC AV,-122.408014703843,37.796699717573 +463332,2008-10-31 02:25:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552636,37.7693505381781 +463386,2008-10-30 23:17:00,DRUNKENNESS,BAYVIEW,1700 Block of REVERE AV,-122.392775772337,37.733078171001104 +463505,2008-10-30 16:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +463510,2008-10-30 16:00:00,KIDNAPPING,NORTHERN,1800 Block of CHESTNUT ST,-122.433806712295,37.8011834016788 +463719,2008-10-30 02:00:00,KIDNAPPING,BAYVIEW,1400 Block of 18TH ST,-122.39701495404,37.762495098651 +463737,2008-10-30 00:05:00,DRUNKENNESS,RICHMOND,6300 Block of GEARY BL,-122.487415459555,37.7798470223491 +463757,2008-10-29 23:07:00,DRUNKENNESS,SOUTHERN,200 Block of KING ST,-122.393110640713,37.77731032196979 +463790,2008-10-29 21:19:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +463794,2008-10-29 21:15:00,DRUNKENNESS,TARAVAL,LAKE MERCED BL / HIGUERA AV,-122.485070779954,37.7184522746858 +463842,2008-10-29 19:00:00,KIDNAPPING,PARK,WOODSIDE AV / PORTOLA DR,-122.451622869572,37.745533043349 +464270,2008-10-28 19:20:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413631253258,37.7848053746211 +464292,2008-10-28 18:52:00,DRUNKENNESS,SOUTHERN,MARKET ST / 7TH ST,-122.41251534135598,37.78047774805079 +464302,2008-10-28 18:34:00,DRUNKENNESS,BAYVIEW,PALOU AV / 3RD ST,-122.390971734551,37.73401521807229 +464389,2008-10-28 15:00:00,KIDNAPPING,PARK,1700 Block of TURK ST,-122.437493921383,37.779870435121104 +464493,2008-10-28 09:35:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +464571,2008-10-28 01:19:00,DRUNKENNESS,TARAVAL,PLYMOUTH AV / GRAFTON AV,-122.456133604353,37.72003240755389 +464575,2008-10-28 01:08:00,DRUNKENNESS,TARAVAL,WAWONA ST / 21ST AV,-122.477443788773,37.7373588674449 +464659,2008-10-27 21:00:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +464833,2008-10-27 14:05:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +464846,2008-10-27 13:50:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +464968,2008-10-27 06:10:00,KIDNAPPING,INGLESIDE,4600 Block of MISSION ST,-122.435161640813,37.7243102435436 +464969,2008-10-27 06:10:00,KIDNAPPING,INGLESIDE,4600 Block of MISSION ST,-122.435161640813,37.7243102435436 +465024,2008-10-19 23:12:00,ARSON,PARK,100 Block of DOUGLASS ST,-122.439381460078,37.7618077342104 +465073,2008-10-19 19:54:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +465111,2008-10-19 17:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +465112,2008-10-19 17:38:00,KIDNAPPING,MISSION,23RD ST / FLORIDA ST,-122.410223401131,37.75434231002311 +465161,2008-10-19 16:00:00,RUNAWAY,INGLESIDE,5900 Block of MISSION ST,-122.45346119546998,37.7084753872645 +465301,2008-10-19 07:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +465429,2008-10-18 22:15:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +465483,2008-10-18 19:31:00,DRUNKENNESS,MISSION,1200 Block of VALENCIA ST,-122.420806049169,37.7528840217529 +465690,2008-10-18 10:03:00,DRUNKENNESS,SOUTHERN,5THSTNORTH ST / MARKET ST,-122.408068345148,37.7839916768161 +465703,2008-10-18 09:30:00,RUNAWAY,MISSION,1200 Block of UTAH ST,-122.405460433484,37.7536841158237 +465710,2008-10-18 09:00:00,DRUNKENNESS,CENTRAL,0 Block of KEARNY ST,-122.40368884812,37.78865337551471 +465772,2008-10-18 03:11:00,DRUNKENNESS,TARAVAL,100 Block of FONT BL,-122.473644075533,37.7155536666978 +465826,2008-10-17 23:44:00,DRUNKENNESS,NORTHERN,ELLIS ST / STEINER ST,-122.434165498104,37.78214902635221 +465853,2008-10-17 22:37:00,DRUNKENNESS,MISSION,100 Block of DIAMOND ST,-122.437182095555,37.759938281081794 +465886,2008-10-17 20:40:00,DRUNKENNESS,BAYVIEW,PALOU AV / 3RD ST,-122.390971734551,37.73401521807229 +466172,2008-10-17 06:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +466173,2008-10-17 06:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +466206,2008-10-17 01:20:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +466272,2008-10-16 21:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +466336,2008-10-16 18:09:00,DRUNKENNESS,TENDERLOIN,FULTON ST / HYDE ST,-122.415127837608,37.7797870676495 +466359,2008-10-16 17:05:00,DRUNKENNESS,TENDERLOIN,POWELL ST / OFARRELL ST,-122.408040474858,37.7864094033618 +466677,2008-10-15 22:00:00,RUNAWAY,BAYVIEW,900 Block of CONNECTICUT ST,-122.397089183868,37.753598788032704 +466761,2008-10-15 17:38:00,DRUNKENNESS,CENTRAL,GRANT AV / COLUMBUS AV,-122.407085601172,37.798151367711 +467039,2008-10-15 08:00:00,KIDNAPPING,BAYVIEW,2800 Block of INGALLS ST,-122.390975036255,37.72125000493169 +467051,2008-10-15 07:34:00,ARSON,INGLESIDE,1200 Block of GENEVA AV,-122.435015533775,37.7135702444117 +467118,2008-10-15 00:01:00,ARSON,BAYVIEW,SOMERSET ST / BACON ST,-122.407556369323,37.7266003621804 +467217,2008-10-14 19:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +467312,2008-10-14 15:15:00,RUNAWAY,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +467629,2008-10-13 19:40:00,DRUNKENNESS,MISSION,500 Block of CAPP ST,-122.417817852676,37.7578884408086 +467821,2008-10-13 12:07:00,DRUNKENNESS,INGLESIDE,ELLINGTON AV / OTTAWA AV,-122.444324174772,37.714088471920206 +468003,2008-10-05 21:16:00,DRUNKENNESS,TARAVAL,0 Block of STRATFORD DR,-122.473465365097,37.723801723603394 +468026,2008-10-05 20:18:00,DRUNKENNESS,MISSION,1100 Block of YORK ST,-122.408195421597,37.7536414673004 +468161,2008-10-05 14:51:00,ARSON,TENDERLOIN,HYDE ST / OFARRELL ST,-122.416261836834,37.78537508463761 +468172,2008-10-05 14:20:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453512911126,37.7686969786551 +468273,2008-10-05 09:02:00,DRUNKENNESS,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416269089153,37.7531590161083 +468306,2008-10-05 03:40:00,DRUNKENNESS,NORTHERN,DIVISADERO ST / LOMBARD ST,-122.442649696374,37.798999247001 +468394,2008-10-04 23:15:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406861140307,37.7978967044381 +468425,2008-10-04 22:29:00,DRUNKENNESS,MISSION,3500 Block of CESAR CHAVEZ ST,-122.420832650303,37.7479994493226 +468427,2008-10-04 22:20:00,ARSON,TARAVAL,1800 Block of 32ND AV,-122.490403319126,37.752671652706105 +468615,2008-10-04 16:00:00,KIDNAPPING,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +468845,2008-10-04 00:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +468987,2008-10-03 19:02:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +469005,2008-10-03 18:37:00,DRUNKENNESS,MISSION,SHOTWELL ST / 24TH ST,-122.415173665801,37.7524407589917 +469013,2008-10-03 18:25:00,DRUNKENNESS,TENDERLOIN,MASON ST / EDDY ST,-122.409313111431,37.784347851315104 +469040,2008-10-03 17:10:00,DRUNKENNESS,TENDERLOIN,300 Block of JONES ST,-122.412758846145,37.78439975001921 +469259,2008-10-03 02:00:00,KIDNAPPING,MISSION,0 Block of BROSNAN ST,-122.423356925403,37.7686357546846 +469321,2008-10-02 21:50:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +469359,2008-10-02 20:00:00,RUNAWAY,BAYVIEW,1300 Block of PALOU AV,-122.38628498363998,37.7312896874195 +469533,2008-10-02 11:15:00,DRUNKENNESS,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +469598,2008-10-02 04:10:00,DRUNKENNESS,CENTRAL,100 Block of JEFFERSON ST,-122.415010032996,37.80836981613911 +469609,2008-10-02 02:46:00,DRUNKENNESS,MISSION,POTRERO AV / 19TH ST,-122.40706775926,37.760661880272295 +469693,2008-10-01 20:15:00,DRUNKENNESS,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +469778,2008-10-01 16:45:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +469933,2008-10-01 10:45:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +469940,2008-10-01 10:40:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +470034,2008-10-01 05:00:00,KIDNAPPING,TENDERLOIN,400 Block of LEAVENWORTH ST,-122.414457162309,37.7851373814889 +470058,2008-10-01 01:29:00,DRUNKENNESS,TENDERLOIN,400 Block of TURK ST,-122.416342977622,37.7824465135592 +470066,2008-10-01 01:00:00,ARSON,INGLESIDE,500 Block of RAYMOND AV,-122.41454365666,37.7151843660069 +470144,2008-09-30 22:56:00,KIDNAPPING,BAYVIEW,MISSOURI ST / CESAR CHAVEZ ST,-122.395310455039,37.749803455718 +470213,2008-09-30 20:00:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.407945033235,37.7996867434054 +470242,2008-09-30 18:45:00,KIDNAPPING,PARK,FELL ST / CENTRAL AV,-122.444217653151,37.7732099933428 +470441,2008-09-30 11:30:00,KIDNAPPING,TARAVAL,100 Block of FONT BL,-122.473644075533,37.7155536666978 +470447,2008-09-30 11:15:00,ARSON,INGLESIDE,400 Block of ATHENS ST,-122.428967556252,37.7208194144752 +470536,2008-09-30 06:32:00,ARSON,RICHMOND,4000 Block of BALBOA ST,-122.502148728509,37.7755496261634 +470554,2008-09-30 02:58:00,KIDNAPPING,CENTRAL,1300 Block of PINE ST,-122.418028132982,37.7898812870744 +470600,2008-09-29 23:19:00,DRUNKENNESS,SOUTHERN,800 Block of HOWARD ST,-122.403890955445,37.7824014072132 +470616,2008-09-29 22:48:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +470624,2008-09-29 22:08:00,DRUNKENNESS,NORTHERN,600 Block of LARKIN ST,-122.417594247706,37.7840149232554 +470735,2008-09-29 16:59:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.416551372097,37.752409559190895 +470747,2008-09-29 16:30:00,RUNAWAY,TARAVAL,0 Block of LEE AV,-122.454158224803,37.7191235212974 +470965,2008-09-29 00:21:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +471065,2008-09-21 18:00:00,KIDNAPPING,MISSION,16TH ST / POTRERO AV,-122.407538332319,37.7657827544276 +471261,2008-09-21 02:14:00,ARSON,BAYVIEW,KEITH ST / PALOU AV,-122.38716770759,37.7318594482631 +471269,2008-09-21 02:00:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +471274,2008-09-21 01:30:00,KIDNAPPING,RICHMOND,2700 Block of CALIFORNIA ST,-122.439611799655,37.7881165194416 +471325,2008-09-20 23:52:00,DRUNKENNESS,NORTHERN,POLK ST / CEDAR ST,-122.419834938618,37.78635803627429 +471406,2008-09-20 19:00:00,ARSON,RICHMOND,2900 Block of PACIFIC AV,-122.443857189176,37.7922450275779 +471451,2008-09-20 17:05:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.4138307659,37.7525754079659 +471503,2008-09-20 14:58:00,ARSON,MISSION,0 Block of SYCAMORE ST,-122.420552263555,37.7625908211558 +471528,2008-09-20 13:40:00,ARSON,MISSION,16TH ST / FOLSOM ST,-122.415308388816,37.765316135635 +471529,2008-09-20 13:40:00,ARSON,MISSION,16TH ST / FOLSOM ST,-122.415308388816,37.765316135635 +471553,2008-09-20 12:50:00,ARSON,SOUTHERN,DIVISION ST / POTRERO AV,-122.408011336061,37.7692444493655 +471566,2008-09-20 12:00:00,KIDNAPPING,RICHMOND,200 Block of 9TH AV,-122.467764477262,37.7837143848963 +471606,2008-09-20 09:30:00,ARSON,SOUTHERN,BRYANT ST / DIVISION ST,-122.410932750782,37.769411384942 +471750,2008-09-19 21:55:00,KIDNAPPING,MISSION,3300 Block of 26TH ST,-122.417866751645,37.749002324161 +471826,2008-09-19 18:38:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +471878,2008-09-19 16:23:00,ARSON,MISSION,SOUTH VAN NESS AV / 21ST ST,-122.416720982004,37.7571677817188 +472063,2008-09-19 02:42:00,DRUNKENNESS,TENDERLOIN,GOLDEN GATE AV / JONES ST,-122.412224164736,37.7820729312029 +472120,2008-09-18 23:25:00,KIDNAPPING,SOUTHERN,900 Block of MISSION ST,-122.40805253847,37.7815668300024 +472125,2008-09-18 23:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +472222,2008-09-18 18:23:00,DRUNKENNESS,PARK,1600 Block of GOLDEN GATE AV,-122.438140746783,37.7788324688402 +472255,2008-09-18 16:40:00,DRUNKENNESS,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +472331,2008-09-18 14:00:00,KIDNAPPING,TENDERLOIN,0 Block of EDDY ST,-122.408081861378,37.7845604966934 +472360,2008-09-18 12:05:00,DRUNKENNESS,SOUTHERN,0 Block of 5TH ST,-122.406760498327,37.782877264733294 +472475,2008-09-18 03:35:00,ARSON,TARAVAL,3800 Block of NORIEGA ST,-122.504876017462,37.75293252450071 +472476,2008-09-18 03:35:00,ARSON,TARAVAL,3800 Block of NORIEGA ST,-122.504876017462,37.75293252450071 +472550,2008-09-17 21:09:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421876488492,37.7640888944532 +472682,2008-09-17 15:16:00,DRUNKENNESS,BAYVIEW,2300 Block of KEITH ST,-122.392014352344,37.7265627716484 +472860,2008-09-17 01:44:00,DRUNKENNESS,MISSION,SAN BRUNO AV / 25TH ST,-122.40424331738,37.751845996887496 +472875,2008-09-17 00:12:00,ARSON,BAYVIEW,NEWCOMB AV / SELBY ST,-122.39912445211,37.7405288910442 +472897,2008-09-16 22:55:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.412733985804,37.7526417555714 +473273,2008-09-15 22:23:00,RUNAWAY,TARAVAL,0 Block of LEE AV,-122.454158224803,37.7191235212974 +473619,2008-09-15 00:01:00,ARSON,CENTRAL,1300 Block of VALLEJO ST,-122.419894322898,37.797115158267495 +473686,2008-09-07 19:15:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +473698,2008-09-07 18:53:00,DRUNKENNESS,MISSION,LINDA ST / 19TH ST,-122.422880477224,37.7600121527949 +473913,2008-09-07 03:10:00,DRUNKENNESS,MISSION,POTRERO AV / CESAR CHAVEZ ST,-122.405096871916,37.7491100050973 +473936,2008-09-07 01:43:00,DRUNKENNESS,SOUTHERN,MINNA ST / MARY ST,-122.406714512774,37.781678710377705 +474063,2008-09-06 21:00:00,RUNAWAY,BAYVIEW,800 Block of WISCONSIN ST,-122.398799232213,37.7565633329089 +474082,2008-09-06 20:00:00,KIDNAPPING,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +474108,2008-09-06 19:00:00,KIDNAPPING,BAYVIEW,2400 Block of GRIFFITH ST,-122.386437671186,37.7191834462785 +474209,2008-09-06 15:02:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.41487855905,37.7826335031541 +474416,2008-09-06 02:50:00,DRUNKENNESS,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +474443,2008-09-06 00:42:00,DRUNKENNESS,MISSION,2800 Block of 23RD ST,-122.408792875412,37.7543708769036 +474448,2008-09-06 00:25:00,DRUNKENNESS,MISSION,LEXINGTON ST / 20TH ST,-122.420507073662,37.7585455359264 +474515,2008-09-05 21:30:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +474639,2008-09-05 15:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +474874,2008-09-04 23:49:00,DRUNKENNESS,PARK,600 Block of CLAYTON ST,-122.448414119511,37.769331013125296 +475135,2008-09-04 10:10:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +475178,2008-09-04 06:21:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +475179,2008-09-04 06:21:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +475240,2008-09-03 23:00:00,KIDNAPPING,INGLESIDE,800 Block of VISITACION AV,-122.407455872707,37.71137317487671 +475462,2008-09-03 11:55:00,KIDNAPPING,BAYVIEW,LASALLE AV / NEWCOMB AV,-122.385001533619,37.7330708173682 +475577,2008-09-03 02:23:00,DRUNKENNESS,RICHMOND,GEARY BL / 8TH AV,-122.466427961913,37.7809230964028 +475581,2008-09-03 02:22:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +475734,2008-09-02 16:13:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +475768,2008-09-02 14:53:00,DRUNKENNESS,CENTRAL,700 Block of PACIFIC AV,-122.408014703843,37.796699717573 +475816,2008-09-02 13:30:00,KIDNAPPING,CENTRAL,BUSH ST / KEARNY ST,-122.404033177237,37.7907593489246 +475903,2008-09-02 09:10:00,KIDNAPPING,MISSION,3700 Block of 18TH ST,-122.427242380192,37.7614118083919 +475928,2008-09-02 07:39:00,DRUNKENNESS,SOUTHERN,0 Block of 5TH ST,-122.407805288642,37.7837068386088 +476075,2008-09-01 20:00:00,KIDNAPPING,CENTRAL,700 Block of PACIFIC AV,-122.408014703843,37.796699717573 +476076,2008-09-01 20:00:00,KIDNAPPING,CENTRAL,700 Block of PACIFIC AV,-122.408014703843,37.796699717573 +476124,2008-09-01 17:56:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +476313,2008-09-01 10:21:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +476413,2008-09-01 03:55:00,DRUNKENNESS,SOUTHERN,MISSION ST / 8TH ST,-122.41316085097,37.7774566611807 +476508,2008-08-24 23:30:00,DRUNKENNESS,MISSION,2600 Block of MISSION ST,-122.418738265772,37.7546172382083 +476534,2008-08-24 22:16:00,DRUNKENNESS,NORTHERN,POLK ST / SUTTER ST,-122.420120319204,37.78775706024111 +476687,2008-08-24 13:45:00,DRUNKENNESS,BAYVIEW,300 Block of BAY SHORE BL,-122.406825183678,37.741054981526 +476873,2008-08-24 00:01:00,KIDNAPPING,BAYVIEW,0 Block of WATCHMAN WY,-122.395251009931,37.75534435195679 +476882,2008-08-24 00:01:00,ARSON,CENTRAL,900 Block of SACRAMENTO ST,-122.408147060581,37.79318060571929 +476903,2008-08-23 23:14:00,DRUNKENNESS,MISSION,VALENCIA ST / 23RD ST,-122.420814360139,37.7537031921344 +477081,2008-08-23 15:30:00,DRUNKENNESS,CENTRAL,GREEN ST / JASPER PL,-122.408171756664,37.7996006402304 +477208,2008-08-23 05:55:00,ARSON,CENTRAL,2300 Block of JONES ST,-122.416487731004,37.802879824544 +477247,2008-08-23 02:00:00,ARSON,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +477316,2008-08-22 22:52:00,DRUNKENNESS,SOUTHERN,0 Block of SOUTHPARK AV,-122.392998702818,37.7822551330244 +477633,2008-08-22 04:30:00,ARSON,CENTRAL,900 Block of CLAY ST,-122.408944948383,37.793872142778 +477868,2008-08-21 14:30:00,DRUNKENNESS,INGLESIDE,3100 Block of MISSION ST,-122.41975695143,37.745914016128296 +477940,2008-08-21 10:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +477979,2008-08-21 08:00:00,KIDNAPPING,TARAVAL,1900 Block of 14TH AV,-122.470474903957,37.7516146641074 +478032,2008-08-21 01:02:00,DRUNKENNESS,MISSION,400 Block of SAN BRUNO AV,-122.405468775906,37.7639259195338 +478372,2008-08-20 08:30:00,RUNAWAY,BAYVIEW,1000 Block of INNES AV,-122.378863947066,37.7338273597299 +478532,2008-08-19 20:00:00,RUNAWAY,INGLESIDE,300 Block of OCEAN AV,-122.444032921532,37.7230802809417 +478577,2008-08-19 17:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +478936,2008-08-18 17:00:00,ARSON,BAYVIEW,1400 Block of HUDSON AV,-122.385135095076,37.7383338978754 +479109,2008-08-18 08:30:00,ARSON,NORTHERN,1900 Block of JACKSON ST,-122.427185970814,37.7934645599188 +479157,2008-08-18 01:30:00,KIDNAPPING,CENTRAL,2800 Block of LEAVENWORTH ST,-122.419067224379,37.8073339305952 +479285,2008-08-10 18:00:00,KIDNAPPING,NORTHERN,FILLMORE ST / HERMANN ST,-122.430076617284,37.770242204169 +479287,2008-08-10 18:00:00,KIDNAPPING,NORTHERN,FILLMORE ST / HERMANN ST,-122.430076617284,37.770242204169 +479525,2008-08-10 02:05:00,DRUNKENNESS,SOUTHERN,HARRISON ST / 3RD ST,-122.397388784826,37.7825543452426 +479530,2008-08-10 02:00:00,DRUNKENNESS,CENTRAL,JACKSON ST / COLUMBUS AV,-122.404417620748,37.7963018735739 +479547,2008-08-10 00:50:00,DRUNKENNESS,CENTRAL,400 Block of PACIFIC AV,-122.402452696904,37.79739649142461 +479572,2008-08-09 23:50:00,DRUNKENNESS,CENTRAL,BEACH ST / LEAVENWORTH ST,-122.418911060677,37.806862238932 +479655,2008-08-09 18:47:00,KIDNAPPING,TARAVAL,19TH AV / NORIEGA ST,-122.476422775529,37.7542423608244 +479933,2008-08-09 00:43:00,DRUNKENNESS,MISSION,VALENCIA ST / SYCAMORE ST,-122.421663206721,37.76257840427029 +479954,2008-08-09 00:01:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +479980,2008-08-08 23:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +480062,2008-08-08 18:44:00,DRUNKENNESS,MISSION,26TH ST / MISSION ST,-122.418137290501,37.7490413093633 +480451,2008-08-07 16:45:00,ARSON,BAYVIEW,1400 Block of 17TH ST,-122.398234883137,37.7650972868419 +480709,2008-08-06 20:10:00,DRUNKENNESS,MISSION,SHOTWELL ST / 24TH ST,-122.415173665801,37.7524407589917 +480740,2008-08-06 18:34:00,DRUNKENNESS,TARAVAL,800 Block of ULLOA ST,-122.466026150018,37.74092818901779 +480996,2008-08-06 00:01:00,DRUNKENNESS,SOUTHERN,COLUMBIASQUARE ST / HARRISON ST,-122.404899281944,37.7766207855265 +481116,2008-08-05 18:05:00,ARSON,NORTHERN,1500 Block of FRANCISCO ST,-122.430703168131,37.8025320753619 +481189,2008-08-05 15:15:00,KIDNAPPING,RICHMOND,300 Block of CLEMENT ST,-122.462820934738,37.7829584656072 +481243,2008-08-05 12:40:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +481342,2008-08-05 02:54:00,ARSON,BAYVIEW,1100 Block of THOMAS AV,-122.382852175823,37.7256943991515 +481396,2008-08-04 23:00:00,KIDNAPPING,CENTRAL,GRANT AV / VALLEJO ST,-122.407208951402,37.7987756652736 +481413,2008-08-04 21:48:00,DRUNKENNESS,MISSION,2800 Block of MISSION ST,-122.418296094437,37.7514284856786 +481416,2008-08-04 21:43:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +481483,2008-08-04 18:34:00,DRUNKENNESS,MISSION,3300 Block of 22ND ST,-122.422333037882,37.7552726735094 +481503,2008-08-04 17:35:00,KIDNAPPING,MISSION,0 Block of HOFF ST,-122.420575720933,37.7641819463712 +481724,2008-08-04 06:45:00,RUNAWAY,TARAVAL,0 Block of LEE AV,-122.454158224803,37.7191235212974 +481836,2008-07-27 19:30:00,DRUNKENNESS,MISSION,2800 Block of 23RD ST,-122.408792875412,37.7543708769036 +481902,2008-07-27 16:45:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +482142,2008-07-27 00:16:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +482166,2008-07-26 23:39:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +482423,2008-07-26 11:14:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +482512,2008-07-26 01:24:00,DRUNKENNESS,MISSION,3400 Block of 26TH ST,-122.41842788258002,37.7490786029711 +482574,2008-07-25 22:44:00,ARSON,SOUTHERN,100 Block of TOWNSEND ST,-122.391588816975,37.7796910137658 +482581,2008-07-25 22:30:00,KIDNAPPING,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +482588,2008-07-25 22:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +483325,2008-07-24 01:08:00,ARSON,BAYVIEW,100 Block of HUNTERSPTEXPWY EX,-122.376984074382,37.7340751122677 +483478,2008-07-23 17:05:00,DRUNKENNESS,CENTRAL,JONES ST / BEACH ST,-122.417265053145,37.807073051215 +483730,2008-07-22 23:45:00,DRUNKENNESS,SOUTHERN,0 Block of 7TH ST,-122.412272455406,37.7802039058686 +483752,2008-07-22 22:00:00,DRUNKENNESS,BAYVIEW,1200 Block of PALOU AV,-122.384336676296,37.7303189803917 +483755,2008-07-22 22:00:00,DRUNKENNESS,SOUTHERN,100 Block of KING ST,-122.390858609124,37.779096360374 +483866,2008-07-22 17:00:00,DRUNKENNESS,CENTRAL,FRESNO ST / GRANT AV,-122.407153171787,37.7984908901348 +484043,2008-07-22 08:00:00,DRUNKENNESS,RICHMOND,400 Block of EUCLID AV,-122.453201554574,37.7840050502083 +484090,2008-07-22 01:04:00,DRUNKENNESS,RICHMOND,1700 Block of DIVISADERO ST,-122.440083043621,37.7857092469428 +484279,2008-07-21 14:23:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +484420,2008-07-21 03:17:00,DRUNKENNESS,SOUTHERN,0 Block of 4TH ST,-122.404956956375,37.785117856395296 +484444,2008-07-21 00:01:00,RUNAWAY,RICHMOND,800 Block of CLEMENT ST,-122.468172949405,37.782721264342605 +484446,2008-07-21 00:01:00,DRUNKENNESS,INGLESIDE,3500 Block of MISSION ST,-122.42291673674102,37.7407894217643 +484504,2008-07-13 20:30:00,KIDNAPPING,CENTRAL,1500 Block of GRANT AV,-122.407775929611,37.80124843342272 +484514,2008-07-13 19:52:00,DRUNKENNESS,MISSION,3500 Block of 23RD ST,-122.422282409234,37.7535591785086 +484715,2008-07-13 11:26:00,ARSON,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +484887,2008-07-12 23:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +484987,2008-07-12 18:21:00,DRUNKENNESS,MISSION,1200 Block of VALENCIA ST,-122.420806049169,37.7528840217529 +485266,2008-07-12 01:18:00,DRUNKENNESS,CENTRAL,1100 Block of BUSH ST,-122.416221156508,37.7892672343725 +485427,2008-07-11 18:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +485588,2008-07-11 12:00:00,KIDNAPPING,MISSION,100 Block of LEXINGTON ST,-122.420803652133,37.7609280145455 +485614,2008-07-11 11:02:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +485645,2008-07-11 08:30:00,ARSON,PARK,0 Block of VEGA ST,-122.445893581212,37.7801242878056 +485652,2008-07-11 08:00:00,RUNAWAY,MISSION,1400 Block of GUERRERO ST,-122.422415578627,37.74840056927 +485672,2008-07-11 07:00:00,KIDNAPPING,INGLESIDE,400 Block of ELLSWORTH ST,-122.414737926118,37.7377540491609 +485711,2008-07-11 01:00:00,KIDNAPPING,PARK,COLE ST / FREDERICK ST,-122.450148533156,37.766728145537705 +485744,2008-07-10 23:19:00,ARSON,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +485775,2008-07-10 22:00:00,ARSON,CENTRAL,1400 Block of CLAY ST,-122.416940874615,37.79285238326701 +485792,2008-07-10 21:30:00,KIDNAPPING,TARAVAL,100 Block of MONTANA ST,-122.457604574133,37.7166716454511 +485806,2008-07-10 20:56:00,ARSON,BAYVIEW,3300 Block of KEITH ST,-122.397490733097,37.720467659541 +485929,2008-07-10 16:30:00,ARSON,INGLESIDE,200 Block of SCHWERIN ST,-122.411729977396,37.7099118138546 +485942,2008-07-10 16:10:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +486041,2008-07-10 11:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +486134,2008-07-10 03:00:00,ARSON,RICHMOND,300 Block of 11TH AV,-122.469628050956,37.78171999692911 +486222,2008-07-09 21:03:00,DRUNKENNESS,TARAVAL,HOLLOWAY AV / JULES AV,-122.461240360141,37.72183191298021 +486257,2008-07-09 19:25:00,DRUNKENNESS,PARK,KEZAR DR / MARTIN LUTHER KING JR DR,-122.458638758608,37.76719994034561 +486330,2008-07-09 17:15:00,KIDNAPPING,MISSION,1700 Block of FOLSOM ST,-122.415525556609,37.769470071800704 +486551,2008-07-09 07:30:00,KIDNAPPING,TARAVAL,500 Block of PLYMOUTH AV,-122.456006747766,37.7153550989192 +486554,2008-07-09 07:30:00,KIDNAPPING,TARAVAL,500 Block of PLYMOUTH AV,-122.456006747766,37.7153550989192 +486592,2008-07-09 02:20:00,DRUNKENNESS,CENTRAL,GEARY ST / LARKIN ST,-122.418090766692,37.7861007451645 +486598,2008-07-09 01:50:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +486602,2008-07-09 01:30:00,KIDNAPPING,MISSION,MARKET ST / 15TH ST,-122.431028702713,37.7658672394532 +486654,2008-07-08 22:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +486809,2008-07-08 14:58:00,DRUNKENNESS,CENTRAL,0 Block of JEFFERSON ST,-122.413349164272,37.8084667368908 +486837,2008-07-08 13:19:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +486862,2008-07-08 12:00:00,KIDNAPPING,PARK,1400 Block of WILLARD ST,-122.454163520564,37.7632841037016 +486961,2008-07-08 08:00:00,RUNAWAY,BAYVIEW,1300 Block of THOMAS AV,-122.386594164927,37.7278183430085 +487059,2008-07-07 22:24:00,DRUNKENNESS,NORTHERN,1500 Block of EDDY ST,-122.433155869003,37.78126734681 +487110,2008-07-07 18:57:00,DRUNKENNESS,CENTRAL,200 Block of THE EMBARCADERONORTH ST,-122.396374439116,37.79805325280579 +487127,2008-07-07 18:18:00,DRUNKENNESS,MISSION,GUERRERO ST / 20TH ST,-122.42348830726802,37.7583650668235 +487306,2008-07-07 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +487335,2008-07-07 08:00:00,KIDNAPPING,INGLESIDE,500 Block of OXFORD ST,-122.41808278663,37.7232037669884 +487359,2008-07-07 04:43:00,ARSON,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +487378,2008-07-07 01:07:00,DRUNKENNESS,MISSION,2800 Block of 16TH ST,-122.416964767473,37.7652697291388 +487698,2008-06-29 04:28:00,ARSON,MISSION,DOLORES ST / 16TH ST,-122.426384450806,37.764643937262 +487734,2008-06-29 01:45:00,ARSON,BAYVIEW,1000 Block of IOWA ST,-122.391846149486,37.753863259580605 +487775,2008-06-28 23:30:00,KIDNAPPING,BAYVIEW,1000 Block of MINNESOTA ST,-122.390113495249,37.7575632666934 +487883,2008-06-28 17:38:00,DRUNKENNESS,TENDERLOIN,GROVE ST / HYDE ST,-122.414743835382,37.77871926278901 +488072,2008-06-28 05:53:00,KIDNAPPING,TARAVAL,1900 Block of 29TH AV,-122.487055899123,37.7509494468209 +488146,2008-06-28 00:45:00,ARSON,TENDERLOIN,700 Block of OFARRELL ST,-122.417085357424,37.7852153590471 +488260,2008-06-27 19:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +488327,2008-06-27 16:00:00,KIDNAPPING,RICHMOND,700 Block of 24TH AV,-122.483252021738,37.775403562670704 +488459,2008-06-27 09:00:00,KIDNAPPING,BAYVIEW,600 Block of GILMAN AV,-122.383440897994,37.7156328950599 +488574,2008-06-26 21:52:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +488589,2008-06-26 21:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +488600,2008-06-26 20:51:00,DRUNKENNESS,SOUTHERN,MARKET ST / 6TH ST,-122.41029351969,37.7822305870036 +488837,2008-06-26 10:00:00,RUNAWAY,MISSION,3200 Block of 17TH ST,-122.417913861876,37.7635887638425 +488887,2008-06-26 03:44:00,DRUNKENNESS,PARK,DUBOCE AV / NOE ST,-122.433575097282,37.7691767476277 +488942,2008-06-25 22:10:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +488968,2008-06-25 20:00:00,RUNAWAY,MISSION,3000 Block of 23RD ST,-122.412588855535,37.7541426882469 +489104,2008-06-25 13:30:00,RUNAWAY,TARAVAL,43RD AV / IRVING ST,-122.502844168068,37.7624245474094 +489167,2008-06-25 10:00:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +489311,2008-06-24 20:18:00,DRUNKENNESS,TARAVAL,9TH AV / IRVING ST,-122.466309668238,37.7640368477306 +489622,2008-06-24 02:00:00,ARSON,NORTHERN,2600 Block of WEBSTER ST,-122.433305174108,37.794972587282096 +489700,2008-06-23 21:10:00,ARSON,BAYVIEW,JERROLD AV / BARNEVELD AV,-122.402701071833,37.7463358668696 +490105,2008-06-15 18:18:00,DRUNKENNESS,CENTRAL,UNION ST / STOCKTON ST,-122.409193904616,37.800443875105294 +490139,2008-06-15 17:00:00,KIDNAPPING,BAYVIEW,1100 Block of 8TH ST,-122.399996628792,37.767030629393 +490207,2008-06-15 13:28:00,DRUNKENNESS,SOUTHERN,MARKET ST / MASON ST,-122.408953598279,37.783287873572 +490273,2008-06-15 09:45:00,ARSON,SOUTHERN,300 Block of SPEAR ST,-122.390234287293,37.7894032659904 +490321,2008-06-15 02:30:00,ARSON,TARAVAL,2900 Block of WAWONA ST,-122.498340152127,37.7363856297823 +490326,2008-06-15 02:16:00,ARSON,BAYVIEW,700 Block of JAMESTOWN AV,-122.389039223072,37.7151390330171 +490346,2008-06-15 00:55:00,KIDNAPPING,RICHMOND,GEARY BL / STANYAN ST,-122.456295846469,37.7813800880128 +490374,2008-06-15 00:01:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +490411,2008-06-14 22:10:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5THSTNORTH ST,-122.408068345148,37.7839916768161 +490448,2008-06-14 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +490486,2008-06-14 19:00:00,ARSON,INGLESIDE,200 Block of JOHNFSHELLEY DR,-122.423304635548,37.72266944630029 +490639,2008-06-14 10:03:00,RUNAWAY,NORTHERN,2300 Block of SACRAMENTO ST,-122.431565622284,37.7900918964407 +490706,2008-06-14 02:00:00,ARSON,BAYVIEW,TEXAS ST / 23RD ST,-122.394816331723,37.7549810898672 +490715,2008-06-14 01:30:00,DRUNKENNESS,NORTHERN,UNION ST / GOUGH ST,-122.427270640646,37.7981336020854 +490722,2008-06-14 00:50:00,DRUNKENNESS,SOUTHERN,1100 Block of HARRISON ST,-122.406381070435,37.775524410088295 +490822,2008-06-13 20:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +490833,2008-06-13 19:40:00,KIDNAPPING,SOUTHERN,100 Block of SOUTHPARK AV,-122.394251231901,37.781198014159 +490932,2008-06-13 15:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +491176,2008-06-12 20:53:00,ARSON,SOUTHERN,0 Block of MCCOPPIN ST,-122.421454063304,37.7717145205274 +491187,2008-06-12 20:00:00,RUNAWAY,MISSION,2400 Block of MARIPOSA ST,-122.407807660132,37.7630994299538 +491207,2008-06-12 19:09:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +491459,2008-06-12 00:56:00,DRUNKENNESS,NORTHERN,2000 Block of BUCHANAN ST,-122.430523652614,37.7888467974349 +491614,2008-06-11 16:47:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +491742,2008-06-11 10:45:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +491787,2008-06-11 08:00:00,RUNAWAY,NORTHERN,1700 Block of SUTTER ST,-122.429183978793,37.7866604918855 +491823,2008-06-11 02:40:00,DRUNKENNESS,PARK,MASONIC AV / HAIGHT ST,-122.4453467866,37.7702081959172 +491895,2008-06-10 20:09:00,DRUNKENNESS,MISSION,2700 Block of HARRISON ST,-122.412041125438,37.7534100942238 +491919,2008-06-10 18:30:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.407376463936,37.7799892619986 +491932,2008-06-10 18:00:00,KIDNAPPING,BAYVIEW,2000 Block of BANCROFT AV,-122.401264905935,37.7303323096369 +491998,2008-06-10 15:00:00,KIDNAPPING,NORTHERN,VANNESS AV / MCALLISTER ST,-122.420250482603,37.7800745746334 +492094,2008-06-10 09:00:00,KIDNAPPING,MISSION,FOLSOM ST / 16TH ST,-122.415308388816,37.765316135635 +492382,2008-06-09 13:00:00,KIDNAPPING,MISSION,HOFF ST / 16TH ST,-122.420580440111,37.7649968622937 +492384,2008-06-09 13:00:00,KIDNAPPING,MISSION,HOFF ST / 16TH ST,-122.420580440111,37.7649968622937 +492447,2008-06-09 08:45:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +492594,2008-06-01 18:08:00,ARSON,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +492881,2008-06-01 01:30:00,DRUNKENNESS,CENTRAL,KEARNY ST / DUNNES AL,-122.405526331894,37.7983633631351 +492906,2008-06-01 00:05:00,ARSON,BAYVIEW,1000 Block of NEWHALL ST,-122.390301651188,37.7378798984148 +493258,2008-05-31 08:00:00,KIDNAPPING,INGLESIDE,0 Block of BLYTHDALE AV,-122.417678812123,37.7107672954351 +493453,2008-05-30 18:33:00,DRUNKENNESS,TARAVAL,SHIELDS ST / RALSTON ST,-122.468941272083,37.7178933995652 +493580,2008-05-30 14:00:00,RUNAWAY,INGLESIDE,100 Block of TEDDY AV,-122.405505689191,37.714186262499 +493643,2008-05-30 11:25:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +494149,2008-05-28 23:39:00,DRUNKENNESS,SOUTHERN,400 Block of JESSIE ST,-122.408534383763,37.7820325646934 +494167,2008-05-28 22:48:00,DRUNKENNESS,SOUTHERN,100 Block of 3RD ST,-122.401027740415,37.7853906306613 +494231,2008-05-28 18:31:00,DRUNKENNESS,SOUTHERN,0 Block of SUMNER ST,-122.410447258669,37.7763230906676 +494619,2008-05-27 19:45:00,DRUNKENNESS,BAYVIEW,1500 Block of BAY SHORE BL,-122.401096851568,37.7245556697717 +494670,2008-05-27 17:30:00,ARSON,SOUTHERN,100 Block of SOUTHPARK AV,-122.394434280881,37.7813440864506 +494687,2008-05-27 17:24:00,DRUNKENNESS,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.411268613368,37.782250087316704 +494689,2008-05-27 17:24:00,DRUNKENNESS,SOUTHERN,7TH ST / MARKET ST,-122.41251534135598,37.78047774805079 +494717,2008-05-27 16:00:00,ARSON,BAYVIEW,400 Block of MISSISSIPPI ST,-122.39448088128,37.7607630881644 +494937,2008-05-26 22:29:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +494984,2008-05-26 19:44:00,ARSON,BAYVIEW,100 Block of DWIGHT ST,-122.40357439523198,37.7235942995166 +494990,2008-05-26 19:40:00,KIDNAPPING,SOUTHERN,300 Block of CLEMENTINA ST,-122.40232147638,37.78203871461721 +495044,2008-05-26 17:00:00,KIDNAPPING,PARK,1200 Block of 2ND AV,-122.458915650574,37.7648144111372 +495241,2008-05-26 03:00:00,KIDNAPPING,CENTRAL,1000 Block of BUSH ST,-122.414576897,37.7894768075723 +495254,2008-05-26 02:00:00,ARSON,PARK,500 Block of CLAYTON ST,-122.44860323405,37.7702641424521 +495256,2008-05-26 01:40:00,KIDNAPPING,TARAVAL,OCEAN AV / HAROLD AV,-122.453105673099,37.72324440258609 +495303,2008-05-18 22:10:00,DRUNKENNESS,SOUTHERN,TURK ST / MASON ST,-122.408953598279,37.783287873572 +495433,2008-05-18 15:45:00,DRUNKENNESS,RICHMOND,FULTON ST / 30TH AV,-122.489538601712,37.772324696627 +495508,2008-05-18 12:00:00,RUNAWAY,TARAVAL,1600 Block of GREAT HY,-122.508685524013,37.755328180203 +495689,2008-05-17 21:30:00,RUNAWAY,BAYVIEW,0 Block of ARDATH CT,-122.382353196281,37.7344311999662 +495955,2008-05-17 10:00:00,KIDNAPPING,CENTRAL,700 Block of GRANT AV,-122.406246184185,37.793611227697 +496028,2008-05-17 01:08:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +496065,2008-05-16 22:55:00,DRUNKENNESS,SOUTHERN,MINNA ST / 8TH ST,-122.412620258006,37.7770259271797 +496096,2008-05-16 21:13:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.416551372097,37.752409559190895 +496126,2008-05-16 19:26:00,DRUNKENNESS,TENDERLOIN,0 Block of TAYLOR ST,-122.41055128181002,37.78250255901021 +496217,2008-05-16 15:00:00,RUNAWAY,TARAVAL,2100 Block of 17TH AV,-122.473810572545,37.7477919273928 +496220,2008-05-16 15:00:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +496404,2008-05-16 01:25:00,DRUNKENNESS,MISSION,3200 Block of 16TH ST,-122.424368416112,37.7648224781504 +496475,2008-05-15 21:03:00,KIDNAPPING,NORTHERN,900 Block of POLK ST,-122.419525009903,37.7852049537761 +496591,2008-05-15 15:25:00,ARSON,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +496634,2008-05-15 12:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +496816,2008-05-14 21:25:00,ARSON,BAYVIEW,CAROLINA ST / 15TH ST,-122.400879514441,37.7674890283426 +497153,2008-05-14 00:58:00,DRUNKENNESS,TARAVAL,34TH AV / ULLOA ST,-122.491632983612,37.7404739345603 +497251,2008-05-13 18:13:00,DRUNKENNESS,BAYVIEW,800 Block of 22ND ST,-122.389733161027,37.75779943924179 +497276,2008-05-13 17:18:00,DRUNKENNESS,CENTRAL,2000 Block of MASON ST,-122.412810150813,37.80204733378471 +497281,2008-05-13 17:00:00,ARSON,SOUTHERN,500 Block of 5TH ST,-122.39998111123998,37.7776242389287 +497487,2008-05-13 00:15:00,ARSON,SOUTHERN,900 Block of BRYANT ST,-122.40577312059798,37.7733935593284 +497565,2008-05-12 18:49:00,DRUNKENNESS,SOUTHERN,MARKET ST / MASON ST,-122.408953598279,37.783287873572 +497644,2008-05-12 15:15:00,ARSON,SOUTHERN,500 Block of 5TH ST,-122.39998111123998,37.7776242389287 +497753,2008-05-12 08:00:00,KIDNAPPING,BAYVIEW,PALOU AV / JENNINGS ST,-122.385290220991,37.7307907400744 +497819,2008-05-04 23:30:00,KIDNAPPING,BAYVIEW,0 Block of HARBOR RD,-122.378392257534,37.7323312464378 +497837,2008-05-04 23:10:00,ARSON,BAYVIEW,1300 Block of QUINT ST,-122.395612677231,37.7380557826258 +497882,2008-05-04 20:30:00,ARSON,BAYVIEW,0 Block of CAMERON WY,-122.387181635995,37.7209669615499 +498009,2008-05-04 13:55:00,KIDNAPPING,MISSION,1200 Block of FLORIDA ST,-122.409919964913,37.7519308956425 +498060,2008-05-04 11:35:00,DRUNKENNESS,NORTHERN,POLK ST / ELLIS ST,-122.419366294797,37.78402804520321 +498159,2008-05-04 01:37:00,DRUNKENNESS,SOUTHERN,0 Block of 1ST ST,-122.397694321211,37.7899359092419 +498175,2008-05-04 00:55:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +498179,2008-05-04 00:33:00,DRUNKENNESS,INGLESIDE,0 Block of GOLDMINE DR,-122.437210226007,37.74381266291221 +498203,2008-05-03 23:17:00,DRUNKENNESS,TARAVAL,1800 Block of IRVING ST,-122.47768839030898,37.7634818583094 +498333,2008-05-03 18:00:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +498446,2008-05-03 13:29:00,DRUNKENNESS,NORTHERN,VANNESS AV / GOLDEN GATE AV,-122.420439512717,37.7810308461783 +498474,2008-05-03 11:30:00,DRUNKENNESS,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +498482,2008-05-03 11:00:00,KIDNAPPING,MISSION,0 Block of HOFF ST,-122.420575720933,37.7641819463712 +498697,2008-05-02 21:05:00,ARSON,RICHMOND,600 Block of 23RD AV,-122.482318904044,37.775446151841 +498705,2008-05-02 20:51:00,KIDNAPPING,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +498711,2008-05-02 20:30:00,KIDNAPPING,INGLESIDE,400 Block of SUNRISE WY,-122.416442382139,37.7097707300435 +498879,2008-05-02 14:31:00,DRUNKENNESS,PARK,HAIGHT ST / BUENAVISTAWEST AV,-122.443311949602,37.7704697548539 +499061,2008-05-02 00:07:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.418270696719,37.8078519838014 +499112,2008-05-01 21:35:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +499134,2008-05-01 20:53:00,DRUNKENNESS,CENTRAL,1200 Block of GRANT AV,-122.407110077805,37.7986457830055 +499148,2008-05-01 20:19:00,DRUNKENNESS,MISSION,VALENCIA ST / 24TH ST,-122.420665771329,37.7521041553051 +499166,2008-05-01 19:26:00,DRUNKENNESS,TARAVAL,0 Block of CHUMASERO DR,-122.472972400524,37.71323913143979 +499193,2008-05-01 18:16:00,DRUNKENNESS,NORTHERN,SANCHEZ ST / DUBOCE AV,-122.431571409363,37.7693057403579 +499229,2008-05-01 16:55:00,DRUNKENNESS,SOUTHERN,MARKET ST / JONES ST,-122.411979487494,37.7809039696758 +499377,2008-05-01 10:35:00,ARSON,SOUTHERN,1500 Block of MISSION ST,-122.418236975025,37.7731900601284 +499475,2008-05-01 05:00:00,ARSON,NORTHERN,2400 Block of PACIFIC AV,-122.435562144937,37.7931857580732 +499493,2008-05-01 01:30:00,DRUNKENNESS,RICHMOND,400 Block of 21ST AV,-122.480448291968,37.7792984761341 +499589,2008-04-30 20:02:00,DRUNKENNESS,MISSION,400 Block of VALENCIA ST,-122.421935077177,37.7661343875141 +499987,2008-04-29 17:52:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +500088,2008-04-29 13:22:00,KIDNAPPING,NORTHERN,600 Block of FULTON ST,-122.428249599273,37.7780677663985 +500172,2008-04-29 09:00:00,RUNAWAY,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +500194,2008-04-29 07:40:00,ARSON,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375605171962,37.730721521570295 +500608,2008-04-28 00:30:00,KIDNAPPING,MISSION,MISSION ST / 20TH ST,-122.419052694349,37.7586324051562 +500851,2008-04-20 13:45:00,KIDNAPPING,CENTRAL,700 Block of GEARY ST,-122.415632654294,37.7863587808386 +501013,2008-04-20 01:02:00,DRUNKENNESS,NORTHERN,200 Block of PIXLEY ST,-122.436623173287,37.7984345820405 +501019,2008-04-20 00:55:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +501098,2008-04-19 22:00:00,KIDNAPPING,INGLESIDE,100 Block of LAURA ST,-122.451866647452,37.7111787233812 +501103,2008-04-19 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +501159,2008-04-19 19:00:00,DRUNKENNESS,CENTRAL,KEARNY ST / JACKSON ST,-122.405145685472,37.7962104530518 +501166,2008-04-19 18:35:00,DRUNKENNESS,TARAVAL,1200 Block of IRVING ST,-122.47114555295,37.7638796121694 +501428,2008-04-19 02:50:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +501434,2008-04-19 02:20:00,DRUNKENNESS,TARAVAL,100 Block of RALSTON ST,-122.468976988627,37.7151943513234 +501454,2008-04-19 00:30:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +501491,2008-04-18 22:42:00,ARSON,BAYVIEW,1100 Block of THOMAS AV,-122.382852175823,37.7256943991515 +501514,2008-04-18 21:30:00,DRUNKENNESS,CENTRAL,300 Block of THE EMBARCADERONORTH ST,-122.396374439116,37.79805325280579 +501728,2008-04-18 12:00:00,RUNAWAY,PARK,600 Block of LYON ST,-122.443160224712,37.7767128942951 +501802,2008-04-18 07:15:00,RUNAWAY,INGLESIDE,4800 Block of MISSION ST,-122.437216421378,37.7213272618826 +501852,2008-04-17 23:50:00,ARSON,PARK,1800 Block of PAGE ST,-122.451236373142,37.770359801981705 +501865,2008-04-17 23:30:00,KIDNAPPING,MISSION,1900 Block of MARKET ST,-122.426498379985,37.769249045094 +501881,2008-04-17 22:32:00,DRUNKENNESS,MISSION,4200 Block of 26TH ST,-122.434895524383,37.7479737093924 +502160,2008-04-17 02:45:00,KIDNAPPING,BAYVIEW,1000 Block of CONNECTICUT ST,-122.397089183868,37.753598788032704 +502187,2008-04-16 23:57:00,DRUNKENNESS,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +502193,2008-04-16 23:21:00,KIDNAPPING,NORTHERN,0 Block of STARRKING WY,-122.423733747729,37.7849596335701 +502222,2008-04-16 21:37:00,KIDNAPPING,MISSION,300 Block of GUERRERO ST,-122.42429614527,37.7655714839397 +502292,2008-04-16 18:00:00,ARSON,BAYVIEW,800 Block of INGERSON AV,-122.390713923618,37.717724598154994 +502333,2008-04-16 16:15:00,ARSON,PARK,1400 Block of HAIGHT ST,-122.446143672039,37.7700527182372 +502584,2008-04-16 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +502599,2008-04-15 23:00:00,ARSON,TENDERLOIN,300 Block of HYDE ST,-122.41604728066002,37.7839824654149 +502693,2008-04-15 17:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +502697,2008-04-15 17:30:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 17TH AV,-122.473553877396,37.7431432692275 +502764,2008-04-15 14:45:00,ARSON,INGLESIDE,400 Block of RAYMOND AV,-122.412457953057,37.7147347356846 +502951,2008-04-15 00:01:00,KIDNAPPING,NORTHERN,1000 Block of GEARY ST,-122.420571110949,37.7857331120575 +503082,2008-04-14 17:55:00,DRUNKENNESS,MISSION,2800 Block of 24TH ST,-122.408664686116,37.7528787651491 +503145,2008-04-14 15:20:00,DRUNKENNESS,BAYVIEW,1600 Block of PALOU AV,-122.391849084977,37.7345805334314 +503631,2008-04-06 01:30:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +503635,2008-04-06 01:26:00,DRUNKENNESS,SOUTHERN,4TH ST / FREELON ST,-122.397066698493,37.7787523253223 +503760,2008-04-05 20:00:00,RUNAWAY,NORTHERN,900 Block of MCALLISTER ST,-122.428442307611,37.7789982847524 +503879,2008-04-05 15:30:00,KIDNAPPING,SOUTHERN,1500 Block of HOWARD ST,-122.416667284185,37.772123277472 +503971,2008-04-05 09:45:00,KIDNAPPING,INGLESIDE,200 Block of JUANITA WY,-122.455215888102,37.741318084389 +504023,2008-04-05 05:34:00,ARSON,TENDERLOIN,500 Block of ELLIS ST,-122.414615262229,37.784689282473 +504029,2008-04-05 03:50:00,DRUNKENNESS,TARAVAL,100 Block of HUNTINGTON DR,-122.49581562175,37.7320876766525 +504033,2008-04-05 02:58:00,DRUNKENNESS,PARK,HAIGHT ST / DIVISADERO ST,-122.437048523435,37.7712678186367 +504069,2008-04-05 00:26:00,ARSON,TARAVAL,500 Block of JOHNMUIR DR,-122.49206801734,37.714361549875605 +504090,2008-04-04 23:36:00,DRUNKENNESS,CENTRAL,1000 Block of HYDE ST,-122.417368206741,37.79050941515951 +504115,2008-04-04 22:45:00,DRUNKENNESS,NORTHERN,800 Block of LARKIN ST,-122.417885441042,37.7854378471968 +504125,2008-04-04 22:05:00,DRUNKENNESS,MISSION,24TH ST / BRYANT ST,-122.409131939489,37.7527969985584 +504246,2008-04-04 17:00:00,KIDNAPPING,MISSION,17TH ST / MISSION ST,-122.419515708406,37.7634292328496 +504423,2008-04-04 08:00:00,RUNAWAY,TARAVAL,1900 Block of OCEAN AV,-122.46256031901,37.7252945346576 +504822,2008-04-02 22:23:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +504831,2008-04-02 21:30:00,ARSON,RICHMOND,3RD AV / CLEMENT ST,-122.461210550383,37.7830866899279 +504851,2008-04-02 20:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +505063,2008-04-02 07:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +505146,2008-04-01 22:08:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +505152,2008-04-01 22:00:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +505187,2008-04-01 20:25:00,DRUNKENNESS,CENTRAL,900 Block of COLUMBUS AV,-122.414263444238,37.8031918743285 +505509,2008-04-01 01:31:00,DRUNKENNESS,SOUTHERN,0 Block of MISSION ST,-122.393682610434,37.7929122863777 +505558,2008-04-01 00:01:00,KIDNAPPING,TARAVAL,100 Block of FARALLONES ST,-122.457577558464,37.7141207605828 +505589,2008-03-31 23:57:00,DRUNKENNESS,TARAVAL,JUDAH ST / 37TH AV,-122.464041427693,37.7622671733047 +505655,2008-03-31 19:45:00,KIDNAPPING,MISSION,1700 Block of 15TH ST,-122.423775038029,37.7664900497694 +505747,2008-03-31 15:40:00,DRUNKENNESS,SOUTHERN,HOWARD ST / LANGTON ST,-122.409924033746,37.7775530955225 +505987,2008-03-23 19:46:00,DRUNKENNESS,NORTHERN,VANNESS AV / CALIFORNIA ST,-122.422330464198,37.790369068882 +506111,2008-03-23 13:30:00,ARSON,SOUTHERN,100 Block of 9TH ST,-122.413980520967,37.7755687325824 +506250,2008-03-23 01:45:00,ARSON,INGLESIDE,2400 Block of SAN JOSE AV,-122.447817185689,37.719229458451295 +506490,2008-03-22 14:00:00,ARSON,RICHMOND,300 Block of 24TH AV,-122.483937764676,37.7829828591488 +506771,2008-03-21 18:00:00,KIDNAPPING,NORTHERN,1200 Block of TURK ST,-122.428818526724,37.7808642652455 +506858,2008-03-21 13:10:00,KIDNAPPING,BAYVIEW,100 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +506938,2008-03-21 07:15:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +506972,2008-03-21 01:15:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +507037,2008-03-20 21:19:00,KIDNAPPING,INGLESIDE,900 Block of GOETTINGEN ST,-122.403933384073,37.7203854060993 +507102,2008-03-20 17:15:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +507298,2008-03-20 04:10:00,ARSON,NORTHERN,1400 Block of LAGUNA ST,-122.427815582933,37.7844480895156 +507319,2008-03-20 00:45:00,ARSON,BAYVIEW,4800 Block of 3RD ST,-122.390705516025,37.734368010663 +507401,2008-03-19 20:30:00,ARSON,PARK,700 Block of BURNETT AV,-122.445470487829,37.7506825120195 +507531,2008-03-19 15:30:00,KIDNAPPING,BAYVIEW,100 Block of KISKA RD,-122.376054792432,37.7300559760912 +507564,2008-03-19 14:00:00,KIDNAPPING,BAYVIEW,3RD ST / FITZGERALD AV,-122.395265488404,37.7232222390124 +507572,2008-03-19 13:55:00,KIDNAPPING,TENDERLOIN,MARKET ST / HYDE ST,-122.414743835382,37.77871926278901 +507727,2008-03-19 04:00:00,ARSON,BAYVIEW,100 Block of KISKA RD,-122.375989158092,37.7301576924252 +507771,2008-03-18 21:58:00,DRUNKENNESS,MISSION,CAPP ST / 17TH ST,-122.418486296575,37.7634954373144 +507787,2008-03-18 21:13:00,DRUNKENNESS,SOUTHERN,0 Block of 1ST ST,-122.397792391989,37.78985838128421 +507801,2008-03-18 20:46:00,ARSON,BAYVIEW,500 Block of 19TH ST,-122.38820179425,37.7618506557786 +507869,2008-03-18 17:45:00,DRUNKENNESS,MISSION,2900 Block of 21ST ST,-122.413988938216,37.757275784974 +508136,2008-03-18 02:00:00,ARSON,RICHMOND,400 Block of 6TH AV,-122.464141682663,37.7800393578965 +508160,2008-03-18 00:01:00,RUNAWAY,RICHMOND,500 Block of 6TH AV,-122.464007406436,37.7781481010942 +508212,2008-03-17 21:16:00,DRUNKENNESS,NORTHERN,POLK ST / CEDAR ST,-122.419834938618,37.78635803627429 +508236,2008-03-17 20:03:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +508246,2008-03-17 19:25:00,ARSON,SOUTHERN,300 Block of FREMONT ST,-122.392859290723,37.7873303376165 +508314,2008-03-17 17:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +508386,2008-03-17 14:00:00,DRUNKENNESS,MISSION,2300 Block of FOLSOM ST,-122.41469551481,37.7596861764245 +508425,2008-03-17 12:30:00,DRUNKENNESS,PARK,1200 Block of HAIGHT ST,-122.443649974762,37.7704818921334 +508437,2008-03-17 12:00:00,RUNAWAY,PARK,100 Block of PIERCE ST,-122.433711096406,37.7712220443581 +508661,2008-03-09 22:05:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +508884,2008-03-09 11:14:00,DRUNKENNESS,SOUTHERN,7TH ST / MINNA ST,-122.410405602135,37.778784148603286 +508956,2008-03-09 02:00:00,KIDNAPPING,SOUTHERN,400 Block of BERRY ST,-122.3982226939,37.772016123181295 +509071,2008-03-08 21:44:00,ARSON,BAYVIEW,700 Block of GOETTINGEN ST,-122.404802040985,37.7224635261289 +509141,2008-03-08 19:00:00,DRUNKENNESS,MISSION,FOLSOM ST / 24TH ST,-122.414089000708,37.75250507857579 +509220,2008-03-08 16:20:00,ARSON,MISSION,1100 Block of YORK ST,-122.40833337913,37.7536331088001 +509309,2008-03-08 12:34:00,DRUNKENNESS,TARAVAL,1200 Block of 20TH AV,-122.478325615864,37.7644357771555 +509446,2008-03-08 00:55:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +509526,2008-03-07 21:09:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +509709,2008-03-07 14:00:00,ARSON,NORTHERN,3500 Block of FILLMORE ST,-122.436328202384,37.8017515400431 +509733,2008-03-07 12:57:00,DRUNKENNESS,CENTRAL,HYDE ST / BEACH ST,-122.420564122317,37.8066567824467 +509858,2008-03-07 03:25:00,ARSON,INGLESIDE,MUNICH ST / ROLPH ST,-122.433432364658,37.7121114012983 +509990,2008-03-06 18:12:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +510066,2008-03-06 15:45:00,ARSON,NORTHERN,CHESTNUT ST / BUCHANAN ST,-122.432959444152,37.8012351482991 +510192,2008-03-06 10:50:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +510301,2008-03-06 01:30:00,ARSON,INGLESIDE,1200 Block of BOWDOIN ST,-122.408310780232,37.7203514651097 +510315,2008-03-06 00:30:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +510321,2008-03-06 00:15:00,DRUNKENNESS,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +510421,2008-03-05 19:54:00,DRUNKENNESS,MISSION,24TH ST / TREAT AV,-122.41299748806802,37.7525722462226 +510424,2008-03-05 19:47:00,DRUNKENNESS,CENTRAL,1000 Block of HYDE ST,-122.41723150829,37.79052671887821 +510427,2008-03-05 19:44:00,DRUNKENNESS,MISSION,CAPP ST / 24TH ST,-122.417360139477,37.7523063170181 +510700,2008-03-05 06:40:00,ARSON,NORTHERN,1000 Block of POST ST,-122.419126295342,37.7869849580362 +510747,2008-03-05 00:28:00,DRUNKENNESS,SOUTHERN,900 Block of MISSION ST,-122.406819073383,37.7823859229171 +510842,2008-03-04 19:00:00,KIDNAPPING,BAYVIEW,3RD ST / PALOU AV,-122.390971734551,37.73401521807229 +511038,2008-03-04 10:38:00,KIDNAPPING,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +511052,2008-03-04 10:00:00,ARSON,SOUTHERN,100 Block of SHIPLEY ST,-122.401699411207,37.7806522894696 +511111,2008-03-04 04:10:00,ARSON,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +511132,2008-03-04 01:00:00,DRUNKENNESS,NORTHERN,1700 Block of POLK ST,-122.42121146461,37.7928202341314 +511235,2008-03-03 19:09:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.414634473592,37.7525276230522 +511251,2008-03-03 18:44:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +511290,2008-03-03 17:24:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345148,37.7839916768161 +511352,2008-03-03 13:30:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436327167191,37.7227645025561 +511479,2008-03-03 08:00:00,KIDNAPPING,PARK,1100 Block of PIERCE ST,-122.435590528188,37.7805435736467 +511508,2008-03-03 03:55:00,ARSON,TARAVAL,0 Block of CHUMASERO DR,-122.472875861339,37.713317784448 +511603,2008-02-24 20:30:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.410699657634,37.7869881885308 +511661,2008-02-24 18:18:00,ARSON,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +511680,2008-02-24 17:45:00,DRUNKENNESS,NORTHERN,1800 Block of FILLMORE ST,-122.4332992124,37.7865706865797 +511744,2008-02-24 14:57:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418940110957,37.7860492230028 +511748,2008-02-24 14:55:00,KIDNAPPING,SOUTHERN,0 Block of MOSS ST,-122.40811239746,37.7777588128811 +511854,2008-02-24 04:09:00,DRUNKENNESS,NORTHERN,1300 Block of BUSH ST,-122.419486234049,37.7887480806774 +511902,2008-02-24 00:55:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +512356,2008-02-22 21:43:00,DRUNKENNESS,PARK,DIVISADERO ST / OAK ST,-122.437422446098,37.7731323316038 +512369,2008-02-22 21:00:00,RUNAWAY,TARAVAL,0 Block of EDGAR PL,-122.452222836761,37.7209145102852 +512375,2008-02-22 20:43:00,ARSON,CENTRAL,800 Block of BUSH ST,-122.411281399822,37.7898978570344 +512466,2008-02-22 16:55:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +512801,2008-02-21 18:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +512863,2008-02-21 16:00:00,DRUNKENNESS,SOUTHERN,100 Block of 12TH ST,-122.417628311343,37.7719781799261 +512893,2008-02-21 14:34:00,DRUNKENNESS,RICHMOND,GEARY BL / 18TH AV,-122.477241022391,37.7804373318996 +513021,2008-02-21 03:55:00,KIDNAPPING,CENTRAL,0 Block of DRUMM ST,-122.396556426173,37.7941169057941 +513067,2008-02-21 00:01:00,RUNAWAY,NORTHERN,1500 Block of EDDY ST,-122.433155869003,37.78126734681 +513092,2008-02-20 23:05:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +513435,2008-02-20 02:53:00,DRUNKENNESS,SOUTHERN,200 Block of 8TH ST,-122.411271940537,37.7760329501244 +513475,2008-02-19 23:20:00,KIDNAPPING,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +513782,2008-02-19 00:20:00,DRUNKENNESS,TARAVAL,1300 Block of 48TH AV,-122.508200886817,37.761239153640496 +513930,2008-02-18 17:06:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +513951,2008-02-18 16:05:00,KIDNAPPING,SOUTHERN,BRANNAN ST / THE EMBARCADEROSOUTH ST,-122.388190455114,37.7847731760596 +514134,2008-02-18 02:30:00,KIDNAPPING,INGLESIDE,900 Block of RUSSIA AV,-122.429531287536,37.7179979953375 +514141,2008-02-18 02:22:00,DRUNKENNESS,NORTHERN,POLK ST / OFARRELL ST,-122.419549568783,37.7849590112628 +514424,2008-02-10 10:35:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +514426,2008-02-10 10:30:00,KIDNAPPING,TARAVAL,2300 Block of 24TH AV,-122.48118317163,37.7437268170337 +514493,2008-02-10 02:17:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +514528,2008-02-10 00:22:00,DRUNKENNESS,PARK,1800 Block of WALLER ST,-122.454330105396,37.7681530111159 +514769,2008-02-09 14:00:00,KIDNAPPING,TARAVAL,1300 Block of 48TH AV,-122.508200886817,37.761239153640496 +514808,2008-02-09 12:00:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +514844,2008-02-09 09:36:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +514853,2008-02-09 09:00:00,KIDNAPPING,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +514858,2008-02-09 09:00:00,KIDNAPPING,INGLESIDE,0 Block of SGTJOHNVYOUNG LN,-122.444707063455,37.7249307267936 +514859,2008-02-09 08:50:00,ARSON,SOUTHERN,ALAMEDA ST / VERMONT ST,-122.404878690799,37.7685314732448 +514916,2008-02-09 01:06:00,DRUNKENNESS,BAYVIEW,2500 Block of SAN BRUNO AV,-122.404583674451,37.730194433853896 +514932,2008-02-09 00:30:00,DRUNKENNESS,SOUTHERN,0 Block of SOUTH VAN NESS AV,-122.418338317697,37.7726641818375 +514939,2008-02-09 00:10:00,RUNAWAY,TARAVAL,100 Block of JULES AV,-122.461169042517,37.72094221707541 +514954,2008-02-08 23:20:00,DRUNKENNESS,NORTHERN,2400 Block of LOMBARD ST,-122.441854041374,37.7992097167784 +515123,2008-02-08 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +515136,2008-02-08 14:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +515252,2008-02-08 08:30:00,DRUNKENNESS,CENTRAL,VALLEJO ST / GRANT AV,-122.407208951402,37.7987756652736 +515309,2008-02-08 02:00:00,KIDNAPPING,MISSION,HARTFORD ST / 17TH ST,-122.434063454683,37.762548636754495 +515392,2008-02-07 21:10:00,DRUNKENNESS,TARAVAL,1500 Block of 47TH AV,-122.50673190627,37.757564416717 +515437,2008-02-07 19:39:00,KIDNAPPING,INGLESIDE,100 Block of VIENNA ST,-122.426274307733,37.725886443243496 +515531,2008-02-07 16:00:00,RUNAWAY,RICHMOND,500 Block of 43RD AV,-122.504018368053,37.7782262967305 +515858,2008-02-06 17:18:00,RUNAWAY,BAYVIEW,200 Block of HARBOR RD,-122.378268018481,37.7323807302226 +516146,2008-02-05 20:00:00,ARSON,TARAVAL,1400 Block of 42ND AV,-122.501502160824,37.759665814436296 +516250,2008-02-05 15:09:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +516251,2008-02-05 15:03:00,DRUNKENNESS,CENTRAL,GEARY ST / HYDE ST,-122.416452065595,37.7863086885804 +516381,2008-02-05 08:00:00,ARSON,CENTRAL,1300 Block of CALIFORNIA ST,-122.416773563916,37.7911165972854 +516388,2008-02-05 07:47:00,KIDNAPPING,BAYVIEW,1600 Block of DAVIDSON AV,-122.392447441376,37.746275498295 +516392,2008-02-05 07:47:00,KIDNAPPING,BAYVIEW,1600 Block of DAVIDSON AV,-122.392447441376,37.746275498295 +516444,2008-02-05 01:20:00,KIDNAPPING,BAYVIEW,700 Block of MISSOURI ST,-122.395771897062,37.7572927810101 +516520,2008-02-04 21:20:00,KIDNAPPING,INGLESIDE,100 Block of BRAZIL AV,-122.43358909542,37.7241677671483 +516748,2008-02-04 09:46:00,DRUNKENNESS,PARK,400 Block of PARNASSUS AV,-122.458267329165,37.76341585648829 +516803,2008-02-04 03:04:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +516915,2008-01-27 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +516926,2008-01-27 18:25:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +516969,2008-01-27 16:20:00,KIDNAPPING,MISSION,16TH ST / ALABAMA ST,-122.41242010227,37.7654893909509 +517034,2008-01-27 12:00:00,KIDNAPPING,BAYVIEW,800 Block of CHINABASIN ST,-122.386775025935,37.765377517215 +517157,2008-01-26 23:48:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413287527194,37.7711962032376 +517229,2008-01-26 20:05:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +517418,2008-01-26 03:18:00,DRUNKENNESS,TARAVAL,2500 Block of 42ND AV,-122.500059161805,37.7391533012237 +517424,2008-01-26 03:00:00,KIDNAPPING,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +517425,2008-01-26 03:00:00,KIDNAPPING,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +517435,2008-01-26 02:08:00,DRUNKENNESS,TARAVAL,19TH AV / TARAVAL ST,-122.475644251197,37.7430505534925 +517459,2008-01-26 00:09:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +517530,2008-01-25 21:25:00,DRUNKENNESS,NORTHERN,2200 Block of CHESTNUT ST,-122.439895933785,37.8002979847002 +517612,2008-01-25 16:50:00,KIDNAPPING,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.415120589338,37.7817589366405 +517876,2008-01-24 19:55:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +517915,2008-01-24 17:51:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +518060,2008-01-24 10:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +518155,2008-01-23 23:27:00,DRUNKENNESS,INGLESIDE,LEESE ST / PARK ST,-122.423639781183,37.736689305729 +518170,2008-01-23 22:35:00,ARSON,BAYVIEW,1300 Block of QUINT ST,-122.395612677231,37.7380557826258 +518378,2008-01-23 13:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +518386,2008-01-23 13:04:00,DRUNKENNESS,CENTRAL,400 Block of SUTTER ST,-122.407802668376,37.7893818905021 +518909,2008-01-22 01:17:00,DRUNKENNESS,RICHMOND,GEARY BL / 30TH AV,-122.490096386112,37.7798392009729 +518912,2008-01-22 01:00:00,RUNAWAY,TARAVAL,0 Block of MINERVA ST,-122.454821597623,37.7156897626856 +518921,2008-01-22 00:29:00,DRUNKENNESS,SOUTHERN,800 Block of MISSION ST,-122.404636264759,37.7842645474624 +518962,2008-01-21 22:23:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +519036,2008-01-21 17:41:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +519261,2008-01-21 04:00:00,KIDNAPPING,SOUTHERN,100 Block of CLARA ST,-122.401084585059,37.780401960243104 +519311,2008-01-21 00:01:00,DRUNKENNESS,BAYVIEW,2600 Block of SAN BRUNO AV,-122.403775864685,37.7282405026531 +519326,2008-01-13 23:10:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +519357,2008-01-13 21:37:00,DRUNKENNESS,TENDERLOIN,POWELL ST / OFARRELL ST,-122.408040474858,37.7864094033618 +519377,2008-01-13 20:47:00,ARSON,BAYVIEW,1400 Block of YOSEMITE AV,-122.388923737371,37.72522533042871 +519380,2008-01-13 20:39:00,DRUNKENNESS,MISSION,TREAT AV / 24TH ST,-122.41299748806802,37.7525722462226 +519424,2008-01-13 18:00:00,DRUNKENNESS,NORTHERN,2000 Block of SUTTER ST,-122.434121356001,37.7860330497327 +519467,2008-01-13 16:00:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +519546,2008-01-13 12:00:00,KIDNAPPING,INGLESIDE,LAIDLEY ST / 30TH ST,-122.432225748656,37.7417817366112 +519549,2008-01-13 12:00:00,KIDNAPPING,INGLESIDE,LAIDLEY ST / 30TH ST,-122.432225748656,37.7417817366112 +519653,2008-01-13 01:37:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +519671,2008-01-13 00:30:00,KIDNAPPING,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +519743,2008-01-12 21:54:00,DRUNKENNESS,MISSION,3300 Block of CESAR CHAVEZ ST,-122.417067044038,37.748285429414 +519762,2008-01-12 21:00:00,KIDNAPPING,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +519884,2008-01-12 16:12:00,KIDNAPPING,NORTHERN,900 Block of VANNESS AV,-122.421193769309,37.7840443977954 +519955,2008-01-12 13:00:00,RUNAWAY,SOUTHERN,0 Block of COLUMBIASQUARE ST,-122.405602257452,37.7772651164878 +520001,2008-01-12 10:45:00,RUNAWAY,BAYVIEW,1300 Block of GILMAN AV,-122.394646250335,37.7219920197814 +520053,2008-01-12 04:50:00,KIDNAPPING,TARAVAL,17TH AV / TARAVAL ST,-122.473553877396,37.7431432692275 +520090,2008-01-12 01:18:00,KIDNAPPING,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +520121,2008-01-11 23:40:00,DRUNKENNESS,MISSION,4000 Block of 18TH ST,-122.434446928667,37.7608670671665 +520184,2008-01-11 20:00:00,DRUNKENNESS,RICHMOND,400 Block of 26TH AV,-122.485806034088,37.7809908061782 +520285,2008-01-11 16:45:00,KIDNAPPING,RICHMOND,7200 Block of FULTON ST,-122.509373256655,37.77147513511621 +520311,2008-01-11 16:00:00,DRUNKENNESS,INGLESIDE,300 Block of BRAZIL AV,-122.432060630773,37.7233077717239 +520456,2008-01-11 03:00:00,ARSON,INGLESIDE,5800 Block of MISSION ST,-122.45181851562,37.7091542140065 +520568,2008-01-10 19:39:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +520586,2008-01-10 19:04:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +520660,2008-01-10 15:53:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +520696,2008-01-10 14:30:00,ARSON,INGLESIDE,100 Block of EXCELSIOR AV,-122.432412156616,37.7257229240122 +521109,2008-01-09 13:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +521150,2008-01-09 09:45:00,ARSON,NORTHERN,3600 Block of LYON ST,-122.44827840533002,37.804271887891005 +521216,2008-01-09 02:19:00,DRUNKENNESS,INGLESIDE,5700 Block of MISSION ST,-122.450297197773,37.7095519408421 +521470,2008-01-08 12:30:00,ARSON,TARAVAL,3100 Block of ORTEGA ST,-122.497242493708,37.7513958957007 +521528,2008-01-08 09:00:00,ARSON,RICHMOND,500 Block of 47TH AV,-122.508160181225,37.7780379262238 +521579,2008-01-08 04:00:00,KIDNAPPING,NORTHERN,GEARY BL / VANNESS AV,-122.421395819115,37.7856843389472 +521678,2008-01-07 21:00:00,RUNAWAY,TARAVAL,1600 Block of 41ST AV,-122.500168595466,37.7559758377146 +521702,2008-01-07 20:00:00,KIDNAPPING,INGLESIDE,2000 Block of SAN JOSE AV,-122.443987904351,37.7239789103178 +521711,2008-01-07 19:30:00,KIDNAPPING,BAYVIEW,0 Block of NICHOLS WY,-122.38724435334,37.7195130001474 +521716,2008-01-07 19:20:00,ARSON,TARAVAL,500 Block of JOHNMUIR DR,-122.491949364794,37.7144179707516 +521762,2008-01-07 17:44:00,KIDNAPPING,RICHMOND,2100 Block of CLEMENT ST,-122.482211289161,37.782184421473495 +521765,2008-01-07 17:30:00,ARSON,RICHMOND,9TH AV / LAKE ST,-122.467898698969,37.786532532197214 +522059,2007-12-30 22:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +522297,2007-12-30 02:55:00,DRUNKENNESS,INGLESIDE,300 Block of MADRID ST,-122.430995189317,37.7239029233141 +522415,2007-12-29 20:00:00,KIDNAPPING,CENTRAL,400 Block of DAVIS CT,-122.398324392842,37.7966976738334 +522420,2007-12-29 20:00:00,KIDNAPPING,CENTRAL,400 Block of DAVIS CT,-122.398324392842,37.7966976738334 +522638,2007-12-29 03:15:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +522662,2007-12-29 01:36:00,ARSON,BAYVIEW,600 Block of 25TH ST,-122.384402602201,37.75297493636421 +522733,2007-12-28 21:45:00,RUNAWAY,MISSION,2900 Block of 25TH ST,-122.408512518978,37.7512835732386 +522920,2007-12-28 14:00:00,DRUNKENNESS,TENDERLOIN,HYDE ST / TURK ST,-122.415694922134,37.7825851968467 +523468,2007-12-26 19:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +523471,2007-12-26 18:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +523628,2007-12-26 09:15:00,KIDNAPPING,SOUTHERN,9TH ST / MISSION ST,-122.414714295579,37.7762310404758 +523761,2007-12-25 16:34:00,DRUNKENNESS,TARAVAL,ORTEGA ST / 20TH AV,-122.477416656326,37.75232753829 +523776,2007-12-25 15:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +523900,2007-12-24 23:18:00,DRUNKENNESS,SOUTHERN,LASKIE ST / MISSION ST,-122.414110572621,37.776707819515295 +523909,2007-12-24 22:52:00,DRUNKENNESS,MISSION,MISSION ST / 24TH ST,-122.418448186101,37.7522391652625 +523952,2007-12-24 19:40:00,KIDNAPPING,INGLESIDE,100 Block of ANKENY ST,-122.405661413391,37.7197516365891 +523973,2007-12-24 18:40:00,DRUNKENNESS,MISSION,HAMPSHIRE ST / 24TH ST,-122.407294221804,37.75290641522261 +523984,2007-12-24 18:00:00,KIDNAPPING,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +524048,2007-12-24 14:00:00,ARSON,RICHMOND,1800 Block of SCOTT ST,-122.438557871099,37.7868585831259 +524182,2007-12-24 00:01:00,KIDNAPPING,NORTHERN,600 Block of HAYES ST,-122.427115347351,37.7764111993722 +524189,2007-12-24 00:01:00,DRUNKENNESS,CENTRAL,800 Block of GEARY ST,-122.417273344939,37.7861493947594 +524301,2007-12-15 18:05:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +524493,2007-12-15 03:30:00,KIDNAPPING,CENTRAL,800 Block of CALIFORNIA ST,-122.408264228212,37.7922104706222 +524516,2007-12-15 01:52:00,DRUNKENNESS,NORTHERN,SACRAMENTO ST / POLK ST,-122.420874632415,37.79149430519061 +524559,2007-12-14 23:38:00,KIDNAPPING,MISSION,16TH ST / BRYANT ST,-122.410488829308,37.765605863870505 +524819,2007-12-14 12:14:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +524930,2007-12-14 01:08:00,DRUNKENNESS,TARAVAL,WESTPORTAL AV / ULLOA ST,-122.465828621989,37.7408907892304 +524979,2007-12-13 22:04:00,DRUNKENNESS,PARK,1800 Block of EDDY ST,-122.438120409301,37.7807473113138 +525353,2007-12-12 22:09:00,DRUNKENNESS,SOUTHERN,0 Block of 7TH ST,-122.412272455406,37.7802039058686 +525448,2007-12-12 18:00:00,DRUNKENNESS,MISSION,3100 Block of CESAR CHAVEZ ST,-122.412594354828,37.748166005622295 +525707,2007-12-12 01:37:00,DRUNKENNESS,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +525720,2007-12-12 00:13:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +525762,2007-12-11 22:10:00,DRUNKENNESS,RICHMOND,400 Block of 6TH AV,-122.464279879446,37.7800332991006 +526127,2007-12-11 04:15:00,ARSON,NORTHERN,1000 Block of POST ST,-122.419126295342,37.7869849580362 +526147,2007-12-11 01:25:00,ARSON,PARK,LOCKSLEY AV / WARREN DR,-122.463227244988,37.7585613680063 +526151,2007-12-11 01:00:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / BROADWAY ST,-122.406669739951,37.7978641744394 +526200,2007-12-10 21:30:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +526287,2007-12-10 18:05:00,KIDNAPPING,BAYVIEW,300 Block of GIRARD ST,-122.404903343063,37.7279456314778 +526386,2007-12-10 14:00:00,RUNAWAY,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +526401,2007-12-10 13:05:00,DRUNKENNESS,MISSION,SHOTWELL ST / 24TH ST,-122.415173665801,37.7524407589917 +526484,2007-12-10 08:10:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +526492,2007-12-10 07:50:00,KIDNAPPING,NORTHERN,400 Block of PAGE ST,-122.428178458093,37.773295406746 +526520,2007-12-10 03:15:00,ARSON,BAYVIEW,JAMESTOWN AV / HUNTERSPTEXPWY EX,-122.381605211192,37.7096901356348 +526521,2007-12-10 03:11:00,DRUNKENNESS,TARAVAL,LA PLAYA ST / JUDAH ST,-122.509138997184,37.7602791548408 +526751,2007-12-02 12:51:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +526765,2007-12-02 12:10:00,RUNAWAY,PARK,100 Block of PIERCE ST,-122.433711096406,37.7712220443581 +526822,2007-12-02 07:47:00,DRUNKENNESS,RICHMOND,400 Block of 9TH AV,-122.467350448491,37.77989721313229 +526834,2007-12-02 05:40:00,ARSON,SOUTHERN,400 Block of MINNA ST,-122.407387172098,37.7810688918781 +526852,2007-12-02 03:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +526871,2007-12-02 02:00:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406428996538,37.7553742889201 +526877,2007-12-02 01:44:00,DRUNKENNESS,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +526895,2007-12-02 00:51:00,DRUNKENNESS,SOUTHERN,200 Block of 11TH ST,-122.414258651144,37.77197236875789 +526921,2007-12-01 23:24:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +526936,2007-12-01 22:56:00,DRUNKENNESS,BAYVIEW,3RD ST / OAKDALE AV,-122.390697630683,37.7347969947349 +526941,2007-12-01 22:35:00,DRUNKENNESS,CENTRAL,1100 Block of KEARNY ST,-122.405418756236,37.7982192359473 +527054,2007-12-01 17:00:00,ARSON,BAYVIEW,WHITNEYYOUNG CR / HAWKINS LN,-122.384866426409,37.7349453624632 +527075,2007-12-01 16:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +527093,2007-12-01 15:17:00,DRUNKENNESS,SOUTHERN,4TH ST / MISSION ST,-122.404270179486,37.78447885387449 +527324,2007-12-01 00:01:00,KIDNAPPING,INGLESIDE,200 Block of BRAZIL AV,-122.432859802415,37.7236903676438 +527366,2007-11-30 22:40:00,DRUNKENNESS,RICHMOND,1400 Block of LAKE ST,-122.474949738849,37.7861543822514 +527371,2007-11-30 22:24:00,DRUNKENNESS,CENTRAL,1300 Block of SACRAMENTO ST,-122.41459097818998,37.792360250298 +527507,2007-11-30 16:45:00,DRUNKENNESS,MISSION,MISSION ST / 19TH ST,-122.419208249507,37.7602340753605 +527530,2007-11-30 16:00:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +527692,2007-11-30 03:53:00,ARSON,INGLESIDE,400 Block of AVALON AV,-122.428909214799,37.7260405310835 +527721,2007-11-30 00:14:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.414224026965,37.7715982798716 +527724,2007-11-30 00:01:00,KIDNAPPING,TARAVAL,EUCALYPTUS DR / 19TH AV,-122.474855245968,37.73106502529829 +527863,2007-11-29 17:23:00,DRUNKENNESS,SOUTHERN,MARKET ST / ANNIE ST,-122.402877651444,37.7880805481483 +528061,2007-11-29 07:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +528174,2007-11-28 20:15:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +528186,2007-11-28 19:53:00,DRUNKENNESS,MISSION,24TH ST / ALABAMA ST,-122.410962664755,37.752684919614 +528601,2007-11-27 17:00:00,KIDNAPPING,MISSION,MISSION ST / 26TH ST,-122.418137290501,37.7490413093633 +528619,2007-11-27 16:30:00,DRUNKENNESS,RICHMOND,LA PLAYA ST / CABRILLO ST,-122.510036841034,37.7732570409944 +528783,2007-11-27 09:00:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +528820,2007-11-27 05:00:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +528857,2007-11-27 00:01:00,KIDNAPPING,SOUTHERN,200 Block of BRANNAN ST,-122.390549349376,37.7829761961573 +528884,2007-11-26 22:22:00,KIDNAPPING,TARAVAL,200 Block of BEVERLY ST,-122.471732199859,37.7206543315544 +528920,2007-11-26 20:15:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +528945,2007-11-26 19:00:00,RUNAWAY,TARAVAL,PLYMOUTH AV / BROAD ST,-122.456050465866,37.7131938450626 +528956,2007-11-26 18:20:00,DRUNKENNESS,RICHMOND,5400 Block of GEARY BL,-122.47777209017,37.7802849097527 +529070,2007-11-26 13:30:00,KIDNAPPING,NORTHERN,900 Block of GOLDEN GATE AV,-122.425378507859,37.7803461169179 +529108,2007-11-26 12:15:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +529191,2007-11-26 03:55:00,KIDNAPPING,INGLESIDE,100 Block of LELAND AV,-122.406905871934,37.7124867383516 +529200,2007-11-26 01:55:00,KIDNAPPING,BAYVIEW,0 Block of COMMER CT,-122.384953741035,37.7326384270488 +529288,2007-11-18 20:00:00,DRUNKENNESS,MISSION,800 Block of VALENCIA ST,-122.421380986073,37.7589148884581 +529319,2007-11-18 18:50:00,DRUNKENNESS,PARK,OAK ST / COLE ST,-122.450601497864,37.7714591179274 +529344,2007-11-18 17:55:00,DRUNKENNESS,MISSION,900 Block of FLORIDA ST,-122.410517462775,37.756720759604 +529438,2007-11-18 13:00:00,ARSON,CENTRAL,900 Block of POST ST,-122.417634160005,37.787063186215 +529538,2007-11-18 07:33:00,ARSON,SOUTHERN,100 Block of 6TH ST,-122.407376463936,37.7799892619986 +529579,2007-11-18 02:30:00,ARSON,MISSION,0 Block of LAPIDGE ST,-122.422264377356,37.760839414199296 +529583,2007-11-18 02:05:00,DRUNKENNESS,CENTRAL,300 Block of BAY ST,-122.412782236976,37.8056654684523 +529597,2007-11-18 01:14:00,DRUNKENNESS,TARAVAL,2800 Block of TARAVAL ST,-122.496596984158,37.7421826994754 +529660,2007-11-17 22:11:00,DRUNKENNESS,TARAVAL,30TH AV / JUDAH ST,-122.488779912993,37.7611793380662 +529765,2007-11-17 17:11:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +529911,2007-11-17 09:00:00,KIDNAPPING,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +530070,2007-11-16 21:00:00,KIDNAPPING,PARK,0 Block of DOWNEY ST,-122.447444624339,37.7680138285105 +530272,2007-11-16 11:45:00,RUNAWAY,TARAVAL,1700 Block of OCEAN AV,-122.460757719049,37.7247714119319 +530445,2007-11-15 20:45:00,KIDNAPPING,CENTRAL,HYDE ST / BUSH ST,-122.417019320691,37.7891095538736 +530461,2007-11-15 20:15:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +530774,2007-11-15 06:33:00,DRUNKENNESS,INGLESIDE,100 Block of BROOKDALE AV,-122.423098270217,37.7103045151288 +530787,2007-11-15 02:09:00,RUNAWAY,MISSION,3500 Block of CESAR CHAVEZ ST,-122.420832650303,37.7479994493226 +530920,2007-11-14 18:00:00,KIDNAPPING,INGLESIDE,100 Block of WHIPPLE AV,-122.449069781204,37.71194761600579 +531129,2007-11-14 09:00:00,RUNAWAY,TARAVAL,200 Block of SADOWA ST,-122.460831873054,37.71222950430271 +531193,2007-11-14 00:35:00,DRUNKENNESS,NORTHERN,1900 Block of UNION ST,-122.430987283243,37.79760610926 +531306,2007-11-13 18:50:00,ARSON,SOUTHERN,600 Block of STEVENSON ST,-122.412651894354,37.7795131668888 +531381,2007-11-13 15:31:00,ARSON,INGLESIDE,1000 Block of PERSIA AV,-122.427620930727,37.7190833085485 +531598,2007-11-12 21:30:00,DRUNKENNESS,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413047972078,37.7819119628298 +531771,2007-11-12 12:36:00,ARSON,SOUTHERN,800 Block of HOWARD ST,-122.403793259489,37.7823235897616 +531882,2007-11-12 02:30:00,KIDNAPPING,RICHMOND,400 Block of 34TH AV,-122.494517963978,37.7805918951828 +531945,2007-11-04 22:34:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +531950,2007-11-04 22:17:00,ARSON,BAYVIEW,0 Block of EXECUTIVEPARK BL,-122.394556626488,37.7099705488971 +531980,2007-11-04 20:30:00,DRUNKENNESS,MISSION,2800 Block of MISSION ST,-122.418296094437,37.7514284856786 +532089,2007-11-04 15:00:00,KIDNAPPING,TARAVAL,1900 Block of 42ND AV,-122.500990298409,37.750334759820106 +532099,2007-11-04 14:30:00,KIDNAPPING,TARAVAL,2200 Block of 35TH AV,-122.492962570128,37.745077840053 +532234,2007-11-04 03:00:00,DRUNKENNESS,CENTRAL,600 Block of TAYLOR ST,-122.41185703254,37.7883235449904 +532238,2007-11-04 02:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +532301,2007-11-03 23:49:00,ARSON,TARAVAL,200 Block of CARDENAS AV,-122.475974135096,37.7191383611983 +532317,2007-11-03 23:07:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +532467,2007-11-03 16:00:00,ARSON,TARAVAL,0 Block of LEE AV,-122.454019795696,37.7191063131951 +532536,2007-11-03 13:40:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +532576,2007-11-03 11:15:00,ARSON,MISSION,20TH ST / CAPP ST,-122.41796448376002,37.7586968166489 +533152,2007-11-01 22:24:00,DRUNKENNESS,NORTHERN,POLK ST / IVY ST,-122.418140319493,37.777969080659496 +533260,2007-11-01 17:21:00,DRUNKENNESS,MISSION,LILAC ST / 25TH ST,-122.417729704018,37.7506741235652 +533312,2007-11-01 15:20:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +533321,2007-11-01 15:00:00,KIDNAPPING,BAYVIEW,1000 Block of WISCONSIN ST,-122.398580716544,37.754287678154704 +533377,2007-11-01 12:00:00,RUNAWAY,INGLESIDE,300 Block of VIENNA ST,-122.428613620046,37.722765398728 +533427,2007-11-01 10:00:00,ARSON,SOUTHERN,1000 Block of HOWARD ST,-122.407376438306,37.779489776176 +533466,2007-11-01 08:30:00,DRUNKENNESS,INGLESIDE,4300 Block of MISSION ST,-122.431600311794,37.728524805863 +533565,2007-11-01 00:10:00,KIDNAPPING,INGLESIDE,400 Block of RAYMOND AV,-122.412457953057,37.7147347356846 +533672,2007-10-31 21:45:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +533725,2007-10-31 19:30:00,KIDNAPPING,BAYVIEW,2800 Block of INGALLS ST,-122.391087563506,37.721313867736704 +533748,2007-10-31 18:39:00,DRUNKENNESS,MISSION,VALENCIA ST / 21ST ST,-122.421118473704,37.7569011511725 +533830,2007-10-31 15:10:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +533991,2007-10-31 01:10:00,KIDNAPPING,INGLESIDE,4200 Block of MISSION ST,-122.430397787998,37.729481842978 +534051,2007-10-30 21:30:00,DRUNKENNESS,NORTHERN,2100 Block of UNION ST,-122.434695000374,37.7972457460489 +534278,2007-10-30 12:00:00,KIDNAPPING,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +534363,2007-10-30 04:43:00,ARSON,BAYVIEW,FITCH ST / INNES AV,-122.373894389535,37.7309368356017 +534504,2007-10-29 18:30:00,DRUNKENNESS,MISSION,3000 Block of MISSION ST,-122.418163204335,37.7485889485524 +534560,2007-10-29 15:54:00,KIDNAPPING,NORTHERN,900 Block of GEARY ST,-122.418940110957,37.7860492230028 +534702,2007-10-29 08:39:00,DRUNKENNESS,INGLESIDE,800 Block of VIENNA ST,-122.434157340729,37.71540030527621 +534715,2007-10-29 08:00:00,RUNAWAY,TARAVAL,200 Block of RANDOLPH ST,-122.464859528476,37.714345286407706 +534771,2007-10-29 01:00:00,KIDNAPPING,INGLESIDE,1400 Block of SUNNYDALE AV,-122.415572375549,37.7117355267146 +534822,2007-10-21 22:23:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +534838,2007-10-21 21:52:00,DRUNKENNESS,SOUTHERN,JESSIE ST / 6TH ST,-122.409247675547,37.7813987340892 +535043,2007-10-21 12:00:00,KIDNAPPING,SOUTHERN,0 Block of TOWNSEND ST,-122.38917826265,37.7817062612299 +535068,2007-10-21 10:11:00,DRUNKENNESS,BAYVIEW,100 Block of BACON ST,-122.404124444757,37.727553933288895 +535123,2007-10-21 04:23:00,ARSON,BAYVIEW,700 Block of JAMESTOWN AV,-122.389039223072,37.7151390330171 +535198,2007-10-20 23:30:00,KIDNAPPING,BAYVIEW,1200 Block of 17TH ST,-122.396283594618,37.7651047966858 +535248,2007-10-20 20:35:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449101011701,37.7696756290578 +535311,2007-10-20 17:46:00,DRUNKENNESS,TENDERLOIN,EDDY ST / MASON ST,-122.409313111431,37.784347851315104 +535341,2007-10-20 16:40:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.41371122073,37.7796660426062 +535441,2007-10-20 12:00:00,ARSON,INGLESIDE,0 Block of ELLSWORTH ST,-122.414478355643,37.7420081468257 +535480,2007-10-20 10:03:00,ARSON,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +535584,2007-10-20 00:21:00,DRUNKENNESS,NORTHERN,POLK ST / CLAY ST,-122.421056878203,37.7923840813812 +535705,2007-10-19 18:27:00,DRUNKENNESS,MISSION,SANCARLOS ST / 21ST ST,-122.419691794373,37.75698757740589 +535727,2007-10-19 17:30:00,RUNAWAY,TARAVAL,0 Block of EDGAR PL,-122.452222836761,37.7209145102852 +535948,2007-10-19 02:34:00,KIDNAPPING,TENDERLOIN,500 Block of HYDE ST,-122.416459785313,37.7860170554787 +535956,2007-10-19 01:45:00,DRUNKENNESS,CENTRAL,SUTTER ST / STOCKTON ST,-122.406958660602,37.789434763004 +536097,2007-10-18 18:20:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +536141,2007-10-18 16:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +536145,2007-10-18 16:22:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +536328,2007-10-18 04:49:00,ARSON,INGLESIDE,2000 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +536336,2007-10-18 03:08:00,DRUNKENNESS,SOUTHERN,6TH ST / BRYANT ST,-122.402527594665,37.7760382838346 +536359,2007-10-18 01:15:00,DRUNKENNESS,SOUTHERN,100 Block of 3RD ST,-122.400916029025,37.7854574902997 +536414,2007-10-17 22:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +536421,2007-10-17 22:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +536578,2007-10-17 15:40:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +536782,2007-10-17 00:01:00,KIDNAPPING,SOUTHERN,300 Block of LANGTON ST,-122.404862572616,37.7735939535174 +536788,2007-10-16 23:30:00,RUNAWAY,INGLESIDE,300 Block of VIENNA ST,-122.428613620046,37.722765398728 +536791,2007-10-16 23:30:00,KIDNAPPING,SOUTHERN,300 Block of 7TH ST,-122.406841835314,37.77587129042521 +537074,2007-10-16 08:00:00,RUNAWAY,MISSION,3100 Block of 24TH ST,-122.414623849785,37.75241809285711 +537164,2007-10-15 23:00:00,KIDNAPPING,TENDERLOIN,600 Block of ELLIS ST,-122.416916142188,37.78439444920679 +537240,2007-10-15 19:25:00,KIDNAPPING,BAYVIEW,100 Block of KISKA RD,-122.375989158092,37.7301576924252 +537289,2007-10-15 17:30:00,RUNAWAY,TARAVAL,2400 Block of JUDAH ST,-122.488257765477,37.7612593660321 +537443,2007-10-15 11:28:00,DRUNKENNESS,SOUTHERN,MARKET ST / STEUART ST,-122.394751181628,37.7944798289308 +537656,2007-10-07 20:07:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +537668,2007-10-07 19:31:00,ARSON,SOUTHERN,700 Block of MARKET ST,-122.405359371753,37.7859774761625 +537686,2007-10-07 18:30:00,KIDNAPPING,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +537886,2007-10-07 08:21:00,DRUNKENNESS,NORTHERN,3500 Block of FILLMORE ST,-122.436328202384,37.8017515400431 +537915,2007-10-07 04:29:00,DRUNKENNESS,PARK,1400 Block of GOLDEN GATE AV,-122.434445230029,37.7793019548371 +537942,2007-10-07 02:15:00,KIDNAPPING,BAYVIEW,1400 Block of KANSAS ST,-122.402316839735,37.7512533511923 +538018,2007-10-06 22:17:00,DRUNKENNESS,MISSION,24TH ST / LILAC ST,-122.417878226786,37.7522731644848 +538027,2007-10-06 21:43:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +538038,2007-10-06 21:30:00,DRUNKENNESS,SOUTHERN,1200 Block of HOWARD ST,-122.412447373124,37.775633673443 +538134,2007-10-06 17:05:00,DRUNKENNESS,MISSION,1600 Block of BRYANT ST,-122.410616059829,37.766238070453 +538258,2007-10-06 09:30:00,KIDNAPPING,BAYVIEW,2700 Block of SAN BRUNO AV,-122.403408669191,37.72700531963 +538320,2007-10-06 02:36:00,DRUNKENNESS,SOUTHERN,1700 Block of MARKET ST,-122.422924773943,37.7721158516862 +538329,2007-10-06 02:17:00,DRUNKENNESS,SOUTHERN,1700 Block of MARKET ST,-122.422924773943,37.7721158516862 +538341,2007-10-06 01:41:00,DRUNKENNESS,BAYVIEW,600 Block of INDIANA ST,-122.39172714593,37.762851481453 +538412,2007-10-05 22:00:00,ARSON,BAYVIEW,200 Block of TUNNEL AV,-122.400860974348,37.7115119380844 +538429,2007-10-05 20:45:00,DRUNKENNESS,CENTRAL,200 Block of FRONT ST,-122.398993666371,37.79405527725429 +538715,2007-10-04 23:07:00,ARSON,INGLESIDE,VISITACION AV / BRITTON ST,-122.412504533512,37.7127250179716 +538886,2007-10-04 14:43:00,KIDNAPPING,MISSION,2400 Block of HARRISON ST,-122.41249200397,37.758209343892496 +538934,2007-10-04 12:29:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +538977,2007-10-04 10:41:00,DRUNKENNESS,TARAVAL,1300 Block of LAWTON ST,-122.477260245981,37.757998649308206 +539053,2007-10-04 03:24:00,ARSON,BAYVIEW,1300 Block of QUINT ST,-122.395612677231,37.7380557826258 +539067,2007-10-04 00:56:00,DRUNKENNESS,BAYVIEW,1400 Block of PALOU AV,-122.388158941787,37.7323536922436 +539095,2007-10-03 23:31:00,DRUNKENNESS,NORTHERN,HICKORY ST / WEBSTER ST,-122.429274021129,37.774647672678 +539376,2007-10-03 11:30:00,ARSON,TARAVAL,2200 Block of 14TH AV,-122.470359608661,37.7460753397163 +539483,2007-10-03 02:00:00,KIDNAPPING,INGLESIDE,2400 Block of BAY SHORE BL,-122.404079633627,37.7108555177775 +539579,2007-10-02 19:10:00,DRUNKENNESS,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +539607,2007-10-02 18:03:00,DRUNKENNESS,BAYVIEW,1300 Block of MARIPOSA ST,-122.397142992859,37.7638764917726 +539731,2007-10-02 13:00:00,ARSON,PARK,14TH ST / CASTRO ST,-122.435627378155,37.76732734528829 +540038,2007-10-01 16:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +540052,2007-10-01 16:05:00,DRUNKENNESS,TARAVAL,WESTPORTAL AV / 14TH AV,-122.469054666906,37.7379690938149 +540086,2007-10-01 14:16:00,DRUNKENNESS,CENTRAL,2700 Block of TAYLOR ST,-122.415779604384,37.8077454262076 +540125,2007-10-01 12:20:00,RUNAWAY,INGLESIDE,300 Block of ROME ST,-122.447919233725,37.71614766660829 +540134,2007-10-01 12:00:00,KIDNAPPING,CENTRAL,900 Block of PACIFIC AV,-122.411310333437,37.7962865476375 +540166,2007-10-01 11:00:00,DRUNKENNESS,BAYVIEW,4900 Block of 3RD ST,-122.391243431227,37.7336342023099 +540238,2007-10-01 07:30:00,RUNAWAY,INGLESIDE,100 Block of SEARS ST,-122.454513289756,37.7091173062782 +540375,2007-09-23 21:37:00,DRUNKENNESS,SOUTHERN,700 Block of THE EMBARCADEROSOUTH ST,-122.40071180486,37.80238450205921 +540469,2007-09-23 16:44:00,DRUNKENNESS,SOUTHERN,11TH ST / MISSION ST,-122.417104895556,37.7743242867908 +540502,2007-09-23 15:39:00,KIDNAPPING,MISSION,SOUTH VAN NESS AV / 15TH ST,-122.417647884705,37.7668053842905 +540655,2007-09-23 03:40:00,KIDNAPPING,PARK,2200 Block of TURK ST,-122.445710421174,37.7788462167992 +540732,2007-09-22 23:30:00,KIDNAPPING,SOUTHERN,1200 Block of MARKET ST,-122.415444159886,37.7780245674641 +540866,2007-09-22 17:00:00,ARSON,TARAVAL,1500 Block of VICENTE ST,-122.483474364732,37.7389153674901 +541042,2007-09-22 04:15:00,ARSON,MISSION,200 Block of VICKSBURG ST,-122.428511566208,37.75200680071 +541096,2007-09-21 23:29:00,KIDNAPPING,PARK,1100 Block of PAGE ST,-122.43974949508998,37.7719369591073 +541125,2007-09-21 22:15:00,KIDNAPPING,BAYVIEW,1200 Block of HOLLISTER AV,-122.395098403651,37.7213030940671 +541152,2007-09-21 21:00:00,DRUNKENNESS,INGLESIDE,CORTLAND AV / ANDERSON ST,-122.415185289736,37.7389339290251 +541187,2007-09-21 19:28:00,DRUNKENNESS,MISSION,1100 Block of POTRERO AV,-122.406324313914,37.7536322498822 +541367,2007-09-21 11:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +541611,2007-09-20 19:00:00,ARSON,MISSION,1300 Block of NATOMA ST,-122.418546858015,37.7675401219176 +541776,2007-09-20 11:30:00,ARSON,CENTRAL,100 Block of MAIDEN LN,-122.405933099548,37.7881841508921 +541777,2007-09-20 11:30:00,ARSON,CENTRAL,100 Block of MAIDEN LN,-122.405933099548,37.7881841508921 +542097,2007-09-19 14:00:00,ARSON,CENTRAL,2100 Block of POWELL ST,-122.411607253459,37.8044472417935 +542211,2007-09-19 05:30:00,ARSON,BAYVIEW,23RD ST / DAKOTA ST,-122.396716088144,37.754859882842496 +542342,2007-09-18 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +542559,2007-09-18 03:34:00,ARSON,NORTHERN,2100 Block of BUSH ST,-122.432088629593,37.78714008869839 +542569,2007-09-18 02:45:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +542573,2007-09-18 02:05:00,ARSON,RICHMOND,2400 Block of SUTTER ST,-122.440731807636,37.7851939209085 +542650,2007-09-17 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +542664,2007-09-17 21:22:00,DRUNKENNESS,TARAVAL,2400 Block of 45TH AV,-122.503551562362,37.7408626873427 +542936,2007-09-17 09:00:00,KIDNAPPING,TENDERLOIN,500 Block of OFARRELL ST,-122.413820070176,37.7857382950322 +543084,2007-09-09 21:37:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / LEAVENWORTH ST,-122.414433155063,37.7846576329256 +543141,2007-09-09 19:33:00,ARSON,INGLESIDE,0 Block of SANTOS ST,-122.41867937435,37.711332789313005 +543240,2007-09-09 15:15:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +543349,2007-09-09 10:00:00,KIDNAPPING,BAYVIEW,100 Block of ALBATROSS CT,-122.372202831457,37.728381194358704 +543388,2007-09-09 06:40:00,DRUNKENNESS,MISSION,3400 Block of 20TH ST,-122.417413347097,37.758676483300206 +543423,2007-09-09 02:32:00,DRUNKENNESS,SOUTHERN,1400 Block of FOLSOM ST,-122.413771938125,37.772142090293706 +543450,2007-09-09 01:25:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +543778,2007-09-08 08:50:00,KIDNAPPING,INGLESIDE,700 Block of MADRID ST,-122.435695857711,37.7176872858062 +543829,2007-09-08 03:00:00,KIDNAPPING,BAYVIEW,900 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +543914,2007-09-07 22:58:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +543998,2007-09-07 19:30:00,KIDNAPPING,BAYVIEW,0 Block of HARBOR RD,-122.378392257534,37.7323312464378 +544044,2007-09-07 18:00:00,KIDNAPPING,INGLESIDE,200 Block of ADDISON ST,-122.432398313711,37.7378218134824 +544358,2007-09-06 21:37:00,KIDNAPPING,MISSION,25TH ST / SAN JOSE AV,-122.42143943157,37.7504488807299 +544363,2007-09-06 21:27:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +544384,2007-09-06 20:20:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +544390,2007-09-06 20:00:00,KIDNAPPING,CENTRAL,500 Block of CALIFORNIA ST,-122.403322520128,37.7928366196806 +544468,2007-09-06 17:30:00,ARSON,CENTRAL,0 Block of VANDEWATER ST,-122.412698359147,37.8053109379125 +544547,2007-09-06 14:30:00,DRUNKENNESS,PARK,300 Block of LAGUNAHONDA BL,-122.45868018978202,37.7481554692332 +544612,2007-09-06 11:26:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +544698,2007-09-06 06:12:00,DRUNKENNESS,BAYVIEW,OAKDALE AV / NEWHALL ST,-122.392217325531,37.7356625997558 +544716,2007-09-06 02:11:00,ARSON,BAYVIEW,CARROLL AV / FITCH ST,-122.384088266199,37.7196684684616 +544752,2007-09-05 23:21:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453512911126,37.7686969786551 +544814,2007-09-05 20:25:00,DRUNKENNESS,MISSION,2800 Block of 24TH ST,-122.408654193478,37.752769227933896 +544846,2007-09-05 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +545113,2007-09-05 05:21:00,ARSON,BAYVIEW,100 Block of DOUBLEROCK ST,-122.387694587441,37.7205552398712 +545182,2007-09-04 21:57:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +545204,2007-09-04 20:04:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +545271,2007-09-04 17:31:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +545350,2007-09-04 14:30:00,DRUNKENNESS,INGLESIDE,MISSION ST / SANJUAN AV,-122.435311835481,37.7240050528145 +545417,2007-09-04 10:30:00,RUNAWAY,NORTHERN,0 Block of GALILEE LN,-122.428154523133,37.78378796200821 +545450,2007-09-04 08:30:00,RUNAWAY,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +545469,2007-09-04 07:00:00,KIDNAPPING,INGLESIDE,800 Block of ELLSWORTH ST,-122.416446124049,37.7329162539537 +545489,2007-09-04 04:00:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +545628,2007-09-03 17:25:00,DRUNKENNESS,SOUTHERN,1400 Block of MARKET ST,-122.418480564808,37.775898446204 +545659,2007-09-03 15:41:00,DRUNKENNESS,NORTHERN,EDDY ST / POLK ST,-122.419183096362,37.78309982445921 +545681,2007-09-03 14:34:00,DRUNKENNESS,TENDERLOIN,JONES ST / ELLIS ST,-122.412784096502,37.78486569395261 +545778,2007-09-03 08:00:00,KIDNAPPING,INGLESIDE,800 Block of ELLSWORTH ST,-122.416446124049,37.7329162539537 +545928,2007-08-26 19:21:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +546126,2007-08-26 03:50:00,DRUNKENNESS,CENTRAL,100 Block of COLUMBUS AV,-122.404895799327,37.7965641992536 +546137,2007-08-26 02:48:00,DRUNKENNESS,MISSION,3400 Block of 19TH ST,-122.421047623733,37.7601791935819 +546139,2007-08-26 02:30:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +546257,2007-08-25 20:41:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +546327,2007-08-25 17:45:00,DRUNKENNESS,MISSION,900 Block of VALENCIA ST,-122.421301773834,37.7580957160416 +546385,2007-08-25 14:16:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +546460,2007-08-25 11:00:00,KIDNAPPING,RICHMOND,1800 Block of DIVISADERO ST,-122.440040391343,37.7866702442116 +546505,2007-08-25 07:32:00,KIDNAPPING,TENDERLOIN,300 Block of JONES ST,-122.412758846145,37.78439975001921 +546544,2007-08-25 02:55:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +546545,2007-08-25 02:55:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +546588,2007-08-25 00:01:00,KIDNAPPING,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +546623,2007-08-24 22:58:00,DRUNKENNESS,MISSION,CASTRO ST / 18TH ST,-122.435002864298,37.7608878061194 +546768,2007-08-24 16:06:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +546784,2007-08-24 15:30:00,ARSON,BAYVIEW,200 Block of ELMIRA ST,-122.403612256741,37.7340216173286 +546888,2007-08-24 08:49:00,ARSON,BAYVIEW,100 Block of KISKA RD,-122.375989158092,37.7301576924252 +546939,2007-08-24 01:45:00,DRUNKENNESS,SOUTHERN,HOWARD ST / 3RD ST,-122.400473580152,37.7850290611875 +546994,2007-08-23 22:04:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +547080,2007-08-23 18:20:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +547226,2007-08-23 11:53:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +547236,2007-08-23 11:23:00,ARSON,BAYVIEW,1000 Block of GRIFFITH ST,-122.378920771859,37.7286119710993 +547239,2007-08-23 11:10:00,DRUNKENNESS,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +547311,2007-08-23 05:28:00,ARSON,INGLESIDE,1600 Block of DIAMOND ST,-122.435709983124,37.7443688410754 +547514,2007-08-22 16:30:00,ARSON,BAYVIEW,0 Block of HARBOR RD,-122.378268018481,37.7323807302226 +547563,2007-08-22 14:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +547733,2007-08-22 00:50:00,DRUNKENNESS,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +547786,2007-08-21 21:52:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +547799,2007-08-21 21:30:00,ARSON,CENTRAL,800 Block of SUTTER ST,-122.414368110368,37.7884368260567 +547870,2007-08-21 18:19:00,DRUNKENNESS,MISSION,SANCARLOS ST / 18TH ST,-122.42013077113,37.7617902898149 +548242,2007-08-20 19:55:00,DRUNKENNESS,TARAVAL,CLAREMONT BL / ULLOA ST,-122.465037066383,37.740651272238495 +548851,2007-08-12 09:00:00,KIDNAPPING,INGLESIDE,700 Block of MADRID ST,-122.435695857711,37.7176872858062 +548885,2007-08-12 04:35:00,DRUNKENNESS,CENTRAL,1000 Block of CALIFORNIA ST,-122.411253828638,37.79172390851 +548903,2007-08-12 02:40:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +548937,2007-08-12 01:00:00,DRUNKENNESS,TARAVAL,KIRKHAM ST / 46TH AV,-122.505795108032,37.758558815993794 +549008,2007-08-11 22:10:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +549060,2007-08-11 19:49:00,DRUNKENNESS,MISSION,FOLSOM ST / CESAR CHAVEZ ST,-122.413671670593,37.7482568705647 +549080,2007-08-11 19:00:00,ARSON,SOUTHERN,NATOMA ST / 5TH ST,-122.405467934272,37.781924110513 +549083,2007-08-11 18:52:00,DRUNKENNESS,CENTRAL,400 Block of JEFFERSON ST,-122.419941636264,37.8077487904473 +549095,2007-08-11 18:00:00,KIDNAPPING,NORTHERN,GEARY BL / WEBSTER ST,-122.431206932079,37.7845681170336 +549247,2007-08-11 11:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +549557,2007-08-10 15:15:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +549708,2007-08-10 07:04:00,KIDNAPPING,NORTHERN,2500 Block of UNION ST,-122.441261119894,37.796299013693705 +549728,2007-08-10 02:00:00,ARSON,NORTHERN,2700 Block of VALLEJO ST,-122.442553558199,37.7942229567459 +549750,2007-08-10 00:41:00,DRUNKENNESS,RICHMOND,400 Block of 34TH AV,-122.494517963978,37.7805918951828 +549787,2007-08-09 22:45:00,DRUNKENNESS,MISSION,CASTRO ST / MARKET ST,-122.435187699349,37.7626702770872 +549953,2007-08-09 15:34:00,DRUNKENNESS,CENTRAL,500 Block of COLUMBUS AV,-122.409576373262,37.7999519603954 +550141,2007-08-09 00:30:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +550346,2007-08-08 13:17:00,ARSON,TARAVAL,1300 Block of 29TH AV,-122.487841263089,37.7621382641819 +550805,2007-08-07 02:18:00,DRUNKENNESS,INGLESIDE,3200 Block of MISSION ST,-122.420526309078,37.744725471365705 +551274,2007-07-29 18:12:00,DRUNKENNESS,MISSION,23RD ST / HAMPSHIRE ST,-122.407449511511,37.7545081025069 +551319,2007-07-29 16:31:00,DRUNKENNESS,RICHMOND,3RD AV / CLEMENT ST,-122.461210550383,37.7830866899279 +551386,2007-07-29 13:08:00,KIDNAPPING,TENDERLOIN,400 Block of OFARRELL ST,-122.411742515582,37.7858882195106 +551525,2007-07-29 01:18:00,DRUNKENNESS,RICHMOND,2800 Block of GOLDEN GATE AV,-122.457612270007,37.7763567200069 +551593,2007-07-28 22:30:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.447783070559,37.769954950346495 +551899,2007-07-28 02:10:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449944521424,37.7695680602698 +551917,2007-07-28 01:10:00,DRUNKENNESS,CENTRAL,1900 Block of MASON ST,-122.412733324537,37.8016704495194 +551954,2007-07-27 23:17:00,DRUNKENNESS,BAYVIEW,1500 Block of SHAFTER AV,-122.389849114797,37.7304741509374 +552036,2007-07-27 19:00:00,RUNAWAY,CENTRAL,300 Block of BAY ST,-122.412803753,37.8057739875696 +552067,2007-07-27 18:20:00,KIDNAPPING,CENTRAL,1100 Block of STOCKTON ST,-122.408412097317,37.7962635594474 +552243,2007-07-27 11:30:00,RUNAWAY,BAYVIEW,1300 Block of GILMAN AV,-122.394646250335,37.7219920197814 +552356,2007-07-26 23:30:00,DRUNKENNESS,SOUTHERN,HOWARD ST / HAWTHORNE ST,-122.399374405812,37.7858983123003 +552377,2007-07-26 22:19:00,DRUNKENNESS,PARK,GROVE ST / CLAYTON ST,-122.449517527025,37.7744602213672 +552455,2007-07-26 18:57:00,DRUNKENNESS,MISSION,800 Block of VALENCIA ST,-122.421457875126,37.7597178171657 +552535,2007-07-26 16:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +552577,2007-07-26 14:21:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855931,37.784401179486 +552719,2007-07-26 03:59:00,ARSON,CENTRAL,600 Block of VALLEJO ST,-122.407548281297,37.7987908964449 +552737,2007-07-26 02:15:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739951,37.7978641744394 +552751,2007-07-26 00:40:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +553520,2007-07-24 06:40:00,DRUNKENNESS,BAYVIEW,800 Block of MEADE AV,-122.396981391115,37.7175581864854 +553720,2007-07-23 16:20:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +553736,2007-07-23 15:20:00,ARSON,INGLESIDE,1100 Block of MANSELL ST,-122.412998370351,37.718686647895495 +553887,2007-07-23 04:20:00,ARSON,RICHMOND,400 Block of 20TH AV,-122.479241431478,37.779356245781706 +553891,2007-07-23 03:25:00,ARSON,BAYVIEW,HOOPER ST / 7TH ST,-122.398182124025,37.7690432950377 +553916,2007-07-23 00:25:00,DRUNKENNESS,INGLESIDE,200 Block of MOSCOW ST,-122.425955486482,37.7236171473188 +553990,2007-07-15 20:45:00,KIDNAPPING,NORTHERN,1100 Block of POST ST,-122.420753848399,37.7866670084912 +554123,2007-07-15 15:00:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.418277044979,37.8079624466014 +554149,2007-07-15 12:20:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +554240,2007-07-15 07:22:00,DRUNKENNESS,PARK,1000 Block of MASONIC AV,-122.445555834566,37.7716104916829 +554305,2007-07-15 00:15:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +554329,2007-07-14 23:25:00,ARSON,BAYVIEW,1700 Block of OAKDALE AV,-122.393131022392,37.7362497231109 +554531,2007-07-14 14:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +554579,2007-07-14 12:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +554605,2007-07-14 10:24:00,DRUNKENNESS,INGLESIDE,CHURCH ST / 29TH ST,-122.426671664945,37.743699394240295 +554606,2007-07-14 10:18:00,DRUNKENNESS,MISSION,4000 Block of 18TH ST,-122.434446928667,37.7608670671665 +554643,2007-07-14 08:12:00,DRUNKENNESS,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +554686,2007-07-14 02:30:00,KIDNAPPING,RICHMOND,2300 Block of GOLDEN GATE AV,-122.449116002905,37.777321600666106 +554708,2007-07-14 00:44:00,DRUNKENNESS,NORTHERN,1100 Block of SUTTER ST,-122.41931732407,37.7879136979106 +554738,2007-07-13 23:22:00,DRUNKENNESS,SOUTHERN,0 Block of 9TH ST,-122.414953043045,37.7765019124574 +554776,2007-07-13 22:00:00,ARSON,INGLESIDE,100 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +554816,2007-07-13 20:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +554856,2007-07-13 18:37:00,DRUNKENNESS,MISSION,800 Block of VALENCIA ST,-122.421319903157,37.7597261442303 +554887,2007-07-13 17:09:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +554985,2007-07-13 12:20:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +554994,2007-07-13 12:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +555007,2007-07-13 11:23:00,KIDNAPPING,NORTHERN,1700 Block of VANNESS AV,-122.422777244531,37.7917190991489 +555062,2007-07-13 07:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +555064,2007-07-13 07:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +555074,2007-07-13 03:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +555238,2007-07-12 18:00:00,KIDNAPPING,SOUTHERN,200 Block of KING ST,-122.393110640713,37.77731032196979 +555291,2007-07-12 15:00:00,RUNAWAY,BAYVIEW,1600 Block of PALOU AV,-122.39192940892,37.7344910991058 +555388,2007-07-12 10:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +555398,2007-07-12 10:00:00,KIDNAPPING,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +555458,2007-07-12 04:20:00,ARSON,CENTRAL,1300 Block of STOCKTON ST,-122.408783663028,37.7980998616878 +555459,2007-07-12 04:14:00,ARSON,NORTHERN,1500 Block of PINE ST,-122.421319145498,37.7894600151705 +555527,2007-07-11 22:31:00,DRUNKENNESS,PARK,1400 Block of WALLER ST,-122.447989685391,37.7689712667852 +555536,2007-07-11 22:20:00,DRUNKENNESS,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +555853,2007-07-11 05:00:00,DRUNKENNESS,NORTHERN,0 Block of GROVE ST,-122.41742986085,37.7785349354394 +555862,2007-07-11 04:00:00,ARSON,INGLESIDE,200 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +556004,2007-07-10 19:08:00,ARSON,BAYVIEW,100 Block of CAMERON WY,-122.387181635995,37.7209669615499 +556017,2007-07-10 18:45:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +556136,2007-07-10 14:15:00,DRUNKENNESS,SOUTHERN,7TH ST / STEVENSON ST,-122.411935615745,37.780006442029794 +556445,2007-07-09 17:20:00,DRUNKENNESS,MISSION,1000 Block of SANCHEZ ST,-122.429626011394,37.7519704203133 +556583,2007-07-09 11:00:00,KIDNAPPING,CENTRAL,600 Block of CALIFORNIA ST,-122.40504699065,37.792616896353 +556650,2007-07-09 01:50:00,DRUNKENNESS,MISSION,MISSION ST / 20TH ST,-122.419052694349,37.7586324051562 +556696,2007-07-01 22:45:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +556723,2007-07-01 20:45:00,DRUNKENNESS,TARAVAL,25TH AV / IRVING ST,-122.483552403515,37.76327820531221 +556984,2007-07-01 02:25:00,DRUNKENNESS,NORTHERN,1600 Block of LARKIN ST,-122.419423819905,37.7930471195335 +557102,2007-06-30 22:00:00,DRUNKENNESS,NORTHERN,FILLMORE ST / GOLDEN GATE AV,-122.431952436364,37.779564749866296 +557164,2007-06-30 18:43:00,ARSON,BAYVIEW,0 Block of TURNER TR,-122.395106891925,37.7566305834521 +557190,2007-06-30 17:58:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.415724213925,37.7524609846175 +557277,2007-06-30 13:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +557311,2007-06-30 12:00:00,RUNAWAY,RICHMOND,600 Block of 32ND AV,-122.492094951213,37.7768703435765 +557312,2007-06-30 12:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +557354,2007-06-30 09:00:00,KIDNAPPING,RICHMOND,2300 Block of GOLDEN GATE AV,-122.449116002905,37.777321600666106 +557372,2007-06-30 07:57:00,DRUNKENNESS,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +557387,2007-06-30 04:05:00,ARSON,BAYVIEW,100 Block of TOPEKA AV,-122.398951090192,37.7338473162583 +557420,2007-06-30 01:09:00,DRUNKENNESS,BAYVIEW,3RD ST / GALVEZ AV,-122.38847839624,37.741109286458 +557452,2007-06-29 23:40:00,DRUNKENNESS,MISSION,MISSION ST / 26TH ST,-122.418137290501,37.7490413093633 +557461,2007-06-29 23:23:00,DRUNKENNESS,PARK,HAIGHT ST / DIVISADERO ST,-122.437048523435,37.7712678186367 +557504,2007-06-29 21:06:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +557550,2007-06-29 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +557604,2007-06-29 16:20:00,KIDNAPPING,RICHMOND,3200 Block of GEARY BL,-122.453702980691,37.7817840733425 +557639,2007-06-29 14:00:00,RUNAWAY,RICHMOND,700 Block of 5TH AV,-122.462812195629,37.7745697494532 +557656,2007-06-29 13:30:00,RUNAWAY,INGLESIDE,1500 Block of CHURCH ST,-122.426925757661,37.74569488903021 +558039,2007-06-28 12:39:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +558056,2007-06-28 11:45:00,DRUNKENNESS,CENTRAL,CLAY ST / JOICE ST,-122.408722449838,37.793955092097 +558483,2007-06-27 04:05:00,ARSON,BAYVIEW,1100 Block of FAIRFAX AV,-122.381195151131,37.738409940572296 +558501,2007-06-27 00:40:00,DRUNKENNESS,PARK,900 Block of BUENAVISTAWEST AV,-122.44324157754,37.7699941054658 +558504,2007-06-27 00:25:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +558525,2007-06-26 23:43:00,DRUNKENNESS,MISSION,FOLSOM ST / 24TH ST,-122.414089000708,37.75250507857579 +558539,2007-06-26 22:50:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +558594,2007-06-26 19:10:00,DRUNKENNESS,MISSION,2900 Block of 21ST ST,-122.413999387231,37.7573853251797 +558675,2007-06-26 15:10:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +559064,2007-06-25 12:00:00,RUNAWAY,MISSION,1000 Block of CAPP ST,-122.417054438267,37.749894648115294 +559161,2007-06-25 02:00:00,KIDNAPPING,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +559166,2007-06-25 01:15:00,KIDNAPPING,INGLESIDE,200 Block of PUTNAM ST,-122.410985121891,37.7363241269838 +559201,2007-06-17 23:20:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +559239,2007-06-17 21:00:00,KIDNAPPING,NORTHERN,0 Block of GOUGH ST,-122.422344796838,37.7734091793677 +559320,2007-06-17 15:30:00,KIDNAPPING,BAYVIEW,0 Block of CASHMERE ST,-122.382745395519,37.73565878863421 +559479,2007-06-17 02:58:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 11TH ST,-122.41402726268998,37.7718636177154 +559560,2007-06-16 22:19:00,DRUNKENNESS,CENTRAL,1300 Block of GRANT AV,-122.40723429412,37.7992576492589 +559590,2007-06-16 20:13:00,ARSON,MISSION,800 Block of SHOTWELL ST,-122.415464220212,37.7548143096921 +559594,2007-06-16 20:02:00,KIDNAPPING,INGLESIDE,0 Block of TIFFANY AV,-122.421228786449,37.7452607746654 +559680,2007-06-16 16:20:00,ARSON,MISSION,800 Block of SHOTWELL ST,-122.415464220212,37.7548143096921 +559697,2007-06-16 15:45:00,DRUNKENNESS,NORTHERN,1200 Block of VANNESS AV,-122.421441956086,37.78685164710871 +559706,2007-06-16 15:00:00,KIDNAPPING,BAYVIEW,1400 Block of QUESADA AV,-122.386849266637,37.73066480545821 +559832,2007-06-16 07:12:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.4138307659,37.7525754079659 +559867,2007-06-16 01:50:00,RUNAWAY,BAYVIEW,300 Block of 24TH ST,-122.383582740632,37.7543746907013 +559888,2007-06-16 00:01:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +560326,2007-06-15 01:30:00,KIDNAPPING,CENTRAL,900 Block of BAY ST,-122.422186781998,37.804573281570896 +560340,2007-06-15 00:30:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +560384,2007-06-14 22:08:00,DRUNKENNESS,INGLESIDE,SAN JOSE AV / 29TH ST,-122.422672192368,37.74394327043071 +560434,2007-06-14 19:45:00,DRUNKENNESS,CENTRAL,600 Block of VALLEJO ST,-122.40756223974,37.7986781256079 +560572,2007-06-14 12:30:00,KIDNAPPING,MISSION,1900 Block of MISSION ST,-122.41967661615,37.7658510977435 +560864,2007-06-13 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +560921,2007-06-13 12:00:00,DRUNKENNESS,BAYVIEW,OAKDALE AV / 3RD ST,-122.390697630683,37.7347969947349 +561100,2007-06-12 22:00:00,KIDNAPPING,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +561105,2007-06-12 22:00:00,KIDNAPPING,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +561107,2007-06-12 22:00:00,KIDNAPPING,TARAVAL,1800 Block of NORIEGA ST,-122.483450797581,37.7539879658749 +561151,2007-06-12 20:00:00,KIDNAPPING,MISSION,3500 Block of 23RD ST,-122.422292907348,37.753668715636 +561305,2007-06-12 14:27:00,DRUNKENNESS,MISSION,800 Block of SHOTWELL ST,-122.415464220212,37.7548143096921 +561361,2007-06-12 12:10:00,ARSON,CENTRAL,0 Block of GEARY ST,-122.404277568186,37.7879185264229 +561508,2007-06-12 00:10:00,ARSON,INGLESIDE,1300 Block of BOWDOIN ST,-122.407934351403,37.7194433534269 +561561,2007-06-11 21:40:00,DRUNKENNESS,BAYVIEW,5000 Block of 3RD ST,-122.391257625349,37.7327899367388 +561865,2007-06-11 07:33:00,ARSON,TENDERLOIN,200 Block of TAYLOR ST,-122.410979175673,37.784625434984 +561904,2007-06-11 00:47:00,ARSON,TARAVAL,200 Block of DORADO TR,-122.461332948749,37.726180807332 +561952,2007-06-03 20:35:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +562005,2007-06-03 18:04:00,DRUNKENNESS,CENTRAL,GEARY ST / POWELL ST,-122.408231026261,37.787359494956 +562079,2007-06-03 14:35:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +562174,2007-06-03 06:15:00,KIDNAPPING,SOUTHERN,0 Block of 9TH ST,-122.415064887666,37.7764354063246 +562204,2007-06-03 02:30:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +562250,2007-06-02 23:53:00,ARSON,BAYVIEW,1600 Block of MCKINNON AV,-122.390594707019,37.7367033939104 +562265,2007-06-02 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +562300,2007-06-02 21:03:00,DRUNKENNESS,NORTHERN,2000 Block of FILLMORE ST,-122.433676892244,37.7884461157258 +562358,2007-06-02 17:45:00,DRUNKENNESS,NORTHERN,GREEN ST / LAGUNA ST,-122.430371829258,37.7967808411162 +562442,2007-06-02 13:30:00,DRUNKENNESS,CENTRAL,0 Block of DRUMM ST,-122.396556426173,37.7941169057941 +562468,2007-06-02 12:00:00,RUNAWAY,PARK,0 Block of SHRADER ST,-122.452839772389,37.7745145380854 +562523,2007-06-02 03:45:00,KIDNAPPING,BAYVIEW,SAN BRUNO AV / PAUL AV,-122.402109488937,37.7240376461441 +562552,2007-06-02 01:11:00,ARSON,BAYVIEW,JAMESTOWN AV / GILROY ST,-122.389440639195,37.715558495062496 +562618,2007-06-01 21:35:00,DRUNKENNESS,TARAVAL,20TH AV / IRVING ST,-122.478191939982,37.7635138827396 +562638,2007-06-01 20:00:00,ARSON,INGLESIDE,500 Block of COLLEGE AV,-122.423656342945,37.7325564882065 +562803,2007-06-01 13:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +562815,2007-06-01 12:20:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +562951,2007-06-01 07:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +563402,2007-05-30 22:50:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +563471,2007-05-30 19:52:00,DRUNKENNESS,BAYVIEW,23RD ST / RHODEISLAND ST,-122.401590336879,37.7545698243645 +563564,2007-05-30 15:00:00,KIDNAPPING,INGLESIDE,5100 Block of MISSION ST,-122.441352016549,37.716127093001 +563759,2007-05-29 22:55:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +563847,2007-05-29 19:30:00,ARSON,NORTHERN,1200 Block of EDDY ST,-122.428245242312,37.7820044139073 +563943,2007-05-29 14:52:00,DRUNKENNESS,MISSION,1800 Block of MISSION ST,-122.419832890144,37.7674625261825 +564207,2007-05-28 19:30:00,RUNAWAY,CENTRAL,1100 Block of LEAVENWORTH ST,-122.415946503667,37.79183504251421 +564248,2007-05-28 17:27:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +564448,2007-05-28 03:02:00,DRUNKENNESS,MISSION,400 Block of POTRERO AV,-122.407292171191,37.7638291911821 +564532,2007-05-20 21:30:00,DRUNKENNESS,TARAVAL,2400 Block of 40TH AV,-122.498192087917,37.7411023372411 +564700,2007-05-20 12:05:00,DRUNKENNESS,PARK,FELL ST / ASHBURY ST,-122.447497699759,37.7727905081944 +564822,2007-05-20 01:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +564847,2007-05-20 00:30:00,KIDNAPPING,NORTHERN,1400 Block of SUTTER ST,-122.424230101144,37.7871785622736 +564942,2007-05-19 19:52:00,DRUNKENNESS,MISSION,26TH ST / MISSION ST,-122.418137290501,37.7490413093633 +565001,2007-05-19 16:30:00,KIDNAPPING,MISSION,900 Block of YORK ST,-122.408642782989,37.7568334631968 +565005,2007-05-19 16:00:00,ARSON,BAYVIEW,100 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +565133,2007-05-19 08:00:00,KIDNAPPING,BAYVIEW,0 Block of DOUBLEROCK ST,-122.387775002515,37.7204658651293 +565143,2007-05-19 05:30:00,ARSON,BAYVIEW,0 Block of HARE ST,-122.378991849151,37.73453622329961 +565190,2007-05-19 00:30:00,DRUNKENNESS,MISSION,600 Block of POTRERO AV,-122.407254213895,37.7612780377437 +565308,2007-05-18 19:00:00,ARSON,BAYVIEW,QUESADA AV / KEITH ST,-122.387729373655,37.731232393892704 +565385,2007-05-18 16:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +565400,2007-05-18 15:17:00,KIDNAPPING,NORTHERN,2100 Block of FILLMORE ST,-122.434003515569,37.7893718853177 +565444,2007-05-18 13:20:00,ARSON,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +565514,2007-05-18 09:44:00,DRUNKENNESS,SOUTHERN,5THSTNORTH ST / MARKET ST,-122.408068345148,37.7839916768161 +565570,2007-05-18 01:45:00,KIDNAPPING,MISSION,18TH ST / CAPP ST,-122.418272166422,37.76190296130221 +565596,2007-05-17 23:45:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +565626,2007-05-17 21:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +565648,2007-05-17 20:10:00,KIDNAPPING,SOUTHERN,1100 Block of MARKET ST,-122.41371122073,37.7796660426062 +565878,2007-05-17 07:55:00,ARSON,CENTRAL,600 Block of POST ST,-122.41201048788,37.7877770164282 +565897,2007-05-17 06:00:00,ARSON,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +565924,2007-05-17 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +565964,2007-05-16 21:20:00,KIDNAPPING,TARAVAL,100 Block of SERRANO DR,-122.477536814301,37.720152391561705 +565985,2007-05-16 20:25:00,DRUNKENNESS,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +566012,2007-05-16 19:00:00,DRUNKENNESS,NORTHERN,0 Block of FELL ST,-122.418500584434,37.7764380944444 +566051,2007-05-16 17:30:00,KIDNAPPING,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +566272,2007-05-16 03:18:00,ARSON,MISSION,3000 Block of 23RD ST,-122.412619862692,37.754250991938704 +566277,2007-05-16 02:04:00,DRUNKENNESS,MISSION,500 Block of SOUTH VAN NESS AV,-122.41747701285,37.764357751686 +566309,2007-05-15 23:19:00,ARSON,NORTHERN,1100 Block of POLK ST,-122.420136159979,37.7875096258655 +566403,2007-05-15 18:00:00,ARSON,NORTHERN,1700 Block of UNION ST,-122.428118208377,37.7980822262225 +566410,2007-05-15 17:52:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +566512,2007-05-15 12:08:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.407945033235,37.7996867434054 +566766,2007-05-14 19:10:00,DRUNKENNESS,TARAVAL,19TH AV / LAWTON ST,-122.476684519586,37.7579683424839 +566788,2007-05-14 17:49:00,DRUNKENNESS,SOUTHERN,6TH ST / MISSION ST,-122.408710606663,37.78097067220529 +566845,2007-05-14 14:40:00,KIDNAPPING,PARK,2400 Block of GEARY BL,-122.443597047511,37.7826435280939 +566871,2007-05-14 13:10:00,KIDNAPPING,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +566956,2007-05-14 08:30:00,RUNAWAY,MISSION,2200 Block of MISSION ST,-122.419212198636,37.7610244167023 +567188,2007-05-06 16:50:00,DRUNKENNESS,INGLESIDE,400 Block of JUDSON AV,-122.451734449798,37.728407437431 +567200,2007-05-06 16:22:00,DRUNKENNESS,BAYVIEW,4600 Block of 3RD ST,-122.390412132668,37.7360102192532 +567212,2007-05-06 15:45:00,DRUNKENNESS,MISSION,SHOTWELL ST / 21ST ST,-122.415629332446,37.757232227914 +567344,2007-05-06 07:18:00,KIDNAPPING,MISSION,3200 Block of 26TH ST,-122.414603717327,37.7493085877432 +567361,2007-05-06 05:00:00,DRUNKENNESS,TARAVAL,1400 Block of TARAVAL ST,-122.481599697771,37.7428452360376 +567375,2007-05-06 02:54:00,ARSON,RICHMOND,GEARY BL / 25TH AV,-122.484731728932,37.780091707804 +567379,2007-05-06 02:43:00,DRUNKENNESS,SOUTHERN,HOWARD ST / RAUSCH ST,-122.410507458268,37.777093148952495 +567415,2007-05-06 00:45:00,DRUNKENNESS,SOUTHERN,HOWARD ST / LAFAYETTE ST,-122.416305723264,37.772455644021896 +567459,2007-05-05 23:10:00,ARSON,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +567514,2007-05-05 20:30:00,KIDNAPPING,INGLESIDE,900 Block of AVALON AV,-122.423767092973,37.7250544382071 +567580,2007-05-05 17:48:00,DRUNKENNESS,NORTHERN,WILLOW ST / LARKIN ST,-122.41762232101,37.78377623856839 +567598,2007-05-05 17:02:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / GROVE ST,-122.416583456133,37.7786591541508 +567616,2007-05-05 16:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +567740,2007-05-05 08:45:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +567745,2007-05-05 08:05:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +567769,2007-05-05 06:30:00,DRUNKENNESS,MISSION,400 Block of CAPP ST,-122.417970955091,37.7594884557036 +567800,2007-05-05 02:13:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 9TH ST,-122.411612378034,37.7737679567236 +567933,2007-05-04 19:45:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617192,37.778124778322 +567998,2007-05-04 16:40:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +568139,2007-05-04 10:06:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345148,37.7839916768161 +568173,2007-05-04 07:35:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +568180,2007-05-04 07:15:00,ARSON,NORTHERN,POLK ST / HAYES ST,-122.418045452768,37.7775118895695 +568444,2007-05-03 11:00:00,KIDNAPPING,MISSION,1200 Block of HAMPSHIRE ST,-122.40714465605,37.7520972558707 +568556,2007-05-02 23:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +568613,2007-05-02 19:58:00,DRUNKENNESS,NORTHERN,CEDAR ST / POLK ST,-122.419834938618,37.78635803627429 +568663,2007-05-02 17:30:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +568889,2007-05-02 02:00:00,KIDNAPPING,MISSION,2400 Block of FOLSOM ST,-122.414683320731,37.758077443725206 +568904,2007-05-02 00:09:00,ARSON,BAYVIEW,400 Block of MENDELL ST,-122.384942352464,37.740531088365394 +568924,2007-05-01 23:00:00,KIDNAPPING,NORTHERN,LOMBARD ST / SCOTT ST,-122.440979708229,37.799210789543295 +568927,2007-05-01 23:00:00,KIDNAPPING,NORTHERN,LOMBARD ST / SCOTT ST,-122.440979708229,37.799210789543295 +568946,2007-05-01 21:30:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +569002,2007-05-01 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +569113,2007-05-01 13:00:00,KIDNAPPING,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +569114,2007-05-01 13:00:00,KIDNAPPING,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +569134,2007-05-01 12:00:00,ARSON,NORTHERN,3500 Block of FILLMORE ST,-122.436328202384,37.8017515400431 +569136,2007-05-01 12:00:00,KIDNAPPING,TARAVAL,2100 Block of KIRKHAM ST,-122.48383510803,37.7594695635018 +569153,2007-05-01 12:00:00,KIDNAPPING,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +569158,2007-05-01 11:50:00,KIDNAPPING,BAYVIEW,0 Block of GEORGE CT,-122.382660660186,37.7308000998774 +569244,2007-05-01 07:00:00,RUNAWAY,BAYVIEW,1300 Block of PALOU AV,-122.38628498363998,37.7312896874195 +569309,2007-04-30 23:32:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +569312,2007-04-30 23:18:00,DRUNKENNESS,NORTHERN,0 Block of BUCHANAN ST,-122.426592754672,37.77007789898521 +569328,2007-04-30 22:02:00,DRUNKENNESS,PARK,COLE ST / HAIGHT ST,-122.450709919144,37.7695262270693 +569385,2007-04-30 18:26:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +569462,2007-04-30 14:36:00,KIDNAPPING,MISSION,1000 Block of SHOTWELL ST,-122.415022828589,37.7516272270745 +569578,2007-04-30 07:30:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +569608,2007-04-30 01:30:00,KIDNAPPING,NORTHERN,OCTAVIA ST / HAYES ST,-122.424623480779,37.7766740025224 +569638,2007-04-22 23:00:00,RUNAWAY,INGLESIDE,SANTOS ST / GENEVA AV,-122.420084075242,37.7083109744591 +569650,2007-04-22 22:30:00,DRUNKENNESS,SOUTHERN,200 Block of 11TH ST,-122.414258651144,37.77197236875789 +569791,2007-04-22 14:50:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +569930,2007-04-22 03:30:00,KIDNAPPING,MISSION,HARRISON ST / CESAR CHAVEZ ST,-122.411486365637,37.748297831668296 +569973,2007-04-22 00:28:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +570070,2007-04-21 19:53:00,DRUNKENNESS,MISSION,1100 Block of POTRERO AV,-122.406324313914,37.7536322498822 +570312,2007-04-21 01:00:00,DRUNKENNESS,NORTHERN,POST ST / WEBSTER ST,-122.431369772433,37.7853730435472 +570361,2007-04-20 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +570420,2007-04-20 20:05:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +570560,2007-04-20 14:30:00,ARSON,INGLESIDE,200 Block of ONEIDA AV,-122.443009986764,37.7218704825421 +570605,2007-04-20 12:20:00,ARSON,INGLESIDE,200 Block of ONEIDA AV,-122.443009986764,37.7218704825421 +570913,2007-04-19 15:40:00,DRUNKENNESS,PARK,FULTON ST / MASONIC AV,-122.446472679005,37.7758015943912 +570922,2007-04-19 15:19:00,ARSON,CENTRAL,0 Block of MONTGOMERY ST,-122.402163713618,37.7895710255863 +570995,2007-04-19 12:15:00,KIDNAPPING,INGLESIDE,200 Block of BLYTHDALE AV,-122.420529801066,37.7110023300609 +571161,2007-04-18 23:40:00,DRUNKENNESS,SOUTHERN,700 Block of MARKET ST,-122.404756583284,37.7864540511999 +571193,2007-04-18 21:35:00,ARSON,BAYVIEW,100 Block of BARNEVELD AV,-122.402841680867,37.7450364333137 +571348,2007-04-18 15:30:00,DRUNKENNESS,MISSION,25TH ST / FOLSOM ST,-122.413926655862,37.75090351182021 +571526,2007-04-18 03:10:00,ARSON,BAYVIEW,0 Block of BAYVIEW ST,-122.391953693156,37.7323737374027 +571539,2007-04-18 00:20:00,DRUNKENNESS,NORTHERN,500 Block of HAIGHT ST,-122.431289969136,37.7720549755537 +571580,2007-04-17 21:30:00,ARSON,NORTHERN,VALLEJO ST / POLK ST,-122.421962957931,37.796898966685 +571619,2007-04-17 19:00:00,RUNAWAY,RICHMOND,700 Block of 5TH AV,-122.462812195629,37.7745697494532 +571649,2007-04-17 17:45:00,DRUNKENNESS,SOUTHERN,MARKET ST / POWELL ST,-122.407545855931,37.784401179486 +571651,2007-04-17 17:44:00,DRUNKENNESS,TARAVAL,IRVING ST / 9TH AV,-122.466309668238,37.7640368477306 +571856,2007-04-17 04:52:00,DRUNKENNESS,TARAVAL,LEE AV / GRAFTON AV,-122.454093465396,37.7200387986737 +571882,2007-04-17 01:11:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.407387172098,37.7810688918781 +571918,2007-04-16 23:20:00,ARSON,INGLESIDE,1500 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +572054,2007-04-16 16:15:00,KIDNAPPING,INGLESIDE,4700 Block of MISSION ST,-122.436867932617,37.7220486455317 +572173,2007-04-16 10:15:00,DRUNKENNESS,RICHMOND,35TH AV / BALBOA ST,-122.495176161858,37.7758114526838 +572239,2007-04-16 02:14:00,RUNAWAY,CENTRAL,500 Block of POST ST,-122.410882825551,37.787920937553295 +572249,2007-04-16 01:12:00,DRUNKENNESS,MISSION,2400 Block of MARKET ST,-122.435773846395,37.7624591846215 +572287,2007-04-08 23:26:00,DRUNKENNESS,INGLESIDE,MISSION ST / ONONDAGA AV,-122.437461502349,37.7211650807414 +572398,2007-04-08 16:30:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +572526,2007-04-08 02:05:00,DRUNKENNESS,NORTHERN,400 Block of HAIGHT ST,-122.429644614552,37.7722642986091 +572644,2007-04-07 20:33:00,DRUNKENNESS,TARAVAL,IRVING ST / 8TH AV,-122.46524512187,37.764082071585 +572948,2007-04-07 00:40:00,DRUNKENNESS,MISSION,2800 Block of 24TH ST,-122.408664686116,37.7528787651491 +573034,2007-04-06 19:19:00,DRUNKENNESS,SOUTHERN,7TH ST / NATOMA ST,-122.409939286664,37.7784153777349 +573053,2007-04-06 18:05:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +573108,2007-04-06 15:00:00,KIDNAPPING,BAYVIEW,0 Block of REDDY ST,-122.395285364874,37.7303641478199 +573511,2007-04-05 07:15:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +573684,2007-04-04 17:30:00,ARSON,TARAVAL,200 Block of WESTPORTAL AV,-122.468117499815,37.7389000144845 +574010,2007-04-03 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +574013,2007-04-03 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +574292,2007-04-03 02:00:00,KIDNAPPING,NORTHERN,SUTTER ST / VANNESS AV,-122.421762501792,37.7875490095115 +574403,2007-04-02 18:17:00,KIDNAPPING,TENDERLOIN,600 Block of OFARRELL ST,-122.415972165351,37.78535651423429 +574474,2007-04-02 14:55:00,DRUNKENNESS,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +574521,2007-04-02 12:11:00,KIDNAPPING,INGLESIDE,1000 Block of BRUSSELS ST,-122.402396359987,37.71929459004871 +574692,2007-03-25 21:00:00,KIDNAPPING,MISSION,400 Block of SOUTH VAN NESS AV,-122.417662868855,37.766274431582495 +575008,2007-03-25 01:30:00,DRUNKENNESS,CENTRAL,700 Block of PACIFIC AV,-122.408014703843,37.796699717573 +575057,2007-03-24 23:14:00,DRUNKENNESS,MISSION,24TH ST / OSAGE ST,-122.419018144895,37.7522051632838 +575073,2007-03-24 22:30:00,KIDNAPPING,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +575305,2007-03-24 09:00:00,KIDNAPPING,BAYVIEW,0 Block of WHEAT ST,-122.400293769252,37.7230559060941 +575450,2007-03-23 21:21:00,ARSON,BAYVIEW,ARMSTRONG AV / INGALLS ST,-122.388499251587,37.72410004055121 +575545,2007-03-23 16:55:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412054141237,37.7816136403158 +575566,2007-03-23 15:27:00,KIDNAPPING,MISSION,500 Block of SOUTH VAN NESS AV,-122.417339031772,37.7643660722829 +575826,2007-03-22 19:20:00,DRUNKENNESS,NORTHERN,HAYES ST / VANNESS AV,-122.419697721691,37.7773009526003 +576072,2007-03-22 01:39:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +576093,2007-03-21 23:57:00,DRUNKENNESS,SOUTHERN,0 Block of RAUSCH ST,-122.409774801363,37.7764436831324 +576201,2007-03-21 17:16:00,DRUNKENNESS,PARK,200 Block of DIVISADERO ST,-122.437252069809,37.7717213027751 +576250,2007-03-21 15:05:00,KIDNAPPING,BAYVIEW,300 Block of CAMBRIDGE ST,-122.41858152677,37.72703161937171 +576429,2007-03-21 01:49:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +576462,2007-03-20 23:05:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675547,37.7813987340892 +576725,2007-03-20 09:30:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +576757,2007-03-20 07:50:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +576814,2007-03-19 23:45:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.407931930502,37.7995771094892 +576837,2007-03-19 22:25:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.417103574575,37.752265657695 +576846,2007-03-19 22:00:00,ARSON,INGLESIDE,900 Block of PERALTA AV,-122.409031365184,37.7372455014068 +576852,2007-03-19 21:45:00,RUNAWAY,TARAVAL,2100 Block of 28TH AV,-122.485730103582,37.7472660064588 +576897,2007-03-19 19:38:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421264331104,37.743584765874 +576961,2007-03-19 17:00:00,ARSON,NORTHERN,0 Block of PAGE ST,-122.421615375337,37.7742412631485 +577279,2007-03-11 18:24:00,DRUNKENNESS,MISSION,24TH ST / CAPP ST,-122.417360139477,37.7523063170181 +577414,2007-03-11 10:00:00,ARSON,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +577492,2007-03-11 01:15:00,DRUNKENNESS,TARAVAL,37TH AV / YORBA ST,-122.494457608529,37.7347481502023 +577511,2007-03-11 00:25:00,DRUNKENNESS,CENTRAL,800 Block of GREENWICH ST,-122.4132706358,37.8018964098681 +577534,2007-03-10 23:50:00,ARSON,BAYVIEW,800 Block of FITCH ST,-122.374084511186,37.73075162521121 +577552,2007-03-10 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +577691,2007-03-10 15:45:00,KIDNAPPING,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +577845,2007-03-10 06:06:00,DRUNKENNESS,MISSION,POTRERO AV / 21ST ST,-122.406803042609,37.7577626731426 +577860,2007-03-10 03:00:00,KIDNAPPING,MISSION,DOLORES ST / 18TH ST,-122.426079580545,37.7614267757472 +577941,2007-03-09 22:55:00,DRUNKENNESS,PARK,17TH ST / MARKET ST,-122.435187699349,37.7626702770872 +578016,2007-03-09 18:49:00,DRUNKENNESS,MISSION,25TH ST / CAPP ST,-122.417201182657,37.7507046984566 +578292,2007-03-08 23:36:00,DRUNKENNESS,PARK,DIVISADERO ST / FELL ST,-122.437612766191,37.7740604119579 +578417,2007-03-08 16:43:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +578483,2007-03-08 14:00:00,KIDNAPPING,INGLESIDE,900 Block of CAYUGA AV,-122.439627787385,37.72241203257771 +578553,2007-03-08 11:00:00,DRUNKENNESS,TARAVAL,2200 Block of 29TH AV,-122.486667576213,37.7453555419744 +578665,2007-03-07 23:30:00,KIDNAPPING,CENTRAL,1000 Block of HYDE ST,-122.417368206741,37.79050941515951 +579056,2007-03-07 00:30:00,KIDNAPPING,TARAVAL,19TH AV / JUDAH ST,-122.477012148678,37.7616987104058 +579113,2007-03-06 21:00:00,ARSON,INGLESIDE,800 Block of ELLSWORTH ST,-122.416446124049,37.7329162539537 +579167,2007-03-06 18:11:00,DRUNKENNESS,TENDERLOIN,MASON ST / ELLIS ST,-122.409499861107,37.7852842684318 +579291,2007-03-06 12:38:00,KIDNAPPING,INGLESIDE,1500 Block of DOLORES ST,-122.424651117682,37.7450263869296 +579414,2007-03-06 03:00:00,KIDNAPPING,BAYVIEW,1900 Block of OAKDALE AV,-122.396935388672,37.7382809208694 +579458,2007-03-05 23:45:00,ARSON,RICHMOND,30TH AV / JOHNFKENNEDY DR,-122.489804747756,37.7708917848042 +579542,2007-03-05 18:35:00,DRUNKENNESS,MISSION,MISSION ST / 16TH ST,-122.419671780296,37.7650501214668 +579567,2007-03-05 17:45:00,KIDNAPPING,BAYVIEW,6200 Block of 3RD ST,-122.396464970114,37.7208979952595 +579580,2007-03-05 17:20:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +579704,2007-03-05 12:05:00,ARSON,BAYVIEW,1300 Block of HAWES ST,-122.382355386384,37.72770030557661 +579746,2007-03-05 10:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +579780,2007-03-05 08:50:00,RUNAWAY,RICHMOND,400 Block of ARGUELLO BL,-122.458857560736,37.78220007231379 +579817,2007-03-05 03:46:00,DRUNKENNESS,SOUTHERN,HARRISON ST / 5TH ST,-122.401846367522,37.7790324136251 +579866,2007-02-25 22:40:00,DRUNKENNESS,SOUTHERN,4TH ST / FOLSOM ST,-122.401161555602,37.7820238478975 +580058,2007-02-25 08:30:00,KIDNAPPING,BAYVIEW,PALOU AV / JENNINGS ST,-122.385290220991,37.7307907400744 +580125,2007-02-25 00:30:00,RUNAWAY,INGLESIDE,600 Block of BRAZIL AV,-122.429666041861,37.722161324511 +580415,2007-02-24 01:49:00,DRUNKENNESS,TARAVAL,200 Block of CASTENADA AV,-122.463237406825,37.7466269277123 +580431,2007-02-24 00:45:00,KIDNAPPING,TARAVAL,3900 Block of 19TH AV,-122.4720075569,37.7166731148325 +580522,2007-02-23 19:30:00,ARSON,BAYVIEW,1300 Block of RHODEISLAND ST,-122.401346102915,37.7526470431764 +580549,2007-02-23 18:23:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +580820,2007-02-23 00:01:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +581103,2007-02-21 23:48:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.407945033235,37.7996867434054 +581341,2007-02-21 13:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +581488,2007-02-21 01:00:00,ARSON,BAYVIEW,0 Block of REARDON RD,-122.376900658814,37.72948746365589 +581549,2007-02-20 21:55:00,KIDNAPPING,BAYVIEW,1700 Block of MCKINNON AV,-122.392004361988,37.737488945182704 +581621,2007-02-20 18:29:00,KIDNAPPING,CENTRAL,800 Block of GEARY ST,-122.417273344939,37.7861493947594 +581730,2007-02-20 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +581894,2007-02-20 00:35:00,DRUNKENNESS,TENDERLOIN,400 Block of LEAVENWORTH ST,-122.414593831954,37.7851199839553 +581956,2007-02-19 21:08:00,DRUNKENNESS,NORTHERN,1100 Block of POLK ST,-122.420042095728,37.7870450616857 +582066,2007-02-19 16:20:00,KIDNAPPING,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +582215,2007-02-19 09:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +582218,2007-02-19 09:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +582463,2007-02-11 14:50:00,KIDNAPPING,RICHMOND,1500 Block of BRODERICK ST,-122.441512991207,37.7845714031219 +582498,2007-02-11 12:15:00,KIDNAPPING,CENTRAL,MASON ST / SUTTER ST,-122.410246553741,37.7890162035598 +582592,2007-02-11 02:39:00,DRUNKENNESS,NORTHERN,FILLMORE ST / PACIFIC AV,-122.434737569068,37.7933470685534 +582598,2007-02-11 02:00:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +582637,2007-02-11 00:01:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +582660,2007-02-10 22:31:00,DRUNKENNESS,NORTHERN,1600 Block of POLK ST,-122.421033090567,37.79193935048 +582764,2007-02-10 16:30:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413631253258,37.7848053746211 +582908,2007-02-10 06:07:00,DRUNKENNESS,TARAVAL,SLOAT BL / 42ND AV,-122.477982448114,37.734594614987294 +582948,2007-02-10 01:20:00,KIDNAPPING,CENTRAL,BATTERY ST / PINE ST,-122.399765570157,37.7922593176775 +582954,2007-02-10 00:57:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +583054,2007-02-09 19:56:00,DRUNKENNESS,NORTHERN,FILLMORE ST / SUTTER ST,-122.433274677957,37.7860862387282 +583064,2007-02-09 19:18:00,KIDNAPPING,TARAVAL,1800 Block of 44TH AV,-122.503265747413,37.75210366076929 +583277,2007-02-09 08:25:00,ARSON,RICHMOND,400 Block of ARGUELLO BL,-122.458857560736,37.78220007231379 +583334,2007-02-09 00:11:00,DRUNKENNESS,SOUTHERN,100 Block of STEUART ST,-122.392349764257,37.7926450897756 +583357,2007-02-08 22:50:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +583699,2007-02-08 02:08:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +583709,2007-02-08 00:10:00,RUNAWAY,TENDERLOIN,TAYLOR ST / ELLIS ST,-122.411141948101,37.7850736197499 +583713,2007-02-08 00:05:00,DRUNKENNESS,MISSION,3100 Block of 24TH ST,-122.414623849785,37.75241809285711 +583714,2007-02-08 00:04:00,ARSON,INGLESIDE,200 Block of JOHNFSHELLEY DR,-122.423304635548,37.72266944630029 +583831,2007-02-07 18:45:00,DRUNKENNESS,MISSION,800 Block of VALENCIA ST,-122.421380986073,37.7589148884581 +583879,2007-02-07 17:00:00,RUNAWAY,CENTRAL,2100 Block of POWELL ST,-122.411607253459,37.8044472417935 +583895,2007-02-07 15:55:00,DRUNKENNESS,NORTHERN,400 Block of HAIGHT ST,-122.429644614552,37.7722642986091 +583923,2007-02-07 14:30:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +583933,2007-02-07 13:40:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +583991,2007-02-07 11:38:00,DRUNKENNESS,SOUTHERN,MARKET ST / SOUTH VAN NESS AV,-122.419257894814,37.7751462916539 +584132,2007-02-07 00:43:00,DRUNKENNESS,MISSION,CLINTONPARK ST / VALENCIA ST,-122.422310623628,37.769278577573296 +584206,2007-02-06 20:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +584236,2007-02-06 19:10:00,DRUNKENNESS,MISSION,3300 Block of 25TH ST,-122.418036313252,37.7507099034324 +584370,2007-02-06 14:30:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +584521,2007-02-06 03:56:00,DRUNKENNESS,MISSION,300 Block of SANCHEZ ST,-122.430871936382,37.7635433745815 +584772,2007-02-05 14:30:00,ARSON,TARAVAL,3100 Block of ORTEGA ST,-122.497242493708,37.7513958957007 +584800,2007-02-05 13:12:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +584846,2007-02-05 10:59:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +584909,2007-02-05 04:45:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411965795229,37.78491418595621 +584930,2007-02-05 01:25:00,DRUNKENNESS,TARAVAL,20TH AV / TARAVAL ST,-122.476763739953,37.7430015617463 +585018,2007-01-28 19:00:00,ARSON,INGLESIDE,600 Block of BENTON AV,-122.417241481037,37.7338561150951 +585075,2007-01-28 16:29:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +585269,2007-01-28 00:45:00,DRUNKENNESS,MISSION,20TH ST / BRYANT ST,-122.409770376757,37.7591952167406 +585281,2007-01-28 00:01:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +585340,2007-01-27 21:30:00,KIDNAPPING,SOUTHERN,1100 Block of MISSION ST,-122.411723778126,37.7786674439132 +585346,2007-01-27 21:00:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +585359,2007-01-27 20:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +585433,2007-01-27 16:15:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +585501,2007-01-27 12:15:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +585533,2007-01-27 10:00:00,RUNAWAY,INGLESIDE,300 Block of ELSIE ST,-122.420333446946,37.73863053195471 +585704,2007-01-26 19:55:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.505923256341,37.761339931633 +586035,2007-01-25 20:30:00,DRUNKENNESS,TARAVAL,300 Block of HEAD ST,-122.464462764733,37.713613885215295 +586091,2007-01-25 18:00:00,RUNAWAY,NORTHERN,VANNESS AV / GEARY BL,-122.421395819115,37.7856843389472 +586101,2007-01-25 17:15:00,KIDNAPPING,TARAVAL,SANALESO AV / MONTEREY BL,-122.464418050209,37.73228336156271 +586321,2007-01-25 01:30:00,DRUNKENNESS,PARK,GEARY BL / MASONIC AV,-122.448043124454,37.7823710354886 +586376,2007-01-24 22:00:00,DRUNKENNESS,MISSION,0 Block of CUMBERLAND ST,-122.424744325377,37.7590407566351 +586677,2007-01-23 22:23:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409536662692,37.78269112134721 +586791,2007-01-23 17:00:00,ARSON,BAYVIEW,1600 Block of 20TH ST,-122.397736262234,37.7598828513609 +586907,2007-01-23 12:11:00,DRUNKENNESS,CENTRAL,JONES ST / CALIFORNIA ST,-122.414108917008,37.7914147927762 +587186,2007-01-22 16:30:00,KIDNAPPING,MISSION,24TH ST / OSAGE ST,-122.419018144895,37.7522051632838 +587188,2007-01-22 16:25:00,DRUNKENNESS,PARK,0 Block of HENRY ST,-122.432239209019,37.7666730659112 +587218,2007-01-22 14:40:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +587330,2007-01-22 08:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +587518,2007-01-14 17:04:00,KIDNAPPING,SOUTHERN,700 Block of FOLSOM ST,-122.400835288756,37.7823579830536 +587519,2007-01-14 17:04:00,KIDNAPPING,SOUTHERN,700 Block of FOLSOM ST,-122.400835288756,37.7823579830536 +587573,2007-01-14 13:00:00,ARSON,BAYVIEW,0 Block of DOUBLEROCK ST,-122.387775002515,37.7204658651293 +587701,2007-01-14 00:10:00,KIDNAPPING,RICHMOND,CHABOT TR / TURK ST,-122.451542905387,37.7780499161884 +587797,2007-01-13 20:20:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +588047,2007-01-13 01:34:00,DRUNKENNESS,SOUTHERN,400 Block of BRANNAN ST,-122.395898776686,37.7787487070192 +588062,2007-01-13 00:48:00,DRUNKENNESS,SOUTHERN,900 Block of FOLSOM ST,-122.404974448604,37.7789337876718 +588104,2007-01-12 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +588121,2007-01-12 22:30:00,DRUNKENNESS,TARAVAL,2300 Block of 24TH AV,-122.48118317163,37.7437268170337 +588133,2007-01-12 21:41:00,DRUNKENNESS,TARAVAL,1300 Block of 9TH AV,-122.466175257158,37.7630911994124 +588182,2007-01-12 19:18:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +588244,2007-01-12 17:00:00,KIDNAPPING,MISSION,300 Block of DOLORES ST,-122.426118705944,37.7635158382169 +588253,2007-01-12 16:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +588396,2007-01-12 10:25:00,ARSON,TARAVAL,0 Block of BERKSHIRE WY,-122.497547457953,37.73135581086311 +588562,2007-01-11 19:30:00,KIDNAPPING,PARK,HAIGHT ST / STANYAN ST,-122.45353456066002,37.76916629780521 +589614,2007-01-09 08:43:00,ARSON,BAYVIEW,1600 Block of NEWCOMB AV,-122.390069353683,37.7354614642023 +589636,2007-01-09 07:35:00,RUNAWAY,BAYVIEW,1700 Block of QUESADA AV,-122.392393403915,37.733745156808894 +589647,2007-01-09 06:30:00,ARSON,BAYVIEW,100 Block of ALBATROSS CT,-122.372202831457,37.728381194358704 +589773,2007-01-08 18:32:00,DRUNKENNESS,MISSION,2700 Block of 24TH ST,-122.407745321325,37.7529342790976 +589884,2007-01-08 14:00:00,KIDNAPPING,SOUTHERN,500 Block of HARRISON ST,-122.393566801734,37.78564735356311 +590098,2006-12-31 22:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +590141,2006-12-31 20:00:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +590158,2006-12-31 19:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +590236,2006-12-31 14:15:00,KIDNAPPING,BAYVIEW,1600 Block of MCKINNON AV,-122.390670834934,37.736611643242 +590254,2006-12-31 13:15:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +590272,2006-12-31 12:20:00,DRUNKENNESS,NORTHERN,POLK ST / EDDY ST,-122.419183096362,37.78309982445921 +590321,2006-12-31 09:30:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +590373,2006-12-31 02:12:00,DRUNKENNESS,SOUTHERN,6TH ST / BRYANT ST,-122.402527594665,37.7760382838346 +590381,2006-12-31 01:25:00,RUNAWAY,MISSION,3900 Block of 18TH ST,-122.43169957972,37.7610323441172 +590427,2006-12-30 22:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +590523,2006-12-30 17:30:00,KIDNAPPING,TENDERLOIN,400 Block of TURK ST,-122.416349428183,37.7825569563078 +590547,2006-12-30 16:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +590798,2006-12-29 21:00:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +590824,2006-12-29 19:25:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +590886,2006-12-29 15:55:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +591046,2006-12-29 01:30:00,ARSON,INGLESIDE,BOSWORTH ST / ELK ST,-122.439935255904,37.7348563726656 +591065,2006-12-29 00:01:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +591125,2006-12-28 19:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +591143,2006-12-28 18:40:00,DRUNKENNESS,PARK,1600 Block of TURK ST,-122.43627497948098,37.7800247331065 +591233,2006-12-28 13:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +591302,2006-12-28 08:00:00,KIDNAPPING,INGLESIDE,1100 Block of GIRARD ST,-122.400799927468,37.7183839572394 +591410,2006-12-27 19:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +591449,2006-12-27 17:20:00,DRUNKENNESS,NORTHERN,900 Block of LARKIN ST,-122.418293311982,37.78679355639839 +591707,2006-12-26 20:20:00,DRUNKENNESS,NORTHERN,1400 Block of TURK ST,-122.43298921345,37.7804437011568 +591720,2006-12-26 19:45:00,RUNAWAY,NORTHERN,700 Block of VANNESS AV,-122.420576428438,37.782453353282 +591803,2006-12-26 15:00:00,RUNAWAY,INGLESIDE,100 Block of SICKLES AV,-122.453519238639,37.7094614831264 +591970,2006-12-26 00:01:00,DRUNKENNESS,SOUTHERN,600 Block of 3RD ST,-122.393559121228,37.7794201313347 +592137,2006-12-25 08:55:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +592186,2006-12-25 00:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +592204,2006-12-25 00:01:00,DRUNKENNESS,CENTRAL,600 Block of VALLEJO ST,-122.40756223974,37.7986781256079 +592246,2006-12-17 21:00:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +592357,2006-12-17 13:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +592453,2006-12-17 04:44:00,DRUNKENNESS,CENTRAL,1500 Block of CLAY ST,-122.41817897481,37.79280546575021 +592494,2006-12-17 01:15:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +592537,2006-12-16 23:28:00,ARSON,BAYVIEW,ILLINOIS ST / 25TH ST,-122.386812776307,37.7528899958678 +592586,2006-12-16 21:00:00,ARSON,INGLESIDE,200 Block of STAPLES AV,-122.447728292145,37.729022854072 +592658,2006-12-16 17:00:00,RUNAWAY,NORTHERN,0 Block of WALLER ST,-122.424535363098,37.771951149902 +592777,2006-12-16 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +592787,2006-12-16 10:00:00,KIDNAPPING,CENTRAL,1300 Block of PINE ST,-122.418050744324,37.7899896643167 +592816,2006-12-16 06:15:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411965795229,37.78491418595621 +592936,2006-12-15 21:29:00,ARSON,BAYVIEW,100 Block of HUNTERSPTEXPWY EX,-122.376984074382,37.7340751122677 +593071,2006-12-15 15:00:00,KIDNAPPING,INGLESIDE,100 Block of 29TH ST,-122.423548877173,37.74394400245 +593075,2006-12-15 14:47:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +593370,2006-12-14 20:02:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.4453467866,37.7702081959172 +593371,2006-12-14 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +593395,2006-12-14 19:00:00,RUNAWAY,TARAVAL,2200 Block of 21ST AV,-122.477960327299,37.745738942965495 +593448,2006-12-14 16:15:00,DRUNKENNESS,CENTRAL,600 Block of VALLEJO ST,-122.407548281297,37.7987908964449 +593684,2006-12-13 22:20:00,ARSON,INGLESIDE,BLYTHDALE AV / SANTOS ST,-122.418770479936,37.7107332124 +593853,2006-12-13 14:00:00,KIDNAPPING,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +593860,2006-12-13 13:30:00,DRUNKENNESS,INGLESIDE,MISSION ST / RUSSIA AV,-122.437150548382,37.7215739965112 +593965,2006-12-13 07:25:00,RUNAWAY,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +594045,2006-12-12 23:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +594059,2006-12-12 21:51:00,DRUNKENNESS,MISSION,24TH ST / ORANGE ST,-122.420085439587,37.75213833428089 +594130,2006-12-12 18:20:00,KIDNAPPING,SOUTHERN,1100 Block of MISSION ST,-122.412736707425,37.7777124404316 +594295,2006-12-12 08:40:00,DRUNKENNESS,TARAVAL,2500 Block of JUDAH ST,-122.489330370437,37.7612120995391 +594385,2006-12-11 21:30:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +594447,2006-12-11 18:30:00,RUNAWAY,INGLESIDE,0 Block of OLIVER ST,-122.450102910761,37.7089456366141 +594706,2006-12-03 22:28:00,DRUNKENNESS,NORTHERN,400 Block of HAIGHT ST,-122.429622714719,37.772155828498704 +594737,2006-12-03 21:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +594889,2006-12-03 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +595004,2006-12-03 02:19:00,DRUNKENNESS,TARAVAL,19TH AV / TARAVAL ST,-122.475644251197,37.7430505534925 +595021,2006-12-03 01:45:00,ARSON,BAYVIEW,1700 Block of LASALLE AV,-122.391434800433,37.7381270935013 +595035,2006-12-03 01:00:00,KIDNAPPING,NORTHERN,1800 Block of GOUGH ST,-122.425779226981,37.7904133229016 +595039,2006-12-03 00:56:00,DRUNKENNESS,INGLESIDE,100 Block of RIPLEY ST,-122.412324243492,37.7442629265303 +595058,2006-12-02 23:52:00,DRUNKENNESS,MISSION,2500 Block of MISSION ST,-122.418753848152,37.7562250119744 +595071,2006-12-02 23:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +595072,2006-12-02 23:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +595074,2006-12-02 23:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +595090,2006-12-02 22:12:00,DRUNKENNESS,BAYVIEW,SAN BRUNO AV / WAYLAND ST,-122.403104571775,37.7264333788753 +595158,2006-12-02 18:10:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +595163,2006-12-02 18:00:00,RUNAWAY,BAYVIEW,0 Block of WILLIAMS AV,-122.394697591949,37.729613518861896 +595224,2006-12-02 15:00:00,ARSON,INGLESIDE,0 Block of BLYTHDALE AV,-122.417678812123,37.7107672954351 +595307,2006-12-02 10:12:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +595353,2006-12-02 03:00:00,KIDNAPPING,RICHMOND,2300 Block of POST ST,-122.440759704072,37.784125990977294 +595371,2006-12-02 01:51:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +595406,2006-12-01 23:25:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +595443,2006-12-01 22:04:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +595511,2006-12-01 19:00:00,KIDNAPPING,INGLESIDE,0 Block of REGENT ST,-122.456509768403,37.7096164546027 +595517,2006-12-01 18:40:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435563016294,37.760801062884 +595668,2006-12-01 12:00:00,KIDNAPPING,TARAVAL,OCEAN AV / MIRAMAR AV,-122.458189948785,37.7243164693673 +595789,2006-12-01 05:45:00,ARSON,SOUTHERN,MINNA ST / 8TH ST,-122.412620258006,37.7770259271797 +595799,2006-12-01 03:03:00,DRUNKENNESS,MISSION,2100 Block of HARRISON ST,-122.412799905636,37.76252741659589 +595807,2006-12-01 02:00:00,KIDNAPPING,INGLESIDE,3100 Block of MISSION ST,-122.418732763058,37.74749552685429 +595892,2006-11-30 21:55:00,KIDNAPPING,SOUTHERN,TEHAMA ST / 5TH ST,-122.404407887961,37.7810759636856 +595895,2006-11-30 21:45:00,KIDNAPPING,INGLESIDE,100 Block of HAVELOCK ST,-122.444611707927,37.726681797079294 +595911,2006-11-30 20:36:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +596304,2006-11-29 20:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +596513,2006-11-29 10:30:00,KIDNAPPING,INGLESIDE,30TH ST / MISSION ST,-122.421970919029,37.74237522452549 +596623,2006-11-28 22:48:00,DRUNKENNESS,SOUTHERN,7TH ST / MISSION ST,-122.410939205552,37.779212259008496 +596672,2006-11-28 19:45:00,ARSON,NORTHERN,400 Block of LILY ST,-122.427951482166,37.7739135802819 +596975,2006-11-27 23:02:00,DRUNKENNESS,SOUTHERN,100 Block of RUSS ST,-122.407532192495,37.7781942181426 +596989,2006-11-27 21:45:00,DRUNKENNESS,NORTHERN,3100 Block of FILLMORE ST,-122.435889235002,37.7987183534813 +597000,2006-11-27 20:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +597044,2006-11-27 18:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +597048,2006-11-27 18:17:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +597078,2006-11-27 16:51:00,DRUNKENNESS,PARK,1700 Block of WALLER ST,-122.452540312646,37.7683901140691 +597136,2006-11-27 14:10:00,RUNAWAY,TARAVAL,10TH AV / JUDAH ST,-122.467252134602,37.762125725360896 +597289,2006-11-27 01:22:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421128029505,37.7435550542265 +597381,2006-11-19 20:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +597386,2006-11-19 20:00:00,RUNAWAY,CENTRAL,600 Block of FRANCISCO ST,-122.41557882881,37.8044706948304 +597467,2006-11-19 15:50:00,DRUNKENNESS,BAYVIEW,0 Block of GIANTS DR,-122.38750147945,37.716878646429 +597653,2006-11-18 23:31:00,DRUNKENNESS,TARAVAL,2300 Block of 46TH AV,-122.504616183465,37.7426888551295 +597674,2006-11-18 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +597722,2006-11-18 20:35:00,KIDNAPPING,RICHMOND,700 Block of PRESIDIO AV,-122.446264333485,37.7849034219604 +597744,2006-11-18 19:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +597759,2006-11-18 18:10:00,KIDNAPPING,BAYVIEW,100 Block of CAMERON WY,-122.387247607197,37.7208692407802 +597875,2006-11-18 12:30:00,KIDNAPPING,NORTHERN,2000 Block of GREENWICH ST,-122.43340738035,37.7992089703227 +597922,2006-11-18 09:36:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +597987,2006-11-18 02:01:00,DRUNKENNESS,SOUTHERN,7TH ST / FOLSOM ST,-122.407844136792,37.7767462195389 +598040,2006-11-17 23:00:00,KIDNAPPING,CENTRAL,600 Block of CHESTNUT ST,-122.414077045538,37.8037038923979 +598351,2006-11-17 08:30:00,RUNAWAY,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +598371,2006-11-17 08:00:00,RUNAWAY,TARAVAL,500 Block of HOLLOWAY AV,-122.458703350333,37.7217839385443 +598462,2006-11-16 23:05:00,DRUNKENNESS,SOUTHERN,OTIS ST / MCCOPPIN ST,-122.420347208832,37.7717690722244 +598539,2006-11-16 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +598543,2006-11-16 19:00:00,KIDNAPPING,INGLESIDE,400 Block of MADRID ST,-122.432290064854,37.7224064713036 +598928,2006-11-15 18:00:00,RUNAWAY,INGLESIDE,100 Block of SICKLES AV,-122.453519238639,37.7094614831264 +599161,2006-11-15 01:42:00,ARSON,PARK,ANZAVISTA AV / BAKER ST,-122.441744274102,37.7798653645628 +599205,2006-11-14 22:25:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +599224,2006-11-14 21:30:00,RUNAWAY,TARAVAL,1200 Block of 11TH AV,-122.468584875687,37.7648653652411 +599286,2006-11-14 17:49:00,DRUNKENNESS,TENDERLOIN,100 Block of ELLIS ST,-122.408269031453,37.78538311057971 +599327,2006-11-14 15:30:00,RUNAWAY,RICHMOND,700 Block of 9TH AV,-122.467086795682,37.7742658827774 +599482,2006-11-14 07:20:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +599514,2006-11-14 01:15:00,KIDNAPPING,INGLESIDE,MISSION ST / SILVER AV,-122.431295002963,37.7287297938303 +599596,2006-11-13 19:30:00,KIDNAPPING,SOUTHERN,700 Block of MARKET ST,-122.404756583284,37.7864540511999 +599698,2006-11-13 14:41:00,KIDNAPPING,CENTRAL,900 Block of POST ST,-122.417634160005,37.787063186215 +599865,2006-11-13 07:00:00,KIDNAPPING,INGLESIDE,100 Block of KELLOCH AV,-122.41338600281,37.7089951218333 +599905,2006-11-13 00:01:00,DRUNKENNESS,PARK,1600 Block of TURK ST,-122.43627497948098,37.7800247331065 +599985,2006-11-05 19:22:00,DRUNKENNESS,SOUTHERN,400 Block of MARKET ST,-122.398623347456,37.7912863462309 +599993,2006-11-05 18:40:00,DRUNKENNESS,RICHMOND,2200 Block of CLEMENT ST,-122.483276034558,37.7820439180269 +600004,2006-11-05 18:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +600034,2006-11-05 17:00:00,KIDNAPPING,INGLESIDE,0 Block of PATTON ST,-122.423138550221,37.7379014699494 +600078,2006-11-05 14:00:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +600155,2006-11-05 09:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +600157,2006-11-05 09:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +600173,2006-11-05 07:55:00,ARSON,RICHMOND,100 Block of AVENUE OF THE PALMS,-122.374397142153,37.819923463743 +600227,2006-11-05 01:02:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +600266,2006-11-04 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +600437,2006-11-04 14:00:00,RUNAWAY,CENTRAL,1600 Block of THE EMBARCADERONORTH ST,-122.410774214375,37.8084350175869 +600527,2006-11-04 09:00:00,KIDNAPPING,TARAVAL,100 Block of WILSON ST,-122.460243205079,37.7085434606504 +600581,2006-11-04 02:45:00,KIDNAPPING,SOUTHERN,900 Block of MISSION ST,-122.40805253847,37.7815668300024 +600590,2006-11-04 02:15:00,KIDNAPPING,INGLESIDE,0 Block of PARK ST,-122.424836824804,37.7367285261242 +600601,2006-11-04 02:00:00,KIDNAPPING,INGLESIDE,EXCELSIOR AV / LISBON ST,-122.431252746655,37.7251072655052 +600942,2006-11-03 07:15:00,KIDNAPPING,RICHMOND,5400 Block of CALIFORNIA ST,-122.475910046279,37.7842399894993 +600980,2006-11-03 00:46:00,KIDNAPPING,RICHMOND,4300 Block of CALIFORNIA ST,-122.464048583692,37.7851164846517 +601085,2006-11-02 18:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +601138,2006-11-02 15:13:00,DRUNKENNESS,NORTHERN,0 Block of HAIGHT ST,-122.422019055933,37.773175347210895 +601240,2006-11-02 07:15:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +601243,2006-11-02 07:15:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +601244,2006-11-02 07:15:00,RUNAWAY,TARAVAL,1800 Block of VICENTE ST,-122.48560378101,37.7388214326705 +601281,2006-11-01 23:30:00,RUNAWAY,INGLESIDE,100 Block of COLLEGE AV,-122.426495413982,37.735348450768 +601469,2006-11-01 12:25:00,ARSON,MISSION,3200 Block of 17TH ST,-122.418992686625,37.7634081145034 +601565,2006-11-01 09:02:00,DRUNKENNESS,TARAVAL,1700 Block of OCEAN AV,-122.460757719049,37.7247714119319 +601579,2006-11-01 08:52:00,DRUNKENNESS,SOUTHERN,MARKET ST / 12TH ST,-122.420254960348,37.774358171070105 +601609,2006-11-01 07:45:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +601615,2006-11-01 07:30:00,RUNAWAY,INGLESIDE,600 Block of MONTEREY BL,-122.450026603043,37.731440080612295 +601667,2006-11-01 01:25:00,DRUNKENNESS,NORTHERN,300 Block of FULTON ST,-122.422536478306,37.7787958771466 +601671,2006-11-01 01:02:00,DRUNKENNESS,NORTHERN,POLK ST / HEMLOCK ST,-122.420021471047,37.7872807076108 +601763,2006-10-31 23:10:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +601996,2006-10-31 14:00:00,RUNAWAY,TARAVAL,1400 Block of PORTOLA DR,-122.467321910416,37.7383653416033 +602105,2006-10-31 06:49:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +602200,2006-10-30 21:23:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +602219,2006-10-30 20:30:00,KIDNAPPING,SOUTHERN,MARKET ST / NEWMONTGOMERY ST,-122.402070243227,37.788719868813295 +602374,2006-10-30 14:40:00,DRUNKENNESS,BAYVIEW,NEWCOMB AV / 3RD ST,-122.390416955474,37.7355926105862 +602441,2006-10-30 11:00:00,KIDNAPPING,RICHMOND,300 Block of 8TH AV,-122.466424377549,37.7818716046508 +602694,2006-10-22 17:34:00,ARSON,BAYVIEW,5800 Block of 3RD ST,-122.394722845179,37.72475609595 +602794,2006-10-22 12:30:00,KIDNAPPING,INGLESIDE,0 Block of SAINT MARYS AV,-122.427610068865,37.7346587567211 +602862,2006-10-22 06:29:00,ARSON,BAYVIEW,2200 Block of MCKINNON AV,-122.401277106946,37.742615401833504 +602877,2006-10-22 02:33:00,KIDNAPPING,NORTHERN,2000 Block of BROADWAY ST,-122.430838378403,37.7948418077407 +602882,2006-10-22 02:04:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929231,37.7980180687744 +602891,2006-10-22 01:57:00,ARSON,CENTRAL,900 Block of BATTERY ST,-122.401404390633,37.7999951699934 +602902,2006-10-22 01:00:00,KIDNAPPING,TARAVAL,600 Block of PLYMOUTH AV,-122.456014204653,37.7162176142474 +602916,2006-10-22 00:23:00,DRUNKENNESS,CENTRAL,GRANT AV / PACIFIC AV,-122.406831986427,37.7969028838908 +602961,2006-10-21 22:00:00,DRUNKENNESS,INGLESIDE,0 Block of PHELAN AV,-122.452428220398,37.725717254655706 +603250,2006-10-21 00:57:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413189430011,37.77127369135761 +603279,2006-10-20 23:51:00,DRUNKENNESS,CENTRAL,700 Block of SUTTER ST,-122.412718544555,37.7886466255672 +603300,2006-10-20 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +603316,2006-10-20 22:30:00,KIDNAPPING,TARAVAL,0 Block of BRUCE AV,-122.452610264842,37.7220679232799 +603335,2006-10-20 22:00:00,KIDNAPPING,NORTHERN,1900 Block of WASHINGTON ST,-122.425364132208,37.7927898432236 +603423,2006-10-20 18:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +603480,2006-10-20 16:20:00,DRUNKENNESS,MISSION,HARRISON ST / 26TH ST,-122.411595216432,37.7494360392756 +603615,2006-10-20 08:20:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +603691,2006-10-20 00:01:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +603722,2006-10-19 22:05:00,ARSON,INGLESIDE,0 Block of OLIVER ST,-122.450102910761,37.7089456366141 +603804,2006-10-19 17:45:00,DRUNKENNESS,MISSION,HARRISON ST / 26TH ST,-122.411595216432,37.7494360392756 +603855,2006-10-19 15:42:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +603903,2006-10-19 12:45:00,DRUNKENNESS,TARAVAL,2200 Block of 14TH AV,-122.470359608661,37.7460753397163 +603907,2006-10-19 12:43:00,DRUNKENNESS,SOUTHERN,NATOMA ST / 8TH ST,-122.412160931881,37.7766597984985 +604117,2006-10-18 19:15:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +604118,2006-10-18 19:15:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +604373,2006-10-18 05:09:00,ARSON,BAYVIEW,24TH ST / MICHIGAN ST,-122.385974831353,37.7542246703742 +604506,2006-10-17 18:48:00,DRUNKENNESS,NORTHERN,1100 Block of LAGUNA ST,-122.427415796369,37.78181074904449 +604551,2006-10-17 17:00:00,KIDNAPPING,NORTHERN,1300 Block of VANNESS AV,-122.42163446728,37.7878032143885 +604640,2006-10-17 12:45:00,ARSON,BAYVIEW,1100 Block of OAKDALE AV,-122.382192583973,37.7298874272325 +604656,2006-10-17 12:00:00,RUNAWAY,PARK,4TH AV / PARNASSUS AV,-122.460843423942,37.7626280780231 +604661,2006-10-17 12:00:00,KIDNAPPING,PARK,PARNASSUS AV / 5TH AV,-122.461902150841,37.7623632346529 +604803,2006-10-16 23:36:00,DRUNKENNESS,TARAVAL,9TH AV / JUDAH ST,-122.466180771685,37.7621738188702 +604970,2006-10-16 16:30:00,KIDNAPPING,INGLESIDE,500 Block of VELASCO AV,-122.41726390337,37.709302635258105 +604996,2006-10-16 15:30:00,RUNAWAY,CENTRAL,BROADWAY ST / STOCKTON ST,-122.408622974321,37.7976265594608 +605496,2006-10-08 02:01:00,DRUNKENNESS,NORTHERN,POLK ST / BROADWAY ST,-122.421772135304,37.79594615319579 +605527,2006-10-07 23:55:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +605551,2006-10-07 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +605555,2006-10-07 23:00:00,RUNAWAY,BAYVIEW,0 Block of WESTPOINT RD,-122.380291012279,37.7354366994577 +605648,2006-10-07 18:00:00,ARSON,BAYVIEW,900 Block of HUDSON AV,-122.376140864857,37.7330836007771 +605651,2006-10-07 17:57:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +605661,2006-10-07 17:34:00,DRUNKENNESS,NORTHERN,VANNESS AV / GROVE ST,-122.419884939457,37.77825108324121 +605685,2006-10-07 16:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +605692,2006-10-07 16:00:00,DRUNKENNESS,CENTRAL,800 Block of BEACH ST,-122.423047461189,37.8063812777079 +605786,2006-10-07 11:00:00,RUNAWAY,BAYVIEW,0 Block of DEDMAN CT,-122.384904088415,37.7370621011948 +605831,2006-10-07 05:00:00,ARSON,BAYVIEW,1600 Block of DAVIDSON AV,-122.392447441376,37.746275498295 +605925,2006-10-06 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +605927,2006-10-06 23:00:00,DRUNKENNESS,CENTRAL,300 Block of BROADWAY ST,-122.40367998233,37.7981913307058 +605998,2006-10-06 19:41:00,DRUNKENNESS,BAYVIEW,0 Block of LEDYARD ST,-122.401992486421,37.7332878362205 +606195,2006-10-06 12:33:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +606296,2006-10-06 08:00:00,KIDNAPPING,NORTHERN,1800 Block of VANNESS AV,-122.42261368279,37.7926430342855 +606297,2006-10-06 08:00:00,KIDNAPPING,NORTHERN,1800 Block of VANNESS AV,-122.42261368279,37.7926430342855 +606328,2006-10-06 06:24:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +606337,2006-10-06 05:15:00,ARSON,BAYVIEW,INNES AV / HAWES ST,-122.377652484305,37.73307178406571 +606345,2006-10-06 02:58:00,ARSON,RICHMOND,1200 Block of ELCAMINODELMAR ST,-122.496810857029,37.7858595062715 +606357,2006-10-06 01:15:00,DRUNKENNESS,SOUTHERN,100 Block of 3RD ST,-122.400916029025,37.7854574902997 +606358,2006-10-06 01:10:00,DRUNKENNESS,TARAVAL,100 Block of SADOWA ST,-122.457559461122,37.7123623937181 +606359,2006-10-06 01:03:00,ARSON,BAYVIEW,200 Block of JENNINGS ST,-122.378478857665,37.7384750481632 +606462,2006-10-05 20:00:00,DRUNKENNESS,INGLESIDE,3500 Block of SAN BRUNO AV,-122.39998513448,37.71700871544579 +606537,2006-10-05 17:22:00,DRUNKENNESS,SOUTHERN,1500 Block of MARKET ST,-122.419842305148,37.7748226184309 +606637,2006-10-05 11:50:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +606946,2006-10-04 13:14:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409536662692,37.78269112134721 +607443,2006-10-03 01:46:00,ARSON,PARK,HAIGHT ST / STANYAN ST,-122.45353456066002,37.76916629780521 +607509,2006-10-02 20:55:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.408368579345,37.7807784253732 +607521,2006-10-02 20:11:00,DRUNKENNESS,RICHMOND,CALIFORNIA ST / 8TH AV,-122.466694503398,37.7847149225045 +607650,2006-10-02 15:19:00,ARSON,SOUTHERN,1500 Block of FOLSOM ST,-122.414705605518,37.7711178632173 +607657,2006-10-02 15:00:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +607905,2006-10-02 00:04:00,ARSON,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +607918,2006-10-02 00:01:00,DRUNKENNESS,BAYVIEW,1000 Block of INGERSON AV,-122.393894531353,37.71969931085261 +607981,2006-09-24 19:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +608096,2006-09-24 13:44:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +608130,2006-09-24 11:25:00,KIDNAPPING,TARAVAL,0 Block of LAGUNITAS DR,-122.473560438502,37.7330634724212 +608191,2006-09-24 03:00:00,ARSON,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +608273,2006-09-23 22:30:00,DRUNKENNESS,NORTHERN,0 Block of GROVE ST,-122.41742986085,37.7785349354394 +608279,2006-09-23 22:07:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +608280,2006-09-23 22:07:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +608406,2006-09-23 16:00:00,RUNAWAY,BAYVIEW,1500 Block of NEWCOMB AV,-122.388817917114,37.734752508079296 +608571,2006-09-23 02:50:00,DRUNKENNESS,TARAVAL,19TH AV / TARAVAL ST,-122.475644251197,37.7430505534925 +608583,2006-09-23 01:52:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405862214655,37.7979117105028 +608600,2006-09-23 01:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +608620,2006-09-22 23:50:00,DRUNKENNESS,CENTRAL,BROADWAY ST / STOCKTON ST,-122.408622974321,37.7976265594608 +608626,2006-09-22 23:28:00,DRUNKENNESS,NORTHERN,500 Block of HAIGHT ST,-122.431268066985,37.771946506645705 +608637,2006-09-22 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +608642,2006-09-22 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +608991,2006-09-22 04:50:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +609029,2006-09-22 00:05:00,RUNAWAY,CENTRAL,1300 Block of JONES ST,-122.414492198664,37.7936836007729 +609100,2006-09-21 20:00:00,DRUNKENNESS,MISSION,800 Block of GUERRERO ST,-122.42333669183,37.7579764753831 +609438,2006-09-21 00:50:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +609498,2006-09-20 21:27:00,DRUNKENNESS,TENDERLOIN,500 Block of EDDY ST,-122.416710733848,37.7833570390935 +609521,2006-09-20 20:30:00,KIDNAPPING,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +609535,2006-09-20 19:49:00,DRUNKENNESS,MISSION,2700 Block of FOLSOM ST,-122.41422734891898,37.7532831691873 +609622,2006-09-20 16:15:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +609688,2006-09-20 14:00:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +609898,2006-09-19 22:00:00,ARSON,TENDERLOIN,300 Block of ELLIS ST,-122.411965795229,37.78491418595621 +609918,2006-09-19 21:00:00,KIDNAPPING,TENDERLOIN,500 Block of OFARRELL ST,-122.413798415869,37.7856297942374 +609952,2006-09-19 19:20:00,KIDNAPPING,SOUTHERN,1800 Block of MARKET ST,-122.423715048532,37.7717810622866 +610007,2006-09-19 17:00:00,DRUNKENNESS,CENTRAL,BEACH ST / HYDE ST,-122.420564122317,37.8066567824467 +610433,2006-09-18 14:00:00,DRUNKENNESS,MISSION,22ND ST / CAPP ST,-122.417660640341,37.7555043420028 +610448,2006-09-18 13:18:00,RUNAWAY,INGLESIDE,200 Block of ARGONAUT AV,-122.414620256792,37.7107197085034 +610557,2006-09-18 02:50:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412054141237,37.7816136403158 +610569,2006-09-18 01:12:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +610602,2006-09-10 23:45:00,DRUNKENNESS,TENDERLOIN,300 Block of MASON ST,-122.409797430148,37.7864220856559 +610650,2006-09-10 20:05:00,DRUNKENNESS,MISSION,24TH ST / SOUTH VAN NESS AV,-122.416268632715,37.7523735149599 +610680,2006-09-10 19:00:00,ARSON,CENTRAL,600 Block of FILBERT ST,-122.410220142966,37.8013225692058 +610775,2006-09-10 14:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +610911,2006-09-10 02:40:00,DRUNKENNESS,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +610947,2006-09-10 01:20:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +611002,2006-09-09 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +611003,2006-09-09 23:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +611009,2006-09-09 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +611100,2006-09-09 18:30:00,KIDNAPPING,INGLESIDE,1200 Block of BRUSSELS ST,-122.401414094946,37.7168870604908 +611245,2006-09-09 11:30:00,KIDNAPPING,PARK,1100 Block of ARGUELLO BL,-122.457837209449,37.7666852184101 +611290,2006-09-09 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +611292,2006-09-09 07:46:00,DRUNKENNESS,CENTRAL,GEARY ST / LARKIN ST,-122.418090766692,37.7861007451645 +611351,2006-09-09 00:31:00,ARSON,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +611408,2006-09-08 22:04:00,DRUNKENNESS,CENTRAL,1500 Block of HYDE ST,-122.418272974845,37.795015366123295 +611716,2006-09-08 07:00:00,RUNAWAY,INGLESIDE,500 Block of CARTER ST,-122.423628041297,37.70880618460679 +611839,2006-09-07 20:04:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +612004,2006-09-07 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +612165,2006-09-06 21:45:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +612479,2006-09-06 00:50:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +612570,2006-09-05 19:10:00,ARSON,TENDERLOIN,300 Block of EDDY ST,-122.413790972781,37.7838365565348 +612635,2006-09-05 16:45:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +612640,2006-09-05 16:35:00,DRUNKENNESS,MISSION,CLARION AL / MISSION ST,-122.419478247917,37.763050767731 +612751,2006-09-05 11:12:00,DRUNKENNESS,SOUTHERN,MARKET ST / VANNESS AV,-122.419257894814,37.7751462916539 +612821,2006-09-05 04:00:00,ARSON,INGLESIDE,MALTA DR / OSHAUGHNESSY BL,-122.443603140785,37.736501778754 +613021,2006-09-04 15:42:00,DRUNKENNESS,MISSION,MISSION ST / 22ND ST,-122.418748733523,37.755437187509706 +613180,2006-09-04 04:51:00,DRUNKENNESS,SOUTHERN,MAIN ST / HARRISON ST,-122.390321524494,37.78813418743611 +613278,2006-08-27 19:42:00,KIDNAPPING,MISSION,3400 Block of 18TH ST,-122.419748993977,37.76186726489721 +613378,2006-08-27 13:26:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617192,37.778124778322 +613493,2006-08-27 03:00:00,KIDNAPPING,BAYVIEW,2900 Block of GRIFFITH ST,-122.389590374753,37.7165191329396 +613560,2006-08-26 23:40:00,DRUNKENNESS,MISSION,CASTRO ST / 18TH ST,-122.435002864298,37.7608878061194 +613592,2006-08-26 22:40:00,DRUNKENNESS,MISSION,24TH ST / SHOTWELL ST,-122.415173665801,37.7524407589917 +613618,2006-08-26 21:00:00,KIDNAPPING,INGLESIDE,200 Block of 30TH ST,-122.426193235661,37.742172682125286 +613807,2006-08-26 11:00:00,DRUNKENNESS,SOUTHERN,1000 Block of HOWARD ST,-122.408030111231,37.77912853798429 +613823,2006-08-26 09:55:00,KIDNAPPING,CENTRAL,900 Block of HYDE ST,-122.417044292614,37.78959527743221 +613962,2006-08-25 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +613990,2006-08-25 21:30:00,DRUNKENNESS,MISSION,2200 Block of MARKET ST,-122.431957685196,37.7649357189679 +614213,2006-08-25 11:01:00,DRUNKENNESS,MISSION,POTRERO AV / 16TH ST,-122.407538332319,37.7657827544276 +614305,2006-08-25 03:15:00,ARSON,MISSION,4600 Block of 18TH ST,-122.442481257641,37.760376636583096 +614338,2006-08-25 00:01:00,KIDNAPPING,MISSION,3100 Block of CESAR CHAVEZ ST,-122.412601127917,37.7483769641531 +614493,2006-08-24 17:27:00,DRUNKENNESS,SOUTHERN,1ST ST / MISSION ST,-122.397576409113,37.7897619308836 +614583,2006-08-24 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +614610,2006-08-24 12:45:00,RUNAWAY,INGLESIDE,700 Block of BRAZIL AV,-122.42879724776002,37.7218736245569 +614724,2006-08-24 02:44:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +614883,2006-08-23 18:21:00,DRUNKENNESS,NORTHERN,FILLMORE ST / GEARY BL,-122.432914603494,37.7843533426568 +614965,2006-08-23 15:00:00,KIDNAPPING,TARAVAL,800 Block of GONZALEZ DR,-122.480606348865,37.7175185873081 +615005,2006-08-23 13:10:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +615006,2006-08-23 13:10:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +615368,2006-08-22 15:00:00,ARSON,SOUTHERN,0 Block of MOSS ST,-122.40811239746,37.7777588128811 +615599,2006-08-21 23:00:00,KIDNAPPING,BAYVIEW,200 Block of HARBOR RD,-122.378268018481,37.7323807302226 +616090,2006-08-13 16:46:00,DRUNKENNESS,MISSION,26TH ST / SAN JOSE AV,-122.421287377812,37.7488499001814 +616188,2006-08-13 11:20:00,DRUNKENNESS,TARAVAL,21ST AV / KIRKHAM ST,-122.479004807013,37.759736903877 +616219,2006-08-13 08:17:00,DRUNKENNESS,MISSION,21ST ST / SHOTWELL ST,-122.415629332446,37.757232227914 +616242,2006-08-13 06:30:00,KIDNAPPING,TARAVAL,0 Block of DIAZ AV,-122.476290287585,37.7181624969759 +616284,2006-08-13 01:58:00,DRUNKENNESS,CENTRAL,1000 Block of CALIFORNIA ST,-122.412097259391,37.7917286199437 +616310,2006-08-13 00:10:00,KIDNAPPING,CENTRAL,BROADWAY ST / STOCKTON ST,-122.408622974321,37.7976265594608 +616366,2006-08-12 21:26:00,DRUNKENNESS,MISSION,3100 Block of 21ST ST,-122.417270975533,37.7571885589512 +616384,2006-08-12 20:01:00,DRUNKENNESS,CENTRAL,400 Block of COLUMBUS AV,-122.408407397189,37.79914232652379 +616394,2006-08-12 19:25:00,RUNAWAY,CENTRAL,STOCKTON ST / BEACH ST,-122.410690675854,37.8078911906226 +616403,2006-08-12 18:54:00,KIDNAPPING,BAYVIEW,1500 Block of PALOU AV,-122.389979849085,37.733521608374296 +616437,2006-08-12 17:23:00,DRUNKENNESS,MISSION,VALENCIA ST / 23RD ST,-122.420814360139,37.7537031921344 +616485,2006-08-12 14:30:00,ARSON,NORTHERN,100 Block of GROVE ST,-122.419085788323,37.7784353333225 +616496,2006-08-12 13:30:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +616613,2006-08-12 04:34:00,DRUNKENNESS,MISSION,24TH ST / VALENCIA ST,-122.420665771329,37.7521041553051 +616636,2006-08-12 02:10:00,ARSON,PARK,1200 Block of FELL ST,-122.438470772494,37.7740065457726 +616759,2006-08-11 20:31:00,DRUNKENNESS,RICHMOND,3800 Block of JACKSON ST,-122.458440893306,37.7893742101978 +616781,2006-08-11 19:52:00,DRUNKENNESS,INGLESIDE,30TH ST / MISSION ST,-122.421970919029,37.74237522452549 +616808,2006-08-11 18:50:00,RUNAWAY,BAYVIEW,800 Block of UNIVERSITY ST,-122.411162307172,37.71966877119901 +617100,2006-08-11 02:17:00,DRUNKENNESS,PARK,0 Block of CENTRAL AV,-122.443477161593,37.7692123967678 +617210,2006-08-10 19:23:00,DRUNKENNESS,TARAVAL,BROAD ST / CAPITOL AV,-122.45902362242902,37.7131719025215 +617225,2006-08-10 19:00:00,DRUNKENNESS,TARAVAL,2600 Block of VICENTE ST,-122.495268908047,37.7385038959713 +617259,2006-08-10 17:32:00,DRUNKENNESS,NORTHERN,1900 Block of SUTTER ST,-122.432723568262,37.7860994062773 +617312,2006-08-10 14:56:00,ARSON,CENTRAL,0 Block of VALPARAISO ST,-122.413586887199,37.8013817875401 +617366,2006-08-10 12:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +617439,2006-08-10 08:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +617460,2006-08-10 07:17:00,DRUNKENNESS,INGLESIDE,5000 Block of MISSION ST,-122.440388229194,37.7174580136719 +617502,2006-08-10 00:20:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +617625,2006-08-09 18:35:00,DRUNKENNESS,CENTRAL,1300 Block of JACKSON ST,-122.417021501122,37.7947626640609 +617692,2006-08-09 16:20:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +617981,2006-08-08 22:15:00,DRUNKENNESS,NORTHERN,1400 Block of POLK ST,-122.420523936293,37.7901172490517 +618122,2006-08-08 16:00:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +618309,2006-08-08 08:00:00,KIDNAPPING,MISSION,300 Block of SOUTH VAN NESS AV,-122.417791285277,37.7675856525236 +618334,2006-08-08 05:11:00,ARSON,INGLESIDE,1100 Block of SUNNYDALE AV,-122.412613134752,37.7109009555588 +618352,2006-08-08 02:00:00,KIDNAPPING,BAYVIEW,2200 Block of 23RD ST,-122.402087980578,37.754595548158 +618535,2006-08-07 16:20:00,ARSON,BAYVIEW,SALINAS AV / CARR ST,-122.397038459444,37.7208752949205 +618553,2006-08-07 15:24:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.407505446721,37.7811304562104 +618588,2006-08-07 12:45:00,ARSON,SOUTHERN,500 Block of THE EMBARCADEROSOUTH ST,-122.398586934103,37.7999893077504 +618835,2006-07-30 19:40:00,KIDNAPPING,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +618836,2006-07-30 19:40:00,KIDNAPPING,BAYVIEW,0 Block of DEDMAN CT,-122.384907106098,37.7368469604958 +618934,2006-07-30 15:35:00,ARSON,BAYVIEW,INNES AV / FITCH ST,-122.373894389535,37.7309368356017 +619013,2006-07-30 11:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +619081,2006-07-30 01:24:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +619441,2006-07-29 05:09:00,KIDNAPPING,BAYVIEW,3RD ST / VANDYKE AV,-122.392625489263,37.72928044321751 +619544,2006-07-28 22:09:00,DRUNKENNESS,RICHMOND,1600 Block of BRODERICK ST,-122.441565231515,37.7855194960542 +619576,2006-07-28 20:00:00,KIDNAPPING,NORTHERN,FILLMORE ST / VALLEJO ST,-122.435115362825,37.7952252533641 +619591,2006-07-28 20:00:00,KIDNAPPING,TENDERLOIN,100 Block of JONES ST,-122.412249767634,37.782556330202 +619756,2006-07-28 14:00:00,KIDNAPPING,INGLESIDE,900 Block of DELANO AV,-122.447088963226,37.7168150536871 +619934,2006-07-28 00:01:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +619947,2006-07-27 23:58:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +620265,2006-07-27 07:12:00,DRUNKENNESS,PARK,CARL ST / COLE ST,-122.449958075249,37.7658000842584 +620383,2006-07-26 21:27:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +620769,2006-07-25 22:42:00,DRUNKENNESS,MISSION,4000 Block of 18TH ST,-122.434446928667,37.7608670671665 +621062,2006-07-25 09:20:00,RUNAWAY,TARAVAL,300 Block of ASHTON AV,-122.462205802802,37.723954107160296 +621114,2006-07-25 00:52:00,ARSON,BAYVIEW,1200 Block of LANE ST,-122.387572026287,37.7344513906583 +621204,2006-07-24 20:21:00,DRUNKENNESS,MISSION,2400 Block of BRYANT ST,-122.409436313449,37.7551775435269 +621254,2006-07-24 17:15:00,KIDNAPPING,SOUTHERN,500 Block of JESSIE ST,-122.409776479312,37.7810558831366 +621325,2006-07-24 13:38:00,DRUNKENNESS,TARAVAL,100 Block of JULES AV,-122.461169042517,37.72094221707541 +621350,2006-07-24 12:30:00,KIDNAPPING,INGLESIDE,0 Block of EDINBURGH ST,-122.426811682595,37.72799786551021 +621466,2006-07-24 01:28:00,DRUNKENNESS,TARAVAL,CAPITOL AV / FARALLONES ST,-122.459033097812,37.714056268706 +621611,2006-07-16 18:05:00,DRUNKENNESS,MISSION,3700 Block of 21ST ST,-122.430967919367,37.7563637738131 +621623,2006-07-16 17:32:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.413261970103,37.752610055276 +621823,2006-07-16 03:00:00,ARSON,BAYVIEW,RANKIN ST / NEWCOMB AV,-122.397253629957,37.73946575514179 +621831,2006-07-16 02:20:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.396845266741,37.778500226754 +621832,2006-07-16 02:20:00,DRUNKENNESS,SOUTHERN,4TH ST / BRANNAN ST,-122.396533248456,37.7783268978785 +621880,2006-07-15 23:20:00,DRUNKENNESS,BAYVIEW,300 Block of MISSISSIPPI ST,-122.394602384169,37.76204000006511 +621915,2006-07-15 21:50:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +622023,2006-07-15 15:40:00,DRUNKENNESS,NORTHERN,900 Block of LARKIN ST,-122.418201870328,37.7863251027379 +622190,2006-07-15 03:48:00,KIDNAPPING,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +622225,2006-07-15 01:43:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +622296,2006-07-14 22:00:00,DRUNKENNESS,NORTHERN,1500 Block of FILLMORE ST,-122.432880595215,37.7838255788976 +622330,2006-07-14 20:55:00,ARSON,BAYVIEW,PHELPS ST / JERROLD AV,-122.391269032991,37.7398531385192 +622422,2006-07-14 17:38:00,DRUNKENNESS,INGLESIDE,5400 Block of MISSION ST,-122.444314025188,37.7131083433264 +622483,2006-07-14 14:20:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +622503,2006-07-14 13:00:00,RUNAWAY,BAYVIEW,2900 Block of SAN BRUNO AV,-122.402288649686,37.7246523794049 +622645,2006-07-14 00:24:00,DRUNKENNESS,INGLESIDE,400 Block of PARIS ST,-122.434947771932,37.7215611709143 +622650,2006-07-14 00:20:00,DRUNKENNESS,MISSION,23RD ST / FLORIDA ST,-122.410223401131,37.75434231002311 +622677,2006-07-13 23:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +622824,2006-07-13 16:45:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +622856,2006-07-13 15:22:00,ARSON,BAYVIEW,100 Block of KISKA RD,-122.376054792432,37.7300559760912 +622904,2006-07-13 12:30:00,RUNAWAY,BAYVIEW,BAY SHORE BL / JERROLD AV,-122.403564371001,37.7477613103514 +623083,2006-07-12 22:00:00,KIDNAPPING,MISSION,300 Block of SOUTH VAN NESS AV,-122.417653316856,37.7675941669426 +623120,2006-07-12 19:29:00,DRUNKENNESS,INGLESIDE,BOSWORTH ST / DIAMOND ST,-122.434145789073,37.7335506131208 +623207,2006-07-12 16:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +623307,2006-07-12 11:30:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +623714,2006-07-11 09:00:00,DRUNKENNESS,NORTHERN,2400 Block of VANNESS AV,-122.423718618565,37.798115817511295 +623798,2006-07-10 23:43:00,DRUNKENNESS,TARAVAL,HAROLD AV / BRUCE AV,-122.453100360078,37.7221209837745 +623804,2006-07-10 23:30:00,ARSON,BAYVIEW,1000 Block of 26TH ST,-122.390096142663,37.751472538061 +623905,2006-07-10 18:28:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +623942,2006-07-10 16:30:00,RUNAWAY,TARAVAL,0 Block of EDGAR PL,-122.452222836761,37.7209145102852 +623959,2006-07-10 15:41:00,DRUNKENNESS,SOUTHERN,SANSOME ST / SUTTER ST,-122.400316057286,37.790099627367 +624142,2006-07-10 00:47:00,DRUNKENNESS,CENTRAL,900 Block of KEARNY ST,-122.405147395473,37.79656896295621 +624281,2006-07-02 17:00:00,KIDNAPPING,BAYVIEW,900 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +624311,2006-07-02 16:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +624459,2006-07-02 02:43:00,DRUNKENNESS,NORTHERN,1800 Block of POST ST,-122.432230255169,37.7852054554152 +624546,2006-07-01 22:19:00,DRUNKENNESS,SOUTHERN,1200 Block of MISSION ST,-122.414457764634,37.7765080370233 +624574,2006-07-01 21:02:00,DRUNKENNESS,PARK,HAYES ST / DIVISADERO ST,-122.437799703468,37.7749912944366 +624608,2006-07-01 20:00:00,DRUNKENNESS,TENDERLOIN,200 Block of TURK ST,-122.413259498719,37.7829514828801 +624610,2006-07-01 20:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +624699,2006-07-01 16:00:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +624766,2006-07-01 12:30:00,DRUNKENNESS,CENTRAL,LEAVENWORTH ST / GEARY ST,-122.414809966357,37.7865194111614 +624845,2006-07-01 09:34:00,DRUNKENNESS,INGLESIDE,2000 Block of GENEVA AV,-122.421221285368,37.7087416666245 +624907,2006-07-01 03:30:00,ARSON,BAYVIEW,GRIFFITH ST / PALOU AV,-122.379700472483,37.7276194684954 +624967,2006-07-01 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +625048,2006-06-30 22:04:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186101,37.7522391652625 +625098,2006-06-30 18:30:00,KIDNAPPING,CENTRAL,200 Block of NORTHPOINT ST,-122.411324519026,37.806804272619296 +625352,2006-06-30 04:06:00,KIDNAPPING,MISSION,400 Block of BARTLETT ST,-122.419252716313,37.7497620227402 +625442,2006-06-29 21:30:00,DRUNKENNESS,BAYVIEW,3RD ST / NEWCOMB AV,-122.390416955474,37.7355926105862 +625644,2006-06-29 12:25:00,DRUNKENNESS,INGLESIDE,MISSION ST / FRANCIS ST,-122.433359394388,37.726589026036 +625917,2006-06-28 18:10:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +626371,2006-06-27 14:25:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +626381,2006-06-27 13:35:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +626522,2006-06-27 02:35:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 10TH ST,-122.412826648024,37.772811562575 +626646,2006-06-26 19:00:00,KIDNAPPING,NORTHERN,2500 Block of GOUGH ST,-122.426919912591,37.796753804325206 +626681,2006-06-26 17:50:00,DRUNKENNESS,SOUTHERN,1000 Block of HOWARD ST,-122.407376438306,37.779489776176 +626742,2006-06-26 15:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +626831,2006-06-26 11:09:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +626967,2006-06-18 23:25:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +626968,2006-06-18 23:25:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +626991,2006-06-18 22:30:00,DRUNKENNESS,TENDERLOIN,0 Block of TAYLOR ST,-122.410689907787,37.7824948907735 +627032,2006-06-18 20:28:00,ARSON,BAYVIEW,DONNER AV / JENNINGS ST,-122.392068475598,37.7232956058641 +627075,2006-06-18 17:53:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +627258,2006-06-18 03:00:00,DRUNKENNESS,TARAVAL,300 Block of PLYMOUTH AV,-122.456126455635,37.7136432190476 +627284,2006-06-18 01:30:00,DRUNKENNESS,SOUTHERN,4TH ST / FREELON ST,-122.397066698493,37.7787523253223 +627289,2006-06-18 01:05:00,DRUNKENNESS,INGLESIDE,POTRERO AV / CESAR CHAVEZ ST,-122.405096871916,37.7491100050973 +627334,2006-06-17 23:30:00,ARSON,TARAVAL,300 Block of VICTORIA ST,-122.465400905286,37.71703462902551 +627358,2006-06-17 22:04:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +627361,2006-06-17 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +627421,2006-06-17 19:28:00,DRUNKENNESS,INGLESIDE,FOLSOM ST / PRECITA AV,-122.413574507108,37.7471706659606 +627426,2006-06-17 19:01:00,DRUNKENNESS,BAYVIEW,KEITH ST / REVERE AV,-122.38829455719,37.73060802717 +627585,2006-06-17 13:30:00,RUNAWAY,RICHMOND,700 Block of 3RD AV,-122.460536589808,37.7747629540653 +627611,2006-06-17 12:04:00,DRUNKENNESS,SOUTHERN,0 Block of UNITEDNATIONS PZ,-122.414317857881,37.7799444052046 +627725,2006-06-17 01:04:00,DRUNKENNESS,BAYVIEW,100 Block of CARGO WY,-122.379951817281,37.7421034351605 +627787,2006-06-16 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +627792,2006-06-16 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +627794,2006-06-16 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +627806,2006-06-16 21:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +627808,2006-06-16 21:28:00,DRUNKENNESS,SOUTHERN,600 Block of MARKET ST,-122.401655040432,37.78890489459111 +628016,2006-06-16 12:35:00,DRUNKENNESS,BAYVIEW,WALLACE AV / JENNINGS ST,-122.389239372691,37.72641481560311 +628224,2006-06-15 21:15:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +628285,2006-06-15 18:40:00,KIDNAPPING,SOUTHERN,500 Block of MARKET ST,-122.399911318801,37.7905596637863 +628360,2006-06-15 15:02:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +628416,2006-06-15 13:00:00,KIDNAPPING,MISSION,200 Block of FAIROAKS ST,-122.423991907438,37.752695957127706 +628573,2006-06-15 00:45:00,DRUNKENNESS,INGLESIDE,5700 Block of MISSION ST,-122.449729173956,37.7098635927288 +628595,2006-06-14 23:20:00,DRUNKENNESS,NORTHERN,300 Block of HERMANN ST,-122.430921985836,37.7701912080069 +628604,2006-06-14 22:33:00,DRUNKENNESS,MISSION,22ND ST / TREAT AV,-122.41329766080798,37.755764790634295 +628614,2006-06-14 22:15:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +628880,2006-06-14 11:00:00,RUNAWAY,RICHMOND,5300 Block of GEARY BL,-122.476719025527,37.7805797943167 +628929,2006-06-14 08:15:00,RUNAWAY,INGLESIDE,800 Block of GENEVA AV,-122.442071515409,37.717466480046895 +628992,2006-06-14 00:15:00,DRUNKENNESS,NORTHERN,1000 Block of POLK ST,-122.419858277339,37.786137125238 +628994,2006-06-14 00:15:00,ARSON,BAYVIEW,1100 Block of CARROLL AV,-122.384926170333,37.7202785995095 +629103,2006-06-13 19:50:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +629164,2006-06-13 17:20:00,DRUNKENNESS,SOUTHERN,1000 Block of MINNA ST,-122.417073196938,37.773549958303214 +629237,2006-06-13 13:55:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +629251,2006-06-13 13:00:00,KIDNAPPING,BAYVIEW,1400 Block of QUESADA AV,-122.386768853234,37.7307541873099 +629415,2006-06-12 23:30:00,ARSON,PARK,1300 Block of HAYES ST,-122.438637446729,37.7748288206275 +629450,2006-06-12 21:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +629492,2006-06-12 19:00:00,KIDNAPPING,BAYVIEW,100 Block of MIDDLEPOINT RD,-122.379348616728,37.7348543299922 +629529,2006-06-12 17:50:00,ARSON,TARAVAL,2100 Block of 22ND AV,-122.479160707866,37.7475559158885 +629577,2006-06-12 15:58:00,DRUNKENNESS,TARAVAL,900 Block of IRVING ST,-122.467923595845,37.763911146773296 +629832,2006-06-04 21:11:00,DRUNKENNESS,NORTHERN,1000 Block of POLK ST,-122.419858277339,37.786137125238 +630047,2006-06-04 11:00:00,KIDNAPPING,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +630090,2006-06-04 06:00:00,DRUNKENNESS,NORTHERN,1300 Block of WEBSTER ST,-122.431046366089,37.7830295716044 +630106,2006-06-04 03:30:00,DRUNKENNESS,NORTHERN,0 Block of WESTERNSHORES LN,-122.428507259493,37.7840488621731 +630115,2006-06-04 02:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +630136,2006-06-04 01:40:00,KIDNAPPING,INGLESIDE,400 Block of MADRID ST,-122.432290064854,37.7224064713036 +630138,2006-06-04 01:40:00,DRUNKENNESS,NORTHERN,2000 Block of CHESTNUT ST,-122.436797742278,37.800803173108896 +630183,2006-06-03 23:50:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +630197,2006-06-03 22:50:00,DRUNKENNESS,RICHMOND,42ND AV / BALBOA ST,-122.502669851599,37.7754673758739 +630210,2006-06-03 22:22:00,DRUNKENNESS,NORTHERN,1800 Block of UNION ST,-122.429763201881,37.7978730399148 +630225,2006-06-03 21:56:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +630270,2006-06-03 19:00:00,KIDNAPPING,TARAVAL,2700 Block of SAN JOSE AV,-122.452776612178,37.7136400953092 +630388,2006-06-03 12:45:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421264331104,37.743584765874 +630419,2006-06-03 11:00:00,DRUNKENNESS,NORTHERN,200 Block of PAGE ST,-122.424829503585,37.7737213634177 +630423,2006-06-03 10:45:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +630522,2006-06-03 00:25:00,DRUNKENNESS,BAYVIEW,600 Block of INDIANA ST,-122.39172714593,37.762851481453 +630546,2006-06-02 23:30:00,DRUNKENNESS,TARAVAL,3000 Block of SAN JOSE AV,-122.457441212767,37.7098427794823 +630687,2006-06-02 16:16:00,KIDNAPPING,BAYVIEW,300 Block of PENINSULA AV,-122.399313057866,37.7111410548779 +630698,2006-06-02 15:45:00,ARSON,MISSION,400 Block of ELIZABETH ST,-122.430865646169,37.7523473240976 +630818,2006-06-02 09:30:00,RUNAWAY,TARAVAL,2100 Block of 28TH AV,-122.485730103582,37.7472660064588 +630913,2006-06-01 23:54:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +630995,2006-06-01 19:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +631002,2006-06-01 19:00:00,KIDNAPPING,MISSION,16TH ST / MISSION ST,-122.419671780296,37.7650501214668 +631089,2006-06-01 15:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +631286,2006-06-01 07:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +631295,2006-06-01 06:10:00,DRUNKENNESS,SOUTHERN,MINNA ST / 9TH ST,-122.414177161792,37.775800257334105 +631590,2006-05-31 13:00:00,ARSON,NORTHERN,2500 Block of LOMBARD ST,-122.44352039096,37.7989993135254 +631598,2006-05-31 12:30:00,DRUNKENNESS,NORTHERN,800 Block of LARKIN ST,-122.418110537872,37.7858627664608 +631633,2006-05-31 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +631773,2006-05-30 21:00:00,ARSON,PARK,1600 Block of HAIGHT ST,-122.449122960735,37.7697840925361 +631779,2006-05-30 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +631790,2006-05-30 20:00:00,KIDNAPPING,INGLESIDE,0 Block of SANTOS ST,-122.418817195052,37.7113157442054 +631932,2006-05-30 13:13:00,DRUNKENNESS,TARAVAL,31ST AV / NORIEGA ST,-122.489322837068,37.7536737023903 +632047,2006-05-30 02:36:00,ARSON,SOUTHERN,500 Block of JESSIE ST,-122.409678806778,37.780978048463 +632108,2006-05-29 21:44:00,DRUNKENNESS,MISSION,21ST ST / MISSION ST,-122.418904204517,37.7570361132269 +632220,2006-05-29 16:50:00,KIDNAPPING,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +632280,2006-05-29 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +632411,2006-05-29 03:25:00,ARSON,TARAVAL,2200 Block of LINCOLN WY,-122.482094263225,37.7653286577597 +632431,2006-05-29 01:10:00,ARSON,TARAVAL,0 Block of SANANDREAS WY,-122.46371072143,37.7335716649464 +632442,2006-05-29 00:23:00,DRUNKENNESS,INGLESIDE,3200 Block of MISSION ST,-122.42039487496,37.744688222803 +632467,2006-05-21 22:15:00,RUNAWAY,TARAVAL,0 Block of LOBOS ST,-122.4542979309,37.7148602682687 +632475,2006-05-21 21:56:00,DRUNKENNESS,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +632537,2006-05-21 18:00:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +632597,2006-05-21 14:50:00,DRUNKENNESS,MISSION,17TH ST / HOFF ST,-122.420434724553,37.7633758058059 +632604,2006-05-21 14:25:00,DRUNKENNESS,PARK,HAIGHT ST / DIVISADERO ST,-122.437048523435,37.7712678186367 +632618,2006-05-21 13:30:00,RUNAWAY,BAYVIEW,1100 Block of FITZGERALD AV,-122.390440681948,37.72041707725121 +632634,2006-05-21 12:49:00,DRUNKENNESS,NORTHERN,500 Block of HAIGHT ST,-122.431289969136,37.7720549755537 +632808,2006-05-21 00:01:00,DRUNKENNESS,BAYVIEW,18TH ST / CAROLINA ST,-122.400391534345,37.7623464417436 +633024,2006-05-20 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +633162,2006-05-20 03:48:00,DRUNKENNESS,NORTHERN,0 Block of LAUSSAT ST,-122.427890901102,37.7718980757143 +633367,2006-05-19 17:00:00,ARSON,BAYVIEW,BAY SHORE BL / PAUL AV,-122.400784574257,37.723616775737 +633379,2006-05-19 16:43:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +633435,2006-05-19 14:15:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +633464,2006-05-19 13:00:00,KIDNAPPING,NORTHERN,100 Block of GROVE ST,-122.419085788323,37.7784353333225 +633486,2006-05-19 12:00:00,ARSON,RICHMOND,FULTON ST / 30TH AV,-122.489538601712,37.772324696627 +633732,2006-05-18 19:27:00,DRUNKENNESS,PARK,CASTRO ST / MARKET ST,-122.435187699349,37.7626702770872 +633916,2006-05-18 09:45:00,ARSON,RICHMOND,5900 Block of GEARY BL,-122.483145549312,37.7802894327275 +634045,2006-05-17 21:16:00,DRUNKENNESS,NORTHERN,200 Block of FILLMORE ST,-122.430242292847,37.7714300107636 +634320,2006-05-17 04:55:00,ARSON,BAYVIEW,SHAFTER AV / GRIFFITH ST,-122.381378621429,37.72573851297071 +634512,2006-05-16 15:55:00,DRUNKENNESS,TARAVAL,LA PLAYA ST / JUDAH ST,-122.509138997184,37.7602791548408 +634532,2006-05-16 14:35:00,DRUNKENNESS,CENTRAL,900 Block of COLUMBUS AV,-122.414354301151,37.8031089840376 +634539,2006-05-16 14:20:00,ARSON,INGLESIDE,SENECA AV / CAYUGA AV,-122.442549612505,37.7196199055896 +634734,2006-05-16 00:58:00,ARSON,BAYVIEW,500 Block of JAMESTOWN AV,-122.38802580863,37.712763735962895 +634754,2006-05-15 23:24:00,DRUNKENNESS,TARAVAL,16TH AV / LINCOLN WY,-122.474046481178,37.7655914079932 +634811,2006-05-15 20:26:00,ARSON,PARK,100 Block of ANZAVISTA AV,-122.444161019223,37.7794418360873 +634848,2006-05-15 18:28:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +635101,2006-05-15 07:00:00,KIDNAPPING,BAYVIEW,BAY SHORE BL / JERROLD AV,-122.403564371001,37.7477613103514 +635143,2006-05-15 00:01:00,ARSON,MISSION,3300 Block of 26TH ST,-122.417866751645,37.749002324161 +635181,2006-05-07 22:14:00,DRUNKENNESS,SOUTHERN,0 Block of ZOE ST,-122.395505836613,37.77953549845 +635215,2006-05-07 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +635239,2006-05-07 19:02:00,DRUNKENNESS,INGLESIDE,1100 Block of GENEVA AV,-122.436649093245,37.7143029723473 +635288,2006-05-07 17:29:00,DRUNKENNESS,SOUTHERN,12TH ST / HARRISON ST,-122.413049740894,37.77005278785961 +635329,2006-05-07 15:00:00,RUNAWAY,RICHMOND,500 Block of 47TH AV,-122.508160181225,37.7780379262238 +635431,2006-05-07 03:00:00,ARSON,RICHMOND,700 Block of FUNSTON AV,-122.471236193647,37.774079989997 +635497,2006-05-06 22:46:00,DRUNKENNESS,PARK,400 Block of CLAYTON ST,-122.448929447019,37.771182091159 +635662,2006-05-06 13:00:00,DRUNKENNESS,BAYVIEW,2800 Block of SAN BRUNO AV,-122.402912161235,37.725805451377504 +635800,2006-05-06 00:16:00,DRUNKENNESS,SOUTHERN,0 Block of 12TH ST,-122.420001436964,37.7740948566882 +635829,2006-05-05 23:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +636202,2006-05-04 19:30:00,ARSON,PARK,2000 Block of GROVE ST,-122.450367154123,37.774406505059 +636534,2006-05-03 19:00:00,RUNAWAY,PARK,600 Block of BAKER ST,-122.441516753576,37.77692187031621 +636565,2006-05-03 17:55:00,ARSON,INGLESIDE,1400 Block of FELTON ST,-122.418925978842,37.72634669320379 +636720,2006-05-03 09:40:00,DRUNKENNESS,INGLESIDE,200 Block of ELLSWORTH ST,-122.414677712559,37.7395832664097 +636775,2006-05-03 04:15:00,ARSON,PARK,GROVE ST / MASONIC AV,-122.446285631005,37.7748707258015 +636776,2006-05-03 04:13:00,ARSON,MISSION,1200 Block of FLORIDA ST,-122.410057925305,37.7519226008094 +637032,2006-05-02 11:30:00,DRUNKENNESS,MISSION,HARRISON ST / 25TH ST,-122.411747062829,37.7510350321605 +637124,2006-05-02 02:40:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +637205,2006-05-01 19:10:00,DRUNKENNESS,SOUTHERN,7TH ST / MARKET ST,-122.41251534135598,37.78047774805079 +637291,2006-05-01 14:30:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +637497,2006-05-01 01:42:00,DRUNKENNESS,INGLESIDE,LISBON ST / RUSSIA AV,-122.434783425086,37.7204454448891 +637524,2006-05-01 00:20:00,ARSON,BAYVIEW,MANSELL ST / DARTMOUTH ST,-122.408978096975,37.7194765091831 +637586,2006-04-23 23:02:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 19TH AV,-122.475644251197,37.7430505534925 +637610,2006-04-23 21:48:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +637721,2006-04-23 16:00:00,RUNAWAY,INGLESIDE,100 Block of LOEHR ST,-122.413676487435,37.71261657662389 +637744,2006-04-23 14:44:00,ARSON,BAYVIEW,0 Block of NICHOLS WY,-122.387234795761,37.7194008333885 +637882,2006-04-23 02:58:00,DRUNKENNESS,TARAVAL,1100 Block of OCEAN AV,-122.454662311927,37.72348716551979 +637915,2006-04-23 00:41:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +637921,2006-04-23 00:28:00,ARSON,BAYVIEW,3000 Block of JENNINGS ST,-122.394081040146,37.7211217845146 +637922,2006-04-23 00:22:00,ARSON,CENTRAL,BROADWAY ST / SANSOME ST,-122.402232454222,37.7984302773598 +638080,2006-04-22 17:09:00,ARSON,CENTRAL,200 Block of GRANT AV,-122.405254463024,37.78925250405221 +638092,2006-04-22 16:40:00,KIDNAPPING,CENTRAL,1000 Block of STOCKTON ST,-122.408236208765,37.7953821757057 +638286,2006-04-22 02:29:00,DRUNKENNESS,NORTHERN,LARKIN ST / OFARRELL ST,-122.417903977564,37.785167087551706 +638327,2006-04-22 00:12:00,DRUNKENNESS,SOUTHERN,1200 Block of MISSION ST,-122.414457764634,37.7765080370233 +638407,2006-04-21 20:45:00,KIDNAPPING,TARAVAL,1900 Block of 42ND AV,-122.500990298409,37.750334759820106 +638408,2006-04-21 20:31:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +638413,2006-04-21 20:15:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +638553,2006-04-21 15:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +638554,2006-04-21 15:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +638655,2006-04-21 10:00:00,KIDNAPPING,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +638754,2006-04-20 22:48:00,KIDNAPPING,MISSION,17TH ST / ALABAMA ST,-122.412296739398,37.7641921009332 +639008,2006-04-20 11:30:00,RUNAWAY,SOUTHERN,400 Block of MINNA ST,-122.407387172098,37.7810688918781 +639121,2006-04-20 01:27:00,DRUNKENNESS,NORTHERN,LOMBARD ST / STEINER ST,-122.437698529469,37.7996328370724 +639140,2006-04-19 23:59:00,KIDNAPPING,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +639179,2006-04-19 21:30:00,DRUNKENNESS,PARK,1700 Block of EDDY ST,-122.43644305449,37.7808493247624 +639328,2006-04-19 15:30:00,DRUNKENNESS,CENTRAL,300 Block of BUSH ST,-122.403840372288,37.7907285143037 +639415,2006-04-19 11:00:00,KIDNAPPING,SOUTHERN,ANNIE ST / MISSION ST,-122.401264374737,37.786851240585 +639500,2006-04-19 06:00:00,ARSON,BAYVIEW,1000 Block of FITZGERALD AV,-122.388416108229,37.7191956969734 +639630,2006-04-18 21:04:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +639647,2006-04-18 20:07:00,KIDNAPPING,INGLESIDE,500 Block of BOWDOIN ST,-122.411813275925,37.7288014121098 +639663,2006-04-18 19:00:00,DRUNKENNESS,CENTRAL,STOCKTON ST / UNION ST,-122.409193904616,37.800443875105294 +639982,2006-04-17 22:10:00,ARSON,BAYVIEW,0 Block of WATERLOO ST,-122.406476791636,37.7392631632503 +640009,2006-04-17 21:00:00,DRUNKENNESS,CENTRAL,800 Block of HYDE ST,-122.416992162344,37.7886442171326 +640035,2006-04-17 19:39:00,DRUNKENNESS,TENDERLOIN,500 Block of OFARRELL ST,-122.413798415869,37.7856297942374 +640062,2006-04-17 18:15:00,RUNAWAY,INGLESIDE,SILVER AV / MISSION ST,-122.431295002963,37.7287297938303 +640071,2006-04-17 18:00:00,KIDNAPPING,RICHMOND,3200 Block of BALBOA ST,-122.493588244515,37.7759407137274 +640106,2006-04-17 16:15:00,KIDNAPPING,RICHMOND,200 Block of 3RD AV,-122.461201592755,37.7840072302612 +640301,2006-04-17 02:00:00,KIDNAPPING,TENDERLOIN,100 Block of JONES ST,-122.412249767634,37.782556330202 +640353,2006-04-09 22:56:00,DRUNKENNESS,BAYVIEW,3RD ST / MCKINNON AV,-122.39014671644,37.7363908050669 +640465,2006-04-09 17:00:00,RUNAWAY,NORTHERN,FILLMORE ST / MCALLISTER ST,-122.431765489439,37.7786311131248 +640559,2006-04-09 11:00:00,DRUNKENNESS,PARK,700 Block of HAIGHT ST,-122.434558622936,37.7715276473111 +640640,2006-04-09 01:49:00,DRUNKENNESS,TARAVAL,10TH AV / LAWTON ST,-122.466994234627,37.7583969219856 +640730,2006-04-08 22:00:00,RUNAWAY,INGLESIDE,4700 Block of MISSION ST,-122.437393972517,37.7214120621391 +640792,2006-04-08 19:20:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +640803,2006-04-08 18:55:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +640840,2006-04-08 17:05:00,DRUNKENNESS,SOUTHERN,11TH ST / MARKET ST,-122.418698328939,37.7755894130051 +641016,2006-04-08 01:46:00,DRUNKENNESS,CENTRAL,ROMOLO ST / BROADWAY ST,-122.406235011205,37.7979206468132 +641020,2006-04-08 01:45:00,DRUNKENNESS,BAYVIEW,18TH ST / DEHARO ST,-122.401327773783,37.762290139043714 +641082,2006-04-07 21:57:00,DRUNKENNESS,CENTRAL,600 Block of KEARNY ST,-122.404730251759,37.7937840812301 +641109,2006-04-07 20:53:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +641261,2006-04-07 14:05:00,ARSON,PARK,HAIGHT ST / CLAYTON ST,-122.448578484966,37.769797716883104 +641409,2006-04-07 07:00:00,DRUNKENNESS,INGLESIDE,0 Block of LEO ST,-122.437067915291,37.722759886626704 +641436,2006-04-07 02:38:00,DRUNKENNESS,NORTHERN,VANNESS AV / PINE ST,-122.422139511488,37.78941076334571 +641449,2006-04-07 01:51:00,ARSON,INGLESIDE,800 Block of ELLSWORTH ST,-122.416517427405,37.7330103867416 +641459,2006-04-07 01:00:00,RUNAWAY,MISSION,600 Block of YORK ST,-122.409024621045,37.7611721822448 +641527,2006-04-06 20:30:00,DRUNKENNESS,INGLESIDE,1400 Block of SUNNYDALE AV,-122.415526093798,37.7118390462146 +641595,2006-04-06 18:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +641764,2006-04-06 10:16:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +641919,2006-04-05 22:15:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.418270696719,37.8078519838014 +641952,2006-04-05 20:49:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409536662692,37.78269112134721 +642337,2006-04-04 22:10:00,DRUNKENNESS,SOUTHERN,0 Block of 4TH ST,-122.404956956375,37.785117856395296 +642466,2006-04-04 17:00:00,KIDNAPPING,INGLESIDE,100 Block of LELAND AV,-122.406905871934,37.7124867383516 +642516,2006-04-04 15:15:00,KIDNAPPING,MISSION,CESAR CHAVEZ ST / MISSION ST,-122.418221946229,37.7481664083985 +642541,2006-04-04 14:12:00,DRUNKENNESS,SOUTHERN,6TH ST / MARKET ST,-122.41029351969,37.7822305870036 +642610,2006-04-04 11:41:00,KIDNAPPING,INGLESIDE,500 Block of CARTER ST,-122.423628041297,37.70880618460679 +642646,2006-04-04 09:00:00,KIDNAPPING,INGLESIDE,200 Block of BROOKDALE AV,-122.423115904861,37.71041463661261 +642700,2006-04-04 01:13:00,DRUNKENNESS,RICHMOND,CLEMENT ST / 7TH AV,-122.465493608312,37.78288900505871 +642745,2006-04-03 23:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +642758,2006-04-03 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +642837,2006-04-03 18:00:00,RUNAWAY,INGLESIDE,1200 Block of GIRARD ST,-122.400429640823,37.7171464036619 +642907,2006-04-03 15:00:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +643036,2006-04-03 07:58:00,DRUNKENNESS,NORTHERN,1000 Block of POST ST,-122.419104424644,37.78687648416079 +643086,2006-04-03 00:13:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412192555721,37.7816045741252 +643117,2006-03-26 22:38:00,DRUNKENNESS,TARAVAL,19TH AV / IRVING ST,-122.477172370751,37.763558459678 +643252,2006-03-26 16:15:00,DRUNKENNESS,PARK,1700 Block of PAGE ST,-122.449614539017,37.7706772890587 +643444,2006-03-26 00:30:00,DRUNKENNESS,TARAVAL,2300 Block of 24TH AV,-122.48118317163,37.7437268170337 +643454,2006-03-26 00:05:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +643462,2006-03-25 23:58:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +643471,2006-03-25 23:05:00,DRUNKENNESS,CENTRAL,GRANT AV / VALLEJO ST,-122.407208951402,37.7987756652736 +643549,2006-03-25 19:40:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.447783070559,37.769954950346495 +643736,2006-03-25 11:50:00,DRUNKENNESS,MISSION,4600 Block of 18TH ST,-122.442496487593,37.7604858807114 +643795,2006-03-25 07:25:00,KIDNAPPING,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +643827,2006-03-25 02:00:00,KIDNAPPING,TENDERLOIN,0 Block of MCALLISTER ST,-122.412596970637,37.7811192121542 +643949,2006-03-24 19:40:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +644009,2006-03-24 17:51:00,RUNAWAY,CENTRAL,500 Block of WASHINGTON ST,-122.402199228964,37.7956040895189 +644013,2006-03-24 17:42:00,DRUNKENNESS,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.414302052544,37.781863316866 +644016,2006-03-24 17:36:00,DRUNKENNESS,MISSION,24TH ST / OSAGE ST,-122.419018144895,37.7522051632838 +644020,2006-03-24 17:30:00,DRUNKENNESS,MISSION,100 Block of CAPP ST,-122.418549940195,37.7642837095036 +644201,2006-03-24 08:45:00,KIDNAPPING,BAYVIEW,0 Block of OSCEOLA LN,-122.383187458704,37.7316757960484 +644333,2006-03-23 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +644387,2006-03-23 17:36:00,DRUNKENNESS,INGLESIDE,400 Block of CORTLAND AV,-122.416829686014,37.7390362845646 +644544,2006-03-23 11:46:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +644651,2006-03-23 03:00:00,KIDNAPPING,SOUTHERN,0 Block of DORE ST,-122.412933062384,37.7739274524819 +644815,2006-03-22 17:00:00,KIDNAPPING,NORTHERN,2200 Block of CHESTNUT ST,-122.440732490704,37.8001913687688 +644857,2006-03-22 15:30:00,DRUNKENNESS,TARAVAL,1200 Block of 14TH AV,-122.471663398777,37.7647297486264 +645042,2006-03-22 03:15:00,DRUNKENNESS,SOUTHERN,500 Block of 5TH ST,-122.39998111123998,37.7776242389287 +645054,2006-03-22 01:55:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +645210,2006-03-21 18:23:00,DRUNKENNESS,BAYVIEW,2100 Block of QUESADA AV,-122.399852840312,37.7381735692778 +645262,2006-03-21 16:05:00,KIDNAPPING,TARAVAL,0 Block of JOSIAH AV,-122.452913681816,37.71820405103861 +645263,2006-03-21 16:05:00,KIDNAPPING,TARAVAL,0 Block of JOSIAH AV,-122.452913681816,37.71820405103861 +645469,2006-03-21 05:30:00,KIDNAPPING,BAYVIEW,2000 Block of EVANS AV,-122.396444994197,37.747772445595295 +645566,2006-03-20 20:50:00,ARSON,BAYVIEW,900 Block of INDIANA ST,-122.391363698182,37.7590483123458 +645613,2006-03-20 19:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +645727,2006-03-20 13:34:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +645923,2006-03-12 20:35:00,DRUNKENNESS,MISSION,0 Block of HOFF ST,-122.420575720933,37.7641819463712 +646041,2006-03-12 13:00:00,DRUNKENNESS,TARAVAL,1200 Block of 46TH AV,-122.506054933005,37.763210588602 +646140,2006-03-12 02:00:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405863212632,37.7980228452184 +646150,2006-03-12 01:14:00,DRUNKENNESS,CENTRAL,600 Block of BROADWAY ST,-122.407822401083,37.7976687725776 +646160,2006-03-12 00:30:00,DRUNKENNESS,TARAVAL,1800 Block of 31ST AV,-122.489188317452,37.752725656167605 +646336,2006-03-11 15:10:00,DRUNKENNESS,BAYVIEW,0 Block of WESTVIEW AV,-122.418240102107,37.7311402768386 +646375,2006-03-11 12:30:00,RUNAWAY,INGLESIDE,0 Block of CORDOVA ST,-122.436018959755,37.71284316658029 +646377,2006-03-11 12:30:00,RUNAWAY,BAYVIEW,900 Block of INGERSON AV,-122.392493074979,37.718903919212 +646485,2006-03-11 02:00:00,ARSON,BAYVIEW,700 Block of 25TH ST,-122.386342978585,37.7529726196511 +646693,2006-03-10 16:30:00,RUNAWAY,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +646826,2006-03-10 10:00:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +646948,2006-03-09 22:40:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +647087,2006-03-09 16:35:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +647106,2006-03-09 15:58:00,DRUNKENNESS,MISSION,19TH ST / SANCARLOS ST,-122.419978651361,37.7601885649193 +647128,2006-03-09 15:30:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +647207,2006-03-09 11:59:00,DRUNKENNESS,TARAVAL,9TH AV / IRVING ST,-122.466309668238,37.7640368477306 +647267,2006-03-09 08:50:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +647398,2006-03-08 21:34:00,KIDNAPPING,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +647419,2006-03-08 20:33:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 32ND AV,-122.489620429341,37.742436311358105 +647527,2006-03-08 16:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +647773,2006-03-08 03:00:00,ARSON,TENDERLOIN,200 Block of MCALLISTER ST,-122.416577792446,37.780614876154 +647788,2006-03-08 00:40:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.407441894207,37.79847359760571 +648050,2006-03-07 10:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +648146,2006-03-06 22:10:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418940110957,37.7860492230028 +648421,2006-03-06 09:45:00,ARSON,INGLESIDE,1800 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +648484,2006-03-06 05:20:00,DRUNKENNESS,SOUTHERN,800 Block of FOLSOM ST,-122.402246029097,37.7810888153345 +648507,2006-03-06 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +648513,2006-02-26 23:45:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +648637,2006-02-26 16:32:00,DRUNKENNESS,MISSION,3000 Block of 21ST ST,-122.41616767094,37.757144758607296 +648677,2006-02-26 14:40:00,KIDNAPPING,TARAVAL,400 Block of HEAD ST,-122.464479954204,37.715227223715786 +648694,2006-02-26 13:41:00,DRUNKENNESS,MISSION,18TH ST / CASTRO ST,-122.435002864298,37.7608878061194 +648699,2006-02-26 13:30:00,ARSON,BAYVIEW,6600 Block of 3RD ST,-122.398315314856,37.7181339755846 +648700,2006-02-26 13:30:00,DRUNKENNESS,MISSION,1300 Block of HAMPSHIRE ST,-122.407129738907,37.7504851919731 +648786,2006-02-26 06:00:00,ARSON,SOUTHERN,10TH ST / HOWARD ST,-122.414370627495,37.7740418385041 +648788,2006-02-26 05:00:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +648919,2006-02-25 21:36:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.410768766343,37.7832145190013 +648989,2006-02-25 17:39:00,DRUNKENNESS,NORTHERN,0 Block of GROVE ST,-122.417448582701,37.7786438096934 +649273,2006-02-24 22:50:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +649329,2006-02-24 20:33:00,DRUNKENNESS,MISSION,MISSION ST / 24TH ST,-122.418448186101,37.7522391652625 +649384,2006-02-24 18:00:00,KIDNAPPING,BAYVIEW,1200 Block of REVERE AV,-122.383599364346,37.7280102316098 +649466,2006-02-24 14:05:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +649469,2006-02-24 14:00:00,KIDNAPPING,CENTRAL,1000 Block of LEAVENWORTH ST,-122.415588123596,37.7907480766738 +649974,2006-02-23 10:45:00,RUNAWAY,BAYVIEW,0 Block of POMONA ST,-122.393379855662,37.7317081525738 +650107,2006-02-22 22:30:00,DRUNKENNESS,NORTHERN,POST ST / GOUGH ST,-122.424859889029,37.7861964472534 +650149,2006-02-22 20:30:00,RUNAWAY,INGLESIDE,300 Block of MONTCALM ST,-122.409745144003,37.7455622222632 +650245,2006-02-22 16:25:00,DRUNKENNESS,PARK,OAK ST / DIVISADERO ST,-122.437422446098,37.7731323316038 +650292,2006-02-22 14:20:00,KIDNAPPING,TARAVAL,1100 Block of PLYMOUTH AV,-122.456076908027,37.7228860139189 +650314,2006-02-22 13:20:00,RUNAWAY,BAYVIEW,1500 Block of NEWCOMB AV,-122.388817917114,37.734752508079296 +650497,2006-02-21 22:35:00,DRUNKENNESS,INGLESIDE,ALEMANY BL / FOLSOM ST,-122.413825517721,37.7332781170978 +650629,2006-02-21 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +650735,2006-02-21 11:30:00,ARSON,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +650767,2006-02-21 10:03:00,DRUNKENNESS,NORTHERN,700 Block of WEBSTER ST,-122.429918677577,37.7774431475107 +650816,2006-02-21 03:00:00,RUNAWAY,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +650849,2006-02-21 00:01:00,KIDNAPPING,TARAVAL,4300 Block of JUDAH ST,-122.508618537938,37.7603604579815 +650887,2006-02-20 22:13:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.407376463936,37.7799892619986 +651002,2006-02-20 17:00:00,DRUNKENNESS,PARK,1600 Block of HAYES ST,-122.443584639717,37.7741979150087 +651083,2006-02-20 13:49:00,DRUNKENNESS,NORTHERN,1200 Block of EDDY ST,-122.428223303176,37.781895948860296 +651132,2006-02-20 11:49:00,KIDNAPPING,SOUTHERN,1000 Block of MISSION ST,-122.40989282029,37.7801134973164 +651202,2006-02-20 05:49:00,RUNAWAY,CENTRAL,300 Block of STOCKTON ST,-122.406886503606,37.7887345763527 +651281,2006-02-12 22:48:00,ARSON,NORTHERN,0 Block of LAGUNA ST,-122.42516067223,37.7713406311126 +651294,2006-02-12 22:00:00,KIDNAPPING,SOUTHERN,4TH ST / MISSION ST,-122.404270179486,37.78447885387449 +651348,2006-02-12 19:22:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +651401,2006-02-12 17:14:00,DRUNKENNESS,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +651545,2006-02-12 09:26:00,DRUNKENNESS,MISSION,23RD ST / UTAH ST,-122.405455789224,37.7543370820935 +651744,2006-02-11 19:26:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +651761,2006-02-11 18:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +651968,2006-02-11 02:50:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +651989,2006-02-11 01:05:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413287527194,37.7711962032376 +652029,2006-02-10 23:15:00,KIDNAPPING,CENTRAL,500 Block of JACKSON ST,-122.403980132448,37.7964121687875 +652077,2006-02-10 21:10:00,DRUNKENNESS,INGLESIDE,4500 Block of MISSION ST,-122.43455277287,37.7249007364814 +652138,2006-02-10 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +652150,2006-02-10 17:47:00,DRUNKENNESS,TARAVAL,40TH AV / IRVING ST,-122.499626599053,37.7625670820977 +652284,2006-02-10 12:30:00,RUNAWAY,MISSION,1300 Block of NATOMA ST,-122.418408871216,37.7675484464646 +652290,2006-02-10 12:10:00,DRUNKENNESS,BAYVIEW,1500 Block of BAY SHORE BL,-122.401096851568,37.7245556697717 +652312,2006-02-10 11:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +652544,2006-02-09 19:10:00,RUNAWAY,NORTHERN,1100 Block of MCALLISTER ST,-122.431343410204,37.7787412233251 +652555,2006-02-09 18:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +652707,2006-02-09 10:26:00,DRUNKENNESS,NORTHERN,0 Block of VANNESS AV,-122.419512541033,37.7756495714097 +652790,2006-02-09 02:11:00,KIDNAPPING,MISSION,23RD ST / MISSION ST,-122.418596727459,37.753838204850105 +652822,2006-02-08 23:00:00,DRUNKENNESS,TARAVAL,3700 Block of JUDAH ST,-122.502190456107,37.7606446338656 +652937,2006-02-08 17:43:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +653086,2006-02-08 13:15:00,KIDNAPPING,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +653258,2006-02-08 02:26:00,ARSON,CENTRAL,900 Block of SANSOME ST,-122.402394847611,37.7989063794796 +653283,2006-02-08 00:04:00,KIDNAPPING,TARAVAL,1900 Block of 29TH AV,-122.487055899123,37.7509494468209 +653471,2006-02-07 15:35:00,KIDNAPPING,RICHMOND,2100 Block of SUTTER ST,-122.43574226156,37.7857157633495 +653512,2006-02-07 13:20:00,KIDNAPPING,MISSION,SHOTWELL ST / 17TH ST,-122.416230392543,37.7636337702985 +653634,2006-02-07 04:30:00,KIDNAPPING,INGLESIDE,3900 Block of MISSION ST,-122.425181516357,37.7347570904995 +653754,2006-02-06 19:11:00,DRUNKENNESS,BAYVIEW,1400 Block of UNDERWOOD AV,-122.389103780329,37.7281629319258 +653946,2006-02-06 09:30:00,KIDNAPPING,BAYVIEW,3RD ST / 22ND ST,-122.388318045049,37.757939423202 +653977,2006-02-06 07:45:00,RUNAWAY,INGLESIDE,500 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +654091,2006-01-29 21:02:00,ARSON,BAYVIEW,INGALLS ST / LASALLE AV,-122.38144246566002,37.73058305167179 +654193,2006-01-29 16:20:00,KIDNAPPING,MISSION,MARIPOSA ST / YORK ST,-122.409282216438,37.763087265423714 +654284,2006-01-29 11:15:00,ARSON,CENTRAL,700 Block of TAYLOR ST,-122.412050910036,37.7892738896382 +654336,2006-01-29 04:30:00,KIDNAPPING,NORTHERN,FILLMORE ST / EDDY ST,-122.432329732386,37.7814292195409 +654430,2006-01-28 21:15:00,RUNAWAY,INGLESIDE,30TH ST / MISSION ST,-122.421970919029,37.74237522452549 +654467,2006-01-28 19:00:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +654516,2006-01-28 16:00:00,DRUNKENNESS,PARK,300 Block of DIVISADERO ST,-122.437215644452,37.772692170633896 +654643,2006-01-28 03:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +654756,2006-01-27 20:35:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +655037,2006-01-27 02:25:00,DRUNKENNESS,TARAVAL,2300 Block of VICENTE ST,-122.49206381723,37.7386453348532 +655047,2006-01-27 01:10:00,DRUNKENNESS,RICHMOND,6400 Block of GEARY BL,-122.488501778775,37.7800438685643 +655082,2006-01-26 22:14:00,DRUNKENNESS,CENTRAL,SACRAMENTO ST / FRONT ST,-122.39897271985,37.794282815785 +655088,2006-01-26 22:00:00,KIDNAPPING,PARK,PAGE ST / SHRADER ST,-122.452055909383,37.770311544715 +655162,2006-01-26 18:09:00,DRUNKENNESS,SOUTHERN,1400 Block of MARKET ST,-122.418480564808,37.775898446204 +655965,2006-01-24 17:28:00,ARSON,TARAVAL,100 Block of BROAD ST,-122.45756661137,37.7131276841881 +655966,2006-01-24 17:28:00,ARSON,TARAVAL,100 Block of BROAD ST,-122.45756661137,37.7131276841881 +656043,2006-01-24 13:50:00,DRUNKENNESS,SOUTHERN,500 Block of MINNA ST,-122.408673540372,37.7800574377607 +656349,2006-01-23 17:30:00,RUNAWAY,MISSION,22ND ST / TREAT AV,-122.41329766080798,37.755764790634295 +656364,2006-01-23 17:08:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +656526,2006-01-23 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +656618,2006-01-23 02:14:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +656940,2006-01-15 02:50:00,DRUNKENNESS,RICHMOND,2400 Block of CLEMENT ST,-122.485424200821,37.782054398286704 +656954,2006-01-15 01:29:00,DRUNKENNESS,INGLESIDE,1600 Block of CORTLAND AV,-122.408562062556,37.7397164786621 +656969,2006-01-15 00:42:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405863212632,37.7980228452184 +656972,2006-01-15 00:30:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +657020,2006-01-14 22:40:00,DRUNKENNESS,TARAVAL,1400 Block of PORTOLA DR,-122.467321910416,37.7383653416033 +657109,2006-01-14 18:15:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +657211,2006-01-14 11:45:00,KIDNAPPING,INGLESIDE,600 Block of ANDOVER ST,-122.416723536224,37.735231721937296 +657273,2006-01-14 06:03:00,ARSON,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +657336,2006-01-13 23:40:00,DRUNKENNESS,TENDERLOIN,0 Block of LEAVENWORTH ST,-122.413706517535,37.7814229318029 +657341,2006-01-13 23:30:00,KIDNAPPING,INGLESIDE,100 Block of MAYNARD ST,-122.427129443966,37.7293962363967 +657470,2006-01-13 17:30:00,KIDNAPPING,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +657578,2006-01-13 13:27:00,KIDNAPPING,NORTHERN,WASHINGTON ST / WEBSTER ST,-122.432741536401,37.7918003261017 +657680,2006-01-13 08:30:00,RUNAWAY,NORTHERN,1200 Block of EDDY ST,-122.428223303176,37.781895948860296 +657686,2006-01-13 08:15:00,RUNAWAY,PARK,800 Block of BURNETT AV,-122.444955474092,37.7488029817107 +657720,2006-01-13 02:14:00,DRUNKENNESS,BAYVIEW,3RD ST / LASALLE AV,-122.389865610332,37.73716994462029 +657729,2006-01-13 01:24:00,DRUNKENNESS,SOUTHERN,0 Block of MARKET ST,-122.395097774181,37.79405904855621 +657741,2006-01-13 00:23:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +657789,2006-01-12 22:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +658080,2006-01-12 08:00:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953857,37.7805345385278 +658092,2006-01-12 07:23:00,RUNAWAY,TARAVAL,2300 Block of 40TH AV,-122.49818467296,37.742976298733 +658132,2006-01-12 01:16:00,DRUNKENNESS,NORTHERN,1000 Block of POST ST,-122.419104424644,37.78687648416079 +658206,2006-01-11 20:00:00,KIDNAPPING,SOUTHERN,7TH ST / MARKET ST,-122.41251534135598,37.78047774805079 +658275,2006-01-11 17:45:00,RUNAWAY,INGLESIDE,GENEVA AV / MISSION ST,-122.441018108888,37.7164586830811 +658279,2006-01-11 17:32:00,KIDNAPPING,BAYVIEW,1600 Block of QUESADA AV,-122.390478529234,37.7327208838049 +658353,2006-01-11 15:00:00,KIDNAPPING,BAYVIEW,0 Block of GARLINGTON CT,-122.38435769838,37.7324996437285 +658567,2006-01-10 23:27:00,KIDNAPPING,INGLESIDE,0 Block of NEY ST,-122.42920678547002,37.7300316802806 +658594,2006-01-10 21:20:00,ARSON,NORTHERN,800 Block of OFARRELL ST,-122.418751252829,37.7851160049429 +658674,2006-01-10 18:17:00,DRUNKENNESS,MISSION,1000 Block of SHOTWELL ST,-122.415022828589,37.7516272270745 +658753,2006-01-10 15:00:00,RUNAWAY,NORTHERN,600 Block of LAGUNA ST,-122.4263385052,37.777173764521606 +658894,2006-01-10 07:00:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +658991,2006-01-09 20:55:00,KIDNAPPING,CENTRAL,600 Block of POST ST,-122.412032359787,37.78788548961551 +659061,2006-01-09 17:52:00,DRUNKENNESS,BAYVIEW,200 Block of TOPEKA AV,-122.397228698169,37.7329812473695 +659080,2006-01-09 17:20:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919144,37.7695262270693 +659186,2006-01-09 12:15:00,ARSON,PARK,2000 Block of GROVE ST,-122.450345075177,37.774298058417 +659237,2006-01-09 09:30:00,KIDNAPPING,BAYVIEW,0 Block of WILLIAMS AV,-122.394046313022,37.7295210006148 +659271,2006-01-09 07:30:00,RUNAWAY,TARAVAL,200 Block of BRIGHT ST,-122.463441431261,37.7152360301002 +659351,2006-01-01 22:24:00,DRUNKENNESS,BAYVIEW,THOMAS AV / KEITH ST,-122.389421299039,37.7293538492444 +659479,2006-01-01 14:00:00,DRUNKENNESS,PARK,DIVISADERO ST / OAK ST,-122.437422446098,37.7731323316038 +659693,2006-01-01 04:30:00,ARSON,CENTRAL,KEARNY ST / WASHINGTON ST,-122.404960301641,37.795326200325896 +659699,2006-01-01 04:04:00,DRUNKENNESS,TENDERLOIN,400 Block of TAYLOR ST,-122.411490839882,37.786468343359104 +659762,2006-01-01 01:26:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +659800,2006-01-01 00:15:00,DRUNKENNESS,CENTRAL,300 Block of BATTERY ST,-122.40021603879,37.7948030325182 +660070,2005-12-31 19:26:00,ARSON,MISSION,26TH ST / HARRISON ST,-122.41159521644,37.74943603928021 +660197,2005-12-31 13:45:00,DRUNKENNESS,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +660298,2005-12-31 04:20:00,DRUNKENNESS,MISSION,3400 Block of 19TH ST,-122.420322490104,37.7602230009949 +660389,2005-12-30 21:12:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +660699,2005-12-30 01:47:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +660703,2005-12-30 01:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +660745,2005-12-29 22:15:00,DRUNKENNESS,NORTHERN,600 Block of LINDEN ST,-122.428666208752,37.7757342027431 +660768,2005-12-29 21:00:00,RUNAWAY,RICHMOND,1600 Block of BRODERICK ST,-122.441565231515,37.7855194960542 +660789,2005-12-29 20:00:00,RUNAWAY,BAYVIEW,1600 Block of OAKDALE AV,-122.391431786513,37.735284241529705 +660868,2005-12-29 16:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +661059,2005-12-29 07:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +661105,2005-12-29 00:22:00,RUNAWAY,PARK,600 Block of BAKER ST,-122.441516753576,37.77692187031621 +661225,2005-12-28 18:00:00,DRUNKENNESS,MISSION,24TH ST / MISSION ST,-122.418448186109,37.752239165267 +661467,2005-12-28 02:30:00,KIDNAPPING,INGLESIDE,400 Block of ROLPH ST,-122.433796156182,37.712336869844606 +661709,2005-12-27 15:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +661911,2005-12-26 21:25:00,KIDNAPPING,TARAVAL,1900 Block of 23RD AV,-122.480493188337,37.7512393843285 +661951,2005-12-26 19:46:00,DRUNKENNESS,INGLESIDE,CORTLAND AV / ELLSWORTH ST,-122.414561303905,37.7388808903304 +662178,2005-12-18 23:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +662320,2005-12-18 16:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +662501,2005-12-17 22:35:00,DRUNKENNESS,TENDERLOIN,200 Block of OFARRELL ST,-122.408496298209,37.786296190453 +662749,2005-12-17 01:55:00,DRUNKENNESS,CENTRAL,1300 Block of COLUMBUS AV,-122.419232131738,37.8064740791427 +662803,2005-12-16 23:26:00,DRUNKENNESS,CENTRAL,FRONT ST / SACRAMENTO ST,-122.398972719858,37.7942828157621 +662806,2005-12-16 23:18:00,DRUNKENNESS,SOUTHERN,800 Block of MISSION ST,-122.405395493939,37.7835100715421 +662818,2005-12-16 23:00:00,DRUNKENNESS,BAYVIEW,20TH ST / TENNESSEE ST,-122.389488719276,37.7604368265114 +662888,2005-12-16 19:35:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +663090,2005-12-16 12:00:00,KIDNAPPING,MISSION,400 Block of CHURCH ST,-122.4286109134,37.7632288973036 +663127,2005-12-16 10:00:00,KIDNAPPING,SOUTHERN,500 Block of NATOMA ST,-122.409422031686,37.7788942420529 +663186,2005-12-16 04:10:00,ARSON,PARK,300 Block of CASTRO ST,-122.435290173378,37.7630499982644 +663198,2005-12-16 02:06:00,KIDNAPPING,CENTRAL,HYDE ST / PINE ST,-122.417209639437,37.79004590169389 +663227,2005-12-15 23:47:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +664009,2005-12-13 22:00:00,ARSON,BAYVIEW,FITZGERALD AV / HAWES ST,-122.389461814676,37.7199285121568 +664043,2005-12-13 19:31:00,ARSON,BAYVIEW,0 Block of BALDWIN CT,-122.380715788947,37.7296096317188 +664049,2005-12-13 19:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +664119,2005-12-13 16:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +664248,2005-12-13 09:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +664490,2005-12-12 15:15:00,ARSON,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +664520,2005-12-12 13:53:00,DRUNKENNESS,NORTHERN,CHESTNUT ST / FILLMORE ST,-122.436275324751,37.8008126645458 +664590,2005-12-12 10:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +664658,2005-12-12 02:10:00,ARSON,INGLESIDE,AVALON AV / EDINBURGH ST,-122.428482411308,37.725899817494 +664701,2005-12-04 23:15:00,ARSON,PARK,2400 Block of GEARY BL,-122.443597047511,37.7826435280939 +664731,2005-12-04 21:45:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +664981,2005-12-04 01:19:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 47TH AV,-122.470233355879,37.743286739422494 +665067,2005-12-03 20:51:00,DRUNKENNESS,INGLESIDE,0 Block of VIRGINIA AV,-122.420967440564,37.742851737444894 +665185,2005-12-03 13:24:00,DRUNKENNESS,BAYVIEW,1100 Block of GILMAN AV,-122.390922553406,37.7198785524783 +665200,2005-12-03 12:01:00,KIDNAPPING,BAYVIEW,6600 Block of 3RD ST,-122.398315314856,37.7181339755846 +665248,2005-12-03 09:30:00,DRUNKENNESS,MISSION,2900 Block of FOLSOM ST,-122.413915683628,37.7500837726104 +665275,2005-12-03 07:15:00,DRUNKENNESS,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413047972078,37.7819119628298 +665290,2005-12-03 03:02:00,DRUNKENNESS,TARAVAL,1200 Block of 18TH AV,-122.476188319825,37.764532429521104 +665473,2005-12-02 16:30:00,RUNAWAY,BAYVIEW,0 Block of WILLS ST,-122.378902736531,37.73619076744311 +665476,2005-12-02 16:30:00,DRUNKENNESS,TARAVAL,200 Block of ORIZABA AV,-122.462665168645,37.71418103332989 +665608,2005-12-02 09:05:00,DRUNKENNESS,TARAVAL,9TH AV / IRVING ST,-122.466309668211,37.7640368477357 +665684,2005-12-02 00:57:00,DRUNKENNESS,NORTHERN,2300 Block of BUCHANAN ST,-122.431073169007,37.79156871030021 +666012,2005-12-01 08:20:00,DRUNKENNESS,NORTHERN,ELLIS ST / LARKIN ST,-122.417710344733,37.7842362877657 +666044,2005-12-01 07:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +666050,2005-12-01 06:45:00,DRUNKENNESS,TARAVAL,44TH AV / TARAVAL ST,-122.502476627077,37.741858675484 +666161,2005-11-30 22:08:00,ARSON,RICHMOND,400 Block of 18TH AV,-122.477237626959,37.7794507243979 +666165,2005-11-30 22:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +666189,2005-11-30 21:05:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +666190,2005-11-30 21:05:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +666206,2005-11-30 20:15:00,ARSON,SOUTHERN,900 Block of FOLSOM ST,-122.403860419019,37.77981372039329 +666545,2005-11-30 01:50:00,DRUNKENNESS,TARAVAL,37TH AV / TARAVAL ST,-122.494979336385,37.742200113466296 +666648,2005-11-29 19:00:00,DRUNKENNESS,BAYVIEW,0 Block of CRANE ST,-122.399608474442,37.7223874981459 +666896,2005-11-29 02:25:00,DRUNKENNESS,SOUTHERN,2ND ST / HOWARD ST,-122.398261647349,37.7867787588868 +666946,2005-11-28 21:57:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.505923256341,37.761339931633 +666986,2005-11-28 19:15:00,DRUNKENNESS,MISSION,2700 Block of 24TH ST,-122.406813640773,37.7529905294566 +667252,2005-11-28 00:01:00,DRUNKENNESS,TARAVAL,22ND AV / JUDAH ST,-122.480205513473,37.7615571997115 +667600,2005-11-20 02:30:00,DRUNKENNESS,TARAVAL,2300 Block of 24TH AV,-122.48118317163,37.7437268170337 +667793,2005-11-19 15:30:00,RUNAWAY,BAYVIEW,0 Block of BELL CT,-122.384940423588,37.734005130178105 +667811,2005-11-19 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +667912,2005-11-19 08:51:00,KIDNAPPING,MISSION,400 Block of DOLORES ST,-122.425956929318,37.76180867893621 +667916,2005-11-19 08:30:00,DRUNKENNESS,MISSION,1200 Block of TREAT AV,-122.412692441179,37.7501577446795 +668025,2005-11-18 22:50:00,DRUNKENNESS,NORTHERN,GOUGH ST / HAIGHT ST,-122.42194417281,37.773036844558 +668028,2005-11-18 22:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +668044,2005-11-18 22:15:00,DRUNKENNESS,CENTRAL,1300 Block of GRANT AV,-122.40723429412,37.7992576492589 +668047,2005-11-18 22:15:00,DRUNKENNESS,NORTHERN,POST ST / FILLMORE ST,-122.433084166809,37.7851499161314 +668150,2005-11-18 18:00:00,ARSON,BAYVIEW,MARIN ST / INDIANA ST,-122.390299429415,37.7487851770446 +668306,2005-11-18 10:00:00,ARSON,MISSION,2600 Block of HARRISON ST,-122.412052145525,37.7550201425447 +668309,2005-11-18 09:55:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +668378,2005-11-18 04:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +668501,2005-11-17 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +669141,2005-11-16 09:00:00,RUNAWAY,PARK,1700 Block of EDDY ST,-122.43644305449,37.7808493247624 +669286,2005-11-15 21:10:00,DRUNKENNESS,PARK,100 Block of PARNASSUS AV,-122.451880232062,37.764541634292 +669362,2005-11-15 18:30:00,KIDNAPPING,NORTHERN,1600 Block of WASHINGTON ST,-122.420431296934,37.7934146346654 +669510,2005-11-15 11:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +669517,2005-11-15 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +669554,2005-11-15 09:00:00,KIDNAPPING,INGLESIDE,1300 Block of ALEMANY BL,-122.433605110339,37.729468165737 +669630,2005-11-15 02:50:00,ARSON,TARAVAL,500 Block of GONZALEZ DR,-122.477975897762,37.7160190677349 +669688,2005-11-14 21:30:00,KIDNAPPING,INGLESIDE,400 Block of LANDSDALE AV,-122.456060925109,37.7361217277736 +669775,2005-11-14 17:20:00,RUNAWAY,MISSION,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +669924,2005-11-14 10:12:00,DRUNKENNESS,TARAVAL,800 Block of IRVING ST,-122.466861035773,37.764067832215794 +670054,2005-11-06 23:06:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITEDNATIONS PZ,-122.41431222924,37.77983391835871 +670357,2005-11-06 01:00:00,KIDNAPPING,NORTHERN,VANNESS AV / BUSH ST,-122.421949487554,37.7884881520906 +670358,2005-11-06 01:00:00,KIDNAPPING,NORTHERN,VANNESS AV / BUSH ST,-122.421949487554,37.7884881520906 +670362,2005-11-06 00:50:00,DRUNKENNESS,CENTRAL,GREEN ST / KEARNY ST,-122.405835845627,37.799902116731 +670457,2005-11-05 19:58:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +670498,2005-11-05 18:01:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +670708,2005-11-05 05:22:00,ARSON,BAYVIEW,900 Block of NEWHALL ST,-122.389728859275,37.7385160730646 +670721,2005-11-05 02:35:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.506061413203,37.7613338022471 +670737,2005-11-05 01:25:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +670773,2005-11-04 23:17:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929238,37.7980180687515 +670943,2005-11-04 16:34:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +671026,2005-11-04 12:45:00,KIDNAPPING,TARAVAL,HAROLD AV / OCEAN AV,-122.453105673073,37.723244402618704 +671113,2005-11-04 08:28:00,ARSON,RICHMOND,2300 Block of GOLDEN GATE AV,-122.449116002905,37.777321600666106 +671351,2005-11-03 17:40:00,RUNAWAY,RICHMOND,700 Block of 33RD AV,-122.492903087989,37.7749629647565 +671423,2005-11-03 14:35:00,DRUNKENNESS,BAYVIEW,3RD ST / NEWCOMB AV,-122.390416955517,37.7355926106176 +671589,2005-11-03 07:30:00,DRUNKENNESS,MISSION,200 Block of SAN JOSE AV,-122.421583822353,37.7512286449279 +671673,2005-11-02 22:50:00,DRUNKENNESS,MISSION,2900 Block of 24TH ST,-122.411436461904,37.752711512136 +671791,2005-11-02 17:30:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446143672039,37.7700527182372 +671875,2005-11-02 14:46:00,ARSON,SOUTHERN,900 Block of MISSION ST,-122.407160717737,37.7821161321441 +671903,2005-11-02 14:00:00,DRUNKENNESS,MISSION,TREAT AV / 25TH ST,-122.412838554026,37.7509678760804 +672066,2005-11-02 01:44:00,ARSON,TARAVAL,LINCOLN WY / 24TH AV,-122.482614313605,37.7652086195031 +672067,2005-11-02 01:35:00,DRUNKENNESS,MISSION,3200 Block of 21ST ST,-122.420754713532,37.756978932935 +672096,2005-11-01 23:23:00,DRUNKENNESS,TARAVAL,46TH AV / PACHECO ST,-122.50514549134,37.749232889315294 +672143,2005-11-01 20:14:00,DRUNKENNESS,PARK,PAGE ST / ASHBURY ST,-122.44712374185,37.7709342643218 +672186,2005-11-01 18:23:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +672342,2005-11-01 11:12:00,DRUNKENNESS,TARAVAL,MARTIN LUTHER KING JR DR / LINCOLN WY,-122.509399613121,37.764029830100895 +672612,2005-10-31 22:04:00,DRUNKENNESS,MISSION,700 Block of CASTRO ST,-122.434726184929,37.7572575362118 +672775,2005-10-31 18:00:00,ARSON,TARAVAL,900 Block of WAWONA ST,-122.476912582006,37.737328432436 +672918,2005-10-31 10:29:00,ARSON,NORTHERN,WEBSTER ST / TURK ST,-122.430424955342,37.780716008476 +673213,2005-10-23 12:00:00,KIDNAPPING,CENTRAL,900 Block of HYDE ST,-122.417044292614,37.78959527743221 +673239,2005-10-23 10:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +673314,2005-10-23 01:59:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +673319,2005-10-23 01:15:00,KIDNAPPING,PARK,500 Block of DIVISADERO ST,-122.437591748763,37.7745506356497 +673320,2005-10-23 01:08:00,DRUNKENNESS,CENTRAL,700 Block of SUTTER ST,-122.41274032268,37.788755110963 +673408,2005-10-22 21:00:00,DRUNKENNESS,BAYVIEW,0 Block of GIANTS DR,-122.38750147945,37.716878646429 +673581,2005-10-22 11:15:00,DRUNKENNESS,MISSION,2200 Block of 16TH ST,-122.409519465141,37.7656088991582 +673660,2005-10-22 03:00:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +673706,2005-10-22 00:25:00,ARSON,BAYVIEW,1400 Block of LASALLE AV,-122.386304220968,37.7349050342849 +673731,2005-10-21 23:10:00,ARSON,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +673815,2005-10-21 19:19:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +674003,2005-10-21 12:18:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.422399101985,37.7649414890121 +674113,2005-10-21 02:47:00,DRUNKENNESS,INGLESIDE,30TH ST / MISSION ST,-122.421970919038,37.7423752245575 +674139,2005-10-21 00:30:00,KIDNAPPING,NORTHERN,HAIGHT ST / FILLMORE ST,-122.430436523482,37.7721069661715 +674140,2005-10-21 00:20:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +674149,2005-10-20 23:44:00,DRUNKENNESS,SOUTHERN,MARKET ST / 7TH ST,-122.412515341363,37.7804777480279 +674246,2005-10-20 19:30:00,RUNAWAY,TARAVAL,0 Block of BUCARELI DR,-122.47937427429702,37.717462802133 +674599,2005-10-19 23:17:00,DRUNKENNESS,SOUTHERN,MARKET ST / 7TH ST,-122.412515341363,37.7804777480279 +674758,2005-10-19 15:42:00,DRUNKENNESS,TARAVAL,46TH AV / JUDAH ST,-122.505928450155,37.7604217436805 +674939,2005-10-19 08:10:00,KIDNAPPING,TARAVAL,500 Block of NIAGARA AV,-122.448984970571,37.7199704550477 +674981,2005-10-19 04:12:00,DRUNKENNESS,RICHMOND,100 Block of 22ND AV,-122.481927950534,37.7849352975007 +675064,2005-10-18 20:10:00,KIDNAPPING,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.411268613368,37.782250087316704 +675109,2005-10-18 17:55:00,DRUNKENNESS,MISSION,23RD ST / UTAH ST,-122.405455789232,37.754337082098 +675127,2005-10-18 17:16:00,DRUNKENNESS,NORTHERN,2200 Block of BROADWAY ST,-122.434101662511,37.7943138372159 +675203,2005-10-18 14:00:00,RUNAWAY,PARK,2200 Block of HAYES ST,-122.453481345535,37.77305287133821 +675292,2005-10-18 10:00:00,DRUNKENNESS,MISSION,26TH ST / HAMPSHIRE ST,-122.406897563454,37.7497181665644 +675326,2005-10-18 08:23:00,DRUNKENNESS,MISSION,17TH ST / MISSION ST,-122.419515708414,37.76342923285421 +675390,2005-10-18 01:00:00,DRUNKENNESS,SOUTHERN,900 Block of MISSION ST,-122.407932868203,37.7815063666429 +675443,2005-10-17 23:00:00,RUNAWAY,CENTRAL,2400 Block of TAYLOR ST,-122.415061036543,37.804871231209 +675463,2005-10-17 22:03:00,DRUNKENNESS,SOUTHERN,0 Block of 9TH ST,-122.414953043045,37.7765019124574 +675655,2005-10-17 12:55:00,ARSON,TARAVAL,1300 Block of 10TH AV,-122.467247854473,37.7630441175462 +675772,2005-10-17 08:17:00,RUNAWAY,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +675839,2005-10-17 01:48:00,DRUNKENNESS,CENTRAL,1000 Block of KEARNY ST,-122.4055247968,37.7977714997338 +675864,2005-10-09 23:36:00,DRUNKENNESS,SOUTHERN,0 Block of 8TH ST,-122.413684555167,37.7777984628537 +675975,2005-10-09 18:00:00,KIDNAPPING,INGLESIDE,200 Block of PUTNAM ST,-122.410985121891,37.7363241269838 +676007,2005-10-09 16:30:00,RUNAWAY,BAYVIEW,0 Block of BELL CT,-122.384940423588,37.734005130178105 +676213,2005-10-09 01:37:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +676334,2005-10-08 20:31:00,DRUNKENNESS,BAYVIEW,2100 Block of JENNINGS ST,-122.388904406633,37.7266917170382 +676535,2005-10-08 11:38:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.41076876635,37.7832145189783 +676592,2005-10-08 03:18:00,DRUNKENNESS,TARAVAL,3600 Block of 19TH AV,-122.474935296304,37.722022925911006 +676602,2005-10-08 02:40:00,DRUNKENNESS,TARAVAL,14TH AV / WAWONA ST,-122.469667217948,37.7385027543722 +676622,2005-10-08 01:20:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +676629,2005-10-08 01:04:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397942087241,37.7821914598695 +676876,2005-10-07 16:00:00,RUNAWAY,INGLESIDE,300 Block of MOUNT VERNON AV,-122.447011252406,37.7177903054666 +676963,2005-10-07 12:05:00,RUNAWAY,NORTHERN,1800 Block of POST ST,-122.432252482922,37.7853138825899 +677060,2005-10-07 06:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +677074,2005-10-07 04:00:00,KIDNAPPING,TENDERLOIN,0 Block of MASON ST,-122.409268441444,37.7837998723601 +677099,2005-10-07 01:15:00,KIDNAPPING,NORTHERN,1400 Block of POLK ST,-122.420660609645,37.7900998202351 +677102,2005-10-07 00:42:00,DRUNKENNESS,TARAVAL,2400 Block of 25TH AV,-122.482123331655,37.741812698996895 +677108,2005-10-07 00:10:00,RUNAWAY,BAYVIEW,0 Block of BELL CT,-122.384940423588,37.734005130178105 +677186,2005-10-06 20:40:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +677222,2005-10-06 19:23:00,DRUNKENNESS,NORTHERN,HEMLOCK ST / LARKIN ST,-122.418368839172,37.78748615720421 +677270,2005-10-06 17:25:00,KIDNAPPING,MISSION,3500 Block of 24TH ST,-122.422244216911,37.7519537213784 +677735,2005-10-05 15:45:00,ARSON,BAYVIEW,100 Block of WESTPOINT RD,-122.380382266471,37.7353538209895 +677873,2005-10-05 09:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +677908,2005-10-05 08:00:00,DRUNKENNESS,BAYVIEW,1300 Block of SHAFTER AV,-122.386109619077,37.7283547937407 +677981,2005-10-04 23:50:00,ARSON,BAYVIEW,FAIRFAX AV / MENDELL ST,-122.385284373738,37.74024021798221 +677999,2005-10-04 23:00:00,KIDNAPPING,PARK,CASTRO ST / MARKET ST,-122.435187699322,37.7626702770923 +678038,2005-10-04 20:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +678051,2005-10-04 19:50:00,ARSON,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +678108,2005-10-04 17:30:00,RUNAWAY,SOUTHERN,300 Block of MISSION ST,-122.396211154038,37.790761361966 +678116,2005-10-04 17:10:00,RUNAWAY,BAYVIEW,1800 Block of OAKDALE AV,-122.394565756376,37.7370657700508 +678138,2005-10-04 16:22:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +678155,2005-10-04 15:50:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.450492384367,37.7696094511519 +678393,2005-10-04 01:17:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.409845783196,37.7752407085662 +678432,2005-10-03 23:12:00,DRUNKENNESS,TARAVAL,2100 Block of 19TH AV,-122.475834051706,37.747702755433295 +678444,2005-10-03 22:40:00,DRUNKENNESS,NORTHERN,LOMBARD ST / PIERCE ST,-122.439337465029,37.799424598890006 +678659,2005-10-03 14:05:00,DRUNKENNESS,BAYVIEW,FITZGERALD AV / JENNINGS ST,-122.393174162432,37.722036232115 +678813,2005-10-03 03:40:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +678928,2005-09-25 20:00:00,DRUNKENNESS,PARK,1600 Block of TURK ST,-122.43627497948098,37.7800247331065 +678950,2005-09-25 19:08:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.406394499162,37.782007841018896 +679035,2005-09-25 15:40:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +679062,2005-09-25 14:20:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +679084,2005-09-25 13:50:00,DRUNKENNESS,TARAVAL,20TH AV / LINCOLN WY,-122.478325183738,37.7653988058041 +679240,2005-09-25 00:30:00,KIDNAPPING,RICHMOND,3400 Block of SACRAMENTO ST,-122.449506546565,37.7879239199513 +679304,2005-09-24 21:52:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / GROVE ST,-122.41658345614,37.7786591541279 +679352,2005-09-24 19:00:00,KIDNAPPING,TARAVAL,0 Block of STANLEY ST,-122.463037708806,37.71246442558621 +679508,2005-09-24 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +679559,2005-09-24 04:04:00,DRUNKENNESS,SOUTHERN,400 Block of BRANNAN ST,-122.395898776686,37.7787487070192 +679573,2005-09-24 02:48:00,KIDNAPPING,TARAVAL,14TH AV / IRVING ST,-122.471666675709,37.7637990227665 +679587,2005-09-24 01:38:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +679646,2005-09-23 22:52:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +679648,2005-09-23 22:52:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +679656,2005-09-23 22:06:00,ARSON,BAYVIEW,QUINT ST / NEWCOMB AV,-122.395382931372,37.738405335176296 +679657,2005-09-23 22:05:00,DRUNKENNESS,TARAVAL,BROAD ST / PLYMOUTH AV,-122.456050465838,37.7131938450128 +679715,2005-09-23 19:30:00,DRUNKENNESS,NORTHERN,0 Block of FELL ST,-122.418500584434,37.7764380944444 +679739,2005-09-23 18:04:00,DRUNKENNESS,CENTRAL,1200 Block of PINE ST,-122.416408674934,37.7902019515976 +679765,2005-09-23 17:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +679851,2005-09-23 14:30:00,KIDNAPPING,TENDERLOIN,STOCKTON ST / OFARRELL ST,-122.406401668342,37.7866144613136 +679870,2005-09-23 13:47:00,DRUNKENNESS,BAYVIEW,3RD ST / MCKINNON AV,-122.390146716483,37.736390805098296 +680073,2005-09-22 22:30:00,RUNAWAY,MISSION,3200 Block of 17TH ST,-122.417913861876,37.7635887638425 +680121,2005-09-22 20:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +680311,2005-09-22 13:45:00,RUNAWAY,MISSION,2700 Block of 24TH ST,-122.407745321325,37.7529342790976 +680329,2005-09-22 13:00:00,DRUNKENNESS,TARAVAL,2000 Block of IRVING ST,-122.479815820226,37.763498244756 +680333,2005-09-22 13:00:00,KIDNAPPING,INGLESIDE,700 Block of PARIS ST,-122.438412467662,37.717193736091 +680449,2005-09-22 05:28:00,DRUNKENNESS,CENTRAL,800 Block of JONES ST,-122.413705058875,37.7890640478934 +680704,2005-09-21 14:35:00,KIDNAPPING,BAYVIEW,0 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +680757,2005-09-21 12:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +680938,2005-09-20 22:00:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +681421,2005-09-19 18:20:00,ARSON,MISSION,21ST ST / FOLSOM ST,-122.414544668569,37.757299297414704 +681510,2005-09-19 14:55:00,DRUNKENNESS,TARAVAL,JUDAH ST / 48TH AV,-122.508067688155,37.7603276290519 +681526,2005-09-19 14:00:00,DRUNKENNESS,CENTRAL,COMMERCIAL ST / KEARNY ST,-122.404715633561,37.7940198826329 +681771,2005-09-11 19:00:00,RUNAWAY,INGLESIDE,200 Block of TINGLEY ST,-122.435108669721,37.7303292771994 +681781,2005-09-11 18:45:00,DRUNKENNESS,TARAVAL,1800 Block of IRVING ST,-122.477696048974,37.7635915438758 +681801,2005-09-11 17:38:00,DRUNKENNESS,INGLESIDE,1700 Block of GENEVA AV,-122.427965645504,37.7115816415732 +681944,2005-09-11 03:14:00,ARSON,MISSION,3000 Block of 23RD ST,-122.412619862692,37.754250991938704 +681999,2005-09-10 23:00:00,RUNAWAY,MISSION,200 Block of EUREKA ST,-122.43810324855,37.7582721634124 +682087,2005-09-10 19:30:00,KIDNAPPING,INGLESIDE,0 Block of TEDDY AV,-122.403335801093,37.7133408583918 +682093,2005-09-10 19:15:00,DRUNKENNESS,NORTHERN,1900 Block of UNION ST,-122.431009192575,37.7977145786189 +682322,2005-09-10 03:54:00,DRUNKENNESS,SOUTHERN,600 Block of BRYANT ST,-122.399249147914,37.7787049375495 +682324,2005-09-10 03:20:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +682425,2005-09-09 21:15:00,KIDNAPPING,PARK,1200 Block of 4TH AV,-122.46098724817,37.7656882478409 +682674,2005-09-09 10:30:00,RUNAWAY,RICHMOND,800 Block of 29TH AV,-122.488606513564,37.773286576608 +682749,2005-09-09 02:20:00,DRUNKENNESS,TARAVAL,IRVING ST / 24TH AV,-122.482480961311,37.7633237012318 +682816,2005-09-08 22:57:00,DRUNKENNESS,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +682835,2005-09-08 22:00:00,RUNAWAY,RICHMOND,600 Block of 25TH AV,-122.484457563836,37.7772192673745 +682957,2005-09-08 16:40:00,DRUNKENNESS,INGLESIDE,GENEVA AV / SANTOS ST,-122.420084075249,37.7083109744362 +683035,2005-09-08 13:00:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +683201,2005-09-08 00:27:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +683219,2005-09-07 23:45:00,DRUNKENNESS,TARAVAL,WESTPORTAL AV / 14TH AV,-122.469054666845,37.737969093848 +683274,2005-09-07 20:20:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423001696251,37.7649050761616 +683349,2005-09-07 16:35:00,DRUNKENNESS,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +683364,2005-09-07 16:05:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +683419,2005-09-07 13:45:00,RUNAWAY,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +683508,2005-09-07 09:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +683587,2005-09-07 01:24:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +683676,2005-09-06 18:50:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +683784,2005-09-06 12:55:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +683903,2005-09-06 04:00:00,KIDNAPPING,MISSION,SOUTH VAN NESS AV / 16TH ST,-122.417488323647,37.76518180399511 +683976,2005-09-05 21:35:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +683978,2005-09-05 21:34:00,DRUNKENNESS,CENTRAL,1000 Block of BUSH ST,-122.414576897,37.7894768075723 +684065,2005-09-05 17:00:00,KIDNAPPING,MISSION,700 Block of POTRERO AV,-122.407134232197,37.759993158273 +684078,2005-09-05 16:10:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +684174,2005-09-05 10:45:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +684203,2005-09-05 09:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +684247,2005-09-05 01:55:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +684312,2005-08-28 21:10:00,ARSON,TARAVAL,100 Block of APTOS AV,-122.466880621762,37.7292354079524 +684326,2005-08-28 20:17:00,ARSON,CENTRAL,1700 Block of HYDE ST,-122.418498371724,37.79682350194149 +684463,2005-08-28 12:30:00,KIDNAPPING,SOUTHERN,600 Block of NATOMA ST,-122.411118243435,37.7775607137405 +684498,2005-08-28 10:00:00,KIDNAPPING,TARAVAL,200 Block of ARCH ST,-122.46717438325,37.7152075746582 +684552,2005-08-28 02:00:00,KIDNAPPING,TENDERLOIN,400 Block of EDDY ST,-122.41506687647,37.7835634796332 +684576,2005-08-28 00:15:00,DRUNKENNESS,RICHMOND,5300 Block of GEARY BL,-122.476719025527,37.7805797943167 +684586,2005-08-27 23:59:00,ARSON,TARAVAL,100 Block of FONT BL,-122.473644075533,37.7155536666978 +684813,2005-08-27 12:44:00,DRUNKENNESS,MISSION,2100 Block of MISSION ST,-122.419424383763,37.7632323869521 +684996,2005-08-26 23:30:00,ARSON,CENTRAL,1700 Block of HYDE ST,-122.418498371724,37.79682350194149 +685061,2005-08-26 20:14:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +685077,2005-08-26 19:37:00,KIDNAPPING,MISSION,1000 Block of YORK ST,-122.408350538177,37.7552426763858 +685173,2005-08-26 16:40:00,ARSON,BAYVIEW,100 Block of ALBATROSS CT,-122.372202831457,37.728381194358704 +685391,2005-08-26 06:13:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.505923256341,37.761339931633 +685418,2005-08-26 00:39:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.505923256341,37.761339931633 +685435,2005-08-26 00:01:00,KIDNAPPING,NORTHERN,1400 Block of PINE ST,-122.419672954945,37.789668941238 +685832,2005-08-24 22:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +685869,2005-08-24 20:24:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.418190260713,37.7523088381464 +685930,2005-08-24 18:00:00,DRUNKENNESS,BAYVIEW,1100 Block of GILMAN AV,-122.390922553406,37.7198785524783 +685976,2005-08-24 16:00:00,KIDNAPPING,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +686107,2005-08-24 10:00:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +686119,2005-08-24 09:30:00,ARSON,MISSION,3700 Block of 20TH ST,-122.424654777093,37.7583491422634 +686176,2005-08-24 01:50:00,DRUNKENNESS,TARAVAL,900 Block of TARAVAL ST,-122.476211458458,37.7429719095254 +686245,2005-08-23 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +686634,2005-08-22 23:15:00,KIDNAPPING,TENDERLOIN,0 Block of LEAVENWORTH ST,-122.413706517535,37.7814229318029 +687269,2005-08-14 08:00:00,ARSON,INGLESIDE,1900 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +687543,2005-08-13 16:00:00,KIDNAPPING,INGLESIDE,200 Block of VALLEY ST,-122.427879325226,37.7444838100358 +687668,2005-08-13 04:48:00,DRUNKENNESS,PARK,HAIGHT ST / ASHBURY ST,-122.446933310948,37.770006198840896 +687677,2005-08-13 03:15:00,DRUNKENNESS,MISSION,1000 Block of ALABAMA ST,-122.411125926112,37.7550759585846 +687756,2005-08-12 22:55:00,ARSON,BAYVIEW,1300 Block of DONNER AV,-122.389316142253,37.72166539149929 +687820,2005-08-12 20:08:00,DRUNKENNESS,SOUTHERN,SPEAR ST / MARKET ST,-122.395630116238,37.793789967066 +688105,2005-08-12 01:45:00,ARSON,INGLESIDE,0 Block of BEMIS ST,-122.42908050599002,37.7380234737965 +688322,2005-08-11 14:00:00,KIDNAPPING,NORTHERN,400 Block of MCALLISTER ST,-122.419448185224,37.7802091894281 +688473,2005-08-11 03:30:00,ARSON,TARAVAL,0 Block of PICO AV,-122.462726668228,37.7243221953999 +688687,2005-08-10 17:00:00,KIDNAPPING,SOUTHERN,7TH ST / MARKET ST,-122.412515341363,37.7804777480279 +688717,2005-08-10 16:00:00,RUNAWAY,TARAVAL,0 Block of EDGAR PL,-122.452051804571,37.721722712546 +688754,2005-08-10 14:20:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +688905,2005-08-10 06:00:00,ARSON,NORTHERN,1300 Block of POLK ST,-122.420285729368,37.788940782957 +688909,2005-08-10 05:30:00,KIDNAPPING,NORTHERN,500 Block of HAIGHT ST,-122.431289969136,37.7720549755537 +688928,2005-08-10 01:49:00,DRUNKENNESS,CENTRAL,600 Block of JONES ST,-122.413162802096,37.7870801005292 +689075,2005-08-09 17:00:00,KIDNAPPING,NORTHERN,800 Block of GROVE ST,-122.430562907175,37.7769200093228 +689094,2005-08-09 16:15:00,DRUNKENNESS,SOUTHERN,0 Block of THE EMBARCADEROSOUTH ST,-122.388379873919,37.783310406701496 +689157,2005-08-09 13:00:00,ARSON,CENTRAL,800 Block of POST ST,-122.41584375719,37.7874017655636 +689290,2005-08-09 06:30:00,RUNAWAY,PARK,500 Block of SCOTT ST,-122.435968136819,37.7747589552821 +689320,2005-08-09 01:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +689324,2005-08-09 01:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +689374,2005-08-08 21:45:00,DRUNKENNESS,CENTRAL,KEARNY ST / CALIFORNIA ST,-122.404420631886,37.7926402109741 +689398,2005-08-08 20:00:00,KIDNAPPING,BAYVIEW,0 Block of WESTPOINT RD,-122.380382266471,37.7353538209895 +689670,2005-08-08 03:00:00,DRUNKENNESS,TARAVAL,1300 Block of VICENTE ST,-122.48132919801,37.7390098575446 +689825,2005-07-31 18:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +689898,2005-07-31 14:15:00,ARSON,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +689984,2005-07-31 06:41:00,DRUNKENNESS,TARAVAL,29TH AV / QUINTARA ST,-122.486791901971,37.7481702680048 +690025,2005-07-31 00:40:00,KIDNAPPING,NORTHERN,1300 Block of POST ST,-122.424062707879,37.7863516559196 +690027,2005-07-31 00:40:00,KIDNAPPING,NORTHERN,1300 Block of POST ST,-122.424062707879,37.7863516559196 +690161,2005-07-30 18:40:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +690164,2005-07-30 18:30:00,RUNAWAY,TARAVAL,0 Block of FAXON AV,-122.460296453764,37.7170260352725 +690179,2005-07-30 18:00:00,ARSON,TARAVAL,1600 Block of OCEAN AV,-122.459610061187,37.72453178488 +690238,2005-07-30 15:00:00,ARSON,BAYVIEW,1600 Block of MCKINNON AV,-122.390670834934,37.736611643242 +690301,2005-07-30 11:43:00,DRUNKENNESS,TARAVAL,1300 Block of 46TH AV,-122.505923256341,37.761339931633 +690304,2005-07-30 11:30:00,KIDNAPPING,TARAVAL,1400 Block of LA PLAYA ST,-122.509004036553,37.7593183455027 +690406,2005-07-30 01:57:00,DRUNKENNESS,PARK,700 Block of BAKER ST,-122.441705386451,37.7778540141174 +690409,2005-07-30 01:50:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +690410,2005-07-30 01:42:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929238,37.7980180687515 +690413,2005-07-30 01:30:00,ARSON,MISSION,900 Block of TREAT AV,-122.413284982758,37.7549457298304 +690427,2005-07-30 01:00:00,ARSON,NORTHERN,1100 Block of TURK ST,-122.428840433603,37.780972734343706 +690479,2005-07-29 22:30:00,ARSON,NORTHERN,600 Block of LARCH ST,-122.42815115473,37.7815325510309 +690489,2005-07-29 22:00:00,ARSON,BAYVIEW,0 Block of WESTBROOK CT,-122.382452903681,37.7349303029099 +690517,2005-07-29 20:45:00,DRUNKENNESS,CENTRAL,0 Block of DRUMM ST,-122.396421943768,37.7941447423704 +690524,2005-07-29 20:03:00,DRUNKENNESS,NORTHERN,FRANKLIN ST / PAGE ST,-122.420254960356,37.7743581710472 +690528,2005-07-29 20:00:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +690649,2005-07-29 15:00:00,KIDNAPPING,MISSION,2000 Block of MISSION ST,-122.419520367886,37.764228935718 +690654,2005-07-29 14:45:00,DRUNKENNESS,PARK,HAIGHT ST / CENTRAL AV,-122.443649925098,37.7704257255294 +690771,2005-07-29 06:38:00,DRUNKENNESS,INGLESIDE,200 Block of SUSSEX ST,-122.437170052379,37.7364425833424 +690778,2005-07-29 04:00:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +690798,2005-07-29 00:45:00,KIDNAPPING,BAYVIEW,1300 Block of PALOU AV,-122.38628498363998,37.7312896874195 +690822,2005-07-28 23:11:00,DRUNKENNESS,NORTHERN,POLK ST / OFARRELL ST,-122.41954956879,37.7849590112399 +690864,2005-07-28 21:00:00,KIDNAPPING,BAYVIEW,0 Block of EXETER ST,-122.398743727923,37.7221852157054 +691138,2005-07-28 06:00:00,ARSON,BAYVIEW,900 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +691174,2005-07-28 01:25:00,DRUNKENNESS,TARAVAL,GRANVILLE WY / CLAREMONT BL,-122.46380350353998,37.742927090807 +691182,2005-07-28 00:45:00,DRUNKENNESS,BAYVIEW,1500 Block of SILVER AV,-122.406066200535,37.7322385295219 +691519,2005-07-27 09:03:00,DRUNKENNESS,SOUTHERN,POWELL ST / MARKET ST,-122.407545855938,37.7844011794631 +691595,2005-07-27 00:36:00,DRUNKENNESS,MISSION,500 Block of CHURCH ST,-122.428400995815,37.7624929819293 +691804,2005-07-26 14:28:00,DRUNKENNESS,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +691961,2005-07-26 00:33:00,DRUNKENNESS,RICHMOND,4TH AV / ANZA ST,-122.462003861409,37.7791838254024 +691969,2005-07-26 00:01:00,ARSON,PARK,300 Block of LAGUNAHONDA BL,-122.45868018978202,37.7481554692332 +692046,2005-07-25 20:00:00,RUNAWAY,BAYVIEW,2000 Block of THOMAS AV,-122.39958770418998,37.7350510103906 +692215,2005-07-25 10:55:00,DRUNKENNESS,TARAVAL,9TH AV / JUDAH ST,-122.466180771658,37.7621738188753 +692600,2005-07-17 08:10:00,KIDNAPPING,BAYVIEW,0 Block of WESTPOINT RD,-122.380291012279,37.7354366994577 +692897,2005-07-16 12:45:00,KIDNAPPING,SOUTHERN,900 Block of MISSION ST,-122.40805253847,37.7815668300024 +693032,2005-07-15 23:45:00,KIDNAPPING,MISSION,400 Block of VALENCIA ST,-122.421935077177,37.7661343875141 +693056,2005-07-15 22:30:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +693062,2005-07-15 22:20:00,KIDNAPPING,BAYVIEW,0 Block of CASHMERE ST,-122.382745395519,37.73565878863421 +693123,2005-07-15 18:45:00,KIDNAPPING,TENDERLOIN,8TH ST / MARKET ST,-122.41474383539,37.7787192627661 +693266,2005-07-15 12:30:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +693341,2005-07-15 09:15:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +693397,2005-07-15 04:15:00,DRUNKENNESS,RICHMOND,4600 Block of FULTON ST,-122.4815281224,37.772746084047 +693424,2005-07-15 01:03:00,ARSON,INGLESIDE,FOLSOM ST / RIPLEY ST,-122.413282269197,37.7441510455251 +693480,2005-07-14 22:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +693672,2005-07-14 15:00:00,RUNAWAY,PARK,800 Block of BAKER ST,-122.441892915676,37.7787894074981 +693758,2005-07-14 11:00:00,RUNAWAY,NORTHERN,1800 Block of POST ST,-122.432252482922,37.7853138825899 +693794,2005-07-14 09:00:00,KIDNAPPING,TENDERLOIN,200 Block of GOLDEN GATE AV,-122.415120589338,37.7817589366405 +693878,2005-07-13 23:45:00,KIDNAPPING,MISSION,3100 Block of 18TH ST,-122.414509955234,37.7620735726425 +693879,2005-07-13 23:45:00,ARSON,MISSION,800 Block of HAMPSHIRE ST,-122.407897864406,37.758488576048 +694080,2005-07-13 15:30:00,DRUNKENNESS,RICHMOND,12TH AV / CLEMENT ST,-122.470848518539,37.782651275745295 +694166,2005-07-13 11:00:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +694177,2005-07-13 10:00:00,KIDNAPPING,MISSION,200 Block of 14TH ST,-122.418885184858,37.7682847825555 +694204,2005-07-13 08:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +694246,2005-07-13 03:24:00,DRUNKENNESS,RICHMOND,FULTON ST / 38TH AV,-122.498113827265,37.7719324282216 +694305,2005-07-12 22:24:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405862214655,37.7979117105028 +694349,2005-07-12 20:14:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.406394499162,37.782007841018896 +694481,2005-07-12 14:20:00,DRUNKENNESS,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +694572,2005-07-12 09:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +694712,2005-07-11 20:46:00,ARSON,NORTHERN,1200 Block of MCALLISTER ST,-122.432612021991,37.7785794811344 +694928,2005-07-11 09:00:00,KIDNAPPING,BAYVIEW,0 Block of YOUNG CT,-122.38605186029498,37.7362465179188 +694977,2005-07-11 03:23:00,ARSON,CENTRAL,400 Block of SUTTER ST,-122.407802668376,37.7893818905021 +694982,2005-07-11 02:40:00,DRUNKENNESS,MISSION,1200 Block of DOLORES ST,-122.424811056864,37.7498423670065 +695013,2005-07-03 23:40:00,DRUNKENNESS,RICHMOND,3100 Block of CALIFORNIA ST,-122.446121745552,37.787402558347296 +695067,2005-07-03 20:15:00,KIDNAPPING,NORTHERN,600 Block of EDDY ST,-122.418360181974,37.783149897821104 +695220,2005-07-03 11:00:00,KIDNAPPING,MISSION,200 Block of POTRERO AV,-122.407677083883,37.7664151429496 +695333,2005-07-02 23:10:00,KIDNAPPING,INGLESIDE,5000 Block of MISSION ST,-122.440388229194,37.7174580136719 +695409,2005-07-02 19:26:00,DRUNKENNESS,SOUTHERN,100 Block of 6TH ST,-122.40787711735202,37.7803875013555 +695411,2005-07-02 19:02:00,DRUNKENNESS,BAYVIEW,SAN BRUNO AV / BACON ST,-122.403595293523,37.72763409928261 +695503,2005-07-02 14:08:00,DRUNKENNESS,INGLESIDE,1500 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +695565,2005-07-02 11:17:00,DRUNKENNESS,MISSION,SANCARLOS ST / 18TH ST,-122.420130771138,37.7617902898194 +695660,2005-07-02 01:21:00,DRUNKENNESS,CENTRAL,600 Block of BROADWAY ST,-122.40784335615,37.797777359358896 +695802,2005-07-01 18:08:00,DRUNKENNESS,PARK,100 Block of CENTRAL AV,-122.44381274387,37.770892534208 +695924,2005-07-01 13:00:00,KIDNAPPING,CENTRAL,0 Block of CARD AL,-122.409197106535,37.79894542092679 +696019,2005-07-01 10:15:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +696054,2005-07-01 09:15:00,DRUNKENNESS,SOUTHERN,6TH ST / STEVENSON ST,-122.409696355566,37.78175405884821 +696155,2005-07-01 01:07:00,DRUNKENNESS,TENDERLOIN,200 Block of MCALLISTER ST,-122.416577792446,37.780614876154 +696168,2005-07-01 00:01:00,KIDNAPPING,INGLESIDE,100 Block of WARD ST,-122.401643605336,37.7188999507729 +696413,2005-06-30 14:40:00,DRUNKENNESS,TARAVAL,3900 Block of JUDAH ST,-122.504335220968,37.7605498553171 +696430,2005-06-30 13:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +696581,2005-06-30 00:44:00,DRUNKENNESS,TARAVAL,1000 Block of TARAVAL ST,-122.477314517687,37.7430334964477 +696602,2005-06-29 23:40:00,DRUNKENNESS,CENTRAL,800 Block of POST ST,-122.415821891164,37.787293291087714 +696616,2005-06-29 22:22:00,DRUNKENNESS,BAYVIEW,1300 Block of SHAFTER AV,-122.386109619077,37.7283547937407 +696636,2005-06-29 21:30:00,DRUNKENNESS,TARAVAL,2300 Block of 24TH AV,-122.48118317163,37.7437268170337 +696637,2005-06-29 21:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +696704,2005-06-29 18:00:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +696765,2005-06-29 15:27:00,DRUNKENNESS,NORTHERN,EDDY ST / BUCHANAN ST,-122.429042228263,37.7818456494851 +696909,2005-06-29 02:50:00,DRUNKENNESS,TARAVAL,TARAVAL ST / 46TH AV,-122.504618718637,37.7417618186593 +696930,2005-06-29 00:20:00,DRUNKENNESS,PARK,WALLER ST / COLE ST,-122.450522761722,37.768592618431896 +697182,2005-06-28 15:00:00,RUNAWAY,SOUTHERN,600 Block of NATOMA ST,-122.411118243435,37.7775607137405 +697303,2005-06-28 10:00:00,KIDNAPPING,INGLESIDE,300 Block of PARIS ST,-122.433771131892,37.7231138517576 +697389,2005-06-28 00:25:00,DRUNKENNESS,MISSION,17TH ST / HARTFORD ST,-122.434063454657,37.7625486367596 +697678,2005-06-27 09:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +697679,2005-06-27 09:00:00,RUNAWAY,MISSION,1100 Block of SHOTWELL ST,-122.415005297689,37.75001792273071 +697703,2005-06-27 07:00:00,ARSON,CENTRAL,200 Block of COLUMBUS AV,-122.405926769801,37.7972783315762 +698038,2005-06-19 07:30:00,KIDNAPPING,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +698295,2005-06-18 15:02:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +698395,2005-06-18 09:40:00,DRUNKENNESS,BAYVIEW,BAY SHORE BL / LELAND AV,-122.403651365129,37.7111900573571 +698455,2005-06-18 02:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +698563,2005-06-17 21:23:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +698564,2005-06-17 21:23:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +698589,2005-06-17 20:23:00,DRUNKENNESS,MISSION,CASTRO ST / 18TH ST,-122.435002864271,37.7608878061245 +698821,2005-06-17 09:40:00,DRUNKENNESS,SOUTHERN,6TH ST / STEVENSON ST,-122.409696355566,37.78175405884821 +698827,2005-06-17 09:30:00,RUNAWAY,MISSION,1100 Block of SHOTWELL ST,-122.415005297689,37.75001792273071 +698903,2005-06-17 00:30:00,RUNAWAY,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +698927,2005-06-16 23:32:00,DRUNKENNESS,NORTHERN,2200 Block of POLK ST,-122.422076812058,37.797126504747 +698962,2005-06-16 21:35:00,DRUNKENNESS,SOUTHERN,1900 Block of MARKET ST,-122.425669041358,37.7702451976438 +698997,2005-06-16 19:32:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.412752466973,37.7525306669004 +699005,2005-06-16 19:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +699139,2005-06-16 11:21:00,DRUNKENNESS,NORTHERN,EDDY ST / POLK ST,-122.419183096369,37.7830998244363 +699156,2005-06-16 10:00:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +699208,2005-06-16 07:30:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +699236,2005-06-16 02:30:00,ARSON,INGLESIDE,300 Block of CRESTAVISTA DR,-122.451970215589,37.7357527407473 +699363,2005-06-15 18:30:00,ARSON,PARK,500 Block of CLARENDON AV,-122.456090887004,37.7525956052034 +699402,2005-06-15 17:15:00,KIDNAPPING,NORTHERN,POLK ST / EDDY ST,-122.419183096369,37.7830998244363 +699459,2005-06-15 13:56:00,DRUNKENNESS,NORTHERN,600 Block of VANNESS AV,-122.420433293071,37.781770080046 +699579,2005-06-15 02:41:00,ARSON,BAYVIEW,1300 Block of CARROLL AV,-122.388667171578,37.7223782958446 +699639,2005-06-14 22:55:00,DRUNKENNESS,TARAVAL,100 Block of WESTPORTAL AV,-122.468117499815,37.7389000144845 +699645,2005-06-14 22:26:00,DRUNKENNESS,NORTHERN,2200 Block of POLK ST,-122.422170244578,37.7975891062057 +699725,2005-06-14 18:22:00,DRUNKENNESS,TARAVAL,JUDAH ST / 48TH AV,-122.508067688155,37.7603276290519 +699773,2005-06-14 16:05:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +699963,2005-06-14 02:30:00,KIDNAPPING,INGLESIDE,SAN JOSE AV / GENEVA AV,-122.446607214924,37.7207231269114 +699983,2005-06-14 00:33:00,ARSON,SOUTHERN,0 Block of HALLAM ST,-122.408600405402,37.7756834676857 +700011,2005-06-13 22:40:00,KIDNAPPING,TARAVAL,600 Block of TARAVAL ST,-122.473022759009,37.7431118667481 +700171,2005-06-13 13:30:00,KIDNAPPING,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +700181,2005-06-13 13:00:00,ARSON,INGLESIDE,100 Block of CORA ST,-122.409259392917,37.710899803189896 +700431,2005-06-05 18:49:00,ARSON,SOUTHERN,500 Block of MINNA ST,-122.408673540372,37.7800574377607 +700625,2005-06-05 02:20:00,DRUNKENNESS,SOUTHERN,1100 Block of FOLSOM ST,-122.40856429774,37.7760967348453 +700707,2005-06-04 21:30:00,DRUNKENNESS,TARAVAL,1900 Block of 36TH AV,-122.494423638942,37.7506222740155 +700761,2005-06-04 18:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +700810,2005-06-04 16:00:00,DRUNKENNESS,NORTHERN,UNION ST / LAGUNA ST,-122.430562264633,37.7977144203204 +700856,2005-06-04 12:45:00,KIDNAPPING,MISSION,3100 Block of 26TH ST,-122.412145291314,37.7494577964863 +700912,2005-06-04 09:26:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +700963,2005-06-04 02:40:00,ARSON,INGLESIDE,1100 Block of MANSELL ST,-122.412998370351,37.718686647895495 +700967,2005-06-04 02:27:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +701004,2005-06-04 00:37:00,DRUNKENNESS,CENTRAL,300 Block of BROADWAY ST,-122.402656907923,37.79832023835471 +701023,2005-06-03 23:35:00,KIDNAPPING,MISSION,24TH ST / BALMY ST,-122.412465422401,37.75260011023239 +701170,2005-06-03 17:13:00,KIDNAPPING,BAYVIEW,GIRARD ST / OLMSTEAD ST,-122.402604593195,37.72257377820289 +701171,2005-06-03 17:13:00,KIDNAPPING,BAYVIEW,GIRARD ST / OLMSTEAD ST,-122.402604593195,37.72257377820289 +701347,2005-06-03 08:55:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +701437,2005-06-03 00:20:00,DRUNKENNESS,CENTRAL,GRANT AV / UNION ST,-122.407589113645,37.8006374057859 +701506,2005-06-02 21:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +701558,2005-06-02 18:39:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +701568,2005-06-02 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +701573,2005-06-02 17:37:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +701656,2005-06-02 14:30:00,DRUNKENNESS,SOUTHERN,1200 Block of HOWARD ST,-122.412447373124,37.775633673443 +701817,2005-06-02 01:30:00,KIDNAPPING,NORTHERN,300 Block of GOUGH ST,-122.422862121316,37.776658453148 +701905,2005-06-01 20:47:00,KIDNAPPING,CENTRAL,SUTTER ST / GRANT AV,-122.405402610962,37.7896302266706 +701974,2005-06-01 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +701981,2005-06-01 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +702049,2005-06-01 15:14:00,DRUNKENNESS,TENDERLOIN,TAYLOR ST / TURK ST,-122.41076876635,37.7832145189783 +702261,2005-06-01 05:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +702657,2005-05-31 08:00:00,KIDNAPPING,INGLESIDE,100 Block of OCEAN AV,-122.43934468789,37.723624467748 +702658,2005-05-31 08:00:00,KIDNAPPING,INGLESIDE,100 Block of OCEAN AV,-122.43934468789,37.723624467748 +702852,2005-05-30 17:45:00,DRUNKENNESS,TARAVAL,2300 Block of TARAVAL ST,-122.491236457576,37.7423112678986 +702919,2005-05-30 14:44:00,DRUNKENNESS,BAYVIEW,1500 Block of BAY SHORE BL,-122.401096851568,37.7245556697717 +703015,2005-05-30 10:47:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.413564091744,37.779514030063 +703046,2005-05-30 09:05:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +703154,2005-05-22 23:00:00,ARSON,BAYVIEW,0 Block of GEORGE CT,-122.382660660186,37.7308000998774 +703204,2005-05-22 20:55:00,DRUNKENNESS,SOUTHERN,JESSIE ST / 6TH ST,-122.409247675554,37.78139873406629 +703236,2005-05-22 19:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +703607,2005-05-21 19:30:00,RUNAWAY,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +703682,2005-05-21 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +703729,2005-05-21 14:00:00,RUNAWAY,PARK,300 Block of BAKER ST,-122.440949589926,37.7741190407726 +703736,2005-05-21 13:46:00,DRUNKENNESS,MISSION,2700 Block of MISSION ST,-122.41844919178,37.7530267515876 +703862,2005-05-21 03:38:00,DRUNKENNESS,TARAVAL,IRVING ST / 9TH AV,-122.466309668211,37.7640368477357 +703898,2005-05-21 01:13:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +703919,2005-05-21 00:06:00,DRUNKENNESS,TARAVAL,IRVING ST / 10TH AV,-122.467384516584,37.7639886953398 +703975,2005-05-20 21:45:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +704069,2005-05-20 17:30:00,ARSON,TARAVAL,400 Block of SERRANO DR,-122.480450749459,37.7190118676786 +704294,2005-05-20 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +704327,2005-05-20 04:01:00,ARSON,SOUTHERN,0 Block of MINT ST,-122.40747925259,37.7823625392664 +704495,2005-05-19 18:30:00,DRUNKENNESS,CENTRAL,100 Block of JEFFERSON ST,-122.414988252591,37.8082613305439 +704963,2005-05-18 17:05:00,RUNAWAY,BAYVIEW,0 Block of REARDON RD,-122.376900658814,37.72948746365589 +705002,2005-05-18 15:30:00,KIDNAPPING,MISSION,1000 Block of VALENCIA ST,-122.421148325289,37.7564977562817 +705064,2005-05-18 12:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +705141,2005-05-18 09:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +705401,2005-05-17 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +705428,2005-05-17 13:15:00,RUNAWAY,BAYVIEW,900 Block of OLMSTEAD ST,-122.410968353707,37.72032701030111 +705462,2005-05-17 11:20:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +705539,2005-05-17 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +705553,2005-05-17 04:08:00,ARSON,BAYVIEW,5800 Block of 3RD ST,-122.394722845179,37.72475609595 +705586,2005-05-16 23:20:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +705741,2005-05-16 16:15:00,KIDNAPPING,MISSION,2400 Block of MISSION ST,-122.418963082325,37.758420303653104 +705950,2005-05-16 02:37:00,DRUNKENNESS,NORTHERN,CHESTNUT ST / PIERCE ST,-122.439504944769,37.8004024933389 +705989,2005-05-16 00:04:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +705990,2005-05-16 00:04:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +706038,2005-05-08 21:56:00,DRUNKENNESS,SOUTHERN,10TH ST / FOLSOM ST,-122.412826648031,37.772811562579605 +706041,2005-05-08 21:37:00,ARSON,INGLESIDE,200 Block of JOHNFSHELLEY DR,-122.423304635548,37.72266944630029 +706059,2005-05-08 21:00:00,RUNAWAY,NORTHERN,2100 Block of LOMBARD ST,-122.436863337604,37.799619968999295 +706123,2005-05-08 18:11:00,DRUNKENNESS,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +706158,2005-05-08 16:00:00,KIDNAPPING,TENDERLOIN,MARKET ST / HYDE ST,-122.41474383539,37.7787192627661 +706200,2005-05-08 13:25:00,ARSON,INGLESIDE,1600 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +706321,2005-05-08 03:08:00,ARSON,BAYVIEW,1700 Block of LANE ST,-122.390507422259,37.73137596298579 +706332,2005-05-08 02:04:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +706354,2005-05-08 00:19:00,KIDNAPPING,TARAVAL,0 Block of ELMIRASOL PL,-122.486096974774,37.7346082305853 +706415,2005-05-07 22:50:00,DRUNKENNESS,RICHMOND,GEARY BL / 6TH AV,-122.464281231868,37.7810193159964 +706453,2005-05-07 21:29:00,DRUNKENNESS,BAYVIEW,CARGO WY / JENNINGS ST,-122.376850076388,37.740193568464 +706454,2005-05-07 21:29:00,DRUNKENNESS,MISSION,24TH ST / CAPP ST,-122.417360139485,37.7523063170226 +706567,2005-05-07 16:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +706786,2005-05-07 01:00:00,KIDNAPPING,NORTHERN,FELL ST / BUCHANAN ST,-122.427727138402,37.775315757818 +706867,2005-05-06 20:30:00,KIDNAPPING,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +706901,2005-05-06 18:06:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +707001,2005-05-06 15:00:00,KIDNAPPING,MISSION,MISSION ST / 24TH ST,-122.418448186109,37.752239165267 +707006,2005-05-06 14:30:00,DRUNKENNESS,PARK,CARL ST / COLE ST,-122.449958075222,37.7658000842636 +707189,2005-05-06 02:15:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +707200,2005-05-06 01:21:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +707211,2005-05-06 01:00:00,KIDNAPPING,INGLESIDE,1400 Block of MANSELL ST,-122.416192700509,37.718510177529 +707280,2005-05-05 20:41:00,DRUNKENNESS,PARK,HAIGHT ST / STANYAN ST,-122.453534560634,37.76916629781029 +707290,2005-05-05 20:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +707585,2005-05-05 08:05:00,KIDNAPPING,BAYVIEW,2000 Block of SILVER AV,-122.399483468572,37.73605818776321 +707716,2005-05-04 19:20:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +707777,2005-05-04 16:46:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +707870,2005-05-04 12:30:00,RUNAWAY,RICHMOND,1700 Block of ANZA ST,-122.466827346758,37.7789145655708 +707931,2005-05-04 09:44:00,DRUNKENNESS,NORTHERN,0 Block of VANNESS AV,-122.419234662317,37.7757784176924 +707991,2005-05-04 06:23:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +708003,2005-05-04 03:20:00,DRUNKENNESS,TARAVAL,LINCOLN WY / 47TH AV,-122.507259973431,37.7641129859929 +708366,2005-05-03 03:20:00,DRUNKENNESS,NORTHERN,1200 Block of GEARY BL,-122.423864780988,37.7854370373296 +708578,2005-05-02 14:10:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +708622,2005-05-02 12:00:00,RUNAWAY,BAYVIEW,0 Block of LILLIAN ST,-122.380835135185,37.7317397777806 +708709,2005-05-02 08:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +708826,2005-04-24 20:42:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +709103,2005-04-24 01:57:00,ARSON,BAYVIEW,0 Block of REARDON RD,-122.377026608239,37.729440713500296 +709150,2005-04-23 23:20:00,DRUNKENNESS,TARAVAL,1300 Block of 48TH AV,-122.508200886817,37.761239153640496 +709252,2005-04-23 19:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +709346,2005-04-23 14:35:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +709413,2005-04-23 10:36:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +709497,2005-04-23 01:20:00,DRUNKENNESS,CENTRAL,1300 Block of COLUMBUS AV,-122.419232131738,37.8064740791427 +709586,2005-04-22 21:25:00,DRUNKENNESS,MISSION,24TH ST / CAPP ST,-122.417360139485,37.7523063170226 +709650,2005-04-22 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +709906,2005-04-22 08:00:00,RUNAWAY,INGLESIDE,400 Block of MADRID ST,-122.432290064854,37.7224064713036 +709952,2005-04-22 02:26:00,DRUNKENNESS,TARAVAL,900 Block of TARAVAL ST,-122.476211458458,37.7429719095254 +710039,2005-04-21 20:45:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +710150,2005-04-21 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +710205,2005-04-21 13:20:00,DRUNKENNESS,MISSION,1700 Block of FOLSOM ST,-122.415525556609,37.769470071800704 +710345,2005-04-21 06:00:00,RUNAWAY,BAYVIEW,0 Block of BEATRICE LN,-122.380833215509,37.7309396002948 +710406,2005-04-20 23:02:00,DRUNKENNESS,NORTHERN,3300 Block of STEINER ST,-122.437725577178,37.8001392874172 +710413,2005-04-20 22:55:00,DRUNKENNESS,NORTHERN,1000 Block of VANNESS AV,-122.421092281879,37.7849996426672 +710523,2005-04-20 17:45:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +710687,2005-04-20 10:00:00,KIDNAPPING,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +710773,2005-04-20 01:45:00,DRUNKENNESS,PARK,0 Block of CASTRO ST,-122.435637436721,37.7681694346175 +710791,2005-04-19 23:44:00,ARSON,BAYVIEW,HUDSON AV / PHELPS ST,-122.390145620854,37.74110727650329 +710847,2005-04-19 20:40:00,ARSON,BAYVIEW,0 Block of MANSELL ST,-122.425333754714,37.7176206474966 +711008,2005-04-19 13:00:00,RUNAWAY,BAYVIEW,100 Block of KISKA RD,-122.378494173975,37.7304096808335 +711121,2005-04-19 03:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +711124,2005-04-19 02:26:00,ARSON,BAYVIEW,MCKINNON AV / SELBY ST,-122.39857629182,37.7411420470013 +711141,2005-04-19 00:12:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.406460643507,37.7979466732983 +711436,2005-04-18 10:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +711475,2005-04-18 07:55:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +711499,2005-04-18 04:20:00,DRUNKENNESS,NORTHERN,0 Block of FELL ST,-122.418500584434,37.7764380944444 +711522,2005-04-18 01:53:00,ARSON,NORTHERN,2900 Block of VANNESS AV,-122.424998043878,37.8027319222988 +711782,2005-04-10 09:15:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +711837,2005-04-10 01:25:00,ARSON,TARAVAL,600 Block of FONT BL,-122.481587810499,37.7213308614526 +711991,2005-04-09 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +712105,2005-04-09 13:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +712162,2005-04-09 09:30:00,ARSON,RICHMOND,600 Block of 46TH AV,-122.506922001538,37.7757392980821 +712274,2005-04-08 23:52:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404814138469,37.7767624714108 +712390,2005-04-08 18:00:00,ARSON,NORTHERN,800 Block of FULTON ST,-122.431149073441,37.777698406901 +712392,2005-04-08 18:00:00,KIDNAPPING,INGLESIDE,4100 Block of FOLSOM ST,-122.413568530738,37.7352973309937 +712646,2005-04-08 00:32:00,DRUNKENNESS,TARAVAL,32ND AV / TARAVAL ST,-122.489620429384,37.7424363113895 +712723,2005-04-07 20:30:00,RUNAWAY,MISSION,900 Block of FLORIDA ST,-122.410517462775,37.756720759604 +713123,2005-04-06 21:03:00,DRUNKENNESS,MISSION,0 Block of BARTLETT ST,-122.420003504083,37.7561630112752 +713163,2005-04-06 20:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +713428,2005-04-06 09:00:00,ARSON,PARK,1600 Block of EDDY ST,-122.434821446921,37.7811662982153 +713437,2005-04-06 09:00:00,RUNAWAY,INGLESIDE,1900 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +713478,2005-04-06 07:30:00,DRUNKENNESS,MISSION,23RD ST / SAN JOSE AV,-122.421519057981,37.753661488251794 +713514,2005-04-06 01:30:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +713639,2005-04-05 18:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +713693,2005-04-05 16:55:00,DRUNKENNESS,CENTRAL,POWELL ST / VALLEJO ST,-122.410459546457,37.798371444976 +713716,2005-04-05 15:55:00,DRUNKENNESS,RICHMOND,MASONIC AV / GEARY BL,-122.448043124426,37.7823710354663 +713749,2005-04-05 14:30:00,KIDNAPPING,MISSION,1500 Block of 15TH ST,-122.418915450725,37.76667346471 +713858,2005-04-05 08:57:00,DRUNKENNESS,SOUTHERN,MARKET ST / 6TH ST,-122.410293519697,37.7822305869807 +713891,2005-04-05 07:30:00,RUNAWAY,INGLESIDE,500 Block of ANDERSON ST,-122.415324044053,37.736572932114896 +714264,2005-04-04 08:30:00,RUNAWAY,BAYVIEW,2500 Block of SAN BRUNO AV,-122.404407189561,37.72940755917529 +714332,2005-04-04 01:00:00,DRUNKENNESS,SOUTHERN,MAIN ST / MISSION ST,-122.394943493883,37.7918424689772 +714371,2005-03-27 22:12:00,DRUNKENNESS,CENTRAL,2700 Block of HYDE ST,-122.420534678271,37.8061892244521 +714440,2005-03-27 18:20:00,KIDNAPPING,PARK,1500 Block of WALLER ST,-122.44891092025298,37.7687425309259 +714526,2005-03-27 11:55:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +714563,2005-03-27 09:18:00,KIDNAPPING,INGLESIDE,400 Block of ARLINGTON ST,-122.429302522016,37.7352138289885 +714608,2005-03-27 04:37:00,ARSON,BAYVIEW,1100 Block of THOMAS AV,-122.382852175823,37.7256943991515 +714626,2005-03-27 01:55:00,DRUNKENNESS,CENTRAL,BROADWAY ST / ROWLAND ST,-122.404682312593,37.7981187904935 +714743,2005-03-26 20:40:00,RUNAWAY,MISSION,1000 Block of FLORIDA ST,-122.410364149927,37.755121669533104 +714748,2005-03-26 20:30:00,RUNAWAY,INGLESIDE,1000 Block of SADDLEBACK DR,-122.427008403376,37.7089434577722 +715017,2005-03-26 02:25:00,DRUNKENNESS,BAYVIEW,2700 Block of SAN BRUNO AV,-122.403408669191,37.72700531963 +715128,2005-03-25 20:00:00,KIDNAPPING,INGLESIDE,200 Block of VALLEY ST,-122.427879325226,37.7444838100358 +715196,2005-03-25 17:46:00,DRUNKENNESS,SOUTHERN,MARKET ST / 7TH ST,-122.412515341363,37.7804777480279 +715241,2005-03-25 15:30:00,KIDNAPPING,BAYVIEW,1700 Block of LASALLE AV,-122.391434800433,37.7381270935013 +715315,2005-03-25 11:50:00,RUNAWAY,TARAVAL,100 Block of SHAKESPEARE ST,-122.463283123185,37.70876958896429 +715426,2005-03-25 01:35:00,DRUNKENNESS,NORTHERN,1700 Block of POLK ST,-122.421074787492,37.7928376626584 +715508,2005-03-24 21:10:00,KIDNAPPING,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +715536,2005-03-24 19:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +715710,2005-03-24 11:35:00,DRUNKENNESS,NORTHERN,0 Block of MARINA BL,-122.432957440518,37.8051625655624 +715799,2005-03-24 07:00:00,RUNAWAY,INGLESIDE,0 Block of BLYTHDALE AV,-122.417720424652,37.710661234774896 +715841,2005-03-24 00:17:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +716069,2005-03-23 15:30:00,KIDNAPPING,BAYVIEW,600 Block of DEHARO ST,-122.401329886526,37.7616343759799 +716237,2005-03-23 07:00:00,ARSON,NORTHERN,1500 Block of EDDY ST,-122.433155869003,37.78126734681 +716316,2005-03-22 22:22:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +716346,2005-03-22 20:00:00,DRUNKENNESS,RICHMOND,4600 Block of GEARY BL,-122.469114632847,37.7809207816412 +716829,2005-03-21 15:30:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +716954,2005-03-21 10:11:00,ARSON,BAYVIEW,1000 Block of FITZGERALD AV,-122.388416108229,37.7191956969734 +717233,2005-03-13 15:44:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +717318,2005-03-13 10:32:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +717426,2005-03-13 00:02:00,DRUNKENNESS,INGLESIDE,4200 Block of MISSION ST,-122.430581904122,37.7295968082944 +717483,2005-03-12 21:55:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +717559,2005-03-12 17:40:00,DRUNKENNESS,CENTRAL,HYDE ST / POST ST,-122.416642370012,37.787245037792 +717625,2005-03-12 14:00:00,RUNAWAY,BAYVIEW,700 Block of INGERSON AV,-122.389247520149,37.71687590372579 +717684,2005-03-12 11:00:00,KIDNAPPING,INGLESIDE,800 Block of VIENNA ST,-122.434157340729,37.71540030527621 +717735,2005-03-12 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +717954,2005-03-11 18:45:00,ARSON,MISSION,FOLSOM ST / 19TH ST,-122.414845139214,37.7605000726041 +718060,2005-03-11 13:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +718283,2005-03-10 20:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +718307,2005-03-10 19:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +718345,2005-03-10 17:30:00,RUNAWAY,BAYVIEW,200 Block of HARBOR RD,-122.378268018481,37.7323807302226 +718353,2005-03-10 17:10:00,KIDNAPPING,MISSION,3000 Block of 16TH ST,-122.420080983505,37.7650815376682 +718423,2005-03-10 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +718648,2005-03-09 23:30:00,DRUNKENNESS,CENTRAL,300 Block of GEARY ST,-122.409077157261,37.7873064204439 +718655,2005-03-09 23:01:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +718712,2005-03-09 20:50:00,DRUNKENNESS,MISSION,2500 Block of MISSION ST,-122.418891810986,37.7562166627216 +718907,2005-03-09 12:40:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +718919,2005-03-09 12:05:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +719010,2005-03-09 07:45:00,RUNAWAY,INGLESIDE,300 Block of PHELAN AV,-122.452510148212,37.72946995720979 +719059,2005-03-09 00:05:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +719123,2005-03-08 21:30:00,RUNAWAY,BAYVIEW,0 Block of YOUNG CT,-122.386021861908,37.736356548214296 +719350,2005-03-08 10:00:00,KIDNAPPING,BAYVIEW,1000 Block of PALOU AV,-122.380818341183,37.728187027980496 +719443,2005-03-08 00:38:00,KIDNAPPING,BAYVIEW,BAY SHORE BL / JERROLD AV,-122.403564371009,37.747761310356005 +719520,2005-03-07 19:00:00,ARSON,PARK,1500 Block of HAYES ST,-122.441937491745,37.7744069206938 +719561,2005-03-07 17:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +719580,2005-03-07 16:00:00,KIDNAPPING,NORTHERN,700 Block of POLK ST,-122.419159190984,37.7833430636234 +719606,2005-03-07 14:00:00,RUNAWAY,BAYVIEW,1500 Block of THOMAS AV,-122.390412274884,37.7298480138652 +719813,2005-02-27 22:45:00,ARSON,INGLESIDE,OCEAN AV / ALEMANY BL,-122.437438118763,37.7237173830138 +719970,2005-02-27 12:00:00,DRUNKENNESS,MISSION,3300 Block of CESAR CHAVEZ ST,-122.417059385145,37.7480778892528 +720004,2005-02-27 09:45:00,KIDNAPPING,SOUTHERN,0 Block of HALLAM ST,-122.408600405402,37.7756834676857 +720113,2005-02-26 22:30:00,ARSON,INGLESIDE,1700 Block of ALABAMA ST,-122.410387028015,37.7450954589079 +720204,2005-02-26 18:34:00,DRUNKENNESS,NORTHERN,1900 Block of UNION ST,-122.431009192575,37.7977145786189 +720217,2005-02-26 18:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +720240,2005-02-26 16:55:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +720386,2005-02-26 08:03:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +720447,2005-02-26 00:02:00,DRUNKENNESS,SOUTHERN,900 Block of FOLSOM ST,-122.403860419019,37.77981372039329 +720521,2005-02-25 21:00:00,KIDNAPPING,NORTHERN,2300 Block of UNION ST,-122.437985259491,37.7968271241633 +720551,2005-02-25 19:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +720556,2005-02-25 19:00:00,RUNAWAY,SOUTHERN,4TH ST / MISSION ST,-122.404270179493,37.7844788538516 +720564,2005-02-25 18:30:00,RUNAWAY,NORTHERN,1100 Block of SUTTER ST,-122.41931732407,37.7879136979106 +720716,2005-02-25 13:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +720766,2005-02-25 10:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +721046,2005-02-24 16:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +721135,2005-02-24 13:30:00,ARSON,INGLESIDE,300 Block of LAGRANDE AV,-122.425591802243,37.7197426710766 +721315,2005-02-23 22:30:00,RUNAWAY,BAYVIEW,0 Block of BELL CT,-122.384940423588,37.734005130178105 +721338,2005-02-23 21:26:00,DRUNKENNESS,BAYVIEW,200 Block of CONNECTICUT ST,-122.397621727664,37.7631413193261 +721615,2005-02-23 09:27:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +721712,2005-02-22 23:26:00,DRUNKENNESS,SOUTHERN,1400 Block of MARKET ST,-122.418480564808,37.775898446204 +721729,2005-02-22 22:15:00,DRUNKENNESS,NORTHERN,800 Block of ELLIS ST,-122.42019129512,37.7838703920898 +721799,2005-02-22 18:30:00,RUNAWAY,BAYVIEW,0 Block of BRIDGEVIEW DR,-122.394537691058,37.7346923893626 +721802,2005-02-22 18:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +721814,2005-02-22 18:00:00,DRUNKENNESS,MISSION,2800 Block of 24TH ST,-122.409592912103,37.7527125370932 +722076,2005-02-22 00:43:00,ARSON,INGLESIDE,2800 Block of ALEMANY BL,-122.451391413052,37.7126380519918 +722096,2005-02-22 00:01:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +722248,2005-02-21 14:45:00,DRUNKENNESS,MISSION,3000 Block of 24TH ST,-122.413261970103,37.752610055276 +722276,2005-02-21 13:01:00,DRUNKENNESS,NORTHERN,0 Block of MARINA BL,-122.432957440518,37.8051625655624 +722286,2005-02-21 12:28:00,KIDNAPPING,SOUTHERN,JONES ST / MCALLISTER ST,-122.411979487501,37.7809039696529 +722298,2005-02-21 12:00:00,RUNAWAY,TENDERLOIN,200 Block of TURK ST,-122.413259498719,37.7829514828801 +722393,2005-02-21 02:15:00,DRUNKENNESS,RICHMOND,3000 Block of GEARY BL,-122.451669861819,37.7820516462118 +722569,2005-02-13 16:00:00,KIDNAPPING,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +722673,2005-02-13 07:18:00,DRUNKENNESS,SOUTHERN,1400 Block of MISSION ST,-122.416468768127,37.774750702851 +722783,2005-02-12 22:30:00,KIDNAPPING,BAYVIEW,1000 Block of REVERE AV,-122.379861894951,37.7258888173403 +722803,2005-02-12 21:33:00,DRUNKENNESS,SOUTHERN,700 Block of MARKET ST,-122.40409466245,37.787256092799296 +722858,2005-02-12 19:00:00,RUNAWAY,PARK,300 Block of BAKER ST,-122.440949589926,37.7741190407726 +722868,2005-02-12 18:32:00,DRUNKENNESS,CENTRAL,JEFFERSON ST / JONES ST,-122.417448570426,37.808012253781705 +722929,2005-02-12 14:40:00,KIDNAPPING,INGLESIDE,4800 Block of MISSION ST,-122.437216421378,37.7213272618826 +722930,2005-02-12 14:35:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +723008,2005-02-12 09:45:00,DRUNKENNESS,NORTHERN,0 Block of IVY ST,-122.418951160054,37.7779227182608 +723084,2005-02-12 00:14:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405863212632,37.7980228452184 +723165,2005-02-11 20:21:00,DRUNKENNESS,MISSION,2900 Block of MISSION ST,-122.418279075012,37.7498209864471 +723173,2005-02-11 20:00:00,ARSON,TENDERLOIN,300 Block of EDDY ST,-122.413790972781,37.7838365565348 +723180,2005-02-11 20:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +723224,2005-02-11 18:18:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +723368,2005-02-11 12:30:00,ARSON,RICHMOND,400 Block of 30TH AV,-122.490093437359,37.7807920840194 +723381,2005-02-11 12:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +723441,2005-02-11 08:35:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +723447,2005-02-11 08:15:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +723452,2005-02-11 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +723456,2005-02-11 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +723503,2005-02-11 01:36:00,DRUNKENNESS,CENTRAL,200 Block of COLUMBUS AV,-122.406409965318,37.7977588402975 +723517,2005-02-11 00:35:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +723532,2005-02-10 23:30:00,KIDNAPPING,MISSION,3200 Block of 26TH ST,-122.415142222785,37.7491658872937 +723656,2005-02-10 16:38:00,DRUNKENNESS,MISSION,18TH ST / OAKWOOD ST,-122.425025921033,37.7614906872114 +723765,2005-02-10 11:30:00,DRUNKENNESS,MISSION,3400 Block of 18TH ST,-122.419748993977,37.76186726489721 +723866,2005-02-10 02:18:00,KIDNAPPING,NORTHERN,GOUGH ST / CLAY ST,-122.42598362622,37.7917570761834 +724070,2005-02-09 17:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +724127,2005-02-09 15:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +724193,2005-02-09 11:45:00,DRUNKENNESS,SOUTHERN,3RD ST / BERRY ST,-122.391125079567,37.777553996552 +724383,2005-02-08 19:30:00,DRUNKENNESS,MISSION,1700 Block of MISSION ST,-122.419937703327,37.7686624037434 +724409,2005-02-08 18:20:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +724659,2005-02-08 07:20:00,DRUNKENNESS,CENTRAL,GEARY ST / LARKIN ST,-122.418090766699,37.7861007451416 +724746,2005-02-07 22:20:00,DRUNKENNESS,SOUTHERN,1000 Block of HARRISON ST,-122.404439703838,37.777058307998296 +724760,2005-02-07 21:00:00,RUNAWAY,BAYVIEW,1400 Block of OAKDALE AV,-122.387527753438,37.73305496510249 +724767,2005-02-07 20:52:00,RUNAWAY,BAYVIEW,500 Block of TEXAS ST,-122.395164170538,37.7592223045204 +725008,2005-02-07 07:47:00,ARSON,BAYVIEW,1300 Block of SELBY ST,-122.40058908695,37.738988165987294 +725031,2005-02-07 04:30:00,ARSON,SOUTHERN,11TH ST / DIVISION ST,-122.410932750789,37.7694113849465 +725036,2005-02-07 03:35:00,KIDNAPPING,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +725092,2005-01-30 22:30:00,DRUNKENNESS,SOUTHERN,1100 Block of HOWARD ST,-122.410732972926,37.7768349106122 +725365,2005-01-30 02:33:00,ARSON,BAYVIEW,1900 Block of OAKDALE AV,-122.396854743097,37.7383701754053 +725383,2005-01-30 01:50:00,DRUNKENNESS,SOUTHERN,700 Block of 2ND ST,-122.39009898571,37.7801880882663 +725439,2005-01-29 23:20:00,DRUNKENNESS,PARK,HAIGHT ST / ASHBURY ST,-122.446933310948,37.770006198840896 +725484,2005-01-29 21:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +725528,2005-01-29 19:30:00,DRUNKENNESS,SOUTHERN,KING ST / 3RD ST,-122.391845617234,37.778124778298505 +725588,2005-01-29 17:24:00,DRUNKENNESS,SOUTHERN,700 Block of 3RD ST,-122.392237353343,37.7785204661785 +725732,2005-01-29 07:30:00,ARSON,BAYVIEW,3RD ST / CESAR CHAVEZ ST,-122.387586780799,37.7502652918684 +725814,2005-01-28 23:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +725815,2005-01-28 23:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +725920,2005-01-28 19:30:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +726018,2005-01-28 15:43:00,DRUNKENNESS,BAYVIEW,700 Block of 22ND ST,-122.388796044801,37.7579659191536 +726301,2005-01-27 20:59:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +726321,2005-01-27 20:25:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +726327,2005-01-27 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +726433,2005-01-27 15:32:00,RUNAWAY,NORTHERN,LOMBARD ST / GOUGH ST,-122.427826729571,37.8008851555745 +726588,2005-01-27 08:00:00,RUNAWAY,PARK,1300 Block of FULTON ST,-122.439037573428,37.776802154003896 +726610,2005-01-27 03:45:00,ARSON,PARK,1600 Block of MCALLISTER ST,-122.439222900635,37.7777427514236 +726694,2005-01-26 22:00:00,ARSON,INGLESIDE,200 Block of BRAZIL AV,-122.432788409787,37.723784454682296 +726786,2005-01-26 18:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +726919,2005-01-26 12:05:00,RUNAWAY,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +726929,2005-01-26 11:46:00,DRUNKENNESS,CENTRAL,0 Block of GEARY ST,-122.404277568186,37.7879185264229 +726956,2005-01-26 10:41:00,DRUNKENNESS,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +727063,2005-01-25 22:54:00,ARSON,RICHMOND,500 Block of JOHNFKENNEDY DR,-122.466204667893,37.7725405391593 +727096,2005-01-25 21:00:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414269361877,37.7842081124308 +727120,2005-01-25 19:25:00,RUNAWAY,NORTHERN,1100 Block of TURK ST,-122.428818526724,37.7808642652455 +727376,2005-01-25 07:30:00,DRUNKENNESS,BAYVIEW,1400 Block of PALOU AV,-122.388078475154,37.7324430442707 +727377,2005-01-25 07:30:00,RUNAWAY,SOUTHERN,1300 Block of STEVENSON ST,-122.42173251154,37.7707590888754 +727447,2005-01-24 23:00:00,ARSON,NORTHERN,200 Block of LILY ST,-122.425023030789,37.7742865360686 +727573,2005-01-24 16:00:00,KIDNAPPING,MISSION,200 Block of FAIROAKS ST,-122.424129889581,37.75268787798221 +727632,2005-01-24 12:40:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +727809,2005-01-16 23:08:00,DRUNKENNESS,NORTHERN,1100 Block of VANNESS AV,-122.421254202268,37.7859235669023 +728122,2005-01-16 01:48:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +728144,2005-01-16 00:30:00,DRUNKENNESS,TARAVAL,0 Block of DORADO TR,-122.46065227199,37.726552117263104 +728287,2005-01-15 18:40:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +728288,2005-01-15 18:40:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +728360,2005-01-15 16:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +728398,2005-01-15 15:00:00,KIDNAPPING,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +728417,2005-01-15 14:00:00,RUNAWAY,TARAVAL,500 Block of FAXON AV,-122.460163447995,37.7242088328715 +728436,2005-01-15 12:30:00,DRUNKENNESS,PARK,HAIGHT ST / STANYAN ST,-122.453534560634,37.76916629781029 +728549,2005-01-15 02:10:00,DRUNKENNESS,MISSION,0 Block of SYCAMORE ST,-122.419823820277,37.7626348241196 +728599,2005-01-14 23:21:00,DRUNKENNESS,SOUTHERN,3RD ST / FOLSOM ST,-122.398932711102,37.78378482113551 +728643,2005-01-14 21:16:00,ARSON,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375605171962,37.730721521570295 +728666,2005-01-14 20:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +728707,2005-01-14 18:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +728731,2005-01-14 17:28:00,DRUNKENNESS,BAYVIEW,400 Block of TOLAND ST,-122.398239510066,37.7447493607742 +728735,2005-01-14 17:25:00,DRUNKENNESS,TARAVAL,46TH AV / JUDAH ST,-122.505928450155,37.7604217436805 +728787,2005-01-14 15:06:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +728792,2005-01-14 14:58:00,ARSON,INGLESIDE,900 Block of ELLSWORTH ST,-122.416446124049,37.7329162539537 +728796,2005-01-14 14:44:00,DRUNKENNESS,SOUTHERN,1500 Block of MARKET ST,-122.419842305148,37.7748226184309 +728842,2005-01-14 12:59:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449122960735,37.7697840925361 +728969,2005-01-14 03:34:00,ARSON,BAYVIEW,800 Block of MANSELL ST,-122.40954276725,37.7195088952058 +729056,2005-01-13 21:55:00,KIDNAPPING,MISSION,17TH ST / MISSION ST,-122.419515708414,37.76342923285421 +729100,2005-01-13 19:38:00,DRUNKENNESS,MISSION,2100 Block of 16TH ST,-122.40804370226002,37.7656975984795 +729114,2005-01-13 18:45:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +729157,2005-01-13 17:20:00,DRUNKENNESS,PARK,0 Block of SHRADER ST,-122.452839772389,37.7745145380854 +729219,2005-01-13 14:15:00,RUNAWAY,SOUTHERN,200 Block of INTERSTATE80 HY,-122.365565425353,37.8096707013239 +729228,2005-01-13 14:00:00,KIDNAPPING,INGLESIDE,500 Block of CORTLAND AV,-122.416195250578,37.7390857376347 +729538,2005-01-12 18:55:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +729543,2005-01-12 18:34:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +729574,2005-01-12 17:27:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +729652,2005-01-12 15:00:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +729666,2005-01-12 14:33:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345155,37.783991676793214 +729826,2005-01-12 05:45:00,ARSON,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +729846,2005-01-12 03:45:00,DRUNKENNESS,CENTRAL,0 Block of ROSS AL,-122.407419469554,37.79548564710471 +730680,2005-01-10 04:15:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413631253258,37.7848053746211 +730696,2005-01-10 01:56:00,DRUNKENNESS,PARK,100 Block of PIERCE ST,-122.433711096406,37.7712220443581 +730854,2004-12-26 14:30:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +731023,2004-12-25 23:00:00,KIDNAPPING,INGLESIDE,3900 Block of MISSION ST,-122.42588350725,37.7340533952742 +731165,2004-12-25 11:00:00,RUNAWAY,BAYVIEW,1500 Block of KIRKWOOD AV,-122.388879303147,37.73748619494771 +731203,2004-12-25 01:30:00,KIDNAPPING,PARK,1200 Block of GROVE ST,-122.437159091657,37.775975349305504 +731341,2004-12-24 18:09:00,KIDNAPPING,INGLESIDE,300 Block of MOSCOW ST,-122.427127092149,37.72205469469471 +731412,2004-12-24 14:40:00,KIDNAPPING,NORTHERN,800 Block of MCALLISTER ST,-122.42521142911,37.7795180588339 +731418,2004-12-24 14:00:00,KIDNAPPING,BAYVIEW,100 Block of BERTHA LN,-122.380898507162,37.7332256396347 +731425,2004-12-24 13:05:00,ARSON,TARAVAL,43RD AV / JUDAH ST,-122.502710973792,37.7605643626043 +731513,2004-12-24 06:50:00,KIDNAPPING,MISSION,17TH ST / SOUTH VAN NESS AV,-122.417332582598,37.7635718955939 +731521,2004-12-24 03:33:00,DRUNKENNESS,NORTHERN,2400 Block of FILLMORE ST,-122.434539150834,37.79203141483529 +731645,2004-12-23 19:30:00,KIDNAPPING,CENTRAL,700 Block of STOCKTON ST,-122.407500737639,37.7925035706535 +731671,2004-12-23 18:15:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +731772,2004-12-23 14:48:00,DRUNKENNESS,BAYVIEW,6600 Block of 3RD ST,-122.398315314856,37.7181339755846 +731793,2004-12-23 14:00:00,DRUNKENNESS,CENTRAL,HYDE ST / BEACH ST,-122.420564122324,37.806656782396296 +732005,2004-12-22 21:06:00,ARSON,BAYVIEW,17TH ST / CONNECTICUT ST,-122.397741566597,37.7650728676819 +732043,2004-12-22 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +732178,2004-12-22 14:20:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.445346786573,37.7702081959223 +732554,2004-12-21 15:18:00,ARSON,INGLESIDE,600 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +732892,2004-12-20 16:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +733123,2004-12-20 00:13:00,RUNAWAY,MISSION,500 Block of CASTRO ST,-122.434994783089,37.76006971065671 +733175,2004-12-12 21:38:00,DRUNKENNESS,MISSION,24TH ST / LILAC ST,-122.417878226793,37.7522731644894 +733254,2004-12-12 16:45:00,DRUNKENNESS,SOUTHERN,7TH ST / MARKET ST,-122.412515341363,37.7804777480279 +733289,2004-12-12 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +733387,2004-12-12 07:28:00,DRUNKENNESS,NORTHERN,DUBOCE AV / CHURCH ST,-122.429128783485,37.7694556178638 +733516,2004-12-11 21:55:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421264331104,37.743584765874 +733574,2004-12-11 19:00:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552609,37.7693505381832 +733635,2004-12-11 16:00:00,RUNAWAY,CENTRAL,700 Block of PACIFIC AV,-122.408014703843,37.796699717573 +733925,2004-12-10 18:00:00,KIDNAPPING,BAYVIEW,PALOU AV / HAWES ST,-122.381567218816,37.7286801945594 +734117,2004-12-10 10:35:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.447783070559,37.769954950346495 +734303,2004-12-09 20:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +734547,2004-12-09 08:00:00,ARSON,BAYVIEW,0 Block of CONKLING ST,-122.401968361773,37.7356138034783 +734588,2004-12-09 02:00:00,KIDNAPPING,SOUTHERN,1000 Block of MARKET ST,-122.411071423064,37.7817511307229 +734645,2004-12-08 22:05:00,DRUNKENNESS,SOUTHERN,800 Block of MISSION ST,-122.405395493939,37.7835100715421 +734683,2004-12-08 19:45:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +734765,2004-12-08 15:55:00,KIDNAPPING,RICHMOND,600 Block of 29TH AV,-122.488737802456,37.7770245596282 +734991,2004-12-07 22:10:00,ARSON,CENTRAL,1200 Block of BROADWAY ST,-122.417805281259,37.7961931796338 +735091,2004-12-07 17:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +735309,2004-12-07 03:44:00,DRUNKENNESS,NORTHERN,0 Block of FELL ST,-122.418500584434,37.7764380944444 +735606,2004-12-06 08:00:00,KIDNAPPING,RICHMOND,3900 Block of SACRAMENTO ST,-122.458099009839,37.78682706542821 +735633,2004-12-06 03:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +735718,2004-11-28 20:40:00,ARSON,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +735736,2004-11-28 19:09:00,DRUNKENNESS,INGLESIDE,0 Block of 29TH ST,-122.42234692668998,37.7440146216143 +735852,2004-11-28 11:00:00,KIDNAPPING,PARK,1700 Block of ELLIS ST,-122.434992629934,37.781989368850496 +735911,2004-11-28 04:15:00,ARSON,BAYVIEW,100 Block of HOOPER ST,-122.399364608159,37.7681836246384 +735913,2004-11-28 03:34:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +736027,2004-11-27 21:40:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406681057265,37.755343095442 +736273,2004-11-27 02:30:00,ARSON,SOUTHERN,100 Block of OTIS ST,-122.420303482492,37.770896885856 +736297,2004-11-27 00:49:00,DRUNKENNESS,CENTRAL,1200 Block of GRANT AV,-122.407049542301,37.798339916757605 +736316,2004-11-26 23:37:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +736675,2004-11-26 00:13:00,ARSON,BAYVIEW,3RD ST / JERROLD AV,-122.38931064465,37.7387418395425 +736795,2004-11-25 15:30:00,ARSON,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375605171962,37.730721521570295 +736884,2004-11-25 08:15:00,RUNAWAY,TARAVAL,2200 Block of 27TH AV,-122.484389001782,37.7454558628988 +737136,2004-11-24 15:30:00,ARSON,BAYVIEW,RANKIN ST / OAKDALE AV,-122.397812021233,37.7388469465805 +737301,2004-11-24 04:03:00,ARSON,NORTHERN,0 Block of CEDAR ST,-122.419016755254,37.7865167265223 +737451,2004-11-23 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +737896,2004-11-22 14:45:00,ARSON,RICHMOND,4700 Block of BALBOA ST,-122.509644693774,37.775206536734295 +738141,2004-11-14 21:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +738186,2004-11-14 18:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +738229,2004-11-14 16:30:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +738308,2004-11-14 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +738317,2004-11-14 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +738417,2004-11-14 01:40:00,ARSON,BAYVIEW,1600 Block of GRIFFITH ST,-122.381719720362,37.72544807413321 +738426,2004-11-14 01:09:00,DRUNKENNESS,CENTRAL,0 Block of DUNNES AL,-122.405240944952,37.7983444734941 +738455,2004-11-13 23:22:00,DRUNKENNESS,INGLESIDE,29TH ST / MISSION ST,-122.420896598743,37.7440381549474 +738668,2004-11-13 13:00:00,RUNAWAY,BAYVIEW,3200 Block of JENNINGS ST,-122.395210826879,37.719897700646 +738719,2004-11-13 10:40:00,RUNAWAY,INGLESIDE,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +738744,2004-11-13 09:00:00,KIDNAPPING,INGLESIDE,0 Block of TUCKER AV,-122.404586629869,37.7154432787137 +738825,2004-11-12 23:30:00,RUNAWAY,INGLESIDE,400 Block of ATHENS ST,-122.429086132374,37.72087595156521 +738950,2004-11-12 18:07:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +739019,2004-11-12 15:40:00,RUNAWAY,MISSION,19TH ST / MISSION ST,-122.419208249515,37.7602340753651 +739170,2004-11-12 08:20:00,KIDNAPPING,TARAVAL,RANDOLPH ST / ARCH ST,-122.46709224036002,37.714273566002 +739307,2004-11-11 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +739336,2004-11-11 20:45:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +739348,2004-11-11 19:41:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +739560,2004-11-11 09:30:00,RUNAWAY,INGLESIDE,1300 Block of SUNNYDALE AV,-122.414017542167,37.7112967864555 +739595,2004-11-11 06:45:00,KIDNAPPING,BAYVIEW,KEITH ST / THOMAS AV,-122.389421299082,37.729353849275896 +739818,2004-11-10 14:45:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +739988,2004-11-10 01:41:00,DRUNKENNESS,RICHMOND,4TH AV / GEARY BL,-122.462141270154,37.7811098899109 +740075,2004-11-09 19:20:00,DRUNKENNESS,RICHMOND,6100 Block of GEARY BL,-122.485290737594,37.7801886709059 +740106,2004-11-09 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +740173,2004-11-09 14:00:00,KIDNAPPING,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +740174,2004-11-09 14:00:00,KIDNAPPING,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +740201,2004-11-09 12:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +740607,2004-11-08 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +740671,2004-11-08 00:11:00,DRUNKENNESS,SOUTHERN,AHERN WY / HARRIET ST,-122.403960421357,37.7763118173284 +740781,2004-10-31 21:30:00,DRUNKENNESS,MISSION,18TH ST / CASTRO ST,-122.435002864271,37.7608878061245 +740815,2004-10-31 20:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +740816,2004-10-31 20:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +740821,2004-10-31 20:10:00,KIDNAPPING,MISSION,1100 Block of ALABAMA ST,-122.410970913175,37.7534747396472 +740830,2004-10-31 20:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +740851,2004-10-31 18:30:00,DRUNKENNESS,MISSION,100 Block of CAPP ST,-122.418687919804,37.7642753857061 +740909,2004-10-31 15:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +740925,2004-10-31 14:00:00,ARSON,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +741050,2004-10-31 02:42:00,ARSON,NORTHERN,1100 Block of SUTTER ST,-122.41931732407,37.7879136979106 +741110,2004-10-31 00:10:00,DRUNKENNESS,SOUTHERN,HARRISON ST / BEALE ST,-122.39118340577,37.78745561834621 +741121,2004-10-31 00:01:00,ARSON,CENTRAL,800 Block of BUSH ST,-122.411281399822,37.7898978570344 +741239,2004-10-30 19:25:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +741444,2004-10-30 03:35:00,ARSON,TARAVAL,1900 Block of 46TH AV,-122.50514210481,37.750149155364106 +741454,2004-10-30 02:20:00,DRUNKENNESS,NORTHERN,FILLMORE ST / GEARY BL,-122.432914603466,37.7843533426344 +741550,2004-10-29 20:50:00,KIDNAPPING,MISSION,3100 Block of 26TH ST,-122.41350190466,37.7492652916222 +741707,2004-10-29 16:29:00,DRUNKENNESS,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +741886,2004-10-29 08:00:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +741919,2004-10-29 04:30:00,ARSON,MISSION,3500 Block of 17TH ST,-122.42511038332,37.7630432713507 +741942,2004-10-29 01:00:00,DRUNKENNESS,CENTRAL,600 Block of SUTTER ST,-122.411068869703,37.78885570426971 +741997,2004-10-28 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +742031,2004-10-28 20:49:00,DRUNKENNESS,MISSION,2400 Block of MISSION ST,-122.418963082325,37.758420303653104 +742054,2004-10-28 20:00:00,KIDNAPPING,BAYVIEW,20TH ST / 3RD ST,-122.388559411371,37.7604929243656 +742201,2004-10-28 13:37:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345155,37.783991676793214 +742265,2004-10-28 10:05:00,DRUNKENNESS,CENTRAL,BEACH ST / COLUMBUS AV,-122.419580592127,37.8067799238827 +742296,2004-10-28 08:20:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411778295992,37.7839805592634 +742314,2004-10-28 07:10:00,DRUNKENNESS,TENDERLOIN,ELLIS ST / HYDE ST,-122.416075285059,37.78444966125621 +742380,2004-10-27 23:31:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +742653,2004-10-27 11:02:00,DRUNKENNESS,MISSION,CYPRESS ST / 24TH ST,-122.416828148192,37.7523369464957 +742780,2004-10-26 22:50:00,ARSON,CENTRAL,700 Block of SUTTER ST,-122.412718544555,37.7886466255672 +742942,2004-10-26 15:00:00,DRUNKENNESS,PARK,HAIGHT ST / CLAYTON ST,-122.44857848494,37.76979771688821 +743020,2004-10-26 11:55:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +743058,2004-10-26 10:00:00,KIDNAPPING,PARK,MASONIC AV / HAYES ST,-122.446091525471,37.773934479461005 +743079,2004-10-26 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +743113,2004-10-26 00:58:00,DRUNKENNESS,MISSION,25TH ST / TREAT AV,-122.412838554026,37.7509678760804 +743190,2004-10-25 20:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +743256,2004-10-25 17:48:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +743352,2004-10-25 14:00:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.449942040795,37.7696796386185 +743390,2004-10-25 11:25:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +743391,2004-10-25 11:25:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +743518,2004-10-17 22:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +743557,2004-10-17 21:03:00,DRUNKENNESS,RICHMOND,300 Block of CABRILLO ST,-122.462283386236,37.7754970140089 +743732,2004-10-17 06:00:00,KIDNAPPING,BAYVIEW,1000 Block of OAKDALE AV,-122.380348349699,37.7288276251864 +743758,2004-10-17 02:20:00,DRUNKENNESS,INGLESIDE,600 Block of SAN JOSE AV,-122.422242631424,37.74473055186 +743879,2004-10-16 21:40:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +743912,2004-10-16 19:50:00,DRUNKENNESS,BAYVIEW,1000 Block of KEY AV,-122.397328238942,37.7196121077812 +743928,2004-10-16 18:49:00,DRUNKENNESS,MISSION,3100 Block of 16TH ST,-122.423622537404,37.7647573853335 +743972,2004-10-16 17:00:00,DRUNKENNESS,CENTRAL,2800 Block of TAYLOR ST,-122.415923448242,37.8085905137102 +743983,2004-10-16 16:30:00,ARSON,RICHMOND,600 Block of 48TH AV,-122.509193552106,37.7756193870159 +744463,2004-10-15 13:00:00,KIDNAPPING,MISSION,2800 Block of 24TH ST,-122.408664686116,37.7528787651491 +744508,2004-10-15 11:15:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +744509,2004-10-15 11:15:00,ARSON,TARAVAL,0 Block of MIDDLEFIELD DR,-122.486406105517,37.7331757281339 +744515,2004-10-15 11:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +744805,2004-10-14 16:00:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITED NATIONS PZ,-122.41431222924,37.77983391835871 +744992,2004-10-14 04:01:00,ARSON,TARAVAL,100 Block of DE MONTFORT AV,-122.459729689658,37.7235949457308 +745267,2004-10-13 14:29:00,DRUNKENNESS,PARK,HAIGHT ST / BELVEDERE ST,-122.44964766292802,37.76966191958971 +745298,2004-10-13 13:30:00,KIDNAPPING,BAYVIEW,1400 Block of SHAFTER AV,-122.387897392339,37.72950441589521 +745345,2004-10-13 11:25:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +745478,2004-10-13 00:34:00,KIDNAPPING,INGLESIDE,GENEVA AV / MISSION ST,-122.441018108862,37.716458683113714 +745498,2004-10-12 23:45:00,ARSON,TARAVAL,8TH AV / LINARES AV,-122.464227473458,37.7521607848006 +745545,2004-10-12 21:15:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +745563,2004-10-12 20:05:00,KIDNAPPING,BAYVIEW,0 Block of MIDDLEPOINT RD,-122.379483705157,37.7357419110951 +745767,2004-10-12 10:38:00,ARSON,TARAVAL,2200 Block of 14TH AV,-122.470359608661,37.7460753397163 +745797,2004-10-12 09:00:00,RUNAWAY,SOUTHERN,300 Block of 11TH ST,-122.413189430011,37.77127369135761 +745812,2004-10-12 08:05:00,KIDNAPPING,TARAVAL,47TH AV / JUDAH ST,-122.506996377686,37.7603760935224 +745842,2004-10-12 03:20:00,KIDNAPPING,CENTRAL,600 Block of TAYLOR ST,-122.411661324021,37.7880416922857 +745995,2004-10-11 18:51:00,DRUNKENNESS,CENTRAL,MASON ST / BEACH ST,-122.413979577593,37.8074807657328 +746089,2004-10-11 14:00:00,KIDNAPPING,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +746149,2004-10-11 11:00:00,DRUNKENNESS,CENTRAL,300 Block of BAY ST,-122.412782236976,37.8056654684523 +746208,2004-10-11 04:30:00,ARSON,BAYVIEW,1600 Block of ARMSTRONG AV,-122.392862620754,37.7266458218535 +746212,2004-10-11 03:45:00,KIDNAPPING,RICHMOND,2000 Block of POST ST,-122.435575820196,37.784892281882 +746408,2004-10-03 14:35:00,DRUNKENNESS,NORTHERN,GEARY BL / GOUGH ST,-122.424688703598,37.785333964007705 +746487,2004-10-03 09:45:00,ARSON,SOUTHERN,0 Block of RINGOLD ST,-122.410261647599,37.7738916667153 +746517,2004-10-03 05:45:00,ARSON,BAYVIEW,EVANS AV / RANKIN ST,-122.392184416208,37.745101531369 +746884,2004-10-02 01:00:00,KIDNAPPING,BAYVIEW,3000 Block of SAN BRUNO AV,-122.401898005335,37.7233482212763 +746906,2004-10-01 23:38:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +746984,2004-10-01 19:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +747217,2004-10-01 10:45:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +747218,2004-10-01 10:45:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +747320,2004-10-01 01:58:00,ARSON,INGLESIDE,JOHN F SHELLEY DR / CAMBRIDGE ST,-122.416483539598,37.7218104029251 +747381,2004-09-30 23:04:00,ARSON,MISSION,ALAMEDA ST / POTRERO AV,-122.407815467605,37.7683548732735 +747486,2004-09-30 17:04:00,DRUNKENNESS,NORTHERN,MYRTLE ST / LARKIN ST,-122.417999278698,37.7856407526414 +747624,2004-09-30 10:20:00,DRUNKENNESS,CENTRAL,900 Block of COLUMBUS AV,-122.414263444238,37.8031918743285 +747632,2004-09-30 09:45:00,ARSON,BAYVIEW,600 Block of VERMONT ST,-122.404126459271,37.7614652487171 +747715,2004-09-30 01:12:00,ARSON,BAYVIEW,0 Block of BOUTWELL ST,-122.405740307882,37.7374170602909 +747769,2004-09-29 22:10:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.407474439624,37.779911669335 +747795,2004-09-29 21:00:00,RUNAWAY,PARK,1300 Block of FULTON ST,-122.439037573428,37.776802154003896 +747796,2004-09-29 21:00:00,RUNAWAY,MISSION,2300 Block of FOLSOM ST,-122.41469551481,37.7596861764245 +747986,2004-09-29 12:49:00,DRUNKENNESS,CENTRAL,BUSH ST / KEARNY ST,-122.404033177244,37.7907593489017 +748131,2004-09-29 05:50:00,KIDNAPPING,NORTHERN,900 Block of TURK ST,-122.425586860183,37.781378625807 +748208,2004-09-28 22:00:00,RUNAWAY,SOUTHERN,600 Block of NATOMA ST,-122.411118243435,37.7775607137405 +748373,2004-09-28 14:08:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.447783070559,37.769954950346495 +748378,2004-09-28 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +748403,2004-09-28 13:12:00,DRUNKENNESS,PARK,1300 Block of HAIGHT ST,-122.444524277297,37.7703704336439 +749039,2004-09-19 20:00:00,DRUNKENNESS,INGLESIDE,SAN JUAN AV / MISSION ST,-122.435311835455,37.7240050528471 +749151,2004-09-19 12:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +749172,2004-09-19 09:50:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +749233,2004-09-19 01:29:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +749597,2004-09-18 02:20:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +749698,2004-09-17 20:30:00,RUNAWAY,TARAVAL,100 Block of MAJESTIC AV,-122.452596042418,37.7162402296878 +749850,2004-09-17 14:30:00,KIDNAPPING,RICHMOND,32ND AV / CALIFORNIA ST,-122.492511051009,37.783539771150295 +749862,2004-09-17 14:05:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +749864,2004-09-17 14:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +749933,2004-09-17 11:30:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +749941,2004-09-17 11:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +750027,2004-09-17 03:50:00,ARSON,BAYVIEW,0 Block of CAMERON WY,-122.387181635995,37.7209669615499 +750067,2004-09-17 00:01:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +750069,2004-09-17 00:01:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +750306,2004-09-16 13:50:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +750414,2004-09-16 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +750416,2004-09-16 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +750465,2004-09-16 03:26:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +750611,2004-09-15 19:21:00,DRUNKENNESS,PARK,800 Block of HAIGHT ST,-122.43623625469802,37.7714256624517 +750622,2004-09-15 18:40:00,ARSON,MISSION,2800 Block of 24TH ST,-122.408654193478,37.752769227933896 +750961,2004-09-14 23:00:00,DRUNKENNESS,SOUTHERN,500 Block of NATOMA ST,-122.408201798882,37.779688614432295 +751097,2004-09-14 17:00:00,RUNAWAY,MISSION,900 Block of SOUTH VAN NESS AV,-122.416725586439,37.7579542740829 +751101,2004-09-14 16:45:00,KIDNAPPING,TARAVAL,1300 Block of 8TH AV,-122.465109543504,37.7631379674712 +751303,2004-09-14 02:50:00,DRUNKENNESS,PARK,100 Block of BELVEDERE ST,-122.449192056455,37.7677915121484 +751319,2004-09-14 01:05:00,ARSON,BAYVIEW,1500 Block of INNES AV,-122.387875844031,37.7389452677155 +751452,2004-09-13 17:35:00,DRUNKENNESS,PARK,1300 Block of HAIGHT ST,-122.444524277297,37.7703704336439 +751740,2004-09-05 22:00:00,DRUNKENNESS,SOUTHERN,900 Block of HOWARD ST,-122.406412115335,37.780252457697394 +751837,2004-09-05 16:25:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +751843,2004-09-05 15:50:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +751995,2004-09-05 04:00:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.407376463936,37.7799892619986 +752122,2004-09-04 20:00:00,ARSON,INGLESIDE,200 Block of JOOST AV,-122.440908839672,37.732307425298295 +752123,2004-09-04 20:00:00,KIDNAPPING,MISSION,500 Block of BARTLETT ST,-122.419276868183,37.7485648056908 +752367,2004-09-04 04:20:00,ARSON,CENTRAL,500 Block of TAYLOR ST,-122.411540447656,37.78740983565 +752378,2004-09-04 02:41:00,DRUNKENNESS,PARK,700 Block of WALLER ST,-122.436043096787,37.77049779956779 +752414,2004-09-04 00:30:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / LOMBARD ST,-122.41362583333,37.8027563488738 +752437,2004-09-03 23:50:00,DRUNKENNESS,MISSION,2100 Block of MISSION ST,-122.419424383763,37.7632323869521 +752444,2004-09-03 23:34:00,DRUNKENNESS,CENTRAL,VALLEJO ST / COLUMBUS AV,-122.407871572792,37.79869627427671 +752508,2004-09-03 20:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +752673,2004-09-03 13:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +752855,2004-09-02 23:10:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +753243,2004-09-01 22:00:00,KIDNAPPING,BAYVIEW,100 Block of BAY SHORE BL,-122.404177860824,37.7467540032621 +753655,2004-09-01 03:08:00,DRUNKENNESS,BAYVIEW,1000 Block of GRIFFITH ST,-122.378920771859,37.7286119710993 +753663,2004-09-01 02:30:00,KIDNAPPING,PARK,17TH ST / ORD ST,-122.440168037447,37.7621873493068 +753772,2004-08-31 21:36:00,KIDNAPPING,PARK,1800 Block of EDDY ST,-122.438120409301,37.7807473113138 +753787,2004-08-31 21:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +753854,2004-08-31 17:50:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +753880,2004-08-31 16:40:00,DRUNKENNESS,MISSION,NOE ST / MARKET ST,-122.433075152376,37.7641937790293 +753903,2004-08-31 16:00:00,RUNAWAY,NORTHERN,100 Block of PAGE ST,-122.42320280363,37.7740394663904 +753914,2004-08-31 15:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +754058,2004-08-31 08:20:00,ARSON,BAYVIEW,0 Block of DUKES CT,-122.386783027632,37.737002525786096 +754118,2004-08-30 23:45:00,KIDNAPPING,TARAVAL,300 Block of ARBALLO DR,-122.48310616875798,37.7201245877973 +754450,2004-08-30 01:56:00,DRUNKENNESS,INGLESIDE,3400 Block of MISSION ST,-122.422286651689,37.7420041169835 +754493,2004-08-22 22:35:00,DRUNKENNESS,MISSION,3300 Block of 23RD ST,-122.419144470556,37.7537483769495 +754556,2004-08-22 20:06:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436194484896,37.7227270383576 +754714,2004-08-22 11:44:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +754794,2004-08-22 02:00:00,ARSON,BAYVIEW,1200 Block of SHAFTER AV,-122.384161286185,37.7273840237408 +754940,2004-08-21 17:50:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.445346786573,37.7702081959223 +755081,2004-08-21 10:21:00,DRUNKENNESS,MISSION,18TH ST / MISSION ST,-122.419360352769,37.76183580124221 +755157,2004-08-21 02:15:00,DRUNKENNESS,SOUTHERN,1500 Block of FOLSOM ST,-122.414705605518,37.7711178632173 +755194,2004-08-21 00:54:00,ARSON,BAYVIEW,1100 Block of SHAFTER AV,-122.382370964778,37.7262328368628 +755424,2004-08-20 15:20:00,ARSON,NORTHERN,100 Block of FRANKLIN ST,-122.421169141493,37.7759181636114 +755632,2004-08-20 00:53:00,ARSON,MISSION,2400 Block of 23RD ST,-122.404007710567,37.7543694869111 +755851,2004-08-19 17:00:00,KIDNAPPING,INGLESIDE,800 Block of AMAZON AV,-122.433170979333,37.7146414144131 +755869,2004-08-19 16:27:00,KIDNAPPING,INGLESIDE,0 Block of CARVER ST,-122.410103465491,37.7421796060925 +755947,2004-08-19 13:00:00,RUNAWAY,CENTRAL,0 Block of SALMON ST,-122.412544215454,37.796556903439104 +756080,2004-08-19 01:13:00,ARSON,TARAVAL,JOHN MUIR DR / LAKE MERCED BL,-122.485736249645,37.7081535997805 +756148,2004-08-18 21:18:00,KIDNAPPING,MISSION,2600 Block of HARRISON ST,-122.412052145525,37.7550201425447 +756192,2004-08-18 19:49:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +756252,2004-08-18 17:40:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +756426,2004-08-18 11:43:00,KIDNAPPING,BAYVIEW,2300 Block of SAN BRUNO AV,-122.406417416535,37.733714974663 +756599,2004-08-17 21:53:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +756666,2004-08-17 18:47:00,DRUNKENNESS,PARK,MCALLISTER ST / BAKER ST,-122.44167909287,37.777372227792895 +756735,2004-08-17 15:35:00,DRUNKENNESS,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +756872,2004-08-17 08:45:00,ARSON,INGLESIDE,500 Block of JARBOE AV,-122.413053317909,37.7382413298094 +756904,2004-08-17 04:53:00,ARSON,TENDERLOIN,400 Block of OFARRELL ST,-122.411747371924,37.7859988323798 +757004,2004-08-16 21:00:00,RUNAWAY,INGLESIDE,500 Block of LONDON ST,-122.436923557756,37.72038640363729 +757334,2004-08-16 03:22:00,ARSON,RICHMOND,3000 Block of ANZA ST,-122.480859762603,37.778390051167705 +757375,2004-08-08 23:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +757415,2004-08-08 21:10:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +757553,2004-08-08 12:50:00,KIDNAPPING,INGLESIDE,800 Block of RUSSIA AV,-122.430406019767,37.7182881551417 +757630,2004-08-08 06:45:00,ARSON,NORTHERN,1300 Block of VAN NESS AV,-122.421734189862,37.788296128454704 +757764,2004-08-07 19:10:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.410041631816,37.78195365372571 +757891,2004-08-07 13:30:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +757908,2004-08-07 12:41:00,DRUNKENNESS,PARK,OAK ST / DIVISADERO ST,-122.437422446071,37.773132331609 +757957,2004-08-07 09:08:00,ARSON,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +758007,2004-08-07 03:29:00,KIDNAPPING,TARAVAL,2600 Block of 46TH AV,-122.504223156735,37.737101635092 +758027,2004-08-07 02:11:00,ARSON,BAYVIEW,26TH ST / WISCONSIN ST,-122.398341782099,37.7510539547185 +758042,2004-08-07 01:15:00,DRUNKENNESS,NORTHERN,800 Block of VAN NESS AV,-122.420996912865,37.783103266892 +758098,2004-08-06 23:00:00,ARSON,INGLESIDE,5200 Block of DIAMOND HEIGHTS BL,-122.439065944959,37.744277476687714 +758105,2004-08-06 22:26:00,DRUNKENNESS,MISSION,0 Block of CLARION AL,-122.420590818654,37.7630386018701 +758108,2004-08-06 22:25:00,ARSON,BAYVIEW,1700 Block of ARMSTRONG AV,-122.394962181533,37.7278372709764 +758141,2004-08-06 21:01:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +758566,2004-08-05 21:00:00,KIDNAPPING,SOUTHERN,8TH ST / MISSION ST,-122.413160850977,37.7774566611578 +758637,2004-08-05 18:00:00,DRUNKENNESS,PARK,HAIGHT ST / STANYAN ST,-122.453534560634,37.76916629781029 +758780,2004-08-05 11:35:00,DRUNKENNESS,PARK,1300 Block of HAIGHT ST,-122.444502333693,37.7702619702403 +758793,2004-08-05 10:40:00,DRUNKENNESS,TENDERLOIN,600 Block of ELLIS ST,-122.416893710739,37.7842860480389 +759043,2004-08-04 16:45:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453512911126,37.7686969786551 +759066,2004-08-04 15:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +759258,2004-08-04 04:10:00,DRUNKENNESS,PARK,600 Block of STANYAN ST,-122.453563238036,37.7696403896003 +759270,2004-08-04 03:40:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.450492384367,37.7696094511519 +759272,2004-08-04 03:40:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +759273,2004-08-04 03:40:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451314447797,37.7695046066162 +759298,2004-08-04 00:19:00,DRUNKENNESS,RICHMOND,7600 Block of GEARY BL,-122.501331031448,37.779520691750896 +759334,2004-08-03 22:52:00,DRUNKENNESS,INGLESIDE,3100 Block of MISSION ST,-122.418732763058,37.74749552685429 +759628,2004-08-03 10:51:00,ARSON,MISSION,3300 Block of 25TH ST,-122.416953590297,37.7506650082311 +759673,2004-08-03 08:25:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452728322759,37.7693241293319 +759690,2004-08-03 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +759691,2004-08-03 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +759712,2004-08-03 02:15:00,ARSON,MISSION,19TH ST / VALENCIA ST,-122.421426143003,37.760101797057 +759781,2004-08-02 22:16:00,ARSON,BAYVIEW,23RD ST / IOWA ST,-122.391904260902,37.7551569778325 +759947,2004-08-02 15:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +759956,2004-08-02 14:55:00,DRUNKENNESS,PARK,1800 Block of TURK ST,-122.439595829226,37.7796011825544 +760060,2004-08-02 09:50:00,RUNAWAY,NORTHERN,1700 Block of CALIFORNIA ST,-122.423178695677,37.7903172966364 +760182,2004-07-25 23:28:00,DRUNKENNESS,NORTHERN,FILLMORE ST / LOMBARD ST,-122.436049203558,37.7998412228599 +760316,2004-07-25 16:18:00,KIDNAPPING,PARK,700 Block of JOHN F KENNEDY DR,-122.47073371953002,37.7711649447621 +760330,2004-07-25 15:00:00,KIDNAPPING,NORTHERN,1100 Block of BUCHANAN ST,-122.4286923384,37.780466784489896 +760552,2004-07-24 23:05:00,DRUNKENNESS,CENTRAL,900 Block of CALIFORNIA ST,-122.409999361883,37.79188233556 +760573,2004-07-24 22:30:00,ARSON,CENTRAL,300 Block of FRANCISCO ST,-122.410303619531,37.805021091463 +760636,2004-07-24 19:25:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +760776,2004-07-24 13:20:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +760811,2004-07-24 11:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +760827,2004-07-24 10:37:00,ARSON,SOUTHERN,1400 Block of FOLSOM ST,-122.413170698459,37.7726163177752 +760829,2004-07-24 10:35:00,ARSON,MISSION,0 Block of SYCAMORE ST,-122.419858465007,37.7627429027065 +760870,2004-07-24 05:00:00,ARSON,BAYVIEW,QUINT ST / NEWCOMB AV,-122.395382931372,37.738405335176296 +760871,2004-07-24 05:00:00,RUNAWAY,BAYVIEW,2600 Block of SAN BRUNO AV,-122.403775864685,37.7282405026531 +760898,2004-07-24 02:24:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 8TH ST,-122.410065781611,37.774990679236296 +760983,2004-07-23 22:38:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +761070,2004-07-23 18:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +761228,2004-07-23 12:18:00,ARSON,BAYVIEW,700 Block of JERROLD AV,-122.373456171525,37.7296796672727 +761374,2004-07-23 00:38:00,ARSON,BAYVIEW,SILLIMAN ST / GIRARD ST,-122.406088073571,37.7309752639978 +761377,2004-07-23 00:30:00,ARSON,BAYVIEW,1500 Block of CUSTER AV,-122.390102549533,37.74588490267711 +761515,2004-07-22 18:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +761800,2004-07-21 23:59:00,DRUNKENNESS,SOUTHERN,1500 Block of MARKET ST,-122.419842305148,37.7748226184309 +761821,2004-07-21 22:51:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.436749760121,37.7219915768943 +761990,2004-07-21 14:30:00,DRUNKENNESS,BAYVIEW,1400 Block of THOMAS AV,-122.388542831272,37.72878928885479 +761995,2004-07-21 14:21:00,DRUNKENNESS,BAYVIEW,3RD ST / PALOU AV,-122.390971734594,37.73401521810371 +762026,2004-07-21 12:55:00,KIDNAPPING,CENTRAL,800 Block of WASHINGTON ST,-122.407793068572,37.7950325698412 +762147,2004-07-21 05:34:00,KIDNAPPING,BAYVIEW,0 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +762234,2004-07-20 21:33:00,ARSON,BAYVIEW,FITCH ST / INNES AV,-122.373894389578,37.7309368356332 +762323,2004-07-20 16:41:00,DRUNKENNESS,BAYVIEW,4600 Block of 3RD ST,-122.390412132668,37.7360102192532 +762344,2004-07-20 16:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461301563433,37.7191418613626 +762416,2004-07-20 12:30:00,ARSON,INGLESIDE,3700 Block of MISSION ST,-122.424421767504,37.736401002257 +762564,2004-07-19 23:45:00,DRUNKENNESS,SOUTHERN,HARRIET ST / BRYANT ST,-122.403080552922,37.7756035882459 +762878,2004-07-19 09:30:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +762895,2004-07-19 08:30:00,ARSON,TARAVAL,800 Block of GONZALEZ DR,-122.480606348865,37.7175185873081 +762933,2004-07-19 04:27:00,ARSON,CENTRAL,700 Block of TAYLOR ST,-122.412050910036,37.7892738896382 +762990,2004-07-11 23:30:00,ARSON,BAYVIEW,24TH ST / TENNESSEE ST,-122.388880102795,37.7540545313131 +763054,2004-07-11 20:30:00,RUNAWAY,BAYVIEW,800 Block of LE CONTE AV,-122.395775347748,37.717345915805 +763057,2004-07-11 20:03:00,DRUNKENNESS,NORTHERN,GOLDEN GATE AV / GOUGH ST,-122.423732220515,37.7806111466329 +763307,2004-07-11 00:56:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +763679,2004-07-10 04:14:00,ARSON,PARK,CLAYTON ST / PAGE ST,-122.448769079939,37.77073127123511 +763697,2004-07-10 02:40:00,DRUNKENNESS,SOUTHERN,300 Block of 11TH ST,-122.413287527194,37.7711962032376 +763741,2004-07-09 23:45:00,DRUNKENNESS,MISSION,1100 Block of VALENCIA ST,-122.420817675346,37.75448782255511 +763812,2004-07-09 20:55:00,DRUNKENNESS,BAYVIEW,2800 Block of SAN BRUNO AV,-122.402912161235,37.725805451377504 +763971,2004-07-09 13:30:00,RUNAWAY,TARAVAL,2100 Block of 44TH AV,-122.502735776539,37.7465151964615 +764101,2004-07-09 02:45:00,DRUNKENNESS,NORTHERN,1100 Block of VAN NESS AV,-122.421648984394,37.7861425696729 +764126,2004-07-09 00:24:00,DRUNKENNESS,NORTHERN,BUCHANAN ST / EDDY ST,-122.429042228263,37.7818456494851 +764239,2004-07-08 19:54:00,ARSON,PARK,1200 Block of HAIGHT ST,-122.442678874433,37.770606135285504 +764483,2004-07-08 10:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +764494,2004-07-08 10:00:00,DRUNKENNESS,NORTHERN,100 Block of FELL ST,-122.420332099593,37.7762075768262 +764523,2004-07-08 08:38:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953864,37.780534538504895 +764603,2004-07-07 23:42:00,DRUNKENNESS,SOUTHERN,MISSION ST / 4TH ST,-122.404270179493,37.7844788538516 +764667,2004-07-07 20:42:00,DRUNKENNESS,CENTRAL,600 Block of HYDE ST,-122.416614060876,37.786777956045 +764843,2004-07-07 13:00:00,ARSON,MISSION,2400 Block of MARIPOSA ST,-122.4078191481,37.76320890498009 +764966,2004-07-07 08:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +764999,2004-07-07 05:20:00,ARSON,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +765000,2004-07-07 05:20:00,ARSON,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +765009,2004-07-07 04:11:00,DRUNKENNESS,SOUTHERN,7TH ST / MARKET ST,-122.412515341363,37.7804777480279 +765154,2004-07-06 18:20:00,KIDNAPPING,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +765207,2004-07-06 16:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +765227,2004-07-06 15:45:00,DRUNKENNESS,TARAVAL,1500 Block of 8TH AV,-122.464845949564,37.7594100230218 +765438,2004-07-06 03:01:00,ARSON,BAYVIEW,1100 Block of QUINT ST,-122.394020051522,37.739987260052 +765639,2004-07-05 16:00:00,KIDNAPPING,NORTHERN,700 Block of FULTON ST,-122.428249599273,37.7780677663985 +765800,2004-07-05 03:21:00,ARSON,INGLESIDE,28TH ST / DIAMOND ST,-122.435679467444,37.7447604211148 +765872,2004-06-27 22:45:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +765944,2004-06-27 19:00:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / GOLDEN GATE AV,-122.417146843843,37.7814463501111 +765966,2004-06-27 17:21:00,DRUNKENNESS,NORTHERN,REDWOOD ST / POLK ST,-122.418711104998,37.7807726314686 +766198,2004-06-27 04:30:00,KIDNAPPING,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929238,37.7980180687515 +766228,2004-06-27 02:14:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +766242,2004-06-27 01:30:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +766322,2004-06-26 22:15:00,DRUNKENNESS,SOUTHERN,300 Block of 6TH ST,-122.405373810406,37.7782346346871 +766351,2004-06-26 21:00:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +766376,2004-06-26 19:35:00,DRUNKENNESS,TENDERLOIN,OFARRELL ST / JONES ST,-122.412970537598,37.7857883766658 +766395,2004-06-26 19:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +766532,2004-06-26 10:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +766574,2004-06-26 03:22:00,KIDNAPPING,PARK,MARKET ST / CASTRO ST,-122.435187699322,37.7626702770923 +766816,2004-06-25 17:30:00,RUNAWAY,PARK,1500 Block of PAGE ST,-122.446355447692,37.77109049873409 +767115,2004-06-24 22:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +767161,2004-06-24 20:00:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617234,37.778124778298505 +767253,2004-06-24 16:09:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +767306,2004-06-24 13:35:00,DRUNKENNESS,SOUTHERN,4TH ST / MISSION ST,-122.404270179493,37.7844788538516 +767351,2004-06-24 11:22:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +767421,2004-06-24 08:24:00,DRUNKENNESS,CENTRAL,GEARY ST / KEARNY ST,-122.403434086753,37.7876430501571 +767462,2004-06-24 02:55:00,DRUNKENNESS,RICHMOND,ARGUELLO BL / CABRILLO ST,-122.458462735312,37.7756167463737 +767481,2004-06-24 01:45:00,DRUNKENNESS,CENTRAL,SUTTER ST / HYDE ST,-122.416829148507,37.7881786970521 +767487,2004-06-24 01:17:00,DRUNKENNESS,TARAVAL,32ND AV / TARAVAL ST,-122.489620429384,37.7424363113895 +767544,2004-06-23 21:30:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +767546,2004-06-23 21:26:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +767563,2004-06-23 20:27:00,DRUNKENNESS,SOUTHERN,700 Block of BRANNAN ST,-122.403014839521,37.7732790114242 +767591,2004-06-23 19:25:00,DRUNKENNESS,MISSION,15TH ST / CHURCH ST,-122.428820922744,37.7661286357859 +767608,2004-06-23 18:45:00,ARSON,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +767651,2004-06-23 17:15:00,RUNAWAY,MISSION,800 Block of POTRERO AV,-122.406725329529,37.7585641691709 +767711,2004-06-23 15:00:00,ARSON,INGLESIDE,800 Block of MOSCOW ST,-122.432613921007,37.7147601703319 +767759,2004-06-23 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +767806,2004-06-23 10:44:00,ARSON,CENTRAL,800 Block of PACIFIC AV,-122.409061067118,37.79667866375471 +767913,2004-06-22 23:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +768113,2004-06-22 14:00:00,KIDNAPPING,RICHMOND,2600 Block of SUTTER ST,-122.444011812819,37.7846656063475 +768114,2004-06-22 14:00:00,KIDNAPPING,RICHMOND,2600 Block of SUTTER ST,-122.444011812819,37.7846656063475 +768117,2004-06-22 14:00:00,DRUNKENNESS,CENTRAL,200 Block of FRONT ST,-122.398993666371,37.79405527725429 +768158,2004-06-22 11:45:00,DRUNKENNESS,NORTHERN,BROADWAY ST / VAN NESS AV,-122.423414494359,37.79573807975 +768202,2004-06-22 08:30:00,RUNAWAY,BAYVIEW,200 Block of ELMIRA ST,-122.403612256741,37.7340216173286 +768302,2004-06-21 22:12:00,ARSON,BAYVIEW,GILMAN AV / GRIFFITH ST,-122.388139317288,37.7182356373929 +768311,2004-06-21 21:40:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +768603,2004-06-21 07:00:00,RUNAWAY,NORTHERN,1100 Block of LAGUNA ST,-122.427318976353,37.7813408435344 +768696,2004-06-13 22:00:00,ARSON,CENTRAL,900 Block of LOMBARD ST,-122.417172035783,37.8023582922302 +768714,2004-06-13 21:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +768726,2004-06-13 20:15:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +768727,2004-06-13 20:15:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +768776,2004-06-13 17:40:00,DRUNKENNESS,SOUTHERN,MARKET ST / 5TH ST,-122.408068345155,37.783991676793214 +768784,2004-06-13 17:10:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +768851,2004-06-13 13:35:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +768928,2004-06-13 08:15:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +768930,2004-06-13 07:47:00,DRUNKENNESS,MISSION,26TH ST / FOLSOM ST,-122.41377130481,37.7493045778704 +768988,2004-06-13 00:20:00,DRUNKENNESS,CENTRAL,1300 Block of GRANT AV,-122.407370965267,37.79924012538321 +769043,2004-06-12 22:32:00,KIDNAPPING,BAYVIEW,1200 Block of QUESADA AV,-122.383117847505,37.7285470574169 +769101,2004-06-12 20:12:00,DRUNKENNESS,PARK,MASONIC AV / GROVE ST,-122.446285630977,37.7748707257792 +769262,2004-06-12 13:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +769362,2004-06-12 02:47:00,ARSON,NORTHERN,2100 Block of NORTH POINT ST,-122.442610609708,37.8029319316628 +769368,2004-06-12 02:10:00,ARSON,NORTHERN,1600 Block of NORTH POINT ST,-122.434351689759,37.8038720106925 +769575,2004-06-11 16:31:00,ARSON,PARK,VEGA ST / ANZA VISTA AV,-122.445440370175,37.7801230742424 +769631,2004-06-11 13:45:00,RUNAWAY,MISSION,2500 Block of BRYANT ST,-122.409274108851,37.7535802615602 +769759,2004-06-11 01:40:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +769870,2004-06-10 20:30:00,KIDNAPPING,BAYVIEW,0 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +769906,2004-06-10 19:10:00,DRUNKENNESS,SOUTHERN,600 Block of HOWARD ST,-122.39998852115,37.78548734122921 +769925,2004-06-10 18:10:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +769956,2004-06-10 17:42:00,DRUNKENNESS,MISSION,3200 Block of 24TH ST,-122.417119715741,37.7523748672624 +769986,2004-06-10 16:15:00,ARSON,TENDERLOIN,700 Block of OFARRELL ST,-122.417085357424,37.7852153590471 +770075,2004-06-10 12:20:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +770093,2004-06-10 11:30:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +770104,2004-06-10 10:45:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +770190,2004-06-10 02:00:00,KIDNAPPING,RICHMOND,4700 Block of GEARY BL,-122.470190415901,37.7808757916602 +770209,2004-06-10 00:48:00,DRUNKENNESS,MISSION,19TH ST / CHURCH ST,-122.428203997163,37.759691691835606 +770673,2004-06-08 22:26:00,DRUNKENNESS,MISSION,3000 Block of 16TH ST,-122.421082850193,37.764910844226 +770704,2004-06-08 21:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +770912,2004-06-08 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +770913,2004-06-08 14:00:00,RUNAWAY,TARAVAL,200 Block of CLAREMONT BL,-122.464775525939,37.741189710623495 +771103,2004-06-08 02:40:00,ARSON,RICHMOND,500 Block of JOHN F KENNEDY DR,-122.466204667893,37.7725405391593 +771305,2004-06-07 13:38:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +771364,2004-06-07 09:30:00,ARSON,NORTHERN,700 Block of EDDY ST,-122.420025955939,37.7830500140737 +771407,2004-06-07 05:05:00,ARSON,TENDERLOIN,500 Block of OFARRELL ST,-122.413820070176,37.7857382950322 +771408,2004-06-07 05:03:00,ARSON,TENDERLOIN,500 Block of OFARRELL ST,-122.413798415869,37.7856297942374 +771435,2004-06-07 00:45:00,DRUNKENNESS,INGLESIDE,FOLSOM ST / OGDEN AV,-122.413585057697,37.735894354559605 +771486,2004-05-30 23:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +771490,2004-05-30 23:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +771491,2004-05-30 23:00:00,ARSON,SOUTHERN,0 Block of HARRIET ST,-122.406969944087,37.7786617943902 +771495,2004-05-30 22:45:00,ARSON,SOUTHERN,200 Block of BRANNAN ST,-122.390645819037,37.7830549839906 +771525,2004-05-30 21:30:00,KIDNAPPING,RICHMOND,ANZA ST / PARK PRESIDIO BL,-122.472173695022,37.7787257065687 +771527,2004-05-30 21:30:00,KIDNAPPING,RICHMOND,ANZA ST / PARK PRESIDIO BL,-122.472173695022,37.7787257065687 +771567,2004-05-30 19:48:00,ARSON,TARAVAL,2200 Block of LOWER GREAT HY,-122.507245187757,37.7444515250052 +771610,2004-05-30 17:45:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.445346786573,37.7702081959223 +771678,2004-05-30 15:28:00,DRUNKENNESS,MISSION,HARRISON ST / 20TH ST,-122.412502863683,37.7590272974542 +771736,2004-05-30 12:10:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453512911126,37.7686969786551 +771773,2004-05-30 10:00:00,RUNAWAY,TARAVAL,4200 Block of JUDAH ST,-122.507539783548,37.7602981479122 +771879,2004-05-30 00:43:00,DRUNKENNESS,SOUTHERN,600 Block of BRYANT ST,-122.399151509541,37.77862707848 +772114,2004-05-29 13:01:00,DRUNKENNESS,PARK,HAYES ST / CENTRAL AV,-122.444404886671,37.7741491027295 +772151,2004-05-29 12:00:00,DRUNKENNESS,SOUTHERN,5TH ST / MARKET ST,-122.408068345155,37.783991676793214 +772225,2004-05-29 03:40:00,DRUNKENNESS,BAYVIEW,0 Block of NICHOLS WY,-122.38724435334,37.7195130001474 +772296,2004-05-28 23:07:00,DRUNKENNESS,RICHMOND,5900 Block of GEARY BL,-122.483145549312,37.7802894327275 +772311,2004-05-28 22:30:00,KIDNAPPING,BAYVIEW,0 Block of MABREY CT,-122.385538161819,37.7358147864872 +772352,2004-05-28 21:17:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +772432,2004-05-28 18:00:00,KIDNAPPING,BAYVIEW,1100 Block of INGERSON AV,-122.395535873138,37.7206308058104 +772607,2004-05-28 11:47:00,DRUNKENNESS,MISSION,15TH ST / FOLSOM ST,-122.415464372882,37.766937029292 +772804,2004-05-27 21:00:00,RUNAWAY,TENDERLOIN,200 Block of LEAVENWORTH ST,-122.414217804322,37.7832593295025 +772937,2004-05-27 16:15:00,DRUNKENNESS,PARK,KEZAR DR / MARTIN LUTHER KING JR DR,-122.458638758581,37.76719994035071 +773050,2004-05-27 10:45:00,RUNAWAY,NORTHERN,3600 Block of DIVISADERO ST,-122.44344148119,37.8032572017953 +773136,2004-05-27 02:25:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +773169,2004-05-26 23:54:00,DRUNKENNESS,NORTHERN,LOMBARD ST / VAN NESS AV,-122.424541870491,37.8013041477751 +773238,2004-05-26 20:47:00,DRUNKENNESS,MISSION,MISSION ST / 24TH ST,-122.418448186109,37.752239165267 +773286,2004-05-26 19:00:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +773307,2004-05-26 18:10:00,KIDNAPPING,TARAVAL,NORIEGA ST / SUNSET BL,-122.495225044353,37.7534118533857 +773319,2004-05-26 18:00:00,DRUNKENNESS,TARAVAL,1500 Block of OCEAN AV,-122.458737959025,37.724347674915 +773390,2004-05-26 15:50:00,DRUNKENNESS,MISSION,2500 Block of MARIPOSA ST,-122.408795234885,37.7630594323893 +773529,2004-05-26 10:26:00,ARSON,BAYVIEW,1300 Block of OAKDALE AV,-122.386286102009,37.7323455899635 +773606,2004-05-26 04:10:00,ARSON,BAYVIEW,1100 Block of SHAFTER AV,-122.382370964778,37.7262328368628 +773668,2004-05-25 22:50:00,RUNAWAY,NORTHERN,700 Block of LAGUNA ST,-122.426431627648,37.7776339847429 +773791,2004-05-25 18:00:00,KIDNAPPING,INGLESIDE,MISSION ST / PERSIA AV,-122.435977217004,37.72312883070529 +774086,2004-05-25 00:45:00,KIDNAPPING,TENDERLOIN,700 Block of OFARRELL ST,-122.417107256373,37.7853238292094 +774154,2004-05-24 21:00:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +774204,2004-05-24 18:37:00,KIDNAPPING,MISSION,2900 Block of MISSION ST,-122.418279075012,37.7498209864471 +774236,2004-05-24 17:30:00,RUNAWAY,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +774422,2004-05-24 09:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +774561,2004-05-16 21:00:00,RUNAWAY,MISSION,700 Block of TREAT AV,-122.413590819153,37.75814314083271 +774714,2004-05-16 14:00:00,DRUNKENNESS,NORTHERN,GEARY ST / POLK ST,-122.419739837813,37.78589260994861 +774718,2004-05-16 14:00:00,RUNAWAY,BAYVIEW,2500 Block of SAN BRUNO AV,-122.404407189561,37.72940755917529 +774863,2004-05-16 01:45:00,DRUNKENNESS,RICHMOND,2400 Block of SUTTER ST,-122.440731807636,37.7851939209085 +774891,2004-05-16 00:08:00,DRUNKENNESS,TENDERLOIN,JONES ST / OFARRELL ST,-122.412970537598,37.7857883766658 +774907,2004-05-15 23:20:00,ARSON,INGLESIDE,5600 Block of MISSION ST,-122.447095289615,37.7111225502685 +774968,2004-05-15 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +774998,2004-05-15 19:29:00,DRUNKENNESS,MISSION,1200 Block of YORK ST,-122.40818042923,37.7520351527768 +775020,2004-05-15 18:51:00,DRUNKENNESS,MISSION,23RD ST / SAN BRUNO AV,-122.404485140765,37.754396722297 +775036,2004-05-15 18:00:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +775046,2004-05-15 17:20:00,ARSON,BAYVIEW,2100 Block of MC KINNON AV,-122.399478103813,37.7417242812104 +775136,2004-05-15 13:10:00,DRUNKENNESS,SOUTHERN,0 Block of UNITED NATIONS PZ,-122.414317857881,37.7799444052046 +775218,2004-05-15 09:23:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +775268,2004-05-15 04:01:00,ARSON,INGLESIDE,800 Block of MOSCOW ST,-122.432495325654,37.7147036723166 +775270,2004-05-15 04:00:00,KIDNAPPING,CENTRAL,HYDE ST / BUSH ST,-122.417019320698,37.7891095538507 +775284,2004-05-15 02:10:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +775292,2004-05-15 01:21:00,DRUNKENNESS,NORTHERN,OFARRELL ST / LARKIN ST,-122.417903977571,37.7851670875288 +775323,2004-05-14 23:30:00,KIDNAPPING,CENTRAL,800 Block of GEARY ST,-122.417295322526,37.7862578545865 +775468,2004-05-14 17:10:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +775508,2004-05-14 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +775531,2004-05-14 15:00:00,KIDNAPPING,CENTRAL,400 Block of GREENWICH ST,-122.407691745169,37.802482274671 +775587,2004-05-14 12:00:00,RUNAWAY,PARK,1000 Block of HAYES ST,-122.433661492778,37.7754652277638 +775602,2004-05-14 11:35:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +775710,2004-05-14 03:43:00,ARSON,BAYVIEW,THOMAS AV / INGALLS ST,-122.385684144766,37.7272326718873 +775796,2004-05-13 21:20:00,ARSON,NORTHERN,1000 Block of BUCHANAN ST,-122.42850467539,37.7795337535575 +775834,2004-05-13 19:55:00,DRUNKENNESS,PARK,1500 Block of WALLER ST,-122.449976973581,37.7686065803788 +775843,2004-05-13 19:25:00,DRUNKENNESS,SOUTHERN,800 Block of FOLSOM ST,-122.402343659494,37.7811666837563 +776041,2004-05-13 11:30:00,KIDNAPPING,TENDERLOIN,500 Block of EDDY ST,-122.416732163096,37.783465567448 +776044,2004-05-13 11:00:00,ARSON,INGLESIDE,600 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +776054,2004-05-13 10:58:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +776119,2004-05-13 07:45:00,KIDNAPPING,INGLESIDE,800 Block of ELLSWORTH ST,-122.416446124049,37.7329162539537 +776185,2004-05-12 22:45:00,ARSON,RICHMOND,2300 Block of GOLDEN GATE AV,-122.449116002905,37.777321600666106 +777031,2004-05-11 06:57:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +777039,2004-05-11 03:00:00,RUNAWAY,TENDERLOIN,OFARRELL ST / HYDE ST,-122.416261836841,37.7853750846147 +777167,2004-05-10 19:15:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +777229,2004-05-10 16:45:00,DRUNKENNESS,TENDERLOIN,100 Block of TAYLOR ST,-122.410791677645,37.7836952269749 +777234,2004-05-10 16:25:00,ARSON,BAYVIEW,CONNECTICUT ST / 25TH ST,-122.396516098261,37.7523112196892 +777253,2004-05-10 15:40:00,KIDNAPPING,BAYVIEW,3RD ST / YOSEMITE AV,-122.393232869349,37.7277351549651 +777274,2004-05-10 14:37:00,DRUNKENNESS,CENTRAL,600 Block of KEARNY ST,-122.404730251759,37.7937840812301 +777313,2004-05-10 13:00:00,DRUNKENNESS,NORTHERN,800 Block of HAYES ST,-122.430381120594,37.7758830719591 +777321,2004-05-10 13:00:00,DRUNKENNESS,CENTRAL,700 Block of KEARNY ST,-122.404904447841,37.7946478828923 +777375,2004-05-10 10:01:00,KIDNAPPING,MISSION,HARRISON ST / 20TH ST,-122.412502863683,37.7590272974542 +777377,2004-05-10 10:01:00,KIDNAPPING,MISSION,HARRISON ST / 20TH ST,-122.412502863683,37.7590272974542 +777411,2004-05-10 08:24:00,KIDNAPPING,CENTRAL,200 Block of BATTERY ST,-122.400171834642,37.7939050731848 +777486,2004-05-02 22:10:00,ARSON,BAYVIEW,NAVY RD / GRIFFITH ST,-122.378544214093,37.7289426951277 +777556,2004-05-02 19:01:00,DRUNKENNESS,PARK,14TH ST / NOE ST,-122.433409294235,37.76745989062879 +777570,2004-05-02 18:45:00,KIDNAPPING,SOUTHERN,900 Block of MISSION ST,-122.407932868203,37.7815063666429 +777619,2004-05-02 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +777625,2004-05-02 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +777787,2004-05-02 02:45:00,KIDNAPPING,RICHMOND,ANZA ST / SPRUCE ST,-122.452898067361,37.78036236905921 +777887,2004-05-01 22:12:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / GREEN ST,-122.40901700762,37.7994880717404 +778098,2004-05-01 12:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +778366,2004-04-30 21:30:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +778567,2004-04-30 13:00:00,ARSON,BAYVIEW,1200 Block of EGBERT AV,-122.389889010114,37.7210463190078 +778652,2004-04-30 09:15:00,KIDNAPPING,NORTHERN,100 Block of FRANKLIN ST,-122.421169141493,37.7759181636114 +778816,2004-04-29 21:26:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +778817,2004-04-29 21:26:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +778890,2004-04-29 18:57:00,DRUNKENNESS,INGLESIDE,400 Block of EXCELSIOR AV,-122.430080511869,37.7244834707405 +778955,2004-04-29 16:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +779124,2004-04-29 08:43:00,ARSON,TENDERLOIN,500 Block of OFARRELL ST,-122.413820070176,37.7857382950322 +779379,2004-04-28 15:40:00,KIDNAPPING,NORTHERN,WEBSTER ST / HAIGHT ST,-122.428805083832,37.7723149684765 +779426,2004-04-28 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +779491,2004-04-28 11:24:00,DRUNKENNESS,CENTRAL,NORTH POINT ST / THE EMBARCADERO NORTH ST,-122.407278660799,37.8074190148498 +779517,2004-04-28 10:15:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +779571,2004-04-28 07:00:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / VALLEJO ST,-122.407871572792,37.79869627427671 +779597,2004-04-28 02:50:00,DRUNKENNESS,NORTHERN,100 Block of CULEBRA TR,-122.422408872624,37.80281764269871 +779709,2004-04-27 20:30:00,KIDNAPPING,MISSION,400 Block of VALENCIA ST,-122.421935077177,37.7661343875141 +779739,2004-04-27 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +780061,2004-04-27 02:00:00,KIDNAPPING,SOUTHERN,100 Block of MINNA ST,-122.399566190584,37.787256096877705 +780101,2004-04-26 22:56:00,ARSON,BAYVIEW,700 Block of INGERSON AV,-122.388592555318,37.71663317826 +780110,2004-04-26 22:37:00,DRUNKENNESS,TENDERLOIN,400 Block of TURK ST,-122.416342977622,37.7824465135592 +780177,2004-04-26 19:00:00,RUNAWAY,TARAVAL,1300 Block of 42ND AV,-122.501634743854,37.761529529045895 +780197,2004-04-26 18:10:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +780255,2004-04-26 15:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +780296,2004-04-26 14:00:00,RUNAWAY,INGLESIDE,200 Block of ARBOR ST,-122.437952639272,37.7374491367852 +780370,2004-04-26 10:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +780406,2004-04-26 08:30:00,RUNAWAY,TARAVAL,100 Block of ARCH ST,-122.467152849824,37.7133647785888 +780529,2004-04-18 22:41:00,DRUNKENNESS,NORTHERN,POLK ST / POST ST,-122.419930111618,37.7868262081927 +780650,2004-04-18 16:12:00,DRUNKENNESS,NORTHERN,2300 Block of VAN NESS AV,-122.423530547475,37.79718540933521 +780703,2004-04-18 13:44:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +780814,2004-04-18 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +780859,2004-04-18 03:04:00,DRUNKENNESS,BAYVIEW,SAN BRUNO AV / SILLIMAN ST,-122.405088367441,37.7312386571061 +780908,2004-04-17 23:25:00,DRUNKENNESS,NORTHERN,3200 Block of SCOTT ST,-122.441147713309,37.7997018632448 +780919,2004-04-17 23:00:00,KIDNAPPING,PARK,STANYAN ST / HAYES ST,-122.454286690239,37.7728951613456 +781030,2004-04-17 18:20:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +781067,2004-04-17 17:00:00,RUNAWAY,INGLESIDE,100 Block of HARKNESS AV,-122.401141689686,37.71769486744321 +781169,2004-04-17 13:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +781392,2004-04-17 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +781408,2004-04-16 23:00:00,KIDNAPPING,NORTHERN,0 Block of TOLEDO WY,-122.438483262382,37.8011850167559 +781419,2004-04-16 22:50:00,DRUNKENNESS,BAYVIEW,FITZGERALD AV / JENNINGS ST,-122.393174162432,37.722036232115 +781500,2004-04-16 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +781587,2004-04-16 17:15:00,DRUNKENNESS,NORTHERN,1000 Block of TURK ST,-122.425564924002,37.7812701611726 +781686,2004-04-16 13:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +781712,2004-04-16 12:00:00,DRUNKENNESS,TARAVAL,LAKEVIEW AV / LEE AV,-122.454082474051,37.7181737933675 +781926,2004-04-15 19:51:00,DRUNKENNESS,MISSION,600 Block of DOLORES ST,-122.425726898435,37.7594385840269 +782023,2004-04-15 15:45:00,ARSON,RICHMOND,600 Block of 44TH AV,-122.504952144418,37.7762844361761 +782100,2004-04-15 12:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.453019909752,37.719487442029 +782117,2004-04-15 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +782185,2004-04-15 08:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +782217,2004-04-15 05:22:00,ARSON,INGLESIDE,100 Block of TUCKER AV,-122.406955614145,37.716276682291706 +782220,2004-04-15 04:04:00,ARSON,INGLESIDE,1300 Block of MANSELL ST,-122.416192700509,37.718510177529 +782222,2004-04-15 03:56:00,DRUNKENNESS,BAYVIEW,0 Block of REUEL CT,-122.382919646324,37.7364122533313 +782227,2004-04-15 03:15:00,DRUNKENNESS,NORTHERN,1000 Block of POST ST,-122.419104424644,37.78687648416079 +782248,2004-04-15 00:54:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +782305,2004-04-14 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +782307,2004-04-14 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +782313,2004-04-14 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +782328,2004-04-14 21:15:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +782434,2004-04-14 17:25:00,DRUNKENNESS,NORTHERN,DUBOCE AV / CHURCH ST,-122.429128783485,37.7694556178638 +782472,2004-04-14 15:19:00,DRUNKENNESS,MISSION,1700 Block of MISSION ST,-122.419876917134,37.7695797471896 +782539,2004-04-14 12:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +782771,2004-04-13 20:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +782775,2004-04-13 20:14:00,DRUNKENNESS,NORTHERN,POLK ST / GROVE ST,-122.418229899728,37.7784895366584 +782973,2004-04-13 09:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +783065,2004-04-12 23:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +783150,2004-04-12 19:40:00,KIDNAPPING,BAYVIEW,1700 Block of MC KINNON AV,-122.39200436201,37.737488946083495 +783408,2004-04-12 05:00:00,ARSON,RICHMOND,500 Block of JOHN F KENNEDY DR,-122.466204667893,37.7725405391593 +783430,2004-04-12 02:19:00,ARSON,MISSION,200 Block of SAN CARLOS ST,-122.419837816387,37.7593751579447 +783477,2004-04-04 23:19:00,DRUNKENNESS,NORTHERN,0 Block of FELL ST,-122.418500584434,37.7764380944444 +783512,2004-04-04 22:10:00,DRUNKENNESS,CENTRAL,2600 Block of MASON ST,-122.414003178329,37.8079694729269 +783604,2004-04-04 18:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +783747,2004-04-04 11:20:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453512911126,37.7686969786551 +783769,2004-04-04 10:05:00,DRUNKENNESS,INGLESIDE,0 Block of LELAND AV,-122.405248218324,37.7117227123477 +783824,2004-04-04 01:45:00,DRUNKENNESS,CENTRAL,GRANT AV / GREEN ST,-122.407398959607,37.7997037899962 +784055,2004-04-03 13:07:00,DRUNKENNESS,BAYVIEW,3RD ST / INNES AV,-122.389033327488,37.7395346503421 +784082,2004-04-03 11:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +784095,2004-04-03 11:00:00,RUNAWAY,BAYVIEW,2400 Block of GRIFFITH ST,-122.386437671186,37.7191834462785 +784150,2004-04-03 08:30:00,RUNAWAY,RICHMOND,800 Block of EUCLID AV,-122.458490740585,37.7837951529214 +784157,2004-04-03 08:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +784458,2004-04-02 16:40:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +784490,2004-04-02 15:15:00,DRUNKENNESS,NORTHERN,0 Block of GROVE ST,-122.417448582701,37.7786438096934 +784570,2004-04-02 12:35:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +784676,2004-04-02 08:43:00,KIDNAPPING,BAYVIEW,0 Block of CERES ST,-122.394387701957,37.730236598025705 +784791,2004-04-01 22:00:00,ARSON,BAYVIEW,100 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +784802,2004-04-01 21:30:00,KIDNAPPING,TENDERLOIN,200 Block of HYDE ST,-122.415858343095,37.7830505366842 +784822,2004-04-01 20:50:00,DRUNKENNESS,MISSION,4200 Block of CESAR CHAVEZ ST,-122.434071053962,37.7472198232175 +784902,2004-04-01 18:25:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +784924,2004-04-01 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +784948,2004-04-01 16:45:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +785016,2004-04-01 14:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +785017,2004-04-01 14:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +785610,2004-03-31 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +785690,2004-03-31 08:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +785706,2004-03-31 06:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +785741,2004-03-31 00:01:00,ARSON,RICHMOND,2400 Block of SUTTER ST,-122.440731807636,37.7851939209085 +785750,2004-03-30 23:40:00,DRUNKENNESS,BAYVIEW,1300 Block of 18TH ST,-122.396058574479,37.7626629990289 +785796,2004-03-30 21:12:00,DRUNKENNESS,INGLESIDE,3500 Block of SAN BRUNO AV,-122.400154882326,37.7177116722068 +785874,2004-03-30 17:55:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +785919,2004-03-30 15:54:00,ARSON,NORTHERN,800 Block of VAN NESS AV,-122.420996912865,37.783103266892 +785956,2004-03-30 14:25:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +785959,2004-03-30 14:20:00,DRUNKENNESS,MISSION,0 Block of ERIE ST,-122.416698951088,37.769312224056 +786123,2004-03-30 06:00:00,KIDNAPPING,INGLESIDE,100 Block of HIGHLAND AV,-122.422067184937,37.737362360521296 +786186,2004-03-29 22:51:00,DRUNKENNESS,SOUTHERN,200 Block of CLARA ST,-122.403464080033,37.7785233776032 +786193,2004-03-29 22:19:00,KIDNAPPING,TARAVAL,300 Block of VERNON ST,-122.468113571595,37.7187993381393 +786237,2004-03-29 19:33:00,DRUNKENNESS,BAYVIEW,1300 Block of FITZGERALD AV,-122.39408312508002,37.7226193270136 +786325,2004-03-29 16:50:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406520987144,37.7850629421661 +786438,2004-03-29 11:00:00,KIDNAPPING,TARAVAL,1700 Block of 46TH AV,-122.505537956642,37.7538767370501 +786580,2004-03-21 22:35:00,DRUNKENNESS,TENDERLOIN,700 Block of OFARRELL ST,-122.417107256373,37.7853238292094 +786625,2004-03-21 21:03:00,DRUNKENNESS,MISSION,2100 Block of MISSION ST,-122.419470488515,37.7622701739914 +786755,2004-03-21 14:17:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +786900,2004-03-21 02:23:00,DRUNKENNESS,SOUTHERN,3RD ST / PERRY ST,-122.396844646406,37.7821181034234 +786918,2004-03-21 01:00:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +786970,2004-03-20 22:31:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +786978,2004-03-20 22:15:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.41076876635,37.7832145189783 +787004,2004-03-20 21:30:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.409708423721,37.78282764988379 +787078,2004-03-20 17:55:00,DRUNKENNESS,MISSION,2500 Block of 24TH ST,-122.404851256515,37.7530372984263 +787132,2004-03-20 16:00:00,RUNAWAY,PARK,300 Block of WOODSIDE AV,-122.452716700987,37.7457451434135 +787275,2004-03-20 03:30:00,KIDNAPPING,BAYVIEW,100 Block of DOLPHIN CT,-122.371476348765,37.727898936891705 +787306,2004-03-20 01:13:00,DRUNKENNESS,RICHMOND,4100 Block of GEARY BL,-122.463764261964,37.7811749336778 +787311,2004-03-20 00:52:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +787378,2004-03-19 22:10:00,ARSON,TARAVAL,BROTHERHOOD WAY / LAKE MERCED BL,-122.485226315335,37.7146945275264 +787476,2004-03-19 18:15:00,KIDNAPPING,CENTRAL,900 Block of HYDE ST,-122.417044292614,37.78959527743221 +787694,2004-03-19 08:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +787965,2004-03-18 14:45:00,ARSON,TARAVAL,2400 Block of 44TH AV,-122.502341018952,37.740916776661294 +788363,2004-03-17 15:38:00,DRUNKENNESS,TARAVAL,CAPITOL AV / OCEAN AV,-122.459212410349,37.7245329610275 +788367,2004-03-17 15:30:00,DRUNKENNESS,TENDERLOIN,500 Block of ELLIS ST,-122.415414178631,37.784476659022005 +788389,2004-03-17 14:40:00,ARSON,SOUTHERN,700 Block of HOWARD ST,-122.401658663476,37.7841666882161 +788396,2004-03-17 14:15:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +788469,2004-03-17 11:00:00,DRUNKENNESS,BAYVIEW,1300 Block of FITZGERALD AV,-122.39408312508002,37.7226193270136 +788750,2004-03-16 18:00:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +788982,2004-03-16 09:11:00,DRUNKENNESS,SOUTHERN,1300 Block of MISSION ST,-122.414982189933,37.7760876960393 +789034,2004-03-16 07:00:00,ARSON,INGLESIDE,100 Block of 29TH ST,-122.423548877173,37.74394400245 +789085,2004-03-16 01:15:00,RUNAWAY,PARK,500 Block of SCOTT ST,-122.435968136819,37.7747589552821 +789184,2004-03-15 18:00:00,DRUNKENNESS,NORTHERN,900 Block of TURK ST,-122.425586860183,37.781378625807 +789193,2004-03-15 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +789285,2004-03-15 14:09:00,KIDNAPPING,TARAVAL,100 Block of HOWTH ST,-122.450468790175,37.72141076568951 +789460,2004-03-07 23:00:00,DRUNKENNESS,MISSION,3000 Block of 16TH ST,-122.421305285009,37.7648974062145 +789495,2004-03-07 21:30:00,KIDNAPPING,NORTHERN,0 Block of FELL ST,-122.418500584434,37.7764380944444 +789605,2004-03-07 15:36:00,DRUNKENNESS,MISSION,700 Block of GUERRERO ST,-122.423445847258,37.7591582536308 +789750,2004-03-07 03:00:00,KIDNAPPING,BAYVIEW,SAN BRUNO AV / BACON ST,-122.403595293523,37.72763409928261 +789786,2004-03-07 01:00:00,DRUNKENNESS,CENTRAL,NORTH POINT ST / MASON ST,-122.413789467238,37.8065526529336 +789788,2004-03-07 00:38:00,ARSON,INGLESIDE,1400 Block of MANSELL ST,-122.416192700509,37.718510177529 +789794,2004-03-07 00:25:00,DRUNKENNESS,SOUTHERN,700 Block of HARRISON ST,-122.397814506334,37.7821372491619 +789797,2004-03-07 00:05:00,DRUNKENNESS,SOUTHERN,0 Block of SHERIDAN ST,-122.411257162898,37.7725006562501 +789798,2004-03-07 00:05:00,DRUNKENNESS,NORTHERN,2000 Block of FILLMORE ST,-122.433676892244,37.7884461157258 +789813,2004-03-06 23:45:00,DRUNKENNESS,SOUTHERN,600 Block of MISSION ST,-122.40093111397,37.7871900467437 +789854,2004-03-06 22:13:00,ARSON,BAYVIEW,1100 Block of THOMAS AV,-122.382852175823,37.7256943991515 +789873,2004-03-06 21:30:00,RUNAWAY,INGLESIDE,1700 Block of ALEMANY BL,-122.437309912944,37.7242901723839 +789888,2004-03-06 20:33:00,DRUNKENNESS,NORTHERN,1000 Block of POLK ST,-122.419950057632,37.7865904778229 +789993,2004-03-06 16:00:00,ARSON,RICHMOND,600 Block of 5TH AV,-122.462802379409,37.7763356090895 +790123,2004-03-06 10:04:00,KIDNAPPING,PARK,2000 Block of GOLDEN GATE AV,-122.44433655866,37.7779316379968 +790180,2004-03-06 02:17:00,DRUNKENNESS,NORTHERN,600 Block of LAGUNA ST,-122.4263385052,37.777173764521606 +790192,2004-03-06 01:45:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421738508476,37.7640972229024 +790267,2004-03-05 22:15:00,DRUNKENNESS,INGLESIDE,MISSION ST / ITALY AV,-122.439500592042,37.7184669808616 +790286,2004-03-05 21:37:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / MARKET ST,-122.416293820942,37.7774936777121 +790342,2004-03-05 20:00:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +790369,2004-03-05 19:00:00,ARSON,NORTHERN,1300 Block of STEINER ST,-122.434137606289,37.7816850865094 +790537,2004-03-05 13:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +790543,2004-03-05 12:55:00,RUNAWAY,PARK,800 Block of CENTRAL AV,-122.444994681535,37.77743975916521 +790584,2004-03-05 11:30:00,KIDNAPPING,INGLESIDE,400 Block of VIENNA ST,-122.429782544787,37.7212089121452 +790685,2004-03-05 03:58:00,ARSON,NORTHERN,1800 Block of CHESTNUT ST,-122.433806712295,37.8011834016788 +790703,2004-03-05 00:29:00,DRUNKENNESS,INGLESIDE,MISSION ST / 30TH ST,-122.421970919038,37.7423752245575 +790721,2004-03-04 23:35:00,DRUNKENNESS,CENTRAL,500 Block of GEARY ST,-122.41275532583,37.7867259286124 +790752,2004-03-04 22:17:00,DRUNKENNESS,CENTRAL,BROADWAY ST / MONTGOMERY ST,-122.403864541983,37.7982226437198 +790781,2004-03-04 21:00:00,KIDNAPPING,NORTHERN,500 Block of IVY ST,-122.427210383666,37.7768771601229 +790841,2004-03-04 18:55:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +790881,2004-03-04 17:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +790943,2004-03-04 15:07:00,DRUNKENNESS,SOUTHERN,AHERN WY / HARRIET ST,-122.403960421357,37.7763118173284 +791057,2004-03-04 10:22:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435012093789,37.7617677182954 +791180,2004-03-03 23:59:00,KIDNAPPING,MISSION,1700 Block of HARRISON ST,-122.413354187018,37.7690748003847 +791245,2004-03-03 22:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +791354,2004-03-03 17:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +791363,2004-03-03 17:15:00,ARSON,TARAVAL,JUDAH ST / 40TH AV,-122.499496943576,37.7607068350315 +791374,2004-03-03 17:00:00,KIDNAPPING,BAYVIEW,200 Block of WESTPOINT RD,-122.378928955993,37.7352990706774 +791382,2004-03-03 16:45:00,KIDNAPPING,INGLESIDE,OCEAN AV / WATSON PL,-122.437019843107,37.7237242613993 +791596,2004-03-03 07:30:00,ARSON,MISSION,3700 Block of 18TH ST,-122.427242380192,37.7614118083919 +791700,2004-03-02 21:33:00,KIDNAPPING,TENDERLOIN,400 Block of OFARRELL ST,-122.411742515582,37.7858882195106 +791752,2004-03-02 19:00:00,KIDNAPPING,SOUTHERN,900 Block of HOWARD ST,-122.406508487003,37.7803313209065 +792000,2004-03-02 10:00:00,ARSON,SOUTHERN,0 Block of 6TH ST,-122.409011206639,37.7811340568243 +792030,2004-03-02 08:38:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +792042,2004-03-02 08:00:00,KIDNAPPING,TENDERLOIN,400 Block of LEAVENWORTH ST,-122.414593831954,37.7851199839553 +792098,2004-03-02 01:49:00,DRUNKENNESS,NORTHERN,POLK ST / SUTTER ST,-122.420120319211,37.78775706021821 +792168,2004-03-01 21:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +792185,2004-03-01 19:46:00,DRUNKENNESS,BAYVIEW,0 Block of REUEL CT,-122.382919646324,37.7364122533313 +792228,2004-03-01 18:00:00,KIDNAPPING,TARAVAL,300 Block of EUCALYPTUS DR,-122.476383904851,37.7310536423783 +792477,2004-03-01 07:30:00,KIDNAPPING,TENDERLOIN,LARKIN ST / FULTON ST,-122.416769999711,37.7795845776445 +792478,2004-03-01 07:30:00,KIDNAPPING,TENDERLOIN,LARKIN ST / FULTON ST,-122.416769999711,37.7795845776445 +792703,2004-02-22 18:00:00,ARSON,BAYVIEW,QUESADA AV / INGALLS ST,-122.383995699937,37.72911385404221 +792847,2004-02-22 10:21:00,DRUNKENNESS,PARK,OAK ST / ASHBURY ST,-122.447314537443,37.7718760580689 +792873,2004-02-22 06:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +792931,2004-02-22 00:22:00,DRUNKENNESS,NORTHERN,1900 Block of SACRAMENTO ST,-122.424986680473,37.79092163766529 +792940,2004-02-21 23:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +793031,2004-02-21 18:44:00,DRUNKENNESS,CENTRAL,400 Block of JEFFERSON ST,-122.419941636264,37.8077487904473 +793050,2004-02-21 18:00:00,RUNAWAY,TARAVAL,1400 Block of FUNSTON AV,-122.470329456449,37.76104044244161 +793075,2004-02-21 16:50:00,DRUNKENNESS,SOUTHERN,MISSION ST / 5TH ST,-122.40648197275,37.7827317884658 +793188,2004-02-21 11:00:00,KIDNAPPING,BAYVIEW,1600 Block of NEWCOMB AV,-122.391089615241,37.7359045006314 +793274,2004-02-21 01:52:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +793371,2004-02-20 21:55:00,DRUNKENNESS,INGLESIDE,3900 Block of FOLSOM ST,-122.413490261204,37.73768389548589 +793473,2004-02-20 17:30:00,RUNAWAY,TARAVAL,0 Block of THRIFT ST,-122.45531874616002,37.717428249952505 +793509,2004-02-20 16:32:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +793838,2004-02-19 19:22:00,ARSON,BAYVIEW,1400 Block of THOMAS AV,-122.388462419597,37.7288786692236 +793922,2004-02-19 16:14:00,DRUNKENNESS,MISSION,FOLSOM ST / 19TH ST,-122.414845139214,37.7605000726041 +794004,2004-02-19 13:30:00,KIDNAPPING,TENDERLOIN,OFARRELL ST / LEAVENWORTH ST,-122.414619686913,37.7855830588241 +794083,2004-02-19 10:00:00,KIDNAPPING,MISSION,2700 Block of 25TH ST,-122.405728477989,37.75181076802279 +794111,2004-02-19 08:30:00,RUNAWAY,PARK,1000 Block of HAYES ST,-122.433661492778,37.7754652277638 +794146,2004-02-19 04:27:00,ARSON,BAYVIEW,1400 Block of LA SALLE AV,-122.386304220968,37.7349050342849 +794150,2004-02-19 02:46:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411339562557,37.7812707434494 +794170,2004-02-19 01:00:00,ARSON,INGLESIDE,200 Block of PIOCHE ST,-122.420897254936,37.7284782118173 +794195,2004-02-18 23:38:00,ARSON,NORTHERN,OCTAVIA ST / FULTON ST,-122.425000578162,37.7785384965829 +794403,2004-02-18 14:59:00,ARSON,CENTRAL,2100 Block of POWELL ST,-122.411607253459,37.8044472417935 +794505,2004-02-18 10:34:00,DRUNKENNESS,CENTRAL,900 Block of COLUMBUS AV,-122.414263444238,37.8031918743285 +794543,2004-02-18 08:00:00,KIDNAPPING,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +794570,2004-02-18 04:45:00,ARSON,BAYVIEW,800 Block of INDIANA ST,-122.3912257128,37.759056472790704 +794601,2004-02-17 23:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +794669,2004-02-17 19:35:00,KIDNAPPING,BAYVIEW,BOUTWELL ST / BAY SHORE BL,-122.40549508828998,37.734286662873295 +794873,2004-02-17 11:10:00,DRUNKENNESS,INGLESIDE,2000 Block of SUNNYDALE AV,-122.417144802399,37.7121502932531 +794975,2004-02-17 00:03:00,DRUNKENNESS,SOUTHERN,7TH ST / MISSION ST,-122.410939205559,37.7792122589856 +795056,2004-02-16 20:50:00,ARSON,BAYVIEW,1000 Block of GRIFFITH ST,-122.378920771859,37.7286119710993 +795287,2004-02-16 02:00:00,DRUNKENNESS,SOUTHERN,5TH ST / FOLSOM ST,-122.403390364804,37.780265577696 +795521,2004-02-08 12:00:00,KIDNAPPING,CENTRAL,1000 Block of SUTTER ST,-122.417650682357,37.788015847733895 +795937,2004-02-07 10:06:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +796037,2004-02-07 01:05:00,DRUNKENNESS,CENTRAL,900 Block of HYDE ST,-122.417044292614,37.78959527743221 +796042,2004-02-07 00:50:00,DRUNKENNESS,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +796085,2004-02-06 23:30:00,RUNAWAY,MISSION,900 Block of YORK ST,-122.408642782989,37.7568334631968 +796096,2004-02-06 23:00:00,KIDNAPPING,INGLESIDE,1700 Block of ALEMANY BL,-122.437309912944,37.7242901723839 +796126,2004-02-06 22:20:00,KIDNAPPING,RICHMOND,500 Block of 8TH AV,-122.466288684702,37.7780442238309 +796162,2004-02-06 21:05:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +796356,2004-02-06 13:00:00,KIDNAPPING,BAYVIEW,0 Block of CONKLING ST,-122.401968361773,37.7356138034783 +796469,2004-02-06 08:20:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +796531,2004-02-06 01:12:00,ARSON,INGLESIDE,100 Block of BLYTHDALE AV,-122.420556751442,37.7108945814914 +796585,2004-02-05 22:18:00,DRUNKENNESS,TARAVAL,2400 Block of NORIEGA ST,-122.489868656046,37.7535951575186 +796641,2004-02-05 19:22:00,DRUNKENNESS,CENTRAL,300 Block of SUTTER ST,-122.40618184105,37.7894765068014 +796752,2004-02-05 15:10:00,KIDNAPPING,SOUTHERN,400 Block of 7TH ST,-122.405118197249,37.7746534767072 +796949,2004-02-05 00:05:00,ARSON,BAYVIEW,EGBERT AV / FITCH ST,-122.385159468113,37.7184097220634 +797214,2004-02-04 12:39:00,KIDNAPPING,INGLESIDE,700 Block of MONTEREY BL,-122.452300379153,37.731623796098 +797226,2004-02-04 12:10:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +797261,2004-02-04 10:17:00,DRUNKENNESS,CENTRAL,BEACH ST / HYDE ST,-122.420564122324,37.806656782396296 +797329,2004-02-04 02:38:00,DRUNKENNESS,CENTRAL,0 Block of KENNETH REXROTH PL,-122.40797317297,37.7984487188793 +797332,2004-02-04 02:00:00,KIDNAPPING,NORTHERN,1300 Block of EDDY ST,-122.429828871559,37.7816903586506 +797348,2004-02-04 00:50:00,DRUNKENNESS,MISSION,900 Block of SOUTH VAN NESS AV,-122.416725586439,37.7579542740829 +797355,2004-02-04 00:25:00,DRUNKENNESS,MISSION,4100 Block of 18TH ST,-122.435573154199,37.7609106220681 +797421,2004-02-03 21:00:00,KIDNAPPING,TENDERLOIN,600 Block of ELLIS ST,-122.416916142188,37.78439444920679 +797442,2004-02-03 20:32:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +797478,2004-02-03 19:30:00,KIDNAPPING,INGLESIDE,3800 Block of MISSION ST,-122.42465342762,37.7357232809376 +797494,2004-02-03 19:00:00,KIDNAPPING,TARAVAL,1200 Block of 15TH AV,-122.472924020326,37.764675577694895 +797514,2004-02-03 18:35:00,DRUNKENNESS,TARAVAL,SLOAT BL / 34TH AV,-122.491573702676,37.7340030567577 +797674,2004-02-03 12:00:00,ARSON,MISSION,3300 Block of 23RD ST,-122.420253564524,37.7536816295495 +797684,2004-02-03 11:41:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / MASON ST,-122.412911739499,37.802182844786 +797995,2004-02-02 14:40:00,RUNAWAY,BAYVIEW,1700 Block of CESAR CHAVEZ ST,-122.39434785768,37.7499131969111 +798018,2004-02-02 13:45:00,DRUNKENNESS,NORTHERN,600 Block of EDDY ST,-122.418382008607,37.783258377094896 +798025,2004-02-02 13:30:00,KIDNAPPING,NORTHERN,VAN NESS AV / BUSH ST,-122.421949487554,37.7884881520906 +798033,2004-02-02 13:07:00,DRUNKENNESS,MISSION,600 Block of YORK ST,-122.409024621045,37.7611721822448 +798209,2004-01-25 23:56:00,ARSON,INGLESIDE,DIAMOND ST / VALLEY ST,-122.435604329506,37.744000752944295 +798241,2004-01-25 22:30:00,DRUNKENNESS,NORTHERN,800 Block of FULTON ST,-122.430292043271,37.7779186218277 +798476,2004-01-25 12:00:00,KIDNAPPING,TENDERLOIN,300 Block of LEAVENWORTH ST,-122.414406029855,37.7841907151119 +798580,2004-01-25 01:45:00,DRUNKENNESS,TARAVAL,46TH AV / JUDAH ST,-122.505928450155,37.7604217436805 +798588,2004-01-25 01:15:00,DRUNKENNESS,CENTRAL,700 Block of VALLEJO ST,-122.409791662293,37.7985083480435 +798601,2004-01-25 00:15:00,KIDNAPPING,BAYVIEW,KEY AV / KEITH ST,-122.398146768434,37.7201295055152 +798611,2004-01-25 00:01:00,KIDNAPPING,INGLESIDE,200 Block of LISBON ST,-122.43191330506,37.7243415257231 +798641,2004-01-24 22:30:00,DRUNKENNESS,CENTRAL,500 Block of BEACH ST,-122.418111096758,37.8070199998601 +798667,2004-01-24 21:33:00,KIDNAPPING,SOUTHERN,500 Block of MINNA ST,-122.408673540372,37.7800574377607 +798814,2004-01-24 14:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +798942,2004-01-24 10:45:00,KIDNAPPING,BAYVIEW,1600 Block of KIRKWOOD AV,-122.390872523812,37.73875194974379 +799054,2004-01-24 00:59:00,DRUNKENNESS,PARK,PAGE ST / DIVISADERO ST,-122.437235589814,37.772204193977 +799073,2004-01-23 23:58:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +799211,2004-01-23 19:10:00,DRUNKENNESS,NORTHERN,POLK ST / POST ST,-122.419930111618,37.7868262081927 +799240,2004-01-23 18:25:00,DRUNKENNESS,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416269089153,37.7531590161083 +799344,2004-01-23 15:10:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421644478447,37.7429970144076 +799542,2004-01-23 01:05:00,ARSON,TARAVAL,1300 Block of 26TH AV,-122.484629238636,37.7622797890704 +799964,2004-01-22 03:06:00,ARSON,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +800145,2004-01-21 18:32:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +800283,2004-01-21 13:10:00,ARSON,INGLESIDE,0 Block of PHELAN AV,-122.452289660492,37.72569335757029 +800710,2004-01-20 12:50:00,DRUNKENNESS,CENTRAL,1000 Block of HYDE ST,-122.417368206741,37.79050941515951 +800794,2004-01-20 08:55:00,RUNAWAY,INGLESIDE,100 Block of SEVILLE ST,-122.436782711222,37.7115160481069 +800851,2004-01-20 00:35:00,ARSON,NORTHERN,1100 Block of POLK ST,-122.420042095728,37.7870450616857 +800857,2004-01-20 00:21:00,DRUNKENNESS,TARAVAL,IRVING ST / 9TH AV,-122.466309668211,37.7640368477357 +800917,2004-01-19 22:08:00,KIDNAPPING,NORTHERN,900 Block of GEARY ST,-122.418940110957,37.7860492230028 +800981,2004-01-19 20:15:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +801178,2004-01-19 10:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +801358,2004-01-11 21:28:00,DRUNKENNESS,NORTHERN,IVY ST / VAN NESS AV,-122.419789209946,37.7777609444481 +801367,2004-01-11 20:49:00,ARSON,INGLESIDE,RICHLAND AV / MURRAY ST,-122.420164211436,37.7357763298683 +801386,2004-01-11 19:52:00,DRUNKENNESS,NORTHERN,900 Block of GEARY ST,-122.418918390218,37.7859407304209 +801673,2004-01-10 23:12:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408595110869,37.7837069301545 +801778,2004-01-10 19:00:00,ARSON,BAYVIEW,0 Block of NORTHRIDGE RD,-122.375512968635,37.730806609582 +801991,2004-01-10 06:20:00,KIDNAPPING,BAYVIEW,4900 Block of 3RD ST,-122.391243431227,37.7336342023099 +802029,2004-01-10 01:44:00,DRUNKENNESS,NORTHERN,GREENWICH ST / FILLMORE ST,-122.435870220159,37.7989514142628 +802087,2004-01-09 23:14:00,DRUNKENNESS,CENTRAL,600 Block of BROADWAY ST,-122.40784335615,37.797777359358896 +802193,2004-01-09 18:23:00,DRUNKENNESS,BAYVIEW,2500 Block of SAN BRUNO AV,-122.404407189561,37.72940755917529 +802223,2004-01-09 17:30:00,RUNAWAY,BAYVIEW,1500 Block of NEWCOMB AV,-122.388817917114,37.734752508079296 +802281,2004-01-09 15:00:00,ARSON,RICHMOND,500 Block of JOHN F KENNEDY DR,-122.466204667893,37.7725405391593 +802599,2004-01-08 18:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +802937,2004-01-07 21:30:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +803420,2004-01-06 18:50:00,ARSON,NORTHERN,OFARRELL ST / POLK ST,-122.41954956879,37.7849590112399 +803607,2004-01-06 10:30:00,RUNAWAY,TARAVAL,100 Block of APTOS AV,-122.466880621762,37.7292354079524 +803965,2004-01-05 13:14:00,ARSON,BAYVIEW,1000 Block of CONNECTICUT ST,-122.397201937993,37.75353512427621 +804000,2004-01-05 12:00:00,RUNAWAY,MISSION,1200 Block of HAMPSHIRE ST,-122.40714465605,37.7520972558707 +804042,2004-01-05 09:21:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +804099,2004-01-05 05:45:00,ARSON,PARK,1000 Block of FULTON ST,-122.434068008938,37.77743773817311 +804129,2004-01-05 01:05:00,ARSON,NORTHERN,3700 Block of BRODERICK ST,-122.44548812575,37.804914835640105 +804158,2003-12-28 22:50:00,ARSON,INGLESIDE,CARRIZAL ST / PARQUE DR,-122.420322566938,37.70991404999 +804476,2003-12-27 21:38:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +804559,2003-12-27 16:30:00,DRUNKENNESS,BAYVIEW,600 Block of JAMESTOWN AV,-122.387833652325,37.7131072321423 +804702,2003-12-27 05:15:00,ARSON,BAYVIEW,1500 Block of ARMSTRONG AV,-122.391349752219,37.7256666094246 +804705,2003-12-27 04:59:00,RUNAWAY,INGLESIDE,300 Block of MT VERNON AV,-122.447011251272,37.717790305485295 +804714,2003-12-27 02:30:00,ARSON,INGLESIDE,0 Block of BROOK ST,-122.42346257513,37.7406184025308 +804718,2003-12-27 02:25:00,DRUNKENNESS,NORTHERN,500 Block of HAYES ST,-122.425416290071,37.776628022785104 +804846,2003-12-26 18:50:00,ARSON,INGLESIDE,1500 Block of SUNNYDALE AV,-122.417107986993,37.7122561827524 +804991,2003-12-26 08:45:00,DRUNKENNESS,TARAVAL,2000 Block of 24TH AV,-122.481434810064,37.749326569145296 +805036,2003-12-26 00:01:00,KIDNAPPING,SOUTHERN,300 Block of TOWNSEND ST,-122.396164058532,37.7762328753299 +805110,2003-12-25 19:00:00,KIDNAPPING,RICHMOND,4700 Block of GEARY BL,-122.470174478935,37.7806269247284 +805114,2003-12-25 19:00:00,KIDNAPPING,RICHMOND,4700 Block of GEARY BL,-122.470174478935,37.7806269247284 +805120,2003-12-25 18:02:00,ARSON,CENTRAL,1300 Block of PACIFIC AV,-122.417638463771,37.7954904018711 +805137,2003-12-25 17:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.40811239746,37.7777588128811 +805148,2003-12-25 15:44:00,DRUNKENNESS,MISSION,25TH ST / MISSION ST,-122.418289276874,37.750640293927496 +805232,2003-12-25 07:00:00,ARSON,INGLESIDE,100 Block of FLOOD AV,-122.443173176231,37.7299587015105 +805524,2003-12-24 03:11:00,DRUNKENNESS,BAYVIEW,800 Block of TERRY A FRANCOIS BL,-122.386775025935,37.765377517215 +805916,2003-12-22 23:40:00,DRUNKENNESS,INGLESIDE,100 Block of HARKNESS AV,-122.401141689686,37.71769486744321 +806047,2003-12-22 17:00:00,KIDNAPPING,INGLESIDE,4700 Block of MISSION ST,-122.437393972517,37.7214120621391 +806266,2003-12-22 03:33:00,ARSON,INGLESIDE,100 Block of GARRISON AV,-122.412418664281,37.7093944394649 +806288,2003-12-22 00:45:00,DRUNKENNESS,SOUTHERN,1900 Block of MARKET ST,-122.426498379985,37.769249045094 +806446,2003-12-14 17:00:00,DRUNKENNESS,MISSION,0 Block of SHOTWELL ST,-122.416696931762,37.7676671063296 +806475,2003-12-14 15:15:00,KIDNAPPING,INGLESIDE,1000 Block of BRUSSELS ST,-122.402396359987,37.71929459004871 +806529,2003-12-14 12:16:00,DRUNKENNESS,CENTRAL,100 Block of SUTTER ST,-122.402698432888,37.7899188687248 +806542,2003-12-14 11:00:00,KIDNAPPING,SOUTHERN,100 Block of OTIS ST,-122.420303482492,37.770896885856 +806616,2003-12-14 00:59:00,ARSON,BAYVIEW,300 Block of DE HARO ST,-122.40158959441798,37.765477560366 +806854,2003-12-13 11:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +806859,2003-12-13 10:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +806902,2003-12-13 04:10:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +806918,2003-12-13 01:47:00,DRUNKENNESS,CENTRAL,1400 Block of GRANT AV,-122.407560004563,37.8001710961561 +806994,2003-12-12 22:42:00,DRUNKENNESS,NORTHERN,GROVE ST / POLK ST,-122.418229899728,37.7784895366584 +807000,2003-12-12 22:30:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617234,37.778124778298505 +807012,2003-12-12 22:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +807134,2003-12-12 16:00:00,KIDNAPPING,RICHMOND,2600 Block of SUTTER ST,-122.444011812819,37.7846656063475 +807227,2003-12-12 11:15:00,KIDNAPPING,PARK,500 Block of STANYAN ST,-122.454115612221,37.7717480155689 +807327,2003-12-12 00:15:00,KIDNAPPING,RICHMOND,300 Block of 17TH AV,-122.47630564574,37.7814192906098 +807339,2003-12-12 00:01:00,RUNAWAY,INGLESIDE,1000 Block of PRAGUE ST,-122.438136814106,37.7101464061867 +807341,2003-12-12 00:01:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +807888,2003-12-10 17:00:00,RUNAWAY,BAYVIEW,3800 Block of 3RD ST,-122.387939452192,37.7422600519555 +808178,2003-12-09 20:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +808290,2003-12-09 13:00:00,KIDNAPPING,INGLESIDE,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +808489,2003-12-08 23:24:00,DRUNKENNESS,CENTRAL,STOCKTON ST / COLUMBUS AV,-122.40901700762,37.7994880717404 +808691,2003-12-08 14:17:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +808870,2003-11-30 23:20:00,DRUNKENNESS,NORTHERN,LARKIN ST / POST ST,-122.418274171667,37.7870372043456 +808997,2003-11-30 14:55:00,ARSON,RICHMOND,3700 Block of CALIFORNIA ST,-122.455468425157,37.786210973675 +809035,2003-11-30 11:52:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +809151,2003-11-29 23:58:00,DRUNKENNESS,INGLESIDE,600 Block of HURON AV,-122.448515219777,37.7129679834174 +809302,2003-11-29 16:44:00,ARSON,SOUTHERN,400 Block of 7TH ST,-122.405784439722,37.775184377494 +809516,2003-11-28 23:53:00,DRUNKENNESS,SOUTHERN,MARKET ST / TAYLOR ST,-122.410293519697,37.7822305869807 +809692,2003-11-28 14:00:00,RUNAWAY,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +809838,2003-11-28 02:00:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +809920,2003-11-27 21:33:00,DRUNKENNESS,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291898,37.7827931070777 +809950,2003-11-27 19:25:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421264331104,37.743584765874 +810128,2003-11-27 05:50:00,RUNAWAY,INGLESIDE,PORTOLA DR / WOODSIDE AV,-122.451622869545,37.7455330433541 +810145,2003-11-27 02:55:00,ARSON,BAYVIEW,0 Block of DAKOTA ST,-122.395513264888,37.7536178531447 +810270,2003-11-26 19:25:00,DRUNKENNESS,NORTHERN,MYRTLE ST / POLK ST,-122.419641420436,37.78543273137 +810629,2003-11-26 01:30:00,ARSON,SOUTHERN,12TH ST / FOLSOM ST,-122.414998913188,37.7708946575816 +810636,2003-11-26 00:15:00,DRUNKENNESS,MISSION,2700 Block of 19TH ST,-122.409519037266,37.7604588271528 +810697,2003-11-25 21:24:00,DRUNKENNESS,MISSION,HAMPSHIRE ST / 22ND ST,-122.407604807921,37.756109789152 +810906,2003-11-25 12:30:00,ARSON,TARAVAL,SICKLES AV / SAN JOSE AV,-122.455815337851,37.7112226803075 +811204,2003-11-24 14:30:00,ARSON,PARK,1000 Block of PAGE ST,-122.438071949152,37.7720408002783 +811227,2003-11-24 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +811372,2003-11-24 00:15:00,DRUNKENNESS,RICHMOND,400 Block of 6TH AV,-122.464279879446,37.7800332991006 +811525,2003-11-16 16:30:00,RUNAWAY,BAYVIEW,0 Block of APOLLO ST,-122.397845534183,37.732214427203296 +811547,2003-11-16 15:22:00,DRUNKENNESS,MISSION,1600 Block of BRYANT ST,-122.410478069487,37.7662463209137 +811559,2003-11-16 14:50:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +811636,2003-11-16 08:10:00,ARSON,NORTHERN,200 Block of HAIGHT ST,-122.426340097288,37.7725733730723 +811680,2003-11-16 01:32:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +811718,2003-11-15 23:40:00,DRUNKENNESS,SOUTHERN,400 Block of 3RD ST,-122.396062368554,37.7815744448753 +811796,2003-11-15 20:20:00,ARSON,BAYVIEW,1500 Block of CUSTER AV,-122.390102549533,37.74588490267711 +811816,2003-11-15 19:30:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.406690592261,37.7852071918419 +811884,2003-11-15 16:00:00,KIDNAPPING,NORTHERN,2300 Block of WEBSTER ST,-122.432761929758,37.7922569274184 +812084,2003-11-15 01:32:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +812102,2003-11-15 00:14:00,DRUNKENNESS,MISSION,LUCKY ST / 25TH ST,-122.413367079055,37.7509373207532 +812131,2003-11-14 23:00:00,KIDNAPPING,BAYVIEW,3RD ST / NEWHALL ST,-122.38931064465,37.7387418395425 +812264,2003-11-14 17:49:00,DRUNKENNESS,CENTRAL,300 Block of JEFFERSON ST,-122.416650482064,37.808166053356295 +812270,2003-11-14 17:34:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +812298,2003-11-14 16:30:00,KIDNAPPING,SOUTHERN,5TH ST / MARKET ST,-122.408068345155,37.783991676793214 +812338,2003-11-14 14:45:00,ARSON,RICHMOND,400 Block of ARGUELLO BL,-122.458857560736,37.78220007231379 +812556,2003-11-14 00:30:00,KIDNAPPING,NORTHERN,700 Block of ELLIS ST,-122.418562097105,37.78418470913029 +812566,2003-11-14 00:01:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +812572,2003-11-13 23:55:00,KIDNAPPING,BAYVIEW,200 Block of CHINABASIN ST,-122.387789980293,37.7757113649966 +812705,2003-11-13 18:00:00,KIDNAPPING,BAYVIEW,FITZGERALD AV / JENNINGS ST,-122.393174162432,37.722036232115 +812812,2003-11-13 13:00:00,DRUNKENNESS,NORTHERN,900 Block of HAIGHT ST,-122.437904238512,37.7712141777478 +812822,2003-11-13 12:29:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +813002,2003-11-12 23:40:00,DRUNKENNESS,SOUTHERN,1300 Block of MISSION ST,-122.415757039196,37.7754692820041 +813042,2003-11-12 21:22:00,ARSON,BAYVIEW,1000 Block of SELBY ST,-122.398910984223,37.7408611595295 +813157,2003-11-12 17:00:00,ARSON,TARAVAL,800 Block of WAWONA ST,-122.475834951494,37.7373757463497 +813346,2003-11-12 08:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +813499,2003-11-11 19:02:00,DRUNKENNESS,TENDERLOIN,0 Block of ELLIS ST,-122.406850401437,37.7855610975205 +813515,2003-11-11 18:15:00,RUNAWAY,MISSION,2300 Block of 16TH ST,-122.409529913278,37.7657184395282 +813570,2003-11-11 15:30:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408368579345,37.7807784253732 +813822,2003-11-10 22:10:00,KIDNAPPING,SOUTHERN,0 Block of 6TH ST,-122.40942036456,37.7816150265786 +813952,2003-11-10 17:00:00,RUNAWAY,BAYVIEW,600 Block of THORNTON AV,-122.400751154093,37.731416053600896 +813957,2003-11-10 16:45:00,ARSON,RICHMOND,400 Block of 10TH AV,-122.468562845833,37.7798381239123 +814023,2003-11-10 13:50:00,DRUNKENNESS,CENTRAL,100 Block of SUTTER ST,-122.402698432888,37.7899188687248 +814084,2003-11-10 11:14:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +814223,2003-11-02 22:00:00,ARSON,BAYVIEW,1200 Block of INGALLS ST,-122.381867300078,37.7305667976884 +814234,2003-11-02 21:35:00,DRUNKENNESS,SOUTHERN,MISSION ST / 7TH ST,-122.410939205559,37.7792122589856 +814291,2003-11-02 18:00:00,KIDNAPPING,NORTHERN,500 Block of GROVE ST,-122.425635136646,37.7774387764148 +814306,2003-11-02 17:00:00,RUNAWAY,TARAVAL,2900 Block of TARAVAL ST,-122.497659321493,37.7420246370177 +814333,2003-11-02 16:00:00,RUNAWAY,PARK,100 Block of MASONIC AV,-122.44731296591002,37.780619295768 +814376,2003-11-02 14:00:00,KIDNAPPING,INGLESIDE,0 Block of ROME ST,-122.444897397201,37.716876510347 +814535,2003-11-02 00:02:00,DRUNKENNESS,NORTHERN,WEBSTER ST / FULTON ST,-122.429850411511,37.7779180624766 +814559,2003-11-01 23:27:00,DRUNKENNESS,INGLESIDE,3300 Block of MISSION ST,-122.421964745809,37.742261383285 +814588,2003-11-01 22:24:00,DRUNKENNESS,NORTHERN,1100 Block of SUTTER ST,-122.41931732407,37.7879136979106 +814612,2003-11-01 21:10:00,KIDNAPPING,SOUTHERN,0 Block of TOWNSEND ST,-122.38917826265,37.7817062612299 +814673,2003-11-01 18:00:00,KIDNAPPING,TENDERLOIN,100 Block of MASON ST,-122.409336821846,37.7848337315521 +814891,2003-11-01 08:15:00,DRUNKENNESS,NORTHERN,1000 Block of POST ST,-122.419104424644,37.78687648416079 +814936,2003-11-01 03:10:00,DRUNKENNESS,BAYVIEW,800 Block of TERRY A FRANCOIS BL,-122.386775025935,37.765377517215 +814956,2003-11-01 02:19:00,DRUNKENNESS,BAYVIEW,800 Block of TERRY A FRANCOIS BL,-122.386775025935,37.765377517215 +814993,2003-11-01 00:55:00,DRUNKENNESS,SOUTHERN,500 Block of 4TH ST,-122.39784956123002,37.7793117074346 +815070,2003-10-31 23:35:00,ARSON,SOUTHERN,SHERMAN ST / CLEVELAND ST,-122.406472333772,37.776963442394 +815111,2003-10-31 22:55:00,DRUNKENNESS,MISSION,NOE ST / MARKET ST,-122.433075152376,37.7641937790293 +815113,2003-10-31 22:53:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +815193,2003-10-31 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +815212,2003-10-31 19:03:00,DRUNKENNESS,SOUTHERN,1100 Block of MARKET ST,-122.412320907436,37.7807642254398 +815269,2003-10-31 17:00:00,ARSON,BAYVIEW,1300 Block of 22ND ST,-122.394668562532,37.75767938973321 +815447,2003-10-31 09:15:00,ARSON,INGLESIDE,500 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +815465,2003-10-31 08:30:00,RUNAWAY,INGLESIDE,400 Block of NAPLES ST,-122.43068585096,37.721640435668895 +815505,2003-10-31 02:46:00,DRUNKENNESS,MISSION,1900 Block of 15TH ST,-122.427142652668,37.7661763079166 +815611,2003-10-30 21:00:00,KIDNAPPING,TARAVAL,0 Block of GATEVIEW CT,-122.466821112882,37.748249580463 +816144,2003-10-29 17:00:00,KIDNAPPING,TARAVAL,1100 Block of IRVING ST,-122.470072641493,37.7639267607191 +816245,2003-10-29 12:03:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.408913229808,37.781211650766295 +816360,2003-10-29 04:22:00,ARSON,BAYVIEW,200 Block of INDUSTRIAL ST,-122.404603330992,37.7385046034115 +816365,2003-10-29 02:58:00,ARSON,SOUTHERN,1000 Block of MARKET ST,-122.411071423064,37.7817511307229 +816368,2003-10-29 02:35:00,DRUNKENNESS,SOUTHERN,3RD ST / MISSION ST,-122.402027706956,37.78624834564 +816371,2003-10-29 02:15:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +816375,2003-10-29 01:47:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929238,37.7980180687515 +816389,2003-10-29 00:01:00,KIDNAPPING,TENDERLOIN,100 Block of MCALLISTER ST,-122.41452262258,37.7808752665663 +816434,2003-10-28 21:17:00,DRUNKENNESS,INGLESIDE,29TH ST / TIFFANY AV,-122.421977818631,37.7439793205707 +816469,2003-10-28 20:00:00,KIDNAPPING,PARK,400 Block of SCOTT ST,-122.43577940458,37.773828855912704 +816483,2003-10-28 19:45:00,KIDNAPPING,MISSION,500 Block of UTAH ST,-122.406311571034,37.762608811814 +816500,2003-10-28 19:07:00,DRUNKENNESS,MISSION,2200 Block of MISSION ST,-122.419350173229,37.76101609120561 +816511,2003-10-28 19:00:00,RUNAWAY,PARK,400 Block of CARL ST,-122.457258778458,37.7649243232243 +816583,2003-10-28 17:00:00,DRUNKENNESS,SOUTHERN,800 Block of MARKET ST,-122.407633520742,37.7841893501425 +816614,2003-10-28 15:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +816648,2003-10-28 14:20:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +816736,2003-10-28 10:00:00,DRUNKENNESS,MISSION,25TH ST / TREAT AV,-122.412838554026,37.7509678760804 +816789,2003-10-28 08:00:00,RUNAWAY,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +816813,2003-10-28 04:45:00,DRUNKENNESS,SOUTHERN,300 Block of BEALE ST,-122.391985513707,37.788020382906296 +816832,2003-10-28 02:01:00,KIDNAPPING,NORTHERN,FILLMORE ST / HAIGHT ST,-122.430436523482,37.7721069661715 +816905,2003-10-27 20:45:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +816939,2003-10-27 19:23:00,ARSON,BAYVIEW,400 Block of PAUL AV,-122.399671791086,37.723293933153 +816949,2003-10-27 19:00:00,KIDNAPPING,INGLESIDE,100 Block of PARIS ST,-122.431579212515,37.7262214019626 +816982,2003-10-27 17:33:00,DRUNKENNESS,INGLESIDE,0 Block of 29TH ST,-122.42234692668998,37.7440146216143 +817029,2003-10-27 15:00:00,KIDNAPPING,BAYVIEW,5300 Block of 3RD ST,-122.392899681522,37.72890406777661 +817082,2003-10-27 12:08:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +817092,2003-10-27 11:30:00,KIDNAPPING,TENDERLOIN,TURK ST / TAYLOR ST,-122.41076876635,37.7832145189783 +817140,2003-10-27 08:30:00,KIDNAPPING,TARAVAL,400 Block of BRIGHT ST,-122.463482276499,37.7189291866653 +817250,2003-10-19 22:31:00,DRUNKENNESS,INGLESIDE,OCEAN AV / MISSION ST,-122.43538545491998,37.7239104471079 +817301,2003-10-19 20:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +817422,2003-10-19 13:14:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +817485,2003-10-19 09:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +817492,2003-10-19 09:05:00,DRUNKENNESS,MISSION,FOLSOM ST / 24TH ST,-122.414089000716,37.7525050785803 +817585,2003-10-18 23:55:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +817718,2003-10-18 18:16:00,KIDNAPPING,PARK,2500 Block of GEARY BL,-122.445147376449,37.7824240316365 +817722,2003-10-18 18:16:00,KIDNAPPING,NORTHERN,1300 Block of EDDY ST,-122.429828871559,37.7816903586506 +817904,2003-10-18 02:40:00,ARSON,BAYVIEW,2100 Block of NEWCOMB AV,-122.400036386185,37.7411130706456 +818074,2003-10-17 19:56:00,KIDNAPPING,RICHMOND,18TH AV / GEARY BL,-122.477241022328,37.7804373318779 +818084,2003-10-17 19:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +818227,2003-10-17 14:00:00,KIDNAPPING,BAYVIEW,1000 Block of FITZGERALD AV,-122.389347613957,37.71976330690779 +818397,2003-10-16 23:45:00,KIDNAPPING,TARAVAL,WINSTON DR / 19TH AV,-122.474899151628,37.7269905310192 +818626,2003-10-16 15:10:00,RUNAWAY,INGLESIDE,400 Block of RAYMOND AV,-122.412457953057,37.7147347356846 +818666,2003-10-16 13:30:00,KIDNAPPING,INGLESIDE,500 Block of PORTOLA DR,-122.451163989719,37.7455640062989 +818707,2003-10-16 12:15:00,DRUNKENNESS,CENTRAL,NORTH POINT ST / POWELL ST,-122.412143310592,37.8067579022602 +818745,2003-10-16 10:18:00,RUNAWAY,INGLESIDE,100 Block of BRITTON ST,-122.412611074843,37.7123220693794 +818833,2003-10-16 03:30:00,DRUNKENNESS,TENDERLOIN,300 Block of EDDY ST,-122.412930522059,37.7838344374141 +818834,2003-10-16 03:23:00,ARSON,TENDERLOIN,500 Block of JONES ST,-122.412999075009,37.786277459166 +818933,2003-10-15 21:28:00,KIDNAPPING,BAYVIEW,400 Block of SOMERSET ST,-122.407235988658,37.7260053606541 +819249,2003-10-15 08:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +819277,2003-10-15 03:00:00,ARSON,INGLESIDE,1000 Block of ALEMANY BL,-122.43043866379,37.7309067502055 +819335,2003-10-14 22:25:00,ARSON,BAYVIEW,800 Block of MANSELL ST,-122.40954276725,37.7195088952058 +819544,2003-10-14 14:50:00,ARSON,TARAVAL,0 Block of THOMAS MORE WY,-122.473064099314,37.7122982509145 +819596,2003-10-14 12:30:00,KIDNAPPING,NORTHERN,200 Block of WEBSTER ST,-122.428923608224,37.772570847212 +819601,2003-10-14 12:20:00,ARSON,BAYVIEW,100 Block of SWEENY ST,-122.408353417441,37.7327734845493 +819686,2003-10-14 08:00:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +819742,2003-10-14 00:02:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +819879,2003-10-13 18:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.40811239746,37.7777588128811 +820283,2003-10-05 17:18:00,DRUNKENNESS,NORTHERN,400 Block of HAIGHT ST,-122.429644614552,37.7722642986091 +820428,2003-10-05 10:00:00,ARSON,MISSION,900 Block of SOUTH VAN NESS AV,-122.416725586439,37.7579542740829 +820449,2003-10-05 08:15:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +820483,2003-10-05 02:50:00,ARSON,INGLESIDE,SUNNYDALE AV / PERSIA AV,-122.425836398256,37.71827912805429 +820488,2003-10-05 02:14:00,DRUNKENNESS,NORTHERN,FILLMORE ST / MCALLISTER ST,-122.431765489412,37.7786311131024 +820490,2003-10-05 02:10:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +820498,2003-10-05 01:55:00,DRUNKENNESS,CENTRAL,JACKSON ST / MONTGOMERY ST,-122.403499804598,37.7964183278764 +820514,2003-10-05 00:40:00,ARSON,BAYVIEW,2100 Block of QUESADA AV,-122.399852840312,37.7381735692778 +820545,2003-10-04 23:20:00,ARSON,MISSION,200 Block of ORANGE ST,-122.419787428244,37.74973744799711 +820546,2003-10-04 23:15:00,KIDNAPPING,CENTRAL,PACIFIC AV / BATTERY ST,-122.400865930546,37.7976529669065 +820547,2003-10-04 23:15:00,KIDNAPPING,CENTRAL,PACIFIC AV / BATTERY ST,-122.400865930546,37.7976529669065 +820615,2003-10-04 20:00:00,RUNAWAY,BAYVIEW,1300 Block of SILLIMAN ST,-122.418390732865,37.7277019406768 +820647,2003-10-04 18:15:00,DRUNKENNESS,RICHMOND,1800 Block of DIVISADERO ST,-122.440040391343,37.7866702442116 +820680,2003-10-04 16:17:00,DRUNKENNESS,SOUTHERN,500 Block of MARKET ST,-122.400194768944,37.7900527936016 +820919,2003-10-03 22:37:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675554,37.78139873406629 +820935,2003-10-03 22:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +820939,2003-10-03 22:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +820940,2003-10-03 22:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +821206,2003-10-03 11:24:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.41076876635,37.7832145189783 +821235,2003-10-03 09:40:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +821376,2003-10-02 22:25:00,DRUNKENNESS,SOUTHERN,500 Block of HOWARD ST,-122.396934740624,37.7877468463797 +821406,2003-10-02 20:36:00,DRUNKENNESS,TENDERLOIN,300 Block of OFARRELL ST,-122.410509258795,37.786043222299206 +821598,2003-10-02 12:26:00,ARSON,MISSION,900 Block of GUERRERO ST,-122.423107153531,37.755573041962 +821742,2003-10-02 07:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +821752,2003-10-02 05:30:00,RUNAWAY,MISSION,2800 Block of BRYANT ST,-122.408695677398,37.7489689222795 +821796,2003-10-01 23:34:00,DRUNKENNESS,BAYVIEW,PAUL AV / CARR ST,-122.396626663225,37.72262622440321 +821806,2003-10-01 22:51:00,DRUNKENNESS,RICHMOND,9TH AV / MARTIN LUTHER KING JR DR,-122.466429551461,37.766474138614704 +821864,2003-10-01 20:00:00,RUNAWAY,PARK,100 Block of MASONIC AV,-122.44731296591002,37.780619295768 +822088,2003-10-01 12:00:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +822246,2003-10-01 02:30:00,DRUNKENNESS,TARAVAL,4100 Block of NORIEGA ST,-122.507993743835,37.7527946244713 +822266,2003-10-01 00:22:00,DRUNKENNESS,MISSION,24TH ST / HAMPSHIRE ST,-122.407294221812,37.7529064152272 +822267,2003-10-01 00:22:00,DRUNKENNESS,INGLESIDE,EXCELSIOR AV / PARIS ST,-122.432054581863,37.7254869312371 +822428,2003-09-30 18:30:00,KIDNAPPING,MISSION,300 Block of BARTLETT ST,-122.419408045677,37.7513609637505 +822507,2003-09-30 15:00:00,RUNAWAY,INGLESIDE,1000 Block of CAYUGA AV,-122.440006611531,37.721804883554704 +822751,2003-09-29 23:00:00,ARSON,TARAVAL,2700 Block of 36TH AV,-122.493403241013,37.7357663349494 +822905,2003-09-29 15:27:00,ARSON,BAYVIEW,0 Block of COMMER CT,-122.38499543409,37.7325333188542 +822922,2003-09-29 15:00:00,KIDNAPPING,RICHMOND,500 Block of JOHN F KENNEDY DR,-122.466204667893,37.7725405391593 +822953,2003-09-29 13:10:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +823060,2003-09-29 08:50:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / VALLEJO ST,-122.407871572792,37.79869627427671 +823187,2003-09-21 22:20:00,DRUNKENNESS,RICHMOND,500 Block of 3RD AV,-122.460793422453,37.77829288255621 +823341,2003-09-21 15:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +823379,2003-09-21 13:00:00,RUNAWAY,INGLESIDE,200 Block of ARBOR ST,-122.437952639272,37.7374491367852 +823391,2003-09-21 12:20:00,DRUNKENNESS,SOUTHERN,400 Block of MINNA ST,-122.407505446721,37.7811304562104 +823415,2003-09-21 11:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +823526,2003-09-21 00:48:00,DRUNKENNESS,NORTHERN,1000 Block of POST ST,-122.419126295342,37.7869849580362 +823603,2003-09-20 21:40:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +823628,2003-09-20 20:18:00,ARSON,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +823669,2003-09-20 18:47:00,KIDNAPPING,INGLESIDE,SILVER AV / MISSION ST,-122.431295002937,37.7287297938629 +823695,2003-09-20 17:30:00,DRUNKENNESS,MISSION,16TH ST / RONDEL PL,-122.421240281402,37.7649558927958 +823716,2003-09-20 16:49:00,KIDNAPPING,MISSION,3100 Block of 23RD ST,-122.415872041274,37.754055423493206 +823717,2003-09-20 16:49:00,KIDNAPPING,MISSION,3100 Block of 23RD ST,-122.415872041274,37.754055423493206 +823797,2003-09-20 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +823871,2003-09-20 09:00:00,KIDNAPPING,SOUTHERN,4TH ST / TOWNSEND ST,-122.394985875932,37.7770909533794 +824053,2003-09-19 19:57:00,DRUNKENNESS,MISSION,24TH ST / OSAGE ST,-122.419018144903,37.7522051632884 +824188,2003-09-19 14:35:00,DRUNKENNESS,RICHMOND,300 Block of 10TH AV,-122.468563735156,37.7817711446338 +824226,2003-09-19 12:58:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411071423064,37.7817511307229 +824262,2003-09-19 11:35:00,DRUNKENNESS,MISSION,2500 Block of MISSION ST,-122.418891810986,37.7562166627216 +824418,2003-09-18 23:44:00,DRUNKENNESS,NORTHERN,SUTTER ST / POLK ST,-122.420120319211,37.78775706021821 +824532,2003-09-18 19:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +824573,2003-09-18 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +824747,2003-09-18 10:50:00,RUNAWAY,MISSION,1200 Block of SOUTH VAN NESS AV,-122.416407071861,37.7531509460228 +824818,2003-09-18 07:00:00,RUNAWAY,NORTHERN,600 Block of WILLOW ST,-122.42831052169,37.782362906932896 +824887,2003-09-17 23:50:00,DRUNKENNESS,PARK,600 Block of STANYAN ST,-122.453563238036,37.7696403896003 +825046,2003-09-17 16:30:00,KIDNAPPING,RICHMOND,6300 Block of GEARY BL,-122.487415459555,37.7798470223491 +825303,2003-09-16 23:30:00,DRUNKENNESS,CENTRAL,600 Block of BUSH ST,-122.40836738789,37.7901567744673 +825320,2003-09-16 22:50:00,DRUNKENNESS,CENTRAL,0 Block of CLAY ST,-122.39617056066002,37.7954869937274 +825446,2003-09-16 18:00:00,ARSON,RICHMOND,600 Block of 32ND AV,-122.491956779206,37.7768766735218 +825465,2003-09-16 17:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +825535,2003-09-16 14:00:00,KIDNAPPING,BAYVIEW,1000 Block of FITZGERALD AV,-122.389347613957,37.71976330690779 +825615,2003-09-16 10:30:00,KIDNAPPING,NORTHERN,1300 Block of EDDY ST,-122.429828871559,37.7816903586506 +825657,2003-09-16 08:20:00,DRUNKENNESS,CENTRAL,MASON ST / BAY ST,-122.413609602055,37.8056188797128 +825703,2003-09-16 03:04:00,DRUNKENNESS,BAYVIEW,INNES AV / PHELPS ST,-122.390703943909,37.7404830101734 +825923,2003-09-15 16:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +826101,2003-09-15 08:15:00,KIDNAPPING,INGLESIDE,0 Block of SCHWERIN ST,-122.410335138973,37.7127263408597 +826113,2003-09-15 07:40:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +826205,2003-09-07 22:51:00,ARSON,BAYVIEW,6200 Block of 3RD ST,-122.396242120792,37.7213661801557 +826388,2003-09-07 14:00:00,KIDNAPPING,SOUTHERN,200 Block of 6TH ST,-122.406346425632,37.7791674218963 +826499,2003-09-07 05:29:00,ARSON,BAYVIEW,2000 Block of PALOU AV,-122.399370590026,37.7387108274334 +826502,2003-09-07 05:10:00,KIDNAPPING,MISSION,16TH ST / MISSION ST,-122.419671780303,37.7650501214714 +826637,2003-09-06 21:30:00,DRUNKENNESS,BAYVIEW,200 Block of WILLIAMS AV,-122.397744427103,37.7299346936044 +826715,2003-09-06 18:19:00,KIDNAPPING,INGLESIDE,600 Block of BOSWORTH ST,-122.434612166424,37.7335290030453 +826803,2003-09-06 14:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +826825,2003-09-06 12:45:00,DRUNKENNESS,MISSION,3600 Block of 19TH ST,-122.424257504658,37.7599852182816 +826912,2003-09-06 07:54:00,DRUNKENNESS,SOUTHERN,0 Block of STILLMAN ST,-122.395237696668,37.7825710705311 +826931,2003-09-06 04:19:00,ARSON,INGLESIDE,STONEYBROOK AV / CAMBRIDGE ST,-122.421755052489,37.7310860944671 +826941,2003-09-06 03:20:00,ARSON,BAYVIEW,0 Block of CASHMERE ST,-122.382745395519,37.73565878863421 +826982,2003-09-05 23:59:00,ARSON,BAYVIEW,1500 Block of DAVIDSON AV,-122.390747034966,37.7451687932068 +826988,2003-09-05 23:44:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +826989,2003-09-05 23:44:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +827071,2003-09-05 20:00:00,KIDNAPPING,BAYVIEW,DARTMOUTH ST / MANSELL ST,-122.408978096983,37.7194765092151 +827073,2003-09-05 20:00:00,KIDNAPPING,BAYVIEW,DARTMOUTH ST / MANSELL ST,-122.408978096983,37.7194765092151 +827375,2003-09-05 07:30:00,RUNAWAY,NORTHERN,1200 Block of TURK ST,-122.428840433603,37.780972734343706 +827376,2003-09-05 07:30:00,RUNAWAY,BAYVIEW,2800 Block of SAN BRUNO AV,-122.402780926364,37.7258401277408 +827523,2003-09-04 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +827841,2003-09-03 22:30:00,KIDNAPPING,PARK,CENTRAL AV / GROVE ST,-122.444595512272,37.7750854088505 +828082,2003-09-03 12:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +828085,2003-09-03 11:23:00,KIDNAPPING,SOUTHERN,1400 Block of MARKET ST,-122.418480564808,37.775898446204 +828224,2003-09-02 22:45:00,KIDNAPPING,TENDERLOIN,400 Block of OFARRELL ST,-122.411742515582,37.7858882195106 +828243,2003-09-02 21:22:00,ARSON,INGLESIDE,200 Block of JOHN F SHELLEY DR,-122.423304635548,37.72266944630029 +828255,2003-09-02 21:00:00,DRUNKENNESS,SOUTHERN,GALLAGHER LN / TEHAMA ST,-122.403329153305,37.7819284423625 +828565,2003-09-02 02:50:00,ARSON,INGLESIDE,30TH ST / MISSION ST,-122.421970919038,37.7423752245575 +828629,2003-09-01 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +828698,2003-09-01 18:30:00,ARSON,RICHMOND,400 Block of 3RD AV,-122.460926683246,37.7801819739328 +828757,2003-09-01 16:18:00,ARSON,MISSION,1300 Block of HAMPSHIRE ST,-122.407129738907,37.7504851919731 +828800,2003-09-01 13:42:00,DRUNKENNESS,PARK,1500 Block of HAIGHT ST,-122.44776112232,37.7698464875415 +828864,2003-09-01 11:25:00,DRUNKENNESS,SOUTHERN,400 Block of 6TH ST,-122.403671442177,37.77703244359461 +828959,2003-09-01 03:55:00,ARSON,NORTHERN,500 Block of MARINA BL,-122.443101526211,37.8056090215901 +828978,2003-09-01 01:45:00,DRUNKENNESS,NORTHERN,1100 Block of FILLMORE ST,-122.432116233695,37.7800304351156 +829107,2003-08-24 19:00:00,RUNAWAY,MISSION,2600 Block of 23RD ST,-122.405968218086,37.7543612746695 +829111,2003-08-24 18:32:00,DRUNKENNESS,BAYVIEW,800 Block of ILLINOIS ST,-122.387697223638,37.7611719792041 +829163,2003-08-24 16:50:00,ARSON,NORTHERN,2700 Block of VAN NESS AV,-122.424621297176,37.8008471623182 +829346,2003-08-24 03:30:00,KIDNAPPING,NORTHERN,0 Block of RICHARDSON AV,-122.445511828952,37.7991106732401 +829359,2003-08-24 01:59:00,DRUNKENNESS,CENTRAL,JEFFERSON ST / POWELL ST,-122.412527239688,37.8086250594963 +829366,2003-08-24 01:30:00,RUNAWAY,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +829518,2003-08-23 18:15:00,DRUNKENNESS,BAYVIEW,NEWCOMB AV / NEWHALL ST,-122.39164874901002,37.736289786109296 +829547,2003-08-23 17:20:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +829598,2003-08-23 15:30:00,DRUNKENNESS,MISSION,MISSION ST / 18TH ST,-122.419360352769,37.76183580124221 +829632,2003-08-23 13:05:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +829686,2003-08-23 10:00:00,KIDNAPPING,INGLESIDE,100 Block of LOEHR ST,-122.413676487435,37.71261657662389 +829843,2003-08-22 22:10:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +830190,2003-08-22 09:00:00,KIDNAPPING,PARK,400 Block of BAKER ST,-122.441138734047,37.7750537845268 +830235,2003-08-22 03:00:00,DRUNKENNESS,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +830273,2003-08-22 00:01:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +830581,2003-08-21 12:18:00,KIDNAPPING,SOUTHERN,5TH ST / HOWARD ST,-122.404934413346,37.7814987212989 +830622,2003-08-21 10:00:00,ARSON,CENTRAL,500 Block of DAVIS ST,-122.398447802857,37.7980037233355 +830738,2003-08-20 23:23:00,DRUNKENNESS,MISSION,CASTRO ST / MARKET ST,-122.435187699322,37.7626702770923 +830823,2003-08-20 20:23:00,DRUNKENNESS,MISSION,3000 Block of 16TH ST,-122.421082850193,37.764910844226 +830878,2003-08-20 18:00:00,KIDNAPPING,TARAVAL,1000 Block of CAPITOL AV,-122.459132231034,37.72094834327429 +830921,2003-08-20 16:35:00,KIDNAPPING,BAYVIEW,1000 Block of HOLLISTER AV,-122.391468771522,37.71926858093661 +830984,2003-08-20 14:30:00,KIDNAPPING,MISSION,YORK ST / CESAR CHAVEZ ST,-122.407767261253,37.7484240251983 +831054,2003-08-20 12:00:00,RUNAWAY,CENTRAL,800 Block of WASHINGTON ST,-122.407398297689,37.795082613553 +831151,2003-08-20 03:07:00,ARSON,BAYVIEW,200 Block of WESTPOINT RD,-122.378928955993,37.7352990706774 +831152,2003-08-20 03:00:00,KIDNAPPING,MISSION,16TH ST / MARKET ST,-122.433075152376,37.7641937790293 +831546,2003-08-19 08:04:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +831615,2003-08-18 23:57:00,KIDNAPPING,TENDERLOIN,500 Block of ELLIS ST,-122.415414178631,37.784476659022005 +831668,2003-08-18 20:50:00,ARSON,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +831802,2003-08-18 14:40:00,ARSON,TARAVAL,1200 Block of OCEAN AV,-122.455678529624,37.7237017394146 +832111,2003-08-10 16:46:00,KIDNAPPING,INGLESIDE,2300 Block of SAN JOSE AV,-122.447025496377,37.720056608234 +832233,2003-08-10 11:20:00,ARSON,SOUTHERN,100 Block of 6TH ST,-122.407376463936,37.7799892619986 +832293,2003-08-10 03:50:00,KIDNAPPING,PARK,GEARY BL / MASONIC AV,-122.448043124426,37.7823710354663 +832301,2003-08-10 03:27:00,DRUNKENNESS,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291898,37.7827931070777 +832470,2003-08-09 19:37:00,DRUNKENNESS,PARK,HAIGHT ST / MASONIC AV,-122.445346786573,37.7702081959223 +832579,2003-08-09 14:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +832681,2003-08-09 06:30:00,KIDNAPPING,INGLESIDE,900 Block of MADRID ST,-122.437372742018,37.7154366849405 +832730,2003-08-09 01:40:00,DRUNKENNESS,CENTRAL,700 Block of MONTGOMERY ST,-122.40334021406,37.7959918873778 +833133,2003-08-08 01:30:00,KIDNAPPING,INGLESIDE,100 Block of BENTON AV,-122.424357047228,37.7328968953088 +833136,2003-08-08 01:30:00,KIDNAPPING,INGLESIDE,100 Block of BENTON AV,-122.424357047228,37.7328968953088 +833202,2003-08-07 21:57:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.41076876635,37.7832145189783 +833233,2003-08-07 20:11:00,DRUNKENNESS,RICHMOND,2800 Block of GEARY BL,-122.44958034096202,37.7820535935304 +833280,2003-08-07 19:00:00,KIDNAPPING,INGLESIDE,MURRAY ST / MISSION ST,-122.42639101853,37.7336749150424 +833308,2003-08-07 18:00:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +833508,2003-08-07 10:00:00,KIDNAPPING,TARAVAL,LOWER GREAT HY / LINCOLN WY,-122.510339992241,37.7640000598021 +833537,2003-08-07 08:40:00,KIDNAPPING,PARK,1300 Block of FULTON ST,-122.439037573428,37.776802154003896 +833606,2003-08-07 00:14:00,DRUNKENNESS,INGLESIDE,600 Block of MADRID ST,-122.434641437043,37.7192985938865 +833653,2003-08-06 22:15:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +833663,2003-08-06 22:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +833774,2003-08-06 18:30:00,ARSON,NORTHERN,400 Block of VAN NESS AV,-122.420217273345,37.7791510160099 +833842,2003-08-06 15:10:00,KIDNAPPING,PARK,1300 Block of OAK ST,-122.44156139247,37.7725523591109 +833846,2003-08-06 15:00:00,DRUNKENNESS,NORTHERN,2400 Block of LOMBARD ST,-122.441811628041,37.7990019436809 +833859,2003-08-06 14:48:00,DRUNKENNESS,TENDERLOIN,TURK ST / TAYLOR ST,-122.41076876635,37.7832145189783 +834260,2003-08-05 13:00:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +834268,2003-08-05 12:30:00,KIDNAPPING,PARK,2000 Block of OFARRELL ST,-122.438053867276,37.782664870999 +834344,2003-08-05 09:13:00,ARSON,TENDERLOIN,0 Block of JONES ST,-122.412054141237,37.7816136403158 +834357,2003-08-05 08:16:00,DRUNKENNESS,MISSION,800 Block of VALENCIA ST,-122.421380986073,37.7589148884581 +834384,2003-08-05 06:51:00,ARSON,SOUTHERN,5TH ST / MARKET ST,-122.408068345155,37.783991676793214 +834700,2003-08-04 12:00:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +834730,2003-08-04 09:50:00,RUNAWAY,NORTHERN,700 Block of LAGUNA ST,-122.426571288872,37.7776315159135 +834896,2003-07-27 18:55:00,KIDNAPPING,CENTRAL,600 Block of TAYLOR ST,-122.41185703254,37.7883235449904 +834917,2003-07-27 17:40:00,KIDNAPPING,INGLESIDE,MISSION ST / 29TH ST,-122.420896598743,37.7440381549474 +834924,2003-07-27 17:00:00,KIDNAPPING,MISSION,2300 Block of MARKET ST,-122.434229003953,37.7634850137846 +834981,2003-07-27 13:15:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +835007,2003-07-27 12:00:00,RUNAWAY,INGLESIDE,100 Block of EDINBURGH ST,-122.42796276926,37.7266925555983 +835049,2003-07-27 08:49:00,ARSON,BAYVIEW,1100 Block of SHAFTER AV,-122.382290550761,37.726322214822 +835079,2003-07-27 03:30:00,KIDNAPPING,RICHMOND,4900 Block of FULTON ST,-122.484742319476,37.77259911123271 +835089,2003-07-27 02:43:00,KIDNAPPING,TENDERLOIN,100 Block of EDDY ST,-122.410135236377,37.78418890752671 +835120,2003-07-27 01:11:00,DRUNKENNESS,MISSION,3000 Block of HARRISON ST,-122.411584193034,37.7486195212612 +835193,2003-07-26 21:35:00,ARSON,BAYVIEW,400 Block of WOOLSEY ST,-122.406049453861,37.7242729303328 +835211,2003-07-26 21:00:00,KIDNAPPING,TENDERLOIN,300 Block of TURK ST,-122.414900544562,37.7827419623926 +835353,2003-07-26 13:00:00,KIDNAPPING,MISSION,MISSION ST / 16TH ST,-122.419671780303,37.7650501214714 +835405,2003-07-26 10:00:00,RUNAWAY,SOUTHERN,900 Block of MISSION ST,-122.407932868203,37.7815063666429 +835476,2003-07-26 01:00:00,DRUNKENNESS,SOUTHERN,300 Block of BRANNAN ST,-122.39241698236602,37.7816553650269 +835552,2003-07-25 21:30:00,KIDNAPPING,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +835594,2003-07-25 19:53:00,DRUNKENNESS,BAYVIEW,CORTLAND AV / HILTON ST,-122.407644632738,37.739605639158704 +835661,2003-07-25 17:00:00,KIDNAPPING,MISSION,4000 Block of 25TH ST,-122.4306244966,37.7498410869216 +835715,2003-07-25 14:20:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +835768,2003-07-25 12:00:00,DRUNKENNESS,TENDERLOIN,8TH ST / MARKET ST,-122.41474383539,37.7787192627661 +835780,2003-07-25 11:40:00,KIDNAPPING,BAYVIEW,0 Block of WESTPOINT RD,-122.380291012279,37.7354366994577 +835904,2003-07-25 02:15:00,DRUNKENNESS,PARK,1700 Block of FULTON ST,-122.445630633673,37.7758527958728 +836050,2003-07-24 19:00:00,RUNAWAY,TARAVAL,0 Block of THRIFT ST,-122.45531874616002,37.717428249952505 +836079,2003-07-24 17:56:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552609,37.7693505381832 +836289,2003-07-24 03:01:00,ARSON,INGLESIDE,0 Block of PRENTISS ST,-122.411887472598,37.74156280789371 +836507,2003-07-23 17:19:00,DRUNKENNESS,TENDERLOIN,TURK ST / HYDE ST,-122.415694922141,37.7825851968238 +836601,2003-07-23 13:00:00,RUNAWAY,TARAVAL,0 Block of THRIFT ST,-122.45531874616002,37.717428249952505 +836730,2003-07-23 01:25:00,ARSON,NORTHERN,900 Block of WEBSTER ST,-122.429991038695,37.7793454488606 +836774,2003-07-22 21:49:00,ARSON,INGLESIDE,500 Block of ALEMANY BL,-122.421305348396,37.7321638759455 +836780,2003-07-22 21:35:00,DRUNKENNESS,TARAVAL,19TH AV / JUDAH ST,-122.477012148616,37.7616987104115 +836811,2003-07-22 19:30:00,DRUNKENNESS,BAYVIEW,0 Block of BERTHA LN,-122.380990356551,37.7331435009212 +836847,2003-07-22 18:35:00,DRUNKENNESS,CENTRAL,500 Block of POST ST,-122.410904846406,37.788029392285104 +837017,2003-07-22 11:30:00,DRUNKENNESS,TARAVAL,700 Block of IRVING ST,-122.465791800721,37.764114780327 +837112,2003-07-22 02:45:00,KIDNAPPING,TARAVAL,900 Block of CAPITOL AV,-122.459123785556,37.7191443988258 +837144,2003-07-21 23:45:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +837202,2003-07-21 20:45:00,DRUNKENNESS,INGLESIDE,CHENERY ST / DIAMOND ST,-122.433880171398,37.7345081628068 +837231,2003-07-21 19:25:00,DRUNKENNESS,TENDERLOIN,100 Block of GOLDEN GATE AV,-122.413047972078,37.7819119628298 +837305,2003-07-21 17:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +837419,2003-07-21 11:55:00,ARSON,TENDERLOIN,400 Block of EDDY ST,-122.415088721046,37.7836719564372 +837667,2003-07-13 19:00:00,ARSON,NORTHERN,2200 Block of UNION ST,-122.43631861387,37.79692792888829 +837783,2003-07-13 12:00:00,KIDNAPPING,BAYVIEW,1000 Block of FITZGERALD AV,-122.389347613957,37.71976330690779 +837938,2003-07-12 23:00:00,KIDNAPPING,SOUTHERN,4TH ST / MISSION ST,-122.404270179493,37.7844788538516 +837979,2003-07-12 21:38:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +837991,2003-07-12 20:50:00,KIDNAPPING,PARK,HAIGHT ST / SCOTT ST,-122.435375683682,37.7714793397282 +838147,2003-07-12 11:10:00,ARSON,MISSION,400 Block of CASTRO ST,-122.435150099812,37.7617597243598 +838228,2003-07-12 02:28:00,DRUNKENNESS,TENDERLOIN,0 Block of MASON ST,-122.409129633669,37.7838066631424 +838230,2003-07-12 02:14:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +838234,2003-07-12 02:00:00,DRUNKENNESS,BAYVIEW,800 Block of TERRY A FRANCOIS BL,-122.386775025935,37.765377517215 +838266,2003-07-11 23:59:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404260458632,37.79811648188871 +838272,2003-07-11 23:40:00,DRUNKENNESS,NORTHERN,100 Block of OAK ST,-122.421783738657,37.775072361347 +838366,2003-07-11 20:00:00,KIDNAPPING,MISSION,2000 Block of MARKET ST,-122.426955631709,37.76924706320701 +838427,2003-07-11 18:00:00,RUNAWAY,MISSION,400 Block of SOUTH VAN NESS AV,-122.417662868855,37.766274431582495 +838551,2003-07-11 12:30:00,ARSON,INGLESIDE,1400 Block of MANSELL ST,-122.416192700509,37.718510177529 +838609,2003-07-11 09:10:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +838654,2003-07-11 04:05:00,KIDNAPPING,CENTRAL,1200 Block of SACRAMENTO ST,-122.413476240682,37.7923912334945 +838680,2003-07-11 01:40:00,DRUNKENNESS,SOUTHERN,4TH ST / WELSH ST,-122.397543611084,37.77913196309501 +838699,2003-07-11 00:28:00,DRUNKENNESS,SOUTHERN,400 Block of 6TH ST,-122.403671442177,37.77703244359461 +838765,2003-07-10 21:20:00,DRUNKENNESS,SOUTHERN,600 Block of HOWARD ST,-122.39998852115,37.78548734122921 +838786,2003-07-10 20:25:00,ARSON,BAYVIEW,OAKDALE AV / 3RD ST,-122.390697630726,37.7347969947664 +839044,2003-07-10 06:00:00,KIDNAPPING,NORTHERN,1400 Block of TURK ST,-122.43298921345,37.7804437011568 +839055,2003-07-10 04:10:00,KIDNAPPING,RICHMOND,PIERCE ST / SUTTER ST,-122.436558814679,37.7856670021326 +839063,2003-07-10 03:00:00,KIDNAPPING,BAYVIEW,600 Block of GOETTINGEN ST,-122.405390271381,37.7238467380899 +839144,2003-07-09 21:25:00,DRUNKENNESS,SOUTHERN,0 Block of LAFAYETTE ST,-122.416608653757,37.7725681063387 +839147,2003-07-09 21:15:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +839196,2003-07-09 19:29:00,ARSON,INGLESIDE,1200 Block of GIRARD ST,-122.400429640823,37.7171464036619 +839274,2003-07-09 15:13:00,ARSON,BAYVIEW,1500 Block of NEWCOMB AV,-122.388817917114,37.734752508079296 +839395,2003-07-09 09:50:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +839480,2003-07-09 02:50:00,ARSON,INGLESIDE,3800 Block of FOLSOM ST,-122.413268742399,37.7386381492454 +839565,2003-07-08 20:32:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +839791,2003-07-08 11:30:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +839861,2003-07-08 07:00:00,RUNAWAY,TARAVAL,0 Block of THRIFT ST,-122.45531874616002,37.717428249952505 +839873,2003-07-08 04:15:00,ARSON,SOUTHERN,200 Block of I-80,-122.36493749408,37.8102044406285 +839902,2003-07-08 00:38:00,DRUNKENNESS,SOUTHERN,1000 Block of MARKET ST,-122.411071423064,37.7817511307229 +840166,2003-07-07 12:55:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +840169,2003-07-07 12:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +840214,2003-07-07 09:40:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +840234,2003-07-07 08:50:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +840272,2003-07-07 03:56:00,ARSON,NORTHERN,700 Block of WEBSTER ST,-122.429918677577,37.7774431475107 +840287,2003-07-07 01:38:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.404282497745,37.7982249345487 +840374,2003-06-29 20:11:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +840490,2003-06-29 13:30:00,DRUNKENNESS,PARK,1700 Block of HAIGHT ST,-122.451288061231,37.7693967099165 +840510,2003-06-29 12:30:00,RUNAWAY,INGLESIDE,700 Block of ELLSWORTH ST,-122.416517427405,37.7330103867416 +840630,2003-06-29 02:30:00,DRUNKENNESS,MISSION,18TH ST / CASTRO ST,-122.435002864271,37.7608878061245 +840656,2003-06-29 00:27:00,DRUNKENNESS,MISSION,2000 Block of MISSION ST,-122.419520367886,37.764228935718 +840735,2003-06-28 19:26:00,DRUNKENNESS,MISSION,19TH ST / DOLORES ST,-122.425920487444,37.7598279172274 +840829,2003-06-28 14:40:00,KIDNAPPING,MISSION,1300 Block of UTAH ST,-122.405337194755,37.7524089409576 +840981,2003-06-28 06:43:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +840995,2003-06-28 03:00:00,ARSON,TARAVAL,0 Block of CAINE AV,-122.450562512299,37.7173835692586 +840998,2003-06-28 02:45:00,DRUNKENNESS,CENTRAL,PACIFIC AV / COLUMBUS AV,-122.405517223284,37.797064228476295 +841012,2003-06-28 01:31:00,DRUNKENNESS,MISSION,MISSION ST / SYCAMORE ST,-122.419445310678,37.76271343275221 +841079,2003-06-27 22:20:00,DRUNKENNESS,SOUTHERN,MISSION ST / STEUART ST,-122.393185851708,37.7932304135819 +841089,2003-06-27 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +841149,2003-06-27 18:05:00,KIDNAPPING,RICHMOND,400 Block of BALBOA ST,-122.463482054308,37.7772034580766 +841277,2003-06-27 13:00:00,DRUNKENNESS,CENTRAL,0 Block of POST ST,-122.402346586116,37.789003338213895 +841324,2003-06-27 10:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +841428,2003-06-27 00:24:00,DRUNKENNESS,CENTRAL,600 Block of PACIFIC AV,-122.406034753134,37.7969469304359 +841438,2003-06-26 23:45:00,ARSON,BAYVIEW,1100 Block of CARROLL AV,-122.384926170333,37.7202785995095 +841526,2003-06-26 20:15:00,KIDNAPPING,INGLESIDE,100 Block of BLYTHDALE AV,-122.420529801066,37.7110023300609 +841569,2003-06-26 19:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +841843,2003-06-26 06:20:00,DRUNKENNESS,BAYVIEW,400 Block of MANSELL ST,-122.406079770608,37.72041061847521 +841869,2003-06-26 02:25:00,ARSON,BAYVIEW,1400 Block of DONNER AV,-122.391102685388,37.7228143812956 +842127,2003-06-25 15:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +842192,2003-06-25 12:00:00,KIDNAPPING,NORTHERN,100 Block of PAGE ST,-122.423180920623,37.773930994988106 +842291,2003-06-25 03:00:00,ARSON,BAYVIEW,JAMESTOWN AV / HARNEY WY,-122.386452097357,37.7111618711939 +842389,2003-06-24 21:00:00,DRUNKENNESS,SOUTHERN,3RD ST / KING ST,-122.391845617234,37.778124778298505 +842391,2003-06-24 20:50:00,ARSON,SOUTHERN,800 Block of BRANNAN ST,-122.404385042303,37.7721958190345 +842430,2003-06-24 18:50:00,ARSON,SOUTHERN,200 Block of 8TH ST,-122.411271940537,37.7760329501244 +842436,2003-06-24 18:34:00,DRUNKENNESS,INGLESIDE,100 Block of BOSWORTH ST,-122.428127534913,37.73345805496661 +842489,2003-06-24 17:00:00,RUNAWAY,TARAVAL,300 Block of PLYMOUTH AV,-122.456126455635,37.7136432190476 +842495,2003-06-24 16:30:00,ARSON,BAYVIEW,1800 Block of OAKDALE AV,-122.395572399938,37.7375042189557 +842498,2003-06-24 16:15:00,ARSON,NORTHERN,9TH ST / MARKET ST,-122.416293820942,37.7774936777121 +842820,2003-06-23 19:15:00,ARSON,CENTRAL,800 Block of SACRAMENTO ST,-122.407563368631,37.7931432786834 +842919,2003-06-23 15:32:00,DRUNKENNESS,PARK,1600 Block of HAIGHT ST,-122.450452600564,37.7695032629887 +843028,2003-06-23 10:30:00,RUNAWAY,SOUTHERN,5TH ST / MARKET ST,-122.408068345155,37.783991676793214 +843171,2003-06-15 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +843236,2003-06-15 18:40:00,DRUNKENNESS,CENTRAL,STOCKTON ST / COLUMBUS AV,-122.40901700762,37.7994880717404 +843260,2003-06-15 17:00:00,ARSON,SOUTHERN,5TH ST / HARRISON ST,-122.401846367529,37.7790324136022 +843351,2003-06-15 10:15:00,DRUNKENNESS,PARK,600 Block of COLE ST,-122.450682500949,37.7690417439297 +843427,2003-06-15 00:58:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / GRANT AV,-122.407085601179,37.7981513676881 +843577,2003-06-14 17:30:00,KIDNAPPING,BAYVIEW,1000 Block of HOLLISTER AV,-122.391468771522,37.71926858093661 +843606,2003-06-14 16:00:00,DRUNKENNESS,NORTHERN,FILLMORE ST / OFARRELL ST,-122.432706975864,37.7832909416139 +843668,2003-06-14 12:25:00,RUNAWAY,TARAVAL,0 Block of FARALLONES ST,-122.454154436499,37.7140350941097 +843791,2003-06-14 00:30:00,DRUNKENNESS,NORTHERN,POLK ST / SUTTER ST,-122.420120319211,37.78775706021821 +843802,2003-06-14 00:01:00,KIDNAPPING,TENDERLOIN,600 Block of OFARRELL ST,-122.415972165351,37.78535651423429 +843826,2003-06-13 22:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +843836,2003-06-13 22:00:00,ARSON,BAYVIEW,700 Block of 25TH ST,-122.386332904186,37.752863058064 +843980,2003-06-13 16:45:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +844014,2003-06-13 15:23:00,DRUNKENNESS,INGLESIDE,1700 Block of VISITACION AV,-122.414156067516,37.716166902145 +844037,2003-06-13 14:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +844332,2003-06-12 20:00:00,DRUNKENNESS,TARAVAL,0 Block of DIAZ AV,-122.476289294393,37.71805179122301 +844406,2003-06-12 17:00:00,ARSON,BAYVIEW,2600 Block of SAN BRUNO AV,-122.403775864685,37.7282405026531 +844434,2003-06-12 15:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +844502,2003-06-12 12:30:00,KIDNAPPING,NORTHERN,3500 Block of PIERCE ST,-122.440140235794,37.8033465247214 +844555,2003-06-12 10:00:00,ARSON,NORTHERN,2500 Block of LOMBARD ST,-122.44352039096,37.7989993135254 +844595,2003-06-12 08:36:00,ARSON,BAYVIEW,1500 Block of THOMAS AV,-122.390332083069,37.7299375199572 +844722,2003-06-11 20:30:00,ARSON,BAYVIEW,800 Block of WISCONSIN ST,-122.398937121824,37.7565542061561 +844799,2003-06-11 17:23:00,DRUNKENNESS,TENDERLOIN,LARKIN ST / GROVE ST,-122.41658345614,37.7786591541279 +844864,2003-06-11 14:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +845013,2003-06-11 07:05:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +845175,2003-06-10 19:00:00,RUNAWAY,TARAVAL,0 Block of CASTELO AV,-122.474817318143,37.717406113737 +845563,2003-06-09 21:15:00,ARSON,BAYVIEW,1300 Block of EGBERT AV,-122.391655195039,37.7221837489706 +845602,2003-06-09 19:30:00,RUNAWAY,MISSION,400 Block of VALENCIA ST,-122.42207304894,37.766125945480105 +845609,2003-06-09 19:20:00,DRUNKENNESS,BAYVIEW,HAMILTON ST / BACON ST,-122.409528258806,37.7260849566548 +845742,2003-06-09 14:00:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +845799,2003-06-09 11:45:00,DRUNKENNESS,CENTRAL,1000 Block of PINE ST,-122.413117804936,37.7906201757921 +846000,2003-06-01 20:14:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +846237,2003-06-01 09:00:00,RUNAWAY,TARAVAL,0 Block of GRIJALVA DR,-122.478604660091,37.7168855600811 +846247,2003-06-01 08:00:00,ARSON,INGLESIDE,1100 Block of CAYUGA AV,-122.441128207624,37.7199837193143 +846301,2003-06-01 01:40:00,DRUNKENNESS,NORTHERN,0 Block of GROVE ST,-122.417448582701,37.7786438096934 +846441,2003-05-31 21:00:00,KIDNAPPING,TARAVAL,1200 Block of 25TH AV,-122.483549147995,37.7642044083861 +846471,2003-05-31 19:00:00,DRUNKENNESS,SOUTHERN,1500 Block of MISSION ST,-122.417975390351,37.7737509379648 +846493,2003-05-31 17:57:00,DRUNKENNESS,SOUTHERN,FOLSOM ST / 5TH ST,-122.403390364804,37.780265577696 +846553,2003-05-31 14:25:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +846555,2003-05-31 14:22:00,KIDNAPPING,CENTRAL,800 Block of POST ST,-122.41584375719,37.7874017655636 +846708,2003-05-31 04:43:00,ARSON,RICHMOND,CABRILLO ST / LA PLAYA ST,-122.510036841076,37.7732570409709 +846732,2003-05-31 01:22:00,DRUNKENNESS,MISSION,2800 Block of 24TH ST,-122.408664686116,37.7528787651491 +846926,2003-05-30 16:46:00,ARSON,INGLESIDE,0 Block of BROOKDALE AV,-122.4208910342,37.7120920675614 +846984,2003-05-30 12:45:00,DRUNKENNESS,SOUTHERN,1200 Block of MISSION ST,-122.414360138779,37.776430169375104 +847070,2003-05-30 08:40:00,DRUNKENNESS,TENDERLOIN,100 Block of JONES ST,-122.412249767634,37.782556330202 +847106,2003-05-30 05:45:00,ARSON,MISSION,100 Block of COLLINGWOOD ST,-122.436102868825,37.7600036963355 +847218,2003-05-29 21:00:00,ARSON,BAYVIEW,100 Block of DAKOTA ST,-122.395635436168,37.7535645746594 +847315,2003-05-29 17:00:00,RUNAWAY,NORTHERN,800 Block of MCALLISTER ST,-122.425189655862,37.7794095734265 +847538,2003-05-29 07:30:00,RUNAWAY,INGLESIDE,600 Block of MIRAMAR AV,-122.458085173609,37.7285356205091 +847540,2003-05-29 07:30:00,RUNAWAY,TARAVAL,100 Block of APTOS AV,-122.466880621762,37.7292354079524 +847686,2003-05-28 19:00:00,RUNAWAY,BAYVIEW,0 Block of LEDYARD ST,-122.402116556292,37.7332354676556 +847917,2003-05-28 07:30:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +848004,2003-05-27 22:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +848105,2003-05-27 19:00:00,KIDNAPPING,PARK,1700 Block of TURK ST,-122.437493921383,37.779870435121104 +848320,2003-05-27 10:20:00,ARSON,SOUTHERN,900 Block of FOLSOM ST,-122.403860419019,37.77981372039329 +848504,2003-05-26 19:50:00,DRUNKENNESS,SOUTHERN,STEVENSON ST / 2ND ST,-122.400816275991,37.7888170039929 +848534,2003-05-26 18:05:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411987643595,37.7850226622786 +848733,2003-05-26 04:45:00,ARSON,INGLESIDE,MONTEREY BL / FOERSTER ST,-122.448865497028,37.7315417594271 +848852,2003-05-18 20:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +848864,2003-05-18 20:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +848934,2003-05-18 16:00:00,RUNAWAY,MISSION,3900 Block of 26TH ST,-122.428261177739,37.7484825407299 +848985,2003-05-18 13:30:00,ARSON,PARK,100 Block of BELVEDERE ST,-122.449328648219,37.7677738874748 +849139,2003-05-18 00:45:00,DRUNKENNESS,RICHMOND,UPPER GREAT HY / BALBOA ST,-122.511293798638,37.7750733263075 +849176,2003-05-17 23:06:00,DRUNKENNESS,TARAVAL,1700 Block of 19TH AV,-122.476354986628,37.7551671326313 +849196,2003-05-17 22:55:00,DRUNKENNESS,RICHMOND,900 Block of ANZA ST,-122.458254549328,37.7793571873626 +849317,2003-05-17 16:50:00,ARSON,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +849407,2003-05-17 11:30:00,DRUNKENNESS,TENDERLOIN,0 Block of UNITED NATIONS PZ,-122.41431222924,37.77983391835871 +849458,2003-05-17 04:25:00,DRUNKENNESS,INGLESIDE,1500 Block of HAMPSHIRE ST,-122.406447979381,37.7483251753329 +849643,2003-05-16 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +849748,2003-05-16 13:34:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +849927,2003-05-16 00:45:00,DRUNKENNESS,SOUTHERN,0 Block of MCCOPPIN ST,-122.422142220938,37.7716732332893 +849942,2003-05-15 23:52:00,ARSON,INGLESIDE,CRESCENT AV / FOLSOM ST,-122.413689986591,37.7347306985052 +849944,2003-05-15 23:44:00,DRUNKENNESS,RICHMOND,800 Block of LA PLAYA ST,-122.509895418239,37.7723131976814 +849949,2003-05-15 23:30:00,DRUNKENNESS,MISSION,600 Block of VALENCIA ST,-122.421747650463,37.7627436601147 +850002,2003-05-15 21:14:00,ARSON,MISSION,15TH ST / MINNA ST,-122.419074754962,37.7667189830285 +850012,2003-05-15 20:51:00,ARSON,TARAVAL,4400 Block of IRVING ST,-122.505537495628,37.76236308781471 +850045,2003-05-15 19:42:00,ARSON,BAYVIEW,1300 Block of CARROLL AV,-122.388667171578,37.7223782958446 +850080,2003-05-15 18:25:00,DRUNKENNESS,NORTHERN,3100 Block of FILLMORE ST,-122.435795989446,37.7982569877565 +850286,2003-05-15 09:45:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / BROADWAY ST,-122.406669739958,37.797864174416496 +850312,2003-05-15 08:50:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +850404,2003-05-14 23:30:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415444159886,37.7780245674641 +850423,2003-05-14 22:31:00,DRUNKENNESS,SOUTHERN,100 Block of 4TH ST,-122.4039407276,37.7843007072344 +850471,2003-05-14 21:00:00,KIDNAPPING,CENTRAL,300 Block of POWELL ST,-122.408384275542,37.7878271137225 +850488,2003-05-14 20:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +850531,2003-05-14 18:30:00,DRUNKENNESS,MISSION,16TH ST / POTRERO AV,-122.407538332327,37.7657827544322 +850848,2003-05-14 00:05:00,DRUNKENNESS,SOUTHERN,200 Block of BRANNAN ST,-122.390645819037,37.7830549839906 +850858,2003-05-13 23:45:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +850901,2003-05-13 22:00:00,RUNAWAY,BAYVIEW,1700 Block of MC KINNON AV,-122.392084229516,37.7373992523117 +850950,2003-05-13 20:30:00,ARSON,TARAVAL,3900 Block of NORIEGA ST,-122.505947485796,37.752885142776606 +851049,2003-05-13 17:21:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +851152,2003-05-13 14:00:00,RUNAWAY,SOUTHERN,0 Block of MOSS ST,-122.407999186749,37.7778241673064 +851478,2003-05-12 17:31:00,DRUNKENNESS,SOUTHERN,MARKET ST / POWELL ST,-122.407545855938,37.7844011794631 +851634,2003-05-12 11:13:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929238,37.7980180687515 +851737,2003-05-12 02:30:00,KIDNAPPING,NORTHERN,LAUSSAT ST / STEINER ST,-122.432000396013,37.7714303243588 +851739,2003-05-12 02:30:00,DRUNKENNESS,CENTRAL,GEARY ST / MASON ST,-122.409876622539,37.7871488079561 +851858,2003-05-04 19:30:00,KIDNAPPING,INGLESIDE,2100 Block of CAYUGA AV,-122.454176002937,37.71040191183111 +851890,2003-05-04 17:59:00,DRUNKENNESS,SOUTHERN,1200 Block of MARKET ST,-122.415448759562,37.778293520129 +852192,2003-05-03 19:28:00,DRUNKENNESS,NORTHERN,300 Block of HAYES ST,-122.422180938873,37.7770395107539 +852403,2003-05-03 02:20:00,DRUNKENNESS,RICHMOND,4100 Block of GEARY BL,-122.463764261964,37.7811749336778 +852539,2003-05-02 19:45:00,DRUNKENNESS,INGLESIDE,1200 Block of EUGENIA AV,-122.413613486047,37.7402468208897 +852617,2003-05-02 17:00:00,ARSON,MISSION,3700 Block of 18TH ST,-122.427242380192,37.7614118083919 +852752,2003-05-02 10:40:00,DRUNKENNESS,SOUTHERN,0 Block of 6TH ST,-122.40950430935,37.781526271747 +852764,2003-05-02 10:01:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409849441655,37.78327552025671 +852813,2003-05-02 08:30:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +852870,2003-05-02 01:45:00,DRUNKENNESS,MISSION,2700 Block of 23RD ST,-122.406959317105,37.7544805049371 +852875,2003-05-02 01:22:00,DRUNKENNESS,CENTRAL,300 Block of COLUMBUS AV,-122.406842913454,37.7980587205991 +852887,2003-05-02 00:30:00,DRUNKENNESS,SOUTHERN,7TH ST / MISSION ST,-122.410939205559,37.7792122589856 +852956,2003-05-01 21:30:00,DRUNKENNESS,TARAVAL,LOWER GREAT HY / JUDAH ST,-122.509380941469,37.7602695362789 +853003,2003-05-01 19:33:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +853104,2003-05-01 15:42:00,RUNAWAY,BAYVIEW,300 Block of WAYLAND ST,-122.405609702296,37.7258362850344 +853149,2003-05-01 14:00:00,ARSON,INGLESIDE,200 Block of ONEIDA AV,-122.443009986764,37.7218704825421 +853212,2003-05-01 12:00:00,KIDNAPPING,SOUTHERN,6TH ST / MISSION ST,-122.408710606671,37.7809706721824 +853342,2003-05-01 02:30:00,KIDNAPPING,TENDERLOIN,200 Block of MCALLISTER ST,-122.415754575208,37.780719182394 +853461,2003-04-30 21:10:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +853503,2003-04-30 19:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +853537,2003-04-30 18:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +853839,2003-04-29 22:20:00,ARSON,TARAVAL,0 Block of MAJESTIC AV,-122.451269538376,37.7176252236615 +853843,2003-04-29 22:01:00,ARSON,BAYVIEW,200 Block of HARBOR RD,-122.378268018481,37.7323807302226 +853852,2003-04-29 21:32:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412054141237,37.7816136403158 +854055,2003-04-29 12:55:00,DRUNKENNESS,CENTRAL,100 Block of SUTTER ST,-122.403366417112,37.7899452996011 +854067,2003-04-29 11:52:00,ARSON,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +854220,2003-04-29 00:01:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +854265,2003-04-28 21:10:00,DRUNKENNESS,SOUTHERN,5TH ST / JESSIE ST,-122.407188558117,37.7832917166307 +854420,2003-04-28 14:00:00,ARSON,RICHMOND,2500 Block of SUTTER ST,-122.442364696255,37.7848750530811 +854604,2003-04-28 01:10:00,KIDNAPPING,TARAVAL,24TH AV / LINCOLN WY,-122.482614313605,37.7652086195031 +854605,2003-04-28 01:10:00,KIDNAPPING,TARAVAL,24TH AV / LINCOLN WY,-122.482614313605,37.7652086195031 +854672,2003-04-20 21:45:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +854785,2003-04-20 16:30:00,RUNAWAY,BAYVIEW,1300 Block of REVERE AV,-122.385545453301,37.728979731984 +854852,2003-04-20 12:11:00,DRUNKENNESS,NORTHERN,MARKET ST / VAN NESS AV,-122.419257894821,37.775146291631 +854998,2003-04-19 23:50:00,KIDNAPPING,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291898,37.7827931070777 +855219,2003-04-19 12:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +855246,2003-04-19 10:07:00,RUNAWAY,INGLESIDE,500 Block of ELLSWORTH ST,-122.414845755673,37.7365455566205 +855308,2003-04-19 02:08:00,DRUNKENNESS,CENTRAL,KEARNY ST / BROADWAY ST,-122.405475929238,37.7980180687515 +855321,2003-04-19 01:40:00,DRUNKENNESS,MISSION,22ND ST / FOLSOM ST,-122.414389290837,37.7557003660214 +855431,2003-04-18 21:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +855582,2003-04-18 15:00:00,KIDNAPPING,SOUTHERN,1300 Block of STEVENSON ST,-122.421594519119,37.7707674171464 +855617,2003-04-18 13:49:00,DRUNKENNESS,PARK,HAIGHT ST / CENTRAL AV,-122.443649925098,37.7704257255294 +855655,2003-04-18 12:00:00,KIDNAPPING,BAYVIEW,0 Block of WESTPOINT RD,-122.380291012279,37.7354366994577 +855694,2003-04-18 10:00:00,KIDNAPPING,MISSION,600 Block of SOUTH VAN NESS AV,-122.417323188551,37.76275002129989 +855773,2003-04-18 02:18:00,DRUNKENNESS,SOUTHERN,6TH ST / MINNA ST,-122.408162953864,37.780534538504895 +855829,2003-04-17 22:15:00,DRUNKENNESS,CENTRAL,700 Block of COMMERCIAL ST,-122.405469196315,37.7938704980849 +855878,2003-04-17 20:15:00,DRUNKENNESS,MISSION,3400 Block of 18TH ST,-122.419748993977,37.76186726489721 +856215,2003-04-16 23:37:00,DRUNKENNESS,SOUTHERN,800 Block of 3RD ST,-122.391425069857,37.7778727797586 +856281,2003-04-16 19:52:00,DRUNKENNESS,SOUTHERN,JULIA ST / MINNA ST,-122.411874120584,37.7776176280796 +856416,2003-04-16 14:19:00,DRUNKENNESS,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +856614,2003-04-15 22:04:00,DRUNKENNESS,RICHMOND,BUSH ST / DIVISADERO ST,-122.440064505019,37.7861779818596 +856630,2003-04-15 21:59:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +856871,2003-04-15 13:00:00,ARSON,RICHMOND,1800 Block of SCOTT ST,-122.438557871099,37.7868585831259 +856907,2003-04-15 11:45:00,KIDNAPPING,NORTHERN,600 Block of WILLOW ST,-122.42831052169,37.782362906932896 +857012,2003-04-15 02:10:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405087523335,37.7981219270604 +857071,2003-04-14 22:15:00,KIDNAPPING,MISSION,3200 Block of 19TH ST,-122.416472035359,37.760345374629104 +857136,2003-04-14 19:41:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +857192,2003-04-14 18:04:00,DRUNKENNESS,SOUTHERN,6TH ST / FOLSOM ST,-122.405618998029,37.778504519068896 +857440,2003-04-14 07:30:00,RUNAWAY,TARAVAL,2300 Block of 14TH AV,-122.470229789553,37.7442091849447 +857462,2003-04-14 03:52:00,DRUNKENNESS,NORTHERN,800 Block of OFARRELL ST,-122.418729600557,37.785007503993 +857483,2003-04-14 01:10:00,KIDNAPPING,SOUTHERN,11TH ST / FOLSOM ST,-122.414027262698,37.77186361772 +857504,2003-04-06 23:55:00,KIDNAPPING,TENDERLOIN,LARKIN ST / GROVE ST,-122.41658345614,37.7786591541279 +857745,2003-04-06 11:15:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +857813,2003-04-06 01:50:00,ARSON,PARK,1800 Block of PAGE ST,-122.451236373142,37.770359801981705 +857976,2003-04-05 18:17:00,KIDNAPPING,INGLESIDE,1800 Block of FELTON ST,-122.422865049723,37.72531632535609 +858015,2003-04-05 16:25:00,DRUNKENNESS,CENTRAL,600 Block of COLUMBUS AV,-122.410534621364,37.80061562136871 +858098,2003-04-05 13:00:00,RUNAWAY,MISSION,2400 Block of MARIPOSA ST,-122.407807660132,37.7630994299538 +858245,2003-04-05 01:00:00,DRUNKENNESS,SOUTHERN,400 Block of 6TH ST,-122.403671442177,37.77703244359461 +858845,2003-04-03 19:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +858914,2003-04-03 16:38:00,DRUNKENNESS,CENTRAL,700 Block of TAYLOR ST,-122.412050910036,37.7892738896382 +858947,2003-04-03 15:00:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +859171,2003-04-03 01:10:00,ARSON,RICHMOND,10TH AV / FULTON ST,-122.468022312478,37.773303938125 +859211,2003-04-02 23:00:00,DRUNKENNESS,TARAVAL,700 Block of GONZALEZ DR,-122.480676593174,37.7174238963871 +859284,2003-04-02 20:17:00,DRUNKENNESS,NORTHERN,1800 Block of STEINER ST,-122.435081863113,37.7863436701959 +859292,2003-04-02 19:54:00,DRUNKENNESS,SOUTHERN,900 Block of MARKET ST,-122.408421116922,37.7835699386918 +859310,2003-04-02 19:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +859550,2003-04-02 08:58:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +859562,2003-04-02 08:15:00,RUNAWAY,BAYVIEW,1400 Block of PHELPS ST,-122.394438859914,37.73644389967321 +859605,2003-04-02 01:20:00,ARSON,BAYVIEW,0 Block of LOOMIS ST,-122.403770475679,37.7431530818981 +860067,2003-04-01 07:45:00,DRUNKENNESS,MISSION,500 Block of VALENCIA ST,-122.421738508476,37.7640972229024 +860085,2003-04-01 04:31:00,DRUNKENNESS,CENTRAL,600 Block of BUSH ST,-122.407689581502,37.7902423892742 +860189,2003-03-31 22:08:00,DRUNKENNESS,NORTHERN,POST ST / FILLMORE ST,-122.433084166809,37.7851499161314 +860198,2003-03-31 21:26:00,ARSON,TARAVAL,300 Block of HOWTH ST,-122.451882643621,37.7191893908295 +860466,2003-03-31 08:49:00,DRUNKENNESS,TENDERLOIN,300 Block of HYDE ST,-122.41604728066002,37.7839824654149 +860542,2003-03-23 23:27:00,ARSON,BAYVIEW,0 Block of HUNTERS PT EXPWY EX,-122.376944786094,37.7330182195682 +860627,2003-03-23 18:57:00,DRUNKENNESS,INGLESIDE,200 Block of DUNCAN ST,-122.425774356023,37.7462234810272 +860807,2003-03-23 03:09:00,DRUNKENNESS,MISSION,23RD ST / MISSION ST,-122.418596727467,37.7538382048546 +860808,2003-03-23 03:08:00,DRUNKENNESS,NORTHERN,1500 Block of VAN NESS AV,-122.422062730287,37.789920002385 +860816,2003-03-23 02:23:00,DRUNKENNESS,CENTRAL,BROADWAY ST / COLUMBUS AV,-122.406669739958,37.797864174416496 +861018,2003-03-22 17:55:00,ARSON,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +861290,2003-03-21 21:20:00,DRUNKENNESS,CENTRAL,900 Block of BEACH ST,-122.424370033297,37.80620919936779 +861363,2003-03-21 18:15:00,ARSON,TARAVAL,47TH AV / VICENTE ST,-122.505426991879,37.7380011769515 +861466,2003-03-21 15:00:00,KIDNAPPING,INGLESIDE,300 Block of 27TH ST,-122.428107291128,37.7468832487341 +861470,2003-03-21 14:55:00,KIDNAPPING,SOUTHERN,800 Block of BRYANT ST,-122.403404791479,37.775420706711 +861555,2003-03-21 10:25:00,ARSON,BAYVIEW,400 Block of MANSELL ST,-122.406079770608,37.72041061847521 +861675,2003-03-20 21:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +861676,2003-03-20 21:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +861677,2003-03-20 21:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +862029,2003-03-20 08:30:00,RUNAWAY,INGLESIDE,0 Block of BURLWOOD DR,-122.454363730782,37.7347598143379 +862124,2003-03-19 22:20:00,DRUNKENNESS,CENTRAL,400 Block of GEARY ST,-122.41072162587,37.78709664956629 +862199,2003-03-19 18:15:00,DRUNKENNESS,PARK,2400 Block of FULTON ST,-122.457337524606,37.77448613966271 +862479,2003-03-18 22:05:00,ARSON,INGLESIDE,400 Block of BOSWORTH ST,-122.431570493591,37.7331092112315 +862606,2003-03-18 17:27:00,ARSON,BAYVIEW,RANKIN ST / CUSTER AV,-122.391057691871,37.7463639698082 +862656,2003-03-18 15:33:00,KIDNAPPING,CENTRAL,NORTH POINT ST / POWELL ST,-122.412143310592,37.8067579022602 +862711,2003-03-18 13:30:00,KIDNAPPING,BAYVIEW,OAKDALE AV / LANE ST,-122.388483092015,37.733535966259 +862827,2003-03-18 07:00:00,RUNAWAY,TARAVAL,200 Block of SADOWA ST,-122.460832957856,37.7123393549078 +862832,2003-03-18 07:00:00,KIDNAPPING,TENDERLOIN,400 Block of ELLIS ST,-122.413609328985,37.784696907904 +862867,2003-03-18 00:20:00,KIDNAPPING,RICHMOND,300 Block of ARGUELLO BL,-122.459156870347,37.7844209056208 +862915,2003-03-17 22:15:00,KIDNAPPING,INGLESIDE,200 Block of CRESCENT AV,-122.419891367771,37.7350965656968 +862928,2003-03-17 21:54:00,DRUNKENNESS,RICHMOND,400 Block of 4TH AV,-122.462000415583,37.78013349228871 +862939,2003-03-17 21:01:00,ARSON,RICHMOND,MARTIN LUTHER KING JR DR / LINCOLN WY,-122.509399613121,37.764029830100895 +862988,2003-03-17 19:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +863092,2003-03-17 15:30:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +863138,2003-03-17 12:36:00,DRUNKENNESS,PARK,700 Block of STANYAN ST,-122.453376250788,37.7687142722405 +863252,2003-03-17 03:00:00,ARSON,RICHMOND,3900 Block of GEARY BL,-122.461620169101,37.7812597610597 +863390,2003-03-09 19:30:00,KIDNAPPING,BAYVIEW,CASHMERE ST / DEDMAN CT,-122.385714359336,37.7366019184884 +863403,2003-03-09 19:20:00,ARSON,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +863405,2003-03-09 19:10:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675554,37.78139873406629 +863455,2003-03-09 16:00:00,KIDNAPPING,MISSION,300 Block of BARTLETT ST,-122.419545976524,37.75135238699001 +863603,2003-03-09 03:25:00,KIDNAPPING,SOUTHERN,300 Block of FOLSOM ST,-122.392976405511,37.7884089676788 +863661,2003-03-08 23:05:00,DRUNKENNESS,PARK,500 Block of DIVISADERO ST,-122.43782276166,37.7745216483936 +863783,2003-03-08 18:55:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +863919,2003-03-08 13:22:00,DRUNKENNESS,SOUTHERN,0 Block of UNITED NATIONS PZ,-122.414317857881,37.7799444052046 +864010,2003-03-08 06:20:00,DRUNKENNESS,PARK,300 Block of ROOSEVELT WY,-122.442869421813,37.764930777693294 +864073,2003-03-07 23:30:00,KIDNAPPING,TARAVAL,600 Block of PLYMOUTH AV,-122.456014204653,37.7162176142474 +864118,2003-03-07 21:38:00,DRUNKENNESS,CENTRAL,BROADWAY ST / KEARNY ST,-122.405475929238,37.7980180687515 +864246,2003-03-07 16:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +864253,2003-03-07 16:00:00,KIDNAPPING,PARK,300 Block of MASONIC AV,-122.446872959636,37.7781452956178 +864278,2003-03-07 14:39:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +864415,2003-03-07 09:26:00,DRUNKENNESS,TENDERLOIN,TAYLOR ST / EDDY ST,-122.410955248913,37.7841399509365 +864438,2003-03-07 08:27:00,KIDNAPPING,MISSION,3100 Block of CESAR CHAVEZ ST,-122.412594354828,37.748166005622295 +864561,2003-03-06 23:36:00,DRUNKENNESS,PARK,HAIGHT ST / DIVISADERO ST,-122.437048523408,37.7712678186418 +864703,2003-03-06 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +864736,2003-03-06 16:46:00,DRUNKENNESS,SOUTHERN,6TH ST / JESSIE ST,-122.409247675554,37.78139873406629 +864871,2003-03-06 09:30:00,KIDNAPPING,BAYVIEW,2200 Block of PALOU AV,-122.402502790279,37.740782282972496 +864944,2003-03-06 03:00:00,ARSON,INGLESIDE,100 Block of CUVIER ST,-122.42854078809602,37.7329064445593 +864987,2003-03-05 23:30:00,ARSON,INGLESIDE,200 Block of JOHN F SHELLEY DR,-122.423170347301,37.7226431761767 +865186,2003-03-05 15:00:00,ARSON,PARK,200 Block of NOE ST,-122.43314806477,37.7654653107492 +865198,2003-03-05 14:30:00,KIDNAPPING,MISSION,500 Block of DOLORES ST,-122.426153349478,37.7606186794333 +865260,2003-03-05 11:50:00,DRUNKENNESS,TENDERLOIN,200 Block of JONES ST,-122.412436901867,37.7834857455601 +865323,2003-03-05 08:32:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +865539,2003-03-04 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +865659,2003-03-04 14:15:00,DRUNKENNESS,TENDERLOIN,TURK ST / LEAVENWORTH ST,-122.414056291898,37.7827931070777 +865774,2003-03-04 09:30:00,KIDNAPPING,INGLESIDE,900 Block of NAPLES ST,-122.435829272049,37.7148100433377 +865906,2003-03-03 22:00:00,ARSON,MISSION,300 Block of POTRERO AV,-122.407544906452,37.7651192951994 +865944,2003-03-03 20:20:00,DRUNKENNESS,TENDERLOIN,100 Block of EDDY ST,-122.410157073911,37.7842973843312 +866074,2003-03-03 14:30:00,KIDNAPPING,BAYVIEW,1200 Block of HOLLISTER AV,-122.395178860156,37.7212137432262 +866131,2003-03-03 11:43:00,KIDNAPPING,INGLESIDE,MISSION ST / GUTTENBERG ST,-122.444570165608,37.712785099197895 +866145,2003-03-03 10:44:00,DRUNKENNESS,TENDERLOIN,0 Block of MCALLISTER ST,-122.413401299155,37.780906077687 +866161,2003-03-03 09:58:00,DRUNKENNESS,CENTRAL,COLUMBUS AV / VALLEJO ST,-122.407871572792,37.79869627427671 +866167,2003-03-03 09:47:00,DRUNKENNESS,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +866213,2003-03-03 04:19:00,ARSON,TARAVAL,2200 Block of 29TH AV,-122.486667576213,37.7453555419744 +866310,2003-02-23 21:00:00,KIDNAPPING,MISSION,500 Block of GUERRERO ST,-122.423761749548,37.76235859908021 +866367,2003-02-23 19:12:00,DRUNKENNESS,BAYVIEW,SILVER AV / SAN BRUNO AV,-122.405610268231,37.732438865014 +866596,2003-02-23 00:56:00,DRUNKENNESS,CENTRAL,GRANT AV / VALLEJO ST,-122.407208951409,37.7987756652507 +866879,2003-02-22 12:50:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +866898,2003-02-22 12:00:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +867239,2003-02-21 16:30:00,RUNAWAY,MISSION,900 Block of POTRERO AV,-122.406604919508,37.7571580431915 +867419,2003-02-21 07:35:00,DRUNKENNESS,TENDERLOIN,0 Block of JONES ST,-122.412192555721,37.7816045741252 +867452,2003-02-21 01:53:00,ARSON,INGLESIDE,0 Block of CORTLAND AV,-122.42124301162,37.7404397369084 +867476,2003-02-20 23:21:00,DRUNKENNESS,TENDERLOIN,200 Block of TURK ST,-122.413237516676,37.78284302332129 +867522,2003-02-20 21:38:00,DRUNKENNESS,MISSION,1900 Block of MISSION ST,-122.419814593811,37.7658427213372 +867884,2003-02-20 00:27:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +867936,2003-02-19 22:00:00,RUNAWAY,MISSION,1200 Block of HAMPSHIRE ST,-122.407282615949,37.7520889652054 +868202,2003-02-19 12:45:00,KIDNAPPING,INGLESIDE,600 Block of CAMPBELL AV,-122.408693777506,37.7159978968354 +868313,2003-02-19 06:54:00,ARSON,BAYVIEW,1100 Block of CARROLL AV,-122.384926170333,37.7202785995095 +868314,2003-02-19 06:54:00,ARSON,BAYVIEW,1100 Block of CARROLL AV,-122.384926170333,37.7202785995095 +868449,2003-02-18 20:00:00,ARSON,NORTHERN,1000 Block of GOUGH ST,-122.424134965201,37.7829560098764 +868535,2003-02-18 16:45:00,DRUNKENNESS,MISSION,3400 Block of 18TH ST,-122.419766234126,37.761756043077 +868602,2003-02-18 14:27:00,DRUNKENNESS,TENDERLOIN,300 Block of ELLIS ST,-122.411965795229,37.78491418595621 +868856,2003-02-17 23:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +868882,2003-02-17 21:42:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552609,37.7693505381832 +868983,2003-02-17 17:30:00,RUNAWAY,BAYVIEW,1500 Block of SHAFTER AV,-122.389768984951,37.7305636925712 +869278,2003-02-09 20:52:00,DRUNKENNESS,BAYVIEW,1600 Block of 17TH ST,-122.400162362987,37.7649810093866 +869421,2003-02-09 13:30:00,KIDNAPPING,TARAVAL,40TH AV / VICENTE ST,-122.497926351123,37.7383318785698 +869510,2003-02-09 07:30:00,KIDNAPPING,BAYVIEW,1700 Block of 26TH ST,-122.397388947833,37.7511708451997 +869566,2003-02-09 00:55:00,DRUNKENNESS,SOUTHERN,1000 Block of FOLSOM ST,-122.405834032593,37.778254811523 +869688,2003-02-08 18:20:00,DRUNKENNESS,SOUTHERN,500 Block of NATOMA ST,-122.408298620023,37.7797671147527 +869734,2003-02-08 16:00:00,RUNAWAY,TARAVAL,800 Block of CAPITOL AV,-122.459007287896,37.717858450682 +869749,2003-02-08 15:00:00,ARSON,MISSION,2500 Block of MARIPOSA ST,-122.408805452633,37.7631689864934 +869789,2003-02-08 12:59:00,ARSON,BAYVIEW,1400 Block of BANCROFT AV,-122.390046653224,37.7239782489915 +869795,2003-02-08 12:15:00,RUNAWAY,MISSION,1000 Block of POTRERO AV,-122.406539115148,37.7564864109309 +869845,2003-02-08 09:32:00,RUNAWAY,INGLESIDE,300 Block of HARVARD ST,-122.420052773679,37.725315786002 +869846,2003-02-08 09:32:00,RUNAWAY,INGLESIDE,300 Block of HARVARD ST,-122.420052773679,37.725315786002 +869914,2003-02-08 01:30:00,DRUNKENNESS,SOUTHERN,0 Block of NORFOLK ST,-122.413679181173,37.770852126436296 +869961,2003-02-07 23:43:00,DRUNKENNESS,MISSION,CLARION AL / MISSION ST,-122.419478247925,37.7630507677355 +870055,2003-02-07 20:16:00,DRUNKENNESS,MISSION,3300 Block of 18TH ST,-122.418830499608,37.7618127068587 +870076,2003-02-07 19:19:00,DRUNKENNESS,INGLESIDE,ONONDAGA AV / CAYUGA AV,-122.43976404828,37.72206939275971 +870078,2003-02-07 19:15:00,RUNAWAY,BAYVIEW,1100 Block of FITZGERALD AV,-122.390440681948,37.72041707725121 +870131,2003-02-07 17:30:00,RUNAWAY,NORTHERN,200 Block of HAIGHT ST,-122.426361992429,37.7726818428837 +870334,2003-02-07 10:00:00,DRUNKENNESS,TENDERLOIN,100 Block of TURK ST,-122.411615075408,37.7831614109395 +870417,2003-02-07 05:00:00,ARSON,MISSION,2000 Block of MISSION ST,-122.41965834371,37.7642205603745 +870426,2003-02-07 03:54:00,KIDNAPPING,PARK,1200 Block of DIVISADERO ST,-122.439142054187,37.7810486874604 +870427,2003-02-07 03:54:00,KIDNAPPING,PARK,1200 Block of DIVISADERO ST,-122.439142054187,37.7810486874604 +870479,2003-02-06 23:02:00,DRUNKENNESS,RICHMOND,6TH AV / GEARY BL,-122.464281231868,37.7810193159964 +870542,2003-02-06 21:18:00,DRUNKENNESS,INGLESIDE,SUNNYDALE AV / HAHN ST,-122.416000227914,37.711915543725 +870625,2003-02-06 18:50:00,DRUNKENNESS,INGLESIDE,0 Block of PHELAN AV,-122.452428220398,37.725717254655706 +870666,2003-02-06 17:22:00,DRUNKENNESS,PARK,1400 Block of HAIGHT ST,-122.446165617978,37.7701611813393 +870764,2003-02-06 13:19:00,DRUNKENNESS,TENDERLOIN,JONES ST / GOLDEN GATE AV,-122.412224164743,37.78207293118 +870901,2003-02-06 05:40:00,ARSON,TARAVAL,100 Block of LOBOS ST,-122.45758514144,37.7148630090118 +870937,2003-02-06 00:01:00,DRUNKENNESS,TENDERLOIN,200 Block of EDDY ST,-122.411800134753,37.7840890366868 +870987,2003-02-05 21:40:00,ARSON,INGLESIDE,600 Block of PRECITA AV,-122.409150981733,37.7478011070519 +871035,2003-02-05 19:10:00,ARSON,BAYVIEW,0 Block of SIERRA ST,-122.395625251047,37.7583783510206 +871172,2003-02-05 13:00:00,RUNAWAY,NORTHERN,1200 Block of STEINER ST,-122.433948989483,37.7807529783391 +871263,2003-02-05 08:35:00,RUNAWAY,INGLESIDE,200 Block of MOSCOW ST,-122.425836642921,37.723560959315904 +871277,2003-02-05 08:14:00,DRUNKENNESS,TENDERLOIN,0 Block of GOLDEN GATE AV,-122.411268613368,37.782250087316704 +871775,2003-02-04 01:32:00,ARSON,INGLESIDE,30TH ST / MISSION ST,-122.421970919038,37.7423752245575 +871791,2003-02-04 00:03:00,DRUNKENNESS,MISSION,24TH ST / CAPP ST,-122.417360139485,37.7523063170226 +872139,2003-02-03 08:28:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +872236,2003-01-26 22:30:00,DRUNKENNESS,INGLESIDE,MISSION ST / RANDALL ST,-122.423580687159,37.739884956627705 +872277,2003-01-26 20:30:00,RUNAWAY,MISSION,24TH ST / CHURCH ST,-122.42743972699,37.7517051328927 +872328,2003-01-26 17:20:00,DRUNKENNESS,MISSION,1800 Block of MISSION ST,-122.419832890144,37.7674625261825 +872339,2003-01-26 16:00:00,KIDNAPPING,BAYVIEW,CASHMERE ST / HUDSON AV,-122.383428564933,37.7358034176334 +872383,2003-01-26 13:46:00,DRUNKENNESS,MISSION,CESAR CHAVEZ ST / ALABAMA ST,-122.410549321729,37.7483157742907 +872393,2003-01-26 13:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +872399,2003-01-26 12:45:00,KIDNAPPING,CENTRAL,500 Block of COLUMBUS AV,-122.409667412997,37.7998691995985 +872502,2003-01-26 05:00:00,KIDNAPPING,BAYVIEW,1300 Block of PALOU AV,-122.38628498363998,37.7312896874195 +872662,2003-01-25 19:56:00,DRUNKENNESS,BAYVIEW,SILVER AV / CONKLING ST,-122.401808957199,37.7347280428589 +872689,2003-01-25 18:24:00,DRUNKENNESS,SOUTHERN,2ND ST / FEDERAL ST,-122.393085748407,37.7826509862064 +872690,2003-01-25 18:10:00,DRUNKENNESS,TENDERLOIN,100 Block of OFARRELL ST,-122.407244087032,37.7865647607685 +872712,2003-01-25 17:20:00,ARSON,CENTRAL,WASHINGTON ST / HYDE ST,-122.417940444727,37.7936819085534 +872900,2003-01-25 10:16:00,DRUNKENNESS,TENDERLOIN,0 Block of POWELL ST,-122.407845374111,37.7850943210103 +872962,2003-01-25 03:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +873000,2003-01-25 00:55:00,ARSON,BAYVIEW,1300 Block of YOSEMITE AV,-122.387111500224,37.7241125318769 +873012,2003-01-25 00:26:00,DRUNKENNESS,CENTRAL,500 Block of BROADWAY ST,-122.405863212632,37.7980228452184 +873031,2003-01-24 23:33:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +873113,2003-01-24 19:54:00,DRUNKENNESS,PARK,1800 Block of HAIGHT ST,-122.452706340322,37.7692156705894 +873158,2003-01-24 18:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +873373,2003-01-24 10:30:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +873408,2003-01-24 09:00:00,DRUNKENNESS,PARK,HAIGHT ST / COLE ST,-122.450709919118,37.7695262270744 +873424,2003-01-24 07:45:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +873426,2003-01-24 07:45:00,DRUNKENNESS,NORTHERN,1800 Block of PACIFIC AV,-122.425719698405,37.7945546414296 +873436,2003-01-24 06:50:00,RUNAWAY,TARAVAL,0 Block of HAROLD AV,-122.45315825844,37.71949760050229 +873483,2003-01-24 00:18:00,ARSON,BAYVIEW,2000 Block of BAY SHORE BL,-122.399128823397,37.7145317461379 +873531,2003-01-23 22:15:00,RUNAWAY,INGLESIDE,300 Block of CAMBRIDGE ST,-122.418712945071,37.7269973783628 +873555,2003-01-23 21:20:00,DRUNKENNESS,PARK,GOLDEN GATE AV / DIVISADERO ST,-122.438554633172,37.7787229432976 +873628,2003-01-23 18:45:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +873736,2003-01-23 14:04:00,DRUNKENNESS,PARK,CARL ST / COLE ST,-122.449958075222,37.7658000842636 +873981,2003-01-22 22:21:00,DRUNKENNESS,PARK,HAIGHT ST / SHRADER ST,-122.451864552609,37.7693505381832 +874536,2003-01-21 17:40:00,KIDNAPPING,TENDERLOIN,100 Block of ELLIS ST,-122.409093228545,37.7853898217787 +874710,2003-01-21 09:00:00,KIDNAPPING,CENTRAL,0 Block of CARD AL,-122.409197106535,37.79894542092679 +874778,2003-01-21 00:49:00,DRUNKENNESS,INGLESIDE,3200 Block of MISSION ST,-122.42039487496,37.744688222803 +874918,2003-01-20 18:20:00,DRUNKENNESS,SOUTHERN,0 Block of 4TH ST,-122.404956956375,37.785117856395296 +875171,2003-01-20 01:29:00,ARSON,BAYVIEW,100 Block of CAMERON WY,-122.387181635995,37.7209669615499 +875212,2003-01-12 23:06:00,DRUNKENNESS,CENTRAL,POST ST / HYDE ST,-122.416642370012,37.787245037792 +875255,2003-01-12 20:15:00,DRUNKENNESS,CENTRAL,400 Block of MASON ST,-122.409975934084,37.7873068903633 +875358,2003-01-12 14:30:00,ARSON,RICHMOND,2400 Block of POST ST,-122.442195536411,37.78405418571021 +875430,2003-01-12 09:11:00,DRUNKENNESS,NORTHERN,GEARY ST / VAN NESS AV,-122.421395819122,37.7856843389243 +875477,2003-01-12 02:20:00,DRUNKENNESS,NORTHERN,FILLMORE ST / GEARY BL,-122.432914603466,37.7843533426344 +875530,2003-01-11 23:30:00,ARSON,INGLESIDE,600 Block of PRENTISS ST,-122.412465904842,37.7352383622147 +875531,2003-01-11 23:30:00,ARSON,INGLESIDE,600 Block of PRENTISS ST,-122.412465904842,37.7352383622147 +875559,2003-01-11 22:19:00,DRUNKENNESS,NORTHERN,GROVE ST / BUCHANAN ST,-122.428104235503,37.7771774966705 +875585,2003-01-11 21:10:00,DRUNKENNESS,RICHMOND,700 Block of 38TH AV,-122.498247230843,37.7747185410423 +875656,2003-01-11 17:30:00,RUNAWAY,TARAVAL,0 Block of JULES AV,-122.461163238283,37.7191248815986 +875700,2003-01-11 15:36:00,DRUNKENNESS,INGLESIDE,4700 Block of MISSION ST,-122.437393972517,37.7214120621391 +875770,2003-01-11 10:50:00,KIDNAPPING,TARAVAL,2000 Block of 19TH AV,-122.476226693275,37.7495560085762 +875837,2003-01-11 03:00:00,RUNAWAY,MISSION,2800 Block of 20TH ST,-122.409339956715,37.7591650544951 +875947,2003-01-10 21:44:00,DRUNKENNESS,TENDERLOIN,POWELL ST / OFARRELL ST,-122.408040474865,37.7864094033389 +875960,2003-01-10 21:00:00,DRUNKENNESS,TENDERLOIN,400 Block of OFARRELL ST,-122.411742515582,37.7858882195106 +875998,2003-01-10 19:36:00,DRUNKENNESS,PARK,800 Block of MASONIC AV,-122.446063558284,37.7734476992724 +876226,2003-01-10 08:09:00,DRUNKENNESS,TENDERLOIN,0 Block of TURK ST,-122.409853729941,37.7833862379382 +876271,2003-01-10 01:35:00,ARSON,BAYVIEW,1000 Block of GRIFFITH ST,-122.378920771859,37.7286119710993 +876427,2003-01-09 17:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +876428,2003-01-09 17:00:00,RUNAWAY,BAYVIEW,200 Block of CONNECTICUT ST,-122.397621727664,37.7631413193261 +876485,2003-01-09 14:00:00,RUNAWAY,CENTRAL,800 Block of PACIFIC AV,-122.409652663162,37.7964914531604 +876714,2003-01-08 23:00:00,RUNAWAY,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 +876728,2003-01-08 22:20:00,ARSON,MISSION,23RD ST / SHOTWELL ST,-122.415321995528,37.75403431110861 +876843,2003-01-08 18:40:00,RUNAWAY,NORTHERN,2600 Block of VAN NESS AV,-122.42409575188,37.7999814623722 +876845,2003-01-08 18:30:00,DRUNKENNESS,PARK,1700 Block of FULTON ST,-122.445652525154,37.7759612670837 +876967,2003-01-08 14:00:00,RUNAWAY,INGLESIDE,600 Block of PRENTISS ST,-122.412465904842,37.7352383622147 +877064,2003-01-08 10:12:00,DRUNKENNESS,BAYVIEW,JERROLD AV / BARNEVELD AV,-122.402701071841,37.746335866874105 +877134,2003-01-08 07:45:00,DRUNKENNESS,CENTRAL,0 Block of DRUMM ST,-122.396556426173,37.7941169057941 +877224,2003-01-08 00:02:00,DRUNKENNESS,CENTRAL,500 Block of GREEN ST,-122.40860321116,37.7995998106551 +877238,2003-01-07 23:08:00,KIDNAPPING,BAYVIEW,100 Block of PENNSYLVANIA AV,-122.393856471064,37.7646445464559 +877242,2003-01-07 22:57:00,DRUNKENNESS,CENTRAL,400 Block of BROADWAY ST,-122.405065483077,37.7980134745487 +877516,2003-01-07 11:19:00,DRUNKENNESS,INGLESIDE,4600 Block of MISSION ST,-122.435041282959,37.72425604704209 +877621,2003-01-07 02:30:00,KIDNAPPING,SOUTHERN,100 Block of 6TH ST,-122.408466556173,37.7807008318778 +877637,2003-01-07 00:11:00,DRUNKENNESS,PARK,1200 Block of PAGE ST,-122.441393701114,37.77172731417711 diff --git a/examples/data/sf_crime.parquet/._SUCCESS.crc b/examples/data/sf_crime.parquet/._SUCCESS.crc new file mode 100644 index 00000000..3b7b0449 Binary files /dev/null and b/examples/data/sf_crime.parquet/._SUCCESS.crc differ diff --git a/examples/data/sf_crime.parquet/.part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet.crc b/examples/data/sf_crime.parquet/.part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet.crc new file mode 100644 index 00000000..2251ea25 Binary files /dev/null and b/examples/data/sf_crime.parquet/.part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet.crc differ diff --git a/.tox/.package.lock b/examples/data/sf_crime.parquet/_SUCCESS old mode 100755 new mode 100644 similarity index 100% rename from .tox/.package.lock rename to examples/data/sf_crime.parquet/_SUCCESS diff --git a/examples/data/sf_crime.parquet/part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet b/examples/data/sf_crime.parquet/part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet new file mode 100644 index 00000000..5aec05a6 Binary files /dev/null and b/examples/data/sf_crime.parquet/part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet differ diff --git a/examples/data/titanic.csv b/examples/data/titanic.csv new file mode 100644 index 00000000..bfdd9380 --- /dev/null +++ b/examples/data/titanic.csv @@ -0,0 +1,892 @@ +Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked +0,3,"Braund, Mr. Owen Harris",male,22.0,1,0,A/5 21171,7.25,,S +1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38.0,1,0,PC 17599,71.2833,C85,C +1,3,"Heikkinen, Miss. Laina",female,26.0,0,0,STON/O2. 3101282,7.925,,S +1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35.0,1,0,113803,53.1,C123,S +0,3,"Allen, Mr. William Henry",male,35.0,0,0,373450,8.05,,S +0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q +0,1,"McCarthy, Mr. Timothy J",male,54.0,0,0,17463,51.8625,E46,S +0,3,"Palsson, Master. Gosta Leonard",male,2.0,3,1,349909,21.075,,S +1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27.0,0,2,347742,11.1333,,S +1,2,"Nasser, Mrs. Nicholas (Adele Achem)",female,14.0,1,0,237736,30.0708,,C +1,3,"Sandstrom, Miss. Marguerite Rut",female,4.0,1,1,PP 9549,16.7,G6,S +1,1,"Bonnell, Miss. Elizabeth",female,58.0,0,0,113783,26.55,C103,S +0,3,"Saundercock, Mr. William Henry",male,20.0,0,0,A/5. 2151,8.05,,S +0,3,"Andersson, Mr. Anders Johan",male,39.0,1,5,347082,31.275,,S +0,3,"Vestrom, Miss. Hulda Amanda Adolfina",female,14.0,0,0,350406,7.8542,,S +1,2,"Hewlett, Mrs. (Mary D Kingcome) ",female,55.0,0,0,248706,16.0,,S +0,3,"Rice, Master. Eugene",male,2.0,4,1,382652,29.125,,Q +1,2,"Williams, Mr. Charles Eugene",male,,0,0,244373,13.0,,S +0,3,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)",female,31.0,1,0,345763,18.0,,S +1,3,"Masselmani, Mrs. Fatima",female,,0,0,2649,7.225,,C +0,2,"Fynney, Mr. Joseph J",male,35.0,0,0,239865,26.0,,S +1,2,"Beesley, Mr. Lawrence",male,34.0,0,0,248698,13.0,D56,S +1,3,"McGowan, Miss. Anna ""Annie""",female,15.0,0,0,330923,8.0292,,Q +1,1,"Sloper, Mr. William Thompson",male,28.0,0,0,113788,35.5,A6,S +0,3,"Palsson, Miss. Torborg Danira",female,8.0,3,1,349909,21.075,,S +1,3,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)",female,38.0,1,5,347077,31.3875,,S +0,3,"Emir, Mr. Farred Chehab",male,,0,0,2631,7.225,,C +0,1,"Fortune, Mr. Charles Alexander",male,19.0,3,2,19950,263.0,C23 C25 C27,S +1,3,"O'Dwyer, Miss. Ellen ""Nellie""",female,,0,0,330959,7.8792,,Q +0,3,"Todoroff, Mr. Lalio",male,,0,0,349216,7.8958,,S +0,1,"Uruchurtu, Don. Manuel E",male,40.0,0,0,PC 17601,27.7208,,C +1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)",female,,1,0,PC 17569,146.5208,B78,C +1,3,"Glynn, Miss. Mary Agatha",female,,0,0,335677,7.75,,Q +0,2,"Wheadon, Mr. Edward H",male,66.0,0,0,C.A. 24579,10.5,,S +0,1,"Meyer, Mr. Edgar Joseph",male,28.0,1,0,PC 17604,82.1708,,C +0,1,"Holverson, Mr. Alexander Oskar",male,42.0,1,0,113789,52.0,,S +1,3,"Mamee, Mr. Hanna",male,,0,0,2677,7.2292,,C +0,3,"Cann, Mr. Ernest Charles",male,21.0,0,0,A./5. 2152,8.05,,S +0,3,"Vander Planke, Miss. Augusta Maria",female,18.0,2,0,345764,18.0,,S +1,3,"Nicola-Yarred, Miss. Jamila",female,14.0,1,0,2651,11.2417,,C +0,3,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)",female,40.0,1,0,7546,9.475,,S +0,2,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)",female,27.0,1,0,11668,21.0,,S +0,3,"Kraeff, Mr. Theodor",male,,0,0,349253,7.8958,,C +1,2,"Laroche, Miss. Simonne Marie Anne Andree",female,3.0,1,2,SC/Paris 2123,41.5792,,C +1,3,"Devaney, Miss. Margaret Delia",female,19.0,0,0,330958,7.8792,,Q +0,3,"Rogers, Mr. William John",male,,0,0,S.C./A.4. 23567,8.05,,S +0,3,"Lennon, Mr. Denis",male,,1,0,370371,15.5,,Q +1,3,"O'Driscoll, Miss. Bridget",female,,0,0,14311,7.75,,Q +0,3,"Samaan, Mr. Youssef",male,,2,0,2662,21.6792,,C +0,3,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)",female,18.0,1,0,349237,17.8,,S +0,3,"Panula, Master. Juha Niilo",male,7.0,4,1,3101295,39.6875,,S +0,3,"Nosworthy, Mr. Richard Cater",male,21.0,0,0,A/4. 39886,7.8,,S +1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)",female,49.0,1,0,PC 17572,76.7292,D33,C +1,2,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)",female,29.0,1,0,2926,26.0,,S +0,1,"Ostby, Mr. Engelhart Cornelius",male,65.0,0,1,113509,61.9792,B30,C +1,1,"Woolner, Mr. Hugh",male,,0,0,19947,35.5,C52,S +1,2,"Rugg, Miss. Emily",female,21.0,0,0,C.A. 31026,10.5,,S +0,3,"Novel, Mr. Mansouer",male,28.5,0,0,2697,7.2292,,C +1,2,"West, Miss. Constance Mirium",female,5.0,1,2,C.A. 34651,27.75,,S +0,3,"Goodwin, Master. William Frederick",male,11.0,5,2,CA 2144,46.9,,S +0,3,"Sirayanian, Mr. Orsen",male,22.0,0,0,2669,7.2292,,C +1,1,"Icard, Miss. Amelie",female,38.0,0,0,113572,80.0,B28, +0,1,"Harris, Mr. Henry Birkhardt",male,45.0,1,0,36973,83.475,C83,S +0,3,"Skoog, Master. Harald",male,4.0,3,2,347088,27.9,,S +0,1,"Stewart, Mr. Albert A",male,,0,0,PC 17605,27.7208,,C +1,3,"Moubarek, Master. Gerios",male,,1,1,2661,15.2458,,C +1,2,"Nye, Mrs. (Elizabeth Ramell)",female,29.0,0,0,C.A. 29395,10.5,F33,S +0,3,"Crease, Mr. Ernest James",male,19.0,0,0,S.P. 3464,8.1583,,S +1,3,"Andersson, Miss. Erna Alexandra",female,17.0,4,2,3101281,7.925,,S +0,3,"Kink, Mr. Vincenz",male,26.0,2,0,315151,8.6625,,S +0,2,"Jenkin, Mr. Stephen Curnow",male,32.0,0,0,C.A. 33111,10.5,,S +0,3,"Goodwin, Miss. Lillian Amy",female,16.0,5,2,CA 2144,46.9,,S +0,2,"Hood, Mr. Ambrose Jr",male,21.0,0,0,S.O.C. 14879,73.5,,S +0,3,"Chronopoulos, Mr. Apostolos",male,26.0,1,0,2680,14.4542,,C +1,3,"Bing, Mr. Lee",male,32.0,0,0,1601,56.4958,,S +0,3,"Moen, Mr. Sigurd Hansen",male,25.0,0,0,348123,7.65,F G73,S +0,3,"Staneff, Mr. Ivan",male,,0,0,349208,7.8958,,S +0,3,"Moutal, Mr. Rahamin Haim",male,,0,0,374746,8.05,,S +1,2,"Caldwell, Master. Alden Gates",male,0.83,0,2,248738,29.0,,S +1,3,"Dowdell, Miss. Elizabeth",female,30.0,0,0,364516,12.475,,S +0,3,"Waelens, Mr. Achille",male,22.0,0,0,345767,9.0,,S +1,3,"Sheerlinck, Mr. Jan Baptist",male,29.0,0,0,345779,9.5,,S +1,3,"McDermott, Miss. Brigdet Delia",female,,0,0,330932,7.7875,,Q +0,1,"Carrau, Mr. Francisco M",male,28.0,0,0,113059,47.1,,S +1,2,"Ilett, Miss. Bertha",female,17.0,0,0,SO/C 14885,10.5,,S +1,3,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)",female,33.0,3,0,3101278,15.85,,S +0,3,"Ford, Mr. William Neal",male,16.0,1,3,W./C. 6608,34.375,,S +0,3,"Slocovski, Mr. Selman Francis",male,,0,0,SOTON/OQ 392086,8.05,,S +1,1,"Fortune, Miss. Mabel Helen",female,23.0,3,2,19950,263.0,C23 C25 C27,S +0,3,"Celotti, Mr. Francesco",male,24.0,0,0,343275,8.05,,S +0,3,"Christmann, Mr. Emil",male,29.0,0,0,343276,8.05,,S +0,3,"Andreasson, Mr. Paul Edvin",male,20.0,0,0,347466,7.8542,,S +0,1,"Chaffee, Mr. Herbert Fuller",male,46.0,1,0,W.E.P. 5734,61.175,E31,S +0,3,"Dean, Mr. Bertram Frank",male,26.0,1,2,C.A. 2315,20.575,,S +0,3,"Coxon, Mr. Daniel",male,59.0,0,0,364500,7.25,,S +0,3,"Shorney, Mr. Charles Joseph",male,,0,0,374910,8.05,,S +0,1,"Goldschmidt, Mr. George B",male,71.0,0,0,PC 17754,34.6542,A5,C +1,1,"Greenfield, Mr. William Bertram",male,23.0,0,1,PC 17759,63.3583,D10 D12,C +1,2,"Doling, Mrs. John T (Ada Julia Bone)",female,34.0,0,1,231919,23.0,,S +0,2,"Kantor, Mr. Sinai",male,34.0,1,0,244367,26.0,,S +0,3,"Petranec, Miss. Matilda",female,28.0,0,0,349245,7.8958,,S +0,3,"Petroff, Mr. Pastcho (""Pentcho"")",male,,0,0,349215,7.8958,,S +0,1,"White, Mr. Richard Frasar",male,21.0,0,1,35281,77.2875,D26,S +0,3,"Johansson, Mr. Gustaf Joel",male,33.0,0,0,7540,8.6542,,S +0,3,"Gustafsson, Mr. Anders Vilhelm",male,37.0,2,0,3101276,7.925,,S +0,3,"Mionoff, Mr. Stoytcho",male,28.0,0,0,349207,7.8958,,S +1,3,"Salkjelsvik, Miss. Anna Kristine",female,21.0,0,0,343120,7.65,,S +1,3,"Moss, Mr. Albert Johan",male,,0,0,312991,7.775,,S +0,3,"Rekic, Mr. Tido",male,38.0,0,0,349249,7.8958,,S +1,3,"Moran, Miss. Bertha",female,,1,0,371110,24.15,,Q +0,1,"Porter, Mr. Walter Chamberlain",male,47.0,0,0,110465,52.0,C110,S +0,3,"Zabour, Miss. Hileni",female,14.5,1,0,2665,14.4542,,C +0,3,"Barton, Mr. David John",male,22.0,0,0,324669,8.05,,S +0,3,"Jussila, Miss. Katriina",female,20.0,1,0,4136,9.825,,S +0,3,"Attalah, Miss. Malake",female,17.0,0,0,2627,14.4583,,C +0,3,"Pekoniemi, Mr. Edvard",male,21.0,0,0,STON/O 2. 3101294,7.925,,S +0,3,"Connors, Mr. Patrick",male,70.5,0,0,370369,7.75,,Q +0,2,"Turpin, Mr. William John Robert",male,29.0,1,0,11668,21.0,,S +0,1,"Baxter, Mr. Quigg Edmond",male,24.0,0,1,PC 17558,247.5208,B58 B60,C +0,3,"Andersson, Miss. Ellis Anna Maria",female,2.0,4,2,347082,31.275,,S +0,2,"Hickman, Mr. Stanley George",male,21.0,2,0,S.O.C. 14879,73.5,,S +0,3,"Moore, Mr. Leonard Charles",male,,0,0,A4. 54510,8.05,,S +0,2,"Nasser, Mr. Nicholas",male,32.5,1,0,237736,30.0708,,C +1,2,"Webber, Miss. Susan",female,32.5,0,0,27267,13.0,E101,S +0,1,"White, Mr. Percival Wayland",male,54.0,0,1,35281,77.2875,D26,S +1,3,"Nicola-Yarred, Master. Elias",male,12.0,1,0,2651,11.2417,,C +0,3,"McMahon, Mr. Martin",male,,0,0,370372,7.75,,Q +1,3,"Madsen, Mr. Fridtjof Arne",male,24.0,0,0,C 17369,7.1417,,S +1,3,"Peter, Miss. Anna",female,,1,1,2668,22.3583,F E69,C +0,3,"Ekstrom, Mr. Johan",male,45.0,0,0,347061,6.975,,S +0,3,"Drazenoic, Mr. Jozef",male,33.0,0,0,349241,7.8958,,C +0,3,"Coelho, Mr. Domingos Fernandeo",male,20.0,0,0,SOTON/O.Q. 3101307,7.05,,S +0,3,"Robins, Mrs. Alexander A (Grace Charity Laury)",female,47.0,1,0,A/5. 3337,14.5,,S +1,2,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)",female,29.0,1,0,228414,26.0,,S +0,2,"Sobey, Mr. Samuel James Hayden",male,25.0,0,0,C.A. 29178,13.0,,S +0,2,"Richard, Mr. Emile",male,23.0,0,0,SC/PARIS 2133,15.0458,,C +1,1,"Newsom, Miss. Helen Monypeny",female,19.0,0,2,11752,26.2833,D47,S +0,1,"Futrelle, Mr. Jacques Heath",male,37.0,1,0,113803,53.1,C123,S +0,3,"Osen, Mr. Olaf Elon",male,16.0,0,0,7534,9.2167,,S +0,1,"Giglio, Mr. Victor",male,24.0,0,0,PC 17593,79.2,B86,C +0,3,"Boulos, Mrs. Joseph (Sultana)",female,,0,2,2678,15.2458,,C +1,3,"Nysten, Miss. Anna Sofia",female,22.0,0,0,347081,7.75,,S +1,3,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)",female,24.0,1,0,STON/O2. 3101279,15.85,,S +0,3,"Burke, Mr. Jeremiah",male,19.0,0,0,365222,6.75,,Q +0,2,"Andrew, Mr. Edgardo Samuel",male,18.0,0,0,231945,11.5,,S +0,2,"Nicholls, Mr. Joseph Charles",male,19.0,1,1,C.A. 33112,36.75,,S +1,3,"Andersson, Mr. August Edvard (""Wennerstrom"")",male,27.0,0,0,350043,7.7958,,S +0,3,"Ford, Miss. Robina Maggie ""Ruby""",female,9.0,2,2,W./C. 6608,34.375,,S +0,2,"Navratil, Mr. Michel (""Louis M Hoffman"")",male,36.5,0,2,230080,26.0,F2,S +0,2,"Byles, Rev. Thomas Roussel Davids",male,42.0,0,0,244310,13.0,,S +0,2,"Bateman, Rev. Robert James",male,51.0,0,0,S.O.P. 1166,12.525,,S +1,1,"Pears, Mrs. Thomas (Edith Wearne)",female,22.0,1,0,113776,66.6,C2,S +0,3,"Meo, Mr. Alfonzo",male,55.5,0,0,A.5. 11206,8.05,,S +0,3,"van Billiard, Mr. Austin Blyler",male,40.5,0,2,A/5. 851,14.5,,S +0,3,"Olsen, Mr. Ole Martin",male,,0,0,Fa 265302,7.3125,,S +0,1,"Williams, Mr. Charles Duane",male,51.0,0,1,PC 17597,61.3792,,C +1,3,"Gilnagh, Miss. Katherine ""Katie""",female,16.0,0,0,35851,7.7333,,Q +0,3,"Corn, Mr. Harry",male,30.0,0,0,SOTON/OQ 392090,8.05,,S +0,3,"Smiljanic, Mr. Mile",male,,0,0,315037,8.6625,,S +0,3,"Sage, Master. Thomas Henry",male,,8,2,CA. 2343,69.55,,S +0,3,"Cribb, Mr. John Hatfield",male,44.0,0,1,371362,16.1,,S +1,2,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)",female,40.0,0,0,C.A. 33595,15.75,,S +0,3,"Bengtsson, Mr. John Viktor",male,26.0,0,0,347068,7.775,,S +0,3,"Calic, Mr. Jovo",male,17.0,0,0,315093,8.6625,,S +0,3,"Panula, Master. Eino Viljami",male,1.0,4,1,3101295,39.6875,,S +1,3,"Goldsmith, Master. Frank John William ""Frankie""",male,9.0,0,2,363291,20.525,,S +1,1,"Chibnall, Mrs. (Edith Martha Bowerman)",female,,0,1,113505,55.0,E33,S +0,3,"Skoog, Mrs. William (Anna Bernhardina Karlsson)",female,45.0,1,4,347088,27.9,,S +0,1,"Baumann, Mr. John D",male,,0,0,PC 17318,25.925,,S +0,3,"Ling, Mr. Lee",male,28.0,0,0,1601,56.4958,,S +0,1,"Van der hoef, Mr. Wyckoff",male,61.0,0,0,111240,33.5,B19,S +0,3,"Rice, Master. Arthur",male,4.0,4,1,382652,29.125,,Q +1,3,"Johnson, Miss. Eleanor Ileen",female,1.0,1,1,347742,11.1333,,S +0,3,"Sivola, Mr. Antti Wilhelm",male,21.0,0,0,STON/O 2. 3101280,7.925,,S +0,1,"Smith, Mr. James Clinch",male,56.0,0,0,17764,30.6958,A7,C +0,3,"Klasen, Mr. Klas Albin",male,18.0,1,1,350404,7.8542,,S +0,3,"Lefebre, Master. Henry Forbes",male,,3,1,4133,25.4667,,S +0,1,"Isham, Miss. Ann Elizabeth",female,50.0,0,0,PC 17595,28.7125,C49,C +0,2,"Hale, Mr. Reginald",male,30.0,0,0,250653,13.0,,S +0,3,"Leonard, Mr. Lionel",male,36.0,0,0,LINE,0.0,,S +0,3,"Sage, Miss. Constance Gladys",female,,8,2,CA. 2343,69.55,,S +0,2,"Pernot, Mr. Rene",male,,0,0,SC/PARIS 2131,15.05,,C +0,3,"Asplund, Master. Clarence Gustaf Hugo",male,9.0,4,2,347077,31.3875,,S +1,2,"Becker, Master. Richard F",male,1.0,2,1,230136,39.0,F4,S +1,3,"Kink-Heilmann, Miss. Luise Gretchen",female,4.0,0,2,315153,22.025,,S +0,1,"Rood, Mr. Hugh Roscoe",male,,0,0,113767,50.0,A32,S +1,3,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)",female,,1,0,370365,15.5,,Q +1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")",male,45.0,0,0,111428,26.55,,S +0,3,"Bourke, Mr. John",male,40.0,1,1,364849,15.5,,Q +0,3,"Turcin, Mr. Stjepan",male,36.0,0,0,349247,7.8958,,S +1,2,"Pinsky, Mrs. (Rosa)",female,32.0,0,0,234604,13.0,,S +0,2,"Carbines, Mr. William",male,19.0,0,0,28424,13.0,,S +1,3,"Andersen-Jensen, Miss. Carla Christine Nielsine",female,19.0,1,0,350046,7.8542,,S +1,2,"Navratil, Master. Michel M",male,3.0,1,1,230080,26.0,F2,S +1,1,"Brown, Mrs. James Joseph (Margaret Tobin)",female,44.0,0,0,PC 17610,27.7208,B4,C +1,1,"Lurette, Miss. Elise",female,58.0,0,0,PC 17569,146.5208,B80,C +0,3,"Mernagh, Mr. Robert",male,,0,0,368703,7.75,,Q +0,3,"Olsen, Mr. Karl Siegwart Andreas",male,42.0,0,1,4579,8.4042,,S +1,3,"Madigan, Miss. Margaret ""Maggie""",female,,0,0,370370,7.75,,Q +0,2,"Yrois, Miss. Henriette (""Mrs Harbeck"")",female,24.0,0,0,248747,13.0,,S +0,3,"Vande Walle, Mr. Nestor Cyriel",male,28.0,0,0,345770,9.5,,S +0,3,"Sage, Mr. Frederick",male,,8,2,CA. 2343,69.55,,S +0,3,"Johanson, Mr. Jakob Alfred",male,34.0,0,0,3101264,6.4958,,S +0,3,"Youseff, Mr. Gerious",male,45.5,0,0,2628,7.225,,C +1,3,"Cohen, Mr. Gurshon ""Gus""",male,18.0,0,0,A/5 3540,8.05,,S +0,3,"Strom, Miss. Telma Matilda",female,2.0,0,1,347054,10.4625,G6,S +0,3,"Backstrom, Mr. Karl Alfred",male,32.0,1,0,3101278,15.85,,S +1,3,"Albimona, Mr. Nassef Cassem",male,26.0,0,0,2699,18.7875,,C +1,3,"Carr, Miss. Helen ""Ellen""",female,16.0,0,0,367231,7.75,,Q +1,1,"Blank, Mr. Henry",male,40.0,0,0,112277,31.0,A31,C +0,3,"Ali, Mr. Ahmed",male,24.0,0,0,SOTON/O.Q. 3101311,7.05,,S +1,2,"Cameron, Miss. Clear Annie",female,35.0,0,0,F.C.C. 13528,21.0,,S +0,3,"Perkin, Mr. John Henry",male,22.0,0,0,A/5 21174,7.25,,S +0,2,"Givard, Mr. Hans Kristensen",male,30.0,0,0,250646,13.0,,S +0,3,"Kiernan, Mr. Philip",male,,1,0,367229,7.75,,Q +1,1,"Newell, Miss. Madeleine",female,31.0,1,0,35273,113.275,D36,C +1,3,"Honkanen, Miss. Eliina",female,27.0,0,0,STON/O2. 3101283,7.925,,S +0,2,"Jacobsohn, Mr. Sidney Samuel",male,42.0,1,0,243847,27.0,,S +1,1,"Bazzani, Miss. Albina",female,32.0,0,0,11813,76.2917,D15,C +0,2,"Harris, Mr. Walter",male,30.0,0,0,W/C 14208,10.5,,S +1,3,"Sunderland, Mr. Victor Francis",male,16.0,0,0,SOTON/OQ 392089,8.05,,S +0,2,"Bracken, Mr. James H",male,27.0,0,0,220367,13.0,,S +0,3,"Green, Mr. George Henry",male,51.0,0,0,21440,8.05,,S +0,3,"Nenkoff, Mr. Christo",male,,0,0,349234,7.8958,,S +1,1,"Hoyt, Mr. Frederick Maxfield",male,38.0,1,0,19943,90.0,C93,S +0,3,"Berglund, Mr. Karl Ivar Sven",male,22.0,0,0,PP 4348,9.35,,S +1,2,"Mellors, Mr. William John",male,19.0,0,0,SW/PP 751,10.5,,S +0,3,"Lovell, Mr. John Hall (""Henry"")",male,20.5,0,0,A/5 21173,7.25,,S +0,2,"Fahlstrom, Mr. Arne Jonas",male,18.0,0,0,236171,13.0,,S +0,3,"Lefebre, Miss. Mathilde",female,,3,1,4133,25.4667,,S +1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)",female,35.0,1,0,36973,83.475,C83,S +0,3,"Larsson, Mr. Bengt Edvin",male,29.0,0,0,347067,7.775,,S +0,2,"Sjostedt, Mr. Ernst Adolf",male,59.0,0,0,237442,13.5,,S +1,3,"Asplund, Miss. Lillian Gertrud",female,5.0,4,2,347077,31.3875,,S +0,2,"Leyson, Mr. Robert William Norman",male,24.0,0,0,C.A. 29566,10.5,,S +0,3,"Harknett, Miss. Alice Phoebe",female,,0,0,W./C. 6609,7.55,,S +0,2,"Hold, Mr. Stephen",male,44.0,1,0,26707,26.0,,S +1,2,"Collyer, Miss. Marjorie ""Lottie""",female,8.0,0,2,C.A. 31921,26.25,,S +0,2,"Pengelly, Mr. Frederick William",male,19.0,0,0,28665,10.5,,S +0,2,"Hunt, Mr. George Henry",male,33.0,0,0,SCO/W 1585,12.275,,S +0,3,"Zabour, Miss. Thamine",female,,1,0,2665,14.4542,,C +1,3,"Murphy, Miss. Katherine ""Kate""",female,,1,0,367230,15.5,,Q +0,2,"Coleridge, Mr. Reginald Charles",male,29.0,0,0,W./C. 14263,10.5,,S +0,3,"Maenpaa, Mr. Matti Alexanteri",male,22.0,0,0,STON/O 2. 3101275,7.125,,S +0,3,"Attalah, Mr. Sleiman",male,30.0,0,0,2694,7.225,,C +0,1,"Minahan, Dr. William Edward",male,44.0,2,0,19928,90.0,C78,Q +0,3,"Lindahl, Miss. Agda Thorilda Viktoria",female,25.0,0,0,347071,7.775,,S +1,2,"Hamalainen, Mrs. William (Anna)",female,24.0,0,2,250649,14.5,,S +1,1,"Beckwith, Mr. Richard Leonard",male,37.0,1,1,11751,52.5542,D35,S +0,2,"Carter, Rev. Ernest Courtenay",male,54.0,1,0,244252,26.0,,S +0,3,"Reed, Mr. James George",male,,0,0,362316,7.25,,S +0,3,"Strom, Mrs. Wilhelm (Elna Matilda Persson)",female,29.0,1,1,347054,10.4625,G6,S +0,1,"Stead, Mr. William Thomas",male,62.0,0,0,113514,26.55,C87,S +0,3,"Lobb, Mr. William Arthur",male,30.0,1,0,A/5. 3336,16.1,,S +0,3,"Rosblom, Mrs. Viktor (Helena Wilhelmina)",female,41.0,0,2,370129,20.2125,,S +1,3,"Touma, Mrs. Darwis (Hanne Youssef Razi)",female,29.0,0,2,2650,15.2458,,C +1,1,"Thorne, Mrs. Gertrude Maybelle",female,,0,0,PC 17585,79.2,,C +1,1,"Cherry, Miss. Gladys",female,30.0,0,0,110152,86.5,B77,S +1,1,"Ward, Miss. Anna",female,35.0,0,0,PC 17755,512.3292,,C +1,2,"Parrish, Mrs. (Lutie Davis)",female,50.0,0,1,230433,26.0,,S +0,3,"Smith, Mr. Thomas",male,,0,0,384461,7.75,,Q +1,3,"Asplund, Master. Edvin Rojj Felix",male,3.0,4,2,347077,31.3875,,S +0,1,"Taussig, Mr. Emil",male,52.0,1,1,110413,79.65,E67,S +0,1,"Harrison, Mr. William",male,40.0,0,0,112059,0.0,B94,S +0,3,"Henry, Miss. Delia",female,,0,0,382649,7.75,,Q +0,2,"Reeves, Mr. David",male,36.0,0,0,C.A. 17248,10.5,,S +0,3,"Panula, Mr. Ernesti Arvid",male,16.0,4,1,3101295,39.6875,,S +1,3,"Persson, Mr. Ernst Ulrik",male,25.0,1,0,347083,7.775,,S +1,1,"Graham, Mrs. William Thompson (Edith Junkins)",female,58.0,0,1,PC 17582,153.4625,C125,S +1,1,"Bissette, Miss. Amelia",female,35.0,0,0,PC 17760,135.6333,C99,S +0,1,"Cairns, Mr. Alexander",male,,0,0,113798,31.0,,S +1,3,"Tornquist, Mr. William Henry",male,25.0,0,0,LINE,0.0,,S +1,2,"Mellinger, Mrs. (Elizabeth Anne Maidment)",female,41.0,0,1,250644,19.5,,S +0,1,"Natsch, Mr. Charles H",male,37.0,0,1,PC 17596,29.7,C118,C +1,3,"Healy, Miss. Hanora ""Nora""",female,,0,0,370375,7.75,,Q +1,1,"Andrews, Miss. Kornelia Theodosia",female,63.0,1,0,13502,77.9583,D7,S +0,3,"Lindblom, Miss. Augusta Charlotta",female,45.0,0,0,347073,7.75,,S +0,2,"Parkes, Mr. Francis ""Frank""",male,,0,0,239853,0.0,,S +0,3,"Rice, Master. Eric",male,7.0,4,1,382652,29.125,,Q +1,3,"Abbott, Mrs. Stanton (Rosa Hunt)",female,35.0,1,1,C.A. 2673,20.25,,S +0,3,"Duane, Mr. Frank",male,65.0,0,0,336439,7.75,,Q +0,3,"Olsson, Mr. Nils Johan Goransson",male,28.0,0,0,347464,7.8542,,S +0,3,"de Pelsmaeker, Mr. Alfons",male,16.0,0,0,345778,9.5,,S +1,3,"Dorking, Mr. Edward Arthur",male,19.0,0,0,A/5. 10482,8.05,,S +0,1,"Smith, Mr. Richard William",male,,0,0,113056,26.0,A19,S +0,3,"Stankovic, Mr. Ivan",male,33.0,0,0,349239,8.6625,,C +1,3,"de Mulder, Mr. Theodore",male,30.0,0,0,345774,9.5,,S +0,3,"Naidenoff, Mr. Penko",male,22.0,0,0,349206,7.8958,,S +1,2,"Hosono, Mr. Masabumi",male,42.0,0,0,237798,13.0,,S +1,3,"Connolly, Miss. Kate",female,22.0,0,0,370373,7.75,,Q +1,1,"Barber, Miss. Ellen ""Nellie""",female,26.0,0,0,19877,78.85,,S +1,1,"Bishop, Mrs. Dickinson H (Helen Walton)",female,19.0,1,0,11967,91.0792,B49,C +0,2,"Levy, Mr. Rene Jacques",male,36.0,0,0,SC/Paris 2163,12.875,D,C +0,3,"Haas, Miss. Aloisia",female,24.0,0,0,349236,8.85,,S +0,3,"Mineff, Mr. Ivan",male,24.0,0,0,349233,7.8958,,S +0,1,"Lewy, Mr. Ervin G",male,,0,0,PC 17612,27.7208,,C +0,3,"Hanna, Mr. Mansour",male,23.5,0,0,2693,7.2292,,C +0,1,"Allison, Miss. Helen Loraine",female,2.0,1,2,113781,151.55,C22 C26,S +1,1,"Saalfeld, Mr. Adolphe",male,,0,0,19988,30.5,C106,S +1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)",female,50.0,0,1,PC 17558,247.5208,B58 B60,C +1,3,"Kelly, Miss. Anna Katherine ""Annie Kate""",female,,0,0,9234,7.75,,Q +1,3,"McCoy, Mr. Bernard",male,,2,0,367226,23.25,,Q +0,3,"Johnson, Mr. William Cahoone Jr",male,19.0,0,0,LINE,0.0,,S +1,2,"Keane, Miss. Nora A",female,,0,0,226593,12.35,E101,Q +0,3,"Williams, Mr. Howard Hugh ""Harry""",male,,0,0,A/5 2466,8.05,,S +1,1,"Allison, Master. Hudson Trevor",male,0.92,1,2,113781,151.55,C22 C26,S +1,1,"Fleming, Miss. Margaret",female,,0,0,17421,110.8833,,C +1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)",female,17.0,1,0,PC 17758,108.9,C65,C +0,2,"Abelson, Mr. Samuel",male,30.0,1,0,P/PP 3381,24.0,,C +1,1,"Francatelli, Miss. Laura Mabel",female,30.0,0,0,PC 17485,56.9292,E36,C +1,1,"Hays, Miss. Margaret Bechstein",female,24.0,0,0,11767,83.1583,C54,C +1,1,"Ryerson, Miss. Emily Borie",female,18.0,2,2,PC 17608,262.375,B57 B59 B63 B66,C +0,2,"Lahtinen, Mrs. William (Anna Sylfven)",female,26.0,1,1,250651,26.0,,S +0,3,"Hendekovic, Mr. Ignjac",male,28.0,0,0,349243,7.8958,,S +0,2,"Hart, Mr. Benjamin",male,43.0,1,1,F.C.C. 13529,26.25,,S +1,3,"Nilsson, Miss. Helmina Josefina",female,26.0,0,0,347470,7.8542,,S +1,2,"Kantor, Mrs. Sinai (Miriam Sternin)",female,24.0,1,0,244367,26.0,,S +0,2,"Moraweck, Dr. Ernest",male,54.0,0,0,29011,14.0,,S +1,1,"Wick, Miss. Mary Natalie",female,31.0,0,2,36928,164.8667,C7,S +1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)",female,40.0,1,1,16966,134.5,E34,C +0,3,"Dennis, Mr. Samuel",male,22.0,0,0,A/5 21172,7.25,,S +0,3,"Danoff, Mr. Yoto",male,27.0,0,0,349219,7.8958,,S +1,2,"Slayter, Miss. Hilda Mary",female,30.0,0,0,234818,12.35,,Q +1,2,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)",female,22.0,1,1,248738,29.0,,S +0,3,"Sage, Mr. George John Jr",male,,8,2,CA. 2343,69.55,,S +1,1,"Young, Miss. Marie Grice",female,36.0,0,0,PC 17760,135.6333,C32,C +0,3,"Nysveen, Mr. Johan Hansen",male,61.0,0,0,345364,6.2375,,S +1,2,"Ball, Mrs. (Ada E Hall)",female,36.0,0,0,28551,13.0,D,S +1,3,"Goldsmith, Mrs. Frank John (Emily Alice Brown)",female,31.0,1,1,363291,20.525,,S +1,1,"Hippach, Miss. Jean Gertrude",female,16.0,0,1,111361,57.9792,B18,C +1,3,"McCoy, Miss. Agnes",female,,2,0,367226,23.25,,Q +0,1,"Partner, Mr. Austen",male,45.5,0,0,113043,28.5,C124,S +0,1,"Graham, Mr. George Edward",male,38.0,0,1,PC 17582,153.4625,C91,S +0,3,"Vander Planke, Mr. Leo Edmondus",male,16.0,2,0,345764,18.0,,S +1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)",female,,1,0,PC 17611,133.65,,S +0,3,"Denkoff, Mr. Mitto",male,,0,0,349225,7.8958,,S +0,1,"Pears, Mr. Thomas Clinton",male,29.0,1,0,113776,66.6,C2,S +1,1,"Burns, Miss. Elizabeth Margaret",female,41.0,0,0,16966,134.5,E40,C +1,3,"Dahl, Mr. Karl Edwart",male,45.0,0,0,7598,8.05,,S +0,1,"Blackwell, Mr. Stephen Weart",male,45.0,0,0,113784,35.5,T,S +1,2,"Navratil, Master. Edmond Roger",male,2.0,1,1,230080,26.0,F2,S +1,1,"Fortune, Miss. Alice Elizabeth",female,24.0,3,2,19950,263.0,C23 C25 C27,S +0,2,"Collander, Mr. Erik Gustaf",male,28.0,0,0,248740,13.0,,S +0,2,"Sedgwick, Mr. Charles Frederick Waddington",male,25.0,0,0,244361,13.0,,S +0,2,"Fox, Mr. Stanley Hubert",male,36.0,0,0,229236,13.0,,S +1,2,"Brown, Miss. Amelia ""Mildred""",female,24.0,0,0,248733,13.0,F33,S +1,2,"Smith, Miss. Marion Elsie",female,40.0,0,0,31418,13.0,,S +1,3,"Davison, Mrs. Thomas Henry (Mary E Finck)",female,,1,0,386525,16.1,,S +1,3,"Coutts, Master. William Loch ""William""",male,3.0,1,1,C.A. 37671,15.9,,S +0,3,"Dimic, Mr. Jovan",male,42.0,0,0,315088,8.6625,,S +0,3,"Odahl, Mr. Nils Martin",male,23.0,0,0,7267,9.225,,S +0,1,"Williams-Lambert, Mr. Fletcher Fellows",male,,0,0,113510,35.0,C128,S +0,3,"Elias, Mr. Tannous",male,15.0,1,1,2695,7.2292,,C +0,3,"Arnold-Franchi, Mr. Josef",male,25.0,1,0,349237,17.8,,S +0,3,"Yousif, Mr. Wazli",male,,0,0,2647,7.225,,C +0,3,"Vanden Steen, Mr. Leo Peter",male,28.0,0,0,345783,9.5,,S +1,1,"Bowerman, Miss. Elsie Edith",female,22.0,0,1,113505,55.0,E33,S +0,2,"Funk, Miss. Annie Clemmer",female,38.0,0,0,237671,13.0,,S +1,3,"McGovern, Miss. Mary",female,,0,0,330931,7.8792,,Q +1,3,"Mockler, Miss. Helen Mary ""Ellie""",female,,0,0,330980,7.8792,,Q +0,3,"Skoog, Mr. Wilhelm",male,40.0,1,4,347088,27.9,,S +0,2,"del Carlo, Mr. Sebastiano",male,29.0,1,0,SC/PARIS 2167,27.7208,,C +0,3,"Barbara, Mrs. (Catherine David)",female,45.0,0,1,2691,14.4542,,C +0,3,"Asim, Mr. Adola",male,35.0,0,0,SOTON/O.Q. 3101310,7.05,,S +0,3,"O'Brien, Mr. Thomas",male,,1,0,370365,15.5,,Q +0,3,"Adahl, Mr. Mauritz Nils Martin",male,30.0,0,0,C 7076,7.25,,S +1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)",female,60.0,1,0,110813,75.25,D37,C +1,3,"Moussa, Mrs. (Mantoura Boulos)",female,,0,0,2626,7.2292,,C +1,3,"Jermyn, Miss. Annie",female,,0,0,14313,7.75,,Q +1,1,"Aubart, Mme. Leontine Pauline",female,24.0,0,0,PC 17477,69.3,B35,C +1,1,"Harder, Mr. George Achilles",male,25.0,1,0,11765,55.4417,E50,C +0,3,"Wiklund, Mr. Jakob Alfred",male,18.0,1,0,3101267,6.4958,,S +0,3,"Beavan, Mr. William Thomas",male,19.0,0,0,323951,8.05,,S +0,1,"Ringhini, Mr. Sante",male,22.0,0,0,PC 17760,135.6333,,C +0,3,"Palsson, Miss. Stina Viola",female,3.0,3,1,349909,21.075,,S +1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)",female,,1,0,PC 17604,82.1708,,C +1,3,"Landergren, Miss. Aurora Adelia",female,22.0,0,0,C 7077,7.25,,S +0,1,"Widener, Mr. Harry Elkins",male,27.0,0,2,113503,211.5,C82,C +0,3,"Betros, Mr. Tannous",male,20.0,0,0,2648,4.0125,,C +0,3,"Gustafsson, Mr. Karl Gideon",male,19.0,0,0,347069,7.775,,S +1,1,"Bidois, Miss. Rosalie",female,42.0,0,0,PC 17757,227.525,,C +1,3,"Nakid, Miss. Maria (""Mary"")",female,1.0,0,2,2653,15.7417,,C +0,3,"Tikkanen, Mr. Juho",male,32.0,0,0,STON/O 2. 3101293,7.925,,S +1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)",female,35.0,1,0,113789,52.0,,S +0,3,"Plotcharsky, Mr. Vasil",male,,0,0,349227,7.8958,,S +0,2,"Davies, Mr. Charles Henry",male,18.0,0,0,S.O.C. 14879,73.5,,S +0,3,"Goodwin, Master. Sidney Leonard",male,1.0,5,2,CA 2144,46.9,,S +1,2,"Buss, Miss. Kate",female,36.0,0,0,27849,13.0,,S +0,3,"Sadlier, Mr. Matthew",male,,0,0,367655,7.7292,,Q +1,2,"Lehmann, Miss. Bertha",female,17.0,0,0,SC 1748,12.0,,C +1,1,"Carter, Mr. William Ernest",male,36.0,1,2,113760,120.0,B96 B98,S +1,3,"Jansson, Mr. Carl Olof",male,21.0,0,0,350034,7.7958,,S +0,3,"Gustafsson, Mr. Johan Birger",male,28.0,2,0,3101277,7.925,,S +1,1,"Newell, Miss. Marjorie",female,23.0,1,0,35273,113.275,D36,C +1,3,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)",female,24.0,0,2,PP 9549,16.7,G6,S +0,3,"Johansson, Mr. Erik",male,22.0,0,0,350052,7.7958,,S +0,3,"Olsson, Miss. Elina",female,31.0,0,0,350407,7.8542,,S +0,2,"McKane, Mr. Peter David",male,46.0,0,0,28403,26.0,,S +0,2,"Pain, Dr. Alfred",male,23.0,0,0,244278,10.5,,S +1,2,"Trout, Mrs. William H (Jessie L)",female,28.0,0,0,240929,12.65,,S +1,3,"Niskanen, Mr. Juha",male,39.0,0,0,STON/O 2. 3101289,7.925,,S +0,3,"Adams, Mr. John",male,26.0,0,0,341826,8.05,,S +0,3,"Jussila, Miss. Mari Aina",female,21.0,1,0,4137,9.825,,S +0,3,"Hakkarainen, Mr. Pekka Pietari",male,28.0,1,0,STON/O2. 3101279,15.85,,S +0,3,"Oreskovic, Miss. Marija",female,20.0,0,0,315096,8.6625,,S +0,2,"Gale, Mr. Shadrach",male,34.0,1,0,28664,21.0,,S +0,3,"Widegren, Mr. Carl/Charles Peter",male,51.0,0,0,347064,7.75,,S +1,2,"Richards, Master. William Rowe",male,3.0,1,1,29106,18.75,,S +0,3,"Birkeland, Mr. Hans Martin Monsen",male,21.0,0,0,312992,7.775,,S +0,3,"Lefebre, Miss. Ida",female,,3,1,4133,25.4667,,S +0,3,"Sdycoff, Mr. Todor",male,,0,0,349222,7.8958,,S +0,3,"Hart, Mr. Henry",male,,0,0,394140,6.8583,,Q +1,1,"Minahan, Miss. Daisy E",female,33.0,1,0,19928,90.0,C78,Q +0,2,"Cunningham, Mr. Alfred Fleming",male,,0,0,239853,0.0,,S +1,3,"Sundman, Mr. Johan Julian",male,44.0,0,0,STON/O 2. 3101269,7.925,,S +0,3,"Meek, Mrs. Thomas (Annie Louise Rowley)",female,,0,0,343095,8.05,,S +1,2,"Drew, Mrs. James Vivian (Lulu Thorne Christian)",female,34.0,1,1,28220,32.5,,S +1,2,"Silven, Miss. Lyyli Karoliina",female,18.0,0,2,250652,13.0,,S +0,2,"Matthews, Mr. William John",male,30.0,0,0,28228,13.0,,S +0,3,"Van Impe, Miss. Catharina",female,10.0,0,2,345773,24.15,,S +0,3,"Gheorgheff, Mr. Stanio",male,,0,0,349254,7.8958,,C +0,3,"Charters, Mr. David",male,21.0,0,0,A/5. 13032,7.7333,,Q +0,3,"Zimmerman, Mr. Leo",male,29.0,0,0,315082,7.875,,S +0,3,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)",female,28.0,1,1,347080,14.4,,S +0,3,"Rosblom, Mr. Viktor Richard",male,18.0,1,1,370129,20.2125,,S +0,3,"Wiseman, Mr. Phillippe",male,,0,0,A/4. 34244,7.25,,S +1,2,"Clarke, Mrs. Charles V (Ada Maria Winfield)",female,28.0,1,0,2003,26.0,,S +1,2,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")",female,19.0,0,0,250655,26.0,,S +0,3,"Flynn, Mr. James",male,,0,0,364851,7.75,,Q +1,3,"Pickard, Mr. Berk (Berk Trembisky)",male,32.0,0,0,SOTON/O.Q. 392078,8.05,E10,S +1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan",male,28.0,0,0,110564,26.55,C52,S +1,3,"Thorneycroft, Mrs. Percival (Florence Kate White)",female,,1,0,376564,16.1,,S +1,2,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)",female,42.0,1,0,SC/AH 3085,26.0,,S +0,3,"Kallio, Mr. Nikolai Erland",male,17.0,0,0,STON/O 2. 3101274,7.125,,S +0,1,"Silvey, Mr. William Baird",male,50.0,1,0,13507,55.9,E44,S +1,1,"Carter, Miss. Lucile Polk",female,14.0,1,2,113760,120.0,B96 B98,S +0,3,"Ford, Miss. Doolina Margaret ""Daisy""",female,21.0,2,2,W./C. 6608,34.375,,S +1,2,"Richards, Mrs. Sidney (Emily Hocking)",female,24.0,2,3,29106,18.75,,S +0,1,"Fortune, Mr. Mark",male,64.0,1,4,19950,263.0,C23 C25 C27,S +0,2,"Kvillner, Mr. Johan Henrik Johannesson",male,31.0,0,0,C.A. 18723,10.5,,S +1,2,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)",female,45.0,1,1,F.C.C. 13529,26.25,,S +0,3,"Hampe, Mr. Leon",male,20.0,0,0,345769,9.5,,S +0,3,"Petterson, Mr. Johan Emil",male,25.0,1,0,347076,7.775,,S +1,2,"Reynaldo, Ms. Encarnacion",female,28.0,0,0,230434,13.0,,S +1,3,"Johannesen-Bratthammer, Mr. Bernt",male,,0,0,65306,8.1125,,S +1,1,"Dodge, Master. Washington",male,4.0,0,2,33638,81.8583,A34,S +1,2,"Mellinger, Miss. Madeleine Violet",female,13.0,0,1,250644,19.5,,S +1,1,"Seward, Mr. Frederic Kimber",male,34.0,0,0,113794,26.55,,S +1,3,"Baclini, Miss. Marie Catherine",female,5.0,2,1,2666,19.2583,,C +1,1,"Peuchen, Major. Arthur Godfrey",male,52.0,0,0,113786,30.5,C104,S +0,2,"West, Mr. Edwy Arthur",male,36.0,1,2,C.A. 34651,27.75,,S +0,3,"Hagland, Mr. Ingvald Olai Olsen",male,,1,0,65303,19.9667,,S +0,1,"Foreman, Mr. Benjamin Laventall",male,30.0,0,0,113051,27.75,C111,C +1,1,"Goldenberg, Mr. Samuel L",male,49.0,1,0,17453,89.1042,C92,C +0,3,"Peduzzi, Mr. Joseph",male,,0,0,A/5 2817,8.05,,S +1,3,"Jalsevac, Mr. Ivan",male,29.0,0,0,349240,7.8958,,C +0,1,"Millet, Mr. Francis Davis",male,65.0,0,0,13509,26.55,E38,S +1,1,"Kenyon, Mrs. Frederick R (Marion)",female,,1,0,17464,51.8625,D21,S +1,2,"Toomey, Miss. Ellen",female,50.0,0,0,F.C.C. 13531,10.5,,S +0,3,"O'Connor, Mr. Maurice",male,,0,0,371060,7.75,,Q +1,1,"Anderson, Mr. Harry",male,48.0,0,0,19952,26.55,E12,S +0,3,"Morley, Mr. William",male,34.0,0,0,364506,8.05,,S +0,1,"Gee, Mr. Arthur H",male,47.0,0,0,111320,38.5,E63,S +0,2,"Milling, Mr. Jacob Christian",male,48.0,0,0,234360,13.0,,S +0,3,"Maisner, Mr. Simon",male,,0,0,A/S 2816,8.05,,S +0,3,"Goncalves, Mr. Manuel Estanslas",male,38.0,0,0,SOTON/O.Q. 3101306,7.05,,S +0,2,"Campbell, Mr. William",male,,0,0,239853,0.0,,S +0,1,"Smart, Mr. John Montgomery",male,56.0,0,0,113792,26.55,,S +0,3,"Scanlan, Mr. James",male,,0,0,36209,7.725,,Q +1,3,"Baclini, Miss. Helene Barbara",female,0.75,2,1,2666,19.2583,,C +0,3,"Keefe, Mr. Arthur",male,,0,0,323592,7.25,,S +0,3,"Cacic, Mr. Luka",male,38.0,0,0,315089,8.6625,,S +1,2,"West, Mrs. Edwy Arthur (Ada Mary Worth)",female,33.0,1,2,C.A. 34651,27.75,,S +1,2,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)",female,23.0,0,0,SC/AH Basle 541,13.7917,D,C +0,3,"Strandberg, Miss. Ida Sofia",female,22.0,0,0,7553,9.8375,,S +0,1,"Clifford, Mr. George Quincy",male,,0,0,110465,52.0,A14,S +0,2,"Renouf, Mr. Peter Henry",male,34.0,1,0,31027,21.0,,S +0,3,"Braund, Mr. Lewis Richard",male,29.0,1,0,3460,7.0458,,S +0,3,"Karlsson, Mr. Nils August",male,22.0,0,0,350060,7.5208,,S +1,3,"Hirvonen, Miss. Hildur E",female,2.0,0,1,3101298,12.2875,,S +0,3,"Goodwin, Master. Harold Victor",male,9.0,5,2,CA 2144,46.9,,S +0,2,"Frost, Mr. Anthony Wood ""Archie""",male,,0,0,239854,0.0,,S +0,3,"Rouse, Mr. Richard Henry",male,50.0,0,0,A/5 3594,8.05,,S +1,3,"Turkula, Mrs. (Hedwig)",female,63.0,0,0,4134,9.5875,,S +1,1,"Bishop, Mr. Dickinson H",male,25.0,1,0,11967,91.0792,B49,C +0,3,"Lefebre, Miss. Jeannie",female,,3,1,4133,25.4667,,S +1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)",female,35.0,1,0,19943,90.0,C93,S +0,1,"Kent, Mr. Edward Austin",male,58.0,0,0,11771,29.7,B37,C +0,3,"Somerton, Mr. Francis William",male,30.0,0,0,A.5. 18509,8.05,,S +1,3,"Coutts, Master. Eden Leslie ""Neville""",male,9.0,1,1,C.A. 37671,15.9,,S +0,3,"Hagland, Mr. Konrad Mathias Reiersen",male,,1,0,65304,19.9667,,S +0,3,"Windelov, Mr. Einar",male,21.0,0,0,SOTON/OQ 3101317,7.25,,S +0,1,"Molson, Mr. Harry Markland",male,55.0,0,0,113787,30.5,C30,S +0,1,"Artagaveytia, Mr. Ramon",male,71.0,0,0,PC 17609,49.5042,,C +0,3,"Stanley, Mr. Edward Roland",male,21.0,0,0,A/4 45380,8.05,,S +0,3,"Yousseff, Mr. Gerious",male,,0,0,2627,14.4583,,C +1,1,"Eustis, Miss. Elizabeth Mussey",female,54.0,1,0,36947,78.2667,D20,C +0,3,"Shellard, Mr. Frederick William",male,,0,0,C.A. 6212,15.1,,S +0,1,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)",female,25.0,1,2,113781,151.55,C22 C26,S +0,3,"Svensson, Mr. Olof",male,24.0,0,0,350035,7.7958,,S +0,3,"Calic, Mr. Petar",male,17.0,0,0,315086,8.6625,,S +0,3,"Canavan, Miss. Mary",female,21.0,0,0,364846,7.75,,Q +0,3,"O'Sullivan, Miss. Bridget Mary",female,,0,0,330909,7.6292,,Q +0,3,"Laitinen, Miss. Kristina Sofia",female,37.0,0,0,4135,9.5875,,S +1,1,"Maioni, Miss. Roberta",female,16.0,0,0,110152,86.5,B79,S +0,1,"Penasco y Castellana, Mr. Victor de Satode",male,18.0,1,0,PC 17758,108.9,C65,C +1,2,"Quick, Mrs. Frederick Charles (Jane Richards)",female,33.0,0,2,26360,26.0,,S +1,1,"Bradley, Mr. George (""George Arthur Brayton"")",male,,0,0,111427,26.55,,S +0,3,"Olsen, Mr. Henry Margido",male,28.0,0,0,C 4001,22.525,,S +1,3,"Lang, Mr. Fang",male,26.0,0,0,1601,56.4958,,S +1,3,"Daly, Mr. Eugene Patrick",male,29.0,0,0,382651,7.75,,Q +0,3,"Webber, Mr. James",male,,0,0,SOTON/OQ 3101316,8.05,,S +1,1,"McGough, Mr. James Robert",male,36.0,0,0,PC 17473,26.2875,E25,S +1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)",female,54.0,1,0,PC 17603,59.4,,C +0,3,"Coleff, Mr. Satio",male,24.0,0,0,349209,7.4958,,S +0,1,"Walker, Mr. William Anderson",male,47.0,0,0,36967,34.0208,D46,S +1,2,"Lemore, Mrs. (Amelia Milley)",female,34.0,0,0,C.A. 34260,10.5,F33,S +0,3,"Ryan, Mr. Patrick",male,,0,0,371110,24.15,,Q +1,2,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)",female,36.0,1,0,226875,26.0,,S +0,3,"Pavlovic, Mr. Stefo",male,32.0,0,0,349242,7.8958,,S +1,1,"Perreault, Miss. Anne",female,30.0,0,0,12749,93.5,B73,S +0,3,"Vovk, Mr. Janko",male,22.0,0,0,349252,7.8958,,S +0,3,"Lahoud, Mr. Sarkis",male,,0,0,2624,7.225,,C +1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)",female,44.0,0,1,111361,57.9792,B18,C +0,3,"Kassem, Mr. Fared",male,,0,0,2700,7.2292,,C +0,3,"Farrell, Mr. James",male,40.5,0,0,367232,7.75,,Q +1,2,"Ridsdale, Miss. Lucy",female,50.0,0,0,W./C. 14258,10.5,,S +0,1,"Farthing, Mr. John",male,,0,0,PC 17483,221.7792,C95,S +0,3,"Salonen, Mr. Johan Werner",male,39.0,0,0,3101296,7.925,,S +0,2,"Hocking, Mr. Richard George",male,23.0,2,1,29104,11.5,,S +1,2,"Quick, Miss. Phyllis May",female,2.0,1,1,26360,26.0,,S +0,3,"Toufik, Mr. Nakli",male,,0,0,2641,7.2292,,C +0,3,"Elias, Mr. Joseph Jr",male,17.0,1,1,2690,7.2292,,C +1,3,"Peter, Mrs. Catherine (Catherine Rizk)",female,,0,2,2668,22.3583,,C +0,3,"Cacic, Miss. Marija",female,30.0,0,0,315084,8.6625,,S +1,2,"Hart, Miss. Eva Miriam",female,7.0,0,2,F.C.C. 13529,26.25,,S +0,1,"Butt, Major. Archibald Willingham",male,45.0,0,0,113050,26.55,B38,S +1,1,"LeRoy, Miss. Bertha",female,30.0,0,0,PC 17761,106.425,,C +0,3,"Risien, Mr. Samuel Beard",male,,0,0,364498,14.5,,S +1,1,"Frolicher, Miss. Hedwig Margaritha",female,22.0,0,2,13568,49.5,B39,C +1,1,"Crosby, Miss. Harriet R",female,36.0,0,2,WE/P 5735,71.0,B22,S +0,3,"Andersson, Miss. Ingeborg Constanzia",female,9.0,4,2,347082,31.275,,S +0,3,"Andersson, Miss. Sigrid Elisabeth",female,11.0,4,2,347082,31.275,,S +1,2,"Beane, Mr. Edward",male,32.0,1,0,2908,26.0,,S +0,1,"Douglas, Mr. Walter Donald",male,50.0,1,0,PC 17761,106.425,C86,C +0,1,"Nicholson, Mr. Arthur Ernest",male,64.0,0,0,693,26.0,,S +1,2,"Beane, Mrs. Edward (Ethel Clarke)",female,19.0,1,0,2908,26.0,,S +1,2,"Padro y Manent, Mr. Julian",male,,0,0,SC/PARIS 2146,13.8625,,C +0,3,"Goldsmith, Mr. Frank John",male,33.0,1,1,363291,20.525,,S +1,2,"Davies, Master. John Morgan Jr",male,8.0,1,1,C.A. 33112,36.75,,S +1,1,"Thayer, Mr. John Borland Jr",male,17.0,0,2,17421,110.8833,C70,C +0,2,"Sharp, Mr. Percival James R",male,27.0,0,0,244358,26.0,,S +0,3,"O'Brien, Mr. Timothy",male,,0,0,330979,7.8292,,Q +1,3,"Leeni, Mr. Fahim (""Philip Zenni"")",male,22.0,0,0,2620,7.225,,C +1,3,"Ohman, Miss. Velin",female,22.0,0,0,347085,7.775,,S +0,1,"Wright, Mr. George",male,62.0,0,0,113807,26.55,,S +1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")",female,48.0,1,0,11755,39.6,A16,C +0,1,"Robbins, Mr. Victor",male,,0,0,PC 17757,227.525,,C +1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)",female,39.0,1,1,110413,79.65,E67,S +1,3,"de Messemaeker, Mrs. Guillaume Joseph (Emma)",female,36.0,1,0,345572,17.4,,S +0,3,"Morrow, Mr. Thomas Rowan",male,,0,0,372622,7.75,,Q +0,3,"Sivic, Mr. Husein",male,40.0,0,0,349251,7.8958,,S +0,2,"Norman, Mr. Robert Douglas",male,28.0,0,0,218629,13.5,,S +0,3,"Simmons, Mr. John",male,,0,0,SOTON/OQ 392082,8.05,,S +0,3,"Meanwell, Miss. (Marion Ogden)",female,,0,0,SOTON/O.Q. 392087,8.05,,S +0,3,"Davies, Mr. Alfred J",male,24.0,2,0,A/4 48871,24.15,,S +0,3,"Stoytcheff, Mr. Ilia",male,19.0,0,0,349205,7.8958,,S +0,3,"Palsson, Mrs. Nils (Alma Cornelia Berglund)",female,29.0,0,4,349909,21.075,,S +0,3,"Doharr, Mr. Tannous",male,,0,0,2686,7.2292,,C +1,3,"Jonsson, Mr. Carl",male,32.0,0,0,350417,7.8542,,S +1,2,"Harris, Mr. George",male,62.0,0,0,S.W./PP 752,10.5,,S +1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)",female,53.0,2,0,11769,51.4792,C101,S +1,1,"Flynn, Mr. John Irwin (""Irving"")",male,36.0,0,0,PC 17474,26.3875,E25,S +1,3,"Kelly, Miss. Mary",female,,0,0,14312,7.75,,Q +0,3,"Rush, Mr. Alfred George John",male,16.0,0,0,A/4. 20589,8.05,,S +0,3,"Patchett, Mr. George",male,19.0,0,0,358585,14.5,,S +1,2,"Garside, Miss. Ethel",female,34.0,0,0,243880,13.0,,S +1,1,"Silvey, Mrs. William Baird (Alice Munger)",female,39.0,1,0,13507,55.9,E44,S +0,3,"Caram, Mrs. Joseph (Maria Elias)",female,,1,0,2689,14.4583,,C +1,3,"Jussila, Mr. Eiriik",male,32.0,0,0,STON/O 2. 3101286,7.925,,S +1,2,"Christy, Miss. Julie Rachel",female,25.0,1,1,237789,30.0,,S +1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)",female,39.0,1,1,17421,110.8833,C68,C +0,2,"Downton, Mr. William James",male,54.0,0,0,28403,26.0,,S +0,1,"Ross, Mr. John Hugo",male,36.0,0,0,13049,40.125,A10,C +0,3,"Paulner, Mr. Uscher",male,,0,0,3411,8.7125,,C +1,1,"Taussig, Miss. Ruth",female,18.0,0,2,110413,79.65,E68,S +0,2,"Jarvis, Mr. John Denzil",male,47.0,0,0,237565,15.0,,S +1,1,"Frolicher-Stehli, Mr. Maxmillian",male,60.0,1,1,13567,79.2,B41,C +0,3,"Gilinski, Mr. Eliezer",male,22.0,0,0,14973,8.05,,S +0,3,"Murdlin, Mr. Joseph",male,,0,0,A./5. 3235,8.05,,S +0,3,"Rintamaki, Mr. Matti",male,35.0,0,0,STON/O 2. 3101273,7.125,,S +1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)",female,52.0,1,0,36947,78.2667,D20,C +0,3,"Elsbury, Mr. William James",male,47.0,0,0,A/5 3902,7.25,,S +0,3,"Bourke, Miss. Mary",female,,0,2,364848,7.75,,Q +0,2,"Chapman, Mr. John Henry",male,37.0,1,0,SC/AH 29037,26.0,,S +0,3,"Van Impe, Mr. Jean Baptiste",male,36.0,1,1,345773,24.15,,S +1,2,"Leitch, Miss. Jessie Wills",female,,0,0,248727,33.0,,S +0,3,"Johnson, Mr. Alfred",male,49.0,0,0,LINE,0.0,,S +0,3,"Boulos, Mr. Hanna",male,,0,0,2664,7.225,,C +1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")",male,49.0,1,0,PC 17485,56.9292,A20,C +1,2,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)",female,24.0,2,1,243847,27.0,,S +0,3,"Slabenoff, Mr. Petco",male,,0,0,349214,7.8958,,S +0,1,"Harrington, Mr. Charles H",male,,0,0,113796,42.4,,S +0,3,"Torber, Mr. Ernst William",male,44.0,0,0,364511,8.05,,S +1,1,"Homer, Mr. Harry (""Mr E Haven"")",male,35.0,0,0,111426,26.55,,C +0,3,"Lindell, Mr. Edvard Bengtsson",male,36.0,1,0,349910,15.55,,S +0,3,"Karaic, Mr. Milan",male,30.0,0,0,349246,7.8958,,S +1,1,"Daniel, Mr. Robert Williams",male,27.0,0,0,113804,30.5,,S +1,2,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)",female,22.0,1,2,SC/Paris 2123,41.5792,,C +1,1,"Shutes, Miss. Elizabeth W",female,40.0,0,0,PC 17582,153.4625,C125,S +0,3,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)",female,39.0,1,5,347082,31.275,,S +0,3,"Jardin, Mr. Jose Neto",male,,0,0,SOTON/O.Q. 3101305,7.05,,S +1,3,"Murphy, Miss. Margaret Jane",female,,1,0,367230,15.5,,Q +0,3,"Horgan, Mr. John",male,,0,0,370377,7.75,,Q +0,3,"Brocklebank, Mr. William Alfred",male,35.0,0,0,364512,8.05,,S +1,2,"Herman, Miss. Alice",female,24.0,1,2,220845,65.0,,S +0,3,"Danbom, Mr. Ernst Gilbert",male,34.0,1,1,347080,14.4,,S +0,3,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)",female,26.0,1,0,A/5. 3336,16.1,,S +1,2,"Becker, Miss. Marion Louise",female,4.0,2,1,230136,39.0,F4,S +0,2,"Gavey, Mr. Lawrence",male,26.0,0,0,31028,10.5,,S +0,3,"Yasbeck, Mr. Antoni",male,27.0,1,0,2659,14.4542,,C +1,1,"Kimball, Mr. Edwin Nelson Jr",male,42.0,1,0,11753,52.5542,D19,S +1,3,"Nakid, Mr. Sahid",male,20.0,1,1,2653,15.7417,,C +0,3,"Hansen, Mr. Henry Damsgaard",male,21.0,0,0,350029,7.8542,,S +0,3,"Bowen, Mr. David John ""Dai""",male,21.0,0,0,54636,16.1,,S +0,1,"Sutton, Mr. Frederick",male,61.0,0,0,36963,32.3208,D50,S +0,2,"Kirkland, Rev. Charles Leonard",male,57.0,0,0,219533,12.35,,Q +1,1,"Longley, Miss. Gretchen Fiske",female,21.0,0,0,13502,77.9583,D9,S +0,3,"Bostandyeff, Mr. Guentcho",male,26.0,0,0,349224,7.8958,,S +0,3,"O'Connell, Mr. Patrick D",male,,0,0,334912,7.7333,,Q +1,1,"Barkworth, Mr. Algernon Henry Wilson",male,80.0,0,0,27042,30.0,A23,S +0,3,"Lundahl, Mr. Johan Svensson",male,51.0,0,0,347743,7.0542,,S +1,1,"Stahelin-Maeglin, Dr. Max",male,32.0,0,0,13214,30.5,B50,C +0,1,"Parr, Mr. William Henry Marsh",male,,0,0,112052,0.0,,S +0,3,"Skoog, Miss. Mabel",female,9.0,3,2,347088,27.9,,S +1,2,"Davis, Miss. Mary",female,28.0,0,0,237668,13.0,,S +0,3,"Leinonen, Mr. Antti Gustaf",male,32.0,0,0,STON/O 2. 3101292,7.925,,S +0,2,"Collyer, Mr. Harvey",male,31.0,1,1,C.A. 31921,26.25,,S +0,3,"Panula, Mrs. Juha (Maria Emilia Ojala)",female,41.0,0,5,3101295,39.6875,,S +0,3,"Thorneycroft, Mr. Percival",male,,1,0,376564,16.1,,S +0,3,"Jensen, Mr. Hans Peder",male,20.0,0,0,350050,7.8542,,S +1,1,"Sagesser, Mlle. Emma",female,24.0,0,0,PC 17477,69.3,B35,C +0,3,"Skoog, Miss. Margit Elizabeth",female,2.0,3,2,347088,27.9,,S +1,3,"Foo, Mr. Choong",male,,0,0,1601,56.4958,,S +1,3,"Baclini, Miss. Eugenie",female,0.75,2,1,2666,19.2583,,C +1,1,"Harper, Mr. Henry Sleeper",male,48.0,1,0,PC 17572,76.7292,D33,C +0,3,"Cor, Mr. Liudevit",male,19.0,0,0,349231,7.8958,,S +1,1,"Simonius-Blumer, Col. Oberst Alfons",male,56.0,0,0,13213,35.5,A26,C +0,3,"Willey, Mr. Edward",male,,0,0,S.O./P.P. 751,7.55,,S +1,3,"Stanley, Miss. Amy Zillah Elsie",female,23.0,0,0,CA. 2314,7.55,,S +0,3,"Mitkoff, Mr. Mito",male,,0,0,349221,7.8958,,S +1,2,"Doling, Miss. Elsie",female,18.0,0,1,231919,23.0,,S +0,3,"Kalvik, Mr. Johannes Halvorsen",male,21.0,0,0,8475,8.4333,,S +1,3,"O'Leary, Miss. Hanora ""Norah""",female,,0,0,330919,7.8292,,Q +0,3,"Hegarty, Miss. Hanora ""Nora""",female,18.0,0,0,365226,6.75,,Q +0,2,"Hickman, Mr. Leonard Mark",male,24.0,2,0,S.O.C. 14879,73.5,,S +0,3,"Radeff, Mr. Alexander",male,,0,0,349223,7.8958,,S +0,3,"Bourke, Mrs. John (Catherine)",female,32.0,1,1,364849,15.5,,Q +0,2,"Eitemiller, Mr. George Floyd",male,23.0,0,0,29751,13.0,,S +0,1,"Newell, Mr. Arthur Webster",male,58.0,0,2,35273,113.275,D48,C +1,1,"Frauenthal, Dr. Henry William",male,50.0,2,0,PC 17611,133.65,,S +0,3,"Badt, Mr. Mohamed",male,40.0,0,0,2623,7.225,,C +0,1,"Colley, Mr. Edward Pomeroy",male,47.0,0,0,5727,25.5875,E58,S +0,3,"Coleff, Mr. Peju",male,36.0,0,0,349210,7.4958,,S +1,3,"Lindqvist, Mr. Eino William",male,20.0,1,0,STON/O 2. 3101285,7.925,,S +0,2,"Hickman, Mr. Lewis",male,32.0,2,0,S.O.C. 14879,73.5,,S +0,2,"Butler, Mr. Reginald Fenton",male,25.0,0,0,234686,13.0,,S +0,3,"Rommetvedt, Mr. Knud Paust",male,,0,0,312993,7.775,,S +0,3,"Cook, Mr. Jacob",male,43.0,0,0,A/5 3536,8.05,,S +1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)",female,,1,0,19996,52.0,C126,S +1,2,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)",female,40.0,1,1,29750,39.0,,S +0,1,"Davidson, Mr. Thornton",male,31.0,1,0,F.C. 12750,52.0,B71,S +0,2,"Mitchell, Mr. Henry Michael",male,70.0,0,0,C.A. 24580,10.5,,S +1,2,"Wilhelms, Mr. Charles",male,31.0,0,0,244270,13.0,,S +0,2,"Watson, Mr. Ennis Hastings",male,,0,0,239856,0.0,,S +0,3,"Edvardsson, Mr. Gustaf Hjalmar",male,18.0,0,0,349912,7.775,,S +0,3,"Sawyer, Mr. Frederick Charles",male,24.5,0,0,342826,8.05,,S +1,3,"Turja, Miss. Anna Sofia",female,18.0,0,0,4138,9.8417,,S +0,3,"Goodwin, Mrs. Frederick (Augusta Tyler)",female,43.0,1,6,CA 2144,46.9,,S +1,1,"Cardeza, Mr. Thomas Drake Martinez",male,36.0,0,1,PC 17755,512.3292,B51 B53 B55,C +0,3,"Peters, Miss. Katie",female,,0,0,330935,8.1375,,Q +1,1,"Hassab, Mr. Hammad",male,27.0,0,0,PC 17572,76.7292,D49,C +0,3,"Olsvigen, Mr. Thor Anderson",male,20.0,0,0,6563,9.225,,S +0,3,"Goodwin, Mr. Charles Edward",male,14.0,5,2,CA 2144,46.9,,S +0,2,"Brown, Mr. Thomas William Solomon",male,60.0,1,1,29750,39.0,,S +0,2,"Laroche, Mr. Joseph Philippe Lemercier",male,25.0,1,2,SC/Paris 2123,41.5792,,C +0,3,"Panula, Mr. Jaako Arnold",male,14.0,4,1,3101295,39.6875,,S +0,3,"Dakic, Mr. Branko",male,19.0,0,0,349228,10.1708,,S +0,3,"Fischer, Mr. Eberhard Thelander",male,18.0,0,0,350036,7.7958,,S +1,1,"Madill, Miss. Georgette Alexandra",female,15.0,0,1,24160,211.3375,B5,S +1,1,"Dick, Mr. Albert Adrian",male,31.0,1,0,17474,57.0,B20,S +1,3,"Karun, Miss. Manca",female,4.0,0,1,349256,13.4167,,C +1,3,"Lam, Mr. Ali",male,,0,0,1601,56.4958,,S +0,3,"Saad, Mr. Khalil",male,25.0,0,0,2672,7.225,,C +0,1,"Weir, Col. John",male,60.0,0,0,113800,26.55,,S +0,2,"Chapman, Mr. Charles Henry",male,52.0,0,0,248731,13.5,,S +0,3,"Kelly, Mr. James",male,44.0,0,0,363592,8.05,,S +1,3,"Mullens, Miss. Katherine ""Katie""",female,,0,0,35852,7.7333,,Q +0,1,"Thayer, Mr. John Borland",male,49.0,1,1,17421,110.8833,C68,C +0,3,"Humblen, Mr. Adolf Mathias Nicolai Olsen",male,42.0,0,0,348121,7.65,F G63,S +1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)",female,18.0,1,0,PC 17757,227.525,C62 C64,C +1,1,"Silverthorne, Mr. Spencer Victor",male,35.0,0,0,PC 17475,26.2875,E24,S +0,3,"Barbara, Miss. Saiide",female,18.0,0,1,2691,14.4542,,C +0,3,"Gallagher, Mr. Martin",male,25.0,0,0,36864,7.7417,,Q +0,3,"Hansen, Mr. Henrik Juul",male,26.0,1,0,350025,7.8542,,S +0,2,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")",male,39.0,0,0,250655,26.0,,S +1,2,"Kelly, Mrs. Florence ""Fannie""",female,45.0,0,0,223596,13.5,,S +1,1,"Calderhead, Mr. Edward Pennington",male,42.0,0,0,PC 17476,26.2875,E24,S +1,1,"Cleaver, Miss. Alice",female,22.0,0,0,113781,151.55,,S +1,3,"Moubarek, Master. Halim Gonios (""William George"")",male,,1,1,2661,15.2458,,C +1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")",female,24.0,0,0,PC 17482,49.5042,C90,C +0,1,"Klaber, Mr. Herman",male,,0,0,113028,26.55,C124,S +1,1,"Taylor, Mr. Elmer Zebley",male,48.0,1,0,19996,52.0,C126,S +0,3,"Larsson, Mr. August Viktor",male,29.0,0,0,7545,9.4833,,S +0,2,"Greenberg, Mr. Samuel",male,52.0,0,0,250647,13.0,,S +0,3,"Soholt, Mr. Peter Andreas Lauritz Andersen",male,19.0,0,0,348124,7.65,F G73,S +1,1,"Endres, Miss. Caroline Louise",female,38.0,0,0,PC 17757,227.525,C45,C +1,2,"Troutt, Miss. Edwina Celia ""Winnie""",female,27.0,0,0,34218,10.5,E101,S +0,3,"McEvoy, Mr. Michael",male,,0,0,36568,15.5,,Q +0,3,"Johnson, Mr. Malkolm Joackim",male,33.0,0,0,347062,7.775,,S +1,2,"Harper, Miss. Annie Jessie ""Nina""",female,6.0,0,1,248727,33.0,,S +0,3,"Jensen, Mr. Svend Lauritz",male,17.0,1,0,350048,7.0542,,S +0,2,"Gillespie, Mr. William Henry",male,34.0,0,0,12233,13.0,,S +0,2,"Hodges, Mr. Henry Price",male,50.0,0,0,250643,13.0,,S +1,1,"Chambers, Mr. Norman Campbell",male,27.0,1,0,113806,53.1,E8,S +0,3,"Oreskovic, Mr. Luka",male,20.0,0,0,315094,8.6625,,S +1,2,"Renouf, Mrs. Peter Henry (Lillian Jefferys)",female,30.0,3,0,31027,21.0,,S +1,3,"Mannion, Miss. Margareth",female,,0,0,36866,7.7375,,Q +0,2,"Bryhl, Mr. Kurt Arnold Gottfrid",male,25.0,1,0,236853,26.0,,S +0,3,"Ilmakangas, Miss. Pieta Sofia",female,25.0,1,0,STON/O2. 3101271,7.925,,S +1,1,"Allen, Miss. Elisabeth Walton",female,29.0,0,0,24160,211.3375,B5,S +0,3,"Hassan, Mr. Houssein G N",male,11.0,0,0,2699,18.7875,,C +0,2,"Knight, Mr. Robert J",male,,0,0,239855,0.0,,S +0,2,"Berriman, Mr. William John",male,23.0,0,0,28425,13.0,,S +0,2,"Troupiansky, Mr. Moses Aaron",male,23.0,0,0,233639,13.0,,S +0,3,"Williams, Mr. Leslie",male,28.5,0,0,54636,16.1,,S +0,3,"Ford, Mrs. Edward (Margaret Ann Watson)",female,48.0,1,3,W./C. 6608,34.375,,S +1,1,"Lesurer, Mr. Gustave J",male,35.0,0,0,PC 17755,512.3292,B101,C +0,3,"Ivanoff, Mr. Kanio",male,,0,0,349201,7.8958,,S +0,3,"Nankoff, Mr. Minko",male,,0,0,349218,7.8958,,S +1,1,"Hawksford, Mr. Walter James",male,,0,0,16988,30.0,D45,S +0,1,"Cavendish, Mr. Tyrell William",male,36.0,1,0,19877,78.85,C46,S +1,1,"Ryerson, Miss. Susan Parker ""Suzette""",female,21.0,2,2,PC 17608,262.375,B57 B59 B63 B66,C +0,3,"McNamee, Mr. Neal",male,24.0,1,0,376566,16.1,,S +1,3,"Stranden, Mr. Juho",male,31.0,0,0,STON/O 2. 3101288,7.925,,S +0,1,"Crosby, Capt. Edward Gifford",male,70.0,1,1,WE/P 5735,71.0,B22,S +0,3,"Abbott, Mr. Rossmore Edward",male,16.0,1,1,C.A. 2673,20.25,,S +1,2,"Sinkkonen, Miss. Anna",female,30.0,0,0,250648,13.0,,S +0,1,"Marvin, Mr. Daniel Warner",male,19.0,1,0,113773,53.1,D30,S +0,3,"Connaghton, Mr. Michael",male,31.0,0,0,335097,7.75,,Q +1,2,"Wells, Miss. Joan",female,4.0,1,1,29103,23.0,,S +1,3,"Moor, Master. Meier",male,6.0,0,1,392096,12.475,E121,S +0,3,"Vande Velde, Mr. Johannes Joseph",male,33.0,0,0,345780,9.5,,S +0,3,"Jonkoff, Mr. Lalio",male,23.0,0,0,349204,7.8958,,S +1,2,"Herman, Mrs. Samuel (Jane Laver)",female,48.0,1,2,220845,65.0,,S +1,2,"Hamalainen, Master. Viljo",male,0.67,1,1,250649,14.5,,S +0,3,"Carlsson, Mr. August Sigfrid",male,28.0,0,0,350042,7.7958,,S +0,2,"Bailey, Mr. Percy Andrew",male,18.0,0,0,29108,11.5,,S +0,3,"Theobald, Mr. Thomas Leonard",male,34.0,0,0,363294,8.05,,S +1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)",female,33.0,0,0,110152,86.5,B77,S +0,3,"Garfirth, Mr. John",male,,0,0,358585,14.5,,S +0,3,"Nirva, Mr. Iisakki Antino Aijo",male,41.0,0,0,SOTON/O2 3101272,7.125,,S +1,3,"Barah, Mr. Hanna Assi",male,20.0,0,0,2663,7.2292,,C +1,1,"Carter, Mrs. William Ernest (Lucile Polk)",female,36.0,1,2,113760,120.0,B96 B98,S +0,3,"Eklund, Mr. Hans Linus",male,16.0,0,0,347074,7.775,,S +1,1,"Hogeboom, Mrs. John C (Anna Andrews)",female,51.0,1,0,13502,77.9583,D11,S +0,1,"Brewe, Dr. Arthur Jackson",male,,0,0,112379,39.6,,C +0,3,"Mangan, Miss. Mary",female,30.5,0,0,364850,7.75,,Q +0,3,"Moran, Mr. Daniel J",male,,1,0,371110,24.15,,Q +0,3,"Gronnestad, Mr. Daniel Danielsen",male,32.0,0,0,8471,8.3625,,S +0,3,"Lievens, Mr. Rene Aime",male,24.0,0,0,345781,9.5,,S +0,3,"Jensen, Mr. Niels Peder",male,48.0,0,0,350047,7.8542,,S +0,2,"Mack, Mrs. (Mary)",female,57.0,0,0,S.O./P.P. 3,10.5,E77,S +0,3,"Elias, Mr. Dibo",male,,0,0,2674,7.225,,C +1,2,"Hocking, Mrs. Elizabeth (Eliza Needs)",female,54.0,1,3,29105,23.0,,S +0,3,"Myhrman, Mr. Pehr Fabian Oliver Malkolm",male,18.0,0,0,347078,7.75,,S +0,3,"Tobin, Mr. Roger",male,,0,0,383121,7.75,F38,Q +1,3,"Emanuel, Miss. Virginia Ethel",female,5.0,0,0,364516,12.475,,S +0,3,"Kilgannon, Mr. Thomas J",male,,0,0,36865,7.7375,,Q +1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)",female,43.0,0,1,24160,211.3375,B3,S +1,3,"Ayoub, Miss. Banoura",female,13.0,0,0,2687,7.2292,,C +1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)",female,17.0,1,0,17474,57.0,B20,S +0,1,"Long, Mr. Milton Clyde",male,29.0,0,0,113501,30.0,D6,S +0,3,"Johnston, Mr. Andrew G",male,,1,2,W./C. 6607,23.45,,S +0,3,"Ali, Mr. William",male,25.0,0,0,SOTON/O.Q. 3101312,7.05,,S +0,3,"Harmer, Mr. Abraham (David Lishin)",male,25.0,0,0,374887,7.25,,S +1,3,"Sjoblom, Miss. Anna Sofia",female,18.0,0,0,3101265,7.4958,,S +0,3,"Rice, Master. George Hugh",male,8.0,4,1,382652,29.125,,Q +1,3,"Dean, Master. Bertram Vere",male,1.0,1,2,C.A. 2315,20.575,,S +0,1,"Guggenheim, Mr. Benjamin",male,46.0,0,0,PC 17593,79.2,B82 B84,C +0,3,"Keane, Mr. Andrew ""Andy""",male,,0,0,12460,7.75,,Q +0,2,"Gaskell, Mr. Alfred",male,16.0,0,0,239865,26.0,,S +0,3,"Sage, Miss. Stella Anna",female,,8,2,CA. 2343,69.55,,S +0,1,"Hoyt, Mr. William Fisher",male,,0,0,PC 17600,30.6958,,C +0,3,"Dantcheff, Mr. Ristiu",male,25.0,0,0,349203,7.8958,,S +0,2,"Otter, Mr. Richard",male,39.0,0,0,28213,13.0,,S +1,1,"Leader, Dr. Alice (Farnham)",female,49.0,0,0,17465,25.9292,D17,S +1,3,"Osman, Mrs. Mara",female,31.0,0,0,349244,8.6833,,S +0,3,"Ibrahim Shawah, Mr. Yousseff",male,30.0,0,0,2685,7.2292,,C +0,3,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)",female,30.0,1,1,345773,24.15,,S +0,2,"Ponesell, Mr. Martin",male,34.0,0,0,250647,13.0,,S +1,2,"Collyer, Mrs. Harvey (Charlotte Annie Tate)",female,31.0,1,1,C.A. 31921,26.25,,S +1,1,"Carter, Master. William Thornton II",male,11.0,1,2,113760,120.0,B96 B98,S +1,3,"Thomas, Master. Assad Alexander",male,0.42,0,1,2625,8.5167,,C +1,3,"Hedman, Mr. Oskar Arvid",male,27.0,0,0,347089,6.975,,S +0,3,"Johansson, Mr. Karl Johan",male,31.0,0,0,347063,7.775,,S +0,1,"Andrews, Mr. Thomas Jr",male,39.0,0,0,112050,0.0,A36,S +0,3,"Pettersson, Miss. Ellen Natalia",female,18.0,0,0,347087,7.775,,S +0,2,"Meyer, Mr. August",male,39.0,0,0,248723,13.0,,S +1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)",female,33.0,1,0,113806,53.1,E8,S +0,3,"Alexander, Mr. William",male,26.0,0,0,3474,7.8875,,S +0,3,"Lester, Mr. James",male,39.0,0,0,A/4 48871,24.15,,S +0,2,"Slemen, Mr. Richard James",male,35.0,0,0,28206,10.5,,S +0,3,"Andersson, Miss. Ebba Iris Alfrida",female,6.0,4,2,347082,31.275,,S +0,3,"Tomlin, Mr. Ernest Portage",male,30.5,0,0,364499,8.05,,S +0,1,"Fry, Mr. Richard",male,,0,0,112058,0.0,B102,S +0,3,"Heininen, Miss. Wendla Maria",female,23.0,0,0,STON/O2. 3101290,7.925,,S +0,2,"Mallet, Mr. Albert",male,31.0,1,1,S.C./PARIS 2079,37.0042,,C +0,3,"Holm, Mr. John Fredrik Alexander",male,43.0,0,0,C 7075,6.45,,S +0,3,"Skoog, Master. Karl Thorsten",male,10.0,3,2,347088,27.9,,S +1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)",female,52.0,1,1,12749,93.5,B69,S +1,3,"Lulic, Mr. Nikola",male,27.0,0,0,315098,8.6625,,S +0,1,"Reuchlin, Jonkheer. John George",male,38.0,0,0,19972,0.0,,S +1,3,"Moor, Mrs. (Beila)",female,27.0,0,1,392096,12.475,E121,S +0,3,"Panula, Master. Urho Abraham",male,2.0,4,1,3101295,39.6875,,S +0,3,"Flynn, Mr. John",male,,0,0,368323,6.95,,Q +0,3,"Lam, Mr. Len",male,,0,0,1601,56.4958,,S +1,2,"Mallet, Master. Andre",male,1.0,0,2,S.C./PARIS 2079,37.0042,,C +1,3,"McCormack, Mr. Thomas Joseph",male,,0,0,367228,7.75,,Q +1,1,"Stone, Mrs. George Nelson (Martha Evelyn)",female,62.0,0,0,113572,80.0,B28, +1,3,"Yasbeck, Mrs. Antoni (Selini Alexander)",female,15.0,1,0,2659,14.4542,,C +1,2,"Richards, Master. George Sibley",male,0.83,1,1,29106,18.75,,S +0,3,"Saad, Mr. Amin",male,,0,0,2671,7.2292,,C +0,3,"Augustsson, Mr. Albert",male,23.0,0,0,347468,7.8542,,S +0,3,"Allum, Mr. Owen George",male,18.0,0,0,2223,8.3,,S +1,1,"Compton, Miss. Sara Rebecca",female,39.0,1,1,PC 17756,83.1583,E49,C +0,3,"Pasic, Mr. Jakob",male,21.0,0,0,315097,8.6625,,S +0,3,"Sirota, Mr. Maurice",male,,0,0,392092,8.05,,S +1,3,"Chip, Mr. Chang",male,32.0,0,0,1601,56.4958,,S +1,1,"Marechal, Mr. Pierre",male,,0,0,11774,29.7,C47,C +0,3,"Alhomaki, Mr. Ilmari Rudolf",male,20.0,0,0,SOTON/O2 3101287,7.925,,S +0,2,"Mudd, Mr. Thomas Charles",male,16.0,0,0,S.O./P.P. 3,10.5,,S +1,1,"Serepeca, Miss. Augusta",female,30.0,0,0,113798,31.0,,C +0,3,"Lemberopolous, Mr. Peter L",male,34.5,0,0,2683,6.4375,,C +0,3,"Culumovic, Mr. Jeso",male,17.0,0,0,315090,8.6625,,S +0,3,"Abbing, Mr. Anthony",male,42.0,0,0,C.A. 5547,7.55,,S +0,3,"Sage, Mr. Douglas Bullen",male,,8,2,CA. 2343,69.55,,S +0,3,"Markoff, Mr. Marin",male,35.0,0,0,349213,7.8958,,C +0,2,"Harper, Rev. John",male,28.0,0,1,248727,33.0,,S +1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)",female,,1,0,17453,89.1042,C92,C +0,3,"Andersson, Master. Sigvard Harald Elias",male,4.0,4,2,347082,31.275,,S +0,3,"Svensson, Mr. Johan",male,74.0,0,0,347060,7.775,,S +0,3,"Boulos, Miss. Nourelain",female,9.0,1,1,2678,15.2458,,C +1,1,"Lines, Miss. Mary Conover",female,16.0,0,1,PC 17592,39.4,D28,S +0,2,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)",female,44.0,1,0,244252,26.0,,S +1,3,"Aks, Mrs. Sam (Leah Rosen)",female,18.0,0,1,392091,9.35,,S +1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)",female,45.0,1,1,36928,164.8667,,S +1,1,"Daly, Mr. Peter Denis ",male,51.0,0,0,113055,26.55,E17,S +1,3,"Baclini, Mrs. Solomon (Latifa Qurban)",female,24.0,0,3,2666,19.2583,,C +0,3,"Razi, Mr. Raihed",male,,0,0,2629,7.2292,,C +0,3,"Hansen, Mr. Claus Peter",male,41.0,2,0,350026,14.1083,,S +0,2,"Giles, Mr. Frederick Edward",male,21.0,1,0,28134,11.5,,S +1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)",female,48.0,0,0,17466,25.9292,D17,S +0,3,"Sage, Miss. Dorothy Edith ""Dolly""",female,,8,2,CA. 2343,69.55,,S +0,2,"Gill, Mr. John William",male,24.0,0,0,233866,13.0,,S +1,2,"Bystrom, Mrs. (Karolina)",female,42.0,0,0,236852,13.0,,S +1,2,"Duran y More, Miss. Asuncion",female,27.0,1,0,SC/PARIS 2149,13.8583,,C +0,1,"Roebling, Mr. Washington Augustus II",male,31.0,0,0,PC 17590,50.4958,A24,S +0,3,"van Melkebeke, Mr. Philemon",male,,0,0,345777,9.5,,S +1,3,"Johnson, Master. Harold Theodor",male,4.0,1,1,347742,11.1333,,S +0,3,"Balkic, Mr. Cerin",male,26.0,0,0,349248,7.8958,,S +1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)",female,47.0,1,1,11751,52.5542,D35,S +0,1,"Carlsson, Mr. Frans Olof",male,33.0,0,0,695,5.0,B51 B53 B55,S +0,3,"Vander Cruyssen, Mr. Victor",male,47.0,0,0,345765,9.0,,S +1,2,"Abelson, Mrs. Samuel (Hannah Wizosky)",female,28.0,1,0,P/PP 3381,24.0,,C +1,3,"Najib, Miss. Adele Kiamie ""Jane""",female,15.0,0,0,2667,7.225,,C +0,3,"Gustafsson, Mr. Alfred Ossian",male,20.0,0,0,7534,9.8458,,S +0,3,"Petroff, Mr. Nedelio",male,19.0,0,0,349212,7.8958,,S +0,3,"Laleff, Mr. Kristo",male,,0,0,349217,7.8958,,S +1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)",female,56.0,0,1,11767,83.1583,C50,C +1,2,"Shelley, Mrs. William (Imanita Parrish Hall)",female,25.0,0,1,230433,26.0,,S +0,3,"Markun, Mr. Johann",male,33.0,0,0,349257,7.8958,,S +0,3,"Dahlberg, Miss. Gerda Ulrika",female,22.0,0,0,7552,10.5167,,S +0,2,"Banfield, Mr. Frederick James",male,28.0,0,0,C.A./SOTON 34068,10.5,,S +0,3,"Sutehall, Mr. Henry Jr",male,25.0,0,0,SOTON/OQ 392076,7.05,,S +0,3,"Rice, Mrs. William (Margaret Norton)",female,39.0,0,5,382652,29.125,,Q +0,2,"Montvila, Rev. Juozas",male,27.0,0,0,211536,13.0,,S +1,1,"Graham, Miss. Margaret Edith",female,19.0,0,0,112053,30.0,B42,S +0,3,"Johnston, Miss. Catherine Helen ""Carrie""",female,,1,2,W./C. 6607,23.45,,S +1,1,"Behr, Mr. Karl Howell",male,26.0,0,0,111369,30.0,C148,C +0,3,"Dooley, Mr. Patrick",male,32.0,0,0,370376,7.75,,Q diff --git a/examples/data/titanic.parquet b/examples/data/titanic.parquet new file mode 100644 index 00000000..1adcffc1 Binary files /dev/null and b/examples/data/titanic.parquet differ diff --git a/examples/dummy_lgbm_model.txt b/examples/dummy_lgbm_model.txt new file mode 100644 index 00000000..6e0846e5 --- /dev/null +++ b/examples/dummy_lgbm_model.txt @@ -0,0 +1,2057 @@ +tree +version=v3 +num_class=1 +num_tree_per_iteration=1 +label_index=0 +max_feature_idx=29 +objective=regression +feature_names=GrLivArea LotArea TotalBsmtSF BsmtFinSF1 GarageArea 1stFlrSF LotFrontage YearRemodAdd BsmtUnfSF OpenPorchSF YearBuilt MoSold GarageYrBlt WoodDeckSF MasVnrArea OverallQual 2ndFlrSF YrSold OverallCond TotRmsAbvGrd SaleCondition GarageCars Exterior1st Exterior2nd MSZoning LotShape FullBath MSSubClass BsmtFinType1 GarageType +feature_infos=[334:4676] [1300:215245] [0:3206] [0:2260] [0:1390] [334:3228] [-1:313] [1950:2010] [0:2336] [0:523] [1880:2010] [1:12] [-1:2010] [0:857] [-1:1600] [1:10] [0:1872] [2006:2010] [1:9] [2:14] [136484.10000000001:276231.63043478259] [0:4] [147842.80272108843:217282.56353591161] [149512.62857142856:217427.96067415731] [124618.875:192085.46441947567] [166996.89201877936:240991.02702702704] [0:3] [20:190] [109344.5:234944.58528428094] [112672.63636363637:265713.56666666665] +tree_sizes=480 483 481 478 484 482 479 479 481 479 484 481 480 477 484 476 479 483 483 483 476 480 479 481 476 483 483 482 480 479 476 395 482 480 481 480 482 483 480 485 478 476 397 399 398 478 479 480 478 481 397 477 477 482 476 480 481 481 401 482 476 479 479 480 477 482 479 479 398 478 483 400 478 479 396 477 482 475 480 400 476 477 396 482 394 479 395 482 394 478 477 396 479 483 479 473 481 396 484 477 + +Tree=0 +num_leaves=4 +num_cat=0 +split_feature=21 0 3 +split_gain=2.59365e+12 9.27982e+11 3.33957e+11 +threshold=2.5000000000000004 1413.0000000000002 1316.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=176739.84555689053 192611.28726208894 183186.65049630578 205709.82935226848 +leaf_weight=468 103 427 24 +leaf_count=468 103 427 24 +internal_value=181713 179816 195087 +internal_weight=0 895 127 +internal_count=1022 895 127 +is_linear=0 +shrinkage=1 + + +Tree=1 +num_leaves=4 +num_cat=0 +split_feature=15 15 15 +split_gain=2.64749e+12 6.96363e+11 3.22677e+11 +threshold=7.5000000000000009 6.5000000000000009 8.5000000000000018 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-3918.1628255504602 8916.4605405610182 2528.5916307616653 18814.144246773099 +leaf_weight=632 116 228 46 +leaf_count=632 116 228 46 +internal_value=0 -2209.02 11726.9 +internal_weight=0 860 162 +internal_count=1022 860 162 +is_linear=0 +shrinkage=0.1 + + +Tree=2 +num_leaves=4 +num_cat=0 +split_feature=21 21 14 +split_gain=1.76903e+12 6.00549e+11 2.27721e+11 +threshold=2.5000000000000004 1.5000000000000002 363.50000000000006 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-5073.6062002833896 8173.4109849250181 346.43893367787103 17289.616513671874 +leaf_weight=316 87 579 40 +leaf_count=316 87 579 40 +internal_value=0 -1567.23 11044.7 +internal_weight=0 895 127 +internal_count=1022 895 127 +is_linear=0 +shrinkage=0.1 + + +Tree=3 +num_leaves=4 +num_cat=0 +split_feature=15 15 0 +split_gain=1.87185e+12 5.12508e+11 2.81736e+11 +threshold=7.5000000000000009 5.5000000000000009 1968.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-4660.1023593707232 6222.9259406048322 268.8910118056221 14641.44367745536 +leaf_weight=371 92 489 70 +leaf_count=371 92 489 70 +internal_value=0 -1857.45 9860.56 +internal_weight=0 860 162 +internal_count=1022 860 162 +is_linear=0 +shrinkage=0.1 + + +Tree=4 +num_leaves=4 +num_cat=0 +split_feature=12 14 26 +split_gain=1.0313e+12 4.81585e+11 1.8779e+11 +threshold=1991.5000000000002 198.00000000000003 1.5000000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3822.3058164708755 1523.0613536974452 8879.9747824928982 -136.13220229993027 +leaf_weight=408 273 132 209 +leaf_count=408 273 132 209 +internal_value=0 3920.87 -2573.67 +internal_weight=0 405 617 +internal_count=1022 405 617 +is_linear=0 +shrinkage=0.1 + + +Tree=5 +num_leaves=4 +num_cat=0 +split_feature=10 5 5 +split_gain=1.01927e+12 5.29758e+11 2.61607e+11 +threshold=1984.5000000000002 1681.0000000000002 1096.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-4244.8688787948731 2305.4923015650088 12151.614462139423 -23.837262006845986 +leaf_weight=371 343 65 243 +leaf_count=371 343 65 243 +internal_value=0 3874.11 -2574.33 +internal_weight=0 408 614 +internal_count=1022 408 614 +is_linear=0 +shrinkage=0.1 + + +Tree=6 +num_leaves=4 +num_cat=0 +split_feature=10 5 5 +split_gain=8.25606e+11 4.29104e+11 2.14151e+11 +threshold=1984.5000000000002 1681.0000000000002 1136.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3687.8059264869025 2074.9430769984297 10936.453017578126 227.25421033992325 +leaf_weight=399 343 65 215 +leaf_count=399 343 65 215 +internal_value=0 3486.7 -2316.9 +internal_weight=0 408 614 +internal_count=1022 408 614 +is_linear=0 +shrinkage=0.1 + + +Tree=7 +num_leaves=4 +num_cat=0 +split_feature=15 29 1 +split_gain=1.02406e+12 2.89517e+11 1.62772e+11 +threshold=7.5000000000000009 168810.74044897326 12092.500000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-3626.4799039167847 4731.7977885343598 120.6079468426437 11215.814460372925 +leaf_weight=343 98 517 64 +leaf_count=343 98 517 64 +internal_value=0 -1373.87 7293.38 +internal_weight=0 860 162 +internal_count=1022 860 162 +is_linear=0 +shrinkage=0.1 + + +Tree=8 +num_leaves=4 +num_cat=0 +split_feature=0 15 2 +split_gain=9.30827e+11 2.39753e+11 2.19581e+11 +threshold=1800.5000000000002 8.5000000000000018 1307.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2503.3426203844629 4232.4158200620996 13221.063035714287 1534.9659462418667 +leaf_weight=620 195 35 172 +leaf_count=620 195 35 172 +internal_value=0 5600.25 -1626.34 +internal_weight=0 230 792 +internal_count=1022 230 792 +is_linear=0 +shrinkage=0.1 + + +Tree=9 +num_leaves=4 +num_cat=0 +split_feature=0 2 29 +split_gain=7.54643e+11 1.8653e+11 1.83477e+11 +threshold=1819.0000000000002 1391.5000000000002 168810.74044897326 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3312.391989705533 3081.5540701027685 9196.2411547851571 -211.9373277751242 +leaf_weight=316 149 75 482 +leaf_count=316 149 75 482 +internal_value=0 5128.88 -1439.69 +internal_weight=0 224 798 +internal_count=1022 224 798 +is_linear=0 +shrinkage=0.1 + + +Tree=10 +num_leaves=4 +num_cat=0 +split_feature=15 15 24 +split_gain=6.76158e+11 2.19999e+11 7.85839e+10 +threshold=6.5000000000000009 8.5000000000000018 189582.0075720567 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3968.3854978047889 2405.8328337026196 9769.3376239610752 -1382.2014378423451 +leaf_weight=156 344 46 476 +leaf_count=156 344 46 476 +internal_value=0 3274.35 -2020.56 +internal_weight=0 390 632 +internal_count=1022 390 632 +is_linear=0 +shrinkage=0.1 + + +Tree=11 +num_leaves=4 +num_cat=0 +split_feature=21 26 3 +split_gain=4.27304e+11 1.60924e+11 1.07737e+11 +threshold=2.5000000000000004 1.5000000000000002 1316.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-2103.6924310031468 4022.2154519682949 578.1689545620693 11462.00917154948 +leaf_weight=450 103 445 24 +leaf_count=450 103 445 24 +internal_value=0 -770.253 5428.16 +internal_weight=0 895 127 +internal_count=1022 895 127 +is_linear=0 +shrinkage=0.1 + + +Tree=12 +num_leaves=4 +num_cat=0 +split_feature=0 15 0 +split_gain=4.97015e+11 1.42425e+11 1.27794e+11 +threshold=1928.5000000000002 6.5000000000000009 2650.0000000000005 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1874.105771408081 3655.860931239984 973.87778686523438 11228.409690504808 +leaf_weight=590 156 250 26 +leaf_count=590 156 250 26 +internal_value=0 -1026.49 4737.65 +internal_weight=0 840 182 +internal_count=1022 840 182 +is_linear=0 +shrinkage=0.1 + + +Tree=13 +num_leaves=4 +num_cat=0 +split_feature=0 0 2 +split_gain=4.15358e+11 2.09118e+11 5.45546e+10 +threshold=2295.5000000000005 1491.0000000000002 1521.0000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1825.2287940044509 5642.2757908241429 1174.6336956288555 11804.603649902345 +leaf_weight=547 51 404 20 +leaf_count=547 51 404 20 +internal_value=0 -550.839 7378.14 +internal_weight=0 951 71 +internal_count=1022 951 71 +is_linear=0 +shrinkage=0.1 + + +Tree=14 +num_leaves=4 +num_cat=0 +split_feature=15 29 19 +split_gain=3.63271e+11 1.22009e+11 1.07442e+11 +threshold=7.5000000000000009 168810.74044897326 9.5000000000000018 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-2280.5990772892364 3192.2080158431445 151.89607842775564 10102.485995370371 +leaf_weight=343 135 517 27 +leaf_count=343 135 517 27 +internal_value=0 -818.274 4343.92 +internal_weight=0 860 162 +internal_count=1022 860 162 +is_linear=0 +shrinkage=0.1 + + +Tree=15 +num_leaves=4 +num_cat=0 +split_feature=3 16 5 +split_gain=2.55756e+11 1.63838e+11 4.21403e+10 +threshold=1111.0000000000002 1064.5000000000002 1853.0000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-886.78169729662341 3804.4793236287437 4178.4360197647757 8872.5659749348961 +leaf_weight=857 75 69 21 +leaf_count=857 75 69 21 +internal_value=0 -509.352 4913.12 +internal_weight=0 926 96 +internal_count=1022 926 96 +is_linear=0 +shrinkage=0.1 + + +Tree=16 +num_leaves=4 +num_cat=0 +split_feature=4 3 1 +split_gain=2.25653e+11 8.63072e+10 7.16319e+10 +threshold=545.00000000000011 1150.5000000000002 12157.500000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1458.4891075659771 1369.2001507078876 5549.8686558024092 1500.9751009007505 +leaf_weight=588 279 60 95 +leaf_count=588 279 60 95 +internal_value=0 2109.14 -1046.85 +internal_weight=0 339 683 +internal_count=1022 339 683 +is_linear=0 +shrinkage=0.1 + + +Tree=17 +num_leaves=4 +num_cat=0 +split_feature=15 19 15 +split_gain=2.56576e+11 1.12745e+11 5.68612e+10 +threshold=6.5000000000000009 9.5000000000000018 4.5000000000000009 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3513.8966630651594 1491.5633945582958 7518.7717615464153 -848.19428116211657 +leaf_weight=94 356 34 538 +leaf_count=94 356 34 538 +internal_value=0 2017.01 -1244.68 +internal_weight=0 390 632 +internal_count=1022 390 632 +is_linear=0 +shrinkage=0.1 + + +Tree=18 +num_leaves=4 +num_cat=0 +split_feature=15 3 3 +split_gain=2.07826e+11 1.08857e+11 6.79971e+10 +threshold=6.5000000000000009 939.50000000000011 151.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2585.3725749517507 880.42509008979164 4800.9147722798007 -385.88530114688103 +leaf_weight=211 297 93 421 +leaf_count=211 297 93 421 +internal_value=0 1815.31 -1120.21 +internal_weight=0 390 632 +internal_count=1022 390 632 +is_linear=0 +shrinkage=0.1 + + +Tree=19 +num_leaves=4 +num_cat=0 +split_feature=15 15 3 +split_gain=1.69035e+11 7.51004e+10 4.42753e+10 +threshold=7.5000000000000009 5.5000000000000009 1316.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1631.0263863494133 2191.1925677191944 255.78664375414394 6503.5348976266796 +leaf_weight=371 133 489 29 +leaf_count=371 133 489 29 +internal_value=0 -558.176 2963.16 +internal_weight=0 860 162 +internal_count=1022 860 162 +is_linear=0 +shrinkage=0.1 + + +Tree=20 +num_leaves=4 +num_cat=0 +split_feature=0 2 2 +split_gain=1.81612e+11 8.78194e+10 2.64372e+10 +threshold=2295.5000000000005 791.00000000000011 1501.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1999.9994289320025 3628.189388183594 200.29562365438846 7856.2565220424112 +leaf_weight=244 50 707 21 +leaf_count=244 50 707 21 +internal_value=0 -364.239 4878.74 +internal_weight=0 951 71 +internal_count=1022 951 71 +is_linear=0 +shrinkage=0.1 + + +Tree=21 +num_leaves=4 +num_cat=0 +split_feature=7 19 2 +split_gain=1.34028e+11 8.37936e+10 4.63562e+10 +threshold=1986.5000000000002 9.5000000000000018 649.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3815.749265289307 680.42737524548374 5660.0616289986501 -901.53572439723268 +leaf_weight=64 551 36 371 +leaf_count=64 551 36 371 +internal_value=0 985.822 -1330.29 +internal_weight=0 587 435 +internal_count=1022 587 435 +is_linear=0 +shrinkage=0.1 + + +Tree=22 +num_leaves=4 +num_cat=0 +split_feature=2 5 16 +split_gain=1.164e+11 5.35518e+10 3.93979e+10 +threshold=1023.0000000000001 1962.5000000000002 758.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1553.7608758542956 841.60962430466998 5343.2804652622772 424.19735251034012 +leaf_weight=388 470 28 136 +leaf_count=388 470 28 136 +internal_value=0 1094.72 -1040.4 +internal_weight=0 498 524 +internal_count=1022 498 524 +is_linear=0 +shrinkage=0.1 + + +Tree=23 +num_leaves=4 +num_cat=0 +split_feature=0 0 1 +split_gain=1.26393e+11 4.33627e+10 4.24158e+10 +threshold=1928.5000000000002 1199.5000000000002 12436.500000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1476.6179083628372 1154.0413443825462 20.663459857954855 4276.0710376527577 +leaf_weight=302 110 538 72 +leaf_count=302 110 538 72 +internal_value=0 -517.645 2389.13 +internal_weight=0 840 182 +internal_count=1022 840 182 +is_linear=0 +shrinkage=0.1 + + +Tree=24 +num_leaves=4 +num_cat=0 +split_feature=0 3 0 +split_gain=1.04916e+11 6.62594e+10 1.3762e+10 +threshold=2295.5000000000005 299.50000000000006 2682.0000000000005 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1213.3916086772276 2713.2621352175447 467.09480052156272 5656.4292297363281 +leaf_weight=421 47 530 24 +leaf_count=421 47 530 24 +internal_value=0 -276.843 3708.14 +internal_weight=0 951 71 +internal_count=1022 951 71 +is_linear=0 +shrinkage=0.1 + + +Tree=25 +num_leaves=4 +num_cat=0 +split_feature=7 3 3 +split_gain=8.87914e+10 5.52961e+10 3.46548e+10 +threshold=1986.5000000000002 769.50000000000011 223.50000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2213.4621137242116 213.37235872851107 2401.6846571137635 -378.18934163335547 +leaf_weight=167 429 158 268 +leaf_count=167 429 158 268 +internal_value=0 802.39 -1082.77 +internal_weight=0 587 435 +internal_count=1022 587 435 +is_linear=0 +shrinkage=0.1 + + +Tree=26 +num_leaves=4 +num_cat=0 +split_feature=1 2 19 +split_gain=8.52422e+10 4.32062e+10 4.22401e+10 +threshold=12157.500000000002 649.50000000000011 9.5000000000000018 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-2374.5907876616543 1282.7225623791037 -183.33354777111097 5666.4331928710944 +leaf_weight=103 182 712 25 +leaf_count=103 182 712 25 +internal_value=0 -460.265 1812.16 +internal_weight=0 815 207 +internal_count=1022 815 207 +is_linear=0 +shrinkage=0.1 + + +Tree=27 +num_leaves=4 +num_cat=0 +split_feature=0 3 12 +split_gain=8.24995e+10 4.38867e+10 2.37281e+10 +threshold=1531.0000000000002 687.50000000000011 1920.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2644.5185771004099 315.0541506846746 2424.4675462137857 -560.40170986201065 +leaf_weight=61 288 150 523 +leaf_count=61 288 150 523 +internal_value=0 1037.46 -778.092 +internal_weight=0 438 584 +internal_count=1022 438 584 +is_linear=0 +shrinkage=0.1 + + +Tree=28 +num_leaves=4 +num_cat=0 +split_feature=0 7 2 +split_gain=6.90532e+10 3.78761e+10 2.84193e+10 +threshold=1751.0000000000002 1979.5000000000002 601.00000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2318.2443776682808 -964.51871224862555 2006.3961275748659 -279.74554579415047 +leaf_weight=76 54 209 683 +leaf_count=76 54 209 683 +internal_value=0 1396.4 -483.864 +internal_weight=0 263 759 +internal_count=1022 263 759 +is_linear=0 +shrinkage=0.1 + + +Tree=29 +num_leaves=4 +num_cat=0 +split_feature=9 5 18 +split_gain=5.923e+10 4.16565e+10 2.23871e+10 +threshold=25.500000000000004 1651.5000000000002 3.5000000000000004 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-3947.7601824079243 362.92153931029111 2791.3649829640108 -614.58688310585831 +leaf_weight=21 418 85 498 +leaf_count=21 418 85 498 +internal_value=0 773.295 -749.455 +internal_weight=0 503 519 +internal_count=1022 503 519 +is_linear=0 +shrinkage=0.1 + + +Tree=30 +num_leaves=4 +num_cat=0 +split_feature=0 24 14 +split_gain=5.44137e+10 3.70441e+10 1.13497e+10 +threshold=2295.5000000000005 155848.71286231888 423.50000000000006 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1658.9894508413718 1795.28430074056 67.49649413402993 4496.9835035241167 +leaf_weight=147 48 804 23 +leaf_count=147 48 804 23 +internal_value=0 -199.374 2670.48 +internal_weight=0 951 71 +internal_count=1022 951 71 +is_linear=0 +shrinkage=0.1 + + +Tree=31 +num_leaves=3 +num_cat=0 +split_feature=12 18 +split_gain=4.89408e+10 3.56072e+10 +threshold=2007.5000000000002 4.5000000000000009 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-2582.98451461792 3570.4852908572634 13.497498178854185 +leaf_weight=56 37 929 +leaf_count=56 37 929 +internal_value=0 -134.12 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=32 +num_leaves=4 +num_cat=0 +split_feature=7 5 13 +split_gain=4.36022e+10 3.04925e+10 1.08592e+10 +threshold=1979.5000000000002 1362.5000000000002 193.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1038.2497241946014 14.662336440919672 1483.8007767433346 453.86590940241234 +leaf_weight=338 412 215 57 +leaf_count=338 412 215 57 +internal_value=0 518.434 -822.932 +internal_weight=0 627 395 +internal_count=1022 627 395 +is_linear=0 +shrinkage=0.1 + + +Tree=33 +num_leaves=4 +num_cat=0 +split_feature=3 15 4 +split_gain=3.96913e+10 2.29836e+10 1.58517e+10 +threshold=687.50000000000011 4.5000000000000009 804.00000000000011 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1938.8965880257745 732.91728120654705 -182.65618654785737 3009.1855810546876 +leaf_weight=84 243 660 35 +leaf_count=84 243 660 35 +internal_value=0 -380.941 1019.5 +internal_weight=0 744 278 +internal_count=1022 744 278 +is_linear=0 +shrinkage=0.1 + + +Tree=34 +num_leaves=4 +num_cat=0 +split_feature=2 10 3 +split_gain=3.30501e+10 2.44604e+10 1.567e+10 +threshold=1023.0000000000001 2007.5000000000002 217.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1122.5199630343725 432.65752198115115 3843.2639670632107 -28.021171457627243 +leaf_weight=252 476 22 272 +leaf_count=252 476 22 272 +internal_value=0 583.327 -554.383 +internal_weight=0 498 524 +internal_count=1022 498 524 +is_linear=0 +shrinkage=0.1 + + +Tree=35 +num_leaves=4 +num_cat=0 +split_feature=9 5 20 +split_gain=3.45095e+10 2.38112e+10 1.34328e+10 +threshold=26.500000000000004 1651.5000000000002 160980.88452953301 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1890.665523176051 283.63894609671377 2129.4604288555324 -374.05250511075116 +leaf_weight=67 416 84 455 +leaf_count=67 416 84 455 +internal_value=0 593.737 -568.714 +internal_weight=0 500 522 +internal_count=1022 500 522 +is_linear=0 +shrinkage=0.1 + + +Tree=36 +num_leaves=4 +num_cat=0 +split_feature=1 19 12 +split_gain=4.03473e+10 2.33551e+10 2.09521e+10 +threshold=12377.000000000002 9.5000000000000018 1920.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1869.8857379120666 928.14145139591426 4466.5011695498515 -138.46095488210022 +leaf_weight=77 167 21 757 +leaf_count=77 167 21 757 +internal_value=0 1323.38 -298.317 +internal_weight=0 188 834 +internal_count=1022 188 834 +is_linear=0 +shrinkage=0.1 + + +Tree=37 +num_leaves=4 +num_cat=0 +split_feature=1 1 19 +split_gain=3.26813e+10 1.96759e+10 1.89176e+10 +threshold=12377.000000000002 6222.0000000000009 9.5000000000000018 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1285.0933679789882 835.32731293090092 -36.416878540421095 4019.8510727655321 +leaf_weight=155 167 679 21 +leaf_count=155 167 679 21 +internal_value=0 -268.485 1191.05 +internal_weight=0 834 188 +internal_count=1022 834 188 +is_linear=0 +shrinkage=0.1 + + +Tree=38 +num_leaves=4 +num_cat=0 +split_feature=1 7 13 +split_gain=2.6844e+10 2.0255e+10 1.45209e+10 +threshold=12799.000000000002 1977.5000000000002 313.50000000000006 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-843.21610206598461 821.57031448152338 157.21822965374102 3697.1329376220706 +leaf_weight=327 144 531 20 +leaf_count=327 144 531 20 +internal_value=0 -224.066 1172.25 +internal_weight=0 858 164 +internal_count=1022 858 164 +is_linear=0 +shrinkage=0.1 + + +Tree=39 +num_leaves=4 +num_cat=0 +split_feature=0 3 3 +split_gain=2.58776e+10 1.90996e+10 1.18046e+10 +threshold=1480.0000000000002 299.50000000000006 169.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1107.3120972981058 -158.02213993676651 1100.9342938980967 -128.54876519247543 +leaf_weight=192 221 265 344 +leaf_count=192 221 265 344 +internal_value=0 528.446 -479.151 +internal_weight=0 486 536 +internal_count=1022 486 536 +is_linear=0 +shrinkage=0.1 + + +Tree=40 +num_leaves=4 +num_cat=0 +split_feature=20 0 8 +split_gain=2.32216e+10 2.6208e+10 3.02901e+09 +threshold=160980.88452953301 1942.0000000000002 734.00000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1155.7989328206381 -89.404524908590759 1314.6300523366988 -2467.602959541653 +leaf_weight=75 763 161 23 +leaf_count=75 763 161 23 +internal_value=0 155.238 -1463.67 +internal_weight=0 924 98 +internal_count=1022 924 98 +is_linear=0 +shrinkage=0.1 + + +Tree=41 +num_leaves=4 +num_cat=0 +split_feature=1 18 2 +split_gain=2.1604e+10 1.9567e+10 4.918e+09 +threshold=7248.0000000000009 4.5000000000000009 1266.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1009.6349960364005 -1822.8454855275709 371.11278630943707 402.46023352486748 +leaf_weight=207 43 744 28 +leaf_count=207 43 744 28 +internal_value=0 251.24 -841.385 +internal_weight=0 787 235 +internal_count=1022 787 235 +is_linear=0 +shrinkage=0.1 + + +Tree=42 +num_leaves=3 +num_cat=0 +split_feature=12 1 +split_gain=2.35774e+10 2.24146e+10 +threshold=2007.5000000000002 20165.500000000004 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-187.33237016130602 2478.2203006228888 2321.5388523411107 +leaf_weight=948 37 37 +leaf_count=948 37 37 +internal_value=0 -93.0905 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=43 +num_leaves=3 +num_cat=0 +split_feature=12 3 +split_gain=1.90977e+10 1.78436e+10 +threshold=2007.5000000000002 56.500000000000007 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-662.19184530125881 2230.3982755093962 229.41101756603322 +leaf_weight=346 37 639 +leaf_count=346 37 639 +internal_value=0 -83.7815 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=44 +num_leaves=3 +num_cat=0 +split_feature=0 3 +split_gain=1.91603e+10 1.75301e+10 +threshold=2682.0000000000005 56.500000000000007 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-632.43168025313128 2792.1315452575686 243.58642495670676 +leaf_weight=354 24 644 +leaf_count=354 24 644 +internal_value=0 -67.1454 +internal_weight=0 998 +internal_count=1022 998 +is_linear=0 +shrinkage=0.1 + + +Tree=45 +num_leaves=4 +num_cat=0 +split_feature=12 9 5 +split_gain=1.72816e+10 1.64773e+10 1.92541e+09 +threshold=1920.5000000000002 46.500000000000007 744.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2225.6932556878955 -204.31477311951136 659.494296752531 -1113.1441621208191 +leaf_weight=21 587 354 60 +leaf_count=21 587 354 60 +internal_value=0 120.646 -1401.58 +internal_weight=0 941 81 +internal_count=1022 941 81 +is_linear=0 +shrinkage=0.1 + + +Tree=46 +num_leaves=4 +num_cat=0 +split_feature=20 18 4 +split_gain=1.67268e+10 1.25838e+10 5.17032e+09 +threshold=160980.88452953301 4.5000000000000009 540.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-862.91037169122092 -1518.6317033941095 214.27129427476362 -2633.0878813244049 +leaf_weight=77 44 880 21 +leaf_count=77 44 880 21 +internal_value=0 131.752 -1242.23 +internal_weight=0 924 98 +internal_count=1022 924 98 +is_linear=0 +shrinkage=0.1 + + +Tree=47 +num_leaves=4 +num_cat=0 +split_feature=20 2 2 +split_gain=1.35487e+10 1.36028e+10 3.02367e+09 +threshold=160980.88452953301 865.00000000000011 1233.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-827.93036982548699 -407.29952479686324 398.52105604554492 -2181.6386145455499 +leaf_weight=77 321 603 21 +leaf_count=77 321 603 21 +internal_value=0 118.577 -1118.01 +internal_weight=0 924 98 +internal_count=1022 924 98 +is_linear=0 +shrinkage=0.1 + + +Tree=48 +num_leaves=4 +num_cat=0 +split_feature=0 3 10 +split_gain=1.51782e+10 1.19134e+10 6.21884e+09 +threshold=2348.5000000000005 137.00000000000003 1976.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-560.92293195562854 11.511357421875001 169.90126086688952 2130.8006249576147 +leaf_weight=354 20 603 45 +leaf_count=354 20 603 45 +internal_value=0 -100.435 1478.71 +internal_weight=0 957 65 +internal_count=1022 957 65 +is_linear=0 +shrinkage=0.1 + + +Tree=49 +num_leaves=4 +num_cat=0 +split_feature=0 12 0 +split_gain=1.40805e+10 1.16912e+10 7.28706e+09 +threshold=1345.5000000000002 2007.5000000000002 770.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-2175.7071522588317 208.65586436140185 2233.7726885986331 -344.77708123862141 +leaf_weight=23 573 30 396 +leaf_count=23 573 30 396 +internal_value=0 309.408 -445.282 +internal_weight=0 603 419 +internal_count=1022 603 419 +is_linear=0 +shrinkage=0.1 + + +Tree=50 +num_leaves=3 +num_cat=0 +split_feature=1 20 +split_gain=1.48674e+10 2.05551e+10 +threshold=20165.500000000004 226255.62831835286 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-217.00467156970512 1967.9266444850612 1384.5443927418103 +leaf_weight=897 37 88 +leaf_count=897 37 88 +internal_value=0 -73.9221 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=51 +num_leaves=4 +num_cat=0 +split_feature=1 0 0 +split_gain=1.28963e+10 1.08065e+10 2.50768e+09 +threshold=6222.0000000000009 2682.0000000000005 1214.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1277.641986986617 90.628358554953223 2242.5789235432944 -470.34551742190411 +leaf_weight=71 843 24 84 +leaf_count=71 843 24 84 +internal_value=0 150.198 -840.139 +internal_weight=0 867 155 +internal_count=1022 867 155 +is_linear=0 +shrinkage=0.1 + + +Tree=52 +num_leaves=4 +num_cat=0 +split_feature=1 20 11 +split_gain=1.17471e+10 1.40508e+10 1.29699e+10 +threshold=14955.500000000002 226255.62831835286 7.5000000000000009 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-218.85643209472943 1909.4283895874025 1158.907550807058 -929.06997902610101 +leaf_weight=859 60 81 22 +leaf_count=859 60 81 22 +internal_value=0 -100.134 1147.88 +internal_weight=0 940 82 +internal_count=1022 940 82 +is_linear=0 +shrinkage=0.1 + + +Tree=53 +num_leaves=4 +num_cat=0 +split_feature=18 9 1 +split_gain=1.22982e+10 1.60593e+10 1.44635e+10 +threshold=5.5000000000000009 19.000000000000004 15549.500000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-911.67197968664243 267.13355534096729 123.81846428305744 2553.2427758789063 +leaf_weight=242 357 393 30 +leaf_count=242 357 393 30 +internal_value=0 -270.809 444.351 +internal_weight=0 635 387 +internal_count=1022 635 387 +is_linear=0 +shrinkage=0.1 + + +Tree=54 +num_leaves=4 +num_cat=0 +split_feature=12 0 7 +split_gain=1.01292e+10 1.2254e+10 1.22343e+09 +threshold=1920.5000000000002 2682.0000000000005 1954.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1579.7575443522137 36.531467168349309 2424.6988375577062 -774.96204741234874 +leaf_weight=30 919 22 51 +leaf_count=30 919 22 51 +internal_value=0 92.3653 -1073.03 +internal_weight=0 941 81 +internal_count=1022 941 81 +is_linear=0 +shrinkage=0.1 + + +Tree=55 +num_leaves=4 +num_cat=0 +split_feature=1 1 0 +split_gain=9.35945e+09 7.50168e+09 2.28034e+09 +threshold=6125.0000000000009 21143.000000000004 1440.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-980.00972419594825 66.853560425132841 1582.1096328735352 -130.38054055107963 +leaf_weight=106 837 34 45 +leaf_count=106 837 34 45 +internal_value=0 126.002 -726.809 +internal_weight=0 871 151 +internal_count=1022 871 151 +is_linear=0 +shrinkage=0.1 + + +Tree=56 +num_leaves=4 +num_cat=0 +split_feature=18 9 1 +split_gain=1.00402e+10 1.23894e+10 1.04729e+10 +threshold=5.5000000000000009 19.000000000000004 15549.500000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-807.58304519022795 250.68981636231689 101.92872693350601 2196.028094075521 +leaf_weight=242 357 393 30 +leaf_count=242 357 393 30 +internal_value=0 -244.688 401.491 +internal_weight=0 635 387 +internal_count=1022 635 387 +is_linear=0 +shrinkage=0.1 + + +Tree=57 +num_leaves=4 +num_cat=0 +split_feature=3 0 20 +split_gain=8.77188e+09 8.1295e+09 6.72775e+09 +threshold=295.50000000000006 1630.5000000000002 226255.62831835286 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-475.07416951656342 -28.500779137611392 753.23036359814114 696.12446528843475 +leaf_weight=395 360 211 56 +leaf_count=395 360 211 56 +internal_value=0 260.37 -329.648 +internal_weight=0 571 451 +internal_count=1022 571 451 +is_linear=0 +shrinkage=0.1 + + +Tree=58 +num_leaves=3 +num_cat=0 +split_feature=18 27 +split_gain=8.51771e+09 7.27905e+09 +threshold=3.5000000000000004 87.500000000000014 +decision_type=2 2 +left_child=-1 -2 +right_child=1 -3 +leaf_value=-1946.366621537642 164.05574279118045 -557.58517737168643 +leaf_weight=22 832 168 +leaf_count=22 832 168 +internal_value=0 42.8201 +internal_weight=0 1000 +internal_count=1022 1000 +is_linear=0 +shrinkage=0.1 + + +Tree=59 +num_leaves=4 +num_cat=0 +split_feature=18 7 0 +split_gain=8.02553e+09 8.29775e+09 8.2427e+09 +threshold=5.5000000000000009 2008.5000000000002 1251.0000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-287.24784752253021 -123.28919233992292 1689.3829767400571 800.61883741652616 +leaf_weight=613 185 22 202 +leaf_count=613 185 22 202 +internal_value=0 -218.766 358.957 +internal_weight=0 635 387 +internal_count=1022 635 387 +is_linear=0 +shrinkage=0.1 + + +Tree=60 +num_leaves=4 +num_cat=0 +split_feature=20 1 2 +split_gain=7.26032e+09 8.73992e+09 2.96238e+09 +threshold=160980.88452953301 21143.000000000004 1233.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-531.29292273583349 29.499546539289554 1737.4810349002962 -1871.2119297572547 +leaf_weight=77 893 31 21 +leaf_count=77 893 31 21 +internal_value=0 86.802 -818.418 +internal_weight=0 924 98 +internal_count=1022 924 98 +is_linear=0 +shrinkage=0.1 + + +Tree=61 +num_leaves=4 +num_cat=0 +split_feature=7 1 18 +split_gain=7.362e+09 5.79825e+09 3.90019e+09 +threshold=1973.5000000000002 5962.5000000000009 6.5000000000000009 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-536.64568408444632 -541.29175935644855 299.62520987585515 422.69436940765382 +leaf_weight=278 95 599 50 +leaf_count=278 95 599 50 +internal_value=0 184.514 -390.405 +internal_weight=0 694 328 +internal_count=1022 694 328 +is_linear=0 +shrinkage=0.1 + + +Tree=62 +num_leaves=4 +num_cat=0 +split_feature=3 9 9 +split_gain=6.99542e+09 9.07403e+09 7.44503e+09 +threshold=56.500000000000007 234.50000000000003 164.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-462.93201216591734 259.30687837421891 -1903.7456204986572 1522.0629754638674 +leaf_weight=342 640 20 20 +leaf_count=342 640 20 20 +internal_value=0 193.76 -353.264 +internal_weight=0 660 362 +internal_count=1022 660 362 +is_linear=0 +shrinkage=0.1 + + +Tree=63 +num_leaves=4 +num_cat=0 +split_feature=7 6 8 +split_gain=6.22703e+09 8.25025e+09 4.47427e+09 +threshold=1992.5000000000002 98.500000000000014 1199.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-196.36784672552938 122.13280682265156 1598.2521922041731 -1723.8329809570314 +leaf_weight=466 495 41 20 +leaf_count=466 495 41 20 +internal_value=0 235.045 -259.226 +internal_weight=0 536 486 +internal_count=1022 536 486 +is_linear=0 +shrinkage=0.1 + + +Tree=64 +num_leaves=4 +num_cat=0 +split_feature=0 12 0 +split_gain=6.80734e+09 6.16447e+09 1.75448e+09 +threshold=865.00000000000011 2007.5000000000002 770.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1635.5476538616679 22.842544700446304 1357.0724789089627 -592.60898397940173 +leaf_weight=23 909 36 54 +leaf_count=23 909 36 54 +internal_value=0 73.6704 -904.136 +internal_weight=0 945 77 +internal_count=1022 945 77 +is_linear=0 +shrinkage=0.1 + + +Tree=65 +num_leaves=4 +num_cat=0 +split_feature=18 10 10 +split_gain=6.60009e+09 8.64469e+09 8.1507e+09 +threshold=5.5000000000000009 1930.5000000000002 1982.5000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1774.2906013257577 207.51910929509106 -112.00264812856418 2110.3227813720705 +leaf_weight=33 363 602 24 +leaf_count=33 363 602 24 +internal_value=0 -198.389 325.522 +internal_weight=0 635 387 +internal_count=1022 635 387 +is_linear=0 +shrinkage=0.1 + + +Tree=66 +num_leaves=4 +num_cat=0 +split_feature=13 18 1 +split_gain=5.94121e+09 6.14538e+09 5.28754e+09 +threshold=305.50000000000006 6.5000000000000009 13212.000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-188.37803724906536 306.18635069105363 450.79653450868983 2227.8748604910716 +leaf_weight=769 45 187 21 +leaf_count=769 45 187 21 +internal_value=0 -63.3512 917.633 +internal_weight=0 956 66 +internal_count=1022 956 66 +is_linear=0 +shrinkage=0.1 + + +Tree=67 +num_leaves=4 +num_cat=0 +split_feature=3 13 9 +split_gain=5.26469e+09 7.53706e+09 5.8511e+09 +threshold=56.500000000000007 370.50000000000006 164.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-403.68589766987589 101.03850417249785 1871.2131806640625 1356.0397917175294 +leaf_weight=342 635 25 20 +leaf_count=342 635 25 20 +internal_value=0 168.091 -306.463 +internal_weight=0 660 362 +internal_count=1022 660 362 +is_linear=0 +shrinkage=0.1 + + +Tree=68 +num_leaves=3 +num_cat=0 +split_feature=18 2 +split_gain=4.97181e+09 4.35349e+09 +threshold=3.5000000000000004 1964.0000000000002 +decision_type=2 2 +left_child=-1 -2 +right_child=1 -3 +leaf_value=-1487.0325035788796 2.1558481833055629 1457.3399332682293 +leaf_weight=22 979 21 +leaf_count=22 979 21 +internal_value=0 32.7147 +internal_weight=0 1000 +internal_count=1022 1000 +is_linear=0 +shrinkage=0.1 + + +Tree=69 +num_leaves=4 +num_cat=0 +split_feature=10 9 12 +split_gain=5.57904e+09 5.69539e+09 9.98467e+08 +threshold=1914.5000000000002 234.50000000000003 1929.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1608.050404575893 84.676914270436839 -1580.1176693870909 -644.04346316944475 +leaf_weight=21 958 21 22 +leaf_count=21 958 21 22 +internal_value=0 48.9663 -1114.84 +internal_weight=0 979 43 +internal_count=1022 979 43 +is_linear=0 +shrinkage=0.1 + + +Tree=70 +num_leaves=4 +num_cat=0 +split_feature=18 16 9 +split_gain=4.71089e+09 6.55363e+09 5.94235e+09 +threshold=5.5000000000000009 1034.5000000000002 19.000000000000004 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-557.44298606115933 178.95012345482934 2037.8169586181641 72.443170223284625 +leaf_weight=242 367 20 393 +leaf_count=242 367 20 393 +internal_value=0 275.016 -167.608 +internal_weight=0 387 635 +internal_count=1022 387 635 +is_linear=0 +shrinkage=0.1 + + +Tree=71 +num_leaves=3 +num_cat=0 +split_feature=12 18 +split_gain=5.00666e+09 5.49018e+09 +threshold=2007.5000000000002 5.5000000000000009 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-232.41758806359189 1141.9990489650418 251.20251544275436 +leaf_weight=599 37 386 +leaf_count=599 37 386 +internal_value=0 -42.8974 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=72 +num_leaves=4 +num_cat=0 +split_feature=0 8 5 +split_gain=5.39402e+09 4.99897e+09 1.9861e+09 +threshold=893.00000000000011 475.00000000000006 764.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1630.9015216064454 308.77934941844603 -153.69368414593137 -493.37112866025984 +leaf_weight=20 452 484 66 +leaf_count=20 452 484 66 +internal_value=0 69.6373 -757.913 +internal_weight=0 936 86 +internal_count=1022 936 86 +is_linear=0 +shrinkage=0.1 + + +Tree=73 +num_leaves=4 +num_cat=0 +split_feature=10 6 11 +split_gain=4.94369e+09 5.29607e+09 3.37294e+09 +threshold=1920.5000000000002 98.500000000000014 7.5000000000000009 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-354.80662499789537 -1.5178812387330192 920.97072330304059 -1809.0049910805444 +leaf_weight=58 875 67 22 +leaf_count=58 875 67 22 +internal_value=0 64.0944 -754.711 +internal_weight=0 942 80 +internal_count=1022 942 80 +is_linear=0 +shrinkage=0.1 + + +Tree=74 +num_leaves=3 +num_cat=0 +split_feature=12 12 +split_gain=3.98834e+09 3.21671e+09 +threshold=2007.5000000000002 1920.5000000000002 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-641.9990300684799 1019.266410538957 15.806491890127681 +leaf_weight=81 37 904 +leaf_count=81 37 904 +internal_value=0 -38.2872 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=75 +num_leaves=4 +num_cat=0 +split_feature=0 13 0 +split_gain=4.10366e+09 3.78364e+09 1.15128e+09 +threshold=893.00000000000011 305.50000000000006 770.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1266.6191473919414 6.7287881402215604 809.17429373604909 -439.99957149445066 +leaf_weight=23 873 63 63 +leaf_count=23 873 63 63 +internal_value=0 60.7395 -661.072 +internal_weight=0 936 86 +internal_count=1022 936 86 +is_linear=0 +shrinkage=0.1 + + +Tree=76 +num_leaves=4 +num_cat=0 +split_feature=1 28 24 +split_gain=3.70242e+09 3.37577e+09 1.16417e+09 +threshold=5962.5000000000009 155650.56469126113 155848.71286231888 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-790.1780440359405 -239.66495491150886 194.82765151752324 -198.44571305460005 +leaf_weight=66 248 641 67 +leaf_count=66 248 641 67 +internal_value=0 73.6194 -492.087 +internal_weight=0 889 133 +internal_count=1022 889 133 +is_linear=0 +shrinkage=0.1 + + +Tree=77 +num_leaves=4 +num_cat=0 +split_feature=20 4 1 +split_gain=3.76415e+09 5.53243e+09 5.16443e+09 +threshold=160980.88452953301 465.50000000000006 21143.000000000004 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=34.67358003813645 18.452272337628372 -1494.0427594947814 1331.3794140200462 +leaf_weight=58 893 40 31 +leaf_count=58 893 40 31 +internal_value=0 -589.292 62.5007 +internal_weight=0 98 924 +internal_count=1022 98 924 +is_linear=0 +shrinkage=0.1 + + +Tree=78 +num_leaves=4 +num_cat=0 +split_feature=18 0 0 +split_gain=3.95424e+09 5.5891e+09 3.64181e+09 +threshold=6.5000000000000009 2348.5000000000005 1243.0000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-165.02599154415083 -58.489877698839329 947.34081357320156 780.27989260011964 +leaf_weight=766 97 48 111 +leaf_count=766 97 48 111 +internal_value=0 -99.4319 389.123 +internal_weight=0 814 208 +internal_count=1022 814 208 +is_linear=0 +shrinkage=0.1 + + +Tree=79 +num_leaves=3 +num_cat=0 +split_feature=12 13 +split_gain=3.22579e+09 3.07581e+09 +threshold=2008.5000000000002 302.50000000000006 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-73.428358919445287 1226.5911237444195 618.50459174557011 +leaf_weight=932 21 69 +leaf_count=932 21 69 +internal_value=0 -25.7327 +internal_weight=0 1001 +internal_count=1022 1001 +is_linear=0 +shrinkage=0.1 + + +Tree=80 +num_leaves=4 +num_cat=0 +split_feature=10 9 0 +split_gain=4.36759e+09 5.1008e+09 1.73116e+09 +threshold=1914.5000000000002 234.50000000000003 1736.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-366.48307339061392 77.120167037191379 -1498.3782964797247 -1635.8356547037761 +leaf_weight=22 958 21 21 +leaf_count=22 958 21 21 +internal_value=0 43.325 -986.399 +internal_weight=0 979 43 +internal_count=1022 979 43 +is_linear=0 +shrinkage=0.1 + + +Tree=81 +num_leaves=4 +num_cat=0 +split_feature=10 18 5 +split_gain=3.53775e+09 4.34837e+09 7.40298e+08 +threshold=1914.5000000000002 5.5000000000000009 959.00000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-500.84055335003399 -118.917463079632 320.2696357223121 -1332.7162939453126 +leaf_weight=23 627 352 20 +leaf_count=23 627 352 20 +internal_value=0 38.9925 -887.76 +internal_weight=0 979 43 +internal_count=1022 979 43 +is_linear=0 +shrinkage=0.1 + + +Tree=82 +num_leaves=3 +num_cat=0 +split_feature=6 0 +split_gain=4.21176e+09 1.70928e+10 +threshold=110.50000000000001 2682.0000000000005 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-25.202687149637754 -1147.7897429435484 2858.4803252447218 +leaf_weight=970 31 21 +leaf_count=970 31 21 +internal_value=0 35.9046 +internal_weight=0 991 +internal_count=1022 991 +is_linear=0 +shrinkage=0.1 + + +Tree=83 +num_leaves=4 +num_cat=0 +split_feature=0 11 10 +split_gain=3.31121e+09 3.80315e+09 2.18306e+09 +threshold=1164.5000000000002 1.5000000000000002 1949.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-761.10115030367081 1276.8242359302662 67.633964046424552 -127.04708327122455 +leaf_weight=73 27 710 212 +leaf_count=73 27 710 212 +internal_value=0 111.933 -289.454 +internal_weight=0 737 285 +internal_count=1022 737 285 +is_linear=0 +shrinkage=0.1 + + +Tree=84 +num_leaves=3 +num_cat=0 +split_feature=6 6 +split_gain=3.46976e+09 1.57759e+10 +threshold=110.50000000000001 100.50000000000001 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-32.9023526178864 -1041.7907766157582 2463.3186139106751 +leaf_weight=965 31 26 +leaf_count=965 31 26 +internal_value=0 32.5888 +internal_weight=0 991 +internal_count=1022 991 +is_linear=0 +shrinkage=0.1 + + +Tree=85 +num_leaves=4 +num_cat=0 +split_feature=3 9 9 +split_gain=3.2834e+09 5.76409e+09 4.26004e+09 +threshold=56.500000000000007 234.50000000000003 164.00000000000003 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-324.97903989267633 184.98708324670793 -1538.9934998321532 1176.5485630798339 +leaf_weight=342 640 20 20 +leaf_count=342 640 20 20 +internal_value=0 132.745 -242.022 +internal_weight=0 660 362 +internal_count=1022 660 362 +is_linear=0 +shrinkage=0.1 + + +Tree=86 +num_leaves=3 +num_cat=0 +split_feature=3 20 +split_gain=2.84413e+09 4.24507e+09 +threshold=1413.0000000000002 226255.62831835286 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-88.18825203796554 1053.4811750488282 662.8685319947034 +leaf_weight=915 25 82 +leaf_count=915 25 82 +internal_value=0 -26.4163 +internal_weight=0 997 +internal_count=1022 997 +is_linear=0 +shrinkage=0.1 + + +Tree=87 +num_leaves=4 +num_cat=0 +split_feature=18 10 24 +split_gain=3.28537e+09 4.92709e+09 2.03031e+09 +threshold=6.5000000000000009 1918.5000000000002 189582.0075720567 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-1445.0724506084737 -130.31346530601627 -45.943328422701299 555.94796402600355 +leaf_weight=26 61 788 147 +leaf_count=26 61 788 147 +internal_value=0 -90.633 354.689 +internal_weight=0 814 208 +internal_count=1022 814 208 +is_linear=0 +shrinkage=0.1 + + +Tree=88 +num_leaves=3 +num_cat=0 +split_feature=6 3 +split_gain=2.7485e+09 1.48235e+10 +threshold=110.50000000000001 1413.0000000000002 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-30.61165030042002 -927.21080086000518 2538.0701100225033 +leaf_weight=968 31 23 +leaf_count=968 31 23 +internal_value=0 29.0046 +internal_weight=0 991 +internal_count=1022 991 +is_linear=0 +shrinkage=0.1 + + +Tree=89 +num_leaves=4 +num_cat=0 +split_feature=20 4 0 +split_gain=2.62105e+09 4.75773e+09 3.13926e+09 +threshold=160980.88452953301 465.50000000000006 1343.0000000000002 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=86.892578335466055 -176.98830850280351 -1330.7566235351562 200.42290966523524 +leaf_weight=58 363 40 561 +leaf_count=58 363 40 561 +internal_value=0 -491.74 52.1542 +internal_weight=0 98 924 +internal_count=1022 98 924 +is_linear=0 +shrinkage=0.1 + + +Tree=90 +num_leaves=4 +num_cat=0 +split_feature=6 6 2 +split_gain=2.71267e+09 1.13869e+10 4.04267e+09 +threshold=98.500000000000014 110.50000000000001 1818.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-7.9495578699670491 1711.1299489021303 -842.28801978326612 -1207.0613828461746 +leaf_weight=922 40 31 29 +leaf_count=922 40 31 29 +internal_value=0 596.257 -44.5155 +internal_weight=0 71 951 +internal_count=1022 71 951 +is_linear=0 +shrinkage=0.1 + + +Tree=91 +num_leaves=3 +num_cat=0 +split_feature=10 9 +split_gain=2.53909e+09 4.34496e+09 +threshold=1912.5000000000002 241.50000000000003 +decision_type=2 2 +left_child=-1 -2 +right_child=1 -3 +leaf_value=-802.08261429636104 61.241908298871834 -1427.902906227112 +leaf_weight=38 964 20 +leaf_count=38 964 20 +internal_value=0 30.9747 +internal_weight=0 984 +internal_count=1022 984 +is_linear=0 +shrinkage=0.1 + + +Tree=92 +num_leaves=4 +num_cat=0 +split_feature=18 1 12 +split_gain=3.09846e+09 4.98618e+09 2.9239e+09 +threshold=5.5000000000000009 15549.500000000002 2007.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-188.53582203822066 118.98485188043419 1461.2692496744794 739.36912150912815 +leaf_weight=599 357 30 36 +leaf_count=599 357 30 36 +internal_value=0 223.038 -135.93 +internal_weight=0 387 635 +internal_count=1022 387 635 +is_linear=0 +shrinkage=0.1 + + +Tree=93 +num_leaves=4 +num_cat=0 +split_feature=18 10 10 +split_gain=2.50975e+09 4.26582e+09 3.18791e+09 +threshold=5.5000000000000009 1982.5000000000002 1930.5000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1079.3275784579191 115.36556426513295 1491.9334780375164 -69.877557163618732 +leaf_weight=33 363 24 602 +leaf_count=33 363 24 602 +internal_value=0 200.734 -122.337 +internal_weight=0 387 635 +internal_count=1022 387 635 +is_linear=0 +shrinkage=0.1 + + +Tree=94 +num_leaves=4 +num_cat=0 +split_feature=0 8 5 +split_gain=2.44241e+09 3.52794e+09 1.04465e+09 +threshold=893.00000000000011 475.00000000000006 764.50000000000011 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1143.1326968383789 247.75756613680747 -140.75658399960227 -318.14516675544513 +leaf_weight=20 452 484 66 +leaf_count=20 452 484 66 +internal_value=0 46.8592 -510.003 +internal_weight=0 936 86 +internal_count=1022 936 86 +is_linear=0 +shrinkage=0.1 + + +Tree=95 +num_leaves=4 +num_cat=0 +split_feature=4 5 4 +split_gain=2.38381e+09 1.02667e+10 9.2895e+09 +threshold=854.50000000000011 1931.0000000000002 888.50000000000011 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-16.906141931920494 -1905.5930835865163 2121.224996815557 937.8741467285156 +leaf_weight=952 27 23 20 +leaf_count=952 27 23 20 +internal_value=0 33.5318 -695.607 +internal_weight=0 975 47 +internal_count=1022 975 47 +is_linear=0 +shrinkage=0.1 + + +Tree=96 +num_leaves=4 +num_cat=0 +split_feature=18 9 24 +split_gain=2.24628e+09 4.37865e+09 1.30852e+09 +threshold=6.5000000000000009 46.500000000000007 189582.0075720567 +decision_type=2 2 2 +left_child=1 -1 -2 +right_child=2 -3 -4 +leaf_value=-255.89192755853708 -96.077181888017506 222.33259108221378 454.854300264112 +leaf_weight=506 61 308 147 +leaf_count=506 61 308 147 +internal_value=0 -74.9421 293.283 +internal_weight=0 814 208 +internal_count=1022 814 208 +is_linear=0 +shrinkage=0.1 + + +Tree=97 +num_leaves=3 +num_cat=0 +split_feature=25 10 +split_gain=2.22404e+09 3.36226e+09 +threshold=221771.90657709737 1912.5000000000002 +decision_type=2 2 +left_child=1 -1 +right_child=-2 -3 +leaf_value=-977.18288091023771 761.13686506941519 7.39359265211636 +leaf_weight=36 37 949 +leaf_count=36 37 949 +internal_value=0 -28.5909 +internal_weight=0 985 +internal_count=1022 985 +is_linear=0 +shrinkage=0.1 + + +Tree=98 +num_leaves=4 +num_cat=0 +split_feature=3 9 27 +split_gain=2.02325e+09 4.73206e+09 2.28581e+09 +threshold=684.50000000000011 190.00000000000003 87.500000000000014 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-9.5362704536222633 341.10285868171519 -1254.7174726104738 -486.35091426849368 +leaf_weight=620 262 20 120 +leaf_count=620 262 20 120 +internal_value=0 227.924 -86.8576 +internal_weight=0 282 740 +internal_count=1022 282 740 +is_linear=0 +shrinkage=0.1 + + +Tree=99 +num_leaves=4 +num_cat=0 +split_feature=6 6 2 +split_gain=1.95865e+09 8.86123e+09 4.02389e+09 +threshold=98.500000000000014 110.50000000000001 1818.0000000000002 +decision_type=2 2 2 +left_child=2 -2 -1 +right_child=1 -3 -4 +leaf_value=-1.3452065188655886 1490.1447200012208 -762.35838578747166 -1197.6687579977101 +leaf_weight=922 40 31 29 +leaf_count=922 40 31 29 +internal_value=0 506.657 -37.8262 +internal_weight=0 71 951 +internal_count=1022 71 951 +is_linear=0 +shrinkage=0.1 + + +end of trees + +feature_importances: +GrLivArea=40 +BsmtFinSF1=25 +LotArea=23 +OverallCond=20 +TotalBsmtSF=17 +OverallQual=17 +OpenPorchSF=16 +YearBuilt=16 +GarageYrBlt=16 +1stFlrSF=14 +SaleCondition=11 +LotFrontage=10 +YearRemodAdd=9 +GarageArea=7 +WoodDeckSF=6 +TotRmsAbvGrd=6 +MSZoning=5 +BsmtUnfSF=4 +GarageCars=4 +MoSold=3 +MasVnrArea=3 +2ndFlrSF=3 +GarageType=3 +FullBath=2 +MSSubClass=2 +LotShape=1 +BsmtFinType1=1 + +parameters: +[boosting: gbdt] +[objective: regression] +[metric: l2] +[tree_learner: serial] +[device_type: cpu] +[data: ] +[valid: ] +[num_iterations: 100] +[learning_rate: 0.1] +[num_leaves: 4] +[num_threads: -1] +[deterministic: 0] +[force_col_wise: 0] +[force_row_wise: 0] +[histogram_pool_size: -1] +[max_depth: 2] +[min_data_in_leaf: 20] +[min_sum_hessian_in_leaf: 20] +[bagging_fraction: 0.6] +[pos_bagging_fraction: 1] +[neg_bagging_fraction: 1] +[bagging_freq: 0] +[bagging_seed: 7719] +[feature_fraction: 0.5] +[feature_fraction_bynode: 1] +[feature_fraction_seed: 2437] +[extra_trees: 0] +[extra_seed: 11797] +[early_stopping_round: 0] +[first_metric_only: 0] +[max_delta_step: 0] +[lambda_l1: 0] +[lambda_l2: 0] +[linear_lambda: 0] +[min_gain_to_split: 0] +[drop_rate: 0.1] +[max_drop: 50] +[skip_drop: 0.5] +[xgboost_dart_mode: 0] +[uniform_drop: 0] +[drop_seed: 21238] +[top_rate: 0.2] +[other_rate: 0.1] +[min_data_per_group: 100] +[max_cat_threshold: 32] +[cat_l2: 10] +[cat_smooth: 10] +[max_cat_to_onehot: 4] +[top_k: 20] +[monotone_constraints: ] +[monotone_constraints_method: basic] +[monotone_penalty: 0] +[feature_contri: ] +[forcedsplits_filename: ] +[refit_decay_rate: 0.9] +[cegb_tradeoff: 1] +[cegb_penalty_split: 0] +[cegb_penalty_feature_lazy: ] +[cegb_penalty_feature_coupled: ] +[path_smooth: 0] +[interaction_constraints: ] +[verbosity: -1] +[saved_feature_importance_type: 0] +[linear_tree: 0] +[max_bin: 255] +[max_bin_by_feature: ] +[min_data_in_bin: 3] +[bin_construct_sample_cnt: 200000] +[data_random_seed: 38] +[is_enable_sparse: 1] +[enable_bundle: 1] +[use_missing: 1] +[zero_as_missing: 0] +[feature_pre_filter: 1] +[pre_partition: 0] +[two_round: 0] +[header: 0] +[label_column: ] +[weight_column: ] +[group_column: ] +[ignore_column: ] +[categorical_feature: ] +[forcedbins_filename: ] +[precise_float_parser: 0] +[objective_seed: 8855] +[num_class: 1] +[is_unbalance: 0] +[scale_pos_weight: 1] +[sigmoid: 1] +[boost_from_average: 1] +[reg_sqrt: 0] +[alpha: 0.9] +[fair_c: 1] +[poisson_max_delta_step: 0.7] +[tweedie_variance_power: 1.5] +[lambdarank_truncation_level: 30] +[lambdarank_norm: 1] +[label_gain: ] +[eval_at: ] +[multi_error_top_k: 1] +[auc_mu_weights: ] +[num_machines: 1] +[local_listen_port: 12400] +[time_out: 120] +[machine_list_filename: ] +[machines: ] +[gpu_platform_id: -1] +[gpu_device_id: -1] +[gpu_use_dp: 0] +[num_gpu: 1] + +end of parameters + +pandas_categorical:[] diff --git a/examples/house_price.ipynb b/examples/house_price.ipynb index d94ef3f0..0917a9e0 100644 --- a/examples/house_price.ipynb +++ b/examples/house_price.ipynb @@ -14,7 +14,8 @@ "outputs": [], "source": [ "import warnings\n", - "warnings.filterwarnings('ignore')" + "\n", + "warnings.filterwarnings(\"ignore\")" ] }, { @@ -31,66 +32,45 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. Koalas will set it for you but it does not work if there is a Spark context already launched.\n" - ] - } - ], + "outputs": [], "source": [ "import copy\n", "import dill\n", "import numpy as np\n", "import pandas as pd\n", - "import databricks.koalas as ks\n", "from pandas.testing import assert_frame_equal\n", "from lightgbm import LGBMRegressor\n", - "from xgboost import XGBRegressor\n", + "import treelite\n", + "import treelite_runtime\n", "from sklearn.model_selection import KFold\n", - "from hyperopt import hp\n", - "from hyperopt import tpe\n", - "from sklearn.metrics import r2_score" + "from sklearn.model_selection import RandomizedSearchCV\n", + "from sklearn.metrics import make_scorer\n", + "from sklearn.metrics import mean_absolute_error\n", + "from sklearn.tree import DecisionTreeRegressor\n", + "import seaborn as sns\n", + "\n", + "cmap = sns.color_palette(\"viridis\", as_cmap=True)\n", + "cmap = sns.color_palette(\"vlag\", as_cmap=True)" ] }, { - "cell_type": "code", - "execution_count": 4, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "21/09/30 09:47:18 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", - "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", - "Setting default log level to \"WARN\".\n", - "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", - "21/09/30 09:47:19 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.\n" - ] - } - ], "source": [ - "from pyspark import SparkConf, SparkContext\n", - "conf = SparkConf()\n", - "conf.set('spark.executor.memory', '2g')\n", - "SparkContext(conf=conf)\n", - "ks.set_option('compute.default_index_type', 'distributed-sequence')" + "**Gators** imports" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from gators.util import util\n", + "\n", "# sampling\n", "from gators.sampling import UnsupervisedSampling\n", - "# frame converter\n", - "from gators.converter import KoalasToPandas\n", + "\n", "# data cleaninng\n", "from gators.data_cleaning import (\n", " DropHighNaNRatio,\n", @@ -100,35 +80,48 @@ " DropColumns,\n", " KeepColumns,\n", ")\n", + "\n", "# imputers\n", - "from gators.imputers import IntImputer, ObjectImputer\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "\n", "# encoders\n", "from gators.encoders import (\n", - " WOEEncoder, \n", + " WOEEncoder,\n", " TargetEncoder,\n", - " RegressionEncoder, \n", + " OrdinalEncoder,\n", ")\n", + "\n", "# binning\n", - "from gators.binning import BinRareEvents\n", + "from gators.binning import (\n", + " BinRareCategories,\n", + " TreeBinning,\n", + ")\n", + "\n", "# feature generation\n", "from gators.feature_generation import (\n", " ClusterStatistics,\n", " PolynomialFeatures,\n", + " PolynomialObjectFeatures,\n", ")\n", + "\n", "# feature selection\n", "from gators.feature_selection import (\n", " InformationValue,\n", " SelectFromModel,\n", ")\n", + "\n", "# model building\n", - "from gators.model_building (\n", + "from gators.model_building import (\n", " TrainTestSplit,\n", - " HyperOpt,\n", " XGBBoosterBuilder,\n", " XGBTreeliteDumper,\n", " LGBMTreeliteDumper,\n", ")\n", - "# pipeline\n", + "\n", + "# # pipeline\n", "from gators.pipeline import Pipeline" ] }, @@ -136,58 +129,155 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## offline pipeline - feature selection" + "## data analysis" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "model = LGBMRegressor(\n", - " random_state=0, n_estimators=100, max_depth=3)\n", - "k=25\n", - "polynomial_columns = ['GrLivArea', 'OverallQual','BsmtFinSF1',\n", - " 'LotArea','TotalBsmtSF']\n", - "offline_steps = [\n", - " BinRareEvents(min_ratio=0.2),\n", - " ObjectImputer(strategy='constant', value='MISSING'),\n", - " OrdinalEncoder(),\n", - " IntImputer(strategy='constant', value=0),\n", - " PolynomialFeatures(\n", - " degree=2, \n", - " columns=polynomial_columns,\n", - " interaction_only=True),\n", - " SelectFromModel(model=model, k=k),\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### pandas" + "data = pd.read_parquet(\"data/house_prices.parquet\").reset_index(drop=True)\n", + "y = data[\"SalePrice\"]\n", + "y = y.astype(float)\n", + "X = data.drop(\"SalePrice\", axis=1)\n", + "\n", + "train_test_split = TrainTestSplit(test_ratio=0.3, strategy=\"ordered\")\n", + "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfig...ScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveNoneRegLvlAllPubInside...00NoneNoneNone022008WDNormal
120RL80.09600PaveNoneRegLvlAllPubFR2...00NoneNoneNone052007WDNormal
\n", + "

2 rows × 79 columns

\n", + "
" + ], + "text/plain": [ + " MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \\\n", + "0 60 RL 65.0 8450 Pave None Reg \n", + "1 20 RL 80.0 9600 Pave None Reg \n", + "\n", + " LandContour Utilities LotConfig ... ScreenPorch PoolArea PoolQC Fence \\\n", + "0 Lvl AllPub Inside ... 0 0 None None \n", + "1 Lvl AllPub FR2 ... 0 0 None None \n", + "\n", + " MiscFeature MiscVal MoSold YrSold SaleType SaleCondition \n", + "0 None 0 2 2008 WD Normal \n", + "1 None 0 5 2007 WD Normal \n", + "\n", + "[2 rows x 79 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "data = pd.read_parquet('data/house_prices.parquet').reset_index(drop=True)\n", - "y = data['SalePrice']\n", - "y = y.astype(float)\n", - "X = data.drop('SalePrice', axis=1)\n", - "\n", - "train_test_split = TrainTestSplit(test_ratio=0.3, strategy='ordered')\n", - "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)" + "X_train.head(2)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -245,37 +335,38 @@ "SalePrice 214975.0 755000.0 " ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ - "# target analysis\n", + "y_train.plot(kind=\"hist\", figsize=(4 * 1.6, 4), title=\"house price ($)\", bins=50)\n", "pd.DataFrame(y_train.describe()).T" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "offline_pipe = Pipeline(steps=offline_steps)\n", - "X_train_prepro = offline_pipe.fit_transform(X_train, y_train)\n", - "X_train_prepro_np = offline_pipe.transform_numpy(X_train.to_numpy())" - ] - }, - { - "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -285,286 +376,327 @@ } ], "source": [ - "offline_pipe.get_feature_importances(k=k).iloc[::-1].plot(\n", - " kind='barh', \n", - " figsize=(9, 9), \n", - " title='Feature Importance',\n", + "X_train.dtypes.value_counts(ascending=True).plot(\n", + " figsize=(3 * 1.6, 3), title=\"column datatype\", kind=\"barh\"\n", ");" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### koalas" - ] - }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "21/09/30 09:47:27 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", - " \r" - ] + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMUAAACxCAYAAAB0i3knAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdsElEQVR4nO2dd5xVxfn/3x92l+qySxFBQYqCoSioFIkiqFHRYI1JjJIImh9i74Xkp2KBWEIMxkRAbNhiiQVBEQsGRRAQQREMoKwU6XXpsDzfP2YuHC67e++6e7c579frvvacmTkzz9y9nzMzpzyPzIxAILCXKmVtQCBQ3giiCATiCKIIBOIIoggE4giiCATiCKIIBOIIogiUGJKelnRfKbV1saTxqag7iCJQITGz583stFTUHURRAZCUXtY2lCdS/X0EURQTSbdL+lZSrqQ5ks7z6dUkrZfULlL2QElbJTXw+70kzfTlPpV0VKRsjqTbJH0JbJaUXlBbvnyapCGSVktaKOlqSRb7AUnKkvSEpGWSlkq6T1JaAX3qLGm6pI2SVkj6WyTvFUnLJW2QNFFS20K+mwL7l09Zk3StpO98Hx6SVMXn9ZE0SdLDktYAA33aJ5Hj20p6T9Jab/OffHqVyPe2RtLLkuoW/B8FzCx8ivEBfg0cjDvB/BbYDDTyeU8CgyJlrwLG+e2jgZVAFyANuATIAar5/BxgJtAEqJFEW/2BOUBjoA7wPmBAus9/HRgO1AIaAFOBywvo02Tg9377AOC4SN6lQCZQDfg7MDOS9zRwXzL9y6dNAyYAdYFDgXnAH31eH2AXcA2QDtTwaZ/4/ExgGXATUN3vd/F51wFT/PdSzX8HLxb6Py3rH1Vl+/gf8jl++xfAt5G8ScAf/PZjwL1xx/4P6B4RxaVFaOvD6I/ct23+R3QQsD0mLp//O2BCAfVOBO4G6idoP9u3keX3o6IotH/51GVAz8j+lcAHfrsPsCiufFQUvwO+KKDeucApkf1GwE78ySK/T5g+FRNJf4hMEdYD7YD6PnsCUFNSF0nNgA64MzZAU+Cm2HH+2Ca4kSDG4iK0dXBc+eh2UyADWBY5djhuxMiPy4BWwDeSpknq5dtPk3S/n4psxAmXiA1RkulfPFGbv6eQ7yKOJsC3BeQ1BV6P2DAXyMOdKPIlLOCKgaSmwOPAKcBkM8uTNBMQgN9/GXcmWwGMMbNcf/hi3NRqUCFN7HmEOVFbuOlD48ixTSLbi3EjRX0z25WoX2Y2H/idn9OfD7wqqZ7fPgc3CuUAWcC6iA1RkulfPE2Ar/32ocAPUbMKOW4xcGEheZea2aRkjQgjRfGohftnrQKQ1Bd39o7yAm7+f7HfjvE40N+PIpJUS9IvJWX+yLZeBq6TdIikbOC2WIaZLQPGA0Mk1faLz8Mkdc+vIUm9JR1oZruB9T55N26uvh1YA9QEBhdg64/pH8AtkupIaoJbC7xUSNkoY4BGkq6Xu8CRKamLzxsGDPInldjFjnMKqyyIohiY2RxgCG5hugI4ErduiJb5DLcgPhh4J5I+Hfh/wKO4s+0C3Dz5x7b1OO6H/yXwBfA2bnGa5/P/AFTFLcbXAa/i5tf50RP4WtImYChwoZltBUbhpjVLfT1TCrG3SP3zvAl8jlsrjQWeSFA+1lYucCpwFrAcmA+c5LOHAqOB8ZJyvc1d8qsnhvziI1DJkHQGMMzMmpa1LckgyYCWZragrG0JI0UlQVINSWfK3c84BLiLvYv6QBEIoqg8CHcZdR1u+jQXuLNMLaqghOlTIBBHGCkCgTjCfYoyIDfnuzA8lxCZzVrkd4+kWISRIhCII4giEIgjiCIQiCOIIhCII4giEIgjiCIQiCOIIhCII4giEIgjiCIQiCOIIhCII4giEIgjiCIQiCOIIhCII4giEIgjiCIQiCOIIhCII4giEIgjvHlXycjLy+P311xLg3r1+fu9d++Tt3zlSu56aAi5mzexe/durr60Lyd07lys9pYuX86fBt/Pho0bad2yJffcejMZGRm8Nf49ho4cSYN6zqPmb84+i3PP6FmstkqLMh0pJDWTc00/M5KWI+kr7zN1eiR9oHchP9N/zozkDZC0QNL/JJ1eQFvNJX3my70kqWoC2zpKeiSJPlwraa6k5+Vcz9+TVOdTxItvvEnzJofmm/fECy9y6ondeOFf/2TwgNt54NF/Jl3vW+PfY/izz+2X/o+RT3LR+efyxtNPknnAAbw57t09eaee2J0XHvsnLzz2zwojCCgf06dvzaxDXNpJZtbBzDrGpT/s0zuY2dsAktrg/Ii2xXm2+5fyj7vwgD/+cJwbmMsKM8rMppvZtUnYfyVwqpldjPNqd5akmkkcV+KsWLWKSVOncu4Z+Z4XQGLTli0AbNq8hQPr1gPc6DL08ZH84ZprubD/Ffxn7NtJtWdmTJs1i1O6dQOg16m/4KPJk4vfkTKmPIiiuJwD/NvMtpvZQpx7xn3mBJIEnIxzFQnwDHBuYZVK6iFpjN8eKOlJSR/JBRW51qcPA1oA70i6wZy/oI+AXiXWuyIwZNhwrv3jZfhYJ/txee/evPPhBM68uDfX3XEnt1x1BQBvvvsutWrVYtQ/HmHUI0N5451xLF2+PGF7GzZuJLNWLdLT3DmoQf36rFy9Zk/+h5M+4cL+V3DrvfexfOWqEuhh6VAe1xSG8/tpwHAzGxHJu1rSH4DpwE1mtg44hH19mi7xaVHqAesjHrfzK5OIn+H8k2YC/5P0mJn1l9QTN7Kt9uWmA91wDo/3IKkf0A9g6KD76HvR74rYfOF8POUz6mZn07plS6bP+jLfMuM++oizTv0FvS/4FV/OmcudDz7ES8OHMeXzGSxYmMOHH7vAQJs2b2bx0qXUqlmTK28bAMCG3Fx27drFfz91I8E9t95M/boFBwTqdlwXTu/RnapVq/KfsW8z8K9DGPbg/SXa51RRHkVxgpktlQuB9Z6kb8xsIj4ICE409+KcDV9ainaNNbPtwHZJK3HxDZbkU24l+cRg8OIeAalxcTNrzhwmTpnCpGnT2LFjJ5u2bOGOBx7k3ttu3VNm9Lh3eWSQC156VJvW7Nixk/UbN2IGt1x5BV07HrtfvS885tYdb41/jx9WrODy3/eO9onczZvZlZdHeloaK1evpkF9NyXLrl17T7lze57OIyOT8pVcLih30yczW+r/rsT5Qu3s91eYWZ53D/84e6dIS9k3FkNjnxZlDZCtvQEE8yuTiO2R7TwKPqFUB7YWse5ic/WlfXn7+ed4a9QzDBpwO53at99HEAANGzRg2syZACxctIjtO3ZQJyuLrh2P4dUxY9m1yw2k3y9ZwtZt2xK2KYmO7Y/ig48/BmDMe+/TvWtXAFavWbun3MQpU2h+aJN86yiPlKuRQlItoIqZ5frt04B7fF4jH2cB4Dxgtt8eDbwgF6zwYKAlLp7bHszMJE0ALgD+jYu/9qav9zygs5kNKKFutIrYVuYMe2YUrVu1onvX47i+3x+57++P8MJrryOJgTffiCTO7dmTZctXcvFV12Bm1MnKYsjA5NzQXnPZpfxp8P089vQojjj8MM453UXx/febbzJx8hTS0tKonZnJwJtuSmU3S5Qy9SUrF/JqjJm18/st2OspOx14IRYJR9KzuPBYhouic3lMJJL+jJtK7QKuN7N3fPrbuGCCP/i6/40LNPgF0NvMtku6Gcgws7/E2dYDuNnMekkaCGwys7/6vNlALzPLkZQDdIytKfzifICZfVVQv4OHwJIjFR4Cy5UoysiG54AbzKzYl0ckHYQT8imFlQuiKDkqo9vMPCArevOutDGz3iUhCM+huLC1gQpMma4pzGwx+y6SKzRmNq2sbQgUn7IeKQKBckcQRSAQRxBFIBBHEEUgEEehopB0XGkZEgiUFxKNFP+KbUiq+M8EBwJJkEgU0Rsj1VNpSCBQXkh0n6KKpDo48cS29wjFzNYWeGQgUEFJJIos4HP2CmFGJM9wL9gEApWKQkVhZs1KyY5AoNyQ6OpTU0lZkf2TJA2VdEOiF/8DgYpKooX2y0AtAEkdgFeARbhHuP9V4FGBQAUm0Zqihpn94Ld7A0+a2RC5N+NnptSyQKCMKMol2ZOBDwD8K6GBQKUk0UjxoaSXgWVAHeBDcK+GAjtSbFul5aZXvi9rEyoNI24p+QugiURxPfBboBHOy8ZOn94Q+HOJWxMIlAMSXZI13HvN8elfpMyiQKCMSeopWUnnS5ovaYOkjZJyJW1MtXGBQFmQ7OuoDwJnmdncVBoTCJQHkn2fYkUQROCnQrIjxXRJLwFvEPGUZ2avpcKoQKAsSVYUtYEtOI99MQwIoghUOpIShZn1TbUhgUB5oVBRSLrVzB6U9A/cyLAPSQY1CQQqFIlGijn+7/RCSwUClYhEorgA5+v1GUmXmNkzpWFUIFCWJLoke1Rk+7pUGhIIlBeC36dAII5E06fGPmyuItt7CAvtQGUkkShuiWyHxXbgJ0Gip2TDwjrwkyPRfYq3yOf+RAwzO7vELQr8KC7p+TOObFGP3C07uPvp/cNk1KiaxqW/bEPd2tVJqyLGT1vEp7MTx8oujJrV0+l3VlvqZVVnzYZtjBj9NVu276JVk2yuOu9IVm9w8TBnzFvN2Mk5xWqrNEk0ffprqVgBSKoBjANONrO8uLz+wBYzG5WgjheBtsBTZvZwIeV6AH8HMoDVZtbdp2cDI4F2uJPBpWY2OZ9j3wQW+qTXzOwe793kfW//LkqZT2cvY8KMJfQ9s3W++T2ObsyyNZv55+tfcUCNDO69rAufzVlB3u7EkcZaNcnm5+0a8vQ73+yTfkaXpnzz/TrGTV1Ez86H0rPLobw28TsA5i9Zz6OvFRj2r1yTaPr039IyBBfI8bV4QXg7hiU6WFJDoJOZHZ6gXDbOE0lPM1vk43XHGAqMM7ML/I+8ZgHVfGxmveJs3CHpA9ybis8nsrekmb9kA/VqF+zZ1DCqV3X/7mpV09i8bSe7vSBO69SEjkc0ID29Cl/MX8Vbk3KSarP94fUZ8m/3vtnkr5dz04VH7xFFRSbZl4xaSnpV0hxJ38U+JWzLxfgwvvm0P9BHMUXSR5IekDRV0jxJ3Xyx8cAhkmZG0vLjIpz4FsGeeN14/1YnAk/49B1mtr6IfXjD96PcMWHGUhrVq8lDV/ycu/p04qUPF2BAm2Z1aFCnJoOf+5x7n55G04Myadk4K2F9ALVrZrBhs3tVf8PmHdSumbEnr8XBWdxxSSeu/dVRNKpX0LmlfJLsU7JPAXcBDwMnAX0pwXsc/qzcwsxykjwk3cw6SzrT2/UL4Gzc3fcOCY5tBWRI+gjIBIb6aVlzYBXwlKT2OHeh15nZ5nzq6CppFvADLqzw1z59NtApyT6UKm2b12Xxyk0MeWkmB2bX4IZft2f+kvW0aVaXNs3qcMclHQGolpFGgzo1mb9kAwMuPpb0dFEtI41a1TP2lPnPf79jTs7+boRjE7FFK3IZMHwy23fm0a55Xa4870juGPlZaXW12CQrihpm9oEkmdn3wEBJnwPJRSBPTH1gfRHKxx5Z/xxoVsS20oFjgVOAGsBkSVN8+jHANWb2maShwO3AHXHHzwCamtkmL8o3cAHtMbM8STskZZpZbvQgSf2AfgAnnH8jrY/rRWlyfLtGvPOZ8yKyav1WVm/YRsO67gw+7rNFTJz1w37H/OX5z4GC1xQbt+wkq1ZVNmzeQVatquRucX4ttu3YOwOevXAtF1URB9TIYNPWnVQEkj3bb/cO0OZLulrSecABJWjHViKu/iUN8tOgmQXZ4//mUfQIr0uAd81ssw8IPxFo79OXmFnslPYqTiT7YGYbzWyT334bN+rUjxSpBmzL57gRZtbRzDqWtiAA1uRuo3XTOgBk1szgoLo1Wb1hG3Ny1nJ8u0ZUy0gDIPuAqmRGpkGFMWvBarq2bQhA17YNmbVgNQC1a+31qNqsYSZVpAojCEj+B3UdbtF5LXAvzjHaJSVlhJmtk5QmqbqZbTOzP1NMFzqSrvZ1PxqX9SbwqKR0oCrQBXjYzJZLWizpCDP7H24kmRN3bGxBv8LMTFJn3Illjc+rh7uaVeq/gD/2asMRTbI5oEYGD/TvyuhJOaRVcb7sJs76gbGf5tD3zNbc1cfN7l6b+C2btu5kTs46GtZdwe0XO/1v25nHk2Pn7DnrF8a4z76n39ntOP6oRqzduI3ho90s8thWB9K9wyHk7TZ27spjxFtfJ6ipfJHsS0axC9+bcOuJVDAeOAF3WbMk+BkwKT7RzOZKGgd8CewGRprZbJ99DfC8X+N8h++rvyQcuwp2AXCFpF24Ee5C7woI3HprbAnZXyRGjtlPv/uwYfMO/v7KrHzzPpyxhA9nLCnw2HmL1zNv8fr90jdv28XDL8/cL33CF0uZ8MXSQu0pz2jv/7OQQtIE8n/J6OQSM0Q6BrjBzH5fQvWNAc43s1LzZCjpNeB2M5tXWLl+D01I/KUHkmLELScpcamikez06ebIdnXgV0CJ3qAysxmSJkhKy+9exY+or1Qn7n50eSORIALln2SnT5/HJU2SNLWkjTGzJ0u6ztLCj0iF3nEPVAySEoWkupHdKrhLmsnd4QkEKhjJTp+iI8Uu3HM/l5W8OYFA2ZPs9Kl5qg0JBMoLCUXhY1FcBbTxSdOB4Wa2JpWGBQJlRaJAkN2Bqbjr+U/7TzVcMJfmkp5NtYGBQGmTaKR4CDg7Lh7FaEmvA7OA11NmWSBQRiR69umA/AK0mNlMYAWpu7sdCJQZCQNBSqqTT2JdYFcICBmojCQSxcPAeEndJWX6Tw/gHZ8XCFQ6Er2OOkLSD7gnY9v65K+B+8zsrVQbFwiUBQkvyZrZGEnvm9l+7wgEApWRZO9oz5a0AvjYfz4xsw2pMysQKDuSevPOe8j4HfAV8EtgViFvxQUCFZpkHwhsDBwPdMO9uvk18EkK7QoEyoxkp0+LgGnAYDPrn0J7fhJ8szJcyS7PJOu44GjcuwIXSZosaZSk8JRsoFKS7FOysyR9C3yLm0L1BrrjHYcFApWJZNcU03EPAn6Ku/p0ovf/FAhUOpJdU5xhZqtSakkgUE5Idk2xQ9LfJE33nyHe92ogUOlIVhRPArnAb/xnI86/bCBQ6Uh2+nSYmf0qsn93uHkXqKwkO1JslXRCbEfS8TjveIFApSPZkaI/MCqyjlhHCfqSDQTKE0nfpwDaS6rt9zdKuh7njzUQqFQUKfCKd0O/0e/emAJ7AoEypzjRiErcsW0gUB4ojiiC5+xApSRRHO1c8v/xCxcaKxCodCR6RzuztAwJBMoLJRbhNBCoLARRBAJxFDWyaKCcctuvW/PzNvVZt2kHfYbsH7P6hLb1uez0Fuw2yMsz/jF6Hl/lFM/3RGaNdAb2bkejOjVYtm4rdz03m01bd9GhRTaD+7Rn2Tr30MPEr1bxzPsLi9VWaZKSkUJSM0lbo89HScqW9KqkbyTNldQ1kneNT/9a0oMF1Jkj6SsfSnh6Ejb0kLQhFnpY0p2RvHzrklRX0nuS5vu/+3lH9OUu8WXmS7okkv5+QcekmnHTl3HLyJkF5n8+fx19/zaVyx6eyv2vzOXWX7dOuu4OLbIZ8Nv9y198cjNmLFjHRQ9OZsaCdfQ+qemevC8Xrueyh117FUkQkNrp07dm1iGyPxQYZ2Y/wzk/mAsg6STgHKC9mbUF/lpInSeZWQcz65ikDR/78h3M7J4k6rod+MDMWgIf+P198C5D78KFGu4M3BURwrPAlUnaVqLMWriejYWE+d0aCfheo2qVfa4pXtj9UIZf24mnbuxM39OSD0VyQpv6jJu+DHCiPKHtgUU3vBxSKtMn/8zUiUAf2BMfLha19ArgfjPb7vNWloZNBXAO0MNvPwN8BNwWV+Z04D0zWwsg6T2gJ/AiMBr3ZuKgUrC1yHRrdyD9zjiMOgdU5bYnZwLQqVVdGtevyeWPTEOCv/RpT/vm2cxauD5hfXUyq7Im1/0b1+TuoE7m3qDybZtm8eQNnVm9cTv/GrOAnBWbU9GllFBaa4rmwCrgKUntceHCrjOzzUAroJukQcA24OZI3O4ohvNra7igMSOSaLerpFnAD77eWJTzguo6yMyW+e3lwEH51HkIsDiyv8SnYWbrJFWTVC8+qI2kfkA/gMNPvZ5G7Us1eCsAH89excezV9G+eTaXnX4YN474gk6t6tKpVV2euKEzADWqptG4fg1mLVzPsGs6kpFehRpV06hdM4MnbnBX6IeNXcC0eWv3b8CPPvOW5vKbwZPYuiOP435Wj8GXHMVFD04urW4Wm9ISRTpwDHCNmX0maShuanKHz6sLHAd0Al6W1CISsD3GCWa2VFID4D1J35jZxELanAE0NbNNks4E3gBaJluXmZkXTVFZCRwM7CMKL7wRACfe8kGZPg0wa+F6Dq5bg6yaGQh4fsL3jJ6yfzD4/v9wy60OLbI5o1Mj/vLS3H3y1+XuoJ4fLeplVmXdJjdqbNm+d6o25Zs13HCeyKqZwYZCpnflidK6JLsEWGJmscsir+JEEst7zRyxqEn14ysws6X+70pcsJjOhTXoH17c5LffBjIk1U9Q1wofziwW1iy/qdxSoElkv7FPi1GdcviuySH19j6A0OqQTDLSxYYtO5k6by1ndmpEjappANSvXY3sWhlJ1Tlpzmp6dmwEQM+OjfhkzmoA6kamUa2b1KaKVGEEAaU0UpjZckmLJR1hZv8DTgHm+Ow3gJOACZJaAVWB1dHjJdUCqphZrt8+DbjH513t23g07piGwAp/xu+MOwGsKawu3JrgEuB+//fNfLrzLjA4srg+DRjg2xTQEMgp4ldUbO68qC1HH1aHrFoZvPrn43lq/Hekpblz3ugpS+l+ZANOP7Yhu3Yb23fuZuBzswGYNm8tTRvU4rGr3fWGLTvyuO/Fr1m/OfGP+PkJOdzd+0h+2elglq/fxl3PfgVAjyMbcE7XQ8jzbd39/OwU9To1aP9ZSglUKjUDxphZu0haB2Ak7kf/HdDXz8Gr4t4B74BbfN9sZh9KOhgYaWZnSmrB3lBi6cALZjbI1/soMMnMXoyz4WrcIn4X7sx9o5l9mqCuesDLwKHA98BvzGytpI5AfzP7oy93KfAnX8cgM3vKp3cEBsS9ursfZT19qkxMfOiUEn9au9REkSokjQHO91e0yhS/VhptZh8UVi6IouRIhShStabIA7JKw7mBmfUqD4LwzE4kiED5JyVrCjNbzL6L0Z8EZvZ4WdsQKD7hgcBAII4gikAgjiCKQCCOIIpAII4gikAgjiCKQCCOIIpAII4gikAgjiCKQCCOIIpAII4gikAgjiCKQCCOIIpAII4gikAgjpS8ZBSoHEjql6TXlEpFGCkChdGvrA0oC4IoAoE4gigCgTiCKAKF8ZNbT0BYaAcC+xFGikAgjiCKQCCOIIpyiKRNJVxfPx8U5xtJ0yX1KEZdPbwDOiT1kbQqEhhnlKSzJe0X1yOujiqSHpE02wfPmSapuc+LBtSZKennP9bWH0sI71XJkdQLuBznaX21pGOA0ZK6xBxNF5OXzOzquLTRCY75Lc4z+1FmtltSYyAawOIkM1ud/6GpJ4wUFQRJHSRNkfSlpNcl1ZHUQNLnPr+9JJN0qN//VlJNXNCZW2I/MjObATwFXOXL5cS8sUvqKOkjv91Z0mRJX0j6VNIRSdrZx/v3RdLTfkT4VNJ3ki7wxRoBy8xst7dpiZmtK5EvqgQIoqg4jAJuM7OjgK+Au3wogeqSagPdgOm4ADhNgZVmtgVoiwuSE2U60CZBe98A3czsaOBOYHAB5X4bmer0zSe/EXAC0AvnzR2cE+uz/DFDJB0dd8wEn7d/RMtSIEyfKgA+PFq2mf3XJz0DvOK3PwWOx4VPG4wLNSZcmLHikAU8I6klLkZRQUEr9pk+SeoTl/+GHxHmSDoI3MjgR56T/ecDSb+O+OEN06dAsZiIGyWa4uJptMedmWOimAMcG3fMsbjRAlyogtjvoHqkzL3ABO85/qy4vKKwPbK9x0O4mW03s3fM7BacmM/9kfWXOEEUFQAz2wCsk9TNJ/0eiI0aHwO9gfn+jLwWOBP4xOc/CDzgY2/E4oScBwz3+TnsFU00rkYWeyM09Sm53oCkY3z8ESRVAY7CxQMpF4TpU/mkpqQlkf2/4SIrDfOL5++AvgBmluMjKMVi9n0CNI4tXM1stP8BTpKUjou01N7MVvnydwNPSLoXFw02xoO46dP/B8aWcP8aAI9Lqub3pwKPFlK+VAmPefyE8KJ4CjdD6J1PsM0AQRSBwH6ENUUgEEcQRSAQRxBFIBBHEEUgEEcQRSAQRxBFIBDH/wFfs5Cnf6TzOAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ - "data = ks.read_parquet('data/house_prices.parquet', index_col='Id')\n", - "y_ks = data['SalePrice']\n", - "y_ks = y_ks.astype(float)\n", - "X_ks = data.drop('SalePrice', axis=1)\n", - "\n", - "train_test_split = TrainTestSplit(test_ratio=0.3, strategy='ordered')\n", - "X_train_ks, X_test_ks, y_train_ks, y_test_ks = \\\n", - " train_test_split.transform(X_ks, y_ks)\n", - "\n", - "offline_pipe = Pipeline(steps=offline_steps)\n", - "X_train_prepro_ks = offline_pipe.fit_transform(X_train_ks, y_train_ks)\n", - "X_train_prepro_ks_np = offline_pipe.transform_numpy(X_train_ks.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### check pandas and koalas results match - offline pipeline " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "assert_frame_equal(\n", - " X_train_prepro.reset_index(drop=True), \n", - " X_train_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_train_prepro_np,\n", - " X_train_prepro_ks_np)" + "steps = [\n", + " (\"BinRareCategories\", BinRareCategories(min_ratio=0.05)),\n", + " (\"DropLowCardinality\", DropLowCardinality(min_categories=2)),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"constant\", value=0)),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeRegressor(max_depth=2, min_samples_split=50), inplace=True\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.0)),\n", + " (\"TargetEncoder\", TargetEncoder()),\n", + "]\n", + "pipe = Pipeline(steps=steps)\n", + "_ = pipe.fit(X_train.copy(), y_train)\n", + "pipe.steps[-1][1].display_mapping(cmap=cmap, decimal=1, title=\"average sale price\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## production pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "features = offline_pipe.get_features()\n", - "prod_columns = offline_pipe.get_production_columns()" + "## offline pipeline - feature selection" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ - "prod_steps = [\n", - " BinRareEvents(min_ratio=0.2),\n", - " ObjectImputer(strategy='constant', value='MISSING'),\n", - " OrdinalEncoder(),\n", - " IntImputer(strategy='constant', value=0),\n", - " FloatImputer(strategy='mean'),\n", - " PolynomialFeatures(\n", - " degree=2, \n", - " columns=polynomial_columns,\n", - " interaction_only=True),\n", - " KeepColumns(columns_to_keep=features),\n", + "k = 30\n", + "model = LGBMRegressor(random_state=0)\n", + "steps = [\n", + " (\"BinRareCategories\", BinRareCategories(min_ratio=0.1)),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"OrdinalEncoder\", OrdinalEncoder()),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"constant\", value=0)),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.0)),\n", + " (\"SelectFromModel\", SelectFromModel(model=model, k=k)),\n", "]" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### pandas" - ] - }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_prod = X_train[prod_columns]\n", - "X_train_prod_np = X_train_prod.to_numpy()\n", - "\n", - "prod_pipe = Pipeline(steps=prod_steps)\n", - "_ = prod_pipe.fit(X_train_prod, y_train)\n", - "X_train_prod_prepro = prod_pipe.transform(X_train_prod)\n", - "X_train_prod_prepro_np = prod_pipe.transform_numpy(\n", - " X_train_prod.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### koalas" - ] - }, - { - "cell_type": "code", - "execution_count": 16, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ - "X_train_prod_ks = X_train_ks[prod_columns]\n", - "X_train_prod_ks_np = X_train_prod.to_numpy()\n", - "\n", - "prod_pipe = Pipeline(steps=prod_steps)\n", - "_ = prod_pipe.fit(X_train_prod_ks, y_train_ks)\n", - "X_train_prod_prepro_ks = prod_pipe.transform(X_train_prod_ks)\n", - "X_train_prod_prepro_ks_np = prod_pipe.transform_numpy(\n", - " X_train_prod_ks.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### check offline pipeline and production pipeline match" + "pipe = Pipeline(steps=steps)\n", + "_ = pipe.fit(X_train.copy(), y_train)" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "assert_frame_equal(\n", - " X_train_prepro, \n", - " X_train_prod_prepro\n", - ")\n", - "assert_frame_equal(\n", - " X_train_prepro_ks.to_pandas(), \n", - " X_train_prod_prepro_ks.to_pandas()\n", - ")" - ] - }, - { - "cell_type": "markdown", + "execution_count": 12, "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "#### check pandas and koalas results match - production pipeline" + "pipe.steps[-1][1].feature_importances_.iloc[k::-1].plot(\n", + " kind=\"barh\",\n", + " figsize=(4, 4 * 1.6),\n", + " title=\"feature importance\",\n", + ");" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ - "assert np.allclose(\n", - " X_train_prod_prepro_np,\n", - " X_train_prod_prepro_ks_np)\n", - "assert_frame_equal(\n", - " X_train_prod_prepro, \n", - " X_train_prod_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_train_prod_prepro_np,\n", - " X_train_prod_prepro_ks_np)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## model building" + "selected_columns = pipe.steps[-1][1].selected_columns\n", + "polynomial_columns = pipe.steps[-1][1].feature_importances_.index[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### numpy" + "## pipeline optimization" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "100%|████████| 10/10 [00:06<00:00, 1.53trial/s, best loss: -0.8671634162836671]\n" + "Fitting 10 folds for each of 3 candidates, totalling 30 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n" ] } ], "source": [ - "features = list(X_train_prod_prepro.columns)\n", - "n_splits = 10\n", - "max_evals = 10\n", - "kfold = KFold(n_splits=n_splits)\n", - "space = {\n", - " 'n_estimators': hp.quniform('n_estimators', 50, 100, 10),\n", - " 'max_depth': hp.quniform('max_depth', 2, 5, 1),\n", - " 'learning_rate': hp.loguniform('learning_rate', -5, 0),\n", - " 'subsample': hp.uniform('subsample', 0.6, 1),\n", - " 'colsample_bytree': hp.uniform('colsample_bytree', 0.6, 1),\n", - " }\n", + "from xgboost import XGBRegressor\n", + "\n", + "model = XGBRegressor(random_state=0, objective=\"reg:squarederror\", max_depth=2)\n", + "\n", + "steps = [\n", + " (\"BinRareCategories\", BinRareCategories(min_ratio=0.1)),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"constant\", value=-1)),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.0)),\n", + " (\"TargetEncoder\", TargetEncoder()),\n", + " (\"ESTIMATOR\", model),\n", + "]\n", + "\n", + "param_distributions = {\n", + " \"BinRareCategories__min_ratio\": [0.05, 0.1, 0.2],\n", + " \"NumericImputer__strategy\": [\"mean\", \"constant\"],\n", + " \"ObjectImputer__strategy\": [\"constant\", \"most_frequent\"],\n", + " \"ESTIMATOR__subsample\": [0.5, 0.6, 0.7],\n", + " \"ESTIMATOR__colsample_bytree\": [0.4, 0.5, 0.6],\n", + " \"ESTIMATOR__min_child_weight\": [10, 20, 30],\n", + "}\n", + "scoring = make_scorer(mean_absolute_error)\n", "\n", - "model = LGBMRegressor(\n", - " random_state=0\n", + "cv = KFold(n_splits=10, random_state=0, shuffle=True)\n", + "pipe = Pipeline(steps=steps, verbose=False)\n", + "search = RandomizedSearchCV(\n", + " pipe,\n", + " param_distributions=param_distributions,\n", + " n_iter=3,\n", + " cv=cv,\n", + " n_jobs=-1,\n", + " random_state=0,\n", + " verbose=True,\n", ")\n", - "hyper = HyperOpt(\n", - " model=model,\n", - " algo=tpe.suggest,\n", - " scoring='r2',\n", - " space=space,\n", - " max_evals=max_evals, \n", - " kfold=kfold,\n", - " features=features,\n", - " )\n", - "_ = hyper.fit(X_train_prod_prepro_np, y_train.to_numpy())" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "hyper.get_feature_importances().iloc[::-1].plot(\n", - " kind='barh', \n", - " figsize=(9, 9), \n", - " title='Most important features',\n", - ");" + "_ = search.fit(X_train[selected_columns].copy(), y_train)" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -588,303 +720,310 @@ " \n", " \n", " \n", - " colsample_bytree\n", - " learning_rate\n", - " max_depth\n", - " n_estimators\n", - " subsample\n", - " loss\n", - " status\n", - " id\n", + " mean_fit_time\n", + " std_fit_time\n", + " mean_score_time\n", + " std_score_time\n", + " mean_test_score\n", + " std_test_score\n", + " rank_test_score\n", " \n", " \n", " \n", " \n", - " 6\n", - " 0.733368\n", - " 0.076602\n", - " 4.0\n", - " 100.0\n", - " 0.935267\n", - " -0.867163\n", - " ok\n", - " 6\n", - " \n", - " \n", - " 4\n", - " 0.927167\n", - " 0.065564\n", - " 3.0\n", - " 90.0\n", - " 0.658968\n", - " -0.866158\n", - " ok\n", - " 4\n", + " 0\n", + " 1.639170\n", + " 0.034378\n", + " 0.049366\n", + " 0.010373\n", + " 0.858874\n", + " 0.052009\n", + " 1\n", " \n", " \n", " 2\n", - " 0.705010\n", - " 0.134891\n", - " 5.0\n", - " 100.0\n", - " 0.703349\n", - " -0.855558\n", - " ok\n", + " 1.239296\n", + " 0.044473\n", + " 0.039315\n", + " 0.002073\n", + " 0.845244\n", + " 0.055399\n", " 2\n", " \n", " \n", " 1\n", - " 0.943498\n", - " 0.170913\n", - " 4.0\n", - " 80.0\n", - " 0.812386\n", - " -0.853450\n", - " ok\n", - " 1\n", - " \n", - " \n", - " 9\n", - " 0.779439\n", - " 0.716896\n", - " 4.0\n", - " 90.0\n", - " 0.636822\n", - " -0.816832\n", - " ok\n", - " 9\n", - " \n", - " \n", - " 5\n", - " 0.672439\n", - " 0.028091\n", - " 4.0\n", - " 60.0\n", - " 0.693006\n", - " -0.815979\n", - " ok\n", - " 5\n", - " \n", - " \n", - " 0\n", - " 0.833365\n", - " 0.017917\n", - " 5.0\n", - " 80.0\n", - " 0.794419\n", - " -0.798830\n", - " ok\n", - " 0\n", - " \n", - " \n", - " 7\n", - " 0.695419\n", - " 0.016931\n", - " 3.0\n", - " 90.0\n", - " 0.986852\n", - " -0.785819\n", - " ok\n", - " 7\n", - " \n", - " \n", - " 3\n", - " 0.696185\n", - " 0.017551\n", - " 3.0\n", - " 50.0\n", - " 0.811477\n", - " -0.659360\n", - " ok\n", + " 1.515153\n", + " 0.146610\n", + " 0.052766\n", + " 0.008797\n", + " 0.843845\n", + " 0.048997\n", " 3\n", " \n", - " \n", - " 8\n", - " 0.621090\n", - " 0.007723\n", - " 4.0\n", - " 80.0\n", - " 0.804196\n", - " -0.574611\n", - " ok\n", - " 8\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " colsample_bytree learning_rate max_depth n_estimators subsample \\\n", - "6 0.733368 0.076602 4.0 100.0 0.935267 \n", - "4 0.927167 0.065564 3.0 90.0 0.658968 \n", - "2 0.705010 0.134891 5.0 100.0 0.703349 \n", - "1 0.943498 0.170913 4.0 80.0 0.812386 \n", - "9 0.779439 0.716896 4.0 90.0 0.636822 \n", - "5 0.672439 0.028091 4.0 60.0 0.693006 \n", - "0 0.833365 0.017917 5.0 80.0 0.794419 \n", - "7 0.695419 0.016931 3.0 90.0 0.986852 \n", - "3 0.696185 0.017551 3.0 50.0 0.811477 \n", - "8 0.621090 0.007723 4.0 80.0 0.804196 \n", + " mean_fit_time std_fit_time mean_score_time std_score_time \\\n", + "0 1.639170 0.034378 0.049366 0.010373 \n", + "2 1.239296 0.044473 0.039315 0.002073 \n", + "1 1.515153 0.146610 0.052766 0.008797 \n", "\n", - " loss status id \n", - "6 -0.867163 ok 6 \n", - "4 -0.866158 ok 4 \n", - "2 -0.855558 ok 2 \n", - "1 -0.853450 ok 1 \n", - "9 -0.816832 ok 9 \n", - "5 -0.815979 ok 5 \n", - "0 -0.798830 ok 0 \n", - "7 -0.785819 ok 7 \n", - "3 -0.659360 ok 3 \n", - "8 -0.574611 ok 8 " + " mean_test_score std_test_score rank_test_score \n", + "0 0.858874 0.052009 1 \n", + "2 0.845244 0.055399 2 \n", + "1 0.843845 0.048997 3 " ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "hyper.history.sort_values('loss')" + "columns = [\n", + " \"mean_fit_time\",\n", + " \"std_fit_time\",\n", + " \"mean_score_time\",\n", + " \"std_score_time\",\n", + " \"mean_test_score\",\n", + " \"std_test_score\",\n", + " \"rank_test_score\",\n", + "]\n", + "pd.DataFrame(search.cv_results_)[columns].sort_values(\"rank_test_score\").iloc[:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## model evaluation" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([212763.14, 168374.55, 209336.47, ..., 187853.05, 170102.27,\n", + " 198109.14], dtype=float32)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "model_np = copy.copy(hyper.model)\n", - "model_path = 'models/model_lgbm_house.dill'\n", - "with open(model_path, 'wb') as file:\n", - " dill.dump(model_np, file)" + "search.best_estimator_.predict(X_train[selected_columns])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mean absolute error - train set: 14160\n", + "mean absolute error - test set: 19255\n" + ] + } + ], + "source": [ + "train_error = mean_absolute_error(\n", + " y_train, search.best_estimator_.predict(X_train[selected_columns])\n", + ")\n", + "print(f\"mean absolute error - train set: {round(train_error)}\")\n", + "test_error = mean_absolute_error(\n", + " y_test, search.best_estimator_.predict(X_test[selected_columns])\n", + ")\n", + "print(f\"mean absolute error - test set: {round(test_error)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "train_errors = (\n", + " 100\n", + " * (y_train - search.best_estimator_.predict(X_train[selected_columns]))\n", + " / y_train\n", + ")\n", + "test_errors = (\n", + " 100 * (y_test - search.best_estimator_.predict(X_test[selected_columns])) / y_test\n", + ")\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, ax = plt.subplots(1, 2, figsize=[7 * 1.6, 4])\n", + "ax[0].hist(train_errors, bins=50, label=\"train set\")\n", + "ax[0].set_title(\"error terms\")\n", + "ax[0].set_xlabel(\"errors (%)\")\n", + "ax[0].set_ylabel(\"count\")\n", + "ax[1].hist(test_errors, bins=50, label=\"test set\", color=\"orange\")\n", + "ax[1].set_title(\"error terms\")\n", + "ax[1].set_xlabel(\"errors (%)\")\n", + "ax[1].set_ylabel(\"count\")\n", + "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### pandas" + "## production pipeline & model" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ - "model_pd = copy.copy(model_np)\n", - "_ = model_pd.fit(X_train_prod_prepro, y_train)" + "prod_pipe = copy.deepcopy(search.best_estimator_)\n", + "_ = prod_pipe.steps.pop(-1)\n", + "model_pd = copy.deepcopy(search.best_estimator_.steps[-1][1])" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 21, "metadata": {}, + "outputs": [], "source": [ - "### treelite" + "X_train_prepro_np = prod_pipe.transform_numpy(X_train[selected_columns].to_numpy())\n", + "y_train_np = y_train.to_numpy()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[09:48:39] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", - "[09:48:40] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", - "[09:48:40] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", - "[09:48:40] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file header.h...\n", - "[09:48:40] ../src/c_api/c_api.cc:126: Writing file main.c...\n" + "[17:25:24] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", + "[17:25:24] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", + "[17:25:24] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file header.h...\n", + "[17:25:24] ../src/c_api/c_api.cc:126: Writing file main.c...\n", + "[17:25:24] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:105: Compiling sources files in directory ./models/tmp2okzfo39 into object files (*.o)...\n", + "[17:25:24] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:134: Generating dynamic shared library ./models/tmp2okzfo39/predictor.dylib...\n", + "[17:25:25] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/__init__.py:278: Generated shared library in 0.47 seconds\n" ] } ], "source": [ - "LGBMTreeliteDumper().dump(\n", - " model=model_np, \n", - " toolchain='gcc',\n", - " parallel_comp=4,\n", - " model_path='./models/', \n", - " model_name='treelite_lgbm_house')" + "X_train_prepro_np = prod_pipe.transform_numpy(\n", + " X_train[selected_columns].copy().to_numpy()\n", + ")\n", + "y_train_np = y_train.to_numpy()\n", + "\n", + "xgb_booster = XGBBoosterBuilder.train(\n", + " model=model_pd,\n", + " X_train=X_train_prepro_np,\n", + " y_train=y_train.to_numpy(),\n", + ")\n", + "\n", + "treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", + "treelite_model.export_lib(\n", + " toolchain=\"gcc\",\n", + " libpath=\"./models/test.so\",\n", + " params={\"parallel_comp\": 4},\n", + " verbose=True,\n", + ")\n", + "model_prod = treelite_runtime.Predictor(\"./models/test.so\", verbose=False)" ] }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "import treelite_runtime\n", - "model_tl = treelite_runtime.Predictor(\n", - " './models/treelite_lgbm_house.so', verbose=False)" - ] - }, - { - "cell_type": "markdown", + "execution_count": 23, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[17:25:25] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n" + ] + } + ], "source": [ - "#### check the models prediction match" + "xgb_booster = XGBBoosterBuilder.train(\n", + " model=model_pd,\n", + " X_train=X_train_prepro_np,\n", + " y_train=y_train_np,\n", + ")\n", + "\n", + "treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", + "treelite_model.export_lib(\n", + " toolchain=\"gcc\",\n", + " libpath=f\"./models/treelite_lgbm_house.so\",\n", + " params={\"parallel_comp\": 4},\n", + " verbose=False,\n", + ")\n", + "model_prod = treelite_runtime.Predictor(\n", + " f\"./models/treelite_lgbm_house.so\", verbose=False\n", + ")" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ - "X_test_np = X_test.to_numpy()\n", - "y_pred_pd = model_pd.predict(\n", - " prod_pipe.transform(X_train_prod))\n", - "y_pred_np = model.predict(\n", - " prod_pipe.transform_numpy(X_train_prod_np.copy()))\n", - "y_pred_tl = model_tl.predict(\n", - " treelite_runtime.DMatrix(\n", - " prod_pipe.transform_numpy(\n", - " X_train_prod_np.copy()\n", - " )\n", - " )\n", - ")\n", - "assert np.allclose(y_pred_np, y_pred_pd)\n", - "assert np.allclose(y_pred_np, y_pred_tl)" + "X_test_np = X_test[selected_columns].to_numpy()\n", + "y_pred_pd = model_pd.predict(prod_pipe.transform(X_test[selected_columns].copy()))\n", + "y_pred_tl = model_prod.predict(\n", + " treelite_runtime.DMatrix(prod_pipe.transform_numpy(X_test_np.copy()))\n", + ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## model evaluation" + "### check if Pandas & Treelite predictions match" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 25, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'R2 score: 0.85'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "X_test_prod = X_test[prod_columns]\n", - "X_test_prod_np = X_test_prod.to_numpy()\n", - "X_test_prod_prepro_np = prod_pipe.transform(X_test_prod).to_numpy()\n", - "y_test_pred = model_np.predict(X_test_prod_prepro_np)\n", - "f'R2 score: {r2_score(y_test, y_test_pred):.2f}'" + "assert np.allclose(y_pred_pd, y_pred_tl)" ] }, { @@ -903,20 +1042,20 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "20.2 ms ± 734 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "47.1 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" + "20.1 ms ± 250 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "27.4 µs ± 844 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" ] } ], "source": [ - "x = X_test_prod.iloc[[1]]\n", + "x = X_test[selected_columns].iloc[[1]]\n", "xnp = x.to_numpy()\n", "stats_pd = %timeit -o prod_pipe.transform(x)\n", "stats_np = %timeit -o prod_pipe.transform_numpy(xnp.copy())" @@ -924,23 +1063,23 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'Speed-up Pandas VS Numpy x429'" + "'Speed-up Pandas VS Numpy x734'" ] }, - "execution_count": 29, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy x{round(speedup)}'" + "speedup = 1e3 * float(str(stats_pd).split(\" \")[0]) / float(str(stats_np).split(\" \")[0])\n", + "f\"Speed-up Pandas VS Numpy x{round(speedup)}\"" ] }, { @@ -952,65 +1091,55 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 28, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "33 ms ± 1.92 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "263 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", - "96.9 µs ± 1.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], + "outputs": [], "source": [ - "stats_pd = %timeit -o model_pd.predict(prod_pipe.transform(x))[0]\n", - "stats_np = %timeit -o model.predict(prod_pipe.transform_numpy(xnp.copy()))[0]\n", - "stats_tl = %timeit -o model_tl.predict(treelite_runtime.DMatrix(prod_pipe.transform_numpy(xnp.copy())))" + "import warnings\n", + "\n", + "warnings.simplefilter(action=\"ignore\", category=FutureWarning)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 29, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy x125'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "32.2 ms ± 2.22 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "78.7 µs ± 1.91 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" + ] } ], "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy x{round(speedup)}'" + "stats_pd = %timeit -o model_pd.predict(prod_pipe.transform(x).copy())[0]\n", + "stats_tl = %timeit -o model_prod.predict(treelite_runtime.DMatrix(prod_pipe.transform_numpy(xnp.copy())))" ] }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, + "execution_count": 30, + "metadata": { + "scrolled": false + }, "outputs": [ { "data": { "text/plain": [ - "'Speed-up Pandas VS Numpy&Treelite x341'" + "'Speed-up Pandas VS Numpy&Treelite x409'" ] }, - "execution_count": 32, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_tl).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy&Treelite x{round(speedup)}'" + "speedup = 1e3 * float(str(stats_pd).split(\" \")[0]) / float(str(stats_tl).split(\" \")[0])\n", + "f\"Speed-up Pandas VS Numpy&Treelite x{round(speedup)}\"" ] } ], @@ -1030,7 +1159,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.7" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/examples/libraries.ipynb b/examples/libraries.ipynb new file mode 100644 index 00000000..d08d705e --- /dev/null +++ b/examples/libraries.ipynb @@ -0,0 +1,805 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# comparison between Pandas, Dask, and Koalas" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pandas.testing import assert_frame_equal\n", + "from pandas.testing import assert_series_equal\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from lightgbm import LGBMClassifier\n", + "from lightgbm import DaskLGBMClassifier\n", + "import treelite\n", + "import treelite_runtime\n", + "import dill\n", + "import joblib\n", + "from sklearn.metrics import make_scorer\n", + "from sklearn.model_selection import StratifiedKFold\n", + "from sklearn.model_selection import RandomizedSearchCV\n", + "from pyspark.ml.classification import RandomForestClassifier as RFCSpark" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Gators** imports" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n" + ] + } + ], + "source": [ + "# data cleaning\n", + "from gators.data_cleaning import (\n", + " DropColumns,\n", + " Replace,\n", + ")\n", + "\n", + "# imputers\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "\n", + "# encoders\n", + "from gators.encoders import (\n", + " WOEEncoder,\n", + ")\n", + "\n", + "# binning\n", + "from gators.binning import (\n", + " BinRareCategories,\n", + " BinSingleTargetClassCategories,\n", + " Binning,\n", + " CustomBinning,\n", + " QuantileBinning,\n", + " TreeBinning,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import (\n", + " PolynomialFeatures,\n", + " ElementaryArithmetics,\n", + " PolynomialObjectFeatures,\n", + " IsNull,\n", + ")\n", + "from gators.feature_generation_str import (\n", + " Contains,\n", + " Length,\n", + " Extract,\n", + " SplitExtract,\n", + ")\n", + "\n", + "# feature selection\n", + "from gators.feature_selection import SelectFromModel, InformationValue\n", + "\n", + "# model building\n", + "from gators.model_building import (\n", + " Model,\n", + " TrainTestSplit,\n", + " XGBBoosterBuilder,\n", + " XGBTreeliteDumper,\n", + ")\n", + "\n", + "# pipeline\n", + "from gators.pipeline import Pipeline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# preprocessing pipeline\n", + "steps = [\n", + " (\"SplitExtractName\", SplitExtract([\"Name\"], [\", \"], [1], [\"Dummy\"])),\n", + " (\"SplitExtractTitle\", SplitExtract([\"Dummy\"], [\".\"], [0], [\"Title\"])),\n", + " (\"Length\", Length(columns=[\"Cabin\", \"Ticket\"])),\n", + " (\"DropColumns\", DropColumns([\"Name\", \"Dummy\", \"Cabin\", \"Ticket\"])),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"mean\")),\n", + " (\"Encoder\", WOEEncoder()),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pandas pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_parquet(\"data/titanic.parquet\")\n", + "data = data.reset_index(drop=True)\n", + "y = data[\"Survived\"]\n", + "X = data.drop(\"Survived\", axis=1)\n", + "train_test_split = TrainTestSplit(test_ratio=0.3, strategy=\"ordered\")\n", + "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "model = LGBMClassifier(random_state=0)\n", + "steps_pd = steps + [(\"Model\", Model(model=model))]\n", + "\n", + "pipe = Pipeline(steps=steps_pd, verbose=False)\n", + "_ = pipe.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# split prod pipeline and model\n", + "model_pd = pipe[-1].model\n", + "prod_pipe_pd = copy.deepcopy(pipe)\n", + "_ = prod_pipe_pd.steps.pop(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "X_train_prepro_pd = prod_pipe_pd.transform(X_train)\n", + "X_test_prepro_pd = prod_pipe_pd.transform(X_test)\n", + "y_test_pred_proba_pd = model_pd.predict_proba(X_test_prepro_pd.to_numpy())[:, 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dask pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + "

Client

\n", + "

Client-e981a354-43e7-11ed-991c-acde48001122

\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + "
\n", + "\n", + " \n", + "
\n", + "

Cluster Info

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

LocalCluster

\n", + "

c57805ca

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Workers: 4\n", + "
\n", + " Total threads: 16\n", + " \n", + " Total memory: 64.00 GiB\n", + "
Status: runningUsing processes: True
\n", + "\n", + "
\n", + " \n", + "

Scheduler Info

\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Scheduler

\n", + "

Scheduler-d3f20527-56a6-4489-8f40-52feca9361c1

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Comm: tcp://127.0.0.1:63343\n", + " \n", + " Workers: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Total threads: 16\n", + "
\n", + " Started: Just now\n", + " \n", + " Total memory: 64.00 GiB\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "

Workers

\n", + "
\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 0

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63366\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:63367/status\n", + " \n", + " Memory: 16.00 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63348\n", + "
\n", + " Local directory: /Users/cpoli/opensource/gators/examples/dask-worker-space/worker-o8uw6nv6\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 1

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63363\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:63364/status\n", + " \n", + " Memory: 16.00 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63349\n", + "
\n", + " Local directory: /Users/cpoli/opensource/gators/examples/dask-worker-space/worker-tqgoum22\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 2

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63357\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:63359/status\n", + " \n", + " Memory: 16.00 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63347\n", + "
\n", + " Local directory: /Users/cpoli/opensource/gators/examples/dask-worker-space/worker-metkvmd8\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 3

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63358\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:63361/status\n", + " \n", + " Memory: 16.00 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63346\n", + "
\n", + " Local directory: /Users/cpoli/opensource/gators/examples/dask-worker-space/worker-pfd4nf4e\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import dask.dataframe as dd\n", + "import dask.distributed\n", + "\n", + "client = dask.distributed.Client(n_workers=4)\n", + "client" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "data_dd = dd.read_parquet(\"data/titanic.parquet\")\n", + "data_dd = data_dd.reset_index(drop=True)\n", + "y_dd = data_dd[\"Survived\"]\n", + "X_dd = data_dd.drop(\"Survived\", axis=1)\n", + "\n", + "n_partitions = 4\n", + "train_test_split = TrainTestSplit(test_ratio=0.3, strategy=\"ordered\")\n", + "X_train_dd, X_test_dd, y_train_dd, y_test_dd = train_test_split.transform(X_dd, y_dd)\n", + "X_train_dd = client.persist(X_train_dd.repartition(n_partitions))\n", + "X_test_dd = client.persist(X_test_dd.repartition(n_partitions))\n", + "y_train_dd = client.persist(y_train_dd.repartition(n_partitions))\n", + "y_test_dd = client.persist(y_test_dd.repartition(n_partitions))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/lightgbm/dask.py:525: UserWarning: Parameter n_jobs will be ignored.\n", + " _log_warning(f\"Parameter {param_alias} will be ignored.\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finding random open ports for workers\n", + "[LightGBM] [Warning] num_threads is set=4, n_jobs=-1 will be ignored. Current value: num_threads=4\n" + ] + } + ], + "source": [ + "model_dd = DaskLGBMClassifier(random_state=0, client=client, n_jobs=n_partitions)\n", + "steps_dd = steps + [(\"Model\", Model(model=model_dd))]\n", + "\n", + "pipe = Pipeline(steps=steps_dd, verbose=False)\n", + "_ = pipe.fit(X_train_dd, y_train_dd)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# split prod pipeline and model\n", + "model_dd = pipe[-1].model\n", + "prod_pipe_dd = copy.deepcopy(pipe)\n", + "_ = prod_pipe_dd.steps.pop(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "X_train_prepro_dd = prod_pipe_dd.transform(X_train_dd)\n", + "X_test_prepro_dd = prod_pipe_dd.transform(X_test_dd)\n", + "y_test_pred_proba_dd = model_dd.predict_proba(X_test_prepro_dd).compute()[:, 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Koalas pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: An illegal reflective access operation has occurred\n", + "WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/Users/cpoli/gators38/lib/python3.8/site-packages/pyspark/jars/spark-unsafe_2.12-3.1.3.jar) to constructor java.nio.DirectByteBuffer(long,int)\n", + "WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform\n", + "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", + "WARNING: All illegal access operations will be denied in a future release\n", + "22/10/04 14:24:55 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + } + ], + "source": [ + "from pyspark import SparkConf, SparkContext\n", + "\n", + "conf = SparkConf()\n", + "conf.set(\"spark.executor.memory\", \"2g\")\n", + "conf.set(\"spark.sql.codegen.wholeStage\", \"false\")\n", + "conf.set(\"spark.sql.autoBroadcastJoinThreshold\", -1)\n", + "SparkContext(conf=conf)\n", + "import pyspark.pandas as ps\n", + "\n", + "ks.set_option(\"compute.default_index_type\", \"distributed-sequence\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "data_ks = ps.read_parquet(\"data/titanic.parquet\")\n", + "data_ks = data_ks.reset_index(drop=True)\n", + "y_ks = data_ks[\"Survived\"]\n", + "X_ks = data_ks.drop(\"Survived\", axis=1)\n", + "train_test_split = TrainTestSplit(test_ratio=0.3, strategy=\"ordered\")\n", + "X_train_ks, X_test_ks, y_train_ks, y_test_ks = train_test_split.transform(X_ks, y_ks)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/pyspark/sql/pandas/functions.py:389: UserWarning: In Python 3.6+ and Spark 3.0+, it is preferred to specify type hints for pandas UDF instead of specifying pandas UDF type which will be deprecated in the future releases. See SPARK-28264 for more details.\n", + " warnings.warn(\n", + " \r" + ] + } + ], + "source": [ + "from pyspark.ml.classification import RandomForestClassifier as RFCSpark\n", + "\n", + "model = RFCSpark(numTrees=15, maxDepth=3, labelCol=\"Survived\", seed=0)\n", + "steps_ks = steps + [(\"Model\", Model(model=model))]\n", + "\n", + "pipe_ks = Pipeline(steps=steps_ks, verbose=False)\n", + "_ = pipe_ks.fit(X_train_ks, y_train_ks)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# split prod pipeline and model\n", + "# note that koalas pipelines cannot be pickled\n", + "model_ks = pipe_ks[-1]\n", + "prod_pipe_ks = pipe_ks\n", + "_ = pipe_ks.steps.pop(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/pyspark/sql/pandas/functions.py:389: UserWarning: In Python 3.6+ and Spark 3.0+, it is preferred to specify type hints for pandas UDF instead of specifying pandas UDF type which will be deprecated in the future releases. See SPARK-28264 for more details.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "X_train_prepro_ks = prod_pipe_ks.transform(X_train_ks)\n", + "X_test_prepro_ks = prod_pipe_ks.transform(X_test_ks)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "y_test_pred_proba_ks = model_ks.predict_proba(X_test_prepro_ks)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## check results match" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### check pandas, dask, and koalas results match - production pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "assert_frame_equal(X_train_prepro_pd, X_train_prepro_dd.compute())\n", + "assert_frame_equal(X_train_prepro_pd, X_train_prepro_ks.to_pandas())\n", + "assert_frame_equal(X_test_prepro_pd, X_test_prepro_dd.compute())\n", + "assert_frame_equal(X_test_prepro_pd, X_test_prepro_ks.to_pandas())\n", + "assert np.allclose(y_test_pred_proba_dd, y_test_pred_proba_pd)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gators38", + "language": "python", + "name": "gators38" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/examples/models/model_lgbm_house.dill b/examples/models/model_lgbm_house.dill new file mode 100644 index 00000000..1cb1346e Binary files /dev/null and b/examples/models/model_lgbm_house.dill differ diff --git a/examples/models/model_titanic.dill b/examples/models/model_titanic.dill new file mode 100644 index 00000000..ddae3561 Binary files /dev/null and b/examples/models/model_titanic.dill differ diff --git a/examples/models/model_xgb_sfcrime.dill b/examples/models/model_xgb_sfcrime.dill new file mode 100644 index 00000000..a80b4ab8 Binary files /dev/null and b/examples/models/model_xgb_sfcrime.dill differ diff --git a/examples/models/simple_pipeline.dill b/examples/models/simple_pipeline.dill new file mode 100644 index 00000000..a31651e7 Binary files /dev/null and b/examples/models/simple_pipeline.dill differ diff --git a/examples/models/simple_xgb.dill b/examples/models/simple_xgb.dill new file mode 100644 index 00000000..a31651e7 Binary files /dev/null and b/examples/models/simple_xgb.dill differ diff --git a/examples/models/treelite_lgbm_house.zip b/examples/models/treelite_lgbm_house.zip new file mode 100644 index 00000000..822c944f Binary files /dev/null and b/examples/models/treelite_lgbm_house.zip differ diff --git a/examples/models/treelite_lgbm_sfcrime.zip b/examples/models/treelite_lgbm_sfcrime.zip new file mode 100644 index 00000000..38badf0e Binary files /dev/null and b/examples/models/treelite_lgbm_sfcrime.zip differ diff --git a/examples/mydask.png b/examples/mydask.png new file mode 100644 index 00000000..7e154f84 Binary files /dev/null and b/examples/mydask.png differ diff --git a/examples/sf_crime.ipynb b/examples/sf_crime.ipynb index 49a86130..669b4233 100644 --- a/examples/sf_crime.ipynb +++ b/examples/sf_crime.ipynb @@ -1,1095 +1,2423 @@ { - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# multiclass classification example - SF crime dataset" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 1, - "source": [ - "import warnings\n", - "warnings.filterwarnings('ignore')" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 2, - "source": [ - "%load_ext autoreload\n", - "%autoreload 2" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 3, - "source": [ - "import copy\n", - "import numpy as np\n", - "import pandas as pd\n", - "import databricks.koalas as ks\n", - "from pandas.testing import assert_frame_equal\n", - "from lightgbm import LGBMClassifier\n", - "from xgboost import XGBClassifier\n", - "from sklearn.model_selection import StratifiedKFold\n", - "from sklearn.metrics import f1_score\n", - "from hyperopt import hp\n", - "from hyperopt import tpe" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "WARNING:root:'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. Koalas will set it for you but it does not work if there is a Spark context already launched.\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 4, - "source": [ - "from pyspark import SparkConf, SparkContext\n", - "conf = SparkConf()\n", - "conf.set('spark.executor.memory', '2g')\n", - "SparkContext(conf=conf)\n", - "ks.set_option('compute.default_index_type', 'distributed-sequence')" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "21/09/30 11:18:16 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", - "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", - "Setting default log level to \"WARN\".\n", - "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", - "21/09/30 11:18:17 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.\n", - "21/09/30 11:18:17 WARN Utils: Service 'SparkUI' could not bind on port 4041. Attempting port 4042.\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 5, - "source": [ - "from gators.util import util\n", - "# converter\n", - "from gators.converter import ConvertColumnDatatype\n", - "# data cleaning\n", - "from gators.data_cleaning import (\n", - " DropHighNaNRatio,\n", - " DropLowCardinality,\n", - " DropHighCardinality,\n", - " DropDatatypeColumns,\n", - " DropColumns,\n", - " KeepColumns\n", - ")\n", - "# imputers\n", - "from gators.imputers import (\n", - " FloatImputer, \n", - " IntImputer, \n", - " ObjectImputer,\n", - ")\n", - "# encoders\n", - "from gators.encoders import (\n", - " WOEEncoder, \n", - " MultiClassEncoder, \n", - " TargetEncoder,\n", - " OrdinalEncoder,\n", - ")\n", - "# binning\n", - "from gators.binning import BinRareEvents\n", - "# feature generation\n", - "from gators.feature_generation import (\n", - " ClusterStatistics,\n", - ")\n", - "from gators.feature_generation_str import (\n", - " StringContains,\n", - " StringLength,\n", - " Extract,\n", - " SplitExtract,\n", - ")\n", - "from gators.feature_generation_dt import (\n", - " CyclicHourOfDay,\n", - " CyclicDayOfMonth,\n", - " CyclicDayOfWeek,\n", - " CyclicMonthOfYear,\n", - " OrdinalDayOfMonth,\n", - " OrdinalMonthOfYear,\n", - " OrdinalDayOfWeek,\n", - " OrdinalHourOfDay,\n", - ")\n", - "# feature selection\n", - "from gators.feature_selection import (\n", - " InformationValue,\n", - " SelectFromModel,\n", - ")\n", - "# feature generation\n", - "from gators.feature_generation import PlaneRotation\n", - "# model building\n", - "from gators.model_building import (\n", - " TrainTestSplit,\n", - " HyperOpt,\n", - " XGBBoosterBuilder,\n", - " XGBTreeliteDumper,\n", - " LGBMTreeliteDumper,\n", - ")\n", - "# pipeline\n", - "from gators.pipeline import Pipeline" - ], - "outputs": [], - "metadata": { - "scrolled": true - } - }, - { - "cell_type": "markdown", - "source": [ - "## offline pipeline - feature selection" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 6, - "source": [ - "model = LGBMClassifier(random_state=0, n_jobs=-1)\n", - "k = 60\n", - "\n", - "offline_steps = [\n", - " ConvertColumnDatatype(columns=['Dates'], datatype='datetime64[ns]'),\n", - " OrdinalHourOfDay(columns=['Dates']),\n", - " OrdinalDayOfWeek(columns=['Dates']),\n", - " CyclicHourOfDay(columns=['Dates']),\n", - " CyclicDayOfWeek(columns=['Dates']),\n", - " StringContains(\n", - " columns=['Address', 'Address', 'Address', 'Address'], \n", - " contains_vec=['/', 'AV', 'ST', 'Block'], \n", - " column_names=['IsIntersection', 'IsAvenue', 'IsStreet', 'IsBlock']),\n", - " DropColumns(columns=['Dates', 'Address']),\n", - " OrdinalEncoder(),\n", - " PlaneRotation(\n", - " columns= [['X','Y']], \n", - " theta_vec= np.arange(5, 46, 5).tolist()),\n", - " SelectFromModel(\n", - " model=model, k=k)\n", - "]\n", - "offline_pipe = Pipeline(steps=offline_steps)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### pandas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 7, - "source": [ - "data = pd.read_parquet('data/sf_crime.parquet')\n", - "y = data['Category'].copy()\n", - "X = data.drop(\n", - " ['Resolution', 'Descript', 'DayOfWeek', 'Category'], axis=1)\n", - "\n", - "base_columns = list(X.columns)\n", - "classes = y.unique()\n", - "mapping = dict(zip(classes, range(len(classes))))\n", - "y = y.replace(mapping)\n", - "\n", - "train_test_split = TrainTestSplit(test_ratio=0.3, strategy='ordered')\n", - "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)\n", - "X_train = X_train.reset_index().drop('Id', axis=1)\n", - "X_test = X_test.reset_index().drop('Id', axis=1)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 8, - "source": [ - "# target analysis\n", - "data['Category'].value_counts().iloc[::-1].plot(kind='barh');" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 9, - "source": [ - "X_train_prepro = offline_pipe.fit_transform(X_train, y_train)\n", - "X_train_prepro_np = offline_pipe.transform_numpy(X_train.to_numpy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 10, - "source": [ - "offline_pipe.get_feature_importances(k)[::-1].plot(\n", - " kind='barh', \n", - " figsize=(9,9), \n", - " title='Feature Importance',\n", - ");" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAogAAAIYCAYAAADuLx35AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABzvklEQVR4nOzdeZxdRZ3//9ebsBmQsBgxBjDoBBGIRGhIkLCoEGXUERRnWGSJDhFENDpmzDij4ii/AcOXjMoECQiIsijDoA4oIRJZlaUTshAQXJIhhLApRAIEQ3j//jjVcru93fd26KQ73e/n43EffU9Vnao6N/zxoepUlWwTEREREdFmo97uQERERET0LQkQIyIiIqKdBIgRERER0U4CxIiIiIhoJwFiRERERLSTADEiIiIi2kmAGBERERHtJECMiGiSpCWSnpe0subz+h6o85Ce6mMT7Z0u6fvrq72uSDpR0m293Y+I+GsJECMiuuf9tres+TzSm52RtHFvtr+2NtR+RwwUCRAjIl4hSUMkfUfScknLJH1N0qCS9yZJsyX9QdKTki6TtHXJ+x6wE/C/ZTTynyUdLOnhDvX/ZZSxjAD+t6TvS/oTcGJX7TfRd0v6hKTfSHpG0ldLn38p6U+Sfihp01L2YEkPS/pCeZYlko7t8DtcKukJSf8n6d8kbVTyTpR0u6Rpkv4A/AD4NrBfefanS7n3SrqntL1U0uk19Y8o/T1B0kOlD/9akz+o9O135VnmSNqx5O0qaZakP0p6QNLfd+sfOWKASYAYEfHKXQK8CPwN8DZgPPCPJU/AfwCvB94C7AicDmD7OOAhXh6V/HqT7X0A+G9ga+CyBu03493A3sBY4J+BGcBHSl/3AI6uKfs64DXAcOAEYIakN5e8bwFDgDcCBwHHAxNq7h0D/B7YvtR/MvCr8uxblzLPlvu2Bt4LnCLp8A79HQe8GXgX8CVJbynpny19/VtgK+CjwHOStgBmAZcDrwWOAqZL2q35nyhiYEmAGBHRPT+S9HT5/EjS9lQBySTbz9p+HJhGFYRg+7e2Z9l+wfYTwDlUwdMr8SvbP7L9ElUg1Gn7Tfq67T/ZXgTcC9xg+/e2VwA/owo6a32xPM/NwHXA35cRy6OAf7H9jO0lwP8Djqu57xHb37L9ou3n63XE9k22F9p+yfYC4Ar++vf6iu3nbc8H5gN7lvR/BP7N9gOuzLf9B+B9wBLbF5e27wGuBj7cjd8oYkDJOyAREd1zuO2ft11I2hfYBFguqS15I2Bpyd8e+AZwAPDqkvfUK+zD0prvb+iq/SY9VvP9+TrXr6u5fsr2szXX/0c1Ovqa0o//65A3vJN+1yVpDHAm1cjlpsBmwFUdij1a8/05YMvyfUfgd3WqfQMwpm0au9gY+F6j/kQMVBlBjIh4ZZYCLwCvsb11+Wxle/eS//8BBkbZ3opqalU197tDfc8Cg9suysjc0A5lau9p1H5P26ZM2bbZCXgEeBJYTRWM1eYt66Tf9a6hmgb+CbCj7SFU7ymqTrl6lgJv6iT95prfZ+syrX1Kk/VGDDgJECMiXgHby4EbgP8naStJG5VFHm3Toq8GVgIrJA0HJneo4jGqd/baPAhsXhZrbAL8G9Uo2tq2vy58RdKmkg6gmr69yvYa4IfAGZJeLekNVO8EdrWlzmPADm2LYIpXA3+0vaqMzh7TjX5dCHxV0khV3ippO+BaYBdJx0napHz2qXl3MSI6SIAYEfHKHU81HXof1fTxfwPDSt5XgL2AFVTv6/1Ph3v/A/i38k7j58p7f5+gCnaWUY0oPkzXumq/pz1a2niEaoHMybZ/XfJOo+rv74HbqEYDL+qirtnAIuBRSU+WtE8A/y7pGeBLVEFns84p5W8A/gR8B3iV7WeoFu4cVfr9KHAWXQTeEQOd7Hoj/BEREe1JOhj4vu0derkrEbGOZQQxIiIiItpJgBgRERER7WSKOSIiIiLayQhiRERERLSTADEiIiIi2slJKtG017zmNR4xYkRvdyMiIiJ6wJw5c5603XEjfiABYnTDiBEjaG1t7e1uRERERA+Q9H+d5WWKOSIiIiLaSYAYEREREe1kijmatnDZCkZMua63uxERETEgLDnzvb3W9lqPIEpaI2mepEWS5kv6J0ld1idphKTuHLy+tn1bua7baIakT0m6X9JlTZZfIuk167hPF0rabV22ERERERu2VzKC+Lzt0QCSXkt1KPtWwJe7uGcEcEwpu0GRtLHtF7t52yeAQ2w/vC76tDZs/2Nv9yEiIiL6th55B9H248BE4JOqjJB0q6S55fP2UvRM4IAy8vgZSYMkTZV0t6QFkj4OIGmYpFtKuXslHdDdPkk6o4xs3iFp+5I2QtLs0taNknYq6ZdIOrLm3pXl78HlOX4C3NdFW58t/bxX0qSS9m3gjcDPJH2mk/u2k3RDGYW9EFBN3o8kzSl5E0vaRyX9Z02ZkyRN66TuLSRdV36DeyX9Q0m/SVJL23PW+5061DNRUquk1jXPrejsJ4iIiIh+pMcWqdj+PTAIeC3wOHCo7b2AfwC+WYpNAW61Pdr2NOBjwArb+wD7ACdJ2plqlHFmGaHcE5jXze5sAdxhe0/gFuCkkv4t4Lu23wpcVtOvruwFfNr2LvUyJe0NTADGAGPLM7zN9snAI8A7yrPW82XgNtu7A9cAO9XkfdT23kAL8ClJ2wE/BN4vaZNSZgJwUSd1vwd4xPaetvcArq9TprPf6S9sz7DdYrtl0OAhnTQVERER/cm6WsW8CXCBpIXAVUBn77yNB46XNA+4E9gOGAncDUyQdDowyvYz3Wz/z8C15fscqqltgP14eXr7e8C4Juq6y/biLvLHAdfYftb2SuB/gGZHPA8Evg9g+zrgqZq8T0maD9wB7AiMLPXPBt4naVdgE9sLO6l7IXCopLMkHWC73vBfZ79TREREDGA9topZ0huBNVSjh18GHqMa/dsIWNXZbcBptmfWqe9A4L3AJZLOsX1pN7qz2rbL9zU0fs4XSz8pC202rcl7thvt9ghJBwOHAPvZfk7STcDmJftC4AvAr4GLO6vD9oOS9gL+FviapBtt/3uHYt39nSIiImIA6JGAQNJQ4NvAubYtaQjwsO2XJJ1ANfUM8Azw6ppbZwKnSJpte7WkXYBlwGvK/RdI2oxqmrc7AWJnfgkcRTV6eCxwa0lfAuxNNYX7d1QjoM26lSqIPZMq4D0COK7Je2+hmk7/mqTDgG1K+hDgqRIc7ko1dQ2A7Tsl7Uj1m7y1s4olvR74o+3vS3oaeMWLU0YNH0JrLy65j4iIiPXjlQSIrypTw5tQjcB9Dzin5E0HrpZ0PNW7b22jcAuANWXq9BLgG1TTmnMlCXgCOBw4GJgsaTWwEjj+FfSz1mnAxZIml7YmlPQLgB+XftX2tyHbcyVdAtxVki60fU+Tt38FuELSIqrg9aGSfj1wsqT7gQeopplr/RAYbfspOjcKmCrpJWA1cEqTfYqIiIgBTi/PMMaGQtK1wDTbN67PdltaWpyzmCMiIvoHSXNst9TLy1F7GxBJW0t6kGoPyvUaHEZERMTAscEsSpB0J7BZh+QdgaUd0o7rYmXvK2l/O6BeUPYu239ocO8E4NMdkm+3fWp3+mD7aaDddjuvpF8RERER9WwwAaLtMb3c/h+A0Wt578V0seL4lXgl/YqIiIioJ1PMEREREdFOAsSIiIiIaGeDmWKO3rdw2QpGTLmut7sRERHR7y3p5X2HM4I4QKlyW9mguy3tw5LqndkcERERA0hGEAeocuLNycBVkn5B9d/C/we8p3d7FhEREb0tAeIAZvteSf8LfB7YArjU9u96uVsRERHRyxIgxleAucCfgb/aTV3SRGAiwKCthq7fnkVERESvSIA4wNl+VtIPgJW2X6iTPwOYAbDZsJE5lzEiImIAyCKVAHipfCIiIiISIEZEREREe5lijqaNGj6E1l7elykiIiLWvQSIge3Te7sPERER0XdkijkiIiIi2kmAGBERERHtJECMiIiIiHYSIEZEREREOwkQIyIiIqKdBIgRERER0U62uYmmLVy2ghFTruvtbkRExAC3JHvyrnMZQRygJO0oabGkbcv1NuV6RC93LSIiInpZAsQByvZS4DzgzJJ0JjDD9pJe61RERET0CZliHtimAXMkTQLGAZ/s3e5EREREX5AAcQCzvVrSZOB6YLzt1R3LSJoITAQYtNXQ9dzDiIiI6A2ZYo7DgOXAHvUybc+w3WK7ZdDgIeu3ZxEREdErEiAOYJJGA4cCY4HPSBrWuz2KiIiIviAB4gAlSVSLVCbZfgiYCpzdu72KiIiIviDvIA5cJwEP2Z5VrqcDEyQdZPvmejeMGj6E1uw9FRER0e8lQBygbM8AZtRcrwH26r0eRURERF+RKeaIiIiIaCcBYkRERES0kwAxIiIiItpJgBgRERER7SRAjIiIiIh2EiBGRERERDvZ5iaatnDZCkZMua63uxEREb1kSfbCHTD6xAiipDWS5klaJGm+pH+S1GXfJI2QdMx66NvKdd1GMyR9StL9ki5rsvwSSa9Z1/2KiIiI/qevjCA+b3s0gKTXApcDWwFf7uKeEcAxpewGRdLGtl/s5m2fAA6x/fC66FNEREREmz4xgljL9uPAROCTqoyQdKukueXz9lL0TOCAMvL4GUmDJE2VdLekBZI+DiBpmKRbSrl7JR3Q3T5JOqOMbN4hafuSNkLS7NLWjZJ2KumXSDqy5t6V5e/B5Tl+AtzXRVufLf28V9KkkvZt4I3AzyR9ppP7tpN0QxmFvRBQTd6PJM0peRNL2kcl/WdNmZMkTevubxMRERH9T58LEAFs/x4YBLwWeBw41PZewD8A3yzFpgC32h5texrwMWCF7X2AfYCTJO1MNco4s4xQ7gnM62Z3tgDusL0ncAvVGcYA3wK+a/utwGU1/erKXsCnbe9SL1PS3sAEYAwwtjzD22yfDDwCvKM8az1fBm6zvTtwDbBTTd5Hbe8NtACfkrQd8EPg/ZI2KWUmABfV6dNESa2SWtc8t6KJR4yIiIgNXV+ZYu7KJsC5kkYDa4C6wRUwHnhrzejdEGAkcDdwUQmEfmR7Xjfb/zNwbfk+Bzi0fN8P+GD5/j3g603UdZftxV3kjwOusf0sgKT/AQ4A7mmi7gPb+mP7OklP1eR9StIR5fuOwEjbd0iaDbxP0v3AJrYXdqy09szmzYaNdBP9iIiIiA1cnwwQJb2RKhh8nGpk7DGq0b+NgFWd3QacZntmnfoOBN4LXCLpHNuXdqM7q223BUZraPybvVj6SVlos2lN3rPdaLdHSDoYOATYz/Zzkm4CNi/ZFwJfAH4NXLy++xYRERF9U5+bYpY0FPg2cG4JzIYAy22/BBxHNfUM8Azw6ppbZwKntE2ZStpF0haS3gA8ZvsCqoBorx7q6i+Bo8r3Y4Fby/clwN7l+99RjYA261bgcEmDJW0BHFFTbyO3UE2nI+kwYJuSPgR4qgSHu1JNXQNg+06qEcVjgCu60c+IiIjox/rKCOKrJM2jCqZepJqyPafkTQeulnQ8cD0vj8ItANZImg9cAnyDamXzXEkCngAOBw4GJktaDawEju+hPp8GXCxpcmlrQkm/APhx6VdtfxuyPVfSJcBdJelC281MLwN8BbhC0iKq4PWhkn49cHKZRn4AuKPDfT8ERtt+igZGDR9Ca/bAioiI6Pf08uxpDESSrgWm2b6xUdmWlha3trauh15FRETEuiZpju2Wenl9boo51g9JW0t6kGoPyobBYURERAwcfWWKeb2SdCewWYfkHYGlHdKOq7eytwfa3w6oF5S9y/YfGtw7Afh0h+TbbZ/anT7YfprOV4RHRETEADYgA0TbY3q5/T8Ao9fy3ovJiuOIiIhYhzLFHBERERHtJECMiIiIiHYSIEZEREREOwPyHcRYOwuXrWDElOt6uxsREf3OkuwxG31Mt0YQJa2RNE/SIknzJf1TOU6uq3tGSDrmlXWzqb6tXNdtNEPSpyTdL+myJssvkfSadd2viIiIiGZ1dwTxedujASS9Frgc2IrqvOTOjKA6yu3ytehfr5K0se0Xu3nbJ4BDbD+8LvoUERERsa6t9TuIth8HJgKfVGWEpFslzS2ft5eiZwIHlJHHz0gaJGmqpLslLZD0cQBJwyTdUsrdK+mA7vZJ0hllZPMOSduXtBGSZpe2bpS0U0m/RNKRNfeuLH8PLs/xE+C+Ltr6bOnnvZImlbRvA28EfibpM53ct52kG8oo7IWAavJ+JGlOyZtY0j4q6T9rypwkaVoX/Tq+POt8Sd9r8Bt8uPR/vqRbuv51IyIiYqB4RYtUbP8eGAS8FngcONT2XsA/AN8sxaYAt9oebXsa8DFghe19gH2AkyTtTDXKOLOMUO4JzOtmd7YA7rC9J3ALcFJJ/xbwXdtvBS6r6VdX9gI+bbvuRtKS9qY6e3kMMLY8w9tsnww8AryjPGs9XwZus707cA2wU03eR23vDbQAnyobav8QeL+kTUqZCcBFnfRrd+DfgHeW36FtQ+3OfoMvAe8uZf+ukzonSmqV1LrmuRWdPFJERET0Jz25inkT4AJJC4GrgN06KTceOF7SPOBOYDtgJHA3MEHS6cAo2890s/0/A9eW73OoprYB9uPl6e3vAeOaqOsu24u7yB8HXGP7Wdsrgf8Bmh3xPBD4PoDt64CnavI+JWk+cAfVyS4jS/2zgfdJ2hXYpIvTXd4JXGX7yVL/H0t6Z7/B7cAlkk6iCvT/iu0ZtltstwwaPKTJR4yIiIgN2StaxSzpjcAaqtHDLwOPUY3+bQSs6uw24DTbM+vUdyDwXqqg5Rzbl3ajO6ttu3xfQ+Nne7H0k7LQZtOavGe70W6PkHQwcAiwn+3nJN0EbF6yLwS+APyaHjxFxfbJksZQ/eZzJO3d6Ki/iIiI6P/WegRR0lDg28C5JTAbAiy3/RJwHC+PSD0DvLrm1pnAKW1TppJ2kbSFpDcAj9m+gCog2mtt+9bBL4GjyvdjgVvL9yXA3uX731GNgDbrVuBwSYMlbQEcUVNvI7dQTacj6TBgm5I+BHiqBIe7Uk1dA2D7TqoRxWOAK7qoezbw4TI1jaRtS3rd30DSm2zfaftLwBOljYiIiBjgujuC+KoyNbwJ1Qjc94BzSt504GpJxwPX8/Io3AJgTZk6vQT4BtX071xJogpMDgcOBiZLWg2sBI5fmweq4zTgYkmTS1sTSvoFwI9Lv2r725DtuZIuAe4qSRfavqfJ278CXCFpEVXg9lBJvx44WdL9wANU08y1fgiMtv0UnbC9SNIZwM2S1gD3ACfS+W8wVdJIqlHdG4H5XXV81PAhtGavroiIiH5PL8/KRl8m6Vpgmu0be6sPLS0tbm1t7a3mIyIiogdJmmO7pV5ejtrr4yRtLelBqj0oey04jIiIiIGjTx+1J+lOYLMOyTsCSzukHdfFyt5X0v52VFOvHb2r0WIOSRN4eZuZNrfbPrU7fbD9NNBuu51X0q+IiIiIRvp0gGh7TC+3/wdg9FreezE9uOK4Q91r3a+IiIiIRjLFHBERERHtJECMiIiIiHb69BRz9C0Ll61gxJTrersbEREbvCXZMiz6uIwgRkREREQ7CRAbkLSjpMVtp5JI2qZcr5I0qqbcZEnn92C7O0laKelzNWlLJC2UNE9S3Q0JJY2QdG9P9SMiIiIGnkwxN2B7qaTzgDOBieXvDKpTSqaX86NfD5wM1N1sci2dA/ysTvo7bD/Zg+1EREREtJMRxOZMA8ZKmgSMA862fT2wnOpIwGnA6Z0dgyfpUkmH11xfJukDnTVWyi4GFjXTOUl7S5pfjg08tSZ9kKSpku6WtEDSx0v6RpKmS/q1pFmSfirpyE7qniipVVLrmudWNNOdiIiI2MAlQGyC7dXAZKpAcFK5BpgEnAEMtf29Lqr4DtWZyEgaArwdqLvaQ9KWwOepzmz+q64AN0iaI2liTfrFwGm29+xQ/mPACtv7APsAJ0naGfgg1XnYuwHHAft11nHbM2y32G4ZNHhIF48YERER/UUCxOYdRjViuEdbgu1HgNnAeV3daPtmYKSkocDRwNW2X+yk+OlUZy6vrJM3zvZepS+nSjpQ0tbA1rZvKWVqA9XxwPGS5gF3AtsBI6lGQa+y/ZLtR4FfdNX/iIiIGFjyDmITJI0GDgXGArdJutL28pL9Uvk0cinwEeAoYEIX5cYAR0r6OrA18JKkVbbPtb0MwPbjkq4B9gUWdNV1qpHFmR2e52+b6G9EREQMUAkQG5AkqhHCSbYfkjQVOBs4tptVXQLcBTxq+77OCtk+oKbt04GVts+VtAWwke1nyvfxwL/bflrS05LG2b6tQ79mAqdImm17taRdgGXA7cAJkr4LDAUOBi5v9ACjhg+hNXt3RURE9HsJEBs7CXjI9qxyPR2YIOmgMnXcFNuPSbof+NFa9mN74JoqXmVj4PKyUAaqEcmLJBm4oeaeC6neNZxbAt0ngMOBq4F3AfcBS4G5QFagREREBACy3dt9GBAkDQYWAnvZ7vVgTNKWtldK2o5qZHP/8j5ip1paWtzaWnf7xYiIiNjASJpju+4WfRlBXA8kHUK1knlaXwgOi2vLApdNga82Cg4jIiJi4EiA2IPKySodt7t5wfYY4A0dyr4bOKtD2cW2j1iHXfwL2wevj3YiIiJiw5MAsQfZXgiMbrLsTKpFJBERERF9SvZBjIiIiIh2EiBGRERERDuZYo6mLVy2ghFT6p4QGBERDSzJPrKxAckIYkRERES0kwCxAUk7SlosadtyvU25XlVWLbeVmyzp/B5sdydJKyV9riZtiaSFkuZJqrshoaQRku7tqX5ERETEwJMp5gZsL5V0HnAmMLH8nQHcA0yXdCDweuBkoO5mk2vpHOBnddLfYfvJHmwnIiIiop2MIDZnGjBW0iRgHHB2OeZuOXB8yT/d9lP1bpZ0hKQbVRkm6UFJr+usMUmHA4uBRc10TtLekuZLmg+cWpM+SNJUSXdLWiDp4yV9I0nTJf1a0ixJP5V0ZCd1T5TUKql1zXN9ZY/viIiIWJcSIDbB9mpgMlUgOKlcA0wCzgCG2u64QXbt/ddQBZOnAhcAX+7s5BJJWwKfB75SryrgBklzJE2sSb8YOM32nh3KfwxYYXsfYB/gJEk7Ax+kOqN5N+A4YL8u+j7DdovtlkGDh3RWLCIiIvqRTDE37zCqIG8PYBaA7UckzQaubeL+04B7gTtsX9FFudOpjuRbKalj3jjbyyS9Fpgl6dfAAmBr27eUMt8rfQUYD7y1ZnRwCDCSahT0KtsvAY9K+kUT/Y+IiIgBIgFiEySNBg4FxgK3SbrS9vKS/VL5NLJDKbe9pI1KcFbPGOBISV8HtgZekrTK9rm2lwHYflzSNcC+VAFip12nGllsd2KLpL9tor8RERExQCVAbEDVMN55VFPLD0maCpwNHNuNOjYGLgKOBk4APlvq+Cu2D6i573Rgpe1zJW0BbGT7mfJ9PPDvtp+W9LSkcbZv69CvmcApkmbbXi1pF2AZcDtwgqTvAkOBg4HLGz3HqOFDaM0+XhEREf1eAsTGTgIesj2rXE8HJkg6yPbNTdbxBeBW27eVhSR3S7rO9v3d6Mf2wDVl2nlj4PKyUAZgAnCRJAM31NxzIdW7hnNLoPsEcDhwNfAu4D5gKTAXyAqUiIiIAEC2e7sP0QskbVnec9wOuAvYv7OFM21aWlrc2lp3+8WIiIjYwEiaY7vuFn0ZQRy4rpW0NbAp8NVGwWFEREQMHAkQe1A5WaXjdjcv2B5Tp+y7gbM6JC+2fcS66l8t2wevj3YiIiJiw5MAsQfZXgiMbrLsTKpFJBERERF9SjbKjoiIiIh2EiBGRERERDuZYo6mLVy2ghFTruvtbkRE9Kol2Q82BoCMIK4lSTtKWixp23K9TbleVRartJWbLOn8HmhvhKTnJc0rn293Uu5ESee+0vYiIiJi4MoI4lqyvVTSecCZwMTydwZwDzBd0oHA64GTgbp7DK2F39ke3UN1RURERNSVEcRXZhowVtIkYBxwdjndZDlwfMk/3fZT9W6WdKmkw2uuL5P0ge52QtIESQ9KugvYvyZ9qKSrJd1dPvvXpM+StEjShZL+T9JruttuRERE9E8JEF8B26uByVSB4KRyDTAJOAMYarvjvoi1vgOcCCBpCPB2oKuX/HaWdI+kmyUdUO4bBnyFKjAcB+xWU/4bwDTb+wAfojp6D+DLwGzbuwP/DezUWYOSJkpqldS65rmcxhcRETEQZIr5lTuMasRwD2AWgO1HJM0Gru3qRts3S5ouaShVAHe17Rc7Kb4c2Mn2HyTtDfxI0u7AGOAm208ASPoBsEu55xBgt3J+M8BWkrakCiSPKH24XlLdEc6SP4Nq6pzNho3MuYwREREDQALEV0DSaOBQYCxwm6QrbS8v2S+VTyOXAh8BjgImdFbI9gvAC+X7HEm/4+VAsDMbAWNtr+rQ7ya6FREREQNVppjXkqoo6zyqqeWHgKnA2WtR1SVUU9LYvq+L9oZKGlS+vxEYCfweuBM4SNJ2kjYBPlxz2w3AaTV1jC5fbwf+vqSNB7ZZi35HREREP5URxLV3EvCQ7VnlejowQdJBtm9uthLbj0m6H/hRg6IHAv8uaTXVyOTJtv8IIOl04FfA08C8mns+BfyXpAVU/9a3UK2q/gpwhaTjyn2PAs806uuo4UNozf5fERER/Z7svFbWmyQNBhYCe9leL6tAJG0GrLH9oqT9gPOa2T6npaXFra2t67x/ERERse5JmmO77lZ8GUHsRZIOoVrJPG19BYfFTsAPJW0E/JlqNDQiIiICSIC4XpSTVTpud/OC7THAGzqUfTdwVoeyi20f0VP9sf0b4G09VV9ERET0LwkQ1wPbC4HRTZadCcxcpx2KiIiI6EJWMUdEREREOwkQIyIiIqKdBIgRERER0U7eQYymLVy2ghFTujoqOiIClmS/1IgNXkYQG5C0o6TFkrYt19uU61VldXJbucmSzu+B9raT9AtJKyWd2yFvb0kLJf1W0jdV58w8SSMk3ftK+xEREREDVwLEBmwvpTpS78ySdCYwAzgcmK7KcKoTSqb0QJOrgC8Cn6uTdx7VnoUjy+c9PdBeRERERDsJEJszDRgraRIwDjjb9vXAcuD4kn+67afq3SzpUkmH11xfJukD9craftb2bVSBYm0dw4CtbN/h6vibS6mC1LaRxfmS5gOn1twzSNJUSXdLWiDp4yV9I0nTJf1a0ixJP5V05Fr9MhEREdHvJEBsgu3VwGSqQHBSuQaYBJwBDLXdcSPsWt8BTgSQNAR4O9Ddl/mGAw/XXD9c0gAuBk6zvWeHez4GrLC9D7APcJKknYEPAiOA3YDjgP06a1TSREmtklrXPLc+D3uJiIiI3pIAsXmHUY0Y7tGWYPsRYDbV1G+nbN8MjJQ0FDgauNr2iz3RKUlbA1vbvqUk1Qaq44HjJc0D7gS2o5qaHgdcZfsl248Cv+ii7zNst9huGTR4SE90OSIiIvq4rGJugqTRwKHAWOA2SVfaXl6yXyqfRi4FPgIcBUxYi24sA3aoud6hpHVFVCOL7U5mkfS3a9F+REREDBAZQWygrBQ+j2pq+SFgKnD2WlR1CdWUNLbv6+7NJSD9k6SxpU/HAz+2/TTwtKRxpeixNbfNBE6RtEl5ll0kbQHcDnyovIu4PXDwWjxPRERE9FMZQWzsJOAh27PK9XRggqSDytRxU2w/Jul+4EeNykpaAmwFbFoWt4wvQeUnqALNVwE/Kx+oRiQvkmTghpqqLqR613BuCSqfoFrYcjXwLuA+YCkwF2j4guGo4UNozf5mERER/Z6qBbGxrkkaDCwE9rLd66s9JG1pe6Wk7YC7gP3L+4idamlpcWtr6/rpYERERKxTkubYbqmXlxHE9UDSIVQrmaf1heCwuLYscNkU+Gqj4DAiIiIGjgSIPaicrNJxu5sXbI8B3tCh7LuBszqUXWz7iHXYxb+wffD6aCciIiI2PAkQe5DthcDoJsvOpFpEEhEREdGnZBVzRERERLSTADEiIiIi2kmAGBERERHt5B3EaNrCZSsYMaW7R0hHxECwJHukRvQrGUFcS5J2lLRY0rbleptyvaqsZm4rN1nS+T3Q3ghJz0uaVz7f7qTciZLOfaXtRURExMCVEcS1ZHuppPOAM4GJ5e8M4B5guqQDgdcDJwN1N6FcC7+zPbqH6oqIiIioKyOIr8w0YKykScA44Gzb1wPLqc5KngacbvupejdLOkLSjaoMk/SgpNd1txOSJpR77wL2r0kfKulqSXeXz/416bMkLZJ0oaT/k/SaTuqeKKlVUuua5/rKHt8RERGxLiVAfAVsrwYmUwWCk8o1wCTgDGCo7Y4bZ9fefw1VMHkqcAHw5QYnmuws6R5JN0s6AEDSMOArVIHhOGC3mvLfoDq9ZR/gQ1RnMwN8GZhte3fgv4GduujjDNsttlsGDR7SRdciIiKiv8gU8yt3GFWQtwcwC8D2I5JmA9c2cf9pwL3AHbav6KLccmAn23+QtDfwI0m7A2OAm2w/ASDpB8Au5Z5DgN0ktdWxlaQtqQLJI0pfr5dUd4QzIiIiBqYEiK+ApNHAocBY4DZJV9peXrJfKp9Gdijltpe0ke2699h+AXihfJ8j6Xe8HAh2ZiNgrO1VHfrdRLciIiJioEqAuJZURVnnUU0tPyRpKnA2cGw36tgYuAg4GjgB+Gypo17ZocAfba+R9EZgJPB7YBnwDUnbAX8CPgzML7fdQDVCObXUMdr2POB24O+BsySNB7Zppr+jhg+hNVtZRERE9Ht5B3HtnQQ8ZHtWuZ4OvEXSQd2o4wvArbZvowoO/1HSWzopeyCwQNI8qvcGT7b9xzJieTrwK6rA7/6aez4FtEhaIOk+qhXVUL2zOF7SvVQB5aPAM93od0RERPRjst3bfYj1TNJmwBrbL0raDzivme1zWlpa3Nraus77FxEREeuepDm2627FlynmgWkn4IeSNgL+TDUaGhEREQEkQFwvyskqHbe7ecH2mDpl3w2c1SF5se0jeqo/tn8DvK2n6ouIiIj+JQHiemB7ITC6ybIzgZnrtEMRERERXcgilYiIiIhoJwFiRERERLSTKeZo2sJlKxgx5bre7kZE9CFLsjdqRL+UEcSIiIiIaKfXAkRJayTNk7RI0nxJ/1S2XenqnhGSjllffSxtnijp3PXQzlBJd0q6R9IB67q90uYlko5cH21FRETEhqM3RxCftz3a9u5U5xkfBny5wT0jgPUaIK5H7wIW2n6b7Vt7uzMRERExcPWJKWbbjwMTgU+qMkLSrZLmls/bS9EzgQPKyONnJA2SNFXS3eU4uY8DSBom6ZZS7t7ujshJmiDpQUl3AfvXpL+/ZpTv55K2l7SRpN+Us5Ip179tu65T9whJs0t/b5S0k6TRwNeBD5Q+v6rOfR+WdE75/mlJvy/f3yjp9vJ9b0k3S5ojaaakYSX9TZKuL+m3Stq1Tv1fLSOKgzqkT5TUKql1zXMruvMzRkRExAaqTwSIALZ/DwwCXgs8Dhxqey/gH4BvlmJTqM4uHm17GvAxYIXtfYB9gJMk7Uw1yjizHB+3JzCv2X6UoOorVIHhOGC3muzbgLG23wZcCfyz7ZeA7wPHljKHAPNtP9FJE98Cvmv7rcBlwDdtzwO+BPygPNvzde67FWgLdA8A/iBpePl+i6RNSt1H2t4buAg4o5SfAZxW0j9HdW507TNPBYYCE2yvqc2zPcN2i+2WQYOHdPJIERER0Z/01VXMmwDnlpG1NcAunZQbD7y15j26IcBI4G7gohI0/agEYM0aA9zUFuBJ+kFN+zsAPyhB5KbA4pJ+EfBj4D+BjwIXd1H/fsAHy/fvUY0cNmT7UUlbSno1sCNwOXAgVYD4P8CbgT2AWZKgCraXS9oSeDtwVUkH2Kym6i8Cd9qe2Ew/IiIiov/rMwGipDdSBYOPU72L+BjV6N9GwKrObqMaGfurk0ckHQi8F7hE0jm2L+2Bbn4LOMf2TyQdDJwOYHuppMckvRPYl5dHE3vaL4EJwANUI4ofpQo4/4nqfOVFtvervUHSVsDTZTS1nruBvSVta/uP66jfERERsQHpEwFieV/v28C5ti1pCPCw7ZcknUA1GgbwDPDqmltnAqdImm17taRdgGXAa8r9F0jaDNgLaDZAvBP4hqTtgD8BHwbml7whpX6AEzrcdyHVVPP3Ok7TdvBL4Ciq0cNjqQK9Zt0K/Hv53AO8g2qxzwpJDwBDJe1n+1dl9HQX24skLZb0YdtXqRpGfKvttme6nup3vE7SeNvPdNb4qOFDaM2eZxEREf1eb76D+Kq2bW6AnwM3UL37B9U7cidImg/sCjxb0hcAa8q2OJ+hCsruA+ZKuhc4nyroPRiYL+keqncYv9Fsp2wvpxoZ/BVwO3B/TfbpVFO1c4AnO9z6E2BLup5eBjgNmCBpAXAc8Olm+0YVIO4I3FKC0KVU70Vi+8/AkcBZ5XebRzW1DFUg+rGSvgj4QG2ltq8CLgB+Um+BTERERAwsst3bfegXJLUA02yvlz0Me0NLS4tbW1t7uxsRERHRAyTNsd1SL69PTDFv6CRNAU5h3b17GBEREbHeDJgAUdKdtF+9C9V07dIOacfZXtidum2fSbVHY217/0r1/mKtq2yfQQOd9LXb/YqIiIhYGwMmQLQ9Zj23dwYv70PY3XvXa18jIiIiavWZjbIjIiIiom9IgBgRERER7QyYKeZ45RYuW8GIKdf1djciog9Zkr1RI/qljCBGRERERDsJEBuQtGM5iWTbcr1NuV4laVRNucmSzu/BdneStFLS52rS3iPpAUm/LVvr1LvvYEnX9lQ/IiIiYuBJgNiA7aXAeby8jc2ZwAzgcGC6KsOBk4G6QdtaOgf4WduFpEHAfwGHAbsBR0varQfbi4iIiAASIDZrGjBW0iRgHHC27euB5cDxJf9020/Vu1nSEZJuLMHkMEkPSnpdZ41JOhxYTHUsXpt9gd/a/n05Vu9KypF5ZWTx15LmAh+sqWcLSRdJukvSPZLayg+W9ENJ90m6RtKd5SSYen2ZKKlVUuua51Y092tFRETEBi2LVJpge7WkycD1wHjbq0vWJOAu4De2v9fF/ddI+hBwKvAe4Mu2H61XVtKWwOeBQ4HP1WQNp/2m3g8DYyRtTnWO8juB3wI/qCnzr8Bs2x+VtDVwl6SfU5368pTt3STtQXVuc2d9n0E1Yspmw0bmXMaIiIgBICOIzTuMasRwj7YE248As6mmoBs5DfgX4AXbV3RR7nSqM51XNtmvXYHFtn/j6mDt79fkjQemSJoH3ARsDuxENQp6ZXmGe4EFTbYVERERA0BGEJsgaTTViN5Y4DZJV9peXrJfKp9Gdijltpe0ke3O7hkDHCnp68DWwEuSVgFzqI4GrK1vWaOuAx+y/UCH52miuxERETFQJUBsQFU0dR4wyfZDkqYCZwPHdqOOjYGLgKOBE4DPljr+iu0Dau47HVhp+9xSx0hJO1MFhkcBxwC/A0ZIepPt35U22swETpN0mm1Lepvte4Dbgb8HflEWuoyiCaOGD6E1e55FRET0e5libuwk4CHbs8r1dOAtkg7qRh1fAG61fRtVcPiPkt7SnU7YfhH4JFXQdz/wQ9uLbK8CJgLXlUUqj9fc9lVgE2CBpEXluu0Zhkq6D/ga1WKYrECJiIgIAFS9thYDSdkyZxPbqyS9Cfg58OayOrpTLS0tbm1tXS99jIiIiHVL0hzbdXcxyRTzwDSYanp5E6r3FD/RKDiMiIiIgSMBYg8qJ6t03O7mBdtj6pR9N3BWh+TFto9YV/1rY/sZoO7/MUREREQkQOxBthcCo5ssO5PqfcKIiIiIPiWLVCIiIiKinQSIEREREdFOppijaQuXrWDElOt6uxsR0Ycsyd6oEf1SRhAbkLSjpMWSti3X25TrVWVRSlu5yZLO74H2DpU0R9LC8vedNXl7l/TfSvqm6hyJImmEpHtfaT8iIiJi4EqA2IDtpVQnqZxZks4EZgCHA9NVGQ6cDEzpgSafBN5vexTVqSu1q6LPo9q4e2T5vKcH2ouIiIhoJwFic6YBYyVNAsYBZ9u+HlgOHF/yT7f9VL2bJV0q6fCa68skfaBeWdv32H6kXC4CXiVpM0nDgK1s3+Fqd/NLqYLUtpHF+ZLmA6fWtDNI0lRJd0taIOnjJX0jSdMl/VrSLEk/lXTk2v88ERER0Z8kQGyC7dXAZKpAcFK5BpgEnAEMtd1x/8Na3wFOBJA0BHg70MzLfB8C5tp+ARgOPFyT93BJA7gYOM32nh3u/xiwwvY+wD7ASeUs5w8CI4DdgOOA/TrrgKSJklolta55LqfxRUREDAQJEJt3GNWI4R5tCWWkbzbV1G+nbN8MjJQ0FDgauLqcrdwpSbtTbaT98Qbltga2tn1LSaoNVMcDx0uaB9wJbEc1NT0OuMr2S7YfBX7RRd9n2G6x3TJo8JCuuhIRERH9RFYxN0HSaOBQYCxwm6QrbS8v2S+VTyOXAh8BjgImNGhvB+Aa4HjbvyvJy4AdaortUNK6rIpqZLHdhtyS/raJ/kZERMQAlRHEBspK4fOoppYfAqYCZ69FVZdQTUlj+74u2tuaavp5iu3b29JLQPonSWNLn44Hfmz7aeBpSeNK0WNrqpsJnFLOXEbSLpK2AG4HPlTeRdweOHgtniciIiL6qYwgNnYS8JDtWeV6OjBB0kFl6rgpth+TdD/wowZFPwn8DfAlSV8qaeNtPw58girQfBXws/KBakTyIkkGbqip60Kqdw3nlqDyCaqFLVcD7wLuA5YCc4GGLxiOGj6E1ux5FhER0e+pWhAb65qkwcBCYC/bvb7aQ9KWtldK2g64C9i/vI/YqZaWFre2tq6fDkZERMQ6JWmO7ZZ6eRlBXA8kHUK1knlaXwgOi2vLdPamwFcbBYcRERExcCRA7EHlZJWO2928YHsM8IYOZd9NtUq51mLbR6zDLv6F7YPXRzsRERGx4UmA2INsLwRGN1l2JtUikoiIiIg+JauYIyIiIqKdBIgRERER0U4CxIiIiIhoJ+8gRtMWLlvBiCnNHCEdEf3dkuyJGtGvZQSxAUk7SlosadtyvU25XlVWLbeVmyzp/B5obztJv5C0UtK5HfL2lrRQ0m8lfbNsft3x/hGS7n2l/YiIiIiBKwFiA7aXUh21d2ZJOhOYQXUiyXRVhgMnA1N6oMlVwBeBz9XJO4/qZJeR5fOeHmgvIiIiop0EiM2ZBoyVNAkYB5xt+3pgOdWZyNOA020/Ve9mSUdIurEEk8MkPSjpdfXK2n7W9m1UgWJtHcOArWzf4er4m0upgtS2kcX5kuYDp9bcM0jSVEl3S1og6eMlfSNJ0yX9WtIsST+VdOQr+YEiIiKi/8g7iE2wvVrSZOB6qnORV5esSVTH1P3GdscNsmvvv0bSh6iCt/cAX16Lk0uGAw/XXD9c0gAuBj5p+xZJU2vKfAxYYXsfSZsBt0u6Adib6ozm3YDXAvcDF9VrVNJEYCLAoK2GdrPLERERsSHKCGLzDqMaMdyjLcH2I8BsqqnfRk4D/oXqZJUreqpT5bi8rW3fUpJqA9XxwPGS5gF3AttRTU2PA66y/VIJVH/RWf22Z9husd0yaPCQnup2RERE9GEZQWyCpNHAocBY4DZJV9peXrJfKp9Gdijltpe0ke1m7qm1rNRRW9+yBvcIOK2c2vJyovS33Ww7IiIiBpCMIDZQVgqfB0yy/RAwFTi7m3VsTDWFezTVdO5nu9uPEpD+SdLY0qfjgR/bfhp4WtK4UvTYmttmAqdI2qT0YxdJWwC3Ax8q7yJuDxzc3f5ERERE/5URxMZOAh6yPatcTwcmSDrI9s1N1vEF4Fbbt5WFJHdLus72/fUKS1oCbAVsKulwqvce7wM+AVwCvAr4WfkATAAukmTghpqqLqR613BuCSqfoFrYcjXwLuA+YCkwF1jR6CFGDR9Ca/Y+i4iI6PdULYiNgUbSlrZXStqOaqHN/o0WzrS0tLi1tXX9dDAiIiLWKUlzbLfUy8sI4sB1bVngsinw1bVYVR0RERH9VALEHlROVum43c0LtsfUKftu4KwOyYttH7Gu+lfL9sHro52IiIjY8CRA7EG2FwKjmyw7k2oRSURERESfklXMEREREdFOAsSIiIiIaCdTzNG0hctWMGLKdb3djYhYx5ZkO6uIAS8jiBERERHRTsMAUdIaSfMkLZI0X9I/SeryPkkjJB3Tc91sTNKJks5dD+0MlXSnpHskHbCu2yttXiLpyPXRVkREREQzI4jP2x5te3eq84gPA77c4J4RwHoNENejdwELbb/N9q293ZmIiIiIntatKWbbjwMTgU+qMkLSrZLmls/bS9EzgQPKyONnJA2SNFXS3ZIWSPo4gKRhkm4p5e7t7oicpAmSHpR0F7B/Tfr7a0b5fi5p+3Lu8G8kDS1lNpL027brOnWPkDS79PdGSTtJGg18HfhA6fOr6tz3YUnnlO+flvT78v2Nkm4v3/eWdLOkOZJmShpW0t8k6fqSfqukXevU/9Uyojiok37vI+mXZbT3LkmvlrS5pIslLSy/yTtK2d1LmXnlOUfWqW+ipFZJrWuea3gaX0RERPQD3X4H0fbvgUHAa4HHgUNt7wX8A/DNUmwK1dnDo21PAz4GrLC9D7APcJKknalGGWfaHg3sCcxrth8lqPoKVWA4DtitJvs2YKzttwFXAv9s+yXg+8CxpcwhwHzbT3TSxLeA79p+K3AZ8E3b84AvAT8oz/Z8nftuBdoC3QOAP0gaXr7fImmTUveRtvcGLgLOKOVnAKeV9M9Rnftc+8xTgaHABNtr6vwmmwI/AD5te8/yjM8DpwK2PQo4GviupM2Bk4FvlN+/BXi4Y522Z9husd0yaPCQTn6qiIiI6E9e6SrmTYBzy8jaGmCXTsqNB95a8x7dEGAkcDdwUQmaflQCsGaNAW5qC/Ak/aCm/R2AH5QgclNgcUm/CPgx8J/AR4GLu6h/P+CD5fv3qEYOG7L9qKQtJb0a2BG4HDiQKkD8H+DNwB7ALElQBdvLJW0JvB24qqQDbFZT9ReBO21P7KL5NwPLbd9d+vInAEnjqIJSbP9a0v9R/Va/Av5V0g7A/9j+TTPPGBEREf1bt0cQJb2RKhh8HPgM8BjV6F8LVTBW9zaqkbHR5bOz7Rts30IVPC0DLpF0/No8RB3fAs4tI2YfBzYHsL0UeEzSO4F9gZ/1UHsd/RKYADzAyyOK+wG3U/0Wi2p+i1G2x1P9Wzxdkz7a9ltq6rwb2FvStj3VSduXA39HNcr40/K7RERExADXrRHE8r7et6mCL0saAjxs+yVJJ1CNhgE8A7y65taZwCmSZtteLWkXqqDwNeX+CyRtBuwFXNpkd+4EviFpO+BPwIeB+SVvSKkf4IQO911INdX8vXrTtDV+CRxFNXp4LFWg16xbgX8vn3uAd1At9lkh6QFgqKT9bP+qjJ7uYnuRpMWSPmz7KlXDiG+13fZM11P9jtdJGm/7mTrtPgAMk7SP7bvLKObzpT/HArPLb78T8EAJ9n9v+5uSdgLeCszu7KFGDR9Ca/ZHi4iI6PeaGUF8VVnEsAj4OXAD1bt/UL0jd4Kk+cCuwLMlfQGwpiyU+AxVUHYfMFfSvcD5VMHpwcB8SfdQvcP4jWY7bns5cDrVNOntwP012adTTdXOAZ7scOtPgC3penoZ4DRggqQFwHHAp5vtG1VAtiNwSwlCl1K9F4ntPwNHAmeV320e1dQyVEHcx0r6IuADtZXavgq4APhJvQUype5/AL5V6phFNXo6HdhI0kKqdxRPtP0C8PfAvZLmUU17NxucR0RERD8m273dh/VKUgswzfZ62cOwP2lpaXFra2tvdyMiIiJ6gKQ5tlvq5Q2oo/YkTQFO4eWVzBERERHRQZ8LECXdSfvVu1BN1y7tkHac7YXdqdv2mVR7NNa2969U7y/Wusr2GTTQSV+73a+1IekaYOcOyZ+3PXNdtx0RERH924CbYo61lynmiIiI/qOrKeZub3MTEREREf1bAsSIiIiIaKfPvYMYfdfCZSsYMeW63u5GRKwDS7LHaUTUyAhiRERERLSTALEBSTuWE062LdfblOtVkkbVlJss6fwebHcnSSslfa4m7T2SHpD027JlT737DpZ0bU/1IyIiIgaeBIgNlPObz+Pl7XHOBGYAhwPTVRkOnAzUDdrW0jnUnBUtaRDwX8BhwG7A0ZJ268H2IiIiIoAEiM2aBoyVNAkYB5xt+3pgOXB8yT/d9lP1bpZ0qaTDa64vk/SBemVL/uHAYqrj9trsC/zW9u/LkXpXUo7iKyOLv5Y0F/hgTT1bSLpI0l2S7mlrU9JgST+UdJ+kayTdWU6YqdeXiZJaJbWueW5Fg58pIiIi+oMEiE2wvRqYTBUITirXAJOAM4Chtr/XRRXfAU4EkDSE6uzluqs9JG0JfJ6Xz7tuM5z2m4U/DAyXtDnV+czvB/YGXldT5l+B2bb3Bd4BTJW0BfAJ4CnbuwFfLPd19uwzbLfYbhk0eEgXjxgRERH9RQLE5h1GNWK4R1uC7UeA2VRT0J2yfTMwUtJQ4GjgatsvdlL8dKqzolc22a9dgcW2f+Nq1/Pv1+SNB6ZImgfcBGwO7EQ1Cnpl6du9wIIm24qIiIgBINvcNEHSaOBQYCxwm6QrbS8v2S+VTyOXAh8BjgImdFFuDHCkpK8DWwMvSVoFzKE6crDNDsCyRl0HPmT7gQ7P00R3IyIiYqBKgNiAqmjqPKqp5YckTQXOBo7tZlWXAHcBj9q+r7NCtg+oaft0YKXtcyVtTDUKuTNVYHgUcAzwO2CEpDfZ/h3VCGWbmcBpkk6zbUlvs30PcDvw98AvykKXUTRh1PAhtGavtIiIiH4vU8yNnQQ8ZHtWuZ4OvEXSQd2pxPZjwP3AxWvTiTIl/UmqoO9+4Ie2F9leBUwEriuLVB6vue2rwCbAAkmLynXbMwyVdB/wNarFMFmBEhEREQCoem0t1jVJg4GFwF62ezUYK1vmbGJ7laQ3AT8H3lxWR3eqpaXFra2t66WPERERsW5JmmO77i4mmWJeDyQdQrWSeVpvB4fFYKrp5U2o3lP8RKPgMCIiIgaOBIg9qJys0nG7mxdsjwHe0KHsu4GzOpRdbPuIddhFAGw/A9T9P4aIiIiIBIg9yPZCYHSTZWdSvU8YERER0adkkUpEREREtJMAMSIiIiLayRRzNG3hshWMmFL3hMCI2MAsyZ6mEdGFjCBGRERERDsJEBuQtKOkxZK2LdfblOtVZdVyW7nJks7vgfa2k/QLSSslndsh7yZJD0iaVz6v7aSOZs9xjoiIiPgrmWJuwPZSSecBZ1KdWHImMAO4B5gu6UDg9cDJ9MzWMauALwJ7lE9Hx9rObtURERGxzmQEsTnTgLGSJgHjgLNtXw8sB44v+afbfqrezZIulXR4zfVlkj5Qr6ztZ23fRhUoNkXSzpJ+JWmhpK91yJss6W5JCyR9pSb9i2U08jZJV0j6XCd1T5TUKql1zXN9YY/viIiIWNcSIDbB9mpgMlUgOKlcA0wCzgCG2u64QXat7wAnAkgaArwdWNvVHheX6eUvSlJJ+wZwnu1RVEErpa3xwEhgX6r9GfeWdKCkfYAPAXsCh9HFyKftGbZbbLcMGjxkLbscERERG5IEiM07jCr4+su0r+1HgNnAeV3daPtmYKSkocDRwNW2X1yLPhxbgsADyue4kr4/cEX5Xhuoji+fe4C5wK5UAeP+wI9tryqnqvzvWvQlIiIi+qkEiE2QNBo4FBgLfEbSsJrsl8qnkUuBjwATgIvWph+2l5W/zwCXU40M/iW7zi0C/sP26PL5G9vfWZu2IyIiYuDIIpUGyjTueVRTyw9JmgqcDRzbzaouAe4CHrV931r0Y2Nga9tPStoEeB/w85J9O3AU8P0O/ZoJfFXSZbZXShoOrC7lz5f0H1T/DbyPauFNl0YNH0Jr9k6LiIjo9xIgNnYS8JDtWeV6OjBB0kFl6rgpth+TdD/wo0ZlJS0BtgI2LYtbxgP/B8wsweEgquDwgnLLp4HLJX0e+HFNmzdIegvwq/K64krgI7bvlvQTYAHwGLAQyAqUiIiIAEB2vZnJ6GmSBlMFYnvZ7vVgTNKWZVRxMHALMNH23K7uaWlpcWtrdtiJiIjoDyTNsV13oWreQVwPJB0C3A98qy8Eh8UMSfOoFq9c3Sg4jIiIiIEjU8w9qJys0nG7mxdsjwHe0KHsu4GzOpRdbPuIddjFv7B9zPpoJyIiIjY8CRB7kO2FVPsNNlN2JtUikoiIiIg+JVPMEREREdFOAsSIiIiIaCdTzNG0hctWMGLK2p4QGBHr0pLsURoRPSgjiA1I2lHSYknbluttyvWqsiilrdxkSef3QHuHSpojaWH5+86avJskPVDOYp4n6bWd1LHylfYjIiIiBq6MIDZge6mk84AzgYnl7wyq842nSzoQeD1wMlB3L6FuehJ4v+1HJO1BtZBleE3+sbazGWFERESsMxlBbM40YKykScA44Gzb1wPLgeNL/um2n6p3s6RLy4kobdeXSfpAvbK277H9SLlcBLxK0mZddU7SzpJ+VUYdv9Yhb7KkuyUtkPSVmvQvltHI2yRdIelzDX6DiIiIGCASIDbB9mpgMlUgOKlcA0wCzgCG2u64/2Gt7wAnAkgaArwdaOZlvg8Bc22/UJN2cZle/mI5JxrgG8B5tkdRBa2UtsYDI4F9qbbf2VvSgZL2KXXvCRxGFyOfkiZKapXUuua5vrLHd0RERKxLCRCbdxhV8LVHW0IZ6ZsNnNfVjeXM5pGShgJHU51c8mJX90janWoj7Y/XJB9bgsADyue4kr4/cEX5Xhuoji+fe6hOTNmVKmDcH/ix7VW2nwH+t4u+z7DdYrtl0OAhXXU5IiIi+okEiE2QNBo4FBgLfEbSsJrsl8qnkUuBjwATgIsatLcDcA1wvO3ftaXbXlb+PgNcTjUy+JfselUB/2F7dPn8je3vNNHXiIiIGMASIDZQpnHPo5pafgiYCpy9FlVdQjUlje37umhva6rp5ym2b69J31jSa8r3TYD3AfeW7NuBo8r3Y2uqmwl8VNKW5b7hZeXz7cD7JW1e8t63Fs8TERER/VRWMTd2EvCQ7VnlejowQdJBZeq4KbYfk3Q/8KMGRT8J/A3wJUlfKmnjgWeBmSU4HAT8HLig5H8auFzS54Ef17R5g6S3AL8qryuuBD5i+25JPwEWAI8BC4GGLxiOGj6E1uy1FhER0e/JrjczGT1N0mCqQGwv272+2kPSlrZXln7dAky0Pbere1paWtzamh12IiIi+gNJc2zXXaiaKeb1QNIhwP3At/pCcFjMkDSPavHK1Y2Cw4iIiBg4MsXcg8rJKh23u3nB9hjgDR3KvptqlXKtxbaPWIdd/Avbx6yPdiIiImLDkwCxB9leSLXfYDNlZ1ItIomIiIjoUzLFHBERERHtJECMiIiIiHYSIEZEREREO3kHMZq2cNkKRkxp5gjpiFjXlmRP0ohYhzKC2ICkHSUtlrRtud6mXK8qq5bbyk2WdH4PtLevpHnlM1/SETV575H0gKTfSprSyf0HS7r2lfYjIiIiBq4EiA3YXkp11N6ZJelMYAZwODBdleHAyUDdoK2b7gVabI8G3gOcX47ZGwT8F3AYsBtwtKTdeqC9iIiIiHYSIDZnGjBW0iRgHHC27euB5cDxJf9020/Vu1nSEZJuLMHkMEkPSnpdvbK2n7P9YrncHGg76mZf4Le2f2/7z8CVwAdK/e+R9GtJc4EP1rS7haSLJN0l6R5JbeUHS/qhpPskXSPpTkl1d1KPiIiIgSfvIDbB9mpJk4HrgfG2V5esScBdwG9sd9wgu/b+ayR9CDiValTwy7Yf7ay8pDHARVSbax9n+8UySrm0ptjDwBhJm1OdyfxO4LfAD2rK/Csw2/ZHJW0N3CXp58ApwFO2d5O0BzCvi75MBCYCDNpqaGfFIiIioh/JCGLzDqMaMdyjLcH2I8BsqinoRk4D/oXqZJUruipo+07buwP7AP9SgsDO7Ep1AstvXB2s/f2avPHAlHKk3k1UI5I7UY2CXlnauhdY0EVfZthusd0yaPCQBo8YERER/UFGEJsgaTRwKDAWuE3SlbaXl+yXyqeRHUq57SVtZLvhPbbvl7SSKihdBuzYob5ljboOfMj2Ax2ep4nuRkRExECVALEBVdHUecAk2w9JmgqcDRzbjTo2ppoyPho4AfhsqaNe2Z2BpWVa+Q1UI4RLgKeBkSV/GXAUcAzwO2CEpDfZ/l1po81M4DRJp9m2pLfZvge4Hfh74BdlocsomjBq+BBas7VGREREv5cp5sZOAh6yPatcTwfeIumgbtTxBeBW27dRBYf/KOktnZQdB8wv08LXAJ+w/WRZuPJJqqDvfuCHthfZXkX1juB1ZZHK4zV1fRXYBFggaVG5bnuGoZLuA74GLAJWdON5IiIioh9T9dpaDCRly5xNbK+S9Cbg58Cby+roTrW0tLi1tXW99DEiIiLWLUlzbNfdxSRTzAPTYKrp5U2o3lP8RKPgMCIiIgaOBIg9qJys0nG7mxdsj6lT9t3AWR2SF9s+omPZnmb7GSD7HkZERERdCRB7kO2FwOgmy86kep8wIiIiok/JIpWIiIiIaCcBYkRERES0kynmaNrCZSsYMeW63u5GRABLsidpRKxDGUGMiIiIiHYSIDYgaUdJiyVtW663KderyqrltnKTJZ3fA+3tK2le+cyXdERN3hJJC0te3Q0JJY2QdO8r7UdEREQMXJlibsD2UknnAWdSnVhyJjADuAeYLulA4PXAyfTM1jH3Ai3lqL1hVKeq/G85SQXgHbaf7IF2IiIiIurKCGJzpgFjJU2iOgrvbNvXA8uB40v+6bafqnezpEslHV5zfZmkD9Qra/u5mmBwc6DhUTeS9i6jjfOBU2vSB0maKuluSQskfbykbyRpuqRfS5ol6aeSjuyk7omSWiW1rnkup/FFREQMBAkQm2B7NTCZKhCcVK4BJgFnAENtd9wgu9Z3gBMBJA0B3g50utpD0phydvJC4OSagNHADZLmSJpYc8vFwGm29+xQ1ceAFbb3AfYBTpK0M/BBYASwG3AcsF8Xzz7DdovtlkGDh3TxiBEREdFfJEBs3mFUI4Z7tCXYfgSYDZzX1Y22bwZGShoKHA1cXRP01St/p+3dqYK6f5G0eckaZ3uv0pdTJR0oaWtga9u3lDK1gep44HhJ84A7ge2AkVSjoFfZfsn2o8AvmvkBIiIiYmBIgNgESaOBQ4GxwGfKu4FtXiqfRi4FPgJMAC5qpl3b9wMrKUGp7WXl7+PANcC+jbpONbI4unx2tn1DM21HRETEwJVFKg1IEtUI4STbD0maCpwNHNvNqi4B7gIetX1fF+3tDCwti1TeAOwKLJG0BbCR7WfK9/HAv9t+WtLTksbZvq1Dv2YCp0iabXu1pF2AZcDtwAmSvgsMBQ4GLm/0AKOGD6E1e69FRET0ewkQGzsJeMj2rHI9HZgg6aAyddwU249Juh/4UYOi44ApklZTjUx+wvaTkt4IXFPFq2wMXF4WykAZlZRkoHaE8EKqdw3nlkD3CeBw4GrgXcB9wFJgLpAVKBEREQGA7IaLZKMHSBpMtehkL9u9HoxJ2tL2SknbUY1s7l/eR+xUS0uLW1vrbr8YERERGxhJc2zX3aIvI4jrgaRDqFYyT+sLwWFxbVngsinw1UbBYURERAwcCRB7UDlZpeN2Ny/YHgO8oUPZdwNndSi72PYRrAe2D14f7URERMSGJwFiD7K9EBjdZNmZVItIIiIiIvqUbHMTEREREe0kQIyIiIiIdjLFHE1buGwFI6Z0ekJgRKwHS7IXaUSsBxlBjIiIiIh2EiA2IGlHSYslbVuutynXq8qq5bZykyWd3wPt7StpXvnMl3RETd57JD0g6beSpnRy/8GSrn2l/YiIiIiBKwFiA7aXUh21d2ZJOhOYQXUiyXRVhgMnA3WDtm66F2ixPRp4D3C+pI0lDQL+CzgM2A04WtJuPdBeRERERDsJEJszDRgraRLVUXhnl2PulgPHl/zTbT9V72ZJl0o6vOb6MkkfqFfW9nO2XyyXmwNtR93sC/zW9u9t/xm4EvhAqe89kn4taS7wwZp2tpB0kaS7JN3T1qakwZJ+KOk+SddIulNS3Z3UJU2U1Cqpdc1zfWWP74iIiFiXEiA2wfZqYDJVIDipXANMAs4AhtruuEF2re8AJwJIGgK8Heh0tYekMZIWUR3Nd3IJGIdTnZvc5mFguKTNgQuA9wN7A6+rKfOvwGzb+wLvAKZK2gL4BPCU7d2AL5b7Onv2GbZbbLcMGjyki0eMiIiI/iIBYvMOoxox3KMtwfYjwGyqKehO2b4ZGClpKHA0cHXNKGG98nfa3h3YB/iXEgR2ZleqE1h+4+pg7e/X5I0HpkiaB9xENSK5E9Uo6JWlrXuBBV31PyIiIgaWbHPTBEmjgUOBscBtkq60vbxkv1Q+jVwKfAQ4CpjQTLu275e0kiooXQbsWJO9Q0nrsuvAh2w/0C5Raqb5iIiIGKASIDagKpo6j2pq+SFJU4GzgWO7WdUlwF3Ao7bv66K9nYGltl+U9AaqEcIlwNNUo5A7UwWGRwHHAL8DRkh6k+3fUY1QtpkJnCbpNNuW9Dbb9wC3A38P/KIsdBlFE0YNH0Jr9mCLiIjo9zLF3NhJwEO2Z5Xr6cBbJB3UnUpsPwbcD1zcoOg4YH6ZFr4G+ITtJ8uU9Cepgr77gR/aXmR7FTARuK4sUnm8pq6vApsAC8o7jV+teYahku4DvgYsArICJSIiIgBQ9dparGuSBlMtOtnLdq8GY2XLnE1sr5L0JuDnwJvL6uhOtbS0uLW1db30MSIiItYtSXNs193FJFPM64GkQ6hWMk/r7eCwGEw1vbwJ1XuKn2gUHEZERMTAkQCxB5WTVTpud/OC7THAGzqUfTdwVoeyi20fwTpm+xmg7v8xRERERCRA7EG2FwKjmyw7k+p9woiIiIg+JYtUIiIiIqKdBIgRERER0U6mmKNpC5etYMSUTk8IjIh1bEn2IY2I9SQjiA1I2lHSYknbluttyvWqsiilrdxkSef3QHvbSfqFpJWSzu2Qd5OkByTNK5/XdlLHylfaj4iIiBi4MoLYgO2lks4DzqTakPpMYAZwDzBd0oHA64GT6ZmVwauAL1Idr7dHnfxjbWczwoiIiFhnMoLYnGnAWEmTqE46Odv29cBy4PiSf7rtp+rdLOkISTeqMkzSg5JeV6+s7Wdt30YVKDZF0s6SfiVpoaSvdcibLOluSQskfaUm/YtlNPI2SVdI+lyz7UVERET/lhHEJtheLWkycD0w3vbqkjWJ6nzl39juuP9h7f3XSPoQcCrwHuDLth9dy+5cLGkNcDXwNVdH4XwDOM/2pZJObSsoaTwwEtiXakPsn5QRz+eBDwF7Uh3FNxeYU68xSROpRk4ZtNXQtexyREREbEgygti8w6hGDP8y7Wv7EWA2cF4T958G/AvVxtlXrGUfjrU9CjigfI4r6fsDbXXWBqrjy+ceqiBwV6qAcX/gx7ZXlU2z/7ezBm3PsN1iu2XQ4CFr2e2IiIjYkCRAbIKk0cChwFjgM5KG1WS/VD6N7FDKbS9prX5328vK32eAy6lGBv+SXecWAf9he3T5/I3t76xN2xERETFwJEBsQJKoRggn2X4ImAqc3c06NgYuAo4G7gc+uxb92FjSa8r3TYD3AfeW7NuBo8r3Y2tumwl8VNKW5b7hZeXz7cD7JW1e8t7X3f5ERERE/5V3EBs7CXjI9qxyPR2YIOkg2zc3WccXgFtt3yZpPnC3pOts31+vsKQlwFbAppIOp5om/j9gZgkOBwE/By4ot3wauFzS54Eft9Vj+wZJbwF+VcW5rAQ+YvtuST8BFgCPAQuBFY0eYtTwIbRmH7aIiIh+T9UahxhoJG1pe6WkwcAtwETbc7u6p6Wlxa2t2WEnIiKiP5A0x3bdLfoygjhwzZC0G7A58N1GwWFEREQMHAkQe1A5WaXjdjcv2B5Tp+y7gbM6JC+2fcS66l8t28esj3YiIiJiw5MAsQfZXgiMbrLsTKpFJBERERF9SlYxR0REREQ7CRAjIiIiop0EiBERERHRTt5BjKYtXLaCEVOu6+1uRPRbS7LPaET0ERlBbEDSjpIWS9q2XG9TrleVVctt5SZLOr8H2jtU0hxJC8vfd9bk3STpAUnzyue1ndSx8pX2IyIiIgaujCA2YHuppPOAM4GJ5e8M4B5guqQDgdcDJwN1N5vspieB99t+RNIeVCudh9fkH2s7u1VHRETEOpMRxOZMA8ZKmgSMA862fT2wHDi+5J9u+6l6N0s6QtKNqgyT9KCk19Ura/se24+Uy0XAqyRt1lXnJO0s6Vdl1PFrHfImS7pb0gJJX6lJ/2IZjbxN0hWSPtfcTxERERH9XUYQm2B7taTJwPXAeNurS9Yk4C7gN7Y7bpBde/81kj4EnAq8B/iy7UebaPpDwFzbL9SkXSxpDXA18DVXZyV+AzjP9qWSTm0rKGk8MBLYFxDwkzLi+Xype09gE2AuMKdeByRNpBo5ZdBWQ5vockRERGzoMoLYvMOoRgz3aEsoI32zgfOauP804F+oTla5olFhSbtTnbTy8ZrkY22PAg4on+NK+v5AW521ger48rmHKgjclSpg3B/4se1Vtp8B/rezftieYbvFdsugwUMaP2VERERs8BIgNkHSaOBQYCzwGUnDarJfKp9GdijltpfU5e8uaQfgGuB4279rS7e9rPx9BricamTwL9n1qgL+w/bo8vkb299poq8RERExgCVAbECSqEYIJ9l+CJgKnN3NOjYGLgKOBu4HPttF2a2B64Aptm+vrUPSa8r3TYD3AfeW7NuBo8r3Y2uqmwl8VNKW5b7hZeXz7cD7JW1e8t7XneeJiIiI/i3vIDZ2EvCQ7VnlejowQdJBtm9uso4vALfavk3SfOBuSdfZvr9O2U8CfwN8SdKXStp44FlgZgkOBwE/By4o+Z8GLpf0eeDHbRXZvkHSW4BfVXEuK4GP2L5b0k+ABcBjwEJgRaOHGDV8CK3Zpy0iIqLfU7XGIQYaSVvaXilpMHALMNH23K7uaWlpcWtrdtiJiIjoDyTNsV13i76MIA5cMyTtBmwOfLdRcBgREREDRwLEHlROVum43c0LtsfUKftuqlXKtRbbPmJd9a+W7WPWRzsRERGx4UmA2INsLwRGN1l2JtUikoiIiIg+JauYIyIiIqKdBIgRERER0U6mmKNpC5etYMSU63q7GxEbrCXZJioiNhAZQYyIiIiIdhIgNiBpR0mLJW1brrcp16vKquW2cpMlnd8D7e0raV75zJd0RE3eEkkLS17dDQkljZB0b728iIiIiGZkirkB20slnQecCUwsf2cA9wDTJR0IvB44Gai72WQ33Qu02H6xnPk8X9L/2n6x5L/D9pM90E5EREREXRlBbM40YKykScA44Gzb1wPLgeNL/um2n6p3s6QjJN2oyjBJD0p6Xb2ytp+rCQY3BxoedSNp7zLaOB84tSZ9kKSpku6WtEDSx0v6RpKmS/q1pFmSfirpyE7qniipVVLrmucansYXERER/UACxCbYXg1MpgoEJ5VrgEnAGcBQ2x03yK69/xqqYPJUqvOTv2z70c7KSxojaRHVGckn1wSMBm6QNEfSxJpbLgZOs71nh6o+BqywvQ+wD3CSpJ2BDwIjgN2A44D9uuj7DNsttlsGDR7SWbGIiIjoRzLF3LzDqIK8PYBZALYfkTQbuLaJ+0+jmj6+w/YVXRW0fSewu6S3AN+V9DPbq4BxtpdJei0wS9KvgQXA1rZvKbd/r/QVYDzw1prRwSHASKpR0KtsvwQ8KukXzfwAERERMTBkBLEJkkYDhwJjgc+UdwPbvFQ+jexQym0vqanf3fb9wEqqoBTby8rfx4FrgH0bdZ1qZHF0+exs+4Zm2o6IiIiBKyOIDUgScB7V1PJDkqYCZwPHdqOOjYGLgKOBE4DPljrqld0ZWFoWqbwB2BVYImkLYCPbz5Tv44F/t/20pKcljbN9W4d+zQROkTTb9mpJuwDLgNuBEyR9FxgKHAxc3ug5Rg0fQmv2cYuIiOj3EiA2dhLwkO1Z5Xo6MEHSQbZvbrKOLwC32r6tLCS5W9J1ZYSwo3HAFEmrqUYcP2H7SUlvBK6p4lU2Bi4vC2UAJgAXSTJQO0J4IdW7hnNLoPsEcDhwNfAu4D5gKTAXyAqUiIiIAEB2w0Wy0Q9J2tL2SknbAXcB+3e1cAagpaXFra11t1+MiIiIDYykObbrbtGXEcSB61pJWwObAl9tFBxGRETEwJEAsQeVk1U6bnfzgu0xdcq+GzirQ/Ji20d0LLsu2D54fbQTERERG54EiD3I9kJgdJNlZ1ItIomIiIjoU7LNTURERES0kwAxIiIiItrJFHM0beGyFYyYcl1vdyOiT1uSvUIjoh/ICGJEREREtNN0gChpjaR5khZJmi/pnxodGSdphKRjXnk3myfpREnnrod2hkq6U9I9kg5Y1+2VNi+pOVd5be4/WdLxPdmniIiI6H+6M8X8vO3RAJJeS3U021bAl7u4ZwRwDE0c47YBehew0PY/9nZHmmX7273dh4iIiOj71mqK2fbjwETgk6qMkHSrpLnl8/ZS9EzggDLy+BlJgyRNlXS3pAWSPg4gaZikW0q5e7s7IidpgqQHJd0F7F+T/v6aUb6fS9pe0kaSfiNpaCmzkaTftl3XqXuEpNmlvzdK2knSaODrwAdKn19V574PSzqnfP+0pN+X72+UdHv5vrekmyXNkTRT0rCS/iZJ15f0WyXtWqf+r5YRxUGd9PtMSfeVfp9d0k6X9Lny/SZJZ0m6q/x2dX9zSRMltUpqXfNcTuOLiIgYCNb6HUTbvwcGAa8FHgcOtb0X8A/AN0uxKVRnEI+2PQ34GLDC9j7APsBJknamGmWcWUYo9wTmNduPElR9hSowHAfsVpN9GzDW9tuAK4F/tv0S8H3g2FLmEGC+7Sc6aeJbwHdtvxW4DPim7XnAl4AflGd7vs59twJtQdcBwB8kDS/fb5G0San7SNt7AxcBZ5TyM4DTSvrnqM5/rn3mqcBQYILtNXV+k+2AI4DdS7+/1smzbWx7X2ASnYwE255hu8V2y6DBQzqpJiIiIvqTnlrFvAlwbhlZWwPs0km58cBba96jGwKMBO4GLipB049KANasMcBNbQGepB/UtL8D8IMSRG4KLC7pFwE/Bv4T+ChwcRf17wd8sHz/HtXIYUO2H5W0paRXAztSTbMfSBUg/g/wZmAPYJYkqILt5ZK2BN4OXFXSATarqfqLwJ22J3bR/ApgFfAdSdcC13ZS7n/K3zlUrwNERERErP0IoqQ3UgWDjwOfAR6jGv1roQrG6t5GNTI2unx2tn2D7VuogqdlwCU9uJDiW8C5tkcBHwc2B7C9FHhM0juBfYGf9VB7Hf0SmAA8wMsjivsBt1P9FotqfotRtsdT/Zs8XZM+2vZbauq8G9hb0radNWr7Rarn+m/gfcD1nRR9ofxdQ7Y8ioiIiGKtgoLyvt63qYIvSxoCPGz7JUknUI2GATwDvLrm1pnAKZJm214taReqoPA15f4LJG0G7AVc2mR37gS+UaZV/wR8GJhf8oaU+gFO6HDfhVRTzd+rN01b45fAUVSjh8dSBXrNuhX49/K5B3gH1WKfFZIeAIZK2s/2r8ro6S62F0laLOnDtq9SNYz4Vtttz3Q91e94naTxtp/p2GgZhRxs+6flfcffd6PPnRo1fAit2eMtIiKi3+tOgPgqSfOoppNfpAqYzil504Gry8jf9cCzJX0BsEbSfOAS4BtUU5lzS+DzBHA4cDAwWdJqYCXQ9Aii7eWSTgd+BTxN+/cXT6eaqn0KmA3sXJP3E6qp5a6mlwFOAy6WNLn0d0KzfaMKEHcEbrG9RtJS4Nel338uU+3fLAH2xlRT3ouoAtHzJP0b1e99JS8HvZTA8dXATyT9bZ13IF8N/FjS5lQjlZ/tRp8jIiJigJPt3u5Dr5DUAkyzvV72MOwPWlpa3Nra2tvdiIiIiB4gaY7tlnp5A/K9M0lTgFN4eSVzRERERBR9NkCUdCftV+9CNV27tEPacbYXdqdu22dS7dFY296/Ur2/WOsq22fQQCd97Xa/1oaka2g/dQ7wedsz13XbERER0T8N2Cnm6L5MMUdERPQfXU0xr/U2NxERERHRPyVAjIiIiIh2+uw7iNH3LFy2ghFTruvtbkT0aUuyV2hE9AMZQYyIiIiIdhIgNiBpx3KyybbleptyvUrSqJpykyWd3wPtHSppjqSF5e87a/L2Lum/lfRN1RzWXFNmhKR7X2k/IiIiYuBKgNhAObf5PF7eFudMYAbVCTDTVRkOnAxM6YEmnwTeX86PPoHqxJo25wEnASPL5z090F5EREREOwkQmzMNGCtpEjAOONv29cByqmMBpwGn236q3s2SjpB0Ywkmh0l6UNLr6pW1fY/tR8rlIqojDjeTNAzYyvYdrvYmupQqSG0bWZxfjjQ8tabdQZKmSrpb0gJJHy/pG0maLunXkmZJ+mk59q9e3ydKapXUuua5Fd382SIiImJDlACxCbZXA5OpAsFJ5RpgEnAGMNT29zq5HdvXUAWTpwIXAF+2/WgTTX8ImGv7BWA48HBN3sMlDarzpE+zvWeH+z8GrLC9D7APcJKknYEPUp2JvRtwHLBfF32fYbvFdsugwUOa6HJERERs6LKKuXmHUQV5ewCzAGw/Imk2cG0T958G3AvcYfuKRoUl7Q6cBYxvUG5rYGvbt5Sk75W+Uu59a83o4BCqqelxVKfEvAQ8KukXTfQ/IiIiBogEiE2QNBo4FBgL3CbpStvLS/ZL5dPIDqXc9pI2KsFZZ+3tAFwDHG/7dyV5Wamjtr5ljbpONbLY7tg9SX/bRH8jIiJigEqA2EBZKXwe1dTyQ5KmAmcDx3ajjo2Bi4CjqRaefLbUUa/s1sB1wBTbt7el214u6U+SxgJ3Ur37+C3bT0t6WtI427d16NdM4BRJs22vlrQLVVB5O3CCpO8CQ4GDgcsbPceo4UNozR5vERER/V7eQWzsJOAh27PK9XTgLZIO6kYdXwBuLQHcZ4F/lPSWTsp+Evgb4EuS5pXPa0veJ4ALgd8CvwN+VtInAP8laR7VqGGbC4H7gLll65vzqf6n4GqqdxjvA74PzAWyAiUiIiIAULUgNgYaSVvaXilpO+AuYP9GC2daWlrc2tq6fjoYERER65SkObZb6uVlinngurZMZ28KfLXJVdURERExACRA7EHlZJWO2928YHtMnbLvplqlXGux7SPWVf9q2T54fbQTERERG54EiD3I9kJgdJNlZ1ItIomIiIjoU7JIJSIiIiLaSYAYEREREe1kirmQtNL2ll3kLwFabD/ZRZkTgRtqzlJebzq2LelC4Bzb9/VUGwuXrWDElOt6qroBb0n2lIyIiD4qI4g960Tg9d25oWyi3eNt2/7HngwOIyIiYuBIgNiBpGGSbikbVN8r6YAO+SMk3S/pAkmLJN0g6VXlvOMW4LJy76sk7S3pZklzJM2UNKzUcZOk/5TUCnxa0odLW/Ml3VLKDJI0VdLdkhZI+nhNHz4vaWEpf2Ynbd8kqaWUP7qUv1fSWTX1rJR0RqnnDknbr/MfOCIiIvq8BIh/7Rhgpu3RwJ7AvDplRgL/ZXt34GngQ7b/G2gFji33vgh8CzjS9t5UR+2dUVPHprZbbP8/4EvAu23vCfxdyf8YsML2PsA+wEmSdpZ0GPABYEwp//WObdt+vq0RSa+n2k7nnVQrrPeRdHjJ3gK4o9RzC9WpMRERETHA5R3Ev3Y3cJGkTYAf2Z5Xp8zimvQ5wIg6Zd4M7AHMqo5zZhCwvCb/BzXfbwcukfRD4H9K2njgrWV0EGAIVWB6CHCx7ecAbP+xwfPsA9xk+wkASZcBBwI/Av4MXFvzHId2vFnSRGAiwKCthjZoKiIiIvqDBIgd2L5F0oHAe6mCtnNsX9qh2As139cAr6pTlYBFtvfrpKlna9o8WdKY0uYcSXuX+08r+yW+XGm1wXZPWe2Xz1pcQ53/HmzPAGYAbDZsZM5ljIiIGAAyxdyBpDcAj9m+ALgQ2Ksbtz8DvLp8fwAYKmm/Uu8mknbvpM032b7T9peAJ4AdqTbRPqWMZCJpF0lbALOACZIGl/Rt67Rd6y7gIEmvkTQIOBq4uRvPFBEREQNMRhD/2sHAZEmrgZXA8d249xLg25KeB/YDjgS+KWkI1W/9n8CiOvdNlTSSatTwRmA+sIBq6nquqjnqJ4DDbV8vaTTQKunPwE+BL9RpGwDbyyVNAX5R6r/O9o+78UwRERExwOjlGcaIrrW0tLi1tbW3uxERERE9QNIc2y318jLFHBERERHtJECMiIiIiHYSIEZEREREOwkQIyIiIqKdBIgRERER0U4CxIiIiIhoJwFiRERERLSTjbLXAUlrgIVUv+/9wAltZyfXlDkdWGn7bEmXAAcBf6I6tu8O4Au2Hy5lfwocY/vpTtqbBMzo2EZN/oXAObbv6yT/YODPtn/Z1XMtXLaCEVOu66pIdLDkzPf2dhciIiK6LSOI68bztkfb3gP4M3ByE/dMtr0n8GbgHmC2pE0BbP9tZ8FhMQkYXC9D0iDb/9hZcFgcDLy9iT5GRETEAJAAcd27FfgbAEn/KulBSbdRBYJ/xZVpwKPAYeW+JeUs5S0kXSdpvqR7Jf2DpE8Brwd+IekXpfxKSf9P0nxgP0k3SWopee+RNLfUcaOkEVQB7GckzZN0wLr9OSIiIqKvyxTzOiRpY6og73pJewNHAaOpfve5wJwubp8L7ArUnpv8HuAR2+8t9Q+xvULSZ4F32H6ylNsCuNP2P5Vybf0ZClwAHGh7saRtbf9R0rcp09098dwRERGxYcsI4rrxKknzgFbgIeA7wAHANbafs/0n4CcN6lCdtIXAoZLOknSA7RWd3LsGuLpO+ljgFtuLAWz/sdGDSJooqVVS65rnOmsuIiIi+pOMIK4bz9seXZvQNorXDW8DbqxNsP2gpL2AvwW+JulG2/9e595Vttd0t8F6bM8AZgBsNmyke6LOiIiI6Nsygrj+3AIcLulVkl4NvL9eIVU+BQwDru+Q93rgOdvfB6YCe5WsZ4BXN9GHO4ADJe1c6tu2m/dHRETEAJAAcT2xPRf4ATAf+Blwd4ciU8uikgeBfajeKfxzhzKjgLvK9PWXga+V9BlU7zn+okEfngAmAv9T2vpByfpf4IgsUomIiAgA2Zk1jOa0tLS4tbW1t7sRERERPUDSHNst9fIyghgRERER7SRAjIiIiIh2EiBGRERERDsJECMiIiKinQSIEREREdFOAsSIiIiIaCcnqUTTFi5bwYgp1/V2N9abJWe+t7e7EBER0SsygtiLJK1skP9RSQslLZB0r6QPlPQTy6kqPdWPHq0vIiIiNmwZQeyjJO0A/Cuwl+0VkrYEhpbsE4F7gUfq3DdoLc5h7rS+iIiIGHgSIPYBkoZRHXu3FdW/ySnAs1RnJK8EsL0SWCnpSKAFuEzS88B+wP3l/kOBr0v6I/AVYDPgd8AE2ysl7Q2cA2wJPEkVGO7fsT7bz6+P546IiIi+KVPMfcMxwEzbo4E9gXlUZzY/BiyWdLGk9wPY/m+gFTjW9uiaYO4PtvcCfg78G3BIuW4FPitpE+BbwJG29wYuAs7ooj4AJE2U1Cqpdc1zK9blbxARERF9REYQ+4a7gYtKEPcj2/MAJL0H2Ad4FzBN0t62T++kjh+Uv2OB3YDbJQFsCvwKeDOwBzCrpA8CljfqmO0ZwAyAzYaNzMHdERERA0ACxD7A9i2SDgTeC1wi6Rzbl9o2cBdwl6RZwMXA6Z1U82z5K2CW7aNrMyWNAhbZ3m+dPERERET0G5li7gMkvQF4zPYFwIXAXpJeL2mvmmKjgf8r358BXt1JdXcA+0v6m1L3FpJ2AR4Ahkrar6RvImn3JuqLiIiIASYjiH3DwcBkSaupFqUcD2wCnF22n1kFPAGcXMpfAny7ZpHKX9h+QtKJwBWSNivJ/2b7wbLA5ZuShlD92/8nsKhjfZ0tUhk1fAit2RswIiKi31M1ixnRWEtLi1tbW3u7GxEREdEDJM2x3VIvL1PMEREREdFOAsSIiIiIaCcBYkRERES0kwAxIiIiItpJgBgRERER7SRAjIiIiIh2sg9iNG3hshWMmHJdb3ejxyzJno4RERF1ZQRxHZO0sokyoyW5nL0cERER0asSIPYNRwO3lb8RERERvSoB4noiaZikWyTNk3SvpANKuoAPAycCh0raXNKuku6quXeEpIXl+96SbpY0R9JMScNK+k2SzpJ0l6QHa+o/UdK5NXVdK+ng8n28pF9JmivpKklbrp9fIyIiIvqyBIjrzzHATNujgT2BeSX97cBi278DboL/v717j5GqPOM4/v25XIwXEIQaghTWVk2opIhbi6kSjcYLtlIvEawJapuQNm1SY6qlxVr/qInW1DTWphaVooYKGqWS9CK0sdLYogx0FVARUExLcK2XeAmNF3z6x3lXztnOXgYGzs7M75OczNl3zjnzPu97dufZ9z1nhvMj4gVgmKT2tM1sYJmkocAvgEsi4iRgEXBT7jWGRMTJwNXAj/uqjKQxwPXAWRExDagA11TZbp6kiqTK7l1v1xy0mZmZNR7fpHLgrAUWpSTvdxHRmcovA5am9aXAXOBh4EGyxPDm9DgbOB44AViVDTzSBuzMvcYj6XEdMKmf+kwHJgNPpmMNA/7Rc6OIWAgsBBg+7lh/cbeZmVkLcIJ4gETEakkzgPOBxZJuA5YAFwOzJC0ABBwp6XBgGfCQpEey3WOLpCnApog4pZeXeT897mZP335EcaT44PQoYFVE+LpHMzMzK/AU8wEiaSLQFRF3AXcD04AzgWcjYkJETIqIiWSjhxemKefdwI/IkkWAzcBYSaekYw6V9Ll+Xno7MFXSQZImACen8jXAlyR9Nh3rUEnH1SteMzMza1weQTxwTgeulfQh8B7ZVPINwPIe2z0MfAu4jywxvBVoB4iIDyRdAtwuaSRZ//0c2NTH6z4JvAw8BzwPrE/H+o+kK4EHJA1P214PvNjbgaaMH0nFnx1oZmbW9BThy8psYDo6OqJSqZRdDTMzM6sDSesioqPac55iNjMzM7MCJ4hmZmZmVuAE0czMzMwKnCCamZmZWYETRDMzMzMrcIJoZmZmZgX+HEQbsA073mbS/N/v99fZ7s9aNDMzK5VHEAcJSe/18/x2SRskdabHWQPdt49j/lVS1c8/MjMzs9blEcTGckZEvC7peGAl8GjZFTIzM7Pm4xHEQUbSOEmr00jhRkmnVdlsBPBWlX0l6da03wZJs3PPfT+VPSPp5h77HSRpsaSf1D8iMzMzazQeQRx8vgY8FhE3SWoDDsk997gkAccAl1bZ9yJgKvB5YAywVtLqVDYL+GJE7JI0OrfPEGAJsDEibup5QEnzgHkAbSPG7mNoZmZm1gg8gjj4rAWuknQjMCUi3s09d0ZEnABMAe6QdFiPfU8FHoiI3RHRBTwBfAE4C/hNROwCiIg3c/v8ml6Sw7TtwojoiIiOtkNG1iM+MzMzG+ScIA4yEbEamAHsABZLmltlm21AFzC5Di/5d+AMSQfX4VhmZmbWBJwgDjKSJgJdEXEXcDcwrco2nwLagVd6PPU3YLakNkljyRLNp4FVZKOSh6T981PM9wB/AB6U5EsOzMzMzNcgDkKnA9dK+hB4D8iPID4uaTcwFJifppHzlgOnAM8AAVwXEa8Cf5I0FahI+oAsIfxh904RcZukkcD9ki6PiI+rVWzK+JFU/BmFZmZmTU8RUXYdrEF0dHREpVIpuxpmZmZWB5LWRUTVz0P2FLOZmZmZFThBNDMzM7MCTzHbgEl6F9hcdj1KNAZ4vexKlMjxO37H37paPX5ozjaYGBFVP+TYN6lYLTb3dq1CK5BUcfyOv+x6lMXxO/5Wjh9arw08xWxmZmZmBU4QzczMzKzACaLVYmHZFSiZ429tjr+1OX5rqTbwTSpmZmZmVuARRDMzMzMrcIJoAyLpXEmbJW2VNL/s+tSbpAmSHpf0nKRNkr6bym+UtENSZ1pm5vb5QWqPzZLOKa/29SNpu6QNKdZKKhstaZWkLelxVCqXpNtTGzwr6f++N7yRSDo+18+dkt6RdHUznwOSFkl6TdLGXFnN/S3pirT9FklXlBHL3ugl/lslvZBiXC7piFQ+SdJ/c+fBnbl9Tkq/N1tTG6mEcGrWS/w1n++N+v7QS/zLcrFvl9SZypuu//sVEV689LkAbcA24BhgGNl3PU8uu151jnEcMC2tHw68CEwGbgS+V2X7yakdhgPtqX3ayo6jDu2wHRjTo+ynZN/9DTAfuCWtzwT+CAiYDjxVdv3r2A5twKvAxGY+B4AZwDRg4972NzAaeCk9jkrro8qObR/iPxsYktZvycU/Kb9dj+M8ndpEqY3OKzu2fYi/pvO9kd8fqsXf4/mfATc0a//3t3gE0QbiZGBrRLwUER8AS4FZJdepriJiZ0SsT+vvAs8D4/vYZRawNCLej4iXga1k7dSMZgH3pvV7ga/myu+LzBrgCEnjSqjf/nAmsC0iXuljm4Y/ByJiNfBmj+Ja+/scYFVEvBkRbwGrgHP3e+XroFr8EbEyIj5KP64Bju7rGKkNRkTEmsiyhfvY02aDWi/935vezveGfX/oK/40Cngp8EBfx2jk/u+PE0QbiPHAv3I//5u+k6eGJmkScCLwVCr6TppuWtQ93UbztkkAKyWtkzQvlR0VETvT+qvAUWm9WdsAYA7FN4ZWOgdq7e9mbQeAr5ONCHVrl/RPSU9IOi2VjSeLuVszxF/L+d6s/X8a0BURW3JlrdL/gBNEswJJhwEPA1dHxDvAr4DPAFOBnWRTDs3s1IiYBpwHfFvSjPyT6T/kpv7oA0nDgAuAh1JRq50Dn2iF/u6NpAXAR8CSVLQT+HREnAhcA/xW0oiy6rcftez53sNlFP9JbJX+/4QTRBuIHcCE3M9Hp7KmImkoWXK4JCIeAYiIrojYHREfA3exZwqxKdskInakx9eA5WTxdnVPHafH19LmTdkGZMnx+ojogtY7B6i9v5uuHSRdCXwZuDwlyaSp1TfS+jqy6+6OI4s1Pw3d0PHvxfnejP0/BLgIWNZd1ir9n+cE0QZiLXCspPY0ujIHWFFyneoqXW9yD/B8RNyWK89fU3ch0H232wpgjqThktqBY8kuVG5Ykg6VdHj3OtnF+hvJYu2+M/UK4NG0vgKYm+5unQ68nZuabGSFkYNWOgeSWvv7MeBsSaPSdOTZqawhSToXuA64ICJ25crHSmpL68eQ9fdLqQ3ekTQ9/R2Zy542azh7cb434/vDWcALEfHJ1HGr9H9B2XfJeGmMhewOxhfJ/mtaUHZ99kN8p5JNpT0LdKZlJnA/sCGVrwDG5fZZkNpjM01w1xrZXYjPpGVTdz8DRwJ/AbYAfwZGp3IBv0xtsAHoKDuGOrTBocAbwMhcWdOeA2SJ8E7gQ7Jrp76xN/1Ndq3e1rRcVXZc+xj/VrJr6rr/DtyZtr04/V50AuuBr+SO00GWSG0D7iB9CcVgX3qJv+bzvVHfH6rFn8oXA9/ssW3T9X9/i79JxczMzMwKPMVsZmZmZgVOEM3MzMyswAmimZmZmRU4QTQzMzOzAieIZmZmZlbgBNHMzMzMCpwgmpmZmVmBE0QzMzMzK/gfkz2gIQjfAYYAAAAASUVORK5CYII=" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### koalas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 11, - "source": [ - "data = ks.read_parquet('data/sf_crime.parquet', index_col='Id')\n", - "y_ks = data['Category']\n", - "X_ks = data.drop(\n", - " ['Resolution', 'Descript', 'DayOfWeek', 'Category'], axis=1)\n", - "X_ks.index.name = None\n", - "y_ks = y_ks.replace(mapping).astype(int)\n", - "\n", - "train_test_split = TrainTestSplit(test_ratio=0.3, strategy='ordered')\n", - "X_train_ks, X_test_ks, y_train_ks, y_test_ks = \\\n", - " train_test_split.transform(X_ks, y_ks)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - " \r" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 12, - "source": [ - "offline_pipe = Pipeline(steps=offline_steps)\n", - "X_train_prepro_ks = offline_pipe.fit_transform(X_train_ks, y_train_ks)\n", - "X_train_prepro_ks_np = offline_pipe.transform_numpy(X_train_ks.to_numpy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "21/09/30 11:18:41 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### check pandas and koalas results match - offline pipeline" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 13, - "source": [ - "assert_frame_equal(\n", - " X_train_prepro, \n", - " X_train_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_train_prepro_np,\n", - " X_train_prepro_ks_np)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## production pipeline" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 14, - "source": [ - "prod_columns = list(X_train.columns)\n", - "features = offline_pipe.get_features()\n", - "theta_vec = np.unique([int(f.split('deg')[0].split('_')[-1]) for f in features if 'deg' in f])" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 15, - "source": [ - "\n", - "prod_steps = [\n", - " ConvertColumnDatatype(['Dates'], 'datetime64[ns]'),\n", - " OrdinalHourOfDay(columns=['Dates']),\n", - " OrdinalDayOfWeek(columns=['Dates']),\n", - " CyclicHourOfDay(columns=['Dates']),\n", - " CyclicDayOfWeek(columns=['Dates']),\n", - " StringContains(\n", - " columns=['Address', 'Address', 'Address', 'Address'], \n", - " contains_vec=['/', 'AV', 'ST', 'Block'], \n", - " column_names=['IsIntersection', 'IsAvenue', 'IsStreet', 'IsBlock']),\n", - " DropColumns(['Dates', 'Address']),\n", - " OrdinalEncoder(),\n", - " PlaneRotation(\n", - " columns= [['X','Y']], \n", - " theta_vec= theta_vec.tolist()),\n", - " KeepColumns(columns_to_keep=features)\n", - "]" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### pandas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 16, - "source": [ - "X_train_prod = X_train[prod_columns]\n", - "X_train_prod_np = X_train_prod.to_numpy()\n", - "X_test_prod = X_test[prod_columns]\n", - "X_test_prod_np = X_test_prod.to_numpy()\n", - "\n", - "prod_pipe = Pipeline(steps=prod_steps)\n", - "_ = prod_pipe.fit(X_train_prod, y_train)\n", - "X_train_prod_prepro = prod_pipe.transform(X_train_prod)\n", - "X_train_prod_prepro_np = prod_pipe.transform_numpy(\n", - " X_train_prod.to_numpy())\n", - "X_test_prod_prepro = prod_pipe.transform(X_test_prod)\n", - "X_test_prod_prepro_np = prod_pipe.transform_numpy(\n", - " X_test_prod.to_numpy())" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### koalas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 17, - "source": [ - "X_train_prod_ks = X_train_ks[base_columns]\n", - "X_test_prod_ks = X_test_ks[base_columns]\n", - "X_train_prod_ks_np = X_train_prod_ks.to_numpy()\n", - "X_test_prod_ks_np = X_test_prod_ks.to_numpy()\n", - "\n", - "prod_pipe = Pipeline(steps=prod_steps)\n", - "_ = prod_pipe.fit(X_train_prod_ks, y_train_ks)\n", - "X_train_prod_prepro_ks = prod_pipe.transform(X_train_prod_ks)\n", - "X_test_prod_prepro_ks = prod_pipe.transform(X_test_prod_ks)\n", - "X_train_prod_prepro_ks_np = prod_pipe.transform_numpy(\n", - " X_train_prod_ks.to_numpy())\n", - "X_test_prod_prepro_ks_np = prod_pipe.transform_numpy(\n", - " X_test_prod_ks.to_numpy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - " \r" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### check offline pipeline and production pipeline match" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 18, - "source": [ - "assert_frame_equal(\n", - " X_train_prepro, \n", - " X_train_prod_prepro\n", - ")\n", - "assert_frame_equal(\n", - " X_train_prepro_ks.to_pandas(), \n", - " X_train_prod_prepro_ks.to_pandas()\n", - ")" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### check pandas and koalas results match " - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 19, - "source": [ - "assert_frame_equal(\n", - " X_train_prod_prepro, \n", - " X_train_prod_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_train_prod_prepro_np,\n", - " X_train_prod_prepro_ks_np)\n", - "assert_frame_equal(\n", - " X_test_prod_prepro, \n", - " X_test_prod_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_test_prod_prepro_np,\n", - " X_test_prod_prepro_ks_np)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## model building" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### numpy" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 20, - "source": [ - "features = list(X_train_prod_prepro.columns)\n", - "n_splits = 10\n", - "max_evals = 10\n", - "kfold = StratifiedKFold(n_splits=n_splits)\n", - "space = {\n", - " 'n_estimators': hp.quniform('n_estimators', 25, 200, 25),\n", - " 'max_depth': hp.quniform('max_depth', 1, 2, 1),\n", - " 'learning_rate': hp.loguniform('learning_rate', -3, 0),\n", - " 'subsample': hp.uniform('subsample', 0.9, 1),\n", - " 'colsample_bytree': hp.uniform('colsample_bytree', 0.9, 1),\n", - " }\n", - "model = LGBMClassifier(random_state=0, n_jobs=-1)\n", - "hyper = HyperOpt(\n", - " model=model,\n", - " scoring='f1_macro',\n", - " algo=tpe.suggest,\n", - " space=space,\n", - " max_evals=max_evals, \n", - " kfold=kfold,\n", - " features=features,\n", - " )\n", - "y_train_np = y_train.to_numpy()\n", - "_ = hyper.fit(X_train_prod_prepro_np, y_train.to_numpy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "100%|████████| 10/10 [00:54<00:00, 5.40s/trial, best loss: -0.1673606787658695]\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 21, - "source": [ - "model_np = copy.copy(hyper.model)\n", - "X_test_prod = X_test[prod_columns]\n", - "X_test_prod_prepro_np = prod_pipe.transform(X_test_prod).to_numpy()\n", - "y_test_pred = model_np.predict(X_test_prod_prepro_np)\n", - "f'f1 score: {f1_score(y_test, y_test_pred, average=\"macro\"):.2f}'" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'f1 score: 0.18'" - ] - }, - "metadata": {}, - "execution_count": 21 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 22, - "source": [ - "hyper.get_feature_importances().iloc[::-1].plot(\n", - " kind='barh', \n", - " figsize=(9, 9), \n", - " title='Most important features',\n", - ");" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 23, - "source": [ - "hyper.history.sort_values('loss')" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " colsample_bytree learning_rate max_depth n_estimators subsample \\\n", - "2 0.926252 0.300600 2.0 200.0 0.925837 \n", - "1 0.985874 0.346470 2.0 150.0 0.953096 \n", - "6 0.933342 0.214064 2.0 200.0 0.983817 \n", - "0 0.958341 0.089527 2.0 150.0 0.948605 \n", - "5 0.918110 0.117257 2.0 75.0 0.923251 \n", - "8 0.905273 0.054035 2.0 125.0 0.951049 \n", - "4 0.981792 0.194985 1.0 150.0 0.914742 \n", - "9 0.944860 0.818980 2.0 175.0 0.909205 \n", - "7 0.923855 0.086539 1.0 150.0 0.996713 \n", - "3 0.924046 0.088425 1.0 25.0 0.952869 \n", - "\n", - " loss status id \n", - "2 -0.167361 ok 2 \n", - "1 -0.165375 ok 1 \n", - "6 -0.162272 ok 6 \n", - "0 -0.149989 ok 0 \n", - "5 -0.137971 ok 5 \n", - "8 -0.134075 ok 8 \n", - "4 -0.129511 ok 4 \n", - "9 -0.126706 ok 9 \n", - "7 -0.109897 ok 7 \n", - "3 -0.068088 ok 3 " - ], - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colsample_bytreelearning_ratemax_depthn_estimatorssubsamplelossstatusid
20.9262520.3006002.0200.00.925837-0.167361ok2
10.9858740.3464702.0150.00.953096-0.165375ok1
60.9333420.2140642.0200.00.983817-0.162272ok6
00.9583410.0895272.0150.00.948605-0.149989ok0
50.9181100.1172572.075.00.923251-0.137971ok5
80.9052730.0540352.0125.00.951049-0.134075ok8
40.9817920.1949851.0150.00.914742-0.129511ok4
90.9448600.8189802.0175.00.909205-0.126706ok9
70.9238550.0865391.0150.00.996713-0.109897ok7
30.9240460.0884251.025.00.952869-0.068088ok3
\n", - "
" - ] - }, - "metadata": {}, - "execution_count": 23 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 24, - "source": [ - "import dill\n", - "model_path = 'models/model_xgb_sfcrime.dill'\n", - "with open(model_path, 'wb') as file:\n", - " dill.dump(model_np, file)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### pandas" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 25, - "source": [ - "model_pd = copy.copy(model_np)\n", - "_ = model_pd.fit(X_train_prod_prepro, y_train)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### treelite" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 26, - "source": [ - "LGBMTreeliteDumper.dump(\n", - " model=model_np,\n", - " toolchain='gcc',\n", - " parallel_comp=6,\n", - " model_path='models/',\n", - " model_name='treelite_lgbm_sfcrime'\n", - ")" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[11:20:21] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 6 translation units.\n", - "[11:20:37] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", - "[11:20:37] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 6 translation units.\n", - "[11:20:38] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file tu4.c...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file tu5.c...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file header.h...\n", - "[11:20:38] ../src/c_api/c_api.cc:126: Writing file main.c...\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 27, - "source": [ - "import treelite_runtime\n", - "model_tl = treelite_runtime.Predictor(\n", - " './models/treelite_lgbm_sfcrime.so', verbose=False)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "#### check the models prediction match" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 28, - "source": [ - "X_train_np = X_train.to_numpy()\n", - "y_pred_pd = model_pd.predict(\n", - " prod_pipe.transform(X_train_prod))\n", - "y_pred_np = model.predict(\n", - " prod_pipe.transform_numpy(X_train_prod_np.copy()))\n", - "y_pred_tl = model_tl.predict(\n", - " treelite_runtime.DMatrix(\n", - " prod_pipe.transform_numpy(\n", - " X_train_prod_np.copy()\n", - " )\n", - " )\n", - ")\n", - "assert np.allclose(y_pred_np, y_pred_pd)\n", - "assert np.allclose(y_pred_np, np.argmax(y_pred_tl, axis=1))" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## model evaluation" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 29, - "source": [ - "model_np = copy.copy(hyper.model)\n", - "X_test_prod = X_test[prod_columns]\n", - "X_test_prod_prepro_np = prod_pipe.transform(X_test_prod).to_numpy()\n", - "y_test_pred = model_np.predict(X_test_prod_prepro_np)\n", - "f'accuracy {round(100 * (y_test_pred == y_test).mean(), 2)}%'" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'accuracy 32.53%'" - ] - }, - "metadata": {}, - "execution_count": 29 - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## per-sample bechmarking" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### pipeline only" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 30, - "source": [ - "x = X_train_prod.iloc[[0]]\n", - "xnp = x.to_numpy()\n", - "stats_pd = %timeit -o prod_pipe.transform(x)\n", - "stats_np = %timeit -o prod_pipe.transform_numpy(xnp.copy())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "52.4 ms ± 1.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "90.9 µs ± 6.93 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 31, - "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy x{round(speedup)}'" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy x576'" - ] - }, - "metadata": {}, - "execution_count": 31 - } - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### pipeline & model" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 32, - "source": [ - "stats_pd = %timeit -o model_pd.predict(prod_pipe.transform(x))[0]\n", - "stats_np = %timeit -o model.predict(prod_pipe.transform_numpy(xnp.copy()))[0]\n", - "stats_tl = %timeit -o model_tl.predict(treelite_runtime.DMatrix(prod_pipe.transform_numpy(xnp.copy())))" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "66.9 ms ± 2.85 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "722 µs ± 9.48 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", - "189 µs ± 9.74 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 33, - "source": [ - "speedup = 1000 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy x{round(speedup)}'" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy x93'" - ] - }, - "metadata": {}, - "execution_count": 33 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 34, - "source": [ - "speedup = 1000 * float(str(stats_pd).split(' ')[0]) / float(str(stats_tl).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy&Treelite x{round(speedup)}'" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy&Treelite x354'" - ] - }, - "metadata": {}, - "execution_count": 34 - } - ], - "metadata": {} - } - ], - "metadata": { - "kernelspec": { - "display_name": "gators38", - "language": "python", - "name": "gators38" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "cells": [ + { + "cell_type": "markdown", + "id": "df65377d", + "metadata": {}, + "source": [ + "# multiclass classification example - SF crime dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "2a612a42", + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "04e99725", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3eb44a1b", + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pandas.testing import assert_frame_equal\n", + "from lightgbm import LGBMClassifier\n", + "from xgboost import XGBClassifier\n", + "import dill\n", + "from sklearn.metrics import make_scorer\n", + "from sklearn.model_selection import StratifiedKFold\n", + "from sklearn.model_selection import RandomizedSearchCV\n", + "from sklearn.metrics import f1_score\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "import treelite\n", + "import treelite_runtime\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "cmap = sns.color_palette(\"vlag\", as_cmap=True)" + ] + }, + { + "cell_type": "markdown", + "id": "83885d4a", + "metadata": {}, + "source": [ + "**Gators** imports" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "750c7885", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from gators.util import util\n", + "\n", + "# data cleaning\n", + "from gators.data_cleaning import (\n", + " ConvertColumnDatatype,\n", + " DropHighNaNRatio,\n", + " DropLowCardinality,\n", + " DropHighCardinality,\n", + " DropDatatypeColumns,\n", + " DropColumns,\n", + " KeepColumns,\n", + ")\n", + "\n", + "# imputers\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "\n", + "# encoders\n", + "from gators.encoders import (\n", + " WOEEncoder,\n", + " TargetEncoder,\n", + " OrdinalEncoder,\n", + ")\n", + "\n", + "# binning\n", + "from gators.binning import (\n", + " BinRareCategories,\n", + " TreeBinning,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import (\n", + " ClusterStatistics,\n", + " PolynomialObjectFeatures,\n", + " ElementaryArithmetics,\n", + ")\n", + "from gators.feature_generation_str import (\n", + " Contains,\n", + " Length,\n", + " Extract,\n", + " SplitExtract,\n", + ")\n", + "from gators.feature_generation_dt import (\n", + " CyclicHourOfDay,\n", + " CyclicDayOfMonth,\n", + " CyclicDayOfWeek,\n", + " CyclicMonthOfYear,\n", + " OrdinalDayOfMonth,\n", + " OrdinalMonthOfYear,\n", + " OrdinalDayOfWeek,\n", + " OrdinalHourOfDay,\n", + ")\n", + "\n", + "# feature selection\n", + "from gators.feature_selection import (\n", + " InformationValue,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import PlaneRotation\n", + "\n", + "# model building\n", + "from gators.model_building import (\n", + " TrainTestSplit,\n", + " XGBBoosterBuilder,\n", + " XGBTreeliteDumper,\n", + " LGBMTreeliteDumper,\n", + ")\n", + "\n", + "# pipeline\n", + "from gators.pipeline import Pipeline" + ] + }, + { + "cell_type": "markdown", + "id": "94fcc94a", + "metadata": {}, + "source": [ + "## data analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1547018b", + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_parquet(\"data/sf_crime.parquet\")\n", + "data = data.reset_index(drop=True)\n", + "y = data[\"Category\"]\n", + "X = data.drop([\"Category\"], axis=1)\n", + "# ordinal target\n", + "classes = y.unique()\n", + "target_mapping = dict(zip(classes, range(len(classes))))\n", + "y = y.replace(target_mapping)\n", + "# train test split\n", + "train_test_split = TrainTestSplit(test_ratio=0.3, strategy=\"stratified\")\n", + "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)\n", + "X_train_np = X_train.to_numpy()\n", + "X_test_np = X_test.to_numpy()\n", + "# one-hot target\n", + "target_mapping_ = {v: k for k, v in target_mapping.items()}\n", + "y_train_dummies = pd.get_dummies(y_train.replace(target_mapping_))\n", + "y_test_dummies = pd.get_dummies(y_test.replace(target_mapping_))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "51158cc8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DatesPdDistrictAddressXY
42272010-03-24 12:35:00SOUTHERN0 Block of DORE ST-122.41293337.773927
63262007-09-07 18:00:00INGLESIDE200 Block of ADDISON ST-122.43239837.737822
\n", + "
" + ], + "text/plain": [ + " Dates PdDistrict Address X \\\n", + "4227 2010-03-24 12:35:00 SOUTHERN 0 Block of DORE ST -122.412933 \n", + "6326 2007-09-07 18:00:00 INGLESIDE 200 Block of ADDISON ST -122.432398 \n", + "\n", + " Y \n", + "4227 37.773927 \n", + "6326 37.737822 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7616abdf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "X_train.dtypes.value_counts(ascending=True).plot(\n", + " figsize=(3 * 1.6, 3),\n", + " kind=\"barh\",\n", + " title=\"column datatype\",\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "52ab5c4a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW0AAADSCAYAAACB6pE2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAW6klEQVR4nO3de5zd853H8ddbJJEQkTToiNQIcQ9BirqVWncarCKr27TVevSixQNtXHY3uxtbW1WqLNWta9Wl7pdS6rJpiMukJpJUSUJc4k4FlbrEZ//4fYef45zJTMycOd/J+/l4nMf8zvf7u3zOLyfv+c7395s5igjMzCwPy/V0AWZm1nEObTOzjDi0zcwy4tA2M8uIQ9vMLCMObTOzjDi0bZkl6VBJt/V0HWadId+nbda4JAUwKiLm9nQt1hg80rZlkqTle7qGRubz07gc2tarSBoh6RpJL0l6RdJZqf2rku6RdLqkV4BJqW1qaduQ9B1JcyS9Iek/Ja0j6V5Jr0u6UlK/0vr7SGqV9FpaZ9N26tpY0u2SXpX0gqQTUvtWkqalfTwn6ay2Y0iakjafIelNSQcv6biStpD0UKr/t5KukDS51P9NSXNTHTdIWqPi9X9X0hxgjqSzJZ1W8TpukHT0Uv3jWNeICD/86BUPoA8wAzgdWBFYAdg+9X0VeA/4HrA8MCC1TS1tH8D1wMrAxsDbwB3ASGAw8GdgQlp3c+BFYOt03AnAfKB/lboGAc8Bx6SaBgFbp74tgW1STc3AI8BRFTWtW3pe87hAP+BJ4EigL3AA8A4wOW37BeBlYIu0/s+BKRXHuh0Yms7PVsCzwHKpfxjwFrB6T/9bL8sPj7StN9kKWAM4LiL+FhF/j4ippf5nI+LnEfFeRCyqsY8fR8TrETEbmAXcFhGPR8RC4BaK0AQ4HPhFRNwfEYsj4iKKkN+myj73AZ6PiNNSTW9ExP0AETE9Iu5LNc0HfgF8vp3X2N5x28L/zIh4NyKuAR4obXsocH5E/Cki3gaOBz4nqbm0zo8i4tWIWBQRDwALgV1S3yHA3RHxQjv1WTdzaFtvMgJ4MiLeq9H/dAf2UQ6kRVWer5SW1wKOSVMUr0l6LR1/DT5uBDCv2sEkrSfpJknPS3od+C+KEW0t7R13DWBBRJTvLii/5jUoRuIARMSbwCvA8BrrA1wEfDktfxm4pJ3arA4c2tabPA18pp2LaF15q9TTwMkRsUrpMTAiLqux7sga+zkH+AvFHSIrAycAWsrjPgcMl1TefkRp+VmK0AdA0orAp4AFpXUqz9GvgXGSNgM2BK5rpzarA4e29SYPUATXKZJWlLSCpO266Vi/BL4laWsVVpS0t6RBVda9CWiSdJSk/pIGSdo69Q0CXgfelLQB8O2KbV/go4Hf3nGnAYuBIyQtL2kcxZRRm8uAr0kaI6k/xaj+/jQtU1VEPAM8SDHCvrqdaSWrE4e29RoRsRjYF1gXeAp4Bji4m47VAnwTOAv4KzCX4sJmtXXfAHZNtT0PzAF2Tt3HAv8EvEERyFdUbD4JuChNhRzU3nEj4h2Ki4+HAa9RTGfcRDHnTUT8AfgX4GqKb27rUMxTL8lFwGg8NdIQ/Ms1Zr2YpPuBcyPigk+wjx0ppknWCgdGj/NI26wXkfR5SZ9O0yMTgE2BWz/B/vpS3EL4vw7sxuDfejLrXdYHrqS4T/1x4MCIeG5pdiRpQ6CF4t73r3VZhfaJeHrEzCwjnh4xM8uIQ9vMLCOe066TYcOGRXNzc0+XYWYZmD59+ssRsWq1Pod2nTQ3N9PS0tLTZZhZBiQ9WavP0yNmZhlxaJuZZcShbWaWEYe2mVlGHNpmZhlxaJuZZcShbWaWEYe2mVlG/Ms1dTJzwUKaJ97c02WYWZ3NP2XvLt2fR9pmZhlxaJuZZcShbWaWEYe2mVlGHNpmZhlxaJuZZWSJoS1psaRWSbMlzZB0jKTlUt9Okham/r9I+klpu0mSjq3Y13xJw9JySDqt1HespEmV20paQdLtpb62etoeE1P73ZJaSvsbK+nuUp0had9S/02Sdipt+2hpn1el9vVTX6ukRySdl9oHSrpU0kxJsyRNlbRSh8+6mdlS6sh92osiYgyApNWA3wArA/+W+v8YEftIGgA8JOnaiLinA/t9GzhA0o8i4uVqK0jqB1wNTI+ISZX1VLGapD0j4pYqfc8AJwI31tj20Iio/JSCM4HTI+L6VM/o1H4k8EJEjE7t6wPv1tivmVmX6dT0SES8CBwOHCFJFX2LgFZgeAd39x5wHnB0jf7lgSuAORExsYP7PJUimKuZASyUtGsH9wXQRBH2AETEzFL7glL7oxHxdif2a2a2VDo9px0RjwN9gNXK7ZKGAKOAKZ3Y3dnAoZIGV+n7AfBORBxV0T6gYnrk4FLfNOAdSTvXON7JwEk1+i4t7fPU1HY6cKekWyQdLWmV1H4+8ENJ0yRNljSq2g4lHS6pRVLL4rcW1jismVnHdcWFyB0kzaAYef4+Ip5P7VFj/Q/aI+J14GLg+1XWmwpsK2m9ivZFETGm9Liion8yNYI5IqYASNq+SvehpX0el9a/ANgQ+C2wE3CfpP4R0QqMpBjZDwUelLRhleOdFxFjI2Jsn4HVvi+ZmXVOp0Nb0khgMfBiavpjRGwGbAwcJmlMan8FGFKx+SDgtYq2M4DDgBUr2qcARwG3SGrqaH0RcScwANimxirtjbar7e/ZiDg/IsZRTOlsktrfjIhrIuI7wK+BvTq6TzOzpdWp0Ja0KnAucFZEfGQkHRFPAKcAP0xNU4AvShqUtj0AmBERiyu2exW4kiK4qei7GvgJcGtpaqIjJlNMr3xMRNxG8c1k0yXtRNIekvqm5U8DnwIWSNouTQe1XSzdCKj56clmZl2lI3ePDJDUCvSlGGleAvy0xrrnAsdKao6IhyWdBUyVFBQj82/U2O404IhqHRFxjqTVgRsk7Vaqp82tlRcqI+J3kl5q5zWdDFxf0XappEVp+eWI+AdgN+Bnkv6e2o+LiOdTHeeki7HLATdT3OViZtatVDFgtm7Sv2lUNE04o6fLMLM6W5o/zSppekSMrdbn34g0M8uIQ9vMLCMObTOzjDi0zcwy4s+IrJPRwwfT0sWfFWdmyx6PtM3MMuLQNjPLiEPbzCwjDm0zs4w4tM3MMuLQNjPLiEPbzCwjDm0zs4w4tM3MMuLQNjPLiEPbzCwjDm0zs4w4tM3MMuLQNjPLiEPbzCwjDm0zs4w4tM3MMuLQNjPLiEPbzCwjDm0zs4z4g33rZOaChTRPvLmny7BMzPeHQFsNHmmbmWXEoW1mlhGHtplZRhzaZmYZcWibmWWkW0Nb0pul5b0kPSZpLUmTJB2b2i+U9ISkGan/YklrlrabL+nq0vMDJV1YcZzrJN1X0TZJ0gJJrZJmSfpiB9rLNS2Q1D89HyZpfmnfoyTdJGmepOmS7pK0Y9edOTOz6uoy0pa0C3AmsGdEPFllleMiYjNgfeAh4E5J/Ur9W0raqMa+VwG2BAZLGlnRfXpEjAG+BJwvabkltJctBr5e5XgrADcD50XEOhGxJfA9oPLYZmZdrttDO41AfwnsExHz2ls3CqcDzwN7lrpOA06ssdkBwI3A5cAhNfb7CPAeMKwj7ckZwNGSKu9lPxSYFhE3lPYzKyIurFGfmVmX6e7Q7g9cB+wXEX/pxHZ/AjYoPb8S2ELSulXWHQ9clh7jq+1M0tbA+8BLHWlPngKmAv9c0b5xqs/MrO66O7TfBe4FDuvkdqp4vhg4FTj+IytJqwOjgKkR8RjwrqRNSqscLakV+AlwcETEEtor/Qg4jnbOk6Rr09z4NVX6DpfUIqll8VsLa+3CzKzDuju03wcOAraSdEInttsceKSi7RJgR2BEqe0gYAjwRLpQ2MxHR9unR8SYiNghIv7YgfaPiIg5QGs6TpvZwBaldfYHvgoMrbL9eRExNiLG9hk4uNZhzMw6rNvntCPiLWBv4FBJ7Y64Vfg+0ATcWrGfd4HTgaNLzeOBPSKiOSKaKS5IVp3X/gROBo4tPf8NsF3bXSfJwC4+pplZVXW5eyQiXgX2AE6qCLs2p0qaATwGfBbYOSLeqbLer0h/5EpSM7AW8MGtfhHxBLAwzVV3Ve2zKc1hR8QiYB/gW5IelzQNOAmY3FXHNDOrRbWnc60r9W8aFU0TzujpMiwT/it/yzZJ0yNibLU+/0akmVlGHNpmZhlxaJuZZcShbWaWEYe2mVlG/BmRdTJ6+GBafEeAmX1CHmmbmWXEoW1mlhGHtplZRhzaZmYZcWibmWXEoW1mlhGHtplZRhzaZmYZcWibmWXEoW1mlhGHtplZRhzaZmYZcWibmWXEoW1mlhGHtplZRhzaZmYZcWibmWXEoW1mlhGHtplZRvwZkXUyc8FCmife3NNlWBeZ78/7tB7ikbaZWUYc2mZmGXFom5llxKFtZpYRh7aZWUYc2mZmGWmo0Ja0WFKrpFmSbpS0SmrfSdJNFeteKOnAtHy3pJZS31hJd1esf4akBZKWS8+PlHRGqf8Xkv5Qev49SWeWnrdKujwtbyzpMUkDSv03SxrfJSfCzKyGhgptYFFEjImITYBXge92YtvVJO1ZrSMF9f7A08DnU/M9wLal1TYDBkvqk55vC9ybtt8Q6APsIGnFiJgNXAOcmPr3A/pGxGWdqNfMrNMaLbTLpgHDO7H+qaQQrWInYDZwDtA2Gm4F1pM0QNJgYFFqG536t6UIdtI2lwC3AeNS238AX5I0BjiFzn2DMTNbKg0Z2mm0uwtwQyc2mwa8I2nnKn3jgcuAa4G9JfWNiPeAh4DPAtsA9wP3AdtKGg4oIp5O2x8MXJ72MR4gIt4CjgWmAJdHxJzOvUozs85rtNAeIKkVeB5YHbg9tUeN9SvbJwMnlRsk9QP2Aq6LiNcpwnn31H0vxYh6W4rQn1Z63jY1MhZ4OSKeAu4ANpc0FCAibgReA/6nWnGSDpfUIqll8VsLl/TazcyWqNFCe1FEjAHWAsSHUw6vAEMq1h0KvFxuiIg7gQEUI+c2uwOrADMlzQe258MpkrZ57c9RBPYjwEaUQjutu0Hadh6wMvCPpf2/nx4fExHnRcTYiBjbZ+Dgdl+4mVlHNFpoAx9MPXwfOEbS8sAcYI10QRBJa1FcOGytsvlk4Ael5+OBb0REc0Q0A2sDu0oaSBHU2wCrRsSLERHASxTz1vekC5gHAaNL24/jw9A3M6urhgxtgIh4CHgYGB8RbwNfBi5I0ydXUQTxx+YcIuJ3FMFLCuY9gJtL/X8DpgL7RsRf07qzS7uYBqwGzAB2ABZExLOl/inARpKauuilmpl1mIrBpXW3/k2jomnCGT1dhnUR/2lW606SpkfE2Gp9DTvSNjOzj3Nom5llxKFtZpYRh7aZWUYc2mZmGfEH+9bJ6OGDafEdB2b2CXmkbWaWEYe2mVlGHNpmZhlxaJuZZcShbWaWEYe2mVlGHNpmZhlxaJuZZcShbWaWEYe2mVlGHNpmZhlxaJuZZcShbWaWEYe2mVlGHNpmZhlxaJuZZcShbWaWEYe2mVlGHNpmZhnxZ0TWycwFC2meeHNPl7FMmO/P4rRezCNtM7OMOLTNzDLi0DYzy4hD28wsIw5tM7OMOLTNzDLSa0Jb0n6SQtIG6XmzpEWSWiX9WdLFkvqmvoGSLpU0U9IsSVMlrZT61pR0vaQ5kuZJ+pmkfqlvp3SMfUvHvUnSTvV/xWa2LOo1oQ2MB6amr23mRcQYYDSwJnBQaj8SeCEiRkfEJsBhwLuSBFwDXBcRo4D1gJWAk0v7fAY4sTtfiJlZLb0itNMoeXuK8D2ksj8iFgMPAMNTUxOwoNT/aES8DXwB+HtEXFDa7mjg65IGptVnAAsl7dpNL8fMrKZeEdrAOODWiHgMeEXSluVOSSsAWwO3pqbzgR9KmiZpsqRRqX1jYHp524h4HXgKWLfUfDJw0pKKknS4pBZJLYvfWrg0r8vM7CN6S2iPBy5Py5fz4RTJOpJagReA5yLiYYCIaAVGAqcCQ4EHJW3Y0YNFxBQASdsvYb3zImJsRIztM3Bwx1+NmVkN2f/tEUlDKaY1RksKoA8QwNmkOW1Jw4B7JH0xIm4AiIg3Keavr5H0PrAXxdTHgRX7Xxn4DDAX2KrU1Tbafq87X5+ZWVlvGGkfCFwSEWtFRHNEjACeAEa0rRARLwMTgeMBJG0naUha7gdsBDwJ3AEMlPSV1NcHOA24MCLeKh80Im4DhgCbdvPrMzP7QG8I7fHAtRVtV5MCuuQ6ikDeAVgH+D9JM4GHgBbg6ogIYH/gS5LmAI8BfwdOqHHskyl9czAz624qcsq6W/+mUdE04YyeLmOZ4D/NarmTND0ixlbr6w0jbTOzZYZD28wsIw5tM7OMOLTNzDLi0DYzy0j2v1yTi9HDB9PiuxrM7BPySNvMLCMObTOzjDi0zcwy4tA2M8uIQ9vMLCMObTOzjDi0zcwy4tA2M8uIQ9vMLCP+e9p1IukN4NGerqODhgEv93QRHZRLrbnUCfnUmkud0Pla14qIVat1+NfY6+fRWn/UvNFIanGtXSuXOiGfWnOpE7q2Vk+PmJllxKFtZpYRh3b9nNfTBXSCa+16udQJ+dSaS53QhbX6QqSZWUY80jYzy4hDuw4k7SHpUUlzJU1sgHrmS5opqVVSS2obKul2SXPS1yGpXZLOTLU/LGmLbq7tfEkvSppVaut0bZImpPXnSJpQx1onSVqQzm2rpL1KfcenWh+VtHupvVvfH5JGSLpL0p8lzZZ0ZGpvuPPaTq0NdV4lrSDpAUkzUp3/ntrXlnR/OuYVkvql9v7p+dzU37yk+muKCD+68QH0AeYBI4F+wAxgox6uaT4wrKLtx8DEtDwR+O+0vBdwCyBgG+D+bq5tR2ALYNbS1gYMBR5PX4ek5SF1qnUScGyVdTdK//b9gbXTe6JPPd4fQBOwRVoeBDyW6mm489pOrQ11XtO5WSkt9wXuT+fqSuCQ1H4u8O20/B3g3LR8CHBFe/W3d2yPtLvfVsDciHg8It4BLgfG9XBN1YwDLkrLFwH7ldovjsJ9wCqSmrqriIiYArz6CWvbHbg9Il6NiL8CtwN71KnWWsYBl0fE2xHxBDCX4r3R7e+PiHguIv6Ult8AHgGG04DntZ1aa+mR85rOzZvpad/0COALwFWpvfKctp3rq4BdJKmd+mtyaHe/4cDTpefP0P6bsB4CuE3SdEmHp7bVI+K5tPw8sHpaboT6O1tbT9d8RJpWOL9tyqGdmupaa/qxfHOKkWFDn9eKWqHBzqukPpJagRcpvoHNA16LiPeqHPODelL/QuBTS1OnQ3vZtH1EbAHsCXxX0o7lzih+bmvI24oaubbkHGAdYAzwHHBaj1ZTImkl4GrgqIh4vdzXaOe1Sq0Nd14jYnFEjAHWpBgdb1CP4zq0u98CYETp+ZqprcdExIL09UXgWoo33Att0x7p64tp9Uaov7O19VjNEfFC+s/8PvBLPvxRt0drldSXIgQvjYhrUnNDntdqtTbqeU21vQbcBXyOYiqp7c+DlI/5QT2pfzDwytLU6dDufg8Co9JV5X4UFyFu6KliJK0oaVDbMrAbMCvV1HY3wATg+rR8A/CVdEfBNsDC0o/U9dLZ2n4P7CZpSPoxerfU1u0q5vv3pzi3bbUeku4iWBsYBTxAHd4fae70V8AjEfHTUlfDnddatTbaeZW0qqRV0vIAYFeK+fe7gAPTapXntO1cHwjcmX66qVV/bV11NdWPdq8070VxFXwecGIP1zKS4mr1DGB2Wz0U82t3AHOAPwBDU7uAs1PtM4Gx3VzfZRQ//r5LMb932NLUBnyd4qLOXOBrdaz1klTLw+k/ZFNp/RNTrY8Ce9br/QFsTzH18TDQmh57NeJ5bafWhjqvwKbAQ6meWcC/lv5/PZDOz2+B/ql9hfR8buofuaT6az38G5FmZhnx9IiZWUYc2mZmGXFom5llxKFtZpYRh7aZWUYc2mZmGXFom5llxKFtZpaR/wdLp4RSI7v7BwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# target analysis\n", + "target_count = y_train.value_counts()\n", + "target_count.index = [target_mapping_[i] for i in target_count.index]\n", + "target_count.iloc[::-1].plot(title=\"crime category\", figsize=(3 * 1.6, 3), kind=\"barh\");" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "58020a2e", + "metadata": {}, + "outputs": [], + "source": [ + "steps = [\n", + " (\n", + " \"ConvertColumnDatatype\",\n", + " ConvertColumnDatatype(columns=[\"Dates\"], datatype=\"datetime64[ns]\"),\n", + " ),\n", + " (\"OrdinalHourOfDay\", OrdinalHourOfDay(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfWeek\", OrdinalDayOfWeek(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfMonth\", OrdinalDayOfMonth(columns=[\"Dates\"])),\n", + " (\"OrdinalMonthOfYear\", OrdinalMonthOfYear(columns=[\"Dates\"])),\n", + " (\"CyclicHourOfDay\", CyclicHourOfDay(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfWeek\", CyclicDayOfWeek(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfMonth\", CyclicDayOfMonth(columns=[\"Dates\"])),\n", + " (\"CyclicMonthOfYear\", CyclicMonthOfYear(columns=[\"Dates\"])),\n", + " (\n", + " \"Contains\",\n", + " Contains(\n", + " columns=[\"Address\", \"Address\", \"Address\"],\n", + " contains_vec=[\"/\", \"AV\", \"ST\"],\n", + " column_names=[\"IsIntersection\", \"IsAvenue\", \"IsStreet\"],\n", + " ),\n", + " ),\n", + " (\"DropColumns\", DropColumns(columns=[\"Dates\", \"Address\"])),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=2, min_samples_leaf=300), inplace=True\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.01)),\n", + " (\"Encoder\", TargetEncoder()),\n", + "]\n", + "pipe = Pipeline(steps=steps)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "03f09d44", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAANEAAACxCAYAAABazli1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAVSElEQVR4nO3de3RU1dnH8e8vCRAEFYRwB6NWBVRAC4hXFLVapdWqVVtUqLfaqgUVtZX62vouaxVF+rZeFoqKiFaXoq2IFFDbogUREUHkIpSIFDEgIGAikOR5/zg7OBlnyOUkmYQ+n7VYzOx9zp59kvnl7HOyMo/MDOdczWVlegLONXYeIudi8hA5F5OHyLmYPETOxeQhci4mD5FzMXmIXI1J+rukTZKaJbQ9IWmHpG2SNkqaIal7Qn9TSfdJWhO2KZA0NmncYZIWSSqStE7SQ5JaJfT/RpJJuiChLSe05dfpQafgIXI1Et6sJwAGfD+p+x4zawl0Bv4DjE/o+xXQF+gP7A2cBMxPGPdG4G7gJmBfYACwPzBDUtOEcTYCv5WUXWsHVUMeIldTlwJzgCeAoak2MLNi4DmgT0JzP+BFM1trkQIzexJA0j7Ab4HrzGyame00swLgAiAfuDhhnGnAjqS2jPAQuZq6FJgU/p0uqX3yBpJaAD8CViQ0zwFukPRzSUdIUkLfsUAuMDlxHDPbBkwFTktsBm4DbpfUpBaOp8Y8RK7aJB1PtMR6zszeBVYCP07YZKSkzcBW4HjgkoS+u4iWa0OAecB/JJWfydoCG8ysJMXLfhr6dzGzvwLrgSviHlMcHiJXE0OB6Wa2ITx/mopLunvNrBXREqwYOLS8w8xKzewBMzsOaAXcCTwmqQewAWgrKSfFa3YM/cl+DYwiOoNlhIfIVYuk5kTXKAPDnbN1wPVAb0m9E7c1s9XAcOAPYT+S+ovN7AFgE9ATmA1sB85Nes2WwHeB11KMMYNoufjzWji8GvEQueo6BygletP3Cf96ALOIrpMqCG/ytcBVAJJGSDpJUvNwW3oo0V2698zsC6IbC3+UdIakJuEu4HPAGmBimjmNAm6urQOsLg+Rq66hwONmttrM1pX/A/5EdJ2Taik2Grg5/D6pCLgPWEe0PLsGOM/M/g1gZvcAtwL3AluAt4FPgFPMbHuqCZnZW8DcWjzGapH/UZ5z8fiZyLmYPETOxeQhci4mD5FzMaW6k+L2IM8NON7vHNWCC+a8qXR9fiZyLiYPkXMxeYici8lD5FxMHiLnYvIQOReTh8i5mDxEzsXkIXIuJg+RczF5iJyLyUPkXEweIudi8hA5F5OHyLmYPETOxeQhci4m/8tWV6c6DDiaPtcPR1lZrPrrFJZOfKpC/0E/OJuDzjsXKyujpLiYd++6hy0FBSg7m363/pJWhx5CVk42BVOnsfTJp9K8SmY16jORpHxJxZIWpOnvLmm2pO2SRia0d5X0hqQPJS2WNDyhb7SkpZIWSnoxsbhUwja5kuZKej/s/9uEvkGS5kv6QNKENJ8rnThWJ0nPV+FYfyhpSZj3EZKeqGyfTFNWFkeNvIFZ14/kbz+6mG7fOZV98vMrbPPx32Yw/eKhzLj0Jyx7ahK9h18HQNdTBpHVtEnUN/RyDvrB2ezVsUMGjqJyjTpEwUoz65OmbyPwC6JP00xUAtxoZj2JikhdI6ln6JsBHG5mvYDlREWpkm0HBplZb6KP0T1D0gBJWcAE4CIzOxz4mDS1e8qFOj3nV3KMAJcDV5rZyWa2COgiqVsV9suY/Xr2YNuaNXy5di1lJSWsnjGTTiceX2GbkqKiXY+zc5sTVUwBMyOneXOUnU12s2aU7Syh5Msv63P6VbYnhCgtMys0s3eAnUntn5rZ/PB4K7CEqKobZjY9obTHHKBLinEt1MwBaBL+GdAG2GFmy0PfDOC83c0xnE0/CI+HSZosaZqkjyTdE9r/h6hEyXhJo8OuLwMXVfVrkQnN8/IoKizc9by4cD3N8/K+sd23zjuXM59/lt7X/oz3xowFYM3rb1BSXMz3przE4L+8wLJJz7Bjy9b6mnq17NEhqorwgelHEn3mc7LLgFfT7JcdlpGFwAwze5vos6VzJPUNm50PdK3mlPoAFwJHABdK6mpmdxDV8hliZjeF7eYRlXtMNberJM2TNG9m4bpqvnz9W/HCZKaefyELH3iYnsOiE/d+h/XEysp4efA5vHLuDznkxxfRolOnDM80tf/qEIWSHS8AI8xsS1LfKKJl36RU+4Y6O32IzlT9JR1u0QebXwTcL2kuUZGr0mpO6zUz+8LMvgI+JCqmlUohkPJdZWbjzKyvmfU9tV3mriOK169nr3btdj1v3i6P4vXr026/esZMOg2Mfi7s/53TWDf7bay0lO2bNvP5wkW07tE97b6ZtEeFSNI1khaEf7v9sRVKFL4ATDKzyUl9w4DBRD/5d/u5bWa2GXgDOCM8n21mJ5hZf+CfRNdV1ZFY+aCU9HdQc4kKaDVYG5cspWXXrrTo2JGsnBy6nXYqa2e9VWGbll2/Xi13PO5Ytn2yBoCizz6jXd+jAMjOzWW/w3uy9eOP62/y1bBH3eIOBaMeqGy7UCd0PLDEzMYk9Z1BVOtmoJkVpdk/D9hpZptD8arTiEooIqmdmRWGMiK3EFWCQ1J/4Foz+0YNnxo6BPiglsaqE1Zayvx7x3DiH8ZEt7invMKWVas47MrL2bR0KWtnvcW3zj+P9v36UlZSws6tW5l7x50ArHh+Mv1+fSunPz0RBAVTpvLFipUZPqLU9qgQJZPUgejaYR+gTNIIouJUvYjqiC5KuD1+q5lNJaqz04yo5DvAHDO7OpzZHjWzM4lKH04I5d+ziGqXTgnj3CRpcGh/yMxeD+3dqN0zx8nAK7U4Xp1YN3sOr86eU6Ft8SPjdz1ecP8fUu5XUlzM7FG31encakujrk8UbgpMCbeTG7RwV22imS2shbGaAf8Ajk9TJHgX/xjh2rEnf4xwKbBvul+2NiRmdlNtBCjoBvyysgC5+tGol3Nm9gnVv4Xc6JnZR8BHmZ6HizT2M5FzGechci4mD5FzMXmInIvJQ+RcTB4i52LyEDkXk4fIuZg8RM7F5CFyLiYPkXMxeYici8lD5FxMHiLnYmrUf5TnKrdu3ef+Da4FHTq02WP/KM+5jPMQOReTh8i5mDxEzsXkIXIuJg+RczF5iJyLyUPkXEweIudi8hA5F5OHyLmYPETOxeQhci4mD5FzMXmInIvJQ+RcTI26PpFrXN5+ew5//ONYyspKOeus7zFkSMXytc8++wyvvPIy2dnZtGrViltuuZUOHTpmaLZV1+jORJKaS/pHqJea3He1pEoLC0t6RtJCSddX43WvlbRCkklqm9A+JIy1SNK/JPUO7V0lvSHpQ0mLJQ2vZPx+kkoknZ/Q1k3SdElLwjj5of3Pkg6u6twbgtLSUsaOvZd77rmPCROe5rXXZlJQsKrCNgcffAjjxj3G449PZODAk3n44QczNNvqaXQhAi4DJptZaXKHmT1sZk/ubudQDLmfmfUys/ur8bpvAacCyXXgVxFVGj8C+F9gXGgvAW40s57AAOAaST3TzCmbqPr49KSuJ4HRZtYD6A8UhvaHiCqcNxpLlnxI585d6NSpM02aNGHQoFN5881ZFbY56qhvk5ubC0DPnoexfn1hqqEanLQhktRtN30n1M10qmQI8JdUHZJ+I2lkePx3SXdLmitpecKcpwOdJS2oznGY2XtmVpCi/V9mtik8nQN0Ce2fmtn88HgrsATonGb464AX+DokhMDlmNmMMMY2MysK3bOAUyU1muX4hg3radeu/a7neXl5bNiwPu32U6dO4eijB9TH1GLb3Zno75JuTlw2SWov6SmgOj/Ba42kpsCBqd7MaeSYWX9gBHB7aPs+sNLM+pjZrLR71szlwKvJjWEZdiTwdoq+zsAPiM4uiQ4BNkuaLOk9SaPLvxdmVgasAHrX7vQbhunTp7Fs2VIuumhIpqdSJbsL0beBg4AFkgaFNf1cYDbR0iIT2gKbq7H95PD/u0B+bU8mkaSTiUJ0S1J7S6KzzAgz25Ji17HALSEYiXKAE4CRQD/gQGBYQn8h0CnNXK6SNE/SvIkTJ1T/YOpA27Z5FBZ+tuv5+vXrads27xvbzZv3DhMnTuB3v7ubpk2b1ucUayztciAsUX4awjMTWAsMMLM19TW5FIqB3PInku4EzgIwsz4ptt8e/i+lmnciJf0NaA/MM7MrKtm2F/Ao8F0z+zyhvQlRgCaZ2eQ0u/cF/iwJoh8SZ0oqAdYAC8zs32Gsl4iurcaH/XKJvh7fYGbjCNdmDeUjs7p378GaNWv49NO1tG2bx+uvz+S2235TYZvly5dx3313M3r0/bRuvV9mJloDad9YkloRXeweDZwBnAm8Kmm4mb1eP9OryMw2ScqWlGtmX5nZKGBUnDElXRvG/lPSa51exf27EZ3xLjGz5QntInrDLzGzMen2N7MDEvZ5AphiZi+FpVsrSXlmth4YBMxL2PUQ4IOqzLEhyMnJYcSIGxg58nrKyko588zBHHDAgYwf/wjdu3fnuONO4OGHH6C4uJjbb/81AO3ateeuu+7J8Mwrt7ufzvOBB4FrzKwEmC6pD/CgpI/N7Ef1McEUpgPHE50da0N3ojtvuyXpF0R3xDoACyVNDWeo/wHaEH1dAErMrC9wHHAJsEjSgjDMrWY2VdLVEN1NTPd6ZlYabpK8FgL5LvBImEt7oNjM1tXkgDNlwIBjGTDg2Aptl19+5a7HY8b8X31PqVak/QRUSV3SLd0kXWlmj9TpzNKQdBRwvZldUkvjTQHONbMdtTFefQi/39piZuMr27ahLOcau919AururonSXvtkKkDhteeHX2Jmp/pdUQ3GG1wb86pnm4GJmZ6Ei/hnce/h/ExUO/yzuJ2rQx4i52LyEDkXk4fIuZg8RM7F5CFyLiYPkXMxeYici8lD5FxMHiLnYvIQOReTh8i5mDxEzsXkIXIupkbzkUuuZp6aubzyjVylRl58TNo+PxM5F5OHyLmYPETOxeQhci4mD5FzMXmInIvJQ+RcTB4i52LyEDkXk4fIuZg8RM7F5CFyLiYPkXMxeYici8lD5FxMHiLnYvIQOReT/2WrqzP5HVsxqF8+kli04jPmLl5bob9Lu705uW8+ea1aMOXN5SxfvRGAfVo05eyBhyJEVpZ4b9k63v/os0wcQpXUyZlIUr6k4oSCv8n93SXNlrQ9FPctb+8aSkl+KGmxpOEJfaMlLZW0UNKLobp5utfPlvReqMda3iZJd0paLmlJKGRcnWM6UdJ8SSWSzk9o7xOOZXGY24UJfZMkLZP0gaTHJDVJMe7+YdwFYYyrE/ouDGMulnR3Qvu1ki6rzvzrmwSn9j+AF15fwuMvL6B7flva7Nu8wjZbvtzBq/9ayZKCDRXatxXv5OlpH/Dk1IVMmraI/od1okXzb3zpGoy6XM6tNLM+afo2Ar8A7k1qLwFuNLOewADgGkk9Q98M4HAz6wUsB361m9ceDixJahsGdAW6m1kP4M9VPI5yq8MYTye1FwGXmtlhwBnA2ISATyKqTn4E0By4IsW4nwLHhK/V0cAvJXWS1AYYDZwSxu4g6ZSwz2PAddWcf73q0KYlm7Z+xRfbtlNWZiwt2MBBXVpX2GbLl9vZsLmI5JKnZWVGaVnUlp2VRajK3mBl5JrIzArN7B1gZ1L7p2Y2PzzeShSEzuH5dDMrCZvOAbqkGltSF+As4NGkrp8Bd5hZWfkcqjnnAjNbCJQltS83s4/C47VAIZAXnk+1AJibas5mtsPMtoenzfj6e3Ig8JGZrQ/PZwLnhX2KgAJJ/atzDPVp772asrVo+67n24p2sPdezaq1/9CzevHTc49i7uL/8GXxzsp3ypAGe2NBUj5wJPB2iu7LgFfT7DoWuJmkNztwEHChpHmSXpV0cC1NdZfwpm4KrExqbwJcAkxLs19XSQuBT4C7QxhXAIeGpXEOcA7RmbTcPOCENONdFY5z3pzXX4p3UBmytWgHE15ZyKN/eY/DDmzHXrn/ncu5GpPUEngBGGFmW5L6RhEt+yal2G8wUGhm76YYthnwlZn1BR4hWhLV5pw7AhOBn5Sf7RI8CPzTzGal2tfMPgnL1G8BQyW1N7NNRGfPZ4FZQAFQmrBbIdApzXjjzKyvmfUdMOicGEdVc1uTzjwtk85MVfVl8U42bC6iS7u9a3N6tapeQiTpmnDhvEBSym98wrZNiAI0ycwmJ/UNAwYDQyx5IR05Dvi+pAKia55Bkp4KfWuA8vFeBHpVMo87y+e824OLtt0HeAUYZWZzkvpuJ1re3VDZOOEM9AHhDGNmL5vZ0WZ2DLCM6FqwXC5QXNmYmbLu82203juXfVs0IytLdM9vy8o1m6q0b8u9mpKTHb01mzXNpnO7vdm45au6nG4s9XKL28weAB6obDtFV5DjgSVmNiap7wyiZdrAcE2Q6nV+RbjhIOkkYKSZXRy6XwJOBlYBAwlvyLAEu9bMLk0aaxQwqgpzbkoUyifN7PmkviuA04luDiSfncq36QJ8bmbFkloDxwP3h752ZlYY2n8OXJCw6yHAW5XNL1PM4LV3VnHeKT3Ikli0spDPvyjmuF5dWbdxGyvXbKJDmxacfeKh5DbL4aAurTm2V1eemPI+bfZpzknf3h8DBMz7cC0bNqf8ljcISv0DPeag0fXMFDM7PE1/B6I1/T5E1y7bgJ5EZ4dZwCK+vqa51cymSlpBtCT7PLTPMbOrw5ntUTM7M+k1TiIK0eDwvBXRErBbeL2rzez9cLv6NDP7aSXH1I8oLK2Br4B1ZnaYpIuBx4HFCZsPM7MFkkqAj4GtoX2ymd0hqW94/SsknQbcB7veM38ys3HhNZ8Beod97zCzXXcUJc0P8y7/eqR071Oza/8b/F9o5MXHpL1FmJEQNSSSRgMTw523RkHSkcANZnZJZdt6iGrH7kJUV9dEpcC+VbmeyDQzu6kxBShoC9yW6Um4SJ1cE5nZJ1S8HetqkZnNyPQc3Nca5C1u5xoTD5FzMXmInIvJQ+RcTB4i52LyEDkXk4fIuZg8RM7F5CFyLiYPkXMxeYici8lD5FxMHiLnYvIQORdTnfxRnnPVIemq8r/mbYz8TOQagqsyPYE4PETOxeQhci4mD5FrCBrt9RD4jQXnYvMzkXMxeYici8lD5DIiVMJYJWm/8Lx1eJ6f4alVm4fIZUT4bMKHgN+Hpt8D48ysIGOTqiG/seAyJlQAeZeozM2VQB8za7jVvNLwwscuY8xsp6SbiIqffacxBgh8Oecy77tEdWsbfPGDdDxELmMk9QFOIypyfX2oNtjoeIhcRoSCbg8RlRRdTVQpPbmafKPgIXKZciWwOqHCxYNAD0kDMzinGvG7c87F5Gci52LyEDkXk4fIuZg8RM7F5CFyLiYPkXMxeYici+n/AUp9WuTrkqpqAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for c in X_train.columns:\n", + " for i, name in enumerate(y_train_dummies.columns):\n", + " _ = pipe.fit(X_train.copy(), y_train_dummies[name])\n", + " pipe.steps[-1][1].display_mapping(cmap=\"vlag\", k=1, title=name)" + ] + }, + { + "cell_type": "markdown", + "id": "74c54d34", + "metadata": {}, + "source": [ + "#### adding polynomial object features" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0d05233c", + "metadata": {}, + "outputs": [], + "source": [ + "steps = [\n", + " (\n", + " \"ConvertColumnDatatype\",\n", + " ConvertColumnDatatype(columns=[\"Dates\"], datatype=\"datetime64[ns]\"),\n", + " ),\n", + " (\"OrdinalHourOfDay\", OrdinalHourOfDay(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfWeek\", OrdinalDayOfWeek(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfMonth\", OrdinalDayOfMonth(columns=[\"Dates\"])),\n", + " (\"OrdinalMonthOfYear\", OrdinalMonthOfYear(columns=[\"Dates\"])),\n", + " (\"CyclicHourOfDay\", CyclicHourOfDay(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfWeek\", CyclicDayOfWeek(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfMonth\", CyclicDayOfMonth(columns=[\"Dates\"])),\n", + " (\"CyclicMonthOfYear\", CyclicMonthOfYear(columns=[\"Dates\"])),\n", + " (\n", + " \"Contains\",\n", + " Contains(\n", + " columns=[\"Address\", \"Address\", \"Address\"],\n", + " contains_vec=[\"/\", \"AV\", \"ST\"],\n", + " column_names=[\"IsIntersection\", \"IsAvenue\", \"IsStreet\"],\n", + " ),\n", + " ),\n", + " (\"DropColumns\", DropColumns(columns=[\"Dates\", \"Address\"])),\n", + " (\"PlaneRotation\", PlaneRotation(columns=[[\"X\", \"Y\"]], theta_vec=[15, 30, 45])),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=2, min_samples_leaf=300), inplace=True\n", + " ),\n", + " ),\n", + " (\n", + " \"PolynomialObjectFeatures\",\n", + " PolynomialObjectFeatures(\n", + " columns=[\n", + " \"PdDistrict\",\n", + " \"X\",\n", + " \"Y\",\n", + " \"Dates__hour_of_day\",\n", + " \"Dates__day_of_week\",\n", + " \"Dates__day_of_month\",\n", + " ],\n", + " degree=2,\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.05)),\n", + " (\"Encoder\", TargetEncoder()),\n", + "]\n", + "\n", + "pipe = Pipeline(steps=steps, verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ec0df300", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO0AAADeCAYAAADRo4eMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdu0lEQVR4nO3deZgU1dXH8e+PTXZBYQYUZNwQQREj4gaKcU+MIhhMJKLGNWKMW9TEvComxKgY1KAoCi5EzWPcAwRR4wKKCyDKIoogi2zDjiyyzXn/qDukabpneqC7Z4qcz/PMQ9e9t26dBs7cW9XVdWVmOOfio1plB+CcqxhPWudixpPWuZjxpHUuZjxpnYsZT1rnYsaT1rmY8aR1lULSO5JWSNotoexJSRslrZG0XNIbktok1NeSdJ+kb0Ob2ZLuT+r3IkmTJa2TtEjSIEmNEurvkGSSeiaU1QhlRTl901niSevyLiRHF8CAs5Kq7zGz+sDewHxgSELd74COQCegAdAVmJjQ7w3A3cBvgd2Bo4FWwBuSaiX0sxzoK6l61t5UHnnSusrQG/gQeBK4MFUDM1sPPA90SCg+EnjZzBZYZLaZPQ0gqSHQF/i1mY0ys01mNhvoCRQBv0joZxSwMaksNjxpXWXoDTwTfk6TVJjcQFI94OfA1wnFHwLXS7pK0qGSlFB3LFAbeCmxHzNbA4wETkksBv4PuF1SzSy8n7zypHV5Jakz0ZT1eTObAMwEzk9ocqOklcB3QGfggoS6u4imv72A8cB8SaUjdRNgqZltTnHYhaF+KzN7DVgCXLqz7ynfPGldvl0IjDazpWH7WbadIvc3s0ZEU9r1wEGlFWa2xcweMrPjgEZAP2CopIOBpUATSTVSHLN5qE/2B+BWohE6NjxpXd5IqkN0jnlCuLK7CLgOOEzSYYltzWwu8BvggbAfSfXrzewhYAXQFhgHbAC6Jx2zPnAG8FaKPt4gmn5flYW3lzeetC6fugFbiJKsQ/g5GBhDdJ67jZBUC4DLASRdK6mrpDrhY5oLia4if2pmq4guRP1N0umSaoar1M8D3wLD0sR0K3BTtt5gPnjSuny6EHjCzOaa2aLSH2Ag0XlqqqntvcBN4fPcdcB9wCKi6W4foIeZzQIws3uA3wP9gdXAR8A84CQz25AqIDN7H/g4i+8x5+RfgncuXnykdS5mPGmdixlPWudixpPWuZjxpHUuZlJdYne7kOeP7eIfD8RUzw/GKFW5j7TOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560GZLUQtKrkmZIminpAUmnSZoUftZI+jK8fjo8VHt4Uh9PSjo3vH4nof0kSS+E8jskzQ9l0yT9PGH/oyV9FOq+kHRHXv8S8qjZUZ04/blnOOP552hzQa+07fbuegI9PxhD4zbR6iGFR3bk5KGPc+qwJzl56OMUHPGDfIWcN/7kigyE1dleAgaZ2dlhXdPBwMlm1iG0eQe40czGh+2uGXTdq7R9kgFm1l/SgcAESS+Y2SbgKaCnmX0WYjgoxb6xp2rV+MGN1/Pub65jffESTh7yGAvGvM/q2bO3aVejbh1a9zyXZVOmbi3bsGoVY2+6me+XLqPhfvty/ID7GH52d3YlPtJm5ofA92b2BEQLQRGtQfNLSXVzdVAzm0H0VP3GoaiAaAW40sWopuXq2JVpj7YHs+bb+axdsJCSzZuZ++Zb7NWl83btDrnsUqb//Vm2bNy4tWzlVzP4fukyAFbP+obqu+1GtZqxW82yTJ60mWkHTEgsMLPVwFzggDL265Iw/Z3E9queP5NQf2/yzpJ+AMwws+JQNAD4UtLLkq6QFKvV3jJVp2lT1i0u3rq9fskS6jTdZqVKGrVuTd2CAhZ+MC5tPy1O7MrKL7+iZNOmXIVaKXx6nFtjzOzM0g1JTybVp5seXyfpYqA18JPSQjO7U9IzwKlEa7r+HOia7aCrPIkO11zNx3/6c9omDfctov1VV/LutdfnMbD88JE2M9OAIxILJDUE9mHblcqzZYCZtQN6AEMSR1Qzm2lmg4CTiJaI3DN5Z0mXSxovafybixflILzcWr9kCXULC7Zu12nalPVL/ru8bM26ddl9v3058aEH+fGLz7Nnu7Z0vvsvWy9G1WnalOPu+jMf3dmPtfMX5D3+XPOkzcxbQF1JvQHCRaD7gCfNbF2uDhpWKx9PWHRZ0o/DRTGAA4mWjVyZYr/BZtbRzDqeXNgsV+HlzPIvplO/RQvqNW9OtRo12Ofkk1gwduzW+k1r1/Lqj37CiB49GdGjJ8umTmPszbewYvqX1Kxfny797+HzQY+wbPLkSnwXuePT4wyYmUk6B3hY0v8R/bIbSbSs4s54RtL68HqpmZ2cos2dwLOSHgMuAAZIWgdsJppeb9nJGKoc27KFiX8dwPED7kPVq/HN8BGs/mY27S69hBXTp7Ng7Ptp9z3g3O7Ub7E3bS++iLYXXwTAe9ddz4YVK/MTfB74Upe7OH9YeXz5w8qd20V40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zM+JMrdnHfzZnt/8Ax1aBVkT+5wrldgSetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczNTIpJGk7imKVwGTzaw4uyE558qSUdIClwDHAG+H7a7ABGBfSXea2bAcxOb+h33wySf0H/QIJSVb6Hb6GVz0s/O2qf/7Cy/y6qhRVK9enca7785tN1xP88JCADqdfgYHFBUBUFhQwIA7++Y7/JzKdHpcAzjYzHqYWQ+gLWDAUcDNqXaQVCRpvaRJaerbSBonaYOkG5PqhkoqljQlqfyPkj6XNEnSaEl7pei3Q+h3amh7XkLdk5K+CftPktQhw/dfuv/xkiZK2izp3KS6UZJWShqeVD5E0mchlhck1U/R7ymSJkiaHP78YSivK2mEpOnh/fwlYZ+rJf2yIvHHxZYtW7h74EM82O9P/POxx3j9nbeZNWfONm3aHLA/wwb+jX88+ggndenMg48/vrVut1q1ePaRQTz7yKBdLmEh86RtaWaLE7aLQ9lyYFMZ+800sw5p6pYD1wD9U9Q9CZyeovxeM2sf+hwO3JaizTqgt5m1C33cL6lRQv1vzaxD+JlURuypzAUuAp5NFRtwQYry68zsMDNrH/a/OkWbpcBPzOxQ4EIgcebS38zaAIcDx0k6I5QPBX5dwfhjYeqXX9Jyr71o0bw5NWvW5NQTuvLuB+O2adOxQwdq164NwCEHH8ziJUsrI9RKken0+J0wgvwzbJ8byuoBK3fkwOFcuFjSj1PUvSepKEX56oTNekSjfXKbrxJeL5BUDDTd0TiT+p4NIKkkRd1bkrqmi1mSgDppYv40YXMqUEfSbma2jnBKYmYbJU0EWoTtdZJmS+pkZh/v5FurUoqXLqOwadOt2wVNmzBl+vS07V8dNYpjjzxy6/bGjRu5oM/VVK9enYvOO4+uxx2b03jzLdOk7QN0BzqH7aeAFy16KtyJuQgsHUn9gN5EF8LKPLakTkAtYGZCcT9JtwFvAbeY2YZcxZoQxxPAj4BpwA3lNO8BTEyOK8wWfgI8kFA8HugC7FJJWxEj33yLL76aweD+924t+9ffh1HQpAnfLlzIr266mQP2LaLFXtudScVWRtPjkJzjgRFmdh0wEtju3CwfzOxWM2sJPEPqqSYAkpoTTTMvNrPSkfF3QBvgSGAP0pyPZ5uZXQzsBXwBnJeunaR2wN3AFUnlNYDngAfNbFZCVXHoN7mfyyWNlzT+iWdTzeSrtoIme7J4yZKt28VLllKwZ5Pt2n00cSJDn3uOv/btS61atRL2j9q2aN6cI9q3Z/rXM7fbN84ySlpJlwEvAI+Gor2BVypyIEl9Ei4AZePX3jNEo1KqYzUERgC3mtmHpeVmttAiG4AngE7lxNyvNOadDdbMtgD/KCPmFsDLROfjyf/LBgMzzOz+pPLawPoUxxpsZh3NrOPF55+/s6HnXduDDmLe/PnMX7iITZs2Mfrddzj+mKO3aTP966/58wMP8tc7+7JH40Zby1d/9x0bN24EYOWqVXw2dSr7tdonn+HnXEWmx52AjwDMbIakgoocyMweAh6qWHjbknSgmc0Im2cD253oSKpF9J//aTN7IamuuZktDOeX3YApobwTcLWZ9U6K+Vbg1p2IV8D+ZvZ1eH1WmpgbEf2SucXM3k+q+xOwO3BpikO0Bt5PUR5rNapX57dX9+HXv/89W0pKOOu0U9m/qIhHnnqKg1u35oRjjuHBxx5j/fr13PLHPwH//Wjnm7lz+fMDD1KtmigpMS487zz2a9Wqkt9RdmX0sHJJH5nZUZI+NbPDw3RtYrgimm6fImC4mR2Spr4Z0ZS7IVACrAHamtlqSc8RfRbcBFgM3G5mQyS9CBwU2s8BrjSz+ZI6hteXSvoF0Sg6NeFwF5nZJEn/IbooJWBS2GdN+PjmFDPbZlqaIuYjiX4hNAa+BxaFq9RIGkM09a4PLCP6bPsNYEx4jwI+A34V3uNZQEczu03SH4im7jMSDncq0fn4PKJELz3HHWhmj4djTgxxL0sXsz+sPL7SPaw806S9h+jqa2+ijxmuAqaFkSjdPkWUkbRViaR7gWFm9nllx5IpSYcD15tZqo+ZtvKkja+dTdpqRCPHqUQjxuvA41bGzpJaAh8Ay8r4rNbtIEmnEJ3nzi6rnSdtfO1U0rr48qSNr3RJW+aFKEmTSXEzQKmyzmmdc7lR3tXjM8OffcKfpbfX/YIyktk5lzuZntN+amaHJ5VNNLMf5CwylxU+PY6vnV3qUpKOS9g4tgL7OueyqCLfpx0qaXeiq8crgF3ya2HOVXUZJa2ZTQAOC0mLma3KaVTOubQqOsU9FLgkfEbonKsEZSatpI8TXl8GDAQaAHdIuiXHsTnnUihvpK2Z8Ppyovtc+xLdGdUrZ1E559Iq75y2mqTGRMktM1sCYGZrJW3OeXTOue2Ul7S7Ez11UYAlfLWtfihzzuVZmUlrZkVpqkqAc7IejXOuXBW+QULSVWa2zsy+yUVAzrmylfeFgeuTi4DfSaoNYGZ/zVVgzrnUyhtp+xI9kLw+0Uc99YHq4XWD3IbmnEulzC8MSNoHuA+YBfQNz9qdZWb75StAt3M2rVvnXxiIqZp161b8CwNmNtfMfkr0BIo3kpfCcM7lX6bPPX6V6IaKo4BvcxqRc65MWXncjKQXw8Jcrorx6XF87dD0uAL8HNe5PMlW0vpvc+fyxJ8+4VzMZCtp/T5k5/Ik0wW4tlu3R9JBCZt5WX3OOZf5SDtGUs/SDUk3EK1pA4CZjc52YM651DJ9sFtXYLCknwKFROuslrlMpHMuNzK9uWIhMAo4BigCnjKzNTmMyzmXRkYjraQ3gQXAIUBLYIik98zsxlwG55zbXqbntAPNrLeZrTSzycCxgD9G1blKkK3bGMeZ2TFZiMdlmd/GGF+5vo2xdpb6cc6Vw29jdC5mdrnbGCXVkfSupOop6q6U1DuDPp6T9Lmk6ypw3KslfS3JJDVJKG8jaZykDZJuTCivLeljSZ9Jmiqpb5p+r5Q0WdIkSWMltQ3lh0p6MtP44mbs++9zZrdunHHWWTw+dOh29U8NG8ZZ3btzTs+eXHLFFSxYsACA6V9+Sa/evTm7Rw/O6dmTf7/+er5Dz7lsndNutxRmZZHUB6hhZg/s4P7NgLFmdkAF9zucaGGyd4COZrY0lBcArYBuwAoz6x/KBdQzszWSagJjgd+Y2YdJ/TY0s9Xh9VnAVWZ2eth+E/ilmc1NF1ccz2m3bNnCj7t147FBg2hWWMh5vXpx7113sf/++29t8/Enn3DoIYdQp04d/vH883wyYQL33X03s+fMQUCrVq0oLi6mZ69evPbSSzRsEL+nI+3QOa2kQZIaZtD/BTsUVW70Al5NVSHpjtLRTtI7ku4Oo91XkrqEZqOBvcPI1iVVP6mY2admNjtFebGZfQJsSiq3hM+6a4af7RKsNGGDeklt/gX8LNMY42LylCns07IlLVu0oGbNmpxx2mn85513tmnT6cgjqVOnDgCHtW/P4sWLAShq1YpWrVoBUFBQwB6NG7Ni+fK8xp9r5U2PZwETJJ1fViMzm5K9kHacpFrAfqmSJ40aZtYJuBa4PZSdBcw0sw5mNib7Uf6XpOqSJgHFwBtm9lGadn0kzQTuAa5JqBoPZPyLJS6Ki4tpVli4dbuwsJDiJUvStn/plVfoctxx25VPnjKFTZs307Jly5zEWVnKe0bUvUS3MJ4t6S1J50rqXvqTlwgrpgmwsgLtXwp/TiC60yuvzGyLmXUAWgCdJB2Spt1DZrY/0Rcz/pBQVQzslfNAq7B/jRjB1GnTuPjCC7cpX7JkCb/7wx/40x13UK3arnXpptx3Y2bzgRFAa+AnCT9n5ja0HbKehI+fJPUL09xJadpvCH9uIfP7sEv7fj30/fgORZrAzFYCbwOnl9P0H0TnxqVqE73n5NgulzRe0vhUF3GquoKCAhaF6S7A4sWLKWjadLt24z78kMFDhvC3+++nVq1aW8vXrFnDVddcwzV9+nBY+/Z5iTmfyntYeTtgENEtjJ3CPchVlpmtCFPO2mb2vZndCty6M31Kujr0PTDpWKftZL9NgU1mtlJSHeAU4O4U7Q40sxlh88fAjITq1sB2pyZmNhgYDPG8EHVIu3bMnTuXb+fPp7CggH+//jr33HXXNm2+mD6dvv368ejAgey5xx5byzdt2sRvbriBs848k1NP2TWXUS5vdPkE6Jbqq3eSuuT6nG8HjQY6A29mqb82wPvlNZJ0DXAT0Az4XNJIM7s0XI0eDzQESiRdC7QFmgNPhY+mqgHPm9nw0NedwHgzew24WtLJRBeyVgCJ88ATiWZBu5QaNWrw+5tv5oqrrmJLSQnnnH02B+y/PwMffph2bdtyYteu3DdgAOvWreP6m24CoHmzZgx84AFGjR7NhIkTWblyJa+89hoA/e68kzYHHVTWIWOlvIeVf0M00t5nZltCWSHRA8zbmFnHvERZAZJ+AFxnZlm5oi1pONDdzDZmo79skbQb8C7Q2czSLjsax5HWRXb0NsbDiZ60OEnSDyX9BvgYGEcV/T6tmU0E3k51c8UO9ndmVUvYYB/glrIS1u2aMrq5IiTrAKJz26PNzB9YHhM+0sbXjt5c0UjSo8DFRFc2XwD+LemH2Q/ROZeJ8s5pZwEPA/eXTsMkdQhlc8zs5/kI0u04H2njK91IW97V4+OTp8JmNgk4VtJlWYrNOVcBWfnCgKu6fKSNr1x/Cd45lyeetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMVOhh5m5+Hnolc8rOwS3g649/+iU5T7SOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMz4l+BdldSq+e6ccEQR1SSmzCxm/LQF29Tv3bQBJxxRRJNGdRn5/gy+nrd8a123rm1o3qQ+85d8x2vvfpnv0HOuUkZaSUWS1kualKa+jaRxkjZIujGpbqikYklTksr/KOlzSZMkjZa0V4p+W0maGNpMlXTlDsSe7vg/DX2WSOqYUN4pHG+SpM8knZOm32ckfSlpSjhGzVDeVdKqhD5uC+W1JL0naZf7xSvBiR335ZW3p/P0iM84qNWe7NGwzjZtvlu3kdEfzmT6nKXb7T/hiwWMGvd1vsLNu8qcHs80sw5p6pYD1wD9U9Q9SbQqfbJ7zax96HM4cFuKNguBY0Kbo4BbUiV3OdIdfwrQHXgvRXnHcMzTgUfTJNozQBvgUKAOcGlC3Rgz6xB+7gQws43AW8B5FYy/ymu2Z31Wrfme1Ws3UFJifDVnGfu3aLxNm9VrN7B05TpIsZDnvMWr2bSpJE/R5l+VPKc1s2Iz+wTYlKLuPaKkTi5fnbBZjxT/nGa20cw2hM3d2IH3X8bxvzCz7eZiZrbOzDaHzdqp4grtRloAfAy0yCCcV4BemcYeF/Xq1OK7tRu3bn+3biP16taqxIiqliqZtDtKUj9J84j+I6caaZHUUtLnwDzgbjNbkKpdluM6StJUYDJwZUISp2pbE7gAGJVQfEyYWv9bUruE8inAkTkJ2lVZu1TSmtmtZtaSaKp5dZo288ysPXAAcKGkwjzE9ZGZtSNKsN9Jql1G84eB98xsTNieCLQys8OAvxGNrqX9bgE2SmqQ2IGkyyWNlzT+g/+8QtysXb+RBvX+O7I2qFuLtes2lrHH/5YqkbSS+iRcaKnoOWYqzwA9ymoQRtgpQJcy4mqZEFeFL1qlOOYXwBrgkDTHux1oClyfsM9qM1sTXo8EakpqkrDbbsD3SccZbGYdzazjsT/strNh592iZWto1KA2DevtRrVqonWrPZk5f0Vlh1VlVIkrj2b2EPDQzvQh6UAzmxE2zwamp2jTAlhmZuslNQY6AwNC3dPAQDP7OCGueUCHnYxrX2CemW2W1IroYtPsFO0uBU4DTjKzkoTyZsBiMzNJnYh+0S4LdXsCS81su3P/ODODt8fP5pwT2yCJqbOKWb5qPUcf2oLi5WuZNX8FhXvU48zjW1O7Vg323bsRxxzagmEjo2c8//TktjRuWIdaNapzSbfDefOjWcxZuKqS31X2VImkTRb+o44HGgIlkq4F2prZaknPAV2BJpK+BW43syHAXyQdBJQAc4ArQ18dic4jLwUOBu6TZICA/mY2ORy2PVDu+W2644ePcv5GNFKOkDTJzE4j+sVwi6RNIbarzGxp6GskcGkY9R8JcY+TBPBSuFJ8LvArSZuB9cDPwsUqgBOBERX6y42J2QtWMnvBym3KPpz87dbXi5evZcgrn6bc959vTstlaJVO//33z+NBpSJguJmlnCbmm6SGwBAz+2llx1IRkl4CbjGzr9K1uf/ZD/P/D+yy4trzj1aq8so6p90C7J7u5op8C+eNcUvYWsArZSWs2zVVyvQ4nCu2rIxj7yrCzRVPV3YcLv+qxNVj51zmPGmdixlPWudixpPWuZjxpHUuZjxpnYsZT1rnYsaT1rmY8aR1LmY8aZ2LGU9a52LGk9a5mPGkdS5mPGmdixlPWudiplKeXOFctki63MwGV3Yc+eQjrYu7yys7gHzzpHUuZjxpnYsZT1oXd/9T57PgF6Kcix0faZ2LGU9a52LGk9ZlRVis7BtJe4TtxmH7e0mHJrT7raRHs3jcfSStkXRjQtlsSZPDwmnj0+xXJGlKtuLIpyq5lo+LHzObJ2kQ8Beiz07/QnSR6FPgYUnHA3sRrbHUMYuH/ivw7xTlJ5aumbSr8ZHWZdMA4OiwYFpnogXORgELgd6h/g4zS7lupaRzJL2lSHNJX4XF2FKS1A34BpiaSXCSjgiLc38G9Ekory7pXkmfSPpc0hWhvJqkhyVNl/SGpJGSzs3kWLnkSeuyJiy5+Vui5Lw2YQnOa4F+QFMzG1bG/i8TJXgf4DGiFQkXpWorqT5wM9A3VVfAaEkTJCXeMfUE8OuwQHeiS4BVZnYk0cLfl4UlSrsDRUBb4ALgmHSx55NPj122nUGUeIcAb0C0gLek/wDDM9j/10SLfX9oZs+V0e4OYICZrQlLgybqbGbzJRUAb0iaDnwONDKz90KbYSFWgFOB9gmj6O7AgUSzhX+G9YIXSXo7g/hzzpPWZY2kDsApwNHAWEn/MLOFobok/JSnRWhXKKla4gLbSY4CzpV0D9CIaB3j781soJnNBzCzYkkvA52IkjZt6EQj8OtJ7+dHGcSbdz49dlmhaLgbRDQtngvcC/SvYB81gKHAz4EvgOvTtTWzLmZWZGZFwP3An81soKR6khqE/uoRjaJTzGwlsFJS59BFr4TuXidauLtm2K912Pd9oEc4ty0kWky80vlI67LlMmCumb0Rth8GLpZ0gpm9m2EfvwfGmNnYcLHoE0kjzOyLCsRRCLwcpsw1gGfDxTCAi4GhkgwYnbDP40TnrhPDL58lQDfgReAkYBowD5gIrKpALDnhtzE6VwZJ9cN5857Ax8Bx6S6O5YuPtM6VbbikRkAt4I+VnbDgI62rBOEOqeSPfjaY2VEp2p4G3J1U/I2ZnZOr+Ko6T1rnYsavHjsXM560zsWMJ61zMeNJ61zMeNI6FzP/D5ZAi4wUu/BpAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAHiCAYAAAD8qecwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA1iUlEQVR4nO3dd3hUZfrG8e9DKAEBaQlNpYkgIEaJKxYQFduqu3ZldRF1f6hrRUV3rehaQAXsBRURG/aG7tqxAhoRFRBUBFFqgiggIJA8vz/mBCZDEkJMmMyb+3NdcznnLec8JxfeObxzmGPujoiIhKNGsgsQEZGKpWAXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhHAzOaaWd+47ZPMbJmZ7WdmbmY1o/YxZrbWzFZEr2lmdpOZbRs3d0A059KEY/xkZn0S2grHnpjQ3sfMCsxsZXScWWZ2WtTXNpqzMnrNNbN/xc11M9sxej8k2j4hrr9m1NY2ri3bzMZH5/yLmc0wsxvMrPEf+sFKUijYRRKY2anA3cDhwA/FDLnZ3RsAGcBpQE/gIzPbJm7Mz8ClZtZgM4c7NRrbv5i+Be5eH2gIXAY8YGZd4vobRf39gKvN7NASjvEzcK2ZpRXXaWZ7AxOAj4DO7t4IOBRYD+y6mfqlClKwi8QxszOB4cAh7v5xaWPdfY27fwr8BWhKLOQLfQ1MBC4q5VhtgP2AgcAhZtaihOO4u78ILAO6FNM/EZgOdCvhUP8D1gKnlNB/M/Cwu9/k7oujfc5z92vcfUJJ9UvVpWAX2ehs4DrgQHfPKeskd18BvAn0Sui6CrjQzJqUMLU/kOPuzxH7RXBycYPMrIaZHQ00Ar5K6DMz2wfoCnxeUolRLdeYWa2E+dsAewHPlTBXUpCCXWSjg4BJJIRnGS0AigS4u08lFviXlTCnP/BE9P4JNl2OaWVmvwB5wDXA3919Vlx/HrFllgeBf7n72yUV5+4vA7nAPxK6GhPLgUWFDWZ2c7TO/puZXVnSPqXqUrCLbHQ2sBPwoJnZFs5tTSxkE10NnG1mzeMbo6vsdsC4qOkJYBczy4obtsDdG7l7E3fPcvdxFNXM3Ru7+87ufkcZarwSuAJIj2tbBhQALQsb3P3SaJ39BaBmGfYrVYyCXWSjxcCBxJZU7inrJDOrD/QFPkjsc/eZwPPEAjXeqYABU81sETA5rr1SuPubwHfAP+PafouOfUxlHVe2PgW7SBx3X0As3A81s5GljTWzOmbWA3iR2JXvwyUMvZbYB6uNonnpwAnEPjTNinudB/yt8NbKSnIFcGlC26XA6Wb2LzPLjGrcjtjfKCQFKdhFErj7POAA4DjgpmKGXGpmK4ClwFjgM2Dv6Oq3uP3NAR4FCm+HPApYDYx190WFL2A0saWPkm5b/MPc/SPgk4S2D4mdb2/gm2hd/3/EboG8s7JqkcpjetCGiEhYdMUuIhIYBbuISGAU7CIigVGwi4gERsEuIhIY/auyrezpnvvqNiQRqRAnTPqw2H8hrSt2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMFUi2M1sZfTftmbmZnZeXN9dZjYgbvsiM5tpZl+Z2RdmNsLMakV9c82sWcK+B5hZrplNjXt1MbMaZnaHmU2L9vWpmbVL3I+Z5UdzpkfHu9jMakR9fczs14R99630H5gEo0XPPTn0qSc47JlxdP77KSWOa73/fpww6UMad+60FauTVFUVn6C0BLjAzO5397XxHWZ2FnAw0NPdfzGz2sBFQF1gXSn7fMrdz03YVz+gFdDd3QvMbDvgt2Lmrnb3rGhOJvAE0BC4Jur/wN2P2NKTFLEaNdj9kot47/xBrF6yhL4PP8iCDz5k+dy5RcbVrFeXnU44nqXTpienUEk5VeKKPUEu8DZwajF9VwBnu/svAO6+1t2HuvvychynJbDQ3Quiff3k7stKm+DuS4CBwLlmVuwjqUTKqkmXnVn500/8tmABBevXM+/Nt2jVe99NxnUb+H/MfPRx8teuLWYvIpuqisEOMAy4xMzSChvMrCFQ393nlGN/JyYsl9QFngaOjLaHm9luZdmRu38PpAGZUVOvhH13KEd9Ug3Vzchg1ZIlG7ZXL8mlbkZGkTGNOu1EveaZLPx44tYuT1JYlQz2KDwnA38raYyZHRIF6Vwz23szu3zK3bPiXqvd/SegE/BvoAB428wOLEe5HyTse3Y59iGyKTOyLjiPqXfclexKJMVUyWCP3AhcBhhAtNyysvADTnd/PVr7ngbULs8B3P13d/+vuw+OjnfU5uaYWXsgn9hnAWViZgPNLMfMct5asqg8pUqAVufmUi8zc8N23cwMVufmbtiuVa8e27Zvx/733MnhLzxD065d2PeWYfoAVTaryga7u88EZgBHxjXfBNxrZo0AonXu9PLs38x2N7NW0fsaQHfgh83MyQDuA+5ydy/rsdx9lLtnu3t238wW5SlXAvTz1zOpv/32bNOyJTVq1mSHg/qy4IOPNvSv++03Xjr0CF49+nhePfp4lk6fwYeDL2PZzFlJrFpSQVW8KybeDcDncdv3AtsAk83sd2Al8FHCmC/NrCB6/zTwJbE19vhPpf5J7M6WB8ysTtT2CVDc33nrmtlUoBawHngUGBHX3yvqL3S9uz9b5jOUasvz85ly6wh63z4Cq1GDOeNfZfmcOXT9vzNYNnNmkZAX2RK2BReeUgGe7rmvfuAiUiFOmPRhsXfnVdmlGBERKR8Fu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEpiq/mi84Ox+yXnJLkFEAqcrdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDCV8qANM2sKvB1ttgDygdxoe1fgi7jh49x9qJlNAOq7e3a0j2zgVnfvY2Z9gJeA74F6wGLgZncfH40dAvxf3DEA+gBZ0bw5QDow3t0vieYMALLd/dyE2vcFRgANo6YR7j4q7jgr3f1WMxsDHAS0d/ffzawZkOPubbfkZyXVW8433zLq1dcoKHAOzt6dE/brXaT/tcmfMn7yZGpYDerWqc15R/2FHTIzk1StpIpKCXZ3X0osVIuEYbS90t2zSpiaaWaHuft/i+n7wN2PiPaRBbxoZqvdvfAXyMjCYxQysw3zzKwu8LmZveDuHxV3cDNrATwBHOXuU6Kwft3M5rv7q8VMyQdOB+4t4XxESpRfUMC9r4zn+tNOpVnDhgy693567ty5SHD32XUX/rznHgBM+nomD7z2P/4zoH+ySpYUUdWWYm4BrtjcIHefClwHnLuZofFzVgNTgdalDDsHGOPuU6I5ecClwL9KGH8bMMjM9IhB2WLf/PQTrZo0oWWTJtSqWZPe3Xdh0tczi4ypl56+4f2atWuxrV2kpKRkBHtdM5sa9zoxrm8isNbM9i/DfqYAneO2B8Xt893EwWbWGOgIvF/KPrsCnyW05UTtxZkHfAj8vQz1ihSxdPkKmm277YbtZg0bsvTX5ZuMGz9pMmcMH8nDr7/BmUccvjVLlBSVjGBf7e5Zca+nEvqvB64sw34SL15Gxu0z/hdDLzP7ApgPvO7ui/5A7cW5CRhM1fvbjwTiiJ578tDFgzjtkIN5asJ7yS5HUkCVCyN3fweoC/TczNDdgK/LsMsP3H1XYlfdZ0Tr8yWZAfRIaOsBTC9pgrt/S2yJ54SSxpjZQDPLMbOccW++VYaSpTpo2rABeb/+umE7b/lymm7bsMTxvXfpxsQZZfkjL9VdlQv2yPXE1raLZWbdgauAu8u6Q3efAwwFLitl2N3AgMLwj+7uGQbcvJnd3wBcUsqxR7l7trtnn3RQ37KWLIHbqXVr5i/9mUU/L2Pd+vW8/+VX7Nm5c5Ex8/OWbnj/6axvaNW06dYuU1JQMj70q2tmU+O2/+fuRT6cdPfXzCy36DR6mdnnxG53XAKcH3dHDMTW2E+J2z6qmGPfB1xiZm2j7QFmFj+uJ3AK8ICZNSC23HObu79S2gm5+3QzmwLsXto4kXhpaWmcfeThXDVmLAVewEG7706b5pk8+tbbdGzdmp47d2b8pMlMnT2btBpp1K+bzkXHHZPssiUFmLsnu4Zq5btnn9IPXEQqxI7HnVjsjVJVdSlGRETKScEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhKYZDzztFrbdseOyS5BRAKnK3YRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwSX3Qhpk5MMLdL462LwHqu/uQaHsgcFE0fDlwkbt/GPVNAFoCa4C1wP9Fr32A2kA7YFY093rgCGC8uz8bd/yV7l7fzNoCX8eNJ6prrJnNBVYADiwD+rv7D2WpXyTRpKlTuX3MWAoKCjjigP35+1F/LdI/bvyrjH/nXdLSatCoYUP+fdaZtMjIYMq06dwx9tEN4+YtWMCQC86j9x57bO1TkBSQ7Cco/Q4cY2Y3uXtefIeZHQGcCezr7nlmtjvwopn9yd0XRcNOdvccMzsNuMXdD4rmtiUW4lkJ+yvN7PjxCfaPargWuJLYL5BS6xdJlF9QwIjRDzPyisvJbNqUf/z7CvbN7kG77bbbMGantm158KYbSK9ThxfeeJN7Hn+C6y68gN27dWXMzUMBWL5yJSeefyF/6t49WaciVVyyl2LWA6OAQcX0XQYMLgxMd58CPAKcU8zYiUDryiqylOOUVr9IEV9/9x3bNW9B6+bNqVWzJn333osPP80pMmb3bl1Jr1MHgK4ddyR36c+b7OfdSZPpmZW1YZxIomQHO8DdwMlmtm1Ce1fgs4S2nKg90aHAi2U41i1mNrXwldDXIb7PzHqV8Tgl1S9SRO7Py8hs2nTDdkbTpuQuW1bi+PHvTmDPrF03aX/744/pu8/elVKjhCHZSzG4+3IzGwucD6zewumPm1ltoD6QVYbxgxPX2OP6SluKedfMmgArgaviO/5g/SLFev2DD5g5+3vuGnJ1kfa8Zcv4ft6P7LmrlmGkZFXhih3gNuAMYJu4thlAj4RxPYDpcdsnA+2JLdHcWYn17Q+0AaYC1xbTfxub1r+BmQ00sxwzyxn73POVVaNUcRlNGrNk6dIN27lLl5LRuPEm4z798ivGPv8iwy69hNq1ahXpe2fiJHr9aQ9q1kz6NZlUYVUi2N39Z+BpYuFY6GZgmJk1BTCzLGAAcE/CXCd2Fd3TzDpXYo3rgQuB/tHVe3xfcfXH949y92x3z+5/7DGVVaJUcZ07dODHRYtYsGQJ69av562PJ7JPdtFrl2/mzOGWBx9k6KWX0HjbTVf33vroYw7aW8swUrqq9Gt/OHBu4Ya7v2xmrYGPo9sKVwCnuPvCxInuvtrMhgODKSFcy6BDwrr7aHe/I+E4C83sSWIf4P6ntPpFEtVMS+Oi0wdw0Y03UVBQwOF9+tB+++158Oln6Ny+HftmZ3P3Y0+wes0arhp5OwDNmzVl2KWDAVi4JJclS5eS1WXnZJ6GpACLXfDK1pI7dYp+4CJSITKydrfi2qvEUoyIiFQcBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhKYqvRovGqh1jbFPu9aRKTC6IpdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJTEo8aMPM8oGvAAPygXPd/eO4/guBoUBzYDnwAXCDu/836j8eOAOoAwx199cT5nYChgHj3b2bmfUBXgLmxJVxCXA48IO73xbNfR340d3/EW0PB+a7+4gK/QFIMCZ+9hkjRj1IQUE+fzn4YE49/rgi/U+88CIvvfEmNdNq0Kjhtlx54fm0zMwEYNGSXG64806W5OaBGSOHXE2r5s2TcRpSxaVEsAOr3T0LwMwOAW4C9ovr7wd8Chzj7g+b2VnAM2b2LrFzvBE4FDgQOAl4PW7uScClxRzzA3c/Ir7BzBoBJwC3mVkNoBnQMG7I3sCgcp6jBC4/P59b7r2fO6+/jsymTRkw6GJ67fkn2u+ww4YxO3VozyMjR5CeXofnXnuNux4eww2Xxf54XjtiJANOPJ49d9uNVatXU8P0F24pXir+yWgILCvcMLMOQH3gSmIBj7tPA14BLgOuBsa6+2zgWeBwM6sdzW0LtCJ2hV8WHwN7Re+7AtOAFWbW2MzqADsDU/7IyUm4ZnzzLdu1bEnrFi2oVasWB/XuxfuTJhcZk929O+npdQDo1qkTS/LyAPh+3jzWF+Sz5267AVCvbt0N40QSpcoVe10zmwqkAy2BA+L6TgLGEQvnTmbW3N0XA9cSC9m1QDaAu/9sZp8AhxFbajkJeNrd3cwSj9krOmahY919tpmtN7MdiF2dTwRaEwv7X4Gv3H1txZ22hGTJ0qU0z2i2YTuzWTOmz5pV4viX33iTvXr0AODH+QtosM02XHbDjSxYvJg9srI459T+pKWlVXrdknpS5Yp9tbtnuXtnYksqY21jEvcDxrl7AfAccDyAu/8GPAU86u6/x+3rSWKBTvTfJ0s45gfRMQtfs6P2j4mFemGwT4zb/qgCzlWE/777Ll9/9x2nHHsMAOvz85k6fQbnn3E6D48cwfxFi3j17beTXKVUVakS7Bu4+0Ria9sZZrYL0BF408zmEgvqfnHDC6JXvJeAA81sd6Ceu3+2hSV8RCzEdyG2FDOJ2BX73sRCfxNmNtDMcswsZ8y4p7bwcBKKzKZNWZybt2F7SV4eGU2bbjLuk6lTGfPUM9x61ZXUrlUrNrdZU3Zq347WLVpQMy2N/Xr2ZObs77da7ZJaUi7YzawzkAYsJRbiQ9y9bfRqBbQyszYlzXf3lcC7wGhKvlovzcfAEcDP7p7v7j8DjYiFe7HB7u6j3D3b3bMHnHRiOQ4pIdh5p478uGABCxYtYt26dbz5/gf03nPPImNmzZ7N0Lvu4ZarrqRJo0Yb2rt07MiKlb+x7NdfAcj58kvabb/91ixfUkiqrbFD7JbHU90938xOAv6cMPYFYlfuw0rZ35Nx40qSuMZ+vbs/S+y2y2bAE3F9XwH13T0PkRLUTEvjkrPO5Pyrh1BQUMCRB/WlfZsduP+xx9m544703nNP7hw9hlVrVnP50Ngf3xYZGdx69ZWkpaVx/hmnce4VV+IOnXfswFGHHJzkM5Kqytw92TVUK798O0s/cBGpEI06dtrkrg9IwaUYEREpnYJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwejTeVrZu1Sr9wEWkQtSqV0+PxhMRqQ4U7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhKYlAh2M2thZuPMbLaZfWZmr5nZTma22symxr36R+PnmtlzcfOPM7MxZnZa3Ni1ZvZV9H6omQ0ws9xoe6aZDUqoIcvM3MwOTWhfuXV+ChKCDz/6iCOOOorD/vIXHhw9epP+Rx59lL8ccwxHn3ACZ5x5JgsWLABgwYIFHN+vH8eeeCJ/PfZYnnrmma1duqSQKv8EJTMz4GPgEXe/L2rbFWgI3Ovu3YqZMzd6+2d3n2FmxwFHuPuAhDHZ7p4XbQ+Its81s6bALGA3d/8x6h8G7A187+6nxu1npbvXL+v56AlK1Vd+fj6HH3UUD9x7Ly2aN+fEk0/mlptuokOHDhvGfPLpp+zSrRt169Zl3NNP8+lnnzF82DDWrVuHu1O7dm1WrVrFUccdx2NjxpCZmZnEM5JkS+UnKO0PrCsMdQB3/wL4cTPzhgNXlOeA7r4U+A5oCRt+uRwPDAAOMrP08uxXqrevpk1jh+23Z/vttqNWrVocdsghvDNhQpExf9pjD+rWrQvArt27s3jxYgBq1apF7dq1AVi7di0FVfyCTJIrFYK9G/BZCX0dEpZiesX1PQ3sbmY7bukBzWwHIB34MmraG5jj7rOBCcDhW7pPkSVLltCiefMN282bN2dJbm6J459/8UV67bPPhu2FixZx9Akn0PewwzhjwABdrUuJyhTsZrZPWdqSYLa7Z8W9PojrywduAf69Bfs70cy+JHa1fo+7r4na+wHjovfjom2RSvPKq68yfcYMTjt1w6ofLVu04IWnn+a1l17ipVdeIW/p0iRWKFVZWa/Y7yxjW2WYDvQo59xHgd7A9mUc/5S7dyd2hT40+tA2DTgWuDpal78TONTMGpS1CDMbaGY5ZpZT3AdmUj1kZmayKFpaAVi8eDGZGRmbjJs4aRKjHnqIO2+7bcPyS+J+dtxxR6ZMmVKp9UrqKjXYzWwvM7sYyDCzi+JeQ4C0rVIhvAPUMbOBcXV1pwxh7e7rgJHAoM2NTZiXQ+yXwgXAgcCX7r69u7d19zbAc8DRW7C/Ue6e7e7Z/zj99C0pRQLSrWtX5s2bx0/z57Nu3Tr++/rr7N+nT5ExX8+cybU33MBdI0fStEmTDe2LFi9mzZrYXyB/Xb6czz//nLZt227F6iWV1NxMf22gfjQu/gp1OXBcZRUVz93dzI4GbjOzy4A1wFzgQqI19rjho939joRdPARcWY5DDwOmAC2AFxL6ngPOBsYC9czsp7i+Ee4+ohzHk8DVrFmTyy+7jDP/+U/yCwo4+q9/ZccOHbjrnnvo2qUL+/fpw/CRI1m1ahUXXXopEFt+uev22/l+zhxuGTECAxwY0L8/O3XsmNTzkaqrTLc7mlkbd/9hK9QTPN3uKCIV5Y/e7vigmTUq3DCzxmb2ekUUJiIiFauswd7M3X8p3HD3ZYDutRIRqYLKGuwF0b3dQGxphthSn4iIVDGb+/C00BXAh2b2HmBAL2Bg6VNERCQZyvxdMWbWDOgZbU4q/I4V2TL68FREKkpJH56WGuxm1tndZ5rZ7sX1u7v+hcQWUrCLSEUpKdg3txRzEbEll+HF9DlwwB+sS0REKthml2LMrAawl7t/tHVKCpuu2EWkopT7PnZ3LwDuqvCKRESkUpT1dse3zezY6HvJRUSkCivrVwqsALYB1hP7rhYj9jUuDSu3vPBoKUZEKkp5PzwFwN3L/BW1IiKSXGV90MbbZWkTEZHkK/WKPXq2Zz2gmZk1JrYEA7EHSbeu5NpERKQcNrcUcyax7z1vRey5o4XBvhzdKSMiUiWV9cPT89x9az0KL2j68FREKsof/T72RYXP+DSzK83s+ZK+ZkBERJKrrN/ueJW7P2Nm+wJ9gVuAe4E9K62yQK1Zl5/sEkQkELVKaC/rFXthGh0OjHL3V4k9D1VERKqYsgb7fDO7HzgReM3M6mzBXBER2YrKGs4nAK8Dh0SPyGsCDK6sokREpPw2933sDd19uZk1Ka7f3X+utMoCteLXFborRkQqRINtG5TrKwWeAI4gdg+7s/E+dqLt9hVSnYiIVJgyPxpPKoau2EWkopT3ih0zqwkcBnSOmmYAr7v7+oorT0REKsrm1thbA+8AC4HPiS3F7Aa0APZ39wVbo8iQ6IpdRCpKSVfsmwv2McBUd78tof18oIe7n1qBNVYLCnYRqSjlDfaZ7t65hL5Z7t6pguqrNhTsIlJRSgr2zd3HvrqUvlXlL0dERCrL5j483dbMjimm3Yh9J7uIiFQxmwv294AjS+h7v4JrERGRCqD72LcyrbGLSEUp133sZnZRaf3uPuKPFCUiIhVvc0sxDaL/dgL2AF6Oto8EPqmsokREpPzK+mi894HD3X1FtN0AeNXde1dyfaXVtB1wN9CF2N0944HXgGHRkB2B+cTu7PkSGA1c4u5HxO1jDDDe3Z81swlASzbeCfSdux9nZkOA/wNyiX0H/X/c/clofk/gdqBO9HrK3YeUVreWYqq3jyd+zK3Db6WgoICj/noUA04dUKT/sccf46WXXyItLY3GjRpz9VVX07JlS2Z9M4uhQ4fy22+/USOtBqefdjoHH3Rwck5Cqoxyf6VApDmwNm57bdSWFGZmwPPAve7+VzNLA0YBfd09KxozgViQ50Tbfcqw65MLxycY6e63mllH4DMze9bd1wGPACe4+xdRDbqvX0qUn5/PsJuHcfddd9M8szn9T+1P7169ad9+43fpde7UmeMeOY709HSeffZZ7rjzDm668SbS66Rz7ZBr2WGHHcjNzeWU/qewV8+9aNCgQSlHlOqqrN/HPhb4xMyGRFewk4ExlVVUGRwArHH3hwHcPR8YBJxuZvUq66Du/i2x+/cbR02ZxL5uAXfPd/cZlXVsSX3Tp09n++22Z7vW21GrVi0OPvhg3nv/vSJjsrOzSU9PB6DbLt1YvGQxAG3atGGHHXYAICMjgyaNm7Bs2bKtewKSMsp0xe7uN5jZf4FeUdNp7v555ZW1WV2JfZXwBtH3xs8jtgTzZQnzepnZ1LjtHYgt4RR63MwKl2LedPciDxOJHuD9rbsviZpGArOivx38D3jE3deU43ykGliSu4TmzTf+RTczM5Np06eVOP6ll19i77323qR92vRprFu/ju22265S6pTUt7m7YtKBs4iF5VfA3Sn+rY4fFLPGHq+kpZhBZnYasBNx9/W7+3Vm9jhwMPA3oB/Qp6KLlurntf++xtdff82o+0YVac/Ly+Pqa67m2muupUYNPZ1Sire5PxmPANnEQv0w4NZKr6hsZgA94hvMrCGxK/DvKuF4I929K3As8FD0Cw8Ad5/t7vcCBwK7mlnTxMlmNtDMcsws5+ExD1dCeZIKMjMyWbx48YbtJUuWkJmRucm4yZ9MZvTDoxlx6whq1974zPiVK1dywaAL+OfZ/2SXXXbZKjVLatpcsHdx91Pc/X7gOCBpd8EkeBuoZ2b9AaIPLocDY9y90r7Dxt1fBnKAU6PjHh59kAvQEcgHfilm3ih3z3b37NMGnFZZ5UkV16VLF3788Ufmz5/PunXreOONN+jdq+j/UjNnzeTGm25kxK0jaNJk4xMp161bx+BLB3P4nw+n74F9t3bpkmI2t8a+rvCNu6/fmGHJ5e5uZkcD95jZVcR+Qb0GXP4Hdx2/xp7n7sX9H3Qd8ISZPQD8HRhpZquA9cSWcvL/YA0SqJo1azJ48GDOO/888gvy+cuRf6FDhw7cd/997LzzzuzXez/uuOMOVq9ezb/+/S8AmrdozsjhI3nzrTeZ8vkUfv31V8aPj30sdM0119BpJ92IJZva3Nf25gO/FW4CdYndFWLE8lVfBLaFdB+7iFSUct3H7u5plVOOiIhUFn2sLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISmM0981Qq2MpVa5NdgogEosG2xbfril1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQlMUh+0YWZXAH8D8oEC4Ezgc+Bm4AjAgRnAOe7+k5m1Bca7e7e4fQwBVgLtgH2A2tH7WdGQ66N9jXf3Z+PmrXT3+tE+v44bDzDC3cea2VxgRVTHMqC/u/8Qzfdo3MXR9iVAfXcfUhE/GwnT5MmTuOuu28jPz+fww4/k5JP7F+l/+uknefXVV0hLS6NRo0ZceunltGjREoDBgwcxY8Z0dtmlO0OH3pqM8iVFJO2K3cz2Iha4u7t7d6Av8CNwI9AA6OTuHYEXgefNzErbn7uf4+5ZwJ+B2e6eFb2eLW1eJH58lruPjevbP6pvAnBlXPvvwDFm1qws5yuSn5/P7bffyrBhw3nkkSd45523mDt3TpExHTvuxP33j2b06EfZb7/9uf/+ezb0nXTSyVxxxdVbu2xJQclcimkJ5Ln77wDungf8ApwGDHL3/Kj9YWIhekCS6iw0EWgdt70eGAUMSk45kmpmzpxB69bb0apVa2rVqsUBB/Tlo48+KDJmt916kJ6eDkCXLl3JzV2yoa9Hj2zq1q23VWuW1JTMYH8D2N7MvjGze8xsP2BHYJ67L08YmwN0/YPHu8XMpha+Evo6xPeZWa9i5h9K7G8P8e4GTjazEp48KLJRbm4uGRnNN2xnZGSQm5tb4vhXXx3Pn/7Uc2uUJoFJ2hq7u680sx5AL2B/4CliyzClTtvC9niDE9fY4/pmR8s4xXnXzJoQW8e/qshB3Zeb2VjgfGB1GWoQKZM33vgfs2bN5Pbb7052KZKCknpXjLvnu/sEd78GOBc4EtjBzBokDO0BTAeWAo0T+poAeZVY5v5AG2AqcG0x/bcBZwDblLQDMxtoZjlmlvPYY49URo2SAmJX6Is3bMeu4DM2GZeT8ymPPfYIN944jNq1a2/NEiUQyfzwtJOZdYxryiJ2Z8ojwAgzS4vG9QfqAe+4+0pgoZkdEPU1IbZE8mFl1uru64ELgf7RMeP7fgaeJhbuJc0f5e7Z7p59yimnVmapUoV16rQzP/30EwsXLmDdunW8885b7L33vkXGfPvtLEaMGMaNN95M48ZNStiTSOmSebtjfeBOM2tE7IPI74CBxG4vvBX4xswKgJnA0e5euNzSH7jbzEZE29e6++w/WEuHhHX30e5+R/wAd19oZk8C5wD/SZg/nNjfOERKVLNmTS644CIGDx5EQUE+hx12BO3atWf06Afo1Kkz++zTi3vvvZvVq1dzzTWxG7CaN2/OjTfeDMB5553NvHk/sHr1Ko477q9ceum/tQYvxbKNeSlbw8KFS/UDF5EK0bJl02JvA9e/PBURCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCUwyH41XLa1c/XuySxCRwOmKXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCUzKBbuZuZk9Frdd08xyzWx8tD3AzO6K3ncyswlmNtXMvjazUVF7PTN73My+MrNpZvahmdWP+lbG7burmb1jZrPM7Fszu8rMLO44BWbWPW78NDNru1V+EBKEz3I+4cx/9Of/Tj+ZZ55+YpP+F55/mrMHDuDcs8/g8n9dxJLFi5JQpaSalAt24Degm5nVjbYPAuaXMPYOYKS7Z7n7zsCdUfsFwGJ338XduwFnAOviJ0b7fxkY6u6dgF2BvYF/xg37CbiiAs5JqqH8/Hzuvft2rv3PUO65fwzvTXibeT/MLTKmQ4eOjLzjPu669yH23Xc/Hh59f3KKlZSSisEO8BpwePS+H/BkCeNaEgtfANz9q7j2+XHts9w98Zl1fwM+cvc3ojGrgHOBf8WNGQ90NbNO5TwPqca++WYmLVu1okXLVtSqVYve+x3ApEkfFRnTfdfdSE9PB6BT5y7k5eUmo1RJMaka7OOAk8wsHegOTC5h3EjgHTP7r5kNMrNGUfto4DIzm2hm15tZx2LmdgU+i29w99lAfTNrGDUVADcDl/+x05HqaGleHhkZmRu2mzXLYOnSvBLHv/HGa/TI3nNrlCYpLiWD3d2/BNoSu1p/rZRxDwM7A88AfYBJZlbH3acC7YFbgCbAp2a2cznLeQLoaWbtyjlfZLPefedNvvtmFscee2KyS5EUkJLBHnkZuJWSl2EAcPcF7j7a3f8KrAe6Re0r3f15d/8n8Bjw54SpM4Ae8Q1m1h5Y6e7L4/a/HhgOXFZSDWY20MxyzCxn3JOPlTRMqpmmzZqRm7tkw3ZeXi5NmzbbZNzUzz/jqXGPcdWQG6hVu/bWLFFSVCoH+2jg2rh1802Y2aFmVit63wJoCsw3s33MrHHUXhvoAvyQMP1xYF8z6xuNq0vsw9ibiznUGKAvkFFcHe4+yt2z3T37pH6nbMEpSsh22qkzCxbMZ9Gihaxbt47333uHPXvuXWTM7O++5a47RnDVNTfQqFHjJFUqqaZmsgsoL3f/iVjQluZg4HYzWxNtD3b3RWZ2MHBvdOtiDeBV4LmE/a82s78Cd5rZ3UAa8ChwVzG1rDWzO4Db/9BJSbWSlpbGWWefz9VXXkpBfgEHHXwYbdq047Gxo+m4Uyf27LkPox+6jzVrVjP0xiEAZGQ05+ohNyS3cKnyzN2TXUO18u33C/QDF5EK0bF9KyuuPZWXYkREpBgKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwKTsM09T1YpVa5NdgogETlfsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYFIi2M2sqZlNjV6LzGx+3Hamma0zs7MS5sw1s6/M7Esze8/M2iT0v2hmk+K2vzezTgljbjOzy6L3WWbmZnZowpiVFX/GEqqpn3/KReedwYXnDOCl55/apP/r6V/x70vO4eTjD2PyxA+K9D3x6IMMvnAggy8cyMSPJmyliiUVpUSwu/tSd89y9yzgPmBk3PaxwCSgXzFT93f37sAE4MrCRjNrBPQAtjWz9lHzOOCkuDE1gOOidqL9f1jCcUQ2qyA/n4cfuJvLrrieW297gI8/fJeffvyhyJhmGRmcde7F7NNr/yLtUz6bzJzvv2Po8Hv5z9A7GP/Sc6xa9dvWLF9SSEoE+2b0Ay4GWpvZdiWMmQi0jts+BniFomH+JHBi3JjewA/u/oOZGXA8MAA4yMzSK658qS6++24WLVq0onmLltSsVYu99u1DzqcTi4zJyGxBm7btiV1XbDT/x3ns3GUX0tLSSE9PZ4c27fji85ytWb6kkJQOdjPbHmjp7p8AT1M0mOMdCrwYt92PWJA/Gb3H3b8CCsxs12jMSVE/wN7AHHefTezq//CKOwupLpb9vJSmzTI2bDdt0oxlS/PKNLdN2/Z88XkOv/++huXLf2XGtC9YujS3skqVFJfqD7M+kVigQ+zqezQwPK7/XTNrAqwErgIws+ZAR+BDd/dofb6bu08jFuQnmdl04Cjgmmg//di4JDMO6A88V2lnJZKge1YPZn83i2suH0SDhtvSsdPO1KiR0tdlUolS/U9GP2CAmc0FXga6m1nHuP79gTbAVODaqO0EoDEwJ5rXlo3r5uOi/r7Al+6+2MzSiK3jXx2NvxM41MwalLVIMxtoZjlmlvP8M0+U4zQlBI2bNGVp3sar7KU/59G4abMyzz/6uL8xdPi9XHHNUNydli1LWnmU6i5lg93MdgLqu3trd2/r7m2Bm0j4cNPd1wMXAv2jq/d+wKFxc3oQrbNHSy15wFA2LsMcSCzkt4/mtCF2tX50WWt191Hunu3u2ccc/7dyn7Oktg47dmLRwvksWbyI9evWMfHDCfTI7lmmuQX5+axYsRyAH+Z+z7wf5tA9q0dllispLJWXYvoBLyS0PQc8BVwX3+juC83sSeAcYlfwk+L65pjZr2a2p7tPJhboQ4HnN3Ocs4GxQD0z+ymub4S7j/hDZyZBSktLY8A/zuGm/1xOQUEBfQ44mO13aMszTz5Cux13InuPvZj93SxGDLuO335bwZScSTwzbiy33v4A6/PzufbKiwGoW7ce51xwGWlpaUk+I6mqzN2TXUO1MmXaXP3ARaRC7N6trRXXnrJLMSIiUjwFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEphUfjReShr58vfJLkFEAvFot7bFtuuKXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCUy1e9CGmeUDXxE796+BU919lZnVBBYCD7n7v+LGTwBaAmuAtcD/ufvUqG8ukO3ueWbWA3gWOMbdP996ZySpbJf2Tfj7QR2pYcaELxYyfuIPRfo7bd+IUw7qyPaZ23D3i9P5dGZukiqVVFIdr9hXu3uWu3cjFtRnRe0HAd8Ax5uZJcw52d13Be4BbkncoZl1JxbqJyrUpazM4NRDOnHLU19w2ajJ7NUlk1bN6hUZs3T5Gka9MoOJ0xcnqUpJRdUx2ON9AOwYve8H3A7MA/YqYfxEoHVC287Ai8Df3f2TSqhRAtWhVUMWL1tF7i9ryC9wJs1YQo+OGUXG5P26hh9zf8M9SUVKSqq2wR4tvRwGfGVm6UBf4BXgSWIhX5xDiYV4vJeAc939w0oqVQLVuEEdfl7++4btn1f8TuMGdZJYkYSiOgZ7XTObCuQQuzp/CDgCeNfdVwPPAUeZWVrcnMfNbA5wBXB3wv7eAv6RMF5EJGmqY7AXrrFnuft57r6W2BV63+jD0M+ApsABcXNOBtoDjwB3Juzv3Oi/95R0QDMbaGY5Zpbz7SfjK+o8JMUtW/E7TRpuvEJv0qAOy1b8XsoMkbKpjsFehJk1BHoBO7h7W3dvC5xDwnKMuztwFdDTzDrHdRUAfwM6m9l1xR3D3Ue5e7a7Z3f80xGVcRqSgr5fsIIWjeuRsW06aTWMnl0ymfJtXrLLkgBUu9sdi3E08I67x18qvQTcbGZFFjzdfbWZDQcGA2fEta8xs78A75nZYndPXK4R2USBO2Pf+IbBJ2VRo4bx/hcLmJ/3G8f0bsechSv4/Ns82rVswIXH7sI26bXI2rEZx/Rqx78f0Gf0Ujpzfdy+Vf39xnf0AxeRCvHo5Qck3poNaClGRCQ4CnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcDo0XgiVZCZDXT3UcmuQ1KTrthFqqaByS5AUpeCXUQkMAp2EZHAKNhFqiatr0u56cNTEZHA6IpdRCQwCnaRcjKzfDObambTzOwZM6tXzJghZnZJ9H6Mmc0xsy/M7BszG2tm28WNfc3MGpVyvAuLO0Zc/4Nm1qWU/j5mtneZT1BSloJdpPxWu3uWu3cD1gJnlWHOYHffFegEfA68Y2a1Adz9z+7+SylzLwSKDXYzS3P3f7j7jFLm9wEU7NWAgl2kYnwA7AhgZldEV+QfEgvwTXjMSGARcFg0b66ZNTOzbczs1ejKfpqZnWhm5wOtgHfN7N1o/EozG25mXwB7mdkEM8uO+g41synRPt42s7bEfvEMiv6W0atyfxySTDWTXYBIqjOzmsTC+X9m1gM4Ccgi9v/XFOCzUqZPAToDL8W1HQoscPfDo/1v6+6/mtlFwP7unheN2waY7O4XR+MK68kAHgB6u/scM2vi7j+b2X3ASne/tSLOW6ouXbGLlF9dM5sK5ADzgIeAXsAL7r7K3ZcDL29mH1ZM21fAQWY2zMx6ufuvJczNB54rpr0n8L67zwFw9583fyoSEl2xi5TfanfPim8ovGreArsBb8c3uPs3ZrY78GfgejN7292vK2buGnfP39IDSvh0xS5Ssd4HjjKzumbWADiyuEEWcz7QEvhfQl8rYJW7PwbcAuweda0AGpShhklAbzNrF+2vyRbOlxSnYBepQO4+BXgK+AL4L/BpwpBbog87vwH2ILZmvjZhzC7AJ9EyzzXA9VH7KGLr+O9upoZcYl8i9nx0rKeirleAo/Xhafj0L09FRAKjK3YRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQw/w+HHLWQj5c8XAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO0AAADeCAYAAADRo4eMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdu0lEQVR4nO3deZgU1dXH8e+PTXZBYQYUZNwQQREj4gaKcU+MIhhMJKLGNWKMW9TEvComxKgY1KAoCi5EzWPcAwRR4wKKCyDKIoogi2zDjiyyzXn/qDukabpneqC7Z4qcz/PMQ9e9t26dBs7cW9XVdWVmOOfio1plB+CcqxhPWudixpPWuZjxpHUuZjxpnYsZT1rnYsaT1rmY8aR1lULSO5JWSNotoexJSRslrZG0XNIbktok1NeSdJ+kb0Ob2ZLuT+r3IkmTJa2TtEjSIEmNEurvkGSSeiaU1QhlRTl901niSevyLiRHF8CAs5Kq7zGz+sDewHxgSELd74COQCegAdAVmJjQ7w3A3cBvgd2Bo4FWwBuSaiX0sxzoK6l61t5UHnnSusrQG/gQeBK4MFUDM1sPPA90SCg+EnjZzBZYZLaZPQ0gqSHQF/i1mY0ys01mNhvoCRQBv0joZxSwMaksNjxpXWXoDTwTfk6TVJjcQFI94OfA1wnFHwLXS7pK0qGSlFB3LFAbeCmxHzNbA4wETkksBv4PuF1SzSy8n7zypHV5Jakz0ZT1eTObAMwEzk9ocqOklcB3QGfggoS6u4imv72A8cB8SaUjdRNgqZltTnHYhaF+KzN7DVgCXLqz7ynfPGldvl0IjDazpWH7WbadIvc3s0ZEU9r1wEGlFWa2xcweMrPjgEZAP2CopIOBpUATSTVSHLN5qE/2B+BWohE6NjxpXd5IqkN0jnlCuLK7CLgOOEzSYYltzWwu8BvggbAfSfXrzewhYAXQFhgHbAC6Jx2zPnAG8FaKPt4gmn5flYW3lzeetC6fugFbiJKsQ/g5GBhDdJ67jZBUC4DLASRdK6mrpDrhY5oLia4if2pmq4guRP1N0umSaoar1M8D3wLD0sR0K3BTtt5gPnjSuny6EHjCzOaa2aLSH2Ag0XlqqqntvcBN4fPcdcB9wCKi6W4foIeZzQIws3uA3wP9gdXAR8A84CQz25AqIDN7H/g4i+8x5+RfgncuXnykdS5mPGmdixlPWudixpPWuZjxpHUuZlJdYne7kOeP7eIfD8RUzw/GKFW5j7TOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560GZLUQtKrkmZIminpAUmnSZoUftZI+jK8fjo8VHt4Uh9PSjo3vH4nof0kSS+E8jskzQ9l0yT9PGH/oyV9FOq+kHRHXv8S8qjZUZ04/blnOOP552hzQa+07fbuegI9PxhD4zbR6iGFR3bk5KGPc+qwJzl56OMUHPGDfIWcN/7kigyE1dleAgaZ2dlhXdPBwMlm1iG0eQe40czGh+2uGXTdq7R9kgFm1l/SgcAESS+Y2SbgKaCnmX0WYjgoxb6xp2rV+MGN1/Pub65jffESTh7yGAvGvM/q2bO3aVejbh1a9zyXZVOmbi3bsGoVY2+6me+XLqPhfvty/ID7GH52d3YlPtJm5ofA92b2BEQLQRGtQfNLSXVzdVAzm0H0VP3GoaiAaAW40sWopuXq2JVpj7YHs+bb+axdsJCSzZuZ++Zb7NWl83btDrnsUqb//Vm2bNy4tWzlVzP4fukyAFbP+obqu+1GtZqxW82yTJ60mWkHTEgsMLPVwFzggDL265Iw/Z3E9queP5NQf2/yzpJ+AMwws+JQNAD4UtLLkq6QFKvV3jJVp2lT1i0u3rq9fskS6jTdZqVKGrVuTd2CAhZ+MC5tPy1O7MrKL7+iZNOmXIVaKXx6nFtjzOzM0g1JTybVp5seXyfpYqA18JPSQjO7U9IzwKlEa7r+HOia7aCrPIkO11zNx3/6c9omDfctov1VV/LutdfnMbD88JE2M9OAIxILJDUE9mHblcqzZYCZtQN6AEMSR1Qzm2lmg4CTiJaI3DN5Z0mXSxovafybixflILzcWr9kCXULC7Zu12nalPVL/ru8bM26ddl9v3058aEH+fGLz7Nnu7Z0vvsvWy9G1WnalOPu+jMf3dmPtfMX5D3+XPOkzcxbQF1JvQHCRaD7gCfNbF2uDhpWKx9PWHRZ0o/DRTGAA4mWjVyZYr/BZtbRzDqeXNgsV+HlzPIvplO/RQvqNW9OtRo12Ofkk1gwduzW+k1r1/Lqj37CiB49GdGjJ8umTmPszbewYvqX1Kxfny797+HzQY+wbPLkSnwXuePT4wyYmUk6B3hY0v8R/bIbSbSs4s54RtL68HqpmZ2cos2dwLOSHgMuAAZIWgdsJppeb9nJGKoc27KFiX8dwPED7kPVq/HN8BGs/mY27S69hBXTp7Ng7Ptp9z3g3O7Ub7E3bS++iLYXXwTAe9ddz4YVK/MTfB74Upe7OH9YeXz5w8qd20V40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zM+JMrdnHfzZnt/8Ax1aBVkT+5wrldgSetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczNTIpJGk7imKVwGTzaw4uyE558qSUdIClwDHAG+H7a7ABGBfSXea2bAcxOb+h33wySf0H/QIJSVb6Hb6GVz0s/O2qf/7Cy/y6qhRVK9enca7785tN1xP88JCADqdfgYHFBUBUFhQwIA7++Y7/JzKdHpcAzjYzHqYWQ+gLWDAUcDNqXaQVCRpvaRJaerbSBonaYOkG5PqhkoqljQlqfyPkj6XNEnSaEl7pei3Q+h3amh7XkLdk5K+CftPktQhw/dfuv/xkiZK2izp3KS6UZJWShqeVD5E0mchlhck1U/R7ymSJkiaHP78YSivK2mEpOnh/fwlYZ+rJf2yIvHHxZYtW7h74EM82O9P/POxx3j9nbeZNWfONm3aHLA/wwb+jX88+ggndenMg48/vrVut1q1ePaRQTz7yKBdLmEh86RtaWaLE7aLQ9lyYFMZ+800sw5p6pYD1wD9U9Q9CZyeovxeM2sf+hwO3JaizTqgt5m1C33cL6lRQv1vzaxD+JlURuypzAUuAp5NFRtwQYry68zsMDNrH/a/OkWbpcBPzOxQ4EIgcebS38zaAIcDx0k6I5QPBX5dwfhjYeqXX9Jyr71o0bw5NWvW5NQTuvLuB+O2adOxQwdq164NwCEHH8ziJUsrI9RKken0+J0wgvwzbJ8byuoBK3fkwOFcuFjSj1PUvSepKEX56oTNekSjfXKbrxJeL5BUDDTd0TiT+p4NIKkkRd1bkrqmi1mSgDppYv40YXMqUEfSbma2jnBKYmYbJU0EWoTtdZJmS+pkZh/v5FurUoqXLqOwadOt2wVNmzBl+vS07V8dNYpjjzxy6/bGjRu5oM/VVK9enYvOO4+uxx2b03jzLdOk7QN0BzqH7aeAFy16KtyJuQgsHUn9gN5EF8LKPLakTkAtYGZCcT9JtwFvAbeY2YZcxZoQxxPAj4BpwA3lNO8BTEyOK8wWfgI8kFA8HugC7FJJWxEj33yLL76aweD+924t+9ffh1HQpAnfLlzIr266mQP2LaLFXtudScVWRtPjkJzjgRFmdh0wEtju3CwfzOxWM2sJPEPqqSYAkpoTTTMvNrPSkfF3QBvgSGAP0pyPZ5uZXQzsBXwBnJeunaR2wN3AFUnlNYDngAfNbFZCVXHoN7mfyyWNlzT+iWdTzeSrtoIme7J4yZKt28VLllKwZ5Pt2n00cSJDn3uOv/btS61atRL2j9q2aN6cI9q3Z/rXM7fbN84ySlpJlwEvAI+Gor2BVypyIEl9Ei4AZePX3jNEo1KqYzUERgC3mtmHpeVmttAiG4AngE7lxNyvNOadDdbMtgD/KCPmFsDLROfjyf/LBgMzzOz+pPLawPoUxxpsZh3NrOPF55+/s6HnXduDDmLe/PnMX7iITZs2Mfrddzj+mKO3aTP966/58wMP8tc7+7JH40Zby1d/9x0bN24EYOWqVXw2dSr7tdonn+HnXEWmx52AjwDMbIakgoocyMweAh6qWHjbknSgmc0Im2cD253oSKpF9J//aTN7IamuuZktDOeX3YApobwTcLWZ9U6K+Vbg1p2IV8D+ZvZ1eH1WmpgbEf2SucXM3k+q+xOwO3BpikO0Bt5PUR5rNapX57dX9+HXv/89W0pKOOu0U9m/qIhHnnqKg1u35oRjjuHBxx5j/fr13PLHPwH//Wjnm7lz+fMDD1KtmigpMS487zz2a9Wqkt9RdmX0sHJJH5nZUZI+NbPDw3RtYrgimm6fImC4mR2Spr4Z0ZS7IVACrAHamtlqSc8RfRbcBFgM3G5mQyS9CBwU2s8BrjSz+ZI6hteXSvoF0Sg6NeFwF5nZJEn/IbooJWBS2GdN+PjmFDPbZlqaIuYjiX4hNAa+BxaFq9RIGkM09a4PLCP6bPsNYEx4jwI+A34V3uNZQEczu03SH4im7jMSDncq0fn4PKJELz3HHWhmj4djTgxxL0sXsz+sPL7SPaw806S9h+jqa2+ijxmuAqaFkSjdPkWUkbRViaR7gWFm9nllx5IpSYcD15tZqo+ZtvKkja+dTdpqRCPHqUQjxuvA41bGzpJaAh8Ay8r4rNbtIEmnEJ3nzi6rnSdtfO1U0rr48qSNr3RJW+aFKEmTSXEzQKmyzmmdc7lR3tXjM8OffcKfpbfX/YIyktk5lzuZntN+amaHJ5VNNLMf5CwylxU+PY6vnV3qUpKOS9g4tgL7OueyqCLfpx0qaXeiq8crgF3ya2HOVXUZJa2ZTQAOC0mLma3KaVTOubQqOsU9FLgkfEbonKsEZSatpI8TXl8GDAQaAHdIuiXHsTnnUihvpK2Z8Ppyovtc+xLdGdUrZ1E559Iq75y2mqTGRMktM1sCYGZrJW3OeXTOue2Ul7S7Ez11UYAlfLWtfihzzuVZmUlrZkVpqkqAc7IejXOuXBW+QULSVWa2zsy+yUVAzrmylfeFgeuTi4DfSaoNYGZ/zVVgzrnUyhtp+xI9kLw+0Uc99YHq4XWD3IbmnEulzC8MSNoHuA+YBfQNz9qdZWb75StAt3M2rVvnXxiIqZp161b8CwNmNtfMfkr0BIo3kpfCcM7lX6bPPX6V6IaKo4BvcxqRc65MWXncjKQXw8Jcrorx6XF87dD0uAL8HNe5PMlW0vpvc+fyxJ8+4VzMZCtp/T5k5/Ik0wW4tlu3R9JBCZt5WX3OOZf5SDtGUs/SDUk3EK1pA4CZjc52YM651DJ9sFtXYLCknwKFROuslrlMpHMuNzK9uWIhMAo4BigCnjKzNTmMyzmXRkYjraQ3gQXAIUBLYIik98zsxlwG55zbXqbntAPNrLeZrTSzycCxgD9G1blKkK3bGMeZ2TFZiMdlmd/GGF+5vo2xdpb6cc6Vw29jdC5mdrnbGCXVkfSupOop6q6U1DuDPp6T9Lmk6ypw3KslfS3JJDVJKG8jaZykDZJuTCivLeljSZ9Jmiqpb5p+r5Q0WdIkSWMltQ3lh0p6MtP44mbs++9zZrdunHHWWTw+dOh29U8NG8ZZ3btzTs+eXHLFFSxYsACA6V9+Sa/evTm7Rw/O6dmTf7/+er5Dz7lsndNutxRmZZHUB6hhZg/s4P7NgLFmdkAF9zucaGGyd4COZrY0lBcArYBuwAoz6x/KBdQzszWSagJjgd+Y2YdJ/TY0s9Xh9VnAVWZ2eth+E/ilmc1NF1ccz2m3bNnCj7t147FBg2hWWMh5vXpx7113sf/++29t8/Enn3DoIYdQp04d/vH883wyYQL33X03s+fMQUCrVq0oLi6mZ69evPbSSzRsEL+nI+3QOa2kQZIaZtD/BTsUVW70Al5NVSHpjtLRTtI7ku4Oo91XkrqEZqOBvcPI1iVVP6mY2admNjtFebGZfQJsSiq3hM+6a4af7RKsNGGDeklt/gX8LNMY42LylCns07IlLVu0oGbNmpxx2mn85513tmnT6cgjqVOnDgCHtW/P4sWLAShq1YpWrVoBUFBQwB6NG7Ni+fK8xp9r5U2PZwETJJ1fViMzm5K9kHacpFrAfqmSJ40aZtYJuBa4PZSdBcw0sw5mNib7Uf6XpOqSJgHFwBtm9lGadn0kzQTuAa5JqBoPZPyLJS6Ki4tpVli4dbuwsJDiJUvStn/plVfoctxx25VPnjKFTZs307Jly5zEWVnKe0bUvUS3MJ4t6S1J50rqXvqTlwgrpgmwsgLtXwp/TiC60yuvzGyLmXUAWgCdJB2Spt1DZrY/0Rcz/pBQVQzslfNAq7B/jRjB1GnTuPjCC7cpX7JkCb/7wx/40x13UK3arnXpptx3Y2bzgRFAa+AnCT9n5ja0HbKehI+fJPUL09xJadpvCH9uIfP7sEv7fj30/fgORZrAzFYCbwOnl9P0H0TnxqVqE73n5NgulzRe0vhUF3GquoKCAhaF6S7A4sWLKWjadLt24z78kMFDhvC3+++nVq1aW8vXrFnDVddcwzV9+nBY+/Z5iTmfyntYeTtgENEtjJ3CPchVlpmtCFPO2mb2vZndCty6M31Kujr0PTDpWKftZL9NgU1mtlJSHeAU4O4U7Q40sxlh88fAjITq1sB2pyZmNhgYDPG8EHVIu3bMnTuXb+fPp7CggH+//jr33HXXNm2+mD6dvv368ejAgey5xx5byzdt2sRvbriBs848k1NP2TWXUS5vdPkE6Jbqq3eSuuT6nG8HjQY6A29mqb82wPvlNZJ0DXAT0Az4XNJIM7s0XI0eDzQESiRdC7QFmgNPhY+mqgHPm9nw0NedwHgzew24WtLJRBeyVgCJ88ATiWZBu5QaNWrw+5tv5oqrrmJLSQnnnH02B+y/PwMffph2bdtyYteu3DdgAOvWreP6m24CoHmzZgx84AFGjR7NhIkTWblyJa+89hoA/e68kzYHHVTWIWOlvIeVf0M00t5nZltCWSHRA8zbmFnHvERZAZJ+AFxnZlm5oi1pONDdzDZmo79skbQb8C7Q2czSLjsax5HWRXb0NsbDiZ60OEnSDyX9BvgYGEcV/T6tmU0E3k51c8UO9ndmVUvYYB/glrIS1u2aMrq5IiTrAKJz26PNzB9YHhM+0sbXjt5c0UjSo8DFRFc2XwD+LemH2Q/ROZeJ8s5pZwEPA/eXTsMkdQhlc8zs5/kI0u04H2njK91IW97V4+OTp8JmNgk4VtJlWYrNOVcBWfnCgKu6fKSNr1x/Cd45lyeetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMVOhh5m5+Hnolc8rOwS3g649/+iU5T7SOhcznrTOxYwnrXMx40nrXMx40joXM560zsWMJ61zMeNJ61zMeNI6FzOetM7FjCetczHjSetczHjSOhcznrTOxYwnrXMx40nrXMz4l+BdldSq+e6ccEQR1SSmzCxm/LQF29Tv3bQBJxxRRJNGdRn5/gy+nrd8a123rm1o3qQ+85d8x2vvfpnv0HOuUkZaSUWS1kualKa+jaRxkjZIujGpbqikYklTksr/KOlzSZMkjZa0V4p+W0maGNpMlXTlDsSe7vg/DX2WSOqYUN4pHG+SpM8knZOm32ckfSlpSjhGzVDeVdKqhD5uC+W1JL0naZf7xSvBiR335ZW3p/P0iM84qNWe7NGwzjZtvlu3kdEfzmT6nKXb7T/hiwWMGvd1vsLNu8qcHs80sw5p6pYD1wD9U9Q9SbQqfbJ7zax96HM4cFuKNguBY0Kbo4BbUiV3OdIdfwrQHXgvRXnHcMzTgUfTJNozQBvgUKAOcGlC3Rgz6xB+7gQws43AW8B5FYy/ymu2Z31Wrfme1Ws3UFJifDVnGfu3aLxNm9VrN7B05TpIsZDnvMWr2bSpJE/R5l+VPKc1s2Iz+wTYlKLuPaKkTi5fnbBZjxT/nGa20cw2hM3d2IH3X8bxvzCz7eZiZrbOzDaHzdqp4grtRloAfAy0yCCcV4BemcYeF/Xq1OK7tRu3bn+3biP16taqxIiqliqZtDtKUj9J84j+I6caaZHUUtLnwDzgbjNbkKpdluM6StJUYDJwZUISp2pbE7gAGJVQfEyYWv9bUruE8inAkTkJ2lVZu1TSmtmtZtaSaKp5dZo288ysPXAAcKGkwjzE9ZGZtSNKsN9Jql1G84eB98xsTNieCLQys8OAvxGNrqX9bgE2SmqQ2IGkyyWNlzT+g/+8QtysXb+RBvX+O7I2qFuLtes2lrHH/5YqkbSS+iRcaKnoOWYqzwA9ymoQRtgpQJcy4mqZEFeFL1qlOOYXwBrgkDTHux1oClyfsM9qM1sTXo8EakpqkrDbbsD3SccZbGYdzazjsT/strNh592iZWto1KA2DevtRrVqonWrPZk5f0Vlh1VlVIkrj2b2EPDQzvQh6UAzmxE2zwamp2jTAlhmZuslNQY6AwNC3dPAQDP7OCGueUCHnYxrX2CemW2W1IroYtPsFO0uBU4DTjKzkoTyZsBiMzNJnYh+0S4LdXsCS81su3P/ODODt8fP5pwT2yCJqbOKWb5qPUcf2oLi5WuZNX8FhXvU48zjW1O7Vg323bsRxxzagmEjo2c8//TktjRuWIdaNapzSbfDefOjWcxZuKqS31X2VImkTRb+o44HGgIlkq4F2prZaknPAV2BJpK+BW43syHAXyQdBJQAc4ArQ18dic4jLwUOBu6TZICA/mY2ORy2PVDu+W2644ePcv5GNFKOkDTJzE4j+sVwi6RNIbarzGxp6GskcGkY9R8JcY+TBPBSuFJ8LvArSZuB9cDPwsUqgBOBERX6y42J2QtWMnvBym3KPpz87dbXi5evZcgrn6bc959vTstlaJVO//33z+NBpSJguJmlnCbmm6SGwBAz+2llx1IRkl4CbjGzr9K1uf/ZD/P/D+yy4trzj1aq8so6p90C7J7u5op8C+eNcUvYWsArZSWs2zVVyvQ4nCu2rIxj7yrCzRVPV3YcLv+qxNVj51zmPGmdixlPWudixpPWuZjxpHUuZjxpnYsZT1rnYsaT1rmY8aR1LmY8aZ2LGU9a52LGk9a5mPGkdS5mPGmdixlPWudiplKeXOFctki63MwGV3Yc+eQjrYu7yys7gHzzpHUuZjxpnYsZT1oXd/9T57PgF6Kcix0faZ2LGU9a52LGk9ZlRVis7BtJe4TtxmH7e0mHJrT7raRHs3jcfSStkXRjQtlsSZPDwmnj0+xXJGlKtuLIpyq5lo+LHzObJ2kQ8Beiz07/QnSR6FPgYUnHA3sRrbHUMYuH/ivw7xTlJ5aumbSr8ZHWZdMA4OiwYFpnogXORgELgd6h/g4zS7lupaRzJL2lSHNJX4XF2FKS1A34BpiaSXCSjgiLc38G9Ekory7pXkmfSPpc0hWhvJqkhyVNl/SGpJGSzs3kWLnkSeuyJiy5+Vui5Lw2YQnOa4F+QFMzG1bG/i8TJXgf4DGiFQkXpWorqT5wM9A3VVfAaEkTJCXeMfUE8OuwQHeiS4BVZnYk0cLfl4UlSrsDRUBb4ALgmHSx55NPj122nUGUeIcAb0C0gLek/wDDM9j/10SLfX9oZs+V0e4OYICZrQlLgybqbGbzJRUAb0iaDnwONDKz90KbYSFWgFOB9gmj6O7AgUSzhX+G9YIXSXo7g/hzzpPWZY2kDsApwNHAWEn/MLOFobok/JSnRWhXKKla4gLbSY4CzpV0D9CIaB3j781soJnNBzCzYkkvA52IkjZt6EQj8OtJ7+dHGcSbdz49dlmhaLgbRDQtngvcC/SvYB81gKHAz4EvgOvTtTWzLmZWZGZFwP3An81soKR6khqE/uoRjaJTzGwlsFJS59BFr4TuXidauLtm2K912Pd9oEc4ty0kWky80vlI67LlMmCumb0Rth8GLpZ0gpm9m2EfvwfGmNnYcLHoE0kjzOyLCsRRCLwcpsw1gGfDxTCAi4GhkgwYnbDP40TnrhPDL58lQDfgReAkYBowD5gIrKpALDnhtzE6VwZJ9cN5857Ax8Bx6S6O5YuPtM6VbbikRkAt4I+VnbDgI62rBOEOqeSPfjaY2VEp2p4G3J1U/I2ZnZOr+Ko6T1rnYsavHjsXM560zsWMJ61zMeNJ61zMeNI6FzP/D5ZAi4wUu/BpAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAHiCAYAAAD8qecwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA1iUlEQVR4nO3dd3hUZfrG8e9DKAEBaQlNpYkgIEaJKxYQFduqu3ZldRF1f6hrRUV3rehaQAXsBRURG/aG7tqxAhoRFRBUBFFqgiggIJA8vz/mBCZDEkJMmMyb+3NdcznnLec8JxfeObxzmGPujoiIhKNGsgsQEZGKpWAXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhHAzOaaWd+47ZPMbJmZ7WdmbmY1o/YxZrbWzFZEr2lmdpOZbRs3d0A059KEY/xkZn0S2grHnpjQ3sfMCsxsZXScWWZ2WtTXNpqzMnrNNbN/xc11M9sxej8k2j4hrr9m1NY2ri3bzMZH5/yLmc0wsxvMrPEf+sFKUijYRRKY2anA3cDhwA/FDLnZ3RsAGcBpQE/gIzPbJm7Mz8ClZtZgM4c7NRrbv5i+Be5eH2gIXAY8YGZd4vobRf39gKvN7NASjvEzcK2ZpRXXaWZ7AxOAj4DO7t4IOBRYD+y6mfqlClKwi8QxszOB4cAh7v5xaWPdfY27fwr8BWhKLOQLfQ1MBC4q5VhtgP2AgcAhZtaihOO4u78ILAO6FNM/EZgOdCvhUP8D1gKnlNB/M/Cwu9/k7oujfc5z92vcfUJJ9UvVpWAX2ehs4DrgQHfPKeskd18BvAn0Sui6CrjQzJqUMLU/kOPuzxH7RXBycYPMrIaZHQ00Ar5K6DMz2wfoCnxeUolRLdeYWa2E+dsAewHPlTBXUpCCXWSjg4BJJIRnGS0AigS4u08lFviXlTCnP/BE9P4JNl2OaWVmvwB5wDXA3919Vlx/HrFllgeBf7n72yUV5+4vA7nAPxK6GhPLgUWFDWZ2c7TO/puZXVnSPqXqUrCLbHQ2sBPwoJnZFs5tTSxkE10NnG1mzeMbo6vsdsC4qOkJYBczy4obtsDdG7l7E3fPcvdxFNXM3Ru7+87ufkcZarwSuAJIj2tbBhQALQsb3P3SaJ39BaBmGfYrVYyCXWSjxcCBxJZU7inrJDOrD/QFPkjsc/eZwPPEAjXeqYABU81sETA5rr1SuPubwHfAP+PafouOfUxlHVe2PgW7SBx3X0As3A81s5GljTWzOmbWA3iR2JXvwyUMvZbYB6uNonnpwAnEPjTNinudB/yt8NbKSnIFcGlC26XA6Wb2LzPLjGrcjtjfKCQFKdhFErj7POAA4DjgpmKGXGpmK4ClwFjgM2Dv6Oq3uP3NAR4FCm+HPApYDYx190WFL2A0saWPkm5b/MPc/SPgk4S2D4mdb2/gm2hd/3/EboG8s7JqkcpjetCGiEhYdMUuIhIYBbuISGAU7CIigVGwi4gERsEuIhIY/auyrezpnvvqNiQRqRAnTPqw2H8hrSt2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMFUi2M1sZfTftmbmZnZeXN9dZjYgbvsiM5tpZl+Z2RdmNsLMakV9c82sWcK+B5hZrplNjXt1MbMaZnaHmU2L9vWpmbVL3I+Z5UdzpkfHu9jMakR9fczs14R99630H5gEo0XPPTn0qSc47JlxdP77KSWOa73/fpww6UMad+60FauTVFUVn6C0BLjAzO5397XxHWZ2FnAw0NPdfzGz2sBFQF1gXSn7fMrdz03YVz+gFdDd3QvMbDvgt2Lmrnb3rGhOJvAE0BC4Jur/wN2P2NKTFLEaNdj9kot47/xBrF6yhL4PP8iCDz5k+dy5RcbVrFeXnU44nqXTpienUEk5VeKKPUEu8DZwajF9VwBnu/svAO6+1t2HuvvychynJbDQ3Quiff3k7stKm+DuS4CBwLlmVuwjqUTKqkmXnVn500/8tmABBevXM+/Nt2jVe99NxnUb+H/MfPRx8teuLWYvIpuqisEOMAy4xMzSChvMrCFQ393nlGN/JyYsl9QFngaOjLaHm9luZdmRu38PpAGZUVOvhH13KEd9Ug3Vzchg1ZIlG7ZXL8mlbkZGkTGNOu1EveaZLPx44tYuT1JYlQz2KDwnA38raYyZHRIF6Vwz23szu3zK3bPiXqvd/SegE/BvoAB428wOLEe5HyTse3Y59iGyKTOyLjiPqXfclexKJMVUyWCP3AhcBhhAtNyysvADTnd/PVr7ngbULs8B3P13d/+vuw+OjnfU5uaYWXsgn9hnAWViZgPNLMfMct5asqg8pUqAVufmUi8zc8N23cwMVufmbtiuVa8e27Zvx/733MnhLzxD065d2PeWYfoAVTaryga7u88EZgBHxjXfBNxrZo0AonXu9PLs38x2N7NW0fsaQHfgh83MyQDuA+5ydy/rsdx9lLtnu3t238wW5SlXAvTz1zOpv/32bNOyJTVq1mSHg/qy4IOPNvSv++03Xjr0CF49+nhePfp4lk6fwYeDL2PZzFlJrFpSQVW8KybeDcDncdv3AtsAk83sd2Al8FHCmC/NrCB6/zTwJbE19vhPpf5J7M6WB8ysTtT2CVDc33nrmtlUoBawHngUGBHX3yvqL3S9uz9b5jOUasvz85ly6wh63z4Cq1GDOeNfZfmcOXT9vzNYNnNmkZAX2RK2BReeUgGe7rmvfuAiUiFOmPRhsXfnVdmlGBERKR8Fu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEpiq/mi84Ox+yXnJLkFEAqcrdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDCV8qANM2sKvB1ttgDygdxoe1fgi7jh49x9qJlNAOq7e3a0j2zgVnfvY2Z9gJeA74F6wGLgZncfH40dAvxf3DEA+gBZ0bw5QDow3t0vieYMALLd/dyE2vcFRgANo6YR7j4q7jgr3f1WMxsDHAS0d/ffzawZkOPubbfkZyXVW8433zLq1dcoKHAOzt6dE/brXaT/tcmfMn7yZGpYDerWqc15R/2FHTIzk1StpIpKCXZ3X0osVIuEYbS90t2zSpiaaWaHuft/i+n7wN2PiPaRBbxoZqvdvfAXyMjCYxQysw3zzKwu8LmZveDuHxV3cDNrATwBHOXuU6Kwft3M5rv7q8VMyQdOB+4t4XxESpRfUMC9r4zn+tNOpVnDhgy693567ty5SHD32XUX/rznHgBM+nomD7z2P/4zoH+ySpYUUdWWYm4BrtjcIHefClwHnLuZofFzVgNTgdalDDsHGOPuU6I5ecClwL9KGH8bMMjM9IhB2WLf/PQTrZo0oWWTJtSqWZPe3Xdh0tczi4ypl56+4f2atWuxrV2kpKRkBHtdM5sa9zoxrm8isNbM9i/DfqYAneO2B8Xt893EwWbWGOgIvF/KPrsCnyW05UTtxZkHfAj8vQz1ihSxdPkKmm277YbtZg0bsvTX5ZuMGz9pMmcMH8nDr7/BmUccvjVLlBSVjGBf7e5Zca+nEvqvB64sw34SL15Gxu0z/hdDLzP7ApgPvO7ui/5A7cW5CRhM1fvbjwTiiJ578tDFgzjtkIN5asJ7yS5HUkCVCyN3fweoC/TczNDdgK/LsMsP3H1XYlfdZ0Tr8yWZAfRIaOsBTC9pgrt/S2yJ54SSxpjZQDPLMbOccW++VYaSpTpo2rABeb/+umE7b/lymm7bsMTxvXfpxsQZZfkjL9VdlQv2yPXE1raLZWbdgauAu8u6Q3efAwwFLitl2N3AgMLwj+7uGQbcvJnd3wBcUsqxR7l7trtnn3RQ37KWLIHbqXVr5i/9mUU/L2Pd+vW8/+VX7Nm5c5Ex8/OWbnj/6axvaNW06dYuU1JQMj70q2tmU+O2/+fuRT6cdPfXzCy36DR6mdnnxG53XAKcH3dHDMTW2E+J2z6qmGPfB1xiZm2j7QFmFj+uJ3AK8ICZNSC23HObu79S2gm5+3QzmwLsXto4kXhpaWmcfeThXDVmLAVewEG7706b5pk8+tbbdGzdmp47d2b8pMlMnT2btBpp1K+bzkXHHZPssiUFmLsnu4Zq5btnn9IPXEQqxI7HnVjsjVJVdSlGRETKScEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhKYZDzztFrbdseOyS5BRAKnK3YRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwSX3Qhpk5MMLdL462LwHqu/uQaHsgcFE0fDlwkbt/GPVNAFoCa4C1wP9Fr32A2kA7YFY093rgCGC8uz8bd/yV7l7fzNoCX8eNJ6prrJnNBVYADiwD+rv7D2WpXyTRpKlTuX3MWAoKCjjigP35+1F/LdI/bvyrjH/nXdLSatCoYUP+fdaZtMjIYMq06dwx9tEN4+YtWMCQC86j9x57bO1TkBSQ7Cco/Q4cY2Y3uXtefIeZHQGcCezr7nlmtjvwopn9yd0XRcNOdvccMzsNuMXdD4rmtiUW4lkJ+yvN7PjxCfaPargWuJLYL5BS6xdJlF9QwIjRDzPyisvJbNqUf/z7CvbN7kG77bbbMGantm158KYbSK9ThxfeeJN7Hn+C6y68gN27dWXMzUMBWL5yJSeefyF/6t49WaciVVyyl2LWA6OAQcX0XQYMLgxMd58CPAKcU8zYiUDryiqylOOUVr9IEV9/9x3bNW9B6+bNqVWzJn333osPP80pMmb3bl1Jr1MHgK4ddyR36c+b7OfdSZPpmZW1YZxIomQHO8DdwMlmtm1Ce1fgs4S2nKg90aHAi2U41i1mNrXwldDXIb7PzHqV8Tgl1S9SRO7Py8hs2nTDdkbTpuQuW1bi+PHvTmDPrF03aX/744/pu8/elVKjhCHZSzG4+3IzGwucD6zewumPm1ltoD6QVYbxgxPX2OP6SluKedfMmgArgaviO/5g/SLFev2DD5g5+3vuGnJ1kfa8Zcv4ft6P7LmrlmGkZFXhih3gNuAMYJu4thlAj4RxPYDpcdsnA+2JLdHcWYn17Q+0AaYC1xbTfxub1r+BmQ00sxwzyxn73POVVaNUcRlNGrNk6dIN27lLl5LRuPEm4z798ivGPv8iwy69hNq1ahXpe2fiJHr9aQ9q1kz6NZlUYVUi2N39Z+BpYuFY6GZgmJk1BTCzLGAAcE/CXCd2Fd3TzDpXYo3rgQuB/tHVe3xfcfXH949y92x3z+5/7DGVVaJUcZ07dODHRYtYsGQJ69av562PJ7JPdtFrl2/mzOGWBx9k6KWX0HjbTVf33vroYw7aW8swUrqq9Gt/OHBu4Ya7v2xmrYGPo9sKVwCnuPvCxInuvtrMhgODKSFcy6BDwrr7aHe/I+E4C83sSWIf4P6ntPpFEtVMS+Oi0wdw0Y03UVBQwOF9+tB+++158Oln6Ny+HftmZ3P3Y0+wes0arhp5OwDNmzVl2KWDAVi4JJclS5eS1WXnZJ6GpACLXfDK1pI7dYp+4CJSITKydrfi2qvEUoyIiFQcBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhKYqvRovGqh1jbFPu9aRKTC6IpdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJTEo8aMPM8oGvAAPygXPd/eO4/guBoUBzYDnwAXCDu/836j8eOAOoAwx199cT5nYChgHj3b2bmfUBXgLmxJVxCXA48IO73xbNfR340d3/EW0PB+a7+4gK/QFIMCZ+9hkjRj1IQUE+fzn4YE49/rgi/U+88CIvvfEmNdNq0Kjhtlx54fm0zMwEYNGSXG64806W5OaBGSOHXE2r5s2TcRpSxaVEsAOr3T0LwMwOAW4C9ovr7wd8Chzj7g+b2VnAM2b2LrFzvBE4FDgQOAl4PW7uScClxRzzA3c/Ir7BzBoBJwC3mVkNoBnQMG7I3sCgcp6jBC4/P59b7r2fO6+/jsymTRkw6GJ67fkn2u+ww4YxO3VozyMjR5CeXofnXnuNux4eww2Xxf54XjtiJANOPJ49d9uNVatXU8P0F24pXir+yWgILCvcMLMOQH3gSmIBj7tPA14BLgOuBsa6+2zgWeBwM6sdzW0LtCJ2hV8WHwN7Re+7AtOAFWbW2MzqADsDU/7IyUm4ZnzzLdu1bEnrFi2oVasWB/XuxfuTJhcZk929O+npdQDo1qkTS/LyAPh+3jzWF+Sz5267AVCvbt0N40QSpcoVe10zmwqkAy2BA+L6TgLGEQvnTmbW3N0XA9cSC9m1QDaAu/9sZp8AhxFbajkJeNrd3cwSj9krOmahY919tpmtN7MdiF2dTwRaEwv7X4Gv3H1txZ22hGTJ0qU0z2i2YTuzWTOmz5pV4viX33iTvXr0AODH+QtosM02XHbDjSxYvJg9srI459T+pKWlVXrdknpS5Yp9tbtnuXtnYksqY21jEvcDxrl7AfAccDyAu/8GPAU86u6/x+3rSWKBTvTfJ0s45gfRMQtfs6P2j4mFemGwT4zb/qgCzlWE/777Ll9/9x2nHHsMAOvz85k6fQbnn3E6D48cwfxFi3j17beTXKVUVakS7Bu4+0Ria9sZZrYL0BF408zmEgvqfnHDC6JXvJeAA81sd6Ceu3+2hSV8RCzEdyG2FDOJ2BX73sRCfxNmNtDMcswsZ8y4p7bwcBKKzKZNWZybt2F7SV4eGU2bbjLuk6lTGfPUM9x61ZXUrlUrNrdZU3Zq347WLVpQMy2N/Xr2ZObs77da7ZJaUi7YzawzkAYsJRbiQ9y9bfRqBbQyszYlzXf3lcC7wGhKvlovzcfAEcDP7p7v7j8DjYiFe7HB7u6j3D3b3bMHnHRiOQ4pIdh5p478uGABCxYtYt26dbz5/gf03nPPImNmzZ7N0Lvu4ZarrqRJo0Yb2rt07MiKlb+x7NdfAcj58kvabb/91ixfUkiqrbFD7JbHU90938xOAv6cMPYFYlfuw0rZ35Nx40qSuMZ+vbs/S+y2y2bAE3F9XwH13T0PkRLUTEvjkrPO5Pyrh1BQUMCRB/WlfZsduP+xx9m544703nNP7hw9hlVrVnP50Ngf3xYZGdx69ZWkpaVx/hmnce4VV+IOnXfswFGHHJzkM5Kqytw92TVUK798O0s/cBGpEI06dtrkrg9IwaUYEREpnYJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwejTeVrZu1Sr9wEWkQtSqV0+PxhMRqQ4U7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhIYBbuISGAU7CIigVGwi4gERsEuIhKYlAh2M2thZuPMbLaZfWZmr5nZTma22symxr36R+PnmtlzcfOPM7MxZnZa3Ni1ZvZV9H6omQ0ws9xoe6aZDUqoIcvM3MwOTWhfuXV+ChKCDz/6iCOOOorD/vIXHhw9epP+Rx59lL8ccwxHn3ACZ5x5JgsWLABgwYIFHN+vH8eeeCJ/PfZYnnrmma1duqSQKv8EJTMz4GPgEXe/L2rbFWgI3Ovu3YqZMzd6+2d3n2FmxwFHuPuAhDHZ7p4XbQ+Its81s6bALGA3d/8x6h8G7A187+6nxu1npbvXL+v56AlK1Vd+fj6HH3UUD9x7Ly2aN+fEk0/mlptuokOHDhvGfPLpp+zSrRt169Zl3NNP8+lnnzF82DDWrVuHu1O7dm1WrVrFUccdx2NjxpCZmZnEM5JkS+UnKO0PrCsMdQB3/wL4cTPzhgNXlOeA7r4U+A5oCRt+uRwPDAAOMrP08uxXqrevpk1jh+23Z/vttqNWrVocdsghvDNhQpExf9pjD+rWrQvArt27s3jxYgBq1apF7dq1AVi7di0FVfyCTJIrFYK9G/BZCX0dEpZiesX1PQ3sbmY7bukBzWwHIB34MmraG5jj7rOBCcDhW7pPkSVLltCiefMN282bN2dJbm6J459/8UV67bPPhu2FixZx9Akn0PewwzhjwABdrUuJyhTsZrZPWdqSYLa7Z8W9PojrywduAf69Bfs70cy+JHa1fo+7r4na+wHjovfjom2RSvPKq68yfcYMTjt1w6ofLVu04IWnn+a1l17ipVdeIW/p0iRWKFVZWa/Y7yxjW2WYDvQo59xHgd7A9mUc/5S7dyd2hT40+tA2DTgWuDpal78TONTMGpS1CDMbaGY5ZpZT3AdmUj1kZmayKFpaAVi8eDGZGRmbjJs4aRKjHnqIO2+7bcPyS+J+dtxxR6ZMmVKp9UrqKjXYzWwvM7sYyDCzi+JeQ4C0rVIhvAPUMbOBcXV1pwxh7e7rgJHAoM2NTZiXQ+yXwgXAgcCX7r69u7d19zbAc8DRW7C/Ue6e7e7Z/zj99C0pRQLSrWtX5s2bx0/z57Nu3Tr++/rr7N+nT5ExX8+cybU33MBdI0fStEmTDe2LFi9mzZrYXyB/Xb6czz//nLZt227F6iWV1NxMf22gfjQu/gp1OXBcZRUVz93dzI4GbjOzy4A1wFzgQqI19rjho939joRdPARcWY5DDwOmAC2AFxL6ngPOBsYC9czsp7i+Ee4+ohzHk8DVrFmTyy+7jDP/+U/yCwo4+q9/ZccOHbjrnnvo2qUL+/fpw/CRI1m1ahUXXXopEFt+uev22/l+zhxuGTECAxwY0L8/O3XsmNTzkaqrTLc7mlkbd/9hK9QTPN3uKCIV5Y/e7vigmTUq3DCzxmb2ekUUJiIiFauswd7M3X8p3HD3ZYDutRIRqYLKGuwF0b3dQGxphthSn4iIVDGb+/C00BXAh2b2HmBAL2Bg6VNERCQZyvxdMWbWDOgZbU4q/I4V2TL68FREKkpJH56WGuxm1tndZ5rZ7sX1u7v+hcQWUrCLSEUpKdg3txRzEbEll+HF9DlwwB+sS0REKthml2LMrAawl7t/tHVKCpuu2EWkopT7PnZ3LwDuqvCKRESkUpT1dse3zezY6HvJRUSkCivrVwqsALYB1hP7rhYj9jUuDSu3vPBoKUZEKkp5PzwFwN3L/BW1IiKSXGV90MbbZWkTEZHkK/WKPXq2Zz2gmZk1JrYEA7EHSbeu5NpERKQcNrcUcyax7z1vRey5o4XBvhzdKSMiUiWV9cPT89x9az0KL2j68FREKsof/T72RYXP+DSzK83s+ZK+ZkBERJKrrN/ueJW7P2Nm+wJ9gVuAe4E9K62yQK1Zl5/sEkQkELVKaC/rFXthGh0OjHL3V4k9D1VERKqYsgb7fDO7HzgReM3M6mzBXBER2YrKGs4nAK8Dh0SPyGsCDK6sokREpPw2933sDd19uZk1Ka7f3X+utMoCteLXFborRkQqRINtG5TrKwWeAI4gdg+7s/E+dqLt9hVSnYiIVJgyPxpPKoau2EWkopT3ih0zqwkcBnSOmmYAr7v7+oorT0REKsrm1thbA+8AC4HPiS3F7Aa0APZ39wVbo8iQ6IpdRCpKSVfsmwv2McBUd78tof18oIe7n1qBNVYLCnYRqSjlDfaZ7t65hL5Z7t6pguqrNhTsIlJRSgr2zd3HvrqUvlXlL0dERCrL5j483dbMjimm3Yh9J7uIiFQxmwv294AjS+h7v4JrERGRCqD72LcyrbGLSEUp133sZnZRaf3uPuKPFCUiIhVvc0sxDaL/dgL2AF6Oto8EPqmsokREpPzK+mi894HD3X1FtN0AeNXde1dyfaXVtB1wN9CF2N0944HXgGHRkB2B+cTu7PkSGA1c4u5HxO1jDDDe3Z81swlASzbeCfSdux9nZkOA/wNyiX0H/X/c/clofk/gdqBO9HrK3YeUVreWYqq3jyd+zK3Db6WgoICj/noUA04dUKT/sccf46WXXyItLY3GjRpz9VVX07JlS2Z9M4uhQ4fy22+/USOtBqefdjoHH3Rwck5Cqoxyf6VApDmwNm57bdSWFGZmwPPAve7+VzNLA0YBfd09KxozgViQ50Tbfcqw65MLxycY6e63mllH4DMze9bd1wGPACe4+xdRDbqvX0qUn5/PsJuHcfddd9M8szn9T+1P7169ad9+43fpde7UmeMeOY709HSeffZZ7rjzDm668SbS66Rz7ZBr2WGHHcjNzeWU/qewV8+9aNCgQSlHlOqqrN/HPhb4xMyGRFewk4ExlVVUGRwArHH3hwHcPR8YBJxuZvUq66Du/i2x+/cbR02ZxL5uAXfPd/cZlXVsSX3Tp09n++22Z7vW21GrVi0OPvhg3nv/vSJjsrOzSU9PB6DbLt1YvGQxAG3atGGHHXYAICMjgyaNm7Bs2bKtewKSMsp0xe7uN5jZf4FeUdNp7v555ZW1WV2JfZXwBtH3xs8jtgTzZQnzepnZ1LjtHYgt4RR63MwKl2LedPciDxOJHuD9rbsviZpGArOivx38D3jE3deU43ykGliSu4TmzTf+RTczM5Np06eVOP6ll19i77323qR92vRprFu/ju22265S6pTUt7m7YtKBs4iF5VfA3Sn+rY4fFLPGHq+kpZhBZnYasBNx9/W7+3Vm9jhwMPA3oB/Qp6KLlurntf++xtdff82o+0YVac/Ly+Pqa67m2muupUYNPZ1Sire5PxmPANnEQv0w4NZKr6hsZgA94hvMrCGxK/DvKuF4I929K3As8FD0Cw8Ad5/t7vcCBwK7mlnTxMlmNtDMcsws5+ExD1dCeZIKMjMyWbx48YbtJUuWkJmRucm4yZ9MZvTDoxlx6whq1974zPiVK1dywaAL+OfZ/2SXXXbZKjVLatpcsHdx91Pc/X7gOCBpd8EkeBuoZ2b9AaIPLocDY9y90r7Dxt1fBnKAU6PjHh59kAvQEcgHfilm3ih3z3b37NMGnFZZ5UkV16VLF3788Ufmz5/PunXreOONN+jdq+j/UjNnzeTGm25kxK0jaNJk4xMp161bx+BLB3P4nw+n74F9t3bpkmI2t8a+rvCNu6/fmGHJ5e5uZkcD95jZVcR+Qb0GXP4Hdx2/xp7n7sX9H3Qd8ISZPQD8HRhpZquA9cSWcvL/YA0SqJo1azJ48GDOO/888gvy+cuRf6FDhw7cd/997LzzzuzXez/uuOMOVq9ezb/+/S8AmrdozsjhI3nzrTeZ8vkUfv31V8aPj30sdM0119BpJ92IJZva3Nf25gO/FW4CdYndFWLE8lVfBLaFdB+7iFSUct3H7u5plVOOiIhUFn2sLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISGAW7iEhgFOwiIoFRsIuIBEbBLiISmM0981Qq2MpVa5NdgogEosG2xbfril1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQlMUh+0YWZXAH8D8oEC4Ezgc+Bm4AjAgRnAOe7+k5m1Bca7e7e4fQwBVgLtgH2A2tH7WdGQ66N9jXf3Z+PmrXT3+tE+v44bDzDC3cea2VxgRVTHMqC/u/8Qzfdo3MXR9iVAfXcfUhE/GwnT5MmTuOuu28jPz+fww4/k5JP7F+l/+uknefXVV0hLS6NRo0ZceunltGjREoDBgwcxY8Z0dtmlO0OH3pqM8iVFJO2K3cz2Iha4u7t7d6Av8CNwI9AA6OTuHYEXgefNzErbn7uf4+5ZwJ+B2e6eFb2eLW1eJH58lruPjevbP6pvAnBlXPvvwDFm1qws5yuSn5/P7bffyrBhw3nkkSd45523mDt3TpExHTvuxP33j2b06EfZb7/9uf/+ezb0nXTSyVxxxdVbu2xJQclcimkJ5Ln77wDungf8ApwGDHL3/Kj9YWIhekCS6iw0EWgdt70eGAUMSk45kmpmzpxB69bb0apVa2rVqsUBB/Tlo48+KDJmt916kJ6eDkCXLl3JzV2yoa9Hj2zq1q23VWuW1JTMYH8D2N7MvjGze8xsP2BHYJ67L08YmwN0/YPHu8XMpha+Evo6xPeZWa9i5h9K7G8P8e4GTjazEp48KLJRbm4uGRnNN2xnZGSQm5tb4vhXXx3Pn/7Uc2uUJoFJ2hq7u680sx5AL2B/4CliyzClTtvC9niDE9fY4/pmR8s4xXnXzJoQW8e/qshB3Zeb2VjgfGB1GWoQKZM33vgfs2bN5Pbb7052KZKCknpXjLvnu/sEd78GOBc4EtjBzBokDO0BTAeWAo0T+poAeZVY5v5AG2AqcG0x/bcBZwDblLQDMxtoZjlmlvPYY49URo2SAmJX6Is3bMeu4DM2GZeT8ymPPfYIN944jNq1a2/NEiUQyfzwtJOZdYxryiJ2Z8ojwAgzS4vG9QfqAe+4+0pgoZkdEPU1IbZE8mFl1uru64ELgf7RMeP7fgaeJhbuJc0f5e7Z7p59yimnVmapUoV16rQzP/30EwsXLmDdunW8885b7L33vkXGfPvtLEaMGMaNN95M48ZNStiTSOmSebtjfeBOM2tE7IPI74CBxG4vvBX4xswKgJnA0e5euNzSH7jbzEZE29e6++w/WEuHhHX30e5+R/wAd19oZk8C5wD/SZg/nNjfOERKVLNmTS644CIGDx5EQUE+hx12BO3atWf06Afo1Kkz++zTi3vvvZvVq1dzzTWxG7CaN2/OjTfeDMB5553NvHk/sHr1Ko477q9ceum/tQYvxbKNeSlbw8KFS/UDF5EK0bJl02JvA9e/PBURCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCUwyH41XLa1c/XuySxCRwOmKXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCUzKBbuZuZk9Frdd08xyzWx8tD3AzO6K3ncyswlmNtXMvjazUVF7PTN73My+MrNpZvahmdWP+lbG7burmb1jZrPM7Fszu8rMLO44BWbWPW78NDNru1V+EBKEz3I+4cx/9Of/Tj+ZZ55+YpP+F55/mrMHDuDcs8/g8n9dxJLFi5JQpaSalAt24Degm5nVjbYPAuaXMPYOYKS7Z7n7zsCdUfsFwGJ338XduwFnAOviJ0b7fxkY6u6dgF2BvYF/xg37CbiiAs5JqqH8/Hzuvft2rv3PUO65fwzvTXibeT/MLTKmQ4eOjLzjPu669yH23Xc/Hh59f3KKlZSSisEO8BpwePS+H/BkCeNaEgtfANz9q7j2+XHts9w98Zl1fwM+cvc3ojGrgHOBf8WNGQ90NbNO5TwPqca++WYmLVu1okXLVtSqVYve+x3ApEkfFRnTfdfdSE9PB6BT5y7k5eUmo1RJMaka7OOAk8wsHegOTC5h3EjgHTP7r5kNMrNGUfto4DIzm2hm15tZx2LmdgU+i29w99lAfTNrGDUVADcDl/+x05HqaGleHhkZmRu2mzXLYOnSvBLHv/HGa/TI3nNrlCYpLiWD3d2/BNoSu1p/rZRxDwM7A88AfYBJZlbH3acC7YFbgCbAp2a2cznLeQLoaWbtyjlfZLPefedNvvtmFscee2KyS5EUkJLBHnkZuJWSl2EAcPcF7j7a3f8KrAe6Re0r3f15d/8n8Bjw54SpM4Ae8Q1m1h5Y6e7L4/a/HhgOXFZSDWY20MxyzCxn3JOPlTRMqpmmzZqRm7tkw3ZeXi5NmzbbZNzUzz/jqXGPcdWQG6hVu/bWLFFSVCoH+2jg2rh1802Y2aFmVit63wJoCsw3s33MrHHUXhvoAvyQMP1xYF8z6xuNq0vsw9ibiznUGKAvkFFcHe4+yt2z3T37pH6nbMEpSsh22qkzCxbMZ9Gihaxbt47333uHPXvuXWTM7O++5a47RnDVNTfQqFHjJFUqqaZmsgsoL3f/iVjQluZg4HYzWxNtD3b3RWZ2MHBvdOtiDeBV4LmE/a82s78Cd5rZ3UAa8ChwVzG1rDWzO4Db/9BJSbWSlpbGWWefz9VXXkpBfgEHHXwYbdq047Gxo+m4Uyf27LkPox+6jzVrVjP0xiEAZGQ05+ohNyS3cKnyzN2TXUO18u33C/QDF5EK0bF9KyuuPZWXYkREpBgKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwCjYRUQCo2AXEQmMgl1EJDAKdhGRwKTsM09T1YpVa5NdgogETlfsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYFIi2M2sqZlNjV6LzGx+3Hamma0zs7MS5sw1s6/M7Esze8/M2iT0v2hmk+K2vzezTgljbjOzy6L3WWbmZnZowpiVFX/GEqqpn3/KReedwYXnDOCl55/apP/r6V/x70vO4eTjD2PyxA+K9D3x6IMMvnAggy8cyMSPJmyliiUVpUSwu/tSd89y9yzgPmBk3PaxwCSgXzFT93f37sAE4MrCRjNrBPQAtjWz9lHzOOCkuDE1gOOidqL9f1jCcUQ2qyA/n4cfuJvLrrieW297gI8/fJeffvyhyJhmGRmcde7F7NNr/yLtUz6bzJzvv2Po8Hv5z9A7GP/Sc6xa9dvWLF9SSEoE+2b0Ay4GWpvZdiWMmQi0jts+BniFomH+JHBi3JjewA/u/oOZGXA8MAA4yMzSK658qS6++24WLVq0onmLltSsVYu99u1DzqcTi4zJyGxBm7btiV1XbDT/x3ns3GUX0tLSSE9PZ4c27fji85ytWb6kkJQOdjPbHmjp7p8AT1M0mOMdCrwYt92PWJA/Gb3H3b8CCsxs12jMSVE/wN7AHHefTezq//CKOwupLpb9vJSmzTI2bDdt0oxlS/PKNLdN2/Z88XkOv/++huXLf2XGtC9YujS3skqVFJfqD7M+kVigQ+zqezQwPK7/XTNrAqwErgIws+ZAR+BDd/dofb6bu08jFuQnmdl04Cjgmmg//di4JDMO6A88V2lnJZKge1YPZn83i2suH0SDhtvSsdPO1KiR0tdlUolS/U9GP2CAmc0FXga6m1nHuP79gTbAVODaqO0EoDEwJ5rXlo3r5uOi/r7Al+6+2MzSiK3jXx2NvxM41MwalLVIMxtoZjlmlvP8M0+U4zQlBI2bNGVp3sar7KU/59G4abMyzz/6uL8xdPi9XHHNUNydli1LWnmU6i5lg93MdgLqu3trd2/r7m2Bm0j4cNPd1wMXAv2jq/d+wKFxc3oQrbNHSy15wFA2LsMcSCzkt4/mtCF2tX50WWt191Hunu3u2ccc/7dyn7Oktg47dmLRwvksWbyI9evWMfHDCfTI7lmmuQX5+axYsRyAH+Z+z7wf5tA9q0dllispLJWXYvoBLyS0PQc8BVwX3+juC83sSeAcYlfwk+L65pjZr2a2p7tPJhboQ4HnN3Ocs4GxQD0z+ymub4S7j/hDZyZBSktLY8A/zuGm/1xOQUEBfQ44mO13aMszTz5Cux13InuPvZj93SxGDLuO335bwZScSTwzbiy33v4A6/PzufbKiwGoW7ce51xwGWlpaUk+I6mqzN2TXUO1MmXaXP3ARaRC7N6trRXXnrJLMSIiUjwFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEhgFu4hIYBTsIiKBUbCLiARGwS4iEphUfjReShr58vfJLkFEAvFot7bFtuuKXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCYyCXUQkMAp2EZHAKNhFRAKjYBcRCUy1e9CGmeUDXxE796+BU919lZnVBBYCD7n7v+LGTwBaAmuAtcD/ufvUqG8ukO3ueWbWA3gWOMbdP996ZySpbJf2Tfj7QR2pYcaELxYyfuIPRfo7bd+IUw7qyPaZ23D3i9P5dGZukiqVVFIdr9hXu3uWu3cjFtRnRe0HAd8Ax5uZJcw52d13Be4BbkncoZl1JxbqJyrUpazM4NRDOnHLU19w2ajJ7NUlk1bN6hUZs3T5Gka9MoOJ0xcnqUpJRdUx2ON9AOwYve8H3A7MA/YqYfxEoHVC287Ai8Df3f2TSqhRAtWhVUMWL1tF7i9ryC9wJs1YQo+OGUXG5P26hh9zf8M9SUVKSqq2wR4tvRwGfGVm6UBf4BXgSWIhX5xDiYV4vJeAc939w0oqVQLVuEEdfl7++4btn1f8TuMGdZJYkYSiOgZ7XTObCuQQuzp/CDgCeNfdVwPPAUeZWVrcnMfNbA5wBXB3wv7eAv6RMF5EJGmqY7AXrrFnuft57r6W2BV63+jD0M+ApsABcXNOBtoDjwB3Juzv3Oi/95R0QDMbaGY5Zpbz7SfjK+o8JMUtW/E7TRpuvEJv0qAOy1b8XsoMkbKpjsFehJk1BHoBO7h7W3dvC5xDwnKMuztwFdDTzDrHdRUAfwM6m9l1xR3D3Ue5e7a7Z3f80xGVcRqSgr5fsIIWjeuRsW06aTWMnl0ymfJtXrLLkgBUu9sdi3E08I67x18qvQTcbGZFFjzdfbWZDQcGA2fEta8xs78A75nZYndPXK4R2USBO2Pf+IbBJ2VRo4bx/hcLmJ/3G8f0bsechSv4/Ns82rVswIXH7sI26bXI2rEZx/Rqx78f0Gf0Ujpzfdy+Vf39xnf0AxeRCvHo5Qck3poNaClGRCQ4CnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcDo0XgiVZCZDXT3UcmuQ1KTrthFqqaByS5AUpeCXUQkMAp2EZHAKNhFqiatr0u56cNTEZHA6IpdRCQwCnaRcjKzfDObambTzOwZM6tXzJghZnZJ9H6Mmc0xsy/M7BszG2tm28WNfc3MGpVyvAuLO0Zc/4Nm1qWU/j5mtneZT1BSloJdpPxWu3uWu3cD1gJnlWHOYHffFegEfA68Y2a1Adz9z+7+SylzLwSKDXYzS3P3f7j7jFLm9wEU7NWAgl2kYnwA7AhgZldEV+QfEgvwTXjMSGARcFg0b66ZNTOzbczs1ejKfpqZnWhm5wOtgHfN7N1o/EozG25mXwB7mdkEM8uO+g41synRPt42s7bEfvEMiv6W0atyfxySTDWTXYBIqjOzmsTC+X9m1gM4Ccgi9v/XFOCzUqZPAToDL8W1HQoscPfDo/1v6+6/mtlFwP7unheN2waY7O4XR+MK68kAHgB6u/scM2vi7j+b2X3ASne/tSLOW6ouXbGLlF9dM5sK5ADzgIeAXsAL7r7K3ZcDL29mH1ZM21fAQWY2zMx6ufuvJczNB54rpr0n8L67zwFw9583fyoSEl2xi5TfanfPim8ovGreArsBb8c3uPs3ZrY78GfgejN7292vK2buGnfP39IDSvh0xS5Ssd4HjjKzumbWADiyuEEWcz7QEvhfQl8rYJW7PwbcAuweda0AGpShhklAbzNrF+2vyRbOlxSnYBepQO4+BXgK+AL4L/BpwpBbog87vwH2ILZmvjZhzC7AJ9EyzzXA9VH7KGLr+O9upoZcYl8i9nx0rKeirleAo/Xhafj0L09FRAKjK3YRkcAo2EVEAqNgFxEJjIJdRCQwCnYRkcAo2EVEAqNgFxEJjIJdRCQw/w+HHLWQj5c8XAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOAAAADeCAYAAAAkXQw8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAhrUlEQVR4nO2deXgV5dn/P9/IGgggyCogCiKICigiIO7bK9Vqrf2pdSsquKCv4trFtmpfK+5aEa2K4lK1i2JdcEFFRasIIggKKghlJ8hOiCzJ/ftjnsSTcE5ysk4S7s91zZWZZ73nZL7zLDPz3DIzHMeJh4y4DXCcnRkXoOPEiAvQcWLEBeg4MeICdJwYcQE6Toy4AB0nRlyAdRRJCyXlStooaZ2k/0i6RFJGiB8naaukTZLWSJooqUdC/pskPZOkXJPULey/J+kHSZ0S4o+VtLCYHccmHJ8paa2kIyR1CeVtKradkWCjSeqfkL+bJEs4TteG3GJ1jA5xDSTdLWlJCF8o6b6EvIPDb7c+/E4fSTq4HP+SpLgA6zYnm1kWsAcwCrgBGJsQf4eZNQV2B5YWi0uXHOD36SSUdD7wIPATM3s/IaqFmTVN2P6eELcG+L9KsOHkYnVcHsJ/A/QD+gNZwJHA9GBvM+BV4AGgJdHvdDOwpZS60sYFuBNgZuvN7GXgDOB8SfsVi88F/gH0KUfxfwHOktS1pESSLgbuBk4ws/+UofwngQMkHVFRG1JwMDDezJZZxEIzeyrEdQcws+fMLM/Mcs3sLTP7ohz1JMUFuBNhZp8CS4DDEsMlNQHOAuaVo9ilwKNELUMqLgVuAY4xs2llLH8z8Gfg1grakIpPgKslXSZpf0lKiPsGyJP0pKQTJe1ajvJLxAW487GMqDsFcK2kdcBGYDBwbjnLvA04WVKvFPHHEV3os1LEfx/GqQVbz2LxfwU6SzqxAja8VKyOYQn5bgfOBqYBS0NXGTPbQPS7GJHAV0l6WVLbEuwoEy7AnY/dicZVAHeZWQugC5AL7JOQbjtQPzGjpILjbYnhZrYKGE3UyiXjUqLu3GPFWpgCdjOzFgnbnGLlbwH+FLakpGHDqcXqeDTkyzOzB83sUKAFUUv7eMFNwMzmmNmvzKwjsB/QAbgvlR1lxQW4ExFm73YHPkwMN7NFwJXA/ZIah+BFRMJMZE8iYS5NUvydwFHAQUniVgLHEHV9x5TT/CeIBHJaCWlKsqFUwhjvQWAtsG+S+LnAOCIhVgouwJ0ASc0knQQ8DzxjZjt0Bc1sIlH3dHgIegPoIelcSfUltSQai71gZtuT5F9HNMlyfTIbzGwZkQj/R9K9ZT2HUOcfiWZyU6Up0YZkSLpK0pGSGkuqF7qfWcDnknpIukZSx5C2E9FY+ZOy2p8KF2Dd5hVJG4HFwO+Ae4ChJaS/E7heUkMzywZOBC4GsoHZwDqi7mQq7gfyUkWGlvZo4HRJtyVErSv2jO7qFEU8Bywvof6SbHilWB3jQ/hmItGuAL4HRgA/N7PviMbGhwBTJOUQCW82cE0pNqSN/INcx4kPbwEdJ0ZcgI4TIy5Ax4kRF6DjxIgL0HFipF7cBjjp848Bg33Kupby/z75MNkbQN4COk6cuAAdJ0ZcgI4TIy5Ax4kRF6DjxIgL0HFixAXoODHiAnScGHEBOk6MuAAdJ0ZcgI4TIy5Ax4kRF6DjxIgL0HFixAXoODHiAnScGPEPcp0qp92AQ+gz8kqUkcGCl19l7tM7uB2k4zFH0+uioWCw7tt5TPlj5GflgBGX0n7QQAC+emIci99+t1ptr2pqRQsYHDnmSpqRIv7I4EBxRtj+kBB3paTZkr6UdFWK/M0lvSJpZkg3NITvIWl6KPNLSZekYestSnBImSJNQ0lvh3LPkPS8pL1LK7s2oowMDrz2aiaPvJY3zzqHzscfS7MuXYqkadqpIz3PO4d3h1/Gm788lxn33Q9A+0EDabFPd946byhvXzicfX55FvUyM2M4i6qjNrWA882sTwnxk83spMSA4AdvGJHzxa3AG5JeNbPibrhGAF+Z2cmSWgNfS/ob0SrMA81si6SmwGxJL4dl1pNiZn9IFZdA35C2T7BzBdFy6sNKyFMrablvTzYtWULOsugnWzTxbTocPpgNCxcWptnrlJOZ98KLbNu4EYAta9cB0GzPLnz/+QwsL4+8vDzWzZtPu4EDWPJO3WkFa0ULWAF6AlPMbHPwLfA+yZ17GJAVPPc0JfIetN3MtgbPPAANSeP3UuRW+fSwv1DSzaEVnRV8DbQBngEODi1gV2AycKyk2nRDTIvGrVuzOTu78Dg3exWNW7cukiarUyeyOnfi6EfGcMxjf6XdgEOAqCvabuAh7NKwIQ2aN6fNQQeS2bZNtdpf1dSlf/hASTOJHIxca2ZfEq3jf6ukVkTut4YQ+YArzmjg5ZA3CzjDzPKh0CHHa0A34LqSWr8UfG9mB0q6LNh1kaSLwn5hiy1pHtAb+KyM5dd6tMsuNO3YiUmXXkFmmzYc9fBo3jz7fFZ+OpWW+/bk6EcfZsu6dayePRvLS+l6olZSV1rA6cAeZtabyJ/3SxD5diNyvvgWkbefGSR33HFCiOtA5KZ5dPAPjpktNrMDiAR4fjmcM74Y/n7Gju6+EskO9RdB0nBJ0yRNezt7RRmrjp/cVavIbPNjq9W4TWtyV60qmiZ7Fcsmf4jl5ZGzfDkbFy2maaeOAMwZ9xQTzxvKB/87EhAbFy2uTvOrnFopQEkjEiZcOpjZBjPbBGBmE4D6knYLx2PN7CAzO5zI79s3SYocCrwYfITPAxYAPRIThJZvNsXcO6dBQRc2j5J7HI2IWukimNkjZtbPzPod26ZdGauOnzVz5tK0UyeatG9PRr16dD7uWJZN/qhImqUfTKbNgX0BaNC8OVmdO5GzdBnKyKBBs2YANO/WlRbdurLy06nVfg5VSa3sggYnig8WHEtqB6w0M5PUn+jGsjrEtTGzbEmdicZ/A5IUuYjId93k0MLtA3wX/MKtNrPc4B98MHBvKPcpYHTwu14ZdCcSeJ3C8vKYftc9HH7/PdFjiFdfY8OCBfQadiFr585l2eSPWPHJFNoecjAnPPc0lpfPzAfGsHXDBjIaNOCov0b/5u05m5ly0y11rgtaKwWYhNOBSyVtJ2pFzrQf/a69EMaA24ARwYkjBY8UzOxhItfH4yTNAgTcYGbfSzoOuFuShfC7EpxbHkA0ZqwwQfS5Zlb7+phpsOLjT3j946I+Lb98dGyR45n3j2bm/aOLhOVv3cqbZ5XXbX3toFb4B5TUBXjVzCrNNXBFCOPDsWb2i0oqbySwwczGlpTOV8auvdT2lbHzgOapHsRXN2HMWSniC6wDnqzE8pxaQq3ogprZYqBT3HZUFWb2RNw2OPFQW1pAx6mTuAAdJ0ZcgI4TIy5Ax4kRF6DjxIgL0HFixAXoODHiAnScGHEBOk6MuAAdJ0ZcgI4TIy5Ax4kRF6DjxIgL0HFipFZ8juRENO1Qt5bkc7wFdJxYcQE6Toy4AB0nRlyAjhMjLkDHiREXoOPEiAvQcWLEBeg4MeICdJwYcQE6Toy4AB0nRlyAjhMjLkDHiREXoOPEiAvQcWIkre8BJZ2WJHg9MMvMsivXJMfZeUj3g9wLgYHApHB8JPAZsKekW8zs6Sqwzakj7Na3L/tecAHKyGDx22/z3fjxO6RpN2gQe59xBpixceFCZtx3HwAn/vOfbFy0CIDc77/ns9tuq07Tq5x0BVgP6GlmK6HQp/lTwCHAB8AOAgxupecAX5tZnyTxRwL/BhaEoBfN7JYQdyUwjMgv+6Nmdl+S/M2BZ4DOwb67Eh1dBjfSXwEvmdnlaZ5nQd6FwEYiz7zbzaxfCO8NPAw0BRYCZ5vZhiT5RwIXAQbMAoaa2Q+SxgL9wnl9A/zKzDZJuhzYbGaPl8XOWkFGBr2GDePTm2/mh9WrOfSOO8ieOpVNS5YUJsls356up53Gx7/9LdtzcmjQvHlhXN7WrXx4zTVxWF4tpDsG7FQgvkB2CFsDbCsh3/xk4ktgspn1CVuB+PYjEl9/oDdwkqRuSfKOAL4ys95ELfLdkhokxP+J6OZQXo4KdvVLCHsM+LWZ7Q+MB64rnknS7sD/Av2CT/tdgDND9Egz621mBwCLgIIbw+PAFRWwtcbSols3Ni9fTu7Kldj27Sz/8EPa9u9fJE2nY4/lv2+8wfacHAC2rl8fh6mxkK4A35P0qqTzJZ0PvBzCmhD5N69MegJTzGyzmW0H3geSjUENyJIkohZpDbAdQNJBQFvgrUq2rTs/inoi8PMU6eoBjSXVAzKBZRD5lg/2CWgczgEz2wwslNQ/eXG1l0atWvHD6tWFx7mrV9OwZcsiaZp06ECT9u0Z8Oc/M3DUKHbr27cwLqNBAw694w4Gjhq1g3DrAukKcATwBNAnbE8CI8wsx8yOqkD9AyXNlPS6pF4hbDZwmKRWkjKBIST3Dz+aSKzLiLp5V5pZvqQM4G7g2grYZcBbkj6TNDwh/EvglLD/i2R2mdlS4C6iFm45sN7MCm8Ekp4AVgA9gAcSsk4DDquAzbWWjF12oUmHDkz5/e+Zcc897H/ppdTLzARg0sUX89H11zPj3nvpecEFZLZtG7O1lUtaAjQzI7pAXjOzkcAEolanIkwH9ghdyAeAl0Jdc4DbiVqvN4AZRGOx4pwQ4joQ3RRGh3HfZcAEM1uSJE+6DDazA4ETgRGSDg/hFwCXSfoMyAK2Fs8oaVcike4ZbGsi6ZyCeDMbGsLnAGckZM0O4cXLGy5pmqRpry9YUDy6xvPD6tU0atWq8Lhxq1ZsWbNmhzTZU6dieXnkZmeTs2wZTTpEP0VB2tyVK1kzezbN9tqr+oyvBtISoKRhwL+Av4ag3QmCSRdJIyTNCFsHM9tgZpsAzGwCUF/SbuF4rJkdZGaHA2uJJiyKM5Ro4sbMbB7RZE4Potnay8NEyl3AeZJGlWBXpwS7Lgn1Lw1/s4nGev3D8VwzO97MDgKeA+YnKfJYYIGZrTKzbcCLwKDEBGaWBzxP0S5sIyC3eGFm9oiZ9TOzfifuuWeq06ixrJ83jybt29O4TRtUrx7tBw9m5dSpRdKs+PRTWvaKOkD1s7Jo0qEDm1esoF6TJmTUq1cYvmuPHmxavLjaz6EqSXcWdATRRTgFwMy+lVSmRSrN7EHgwYJjSe2AlWZmYeyTAawOcW3MLFtSZ6Lx34AkRS4CjgEmh1nZfYDvzOzshDp+RTQZ8utw/BQw2sw+TbBrMVELWpCnCZBhZhvD/vFAwQRRgV0ZwI1EM6LJ7BoQus+5wcZpYdzX1czmhf2fAnMT8nUHPirxR6yFWH4+Xz72GP3/8AfIyGDJO++wafFi9j7zTNbPn0/21Kl8//nntO7dm8Puvx/y85n75JNs27SJFvvsw/6XXIKZIYn548cXmT2tC6QrwC1mtjW6biBMLlgF6z4duFTSdqIL9czQ1QV4QVIrohnWEWa2LtRb0EI9TDTLOU7SLKJp/RvM7PtS6jyAMCFSAm2B8eFc6wHPmtkbIe4sSSPC/otE42IkdQAeM7MhZjZF0r+Iutjbgc+BR4KNT4ZusoCZwKUJ9R4K3FSKbbWSVdOn8/706UXCvn3++SLHc8aNg3HjioSt+/prJo8cWcXWxYt+vOZLSCTdQTTbeR7RdPllRI8AfldCni7Aq2EqPnbChT/WzH4Rty3FkdQXuNrMzi0p3YTTTqvoTc+JiSEvvqhk4enOgv4aWEU023gx0STMjaXkyQOaS5qRZh1VShhz1jjxBXYDfh+3EU71k1YX1MzygUfDlhZhbJXs8YFTDDObGLcNTjyUKMAwvkrZ7QlvdDiOU05KawFPCn8LJh4K3vk8h4pPwjjOTk+JAjSz/wJIOs7M+iZE3SBpOtHY0HGccpLuJIwkHZpwMKgMeR3HSUFZvgd8PHwCJKK3Uy6oMqscZych3VnQz4DeQYCY2c7zvYjjVCFl7UbuD1wo6biqMMZxdjZKFKCkTxP2hxF9ApQF3CTJJ2Acp4KU1gLWT9gfDhxnZjcTvaB8dvIsjuOkS2ljwIzwfVsG0XujqwDMLCe8RO04TgUoTYDNiVY/E2CS2pvZcklNQ5jjOBWgtAfxXVJE5QM/q3RrHGcno8wP0yVdFhZMqn3rIzhODaO0l7GvLh4E/EZSIwAzu6eqDHOcnYHSWsCbiRbfbUr0+KEp0TqXWWFzHKcClPhFfFiT5W7gO+BmM9ss6Tszq1tLU9UStm3e7F+g1FLqZ2aW/Yt4M1sUviL/DzBR0ulVYZzj7Kykuy7ov4kevh8C1K1lqRwnRtJalKnUQqQXzCzVMu1OJeFd0NpLubqgZcDHhI5TDipLgH5ndpxy4F+1O06MVJYA/b1QxykH6TpnOTn4Q0jFDZVkj+PsVKTbAp4BfCvpDkk9ikcm+r9zHCd90n0OeA7Ql8gd1zhJHwe/df46muNUgLTHgMG98r+I/Nq1J/ocabqkOunb3HGqg3THgD+VNB54j2iZiv5mdiLQG7im6sxznLpNuuuC/hy418w+SAwML2dfWPlmOc7OQWW9ivaxmQ2sBHucEvBX0WovVf0qWqNKKsdxdir8VTTHiRF/Fc2pcj786CNOOvVUTvzpT3ns8cdTppv49tvs17cvs7/8EoB169YxdNgwDh40iFtHjaouc6uVKnsVTVIXSbmpXFRLOlLSekkzwvaHhLgrJc2W9KWkq1Lkby7pFUkzQ7qhCXF3hLA5kv4iqUyvyklaKGlWsGtaQnjv8Ax0Vqi7WYr8I0P9syU9V7CGTkL8XyRtSji+XFKddHaTl5fH/40axUOjR/PyCy8w4Y03mD9//g7pcnJyeObZZzlg//0Lwxo0bMgVl13GtSNHVqfJ1UppS9M/lOoiK8a5KcLnm1mfEvJNNrM+Ybsl1LkfMAzoT/SY4yRJ3ZLkHQF8ZWa9gSOBuyU1CK7TDgUOAPYDDgaOSOMcinNUsKtfQthjwK/NbH9gPHBd8UySdgf+F+hnZvsRraFzZkJ8P2DXYtkeB+rk89RZs2fTuVMnOnXsSP369TnxhBN49733dkj3wJgxXDB0KA0aNCgMy2zcmAP79qVhw4bVaHH1UloL+B3wmaRflpTIzGZXnkn0BKaEpQ+3A+8DpyWrFsgKrVtTYA2wPYQ3AhoADYmeW66sJNu6AwWPYiYSPZ5JRj2gsaR6QCawDEDSLsCdwPVFTsRsM7BQUv9KsrPGkJ2dTbu2bQuP27ZtS/aqVUXSfDVnDitWrOCIww6rbvNip7Q1Ye4kal1OkfSOpNMlnVawVUL9A0MX8nVJvULYbOAwSa0kZQJDgE5J8o4mEusyYBZwpZnlm9nHwCRgedjeNLM5ZbTLgLckfSZpeEL4l8ApYf8Xyewys6XAXcCiUP/6hHdlLwdeNrPlSeqcBux0V2B+fj533H03112zc77PUeoYMFxQrxHd/U9O2E4qKV8aTAf2CF3IB4CXQn1zgNuBt4A3gBlAXpL8J4S4DkAfYLSkZqG72hPoCOwOHC2prBf2YDM7EDgRGCHp8BB+AXCZpM+IlmXcWjxj8KVxCrBnsK2JpHMkdSAS7QMp6swO6YuXN1zSNEnTSprAqKm0adOGFSt/7ICsXLmSNq1bFx7n5OQwb/58hl50EccPGcIXs2ZxxVVXFU7E1HVKW5i3F/AQUSvTP8WdOy0kjSAa2wEMMbNlBXFmNkHSGEm7mdn3ZjYWGBvy/ZnkC0ENBUZZ9CbBPEkLgB5E471PzGxTyP86MBCYnMKuTsAr4fBhM3s43HQws+zwCl5/4AMzm0u0OBWSugM/SVLkscCCAkc2kl4EBhF5Fe4WbAXIlDTPzArGt42A3OKFmdkjwCNQOx/E79erF4sWLWLJ0qW0bdOG1998kztuu60wPisriw8nTSo8/tVFF3HtyJHs16tXsuLqHKW9ijYVODXZ50aSDjOzpBd1MszsQeDBhPztgJVmZmHskwGsDnFtwsXfmWj8NyBJkYuAY4DJktoC+xCNWfcEhkm6jWh29gjgvlDuU8BoMyv0e2hmi4la0AK7mgAZZrYx7B8PFEwQFdiVAdwIPJzCrgGh+5wbbJxmZq8B7RLq2ZQgPoh6GB+V8BPWSurVq8dvb7iBiy+7jLz8fH52yil069qV0WPG0GvffTnqyCNLzH/8kCFsyslh27ZtvDtpEo+MGUPXrl2rx/hqoLSFeRcQtYB3m1leCGtLtFhvj2IzhMXzdgFeDTOByeIvBy4lmjjJBa42s/+EuMlAK2BbCH8nhF8CYGYPhy7dOKIvM0TUGj4TJjrGAIcTjeXeMLOrQ/4ZwElmlnJpRUl7Ec1wQnSDetbMbg1xVxLNvgK8CPwm3EA6AI+Z2ZCQ7maibyi3A58DF5nZlmL1bDKzpgnH04n8L65OZVttbAGdiFSvopUmwBbAKKJp/SuJXFRfDdwBPGRm+SXk7UIJAqxuwuOUsWGh4RqFpL5EN5pUj3MAF2BtplwCLEwU3fnvJRoLDiipBUnI04loRe3VpTwL3OmRdBzwrZktLCmdC7D2UpEW8HaiFbGvJ3okcAzRlP+7lW+mUxIuwNpLeQX4HdF46r7wUBxJfULYf83srMo31UmFC7D2kkqApc2CHl68u2lmM4BBkoYlz+I4TrpUyge5TvXgLWDtpao/yHUcpxy4AB0nRlyAjhMjLkDHiREXoOPEiAvQcWLEBeg4MeICdJwYcQE6Toy4AB0nRlyAjhMj6XpHcmoAY/79RdwmOOXkyrOSrariLaDjxIoL0HFixAXoODHiAnScGHEBOk6MuAAdJ0ZcgI4TIy5Ax4kRF6DjxIgL0HFixAXoODHiAnScGHEBOk6MuAAdJ0ZcgI4TIy5Ax4kR/yDXqXL2aN+cIw7sgiS+nJ/NtDnLisT33acdvbq2wczI/WE7E6fMZ+PmrQBkZTbgmP57kZXZEMP49/tfszFnS7JqaiU1ugWU1FjS+8Hve/G4SySdl0YZz0n6QtLIMtQ7TtICSTPC1ieE7yppfCjvU0lJ3W9LOkbS9JD3Q0ndQnhnSZMkfR7KKPApv7+kcenaV5uQ4MiD9uSl9+by9ISZdN+jFS2bNS6SZtXazTz/5mz+9vosvl28hsF99iiMO35AN6bPXc7TE2by97dmk/vDtuo+hSqlRgsQuAB40czyikeY2cNm9lRJmSW1Aw42swPM7N4y1n2dmfUJ24wQ9ltghpkdAJwH3J8i70PA2cE197PAjSH8RuAfZtYXOJPI0SlmNgvoKKlzGW2s8bRt2ZT1m35gQ84W8vONbxatZq+OuxZJsyR7A9vz8gFYsXojTTMbANCyWWMyMmDRivUAbNueX5iurlDTBXg28O9kEZJuknRt2H9P0u2hVfpG0mEh2VvA7qElOixZOWVkX+BdADObC3SR1DZJOgOahf3mwLJSwgFeIRJlnaJpZoPC7iTAps1badq4Qcr0vfZqw8Ll6wBokdWILVvz+Mng7pz1P/szuE9nlNTLXu2lxgpQUgNgLzNbmGaWembWH7gK+GMI+ykwP7Rik8towq2hm3ivpIYhbCZwWrCvP7AH0DFJ3ouACZKWAOcCo0L4TcA5IXwCcEVCnmlAZdwkai37dNmNNi2bMD2METMyRIfWWUz+/L88/+YsmjdtyL57to7ZysqlxgoQ2A1YV4b0L4a/nwFdKlj3b4AewMFAS+CGED4KaCFpBpF4Pgd26B4DI4EhZtYReAK4J4SfBYwL4UOApyUV/A+ygQ7FC5I0XNI0SdP+885LFTyt6mfT5q1kZf7Y4jXNbMCm3K07pOvUthn9992dVz74mrx8K8y7at1mNuRswQzmL1lL612bVJvt1UFNFmAu0KjgQNKtBZMiKdIXTI3lUcbZXUlvhrIfAzCz5RaxhUhA/UP4BjMbGsZ25wGtge+KldUa6G1mU0LQ34FBYf9C4B+hrI/D+e0W4hqFcy6CmT1iZv3MrN+gY04ty2nVCFau2USLrEY0a9KQjAzRvXMrvluytkia1rtmcvTBe/HKB1+Tu2V7kbwN6+9C44bRv7NT22as2bDDT1SrqbGPIcxsraRdJDUysx/M7HfA7ypSpqTLQ9mji9V1QrF07c1suSQBpwKzQ3gLYLOZbSXqZn5gZhuKVbMWaC6pu5l9AxwHzAlxi4BjgHGSehKJblWI615QT13CDN6btpBTj+yBJL76Lps1G3IZsH9HVq7JYcHStQzuswcN6mcwZPDeAGzM2cIrk7/BDD6csYjTju4JiOw1Ocyenx3vCVUyNVaAgbeAwcDblVReD+CjNNL9LbRkAmYAl4TwnsCTkgz4kqhFA0DSBOAiM1smaRjwgqR8IkFeEJJdAzwaHokY8CszsxB3FPBaRU6uprJw+ToWvrauSNgns5YU7o+fNIdULFqxnr+9PquqTIsd/fj/r3lIOhAYaWbnVlJ5rwKnhRasxhAmed4HBpvZ9lTp7n/uk5r7z3JK5MqzBiSdv63JY0DMbDowKdmD+HKWd1JNE1+gM/DrksTn1E1qehcUM3s8bhuqGjP7Fvg2bjuc6qdGt4COU9dxATpOjLgAHSdGXICOEyMuQMeJEReg48SIC9BxYsQF6Dgx4gJ0nBhxATpOjLgAHSdGXICOEyMuQMeJEReg48SIC9BxYqRGfxHv7FxIGm5mj8RtR3XiLaBTkxgetwHVjQvQcWLEBeg4MeICdGoSO9X4D3wSxnFixVtAx4kRF6DjxIgL0NkBSZ2Ch+CW4XjXcPyDpP0T0l0n6a+VWG9nSZsK/D6GsIWSZgXnOdNS5OsiqVb61ajxC/M61Y+ZLZb0EJE7tuHh7yNE7tjGSDqcyJXaJUC/Sqz6HuD1JOFHmdn3lVhPjcFbQCcV9wIDJF1F5CDnLjN7A1hO5JrtXuAmM1ubLLOkpySdmnD8N0mnpKospF1A5PSmVCQdJGmmpJnAiITwXSTdKWlqcLB6cQjPkDRG0lxJEyVNkHR6OnVVKWbmm29JN+AEIi9OxyWEdQCWAJNKyXsE8FLYb04krnop0jYFPg5/bwKuTYhbAEwncrw6PCH8C+DwsH8nMDvsDwduDPsNiTwP7wmcTuSVOANoR+S16vS4f2NvAZ2SOJGoxduvIMDMlgHvAg+VlNHM3gf2Dm7ezgJesNTOZ24C7jWzTUniBpvZgcGWEZIOD34aW5jZByHN0wnpjwfOC45cpwCtgL2JWvF/mlm+ma0AJpVkf3XhY0AnKZL6EDkXHQB8KOl5M1seovPDVhpPAecAZwJDS0h3CHC6pDuAFkC+pB/MbLSZLQUws2xJ44m8FX9RkunAFWb2ZrHzGZKGvdWOt4DODgTPwA8BV5nZIqIu3l3lKGoccBWAmX2VKpGZHWZmXcysC3Af8GczGy2piaSsYFMTotZttpmtA9ZJGhyKODuhuDeBSyXVD/m6h7wfAT8PY8G2wJHlOJ9Kx1tAJxnDgEVmNjEcjwGGSjoidC3TwsxWSpoDvFROO9oC46P7AfWAZy2aCIKoRX08eCt+KyHPY0AXYHq4kawicjP+ApF78K+AxUTjyvXltKvS8FfRnCpDUiYwCzjQzOK/2KWmZrZJUivgU+DQMB6MDW8BnSpB0rHAWKLJldjFF3g1TOA0AP4Ut/jAW0CngoQ3Y54uFrzFzA5JkvYE4PZiwQvM7GdVZV9NxwXoODHis6COEyMuQMeJEReg48SIC9BxYsQF6Dgx8v8Bf11023hpuz8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for c in X_train.columns:\n", + " for i, name in enumerate(y_train_dummies.columns):\n", + " _ = pipe.fit(X_train.copy(), y_train_dummies[name])\n", + " pipe.steps[-1][1].display_mapping(cmap=\"vlag\", k=1, title=name)" + ] + }, + { + "cell_type": "markdown", + "id": "2b762678", + "metadata": {}, + "source": [ + "## offline pipeline - feature selection" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ea88ce86", + "metadata": {}, + "outputs": [], + "source": [ + "steps = [\n", + " (\n", + " \"ConvertColumnDatatype\",\n", + " ConvertColumnDatatype(columns=[\"Dates\"], datatype=\"datetime64[ns]\"),\n", + " ),\n", + " (\"OrdinalHourOfDay\", OrdinalHourOfDay(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfWeek\", OrdinalDayOfWeek(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfMonth\", OrdinalDayOfMonth(columns=[\"Dates\"])),\n", + " (\"OrdinalMonthOfYear\", OrdinalMonthOfYear(columns=[\"Dates\"])),\n", + " (\"CyclicHourOfDay\", CyclicHourOfDay(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfWeek\", CyclicDayOfWeek(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfMonth\", CyclicDayOfMonth(columns=[\"Dates\"])),\n", + " (\"CyclicMonthOfYear\", CyclicMonthOfYear(columns=[\"Dates\"])),\n", + " (\n", + " \"Contains\",\n", + " Contains(\n", + " columns=[\"Address\", \"Address\", \"Address\"],\n", + " contains_vec=[\"/\", \"AV\", \"ST\"],\n", + " column_names=[\"IsIntersection\", \"IsAvenue\", \"IsStreet\"],\n", + " ),\n", + " ),\n", + " (\"DropColumns\", DropColumns(columns=[\"Dates\", \"Address\"])),\n", + " (\"PlaneRotation\", PlaneRotation(columns=[[\"X\", \"Y\"]], theta_vec=[15, 30, 45])),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=2, min_samples_leaf=300), inplace=True\n", + " ),\n", + " ),\n", + " (\n", + " \"PolynomialObjectFeatures\",\n", + " PolynomialObjectFeatures(\n", + " columns=[\n", + " \"PdDistrict\",\n", + " \"X\",\n", + " \"Y\",\n", + " \"XY_y_45deg\",\n", + " \"Dates__hour_of_day\",\n", + " \"Dates__day_of_week\",\n", + " \"Dates__day_of_month\",\n", + " ],\n", + " degree=2,\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.05)),\n", + " (\"InformationValue\", InformationValue(k=20, max_iv=50)),\n", + "]\n", + "\n", + "pipe = Pipeline(steps=steps, verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8e6a2be1", + "metadata": {}, + "outputs": [], + "source": [ + "feature_importances_dummy = []\n", + "for i, name in enumerate(y_train_dummies.columns):\n", + " _ = pipe.fit(X_train.copy(), y_train_dummies[name])\n", + " feature_importances_dummy.append(pipe.steps[-1][1].feature_importances_)\n", + "feature_importances_ = (\n", + " pd.concat(feature_importances_dummy, axis=1)\n", + " .fillna(0)\n", + " .rename(columns=target_mapping_)\n", + ")\n", + "feature_importances_[\"sum\"] = feature_importances_.sum(1)\n", + "feature_importances_ = feature_importances_.sort_values(\"sum\", ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8a852019", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "feature_importances_[\"sum\"].sort_values().plot(\n", + " kind=\"barh\",\n", + " figsize=(6, 6 * 1.62),\n", + " title=\"feature importance\",\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a71b5e9f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(10, 10 * 1.62))\n", + "sns.heatmap(feature_importances_.drop(\"sum\", axis=1), ax=ax, cmap=cmap, annot=True);" + ] + }, + { + "cell_type": "markdown", + "id": "c5247046", + "metadata": {}, + "source": [ + "All the features will be used.\n" + ] + }, + { + "cell_type": "markdown", + "id": "18e93bf5", + "metadata": {}, + "source": [ + "## pipeline optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "92f43766", + "metadata": {}, + "outputs": [], + "source": [ + "steps = [\n", + " (\n", + " \"ConvertColumnDatatype\",\n", + " ConvertColumnDatatype(columns=[\"Dates\"], datatype=\"datetime64[ns]\"),\n", + " ),\n", + " (\"OrdinalHourOfDay\", OrdinalHourOfDay(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfWeek\", OrdinalDayOfWeek(columns=[\"Dates\"])),\n", + " (\"OrdinalDayOfMonth\", OrdinalDayOfMonth(columns=[\"Dates\"])),\n", + " (\"OrdinalMonthOfYear\", OrdinalMonthOfYear(columns=[\"Dates\"])),\n", + " (\"CyclicHourOfDay\", CyclicHourOfDay(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfWeek\", CyclicDayOfWeek(columns=[\"Dates\"])),\n", + " (\"CyclicDayOfMonth\", CyclicDayOfMonth(columns=[\"Dates\"])),\n", + " (\"CyclicMonthOfYear\", CyclicMonthOfYear(columns=[\"Dates\"])),\n", + " (\n", + " \"Contains\",\n", + " Contains(\n", + " columns=[\"Address\", \"Address\", \"Address\"],\n", + " contains_vec=[\"/\", \"AV\", \"ST\"],\n", + " column_names=[\"IsIntersection\", \"IsAvenue\", \"IsStreet\"],\n", + " ),\n", + " ),\n", + " (\"DropColumns\", DropColumns(columns=[\"Dates\", \"Address\"])),\n", + " (\"PlaneRotation\", PlaneRotation(columns=[[\"X\", \"Y\"]], theta_vec=[15, 30, 45])),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=2, min_samples_leaf=300), inplace=True\n", + " ),\n", + " ),\n", + " (\n", + " \"PolynomialObjectFeatures\",\n", + " PolynomialObjectFeatures(\n", + " columns=[\n", + " \"PdDistrict\",\n", + " \"X\",\n", + " \"Y\",\n", + " \"XY_y_45deg\",\n", + " \"Dates__hour_of_day\",\n", + " \"Dates__day_of_week\",\n", + " \"Dates__day_of_month\",\n", + " ],\n", + " degree=2,\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.05)),\n", + " (\"Encoder\", WOEEncoder()),\n", + " (\n", + " \"ESTIMATOR\",\n", + " XGBClassifier(random_state=0, eval_metric=\"logloss\", use_label_encoder=False),\n", + " ),\n", + "]\n", + "\n", + "param_distributions = {\n", + " \"PlaneRotation__theta_vec\": [[15, 30, 45], [5, 10, 15, 20, 25, 30, 40, 45]],\n", + " \"TreeBinning__tree\": [\n", + " DecisionTreeClassifier(max_depth=2, min_samples_leaf=100, random_state=0),\n", + " DecisionTreeClassifier(max_depth=3, min_samples_leaf=100, random_state=0),\n", + " DecisionTreeClassifier(max_depth=2, min_samples_leaf=200, random_state=0),\n", + " DecisionTreeClassifier(max_depth=3, min_samples_leaf=200, random_state=0),\n", + " ],\n", + " \"ESTIMATOR__max_depth\": [2, 3, 4],\n", + " \"ESTIMATOR__subsample\": [0.2, 0.3, 0.4],\n", + " \"ESTIMATOR__colsample_bytree\": [0.4, 0.6, 0.8],\n", + " \"ESTIMATOR__colsample_bylevel\": [0.4, 0.6, 0.8],\n", + " \"ESTIMATOR__min_child_weight\": [10, 20, 30],\n", + "}\n", + "\n", + "\n", + "def f1_score_binary(y_true, y_pred):\n", + " p = y_true[y_pred == 1].mean()\n", + " r = y_pred[y_true == 1].mean()\n", + " if (p == 0) | (r == 0):\n", + " return 0\n", + " return 2 * p * r / (p + r)\n", + "\n", + "\n", + "f1_scoring = make_scorer(f1_score_binary)\n", + "\n", + "cv = StratifiedKFold(n_splits=5, random_state=0, shuffle=True)\n", + "pipe = Pipeline(steps=steps)\n", + "search = RandomizedSearchCV(\n", + " Pipeline(steps=steps),\n", + " param_distributions=param_distributions,\n", + " n_iter=10,\n", + " cv=cv,\n", + " n_jobs=-1,\n", + " random_state=0,\n", + " verbose=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "35313a2b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ARSON: Fitting 5 folds for each of 10 candidates, totalling 50 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DRUNKENNESS: Fitting 5 folds for each of 10 candidates, totalling 50 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "KIDNAPPING: Fitting 5 folds for each of 10 candidates, totalling 50 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RUNAWAY: Fitting 5 folds for each of 10 candidates, totalling 50 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n" + ] + } + ], + "source": [ + "pipe_dict = {}\n", + "for name in y_train_dummies.columns:\n", + " print(name, end=\": \")\n", + " _ = search.fit(X_train.copy(), y_train_dummies[name])\n", + " pipe_dict[name] = copy.deepcopy(search.best_estimator_)" + ] + }, + { + "cell_type": "markdown", + "id": "f92e00fe", + "metadata": {}, + "source": [ + "## model evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "d0257c67", + "metadata": {}, + "outputs": [], + "source": [ + "y_train_pred_proba = pd.DataFrame(index=y_train.index, dtype=float)\n", + "y_test_pred_proba = pd.DataFrame(index=y_test.index, dtype=float)\n", + "thresholds = np.linspace(0, 1, 25)[1:-1]\n", + "for name, pipe in pipe_dict.items():\n", + " y_train_pred_proba[name] = pipe.predict_proba(X_train.copy())[:, 1]\n", + " y_test_pred_proba[name] = pipe.predict_proba(X_test.copy())[:, 1]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "33c27a21", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 4, figsize=[15, 3])\n", + "for i, (name, pipe) in enumerate(pipe_dict.items()):\n", + " fscores_train = [\n", + " f1_score_binary(y_train_dummies[name], y_train_pred_proba[name] > t)\n", + " for t in thresholds\n", + " ]\n", + " fscores_test = [\n", + " f1_score_binary(y_test_dummies[name], y_test_pred_proba[name] > t)\n", + " for t in thresholds\n", + " ]\n", + " _ = ax[i].set_ylim(0, 1.0)\n", + " _ = ax[i].set_xlim(0, 1.0)\n", + " _ = ax[i].set_title(f\"{name}\")\n", + " _ = ax[i].set_xlabel(\"threshold\")\n", + " _ = ax[i].plot(thresholds, fscores_train, label=\"train\")\n", + " _ = ax[i].plot(thresholds, fscores_test, label=\"test\")\n", + " _ = ax[i].legend()\n", + "_ = plt.suptitle(\"F1-scores\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "be204537", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total F1-score\n", + "f1 score - train: 0.62\n", + "f1 score - test: 0.56\n" + ] + } + ], + "source": [ + "print(\"Total F1-score\")\n", + "f1_train = f1_score(\n", + " y_train, y_train_pred_proba.idxmax(1).replace(target_mapping), average=\"micro\"\n", + ")\n", + "print(f\"f1 score - train: {f1_train:.2f}\")\n", + "f1_test = f1_score(\n", + " y_test, y_test_pred_proba.idxmax(1).replace(target_mapping), average=\"micro\"\n", + ")\n", + "print(f\"f1 score - test: {f1_test:.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "7af70ca5", + "metadata": {}, + "source": [ + "## production pipeline & model" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f4e029ad", + "metadata": {}, + "outputs": [], + "source": [ + "prod_pipe_dict = {}\n", + "model_pd_dict = {}\n", + "\n", + "search_ = copy.deepcopy(search)\n", + "for name, pipe in pipe_dict.items():\n", + " model_pd_dict[name] = copy.deepcopy(pipe.steps[-1][1])\n", + " _ = pipe.steps.pop(-1)\n", + " prod_pipe_dict[name] = copy.deepcopy(pipe)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "4ab4c0e3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[16:55:53] /Users/travis/build/dmlc/treelite/src/compiler/ast/split.cc:29: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", + "[16:55:55] /Users/travis/build/dmlc/treelite/src/compiler/ast/split.cc:29: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", + "[16:55:57] /Users/travis/build/dmlc/treelite/src/compiler/ast/split.cc:29: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", + "[16:56:00] /Users/travis/build/dmlc/treelite/src/compiler/ast/split.cc:29: Parallel compilation enabled; member trees will be divided into 4 translation units.\n" + ] + } + ], + "source": [ + "model_prod_dict = {}\n", + "for i, (name, prod_pipe) in enumerate(prod_pipe_dict.items()):\n", + "\n", + " X_train_prepro_np = prod_pipe.transform_numpy(X_train.copy().to_numpy())\n", + " y_train_np = y_train_dummies[name].to_numpy()\n", + "\n", + " xgb_booster = XGBBoosterBuilder.train(\n", + " model=model_pd_dict[name],\n", + " X_train=X_train_prepro_np,\n", + " y_train=y_train_np,\n", + " )\n", + "\n", + " treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", + " treelite_model.export_lib(\n", + " toolchain=\"gcc\",\n", + " libpath=f\"./models/treelite_xgb_sfcrime_{i}.so\",\n", + " params={\"parallel_comp\": 4},\n", + " verbose=False,\n", + " )\n", + " model_prod_dict[name] = treelite_runtime.Predictor(\n", + " f\"./models/treelite_xgb_sfcrime_{i}.so\", verbose=False\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "f4726171", + "metadata": {}, + "source": [ + "### check if Pandas & Treelite predictions match" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "9bccd255", + "metadata": {}, + "outputs": [], + "source": [ + "X_test_np = X_test.to_numpy()\n", + "\n", + "for i, (name, prod_pipe) in enumerate(prod_pipe_dict.items()):\n", + " y_pred_pd = model_pd_dict[name].predict_proba(prod_pipe.transform(X_test.copy()))[\n", + " :, 1\n", + " ]\n", + "\n", + " y_pred_tl = model_prod_dict[name].predict(\n", + " treelite_runtime.DMatrix(prod_pipe.transform_numpy(X_test_np.copy()))\n", + " )\n", + " assert np.allclose(y_pred_pd, y_pred_tl)" + ] + }, + { + "cell_type": "markdown", + "id": "525b8d6f", + "metadata": {}, + "source": [ + "## per-sample bechmarking" + ] + }, + { + "cell_type": "markdown", + "id": "db4655bb", + "metadata": {}, + "source": [ + "### pipeline only" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "77378b70", + "metadata": {}, + "outputs": [], + "source": [ + "x = X_test.iloc[[0]]\n", + "x_np = x.to_numpy()\n", + "preds = np.zeros(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "41d39db0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.1 s ± 86.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "for i, (name, prod_pipe) in enumerate(prod_pipe_dict.items()):\n", + " _ = prod_pipe.transform(x.copy())" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "aab6bd23", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.33 ms ± 125 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "for i, (name, prod_pipe) in enumerate(prod_pipe_dict.items()):\n", + " _ = prod_pipe.transform_numpy(x_np.copy())" + ] + }, + { + "cell_type": "markdown", + "id": "77bd8a6c", + "metadata": {}, + "source": [ + "Speed-up Pandas VS Numpy x986" + ] + }, + { + "cell_type": "markdown", + "id": "0cc34f52", + "metadata": {}, + "source": [ + "### pipeline & model" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "69b7a278", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.42 s ± 409 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "for i, (name, prod_pipe) in enumerate(prod_pipe_dict.items()):\n", + " preds[i] = model_pd_dict[name].predict_proba(prod_pipe.transform(x.copy()))[:, 1]\n", + "np.argmax(preds)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "ed1dcbb4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.82 ms ± 597 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "\n", + "for i, (name, prod_pipe) in enumerate(prod_pipe_dict.items()):\n", + " preds[i] = model_prod_dict[name].predict(\n", + " treelite_runtime.DMatrix(prod_pipe.transform_numpy(x_np.copy()))\n", + " )\n", + "np.argmax(preds)" + ] + }, + { + "cell_type": "markdown", + "id": "6ab507be", + "metadata": {}, + "source": [ + "Speed-up Pandas VS Numpy x762" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gators38", + "language": "python", + "name": "gators38" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } \ No newline at end of file diff --git a/examples/templates.ipynb b/examples/templates.ipynb new file mode 100644 index 00000000..c6ab104a --- /dev/null +++ b/examples/templates.ipynb @@ -0,0 +1,280 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6288ceef", + "metadata": {}, + "source": [ + "# pipeline templates" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "02c2ca22", + "metadata": {}, + "outputs": [], + "source": [ + "# data cleaning\n", + "from gators.data_cleaning import (\n", + " ConvertColumnDatatype,\n", + " DropHighNaNRatio,\n", + " DropLowCardinality,\n", + " DropHighCardinality,\n", + " DropDatatypeColumns,\n", + ")\n", + "\n", + "# imputers\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "\n", + "# encoders\n", + "from gators.encoders import (\n", + " WOEEncoder,\n", + " TargetEncoder,\n", + ")\n", + "\n", + "# binning\n", + "from gators.binning import (\n", + " BinSingleTargetClassCategories,\n", + " BinRareCategories,\n", + " TreeBinning,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import (\n", + " PolynomialObjectFeatures,\n", + ")\n", + "\n", + "# datetime feature generation\n", + "from gators.feature_generation_dt import (\n", + " CyclicHourOfDay,\n", + " CyclicDayOfMonth,\n", + " CyclicDayOfWeek,\n", + " CyclicMonthOfYear,\n", + " OrdinalDayOfMonth,\n", + " OrdinalMonthOfYear,\n", + " OrdinalDayOfWeek,\n", + " OrdinalHourOfDay,\n", + ")\n", + "\n", + "# feature selection\n", + "from gators.feature_selection import (\n", + " InformationValue,\n", + " SelectFromModel,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0a70af5f", + "metadata": {}, + "source": [ + "## data cleaning" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fcc01ba4", + "metadata": {}, + "outputs": [], + "source": [ + "max_ratio = 0.9\n", + "min_categories = 2\n", + "max_categories = 256\n", + "min_ratio = 0.1\n", + "strategy_num = \"mean\"\n", + "strategy_obj = \"constant\"\n", + "\n", + "data_cleaning_steps = [\n", + " (\"DropHighNaNRatio\", DropHighNaNRatio(max_ratio=max_ratio)),\n", + " (\"DropLowCardinality\", DropLowCardinality(min_categories=min_categories)),\n", + " (\"DropHighCardinality\", DropHighCardinality(max_categories=max_categories)),\n", + " (\"BinRareCategories\", BinRareCategories(min_ratio=min_ratio)),\n", + " (\"NumericImputer\", NumericImputer(strategy=strategy_num, value=0)),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=strategy_obj, value=\"MISSING\")),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "43d53a52", + "metadata": {}, + "source": [ + "## datetime feature generation" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0ecdb6aa", + "metadata": {}, + "outputs": [], + "source": [ + "datetime_columns = [\"Date\"]\n", + "datetime_steps = [\n", + " (\n", + " \"ConvertColumnDatatype\",\n", + " ConvertColumnDatatype(columns=datetime_columns, datatype=\"datetime64[ns]\"),\n", + " ),\n", + " (\"OrdinalHourOfDay\", OrdinalHourOfDay(columns=datetime_columns)),\n", + " (\"OrdinalDayOfWeek\", OrdinalDayOfWeek(columns=datetime_columns)),\n", + " (\"OrdinalDayOfMonth\", OrdinalDayOfMonth(columns=datetime_columns)),\n", + " (\"OrdinalMonthOfYear\", OrdinalMonthOfYear(columns=datetime_columns)),\n", + " (\"CyclicHourOfDay\", CyclicHourOfDay(columns=datetime_columns)),\n", + " (\"CyclicDayOfWeek\", CyclicDayOfWeek(columns=datetime_columns)),\n", + " (\"CyclicDayOfMonth\", CyclicDayOfMonth(columns=datetime_columns)),\n", + " (\"CyclicMonthOfYear\", CyclicMonthOfYear(columns=datetime_columns)),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "6c3b379d", + "metadata": {}, + "source": [ + "## polynomial object features" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ab018ff7", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n", + "\n", + "tree = DecisionTreeClassifier(random_state=0, min_samples_leaf=100)\n", + "\n", + "columns = list(\"columns\")\n", + "poynomial_object_features_steps = [\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"TreeBinning\", TreeBinning(tree=tree)),\n", + " (\"PolynomialObjectFeatures\", PolynomialObjectFeatures(columns=columns, degree=2)),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.1)), # min_ratio can be set to 0.\n", + " (\n", + " \"Encoder\",\n", + " WOEEncoder(),\n", + " ), # if WOEEncoder binary problem or TargetEncoder() if regression problem.\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "313da73d", + "metadata": {}, + "source": [ + "## feature selection" + ] + }, + { + "cell_type": "markdown", + "id": "b1a3f5e5", + "metadata": {}, + "source": [ + "### univariate feature selection pipeline - binary classification" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3b60aaa", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n", + "\n", + "tree = DecisionTreeClassifier(random_state=0, min_samples_leaf=100)\n", + "k = 50\n", + "\n", + "univariate_feature_selection_steps = [\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"TreeBinning\", TreeBinning(tree=tree)),\n", + " (\"InformationValue\", InformationValue(k=k)),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "de8c0212", + "metadata": {}, + "source": [ + "### feature selection with the wrapper method pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "495c7272", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n" + ] + } + ], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n", + "from xgboost import XGBClassifier, XGBRegressor\n", + "\n", + "tree = DecisionTreeClassifier(random_state=0, min_samples_leaf=100)\n", + "model = XGBClassifier(random_seed=0)\n", + "\n", + "wrapper_feature_selection = [\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"TreeBinning\", TreeBinning(tree=tree)), # tree clssifier or tree regressor\n", + " (\n", + " \"Encoder\",\n", + " WOEEncoder(),\n", + " ), # if binary problem or TargetEncoder() if regression problem.\n", + " (\"SelectFromModel\", SelectFromModel(model=model, k=k)),\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68ae8450", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6749ca92", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gators38", + "language": "python", + "name": "gators38" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/titanic.ipynb b/examples/titanic.ipynb index 23f1e734..a7bf533a 100644 --- a/examples/titanic.ipynb +++ b/examples/titanic.ipynb @@ -1,1163 +1,1692 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# binary classification example - titanic dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings('ignore')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. Koalas will set it for you but it does not work if there is a Spark context already launched.\n" - ] - } - ], - "source": [ - "import copy\n", - "import numpy as np\n", - "import pandas as pd\n", - "import databricks.koalas as ks\n", - "from pandas.testing import assert_frame_equal\n", - "from pandas.testing import assert_series_equal\n", - "from xgboost import XGBClassifier\n", - "import treelite\n", - "import treelite_runtime\n", - "import dill\n", - "from sklearn.metrics import make_scorer\n", - "from sklearn.model_selection import StratifiedKFold\n", - "from xgboost import XGBClassifier\n", - "from hyperopt import hp\n", - "from hyperopt import tpe" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "21/09/30 10:42:14 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", - "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", - "Setting default log level to \"WARN\".\n", - "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" - ] - } - ], - "source": [ - "from pyspark import SparkConf, SparkContext\n", - "conf = SparkConf()\n", - "conf.set('spark.executor.memory', '2g')\n", - "SparkContext(conf=conf)\n", - "ks.set_option('compute.default_index_type', 'distributed-sequence')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from gators.util import util\n", - "# data cleaning\n", - "from gators.data_cleaning import (\n", - " DropHighNaNRatio,\n", - " DropLowCardinality,\n", - " DropHighCardinality,\n", - " DropDatatypeColumns,\n", - " DropColumns,\n", - " KeepColumns,\n", - " Replace,\n", - ")\n", - "# imputers\n", - "from gators.imputers import (\n", - " FloatImputer, \n", - " IntImputer, \n", - " ObjectImputer,\n", - ")\n", - "# encoders\n", - "from gators.encoders import (\n", - " OrdinalEncoder, \n", - " WOEEncoder,\n", - " OneHotEncoder\n", - ")\n", - "# binning\n", - "from gators.binning import BinRareEvents\n", - "# feature generation\n", - "from gators.feature_generation import (\n", - " ClusterStatistics,\n", - " PolynomialFeatures,\n", - ")\n", - "from gators.feature_generation_str import (\n", - " StringContains,\n", - " StringLength,\n", - " Extract,\n", - " SplitExtract,\n", - ")\n", - "# feature selection\n", - "from gators.feature_selection import (\n", - " SelectFromModel,\n", - " InformationValue\n", - ")\n", - "#frame converter\n", - "from gators.converter import KoalasToPandas\n", - "# model building\n", - "from gators.model_building import (\n", - " TrainTestSplit,\n", - " HyperOpt,\n", - " XGBBoosterBuilder,\n", - " XGBTreeliteDumper,\n", - ")\n", - "# pipeline\n", - "from gators.pipeline import Pipeline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## offline pipeline - feature selection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### with pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_parquet('data/titanic.parquet')\n", - "data = data.reset_index(drop=True)\n", - "y = data['Survived']\n", - "X = data.drop('Survived', axis=1)\n", - "train_test_split = TrainTestSplit(test_ratio=0.3, strategy='ordered')\n", - "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PclassNameSexAgeSibSpParchTicketFareCabinEmbarked
03Braund, Mr. Owen Harrismale22.010A/5 211717.2500NoneS
11Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
\n", - "
" - ], - "text/plain": [ - " Pclass Name Sex Age \\\n", - "0 3 Braund, Mr. Owen Harris male 22.0 \n", - "1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 \n", - "\n", - " SibSp Parch Ticket Fare Cabin Embarked \n", - "0 1 0 A/5 21171 7.2500 None S \n", - "1 1 0 PC 17599 71.2833 C85 C " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X_train.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "label_counts = data['Survived'].value_counts(normalize=True).sort_values().iloc[::-1]\n", - "label_counts.plot(\n", - " kind='barh', \n", - " figsize=(4, 3), \n", - " title='Label Distribution',\n", - ");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### offline pipeline - data preprocessing & feature selection" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "k = 14\n", - "model = XGBClassifier(\n", - " random_state=0, \n", - " eval_metric='logloss', \n", - ")\n", - "offline_steps = [\n", - " StringLength(['Ticket', 'Cabin', 'Name']),\n", - " SplitExtract(['Name'], [', '], [1], ['Dummy']),\n", - " SplitExtract(['Dummy'], ['.'], [0], ['Title']),\n", - " DropColumns(['Ticket', 'Cabin', 'Name', 'Dummy']),\n", - " ObjectImputer(strategy='constant', value='MISSING'),\n", - " Replace(\n", - " to_replace_dict=\n", - " {'Title': {'Ms': 'Miss', 'Mme': 'Mrs', 'Mlle': 'Miss'}}\n", - " ),\n", - " BinRareEvents(min_ratio=0.1),\n", - " WOEEncoder(),\n", - " FloatImputer(strategy='mean'),\n", - " IntImputer(strategy='constant', value=-1), \n", - " ClusterStatistics(\n", - " clusters_dict={'FamilyStat': ['SibSp', 'Parch']},\n", - " column_names=['FamilySize', 'FamilyStd'],\n", - " ),\n", - " PolynomialFeatures(\n", - " columns=['Pclass', 'FamilySize', 'Fare', 'Age'],\n", - " degree=2, interaction_only=True),\n", - " DropColumns(columns=['SibSp', 'Parch']),\n", - " SelectFromModel(model=model, k=k)\n", - "]\n", - "offline_pipe = Pipeline(steps=offline_steps)\n", - "X_train_prepro = offline_pipe.fit_transform(X_train, y_train)\n", - "X_train_prepro_np = offline_pipe.transform_numpy(X_train.to_numpy())\n", - "features = list(X_train_prepro.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "assert np.allclose(\n", - " X_train_prepro.to_numpy(),\n", - " X_train_prepro_np\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "offline_pipe.get_feature_importances(k=k)[::-1].plot(\n", - " kind='barh', \n", - " figsize=(7, 5), \n", - " title='Feature Importance',\n", - ");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### koalas" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "data_ks = ks.read_parquet('data/titanic.parquet', index_col='PassengerId')\n", - "y_ks = data_ks['Survived']\n", - "X_ks = data_ks.drop('Survived', axis=1)\n", - "\n", - "train_test_split = TrainTestSplit(test_ratio=0.3, strategy='ordered')\n", - "X_train_ks, X_test_ks, y_train_ks, y_test_ks = \\\n", - " train_test_split.transform(X_ks, y_ks)\n", - "\n", - "offline_pipe_ks = Pipeline(steps=offline_steps)\n", - "X_train_prepro_ks = offline_pipe_ks.fit_transform(\n", - " X_train_ks, y_train_ks)\n", - "X_train_prepro_ks_np = offline_pipe_ks.transform_numpy(\n", - " X_train_ks.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### check pandas and koalas results match - offline pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "assert_frame_equal(\n", - " X_train_prepro, \n", - " X_train_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_train_prepro_np,\n", - " X_train_prepro_ks_np\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## production pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "prod_columns = offline_pipe.get_production_columns()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "prod_steps = [\n", - " StringLength(['Ticket', 'Cabin', 'Name']),\n", - " SplitExtract(['Name'], [', '], [1], ['Dummy']),\n", - " SplitExtract(['Dummy'], ['.'], [0], ['Title']),\n", - " DropColumns(['Ticket', 'Cabin', 'Name', 'Dummy']),\n", - " ObjectImputer(strategy='constant', value='MISSING'),\n", - " Replace(\n", - " to_replace_dict=\n", - " {'Title': {'Ms': 'Miss', 'Mme': 'Mrs', 'Mlle': 'Miss'}}\n", - " ),\n", - " BinRareEvents(min_ratio=0.1),\n", - " WOEEncoder(),\n", - " FloatImputer(strategy='mean'),\n", - " IntImputer(strategy='constant', value=-1), \n", - " ClusterStatistics(\n", - " clusters_dict={'FamilyStat': ['SibSp', 'Parch']},\n", - " column_names=['FamilySize', 'FamilyStd'],\n", - " ),\n", - " PolynomialFeatures(\n", - " columns=['Pclass', 'FamilySize', 'Fare', 'Age'],\n", - " degree=2, interaction_only=True),\n", - " KeepColumns(columns_to_keep=features),\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_prod = X_train[prod_columns]\n", - "X_train_prod_np = X_train_prod.to_numpy()\n", - "\n", - "prod_pipe = Pipeline(steps=prod_steps)\n", - "_ = prod_pipe.fit(X_train_prod, y_train)\n", - "X_train_prod_prepro = prod_pipe.transform(X_train_prod)\n", - "X_train_prod_prepro_np = prod_pipe.transform_numpy(\n", - " X_train_prod.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### koalas" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "X_train_prod_ks = X_train_ks[prod_columns]\n", - "X_train_prod_ks_np = X_train_prod.to_numpy()\n", - "\n", - "prod_pipe = Pipeline(steps=prod_steps)\n", - "_ = prod_pipe.fit(X_train_prod_ks, y_train_ks)\n", - "X_train_prod_prepro_ks = prod_pipe.transform(X_train_prod_ks)\n", - "X_train_prod_prepro_ks_np = prod_pipe.transform_numpy(\n", - " X_train_prod_ks.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### check offline pipeline and production pipeline match" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "assert_frame_equal(\n", - " X_train_prepro, \n", - " X_train_prod_prepro\n", - ")\n", - "assert np.allclose(\n", - " X_train_prod_prepro_np,\n", - " X_train_prepro_np)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### check pandas and koalas results match - production pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "assert np.allclose(\n", - " X_train_prod_prepro_np,\n", - " X_train_prod_prepro_ks_np)\n", - "assert_frame_equal(\n", - " X_train_prod_prepro, \n", - " X_train_prod_prepro_ks.to_pandas()\n", - ")\n", - "assert np.allclose(\n", - " X_train_prod_prepro_np,\n", - " X_train_prod_prepro_ks_np)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## model building" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### numpy" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|████████| 10/10 [00:06<00:00, 1.50trial/s, best loss: -0.7656580416676784]\n" - ] - } - ], - "source": [ - "def f1_score(y_true, y_pred):\n", - " p = y_true[y_pred == 1].mean()\n", - " r = y_pred[y_true == 1].mean()\n", - " if (p == 0) | (r == 0):\n", - " return 0\n", - " return 2 * p * r / (p + r)\n", - "f1_scoring = make_scorer(f1_score)\n", - "\n", - "y_train_np = y_train.to_numpy()\n", - "n_splits = 10\n", - "max_evals = 10\n", - "kfold = StratifiedKFold(n_splits=n_splits)\n", - "space = {\n", - " 'n_estimators': hp.quniform('n_estimators', 100, 200, 25),\n", - " 'max_depth': hp.quniform('max_depth', 2, 3, 1),\n", - " 'learning_rate': hp.loguniform('learning_rate', -4, -1),\n", - " 'subsample': hp.uniform('subsample', 0.8, 1),\n", - " 'colsample_bytree': hp.uniform('colsample_bytree', 0.8, 1),\n", - " }\n", - "model = XGBClassifier(\n", - " random_state=0, \n", - " use_label_encoder=False,\n", - ")\n", - "hyper = HyperOpt(\n", - " model=model,\n", - " algo=tpe.suggest,\n", - " scoring=f1_scoring,\n", - " space=space,\n", - " max_evals=max_evals, \n", - " kfold=kfold,\n", - " features=features,\n", - " )\n", - "_ = hyper.fit(X_train_prod_prepro_np, y_train.to_numpy())" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "hyper.get_feature_importances().iloc[::-1].plot(\n", - " kind='barh', \n", - " figsize=(9, 9), \n", - " title='Most important features',\n", - ");" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colsample_bytreelearning_ratemax_depthn_estimatorssubsamplelossstatusid
00.9166820.0329353.0175.00.897209-0.765658ok0
60.8666840.0787503.0200.00.967633-0.765465ok6
40.9635830.0717312.0175.00.829484-0.763867ok4
50.8362190.0431363.0125.00.846503-0.760991ok5
10.9717490.1274593.0175.00.906193-0.759423ok1
30.8480930.0325302.0100.00.905738-0.757477ok3
20.8525050.1105853.0200.00.851674-0.754226ok2
80.8105450.0198793.0150.00.902098-0.753219ok8
70.8477090.0318362.0175.00.993426-0.751270ok7
90.8897200.3012863.0200.00.818411-0.738556ok9
\n", - "
" - ], - "text/plain": [ - " colsample_bytree learning_rate max_depth n_estimators subsample \\\n", - "0 0.916682 0.032935 3.0 175.0 0.897209 \n", - "6 0.866684 0.078750 3.0 200.0 0.967633 \n", - "4 0.963583 0.071731 2.0 175.0 0.829484 \n", - "5 0.836219 0.043136 3.0 125.0 0.846503 \n", - "1 0.971749 0.127459 3.0 175.0 0.906193 \n", - "3 0.848093 0.032530 2.0 100.0 0.905738 \n", - "2 0.852505 0.110585 3.0 200.0 0.851674 \n", - "8 0.810545 0.019879 3.0 150.0 0.902098 \n", - "7 0.847709 0.031836 2.0 175.0 0.993426 \n", - "9 0.889720 0.301286 3.0 200.0 0.818411 \n", - "\n", - " loss status id \n", - "0 -0.765658 ok 0 \n", - "6 -0.765465 ok 6 \n", - "4 -0.763867 ok 4 \n", - "5 -0.760991 ok 5 \n", - "1 -0.759423 ok 1 \n", - "3 -0.757477 ok 3 \n", - "2 -0.754226 ok 2 \n", - "8 -0.753219 ok 8 \n", - "7 -0.751270 ok 7 \n", - "9 -0.738556 ok 9 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hyper.history.sort_values('loss')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "model_np = copy.copy(hyper.model)\n", - "model_path = 'models/model_titanic.dill'\n", - "with open(model_path, 'wb') as file:\n", - " dill.dump(model_np, file)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "model_pd = copy.copy(model_np)\n", - "_ = model_pd.fit(X_train_prod_prepro, y_train)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### treelite" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[10:43:47] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", - "[10:43:47] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", - "[10:43:47] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file header.h...\n", - "[10:43:47] ../src/c_api/c_api.cc:126: Writing file main.c...\n", - "[10:43:47] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:105: Compiling sources files in directory ./models/tmpeq1fdkam into object files (*.o)...\n", - "[10:43:47] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:134: Generating dynamic shared library ./models/tmpeq1fdkam/predictor.dylib...\n", - "[10:43:48] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/__init__.py:278: Generated shared library in 0.99 seconds\n" - ] - } - ], - "source": [ - "xgb_booster = XGBBoosterBuilder.train(\n", - " model=hyper.model, \n", - " X_train=X_train_prod_prepro_np, \n", - " y_train=y_train_np,\n", - ")\n", - "\n", - "treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", - "treelite_model.export_lib(\n", - " toolchain='gcc', \n", - " libpath='./models/treelite_xgb_titanic.so', \n", - " params={'parallel_comp': 4},\n", - " verbose=True\n", - ")\n", - "model_tl = treelite_runtime.Predictor(\n", - " './models/treelite_xgb_titanic.so', verbose=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### check the models prediction match" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "X_test_prod = X_test[prod_columns]\n", - "X_test_prod_np = X_test_prod.to_numpy()\n", - "y_pred_pd = model_pd.predict_proba(\n", - " prod_pipe.transform(X_test_prod))[:, 1]\n", - "y_pred_np = model.predict_proba(\n", - " prod_pipe.transform_numpy(X_test_prod_np.copy()))[:, 1]\n", - "y_pred_tl = model_tl.predict(\n", - " treelite_runtime.DMatrix(\n", - " prod_pipe.transform_numpy(\n", - " X_test_prod_np.copy()\n", - " )\n", - " )\n", - ")\n", - "assert np.allclose(y_pred_np, y_pred_pd)\n", - "assert np.allclose(y_pred_np, y_pred_tl)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## model evaluation" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'f1 score: 0.76'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model_np = copy.copy(hyper.model)\n", - "X_test_prod = X_test[prod_columns]\n", - "X_test_prod_np = X_test_prod.to_numpy()\n", - "X_test_prod_prepro_np = prod_pipe.transform(X_test_prod).to_numpy()\n", - "y_test_pred = model_np.predict(X_test_prod_prepro_np)\n", - "f'f1 score: {f1_score(y_test, y_test_pred):.2f}'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## per-sample bechmarking" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### pipeline only" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "37 ms ± 3.28 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "132 µs ± 5.52 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "source": [ - "x = X_test_prod.iloc[[0]]\n", - "x_np = x.to_numpy()\n", - "stats_pd = %timeit -o prod_pipe.transform(x)\n", - "stats_np = %timeit -o prod_pipe.transform_numpy(x_np.copy())" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy x280'" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy x{round(speedup)}'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### pipeline & model" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "36.1 ms ± 5.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", - "322 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", - "203 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "source": [ - "stats_pd = %timeit -o model_pd.predict(prod_pipe.transform(x))[0]\n", - "stats_np = %timeit -o model.predict(prod_pipe.transform_numpy(x_np.copy()))[0]\n", - "stats_tl = %timeit -o model_tl.predict(treelite_runtime.DMatrix(prod_pipe.transform_numpy(x_np.copy())))" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy x112'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_np).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy x{round(speedup)}'" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Speed-up Pandas VS Numpy&Treelite x178'" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "speedup = 1e3 * float(str(stats_pd).split(' ')[0]) / float(str(stats_tl).split(' ')[0])\n", - "f'Speed-up Pandas VS Numpy&Treelite x{round(speedup)}'" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "gators38", - "language": "python", - "name": "gators38" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# binary classification example - titanic dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.core.interactiveshell import InteractiveShell\n", + "\n", + "InteractiveShell.ast_node_interactivity = \"all\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pandas.testing import assert_frame_equal\n", + "from pandas.testing import assert_series_equal\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from xgboost import XGBClassifier\n", + "import treelite\n", + "import treelite_runtime\n", + "import dill\n", + "from sklearn.metrics import make_scorer\n", + "from sklearn.model_selection import StratifiedKFold\n", + "from sklearn.model_selection import RandomizedSearchCV\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "cmap = sns.color_palette(\"vlag\", as_cmap=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Gators** imports" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# data cleaning\n", + "from gators.data_cleaning import (\n", + " DropColumns,\n", + " Replace,\n", + ")\n", + "\n", + "# imputers\n", + "from gators.imputers import (\n", + " NumericImputer,\n", + " ObjectImputer,\n", + ")\n", + "\n", + "# encoders\n", + "from gators.encoders import (\n", + " WOEEncoder,\n", + " TargetEncoder,\n", + ")\n", + "\n", + "# binning\n", + "from gators.binning import (\n", + " BinRareCategories,\n", + " BinSingleTargetClassCategories,\n", + " Binning,\n", + " TreeBinning,\n", + ")\n", + "\n", + "# feature generation\n", + "from gators.feature_generation import (\n", + " ElementaryArithmetics,\n", + " PolynomialObjectFeatures,\n", + " IsNull,\n", + ")\n", + "from gators.feature_generation_str import (\n", + " Contains,\n", + " Length,\n", + " SplitExtract,\n", + ")\n", + "\n", + "# feature selection\n", + "from gators.feature_selection import InformationValue\n", + "\n", + "# model building\n", + "from gators.model_building import (\n", + " TrainTestSplit,\n", + " XGBBoosterBuilder,\n", + " XGBTreeliteDumper,\n", + ")\n", + "\n", + "# pipeline\n", + "from gators.pipeline import Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_parquet(\"data/titanic.parquet\")\n", + "data = data.reset_index(drop=True)\n", + "y = data[\"Survived\"]\n", + "X = data.drop(\"Survived\", axis=1)\n", + "train_test_split = TrainTestSplit(test_ratio=0.3, strategy=\"stratified\")\n", + "X_train, X_test, y_train, y_test = train_test_split.transform(X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## data analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PclassNameSexAgeSibSpParchTicketFareCabinEmbarked
6143Brocklebank, Mr. William Alfredmale35.0003645128.0500NoneS
1383Osen, Mr. Olaf Elonmale16.00075349.2167NoneS
\n", + "
" + ], + "text/plain": [ + " Pclass Name Sex Age SibSp Parch \\\n", + "614 3 Brocklebank, Mr. William Alfred male 35.0 0 0 \n", + "138 3 Osen, Mr. Olaf Elon male 16.0 0 0 \n", + "\n", + " Ticket Fare Cabin Embarked \n", + "614 364512 8.0500 None S \n", + "138 7534 9.2167 None S " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "X_train.dtypes.value_counts().plot(\n", + " figsize=(3 * 1.6, 3),\n", + " kind=\"barh\",\n", + " title=\"column datatype\",\n", + " ylabel=\"dtype\",\n", + " xlabel=\"count\",\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "label_counts = data[\"Survived\"].value_counts(normalize=True).sort_values().iloc[::-1]\n", + "label_counts.plot(\n", + " kind=\"barh\",\n", + " figsize=(3 * 1.6, 3),\n", + " title=\"label distribution\",\n", + " xlabel=\"label\",\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "steps = [\n", + " (\"Length\", Length(columns=[\"Ticket\"])),\n", + " (\"SplitExtractName\", SplitExtract([\"Name\"], [\", \"], [1], [\"Dummy\"])),\n", + " (\"SplitExtractTitle\", SplitExtract([\"Dummy\"], [\".\"], [0], [\"Title\"])),\n", + " (\"IsNull\", IsNull(columns=[\"Age\", \"Cabin\"])),\n", + " (\"DropColumns\", DropColumns([\"Name\", \"Dummy\", \"Cabin\", \"Ticket\"])),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"mean\")),\n", + " (\n", + " \"ElementaryArithmetics\",\n", + " ElementaryArithmetics(\n", + " operator=\"+\",\n", + " columns_a=[\"SibSp\"],\n", + " columns_b=[\"Parch\"],\n", + " column_names=[\"FamilySize\"],\n", + " ),\n", + " ),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=3, min_samples_leaf=120), inplace=True\n", + " ),\n", + " ),\n", + " (\n", + " \"Replace\",\n", + " Replace(\n", + " to_replace_dict={\n", + " \"Cabin__is_null\": {\"(-inf, 0.5)\": \"false\", \"[0.5, inf)\": \"true\"},\n", + " \"Age__is_null\": {\"(-inf, 0.5)\": \"false\", \"[0.5, inf)\": \"true\"},\n", + " \"Fare\": {\n", + " \"(-inf, 10.48)\": \"EconomicFare\",\n", + " \"[10.48, 19.73)\": \"EconomicPlusFare\",\n", + " \"[19.73, 35.25)\": \"BussinessFare\",\n", + " \"[35.25, inf)\": \"FirstClassFare\",\n", + " },\n", + " \"Pclass\": {\n", + " \"(-inf, 1.5)\": \"1stClass\",\n", + " \"[1.5, 2.5)\": \"2ndClass\",\n", + " \"[2.5, inf)\": \"3rdClass\",\n", + " },\n", + " \"Sex\": {\"female\": \"Woman\", \"male\": \"Man\"},\n", + " \"FamilySize\": {\"(-inf, 0.5)\": \"NoFamily\", \"[1.5, inf)\": \"WithFamily\"},\n", + " \"Age\": {\n", + " \"(-inf, 27.5)\": \"Young\",\n", + " \"[27.5, 30.25)\": \"Adult\",\n", + " \"[30.25, inf)\": \"Senior\",\n", + " },\n", + " }\n", + " ),\n", + " ),\n", + " (\"Encoder\", TargetEncoder()),\n", + "]\n", + "pipe = Pipeline(steps=steps)\n", + "_ = pipe.fit(X_train.copy(), y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pipe.steps[-1][1].display_mapping(cmap=\"vlag\", title=\"survival rate\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### adding polynomial object features" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "steps = [\n", + " (\"Length\", Length(columns=[\"Ticket\"])),\n", + " (\"SplitExtractName\", SplitExtract([\"Name\"], [\", \"], [1], [\"Dummy\"])),\n", + " (\"SplitExtractTitle\", SplitExtract([\"Dummy\"], [\".\"], [0], [\"Title\"])),\n", + " (\"IsNull\", IsNull(columns=[\"Age\", \"Cabin\"])),\n", + " (\"DropColumns\", DropColumns([\"Name\", \"Dummy\", \"Cabin\", \"Ticket\"])),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"mean\")),\n", + " (\n", + " \"ElementaryArithmetics\",\n", + " ElementaryArithmetics(\n", + " operator=\"+\",\n", + " columns_a=[\"SibSp\"],\n", + " columns_b=[\"Parch\"],\n", + " column_names=[\"FamilySize\"],\n", + " ),\n", + " ),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=3, min_samples_leaf=120), inplace=True\n", + " ),\n", + " ),\n", + " (\n", + " \"Replace\",\n", + " Replace(\n", + " to_replace_dict={\n", + " \"Cabin__is_null\": {\"(-inf, 0.5)\": \"false\", \"[0.5, inf)\": \"true\"},\n", + " \"Age__is_null\": {\"(-inf, 0.5)\": \"false\", \"[0.5, inf)\": \"true\"},\n", + " \"Fare\": {\n", + " \"(-inf, 10.48)\": \"EconomicFare\",\n", + " \"[10.48, 19.73)\": \"EconomicPlusFare\",\n", + " \"[19.73, 35.25)\": \"BussinessFare\",\n", + " \"[35.25, inf)\": \"FirstClassFare\",\n", + " },\n", + " \"Pclass\": {\n", + " \"(-inf, 1.5)\": \"1stClass\",\n", + " \"[1.5, 2.5)\": \"2ndClass\",\n", + " \"[2.5, inf)\": \"3rdClass\",\n", + " },\n", + " \"Sex\": {\"female\": \"Woman\", \"male\": \"Man\"},\n", + " \"FamilySize\": {\"(-inf, 0.5)\": \"NoFamily\", \"[1.5, inf)\": \"WithFamily\"},\n", + " \"Age\": {\n", + " \"(-inf, 27.5)\": \"Young\",\n", + " \"[27.5, 30.75)\": \"Adult\",\n", + " \"[30.75, inf)\": \"Senior\",\n", + " },\n", + " }\n", + " ),\n", + " ),\n", + " (\n", + " \"PolynomialObjectFeatures\",\n", + " PolynomialObjectFeatures(\n", + " columns=[\"Pclass\", \"Sex\", \"Age\", \"Fare\", \"Embarked\", \"Title\", \"FamilySize\"],\n", + " degree=2,\n", + " ),\n", + " ),\n", + " (\"DropPolynomialColumns\", DropColumns(columns=[\"Sex__x__Title\"])),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.1)),\n", + " (\"Encoder\", TargetEncoder()),\n", + "]\n", + "pipe = Pipeline(steps=steps)\n", + "_ = pipe.fit(X_train.copy(), y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pipe.steps[-1][1].display_mapping(cmap=\"vlag\", title=\"survival rate\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## offline pipeline - feature selection" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "k = 12\n", + "model = XGBClassifier(\n", + " random_state=0,\n", + " eval_metric=\"logloss\",\n", + ")\n", + "offline_steps = [\n", + " (\"Length\", Length(columns=[\"Ticket\"])),\n", + " (\"SplitExtractName\", SplitExtract([\"Name\"], [\", \"], [1], [\"Dummy\"])),\n", + " (\"SplitExtractTitle\", SplitExtract([\"Dummy\"], [\".\"], [0], [\"Title\"])),\n", + " (\"IsNull\", IsNull(columns=[\"Age\", \"Cabin\"])),\n", + " (\"DropColumns\", DropColumns([\"Name\", \"Dummy\", \"Cabin\", \"Ticket\"])),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"mean\")),\n", + " (\n", + " \"ElementaryArithmetics\",\n", + " ElementaryArithmetics(\n", + " operator=\"+\",\n", + " columns_a=[\"SibSp\"],\n", + " columns_b=[\"Parch\"],\n", + " column_names=[\"FamilySize\"],\n", + " ),\n", + " ),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=3, min_samples_leaf=120), inplace=True\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.0)),\n", + " (\"InformationValue\", InformationValue(k=k)),\n", + "]\n", + "offline_pipe = Pipeline(steps=offline_steps)\n", + "X_train_prepro = offline_pipe.fit_transform(X_train.copy(), y_train)\n", + "features = list(X_train_prepro.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "offline_pipe.steps[-1][1].feature_importances_.iloc[::-1].plot(\n", + " kind=\"barh\",\n", + " figsize=(3, 3 * 1.6),\n", + " title=\"Feature Importance\",\n", + ");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All the features will be used." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## pipeline optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting 5 folds for each of 30 candidates, totalling 150 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/compat.py:36: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " from pandas import MultiIndex, Int64Index\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n", + "/Users/cpoli/gators38/lib/python3.8/site-packages/xgboost/data.py:262: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", + " elif isinstance(data.columns, (pd.Int64Index, pd.RangeIndex)):\n" + ] + } + ], + "source": [ + "steps = [\n", + " (\"Length\", Length(columns=[\"Ticket\"])),\n", + " (\"SplitExtractName\", SplitExtract([\"Name\"], [\", \"], [1], [\"Dummy\"])),\n", + " (\"SplitExtractTitle\", SplitExtract([\"Dummy\"], [\".\"], [0], [\"Title\"])),\n", + " (\"IsNull\", IsNull(columns=[\"Age\", \"Cabin\"])),\n", + " (\"DropColumns\", DropColumns([\"Name\", \"Dummy\", \"Cabin\", \"Ticket\"])),\n", + " (\"ObjectImputer\", ObjectImputer(strategy=\"constant\", value=\"MISSING\")),\n", + " (\"BinSingleTargetClassCategories\", BinSingleTargetClassCategories()),\n", + " (\"NumericImputer\", NumericImputer(strategy=\"mean\", value=-1)),\n", + " (\n", + " \"ElementaryArithmetics\",\n", + " ElementaryArithmetics(\n", + " operator=\"+\",\n", + " columns_a=[\"SibSp\"],\n", + " columns_b=[\"Parch\"],\n", + " column_names=[\"FamilySize\"],\n", + " ),\n", + " ),\n", + " (\n", + " \"TreeBinning\",\n", + " TreeBinning(\n", + " tree=DecisionTreeClassifier(max_depth=2, min_samples_leaf=120), inplace=True\n", + " ),\n", + " ),\n", + " (\n", + " \"PolynomialObjectFeatures\",\n", + " PolynomialObjectFeatures(\n", + " columns=[\"Pclass\", \"Sex\", \"Age\", \"Fare\", \"Embarked\", \"Title\", \"FamilySize\"],\n", + " degree=2,\n", + " ),\n", + " ),\n", + " (\"CleanCategories\", BinRareCategories(min_ratio=0.1)),\n", + " (\"Encoder\", WOEEncoder()),\n", + " (\n", + " \"ESTIMATOR\",\n", + " XGBClassifier(random_state=0, eval_metric=\"logloss\", use_label_encoder=False),\n", + " ),\n", + "]\n", + "\n", + "\n", + "param_distributions = {\n", + " \"NumericImputer__strategy\": [\"mean\", \"most_frequent\", \"constant\"],\n", + " \"TreeBinning__tree\": [\n", + " DecisionTreeClassifier(max_depth=2, min_samples_leaf=25, random_state=0),\n", + " DecisionTreeClassifier(max_depth=2, min_samples_leaf=50, random_state=0),\n", + " DecisionTreeClassifier(max_depth=2, min_samples_leaf=100, random_state=0),\n", + " DecisionTreeClassifier(max_depth=2, min_samples_leaf=150, random_state=0),\n", + " ],\n", + " \"CleanCategories__min_ratio\": [0, 0.1, 0.2],\n", + " \"ESTIMATOR__max_depth\": [3, 4, 5],\n", + " \"ESTIMATOR__subsample\": [0.4, 0.6, 0.8],\n", + " \"ESTIMATOR__colsample_bytree\": [0.4, 0.6, 0.8],\n", + " \"ESTIMATOR__colsample_bylevel\": [0.4, 0.6, 0.8],\n", + " \"ESTIMATOR__min_child_weight\": [10, 20, 30],\n", + "}\n", + "\n", + "\n", + "def f1_score(y_true, y_pred):\n", + " p = y_true[y_pred == 1].mean()\n", + " r = y_pred[y_true == 1].mean()\n", + " if (p == 0) | (r == 0):\n", + " return 0\n", + " return 2 * p * r / (p + r)\n", + "\n", + "\n", + "f1_scoring = make_scorer(f1_score)\n", + "\n", + "from sklearn.metrics import log_loss\n", + "\n", + "cv = StratifiedKFold(n_splits=5, random_state=0, shuffle=True)\n", + "search = RandomizedSearchCV(\n", + " Pipeline(steps=steps),\n", + " param_distributions=param_distributions,\n", + " n_iter=30,\n", + " cv=cv,\n", + " scoring=f1_scoring,\n", + " n_jobs=-1,\n", + " random_state=0,\n", + " verbose=True,\n", + ")\n", + "_ = search.fit(X_train.copy(), y_train)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## model evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAX F1-score test set: 0.80\n" + ] + } + ], + "source": [ + "thresholds = np.linspace(0, 1, 25)[1:-1]\n", + "y_train_pred_proba = search.best_estimator_.predict_proba(X_train.copy())[:, 1]\n", + "y_test_pred_proba = search.best_estimator_.predict_proba(X_test.copy())[:, 1]\n", + "fscores_train = [f1_score(y_train, y_train_pred_proba > t) for t in thresholds]\n", + "fscores_test = [f1_score(y_test, y_test_pred_proba > t) for t in thresholds]\n", + "print(f\"MAX F1-score test set: {max(fscores_test):.2f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=[4 * 1.6, 4])\n", + "_ = plt.plot(thresholds, fscores_train, \"--o\", label=\"train set\")\n", + "_ = plt.plot(thresholds, fscores_test, \"--o\", label=\"test set\")\n", + "_ = plt.title(\"f-score vs threshold\")\n", + "_ = plt.xlabel(\"thresholds\")\n", + "_ = plt.ylabel(\"f-score\")\n", + "_ = plt.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## production pipeline & model" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "prod_pipe = copy.deepcopy(search.best_estimator_)\n", + "_ = prod_pipe.steps.pop(-1)\n", + "model_pd = copy.deepcopy(search.best_estimator_.steps[-1][1])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[17:37:40] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler\n", + "[17:37:40] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 4 translation units.\n", + "[17:37:40] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file recipe.json...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file tu3.c...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file tu2.c...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file tu1.c...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file tu0.c...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file header.h...\n", + "[17:37:40] ../src/c_api/c_api.cc:126: Writing file main.c...\n", + "[17:37:40] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:105: Compiling sources files in directory ./models/tmphtlwe8y1 into object files (*.o)...\n", + "[17:37:40] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/util.py:134: Generating dynamic shared library ./models/tmphtlwe8y1/predictor.dylib...\n", + "[17:37:40] /Users/cpoli/gators38/lib/python3.8/site-packages/treelite/contrib/__init__.py:278: Generated shared library in 0.46 seconds\n" + ] + } + ], + "source": [ + "X_train_prepro_np = prod_pipe.transform_numpy(X_train.copy().to_numpy())\n", + "y_train_np = y_train.to_numpy()\n", + "\n", + "xgb_booster = XGBBoosterBuilder.train(\n", + " model=model_pd,\n", + " X_train=X_train_prepro_np,\n", + " y_train=y_train.to_numpy(),\n", + ")\n", + "\n", + "treelite_model = treelite.Model.from_xgboost(xgb_booster)\n", + "treelite_model.export_lib(\n", + " toolchain=\"gcc\",\n", + " libpath=\"./models/treelite_xgb_titanic.so\",\n", + " params={\"parallel_comp\": 4},\n", + " verbose=True,\n", + ")\n", + "model_prod = treelite_runtime.Predictor(\n", + " \"./models/treelite_xgb_titanic.so\", verbose=False\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### check if Pandas & Treelite predictions match" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "X_test_np = X_test.to_numpy()\n", + "y_pred_pd = model_pd.predict_proba(prod_pipe.transform(X_test.copy()))[:, 1]\n", + "y_pred_tl = model_prod.predict(\n", + " treelite_runtime.DMatrix(prod_pipe.transform_numpy(X_test_np.copy()))\n", + ")\n", + "assert np.allclose(y_pred_pd, y_pred_tl)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## per-sample bechmarking" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### pipeline only" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "86.1 ms ± 24.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "82.8 µs ± 2.96 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" + ] + } + ], + "source": [ + "x = X_test.iloc[[0]]\n", + "x_np = x.to_numpy()\n", + "stats_pd = %timeit -o prod_pipe.transform(x)\n", + "stats_np = %timeit -o prod_pipe.transform_numpy(x_np.copy())" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Speed-up Pandas VS Numpy x1040'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "speedup = 1e3 * float(str(stats_pd).split(\" \")[0]) / float(str(stats_np).split(\" \")[0])\n", + "f\"Speed-up Pandas VS Numpy x{round(speedup)}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### pipeline & model" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "\n", + "warnings.simplefilter(action=\"ignore\", category=FutureWarning)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100 ms ± 1.75 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "132 µs ± 2.04 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" + ] + } + ], + "source": [ + "stats_pd = %timeit -o model_pd.predict(prod_pipe.transform(x))[0]\n", + "stats_tl = %timeit -o model_prod.predict(treelite_runtime.DMatrix(prod_pipe.transform_numpy(x_np.copy())))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Speed-up Pandas VS Numpy&Treelite x758'" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "speedup = 1e3 * float(str(stats_pd).split(\" \")[0]) / float(str(stats_tl).split(\" \")[0])\n", + "f\"Speed-up Pandas VS Numpy&Treelite x{round(speedup)}\"" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "vscode": { + "interpreter": { + "hash": "a912ec43100dbdc254b97c8f3d4a007262f947c1a7f54733bf577ef821ff2007" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/feature_gen.cpython-38-darwin.so b/feature_gen.cpython-38-darwin.so deleted file mode 100755 index 967f4db1..00000000 Binary files a/feature_gen.cpython-38-darwin.so and /dev/null differ diff --git a/feature_gen_dt.cpython-38-darwin.so b/feature_gen_dt.cpython-38-darwin.so deleted file mode 100755 index 1968e2c3..00000000 Binary files a/feature_gen_dt.cpython-38-darwin.so and /dev/null differ diff --git a/feature_gen_str.cpython-38-darwin.so b/feature_gen_str.cpython-38-darwin.so deleted file mode 100755 index 5962e578..00000000 Binary files a/feature_gen_str.cpython-38-darwin.so and /dev/null differ diff --git a/gators.egg-info/PKG-INFO b/gators.egg-info/PKG-INFO index d2d4dea7..70e86e2b 100644 --- a/gators.egg-info/PKG-INFO +++ b/gators.egg-info/PKG-INFO @@ -1,32 +1,66 @@ Metadata-Version: 2.1 Name: gators -Version: 0.1.0 -Summary: Model building and Model deployment library +Version: 0.3.4 +Summary: Model building and model scoring library Home-page: https://paypal.github.io/gators/ -Author: Simility Data Team +Author: The Gators Development Team Maintainer: Charles Poli -License: Apache-2.0 Software License -Platform: UNKNOWN +License: License :: OSI Approved :: Apache Software License v2.0 Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: Apache-2 License Classifier: Operating System :: OS Independent Requires-Python: >=3.6 -Description-Content-Type: text_markdown +Description-Content-Type: text/markdown License-File: LICENSE +Requires-Dist: scikit-learn>=1.0.1 +Requires-Dist: pandas +Requires-Dist: pyarrow +Requires-Dist: lightgbm +Requires-Dist: xgboost +Requires-Dist: dill +Provides-Extra: dev +Requires-Dist: docutils; extra == "dev" +Requires-Dist: pytest; extra == "dev" +Requires-Dist: pytest-cov; extra == "dev" +Requires-Dist: coverage; extra == "dev" +Requires-Dist: pylama; extra == "dev" +Requires-Dist: jupyter; extra == "dev" +Requires-Dist: numpydoc; extra == "dev" +Requires-Dist: sphinx; extra == "dev" +Requires-Dist: nbsphinx; extra == "dev" +Requires-Dist: pydata_sphinx_theme; extra == "dev" +Requires-Dist: pandoc; extra == "dev" +Requires-Dist: tox; extra == "dev" +Requires-Dist: tox-wheel; extra == "dev" +Requires-Dist: black; extra == "dev" +Requires-Dist: isort; extra == "dev" +Requires-Dist: pyspark; extra == "dev" +Requires-Dist: distributed; extra == "dev" +Requires-Dist: dask; extra == "dev" +Requires-Dist: numpy<=1.24.6; extra == "dev" +Provides-Extra: pyspark +Requires-Dist: pyspark; extra == "pyspark" +Provides-Extra: dask +Requires-Dist: fsspec>=0.3.3; extra == "dask" +Requires-Dist: distributed; extra == "dask" +Requires-Dist: dask; extra == "dask" # gators -[![Build Status](https://img.shields.io/travis/dmlc/treelite.svg?label=build&logo=travis&branch=mainline)](https://travis-ci.org/dmlc/treelite) -[![Documentation Status](https://readthedocs.org/projects/treelite/badge/?version=latest)](http://treelite.readthedocs.io/en/latest/?badge=latest) -[![codecov](https://codecov.io/gh/scikit-learn-contrib/imbalanced-learn/branch/master/graph/badge.svg)](https://codecov.io/gh/scikit-learn-contrib/imbalanced-learn) +![PyPI](https://img.shields.io/pypi/v/gators) +[![build](https://github.com/paypal/gators/actions/workflows/build.yml/badge.svg)](https://github.com/paypal/gators/actions/workflows/build.yml) +[![codecov](https://codecov.io/gh/paypal/gators/branch/graph/badge.svg?token=vllGApc9v9)](https://codecov.io/gh/paypal/gators) +![Python Version](https://img.shields.io/badge/python-3.6%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-blue) ![GitHub](https://img.shields.io/github/license/paypal/gators) - -[![Build and test](https://github.com/paypal/gators/actions/workflows/build.yml/badge.svg)](https://github.com/paypal/gators/actions/workflows/build.yml) +[![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/) Documentation | Installation +
+
+
Gators is an in-house machine learning library developed by the Simility Data Team. While data pre-processing and machine learning models are developed in Python, the pre-processing aspect is replaced by faster compiled programming languages in the production environment. This change of programming language is an added complexity to the model deployment process but is required to cope with the large number of queries per second that can be observed. @@ -34,7 +68,5 @@ The goal of Gators is to be able to manage both model building and model serving Gators helps to streamline the model building and productionization processes. The model building part is done using the Pandas library for datasets held in memory, or Koalas for big data. On the model serving side, the pre-processing is carried out directly with Python, using NumPy and Cython. As a result, the speed-up using both NumPy and Cython for pre-processing is around x100 compared to standard Python code. Moreover, the per-sample response time becomes similar to other compiled languages (microsecond scale). -In summary, Gators is a package to handle model building with big data ad fast real-time pre-processing, even for a large number of QPS, using only Python. - - +In summary, Gators is a package to handle model building with big data and fast real-time pre-processing, even for a large number of QPS, using only Python. diff --git a/gators.egg-info/SOURCES.txt b/gators.egg-info/SOURCES.txt index 6bf5f4e8..5b3f1c71 100644 --- a/gators.egg-info/SOURCES.txt +++ b/gators.egg-info/SOURCES.txt @@ -1,39656 +1,181 @@ +.coveragerc +.gitignore LICENSE MANIFEST.in README.md -pyproject.toml +codecov.yml +combined_cert.pem +pytest.ini requirements.txt +requirements_tox.txt +run_doc.sh +run_tests.sh setup.cfg setup.py -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Compiler/Code.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Compiler/Parsing.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Compiler/Scanning.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Compiler/Visitor.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/openmp.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/array.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/float.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/function.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/int.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/list.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/long.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/method.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/module.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/number.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/object.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/set.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/string.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/type.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/version.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/errno.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/float.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/limits.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/locale.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/math.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/signal.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/string.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libc/time.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/numpy/math.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/mman.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/resource.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/select.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/signal.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/stat.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/strings.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/time.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/types.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Includes/posix/wait.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Plex/Actions.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Plex/Scanners.pxd -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Runtime/refnanny.pyx -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Utility/CConvert.pyx -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Utility/CppConvert.pyx -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Utility/MemoryView.pyx -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py36-darwin/lib/python3.6/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_alias.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_application.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_autocall.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_compilerop.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_completer.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_completerlib.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_debugger.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_display.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_displayhook.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_events.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_extension.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_formatters.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_handlers.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_history.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_hooks.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_imports.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_iplib.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_logger.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_magic.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_oinspect.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_page.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_prefilter.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_profile.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_prompts.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_run.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_shellapp.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_splitinput.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/core/tests/test_ultratb.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_display.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_imports.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_latextools.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_lexers.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_pretty.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/lib/tests/test_security.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/terminal/tests/test_embed.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/terminal/tests/test_help.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/testing/plugin/test_refs.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/testing/tests/test_decorators.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/testing/tests/test_tools.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_capture.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_decorators.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_dir2.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_imports.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_importstring.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_io.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_openpy.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_path.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_process.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_text.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py36-darwin/lib/python3.6/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py36-darwin/lib/python3.6/site-packages/async_generator/_tests/test_async_generator.py -.tox/py36-darwin/lib/python3.6/site-packages/async_generator/_tests/test_util.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_check.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_classdef.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_detect.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_diff.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_extendpickle.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_fglobals.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_file.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_functions.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_functors.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_mixins.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_module.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_moduledict.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_nested.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_objects.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_properties.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_recursive.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_restricted.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_selected.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_source.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_temp.py -.tox/py36-darwin/lib/python3.6/site-packages/dill/tests/test_weakref.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_de.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_kde.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_proposal.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_stretch.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/integration/test_walk.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_backends.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_blobs.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_sampler.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_state.py -.tox/py36-darwin/lib/python3.6/site-packages/emcee/tests/unit/test_stretch.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/binning/binning.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/binning/tests/test_discretizer.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/clipping/clipping.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/clipping/tests/test_clipping.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/encoder.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/imputers/imputer.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/imputers/tests/test_imputers.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/scalers/scaler.pyx -.tox/py36-darwin/lib/python3.6/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/transformers/tests/test_transformer.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/util/tests/test_benchmark.py -.tox/py36-darwin/lib/python3.6/site-packages/gators/util/tests/test_util.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_anneal.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_criteria.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_domains.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_fmin.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_ipy.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_pchoice.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_plotting.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_progress.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_rand.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_randint.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_rdists.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_spark.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_tpe.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_vectorize.py -.tox/py36-darwin/lib/python3.6/site-packages/hyperopt/tests/test_webpage.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_compatibilty_files.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_contents.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_files.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_open.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_path.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_read.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_reader.py -.tox/py36-darwin/lib/python3.6/site-packages/importlib_resources/tests/test_resource.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_async.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_connect.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_eventloop.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_io.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_kernel.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_message_spec.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_serialize.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py36-darwin/lib/python3.6/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py36-darwin/lib/python3.6/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py36-darwin/lib/python3.6/site-packages/ipython_genutils/tests/test_path.py -.tox/py36-darwin/lib/python3.6/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py36-darwin/lib/python3.6/site-packages/ipython_genutils/tests/test_text.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/tests/test_embed.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py36-darwin/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_backports.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_dask.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_deprecated_objects.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_disk.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_format_stack.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_func_inspect.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_hashing.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_init.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_logger.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_memmapping.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_memory.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_module.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_my_exceptions.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_numpy_pickle.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_parallel.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_store_backends.py -.tox/py36-darwin/lib/python3.6/site-packages/joblib/test/test_testing.py -.tox/py36-darwin/lib/python3.6/site-packages/jsonschema/tests/test_cli.py -.tox/py36-darwin/lib/python3.6/site-packages/jsonschema/tests/test_exceptions.py -.tox/py36-darwin/lib/python3.6/site-packages/jsonschema/tests/test_format.py -.tox/py36-darwin/lib/python3.6/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py36-darwin/lib/python3.6/site-packages/jsonschema/tests/test_types.py -.tox/py36-darwin/lib/python3.6/site-packages/jsonschema/tests/test_validators.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_adapter.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_client.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_connect.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_manager.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_public_api.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_session.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_ssh.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_client/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_console/tests/test_console.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_core/tests/test_application.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_core/tests/test_command.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_core/tests/test_migrate.py -.tox/py36-darwin/lib/python3.6/site-packages/jupyter_core/tests/test_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_afm.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_agg.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_animation.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_artist.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_axes.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_category.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_cbook.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_collections.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_colorbar.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_colors.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_compare_images.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_container.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_contour.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_cycles.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_dates.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_determinism.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_dviread.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_figure.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_font_manager.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_gridspec.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_image.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_legend.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_lines.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_marker.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_mathtext.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_mlab.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_patches.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_path.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_patheffects.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_pickle.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_png.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_polar.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_pyplot.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_quiver.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_rcparams.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_sankey.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_scale.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_simplification.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_skew.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_spines.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_streamplot.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_style.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_subplots.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_table.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_testing.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_texmanager.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_text.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_ticker.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_transforms.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_triangulation.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_ttconv.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_type1font.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_units.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_usetex.py -.tox/py36-darwin/lib/python3.6/site-packages/matplotlib/tests/test_widgets.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py36-darwin/lib/python3.6/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py36-darwin/lib/python3.6/site-packages/nbclient/tests/test_client.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/utils/tests/test_io.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/utils/tests/test_version.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/writers/tests/test_files.py -.tox/py36-darwin/lib/python3.6/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/corpus/tests/test_words.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/tests/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/tests/test_convert.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/tests/test_nbformat.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/tests/test_reader.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/tests/test_sign.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/tests/test_validator.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v1/tests/test_json.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v2/tests/test_json.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v3/tests/test_json.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v3/tests/test_misc.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v4/tests/test_convert.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v4/tests/test_json.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py36-darwin/lib/python3.6/site-packages/nbformat/v4/tests/test_validate.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_independent_set.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_core.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_minors.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_digraph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_filters.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_function.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_graph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_ordered.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_special.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/drawing/tests/test_layout.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_atlas.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_classic.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_cographs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_community.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_directed.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_duplication.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_ego.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_expanders.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_geometric.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_intersection.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_lattice.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_line.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_small.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_trees.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/generators/tests/test_triads.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/readwrite/tests/test_yaml.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/testing/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_all_random_functions.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_convert.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_convert_numpy.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_convert_pandas.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_convert_scipy.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_exceptions.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/tests/test_relabel.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_decorators.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_heaps.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_misc.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_rcm.py -.tox/py36-darwin/lib/python3.6/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/auth/tests/test_login.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/auth/tests/test_security.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/api/tests/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_config_manager.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_files.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_gateway.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_i18n.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_log.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_nbextensions.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_notebookapp.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_serialize.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_serverextensions.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_traittypes.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_save.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py36-darwin/lib/python3.6/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/__init__.cython-30.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/compat/tests/test_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test__exceptions.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_abc.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_defchararray.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_deprecations.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_dtype.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_einsum.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_errstate.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_extint128.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_function_base.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_getlimits.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_half.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_item_selection.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_longdouble.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_machar.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_memmap.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_multiarray.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_nditer.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_numeric.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_overrides.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_print.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_protocols.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_records.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_shape_base.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_ufunc.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_umath.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/core/tests/test_unicode.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_callback.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_kind.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_size.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/f2py/tests/test_string.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/fft/tests/test_helper.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test__datasource.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test__iotools.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test__version.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_financial.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_format.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_function_base.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_histograms.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_io.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_mixins.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_packbits.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_type_check.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/lib/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/linalg/tests/test_build.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/linalg/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_core.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_extras.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/_bounded_integers.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/_common.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/bit_generator.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/c_distributions.pxd -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_direct.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_extending.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_random.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_randomstate.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/random/tests/test_smoke.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/testing/tests/test_decorators.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/testing/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_ctypeslib.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_matlib.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_numpy_version.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_public_api.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_reloading.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_scripts.py -.tox/py36-darwin/lib/python3.6/site-packages/numpy/tests/test_warnings.py -.tox/py36-darwin/lib/python3.6/site-packages/numpydoc/tests/test_docscrape.py -.tox/py36-darwin/lib/python3.6/site-packages/numpydoc/tests/test_full.py -.tox/py36-darwin/lib/python3.6/site-packages/numpydoc/tests/test_main.py -.tox/py36-darwin/lib/python3.6/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py36-darwin/lib/python3.6/site-packages/numpydoc/tests/test_validate.py -.tox/py36-darwin/lib/python3.6/site-packages/numpydoc/tests/test_xref.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_aggregation.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_algos.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_downstream.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_errors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_expressions.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_lib.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_multilevel.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_nanops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_optional_dependency.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_register_accessor.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_sorting.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_strings.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/test_take.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/api/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/api/test_types.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/test_array.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_conversion.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_drop_duplicates.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_factorize.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_fillna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_misc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_transpose.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_unique.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/base/test_value_counts.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/computation/test_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/computation/test_eval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/config/test_config.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/config/test_localization.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_convert_objects.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_upcast.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_boolean.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_categorical.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_external_block.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_integer.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_interval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_numpy.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_sparse.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/test_string.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/json/test_json.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/extension/list/test_list.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_analytics.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_axis_select_reindex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_combine_concat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_missing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_operators.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_reshape.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_sort_values_level_as_str.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_subclass.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_timeseries.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_timezones.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_to_csv.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/test_validate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/apply/test_apply_relabeling.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/apply/test_frame_apply.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/test_finalize.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/test_frame.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/test_generic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/test_series.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/methods/test_dot.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/methods/test_first_valid_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/methods/test_reorder_levels.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/generic/methods/test_set_axis.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_apply.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_counting.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_filters.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_function.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_nth.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_rank.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_sample.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_size.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_engines.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_numeric.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_fillna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_insert.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_shift.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_snap.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_to_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_asfreq.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_factorize.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_fillna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_shift.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_to_timestamp.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_fillna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_insert.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_partial_slicing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_shift.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_callable.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_floats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_indexing_slow.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_loc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_partial.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/test_timedelta.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_insert.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_ix.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_xs.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/internals/test_internals.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_clipboard.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_compression.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_date_converters.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_feather.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_fsspec.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_gbq.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_gcs.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_html.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_orc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_parquet.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_pickle.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_s3.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_spss.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_sql.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/test_stata.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_style.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_console.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_css.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_format.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_info.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_style.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_compression.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_header.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_network.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/parser/test_usecols.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_backend.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_converter.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_frame.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_misc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/plotting/test_series.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_period_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_concat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_cut.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_melt.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/test_util.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_pivot_old.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/test_nat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_alter_axes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_analytics.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_block_internals.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_combine_concat.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_constructors.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_cumulative.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_datetime_values.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_duplicates.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_internals.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_io.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_missing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_operators.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_reductions.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_repr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_subclass.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_timeseries.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_timezones.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_ufunc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/test_validate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/apply/test_apply_relabeling.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/apply/test_series_apply.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_alter_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_boolean.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_callable.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_iloc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_loc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_multiindex.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_numeric.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_align.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_append.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_at_time.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_between.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_between_time.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_count.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_droplevel.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_first_and_last.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_round.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_period.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_timestamp.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_update.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tools/test_to_time.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_deprecate.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_doc.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_hashing.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_numba.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_safe_import.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_show_versions.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_util.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_validate_args.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_apply.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_dtypes.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_ewm.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_expanding.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_grouper.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_numba.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_pairwise.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_rolling.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py36-darwin/lib/python3.6/site-packages/pandas/tests/window/test_window.py -.tox/py36-darwin/lib/python3.6/site-packages/pyaml/tests/test_dump.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_compute.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_compute.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_csv.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_csv.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_cuda.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_cuda.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_dataset.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_dataset.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_dataset_orc.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_feather.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_flight.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_fs.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_fs.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_hdfs.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_hdfsio.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_json.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_orc.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_orc.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_parquet.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_parquet.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_plasma.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/_s3fs.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/gandiva.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/lib.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/lib.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/common.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libarrow.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/includes/libplasma.pxd -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_array.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_builder.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_cffi.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_compute.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_csv.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_cuda.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_cython.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_dataset.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_deprecations.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_extension_type.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_feather.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_filesystem.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_flight.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_fs.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_gandiva.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_hdfs.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_io.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_ipc.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_json.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_jvm.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_memory.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_misc.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_orc.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_pandas.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_plasma.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_scalars.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_schema.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_serialization.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_strategies.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_table.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_tensor.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_types.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/test_util.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py36-darwin/lib/python3.6/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_api.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_builtin.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_checker.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_code_segment.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_dict.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_doctests.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_imports.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_is_literal.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_match.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_other.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_type_annotations.py -.tox/py36-darwin/lib/python3.6/site-packages/pyflakes/test/test_undefined_names.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_app.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_comms.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py36-darwin/lib/python3.6/site-packages/qtconsole/tests/test_styles.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_macos_checks.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_main.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qt3drender.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtcharts.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtcore.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qthelp.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtlocation.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtqml.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtquick.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtserialport.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtsql.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtsvg.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qttest.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py36-darwin/lib/python3.6/site-packages/qtpy/tests/test_uic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_build_utils/tests/test_circular_imports.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test__util.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/cluster/tests/test_vq.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/constants/tests/test_codata.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/constants/tests/test_constants.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/tests/test_backend.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/tests/test_helper.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/tests/test_numpy.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fftpack/tests/test_import.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/tests/test_fortran.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/tests/test_idl.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/tests/test_mmio.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/tests/test_netcdf.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/tests/test_paths.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/io/tests/test_wavfile.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/cython_blas.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_blas.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_build.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/misc/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/misc/tests/test_doccer.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_ndimage.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/odr/tests/test_odr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__root.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_spectral.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/signal/tests/test_windows.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_construct.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_csc.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_csr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_extract.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test_distance.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/cython_special.pxd -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_bdtr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_boxcox.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_cdflib.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_cython_special.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_data.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_digamma.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_erfinv.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_gamma.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_gammainc.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_lambertw.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_loggamma.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_logit.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_mpmath.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_ndtr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_owens_t.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_pcf.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_pdtr.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_round.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_sf_error.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_sici.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_spence.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_trig.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/special/tests/test_zeta.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_contingency.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_distributions.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_fit.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_morestats.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_rank.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_stats.py -.tox/py36-darwin/lib/python3.6/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_algorithms.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_axisgrid.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_categorical.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_core.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_decorators.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_distributions.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_docstrings.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_matrix.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_miscplot.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_palettes.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_rcmod.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_relational.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_statistics.py -.tox/py36-darwin/lib/python3.6/site-packages/seaborn/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/compose/tests/test_target.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/impute/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/impute/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/impute/tests/test_impute.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/impute/tests/test_knn.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/svm/tests/test_svm.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_base.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_build.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_calibration.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_check_build.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_common.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_config.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_dummy.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_init.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_isotonic.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_metaestimators.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_multiclass.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_multioutput.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_pipeline.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tests/test_random_projection.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/_criterion.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/_splitter.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/_tree.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/_utils.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/tests/test_export.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/tree/tests/test_tree.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/_random.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/murmurhash.pxd -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_random.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_testing.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_utils.py -.tox/py36-darwin/lib/python3.6/site-packages/sklearn/utils/tests/test_validation.py -.tox/py36-darwin/lib/python3.6/site-packages/tests/test_config.py -.tox/py36-darwin/lib/python3.6/site-packages/tests/test_core.py -.tox/py36-darwin/lib/python3.6/site-packages/tests/test_linters.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/config/tests/test_application.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/config/tests/test_configurable.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/config/tests/test_loader.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/tests/test_traitlets.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py36-darwin/lib/python3.6/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py36-darwin/lib/python3.6/site-packages/wcwidth/tests/test_core.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/backend/cython/__init__.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/backend/cython/context.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/backend/cython/message.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/backend/cython/socket.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_asyncio.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_auth.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_cffi_backend.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_constants.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_context.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_cython.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_decorators.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_device.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_draft.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_error.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_etc.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_future.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_imports.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_includes.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_ioloop.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_log.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_message.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_monitor.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_monqueue.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_multipart.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_mypy.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_pair.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_poll.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_pubsub.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_reqrep.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_retry_eintr.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_security.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_socket.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_ssh.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_version.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_win32_shim.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_z85.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/tests/test_zmqstream.py -.tox/py36-darwin/lib/python3.6/site-packages/zmq/utils/buffers.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Compiler/Code.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Compiler/Parsing.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Compiler/Scanning.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Compiler/Visitor.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py36-linux/lib/python3.6/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/openmp.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/array.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/float.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/function.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/int.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/list.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/long.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/method.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/module.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/number.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/object.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/set.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/string.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/type.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/version.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/errno.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/float.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/limits.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/locale.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/math.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/signal.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/string.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libc/time.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/numpy/math.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/mman.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/resource.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/select.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/signal.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/stat.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/strings.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/time.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/types.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Includes/posix/wait.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Plex/Actions.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Plex/Scanners.pxd -.tox/py36-linux/lib/python3.6/site-packages/Cython/Runtime/refnanny.pyx -.tox/py36-linux/lib/python3.6/site-packages/Cython/Utility/CConvert.pyx -.tox/py36-linux/lib/python3.6/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py36-linux/lib/python3.6/site-packages/Cython/Utility/CppConvert.pyx -.tox/py36-linux/lib/python3.6/site-packages/Cython/Utility/MemoryView.pyx -.tox/py36-linux/lib/python3.6/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py36-linux/lib/python3.6/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_alias.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_application.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_autocall.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_compilerop.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_completer.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_completerlib.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_debugger.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_display.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_displayhook.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_events.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_extension.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_formatters.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_handlers.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_history.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_hooks.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_imports.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_iplib.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_logger.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_magic.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_oinspect.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_page.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_paths.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_prefilter.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_profile.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_prompts.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_run.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_shellapp.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_splitinput.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/core/tests/test_ultratb.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_display.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_imports.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_latextools.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_lexers.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_pretty.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/lib/tests/test_security.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/terminal/tests/test_embed.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/terminal/tests/test_help.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/testing/plugin/test_refs.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/testing/tests/test_decorators.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/testing/tests/test_tools.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_capture.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_decorators.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_dir2.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_imports.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_importstring.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_io.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_openpy.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_path.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_process.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_text.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py36-linux/lib/python3.6/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py36-linux/lib/python3.6/site-packages/async_generator/_tests/test_async_generator.py -.tox/py36-linux/lib/python3.6/site-packages/async_generator/_tests/test_util.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_check.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_classdef.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_detect.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_diff.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_extendpickle.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_fglobals.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_file.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_functions.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_functors.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_mixins.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_module.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_moduledict.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_nested.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_objects.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_properties.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_recursive.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_restricted.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_selected.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_source.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_temp.py -.tox/py36-linux/lib/python3.6/site-packages/dill/tests/test_weakref.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_de.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_kde.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_proposal.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_stretch.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/integration/test_walk.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_backends.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_blobs.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_sampler.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_state.py -.tox/py36-linux/lib/python3.6/site-packages/emcee/tests/unit/test_stretch.py -.tox/py36-linux/lib/python3.6/site-packages/gators/binning/binning.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py36-linux/lib/python3.6/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py36-linux/lib/python3.6/site-packages/gators/binning/tests/test_discretizer.py -.tox/py36-linux/lib/python3.6/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py36-linux/lib/python3.6/site-packages/gators/clipping/clipping.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/clipping/tests/test_clipping.py -.tox/py36-linux/lib/python3.6/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py36-linux/lib/python3.6/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py36-linux/lib/python3.6/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py36-linux/lib/python3.6/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/encoder.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py36-linux/lib/python3.6/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py36-linux/lib/python3.6/site-packages/gators/imputers/imputer.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/imputers/tests/test_imputers.py -.tox/py36-linux/lib/python3.6/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py36-linux/lib/python3.6/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py36-linux/lib/python3.6/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py36-linux/lib/python3.6/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py36-linux/lib/python3.6/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py36-linux/lib/python3.6/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py36-linux/lib/python3.6/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py36-linux/lib/python3.6/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py36-linux/lib/python3.6/site-packages/gators/scalers/scaler.pyx -.tox/py36-linux/lib/python3.6/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py36-linux/lib/python3.6/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py36-linux/lib/python3.6/site-packages/gators/transformers/tests/test_transformer.py -.tox/py36-linux/lib/python3.6/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py36-linux/lib/python3.6/site-packages/gators/util/tests/test_benchmark.py -.tox/py36-linux/lib/python3.6/site-packages/gators/util/tests/test_util.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_anneal.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_criteria.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_domains.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_fmin.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_ipy.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_pchoice.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_plotting.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_progress.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_rand.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_randint.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_rdists.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_spark.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_tpe.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_vectorize.py -.tox/py36-linux/lib/python3.6/site-packages/hyperopt/tests/test_webpage.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_compatibilty_files.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_contents.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_files.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_open.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_path.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_read.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_reader.py -.tox/py36-linux/lib/python3.6/site-packages/importlib_resources/tests/test_resource.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_async.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_connect.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_eventloop.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_io.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_kernel.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_message_spec.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_serialize.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py36-linux/lib/python3.6/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py36-linux/lib/python3.6/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py36-linux/lib/python3.6/site-packages/ipython_genutils/tests/test_path.py -.tox/py36-linux/lib/python3.6/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py36-linux/lib/python3.6/site-packages/ipython_genutils/tests/test_text.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/tests/test_embed.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py36-linux/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_backports.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_dask.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_deprecated_objects.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_disk.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_format_stack.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_func_inspect.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_hashing.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_init.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_logger.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_memmapping.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_memory.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_module.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_my_exceptions.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_numpy_pickle.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_parallel.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_store_backends.py -.tox/py36-linux/lib/python3.6/site-packages/joblib/test/test_testing.py -.tox/py36-linux/lib/python3.6/site-packages/jsonschema/tests/test_cli.py -.tox/py36-linux/lib/python3.6/site-packages/jsonschema/tests/test_exceptions.py -.tox/py36-linux/lib/python3.6/site-packages/jsonschema/tests/test_format.py -.tox/py36-linux/lib/python3.6/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py36-linux/lib/python3.6/site-packages/jsonschema/tests/test_types.py -.tox/py36-linux/lib/python3.6/site-packages/jsonschema/tests/test_validators.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_adapter.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_client.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_connect.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_manager.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_public_api.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_session.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_ssh.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_client/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_console/tests/test_console.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_core/tests/test_application.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_core/tests/test_command.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_core/tests/test_migrate.py -.tox/py36-linux/lib/python3.6/site-packages/jupyter_core/tests/test_paths.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_afm.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_agg.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_animation.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_artist.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_axes.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_category.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_cbook.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_collections.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_colorbar.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_colors.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_compare_images.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_container.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_contour.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_cycles.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_dates.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_determinism.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_dviread.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_figure.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_font_manager.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_gridspec.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_image.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_legend.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_lines.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_marker.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_mathtext.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_mlab.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_patches.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_path.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_patheffects.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_pickle.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_png.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_polar.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_pyplot.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_quiver.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_rcparams.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_sankey.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_scale.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_simplification.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_skew.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_spines.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_streamplot.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_style.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_subplots.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_table.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_testing.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_texmanager.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_text.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_ticker.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_transforms.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_triangulation.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_ttconv.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_type1font.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_units.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_usetex.py -.tox/py36-linux/lib/python3.6/site-packages/matplotlib/tests/test_widgets.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py36-linux/lib/python3.6/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py36-linux/lib/python3.6/site-packages/nbclient/tests/test_client.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/utils/tests/test_io.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/utils/tests/test_version.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/writers/tests/test_files.py -.tox/py36-linux/lib/python3.6/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/corpus/tests/test_words.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/tests/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/tests/test_convert.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/tests/test_nbformat.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/tests/test_reader.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/tests/test_sign.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/tests/test_validator.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v1/tests/test_json.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v2/tests/test_json.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v3/tests/test_json.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v3/tests/test_misc.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v4/tests/test_convert.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v4/tests/test_json.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py36-linux/lib/python3.6/site-packages/nbformat/v4/tests/test_validate.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_independent_set.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_core.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_minors.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_digraph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_filters.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_function.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_graph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_ordered.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_special.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/drawing/tests/test_layout.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_atlas.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_classic.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_cographs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_community.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_directed.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_duplication.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_ego.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_expanders.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_geometric.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_intersection.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_lattice.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_line.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_small.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_trees.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/generators/tests/test_triads.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/readwrite/tests/test_yaml.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/testing/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_all_random_functions.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_convert.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_convert_numpy.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_convert_pandas.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_convert_scipy.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_exceptions.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/tests/test_relabel.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_decorators.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_heaps.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_misc.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_rcm.py -.tox/py36-linux/lib/python3.6/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/auth/tests/test_login.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/auth/tests/test_security.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/api/tests/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_config_manager.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_files.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_gateway.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_i18n.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_log.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_nbextensions.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_notebookapp.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_paths.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_serialize.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_serverextensions.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_traittypes.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_save.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py36-linux/lib/python3.6/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/__init__.cython-30.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/compat/tests/test_compat.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test__exceptions.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_abc.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_defchararray.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_deprecations.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_dtype.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_einsum.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_errstate.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_extint128.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_function_base.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_getlimits.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_half.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_item_selection.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_longdouble.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_machar.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_memmap.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_multiarray.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_nditer.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_numeric.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_overrides.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_print.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_protocols.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_records.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_shape_base.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_ufunc.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_umath.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/core/tests/test_unicode.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_callback.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_kind.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_size.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/f2py/tests/test_string.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/fft/tests/test_helper.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test__datasource.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test__iotools.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test__version.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_financial.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_format.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_function_base.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_histograms.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_io.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_mixins.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_packbits.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_type_check.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/lib/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/linalg/tests/test_build.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/linalg/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_core.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_extras.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/_bounded_integers.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/_common.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/bit_generator.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/c_distributions.pxd -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_direct.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_extending.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_random.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_randomstate.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/random/tests/test_smoke.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/testing/tests/test_decorators.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/testing/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_ctypeslib.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_matlib.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_numpy_version.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_public_api.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_reloading.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_scripts.py -.tox/py36-linux/lib/python3.6/site-packages/numpy/tests/test_warnings.py -.tox/py36-linux/lib/python3.6/site-packages/numpydoc/tests/test_docscrape.py -.tox/py36-linux/lib/python3.6/site-packages/numpydoc/tests/test_full.py -.tox/py36-linux/lib/python3.6/site-packages/numpydoc/tests/test_main.py -.tox/py36-linux/lib/python3.6/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py36-linux/lib/python3.6/site-packages/numpydoc/tests/test_validate.py -.tox/py36-linux/lib/python3.6/site-packages/numpydoc/tests/test_xref.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_aggregation.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_algos.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_downstream.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_errors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_expressions.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_lib.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_multilevel.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_nanops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_optional_dependency.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_register_accessor.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_sorting.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_strings.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/test_take.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/api/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/api/test_types.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/test_array.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_conversion.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_drop_duplicates.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_factorize.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_fillna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_misc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_transpose.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_unique.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/base/test_value_counts.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/computation/test_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/computation/test_eval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/config/test_config.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/config/test_localization.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_convert_objects.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_upcast.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_boolean.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_categorical.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_external_block.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_integer.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_interval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_numpy.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_sparse.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/test_string.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/json/test_json.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/extension/list/test_list.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_analytics.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_axis_select_reindex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_combine_concat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_missing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_operators.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_reshape.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_sort_values_level_as_str.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_subclass.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_timeseries.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_timezones.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_to_csv.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/test_validate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/apply/test_apply_relabeling.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/apply/test_frame_apply.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/test_finalize.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/test_frame.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/test_generic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/test_series.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/methods/test_dot.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/methods/test_first_valid_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/methods/test_reorder_levels.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/generic/methods/test_set_axis.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_apply.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_counting.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_filters.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_function.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_nth.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_rank.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_sample.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_size.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_engines.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_numeric.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_fillna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_insert.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_shift.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_snap.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_to_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_asfreq.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_factorize.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_fillna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_shift.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_to_timestamp.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_fillna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_insert.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_partial_slicing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_shift.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_callable.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_floats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_indexing_slow.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_loc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_partial.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/test_timedelta.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_insert.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_ix.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_xs.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/internals/test_internals.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_clipboard.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_compression.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_date_converters.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_feather.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_fsspec.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_gbq.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_gcs.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_html.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_orc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_parquet.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_pickle.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_s3.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_spss.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_sql.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/test_stata.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_style.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_console.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_css.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_format.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_info.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_style.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_compression.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_header.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_network.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/parser/test_usecols.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_backend.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_converter.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_frame.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_misc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/plotting/test_series.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_period_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_concat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_cut.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_melt.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/test_util.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_pivot_old.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/test_nat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_alter_axes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_analytics.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_block_internals.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_combine_concat.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_constructors.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_cumulative.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_datetime_values.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_duplicates.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_internals.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_io.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_missing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_operators.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_reductions.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_repr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_subclass.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_timeseries.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_timezones.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_ufunc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/test_validate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/apply/test_apply_relabeling.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/apply/test_series_apply.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_alter_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_boolean.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_callable.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_iloc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_loc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_multiindex.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_numeric.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_align.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_append.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_at_time.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_between.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_between_time.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_count.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_droplevel.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_first_and_last.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_round.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_period.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_timestamp.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_update.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tools/test_to_time.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_deprecate.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_doc.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_hashing.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_numba.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_safe_import.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_show_versions.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_util.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_validate_args.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_apply.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_dtypes.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_ewm.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_expanding.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_grouper.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_numba.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_pairwise.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_rolling.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py36-linux/lib/python3.6/site-packages/pandas/tests/window/test_window.py -.tox/py36-linux/lib/python3.6/site-packages/pyaml/tests/test_dump.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_compute.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_compute.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_csv.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_csv.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_cuda.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_cuda.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_dataset.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_dataset.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_dataset_orc.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_feather.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_flight.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_fs.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_fs.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_hdfs.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_hdfsio.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_json.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_orc.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_orc.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_parquet.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_parquet.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_plasma.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/_s3fs.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/gandiva.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/lib.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/lib.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/common.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libarrow.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/includes/libplasma.pxd -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_array.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_builder.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_cffi.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_compute.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_csv.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_cuda.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_cython.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_dataset.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_deprecations.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_extension_type.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_feather.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_filesystem.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_flight.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_fs.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_gandiva.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_hdfs.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_io.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_ipc.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_json.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_jvm.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_memory.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_misc.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_orc.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_pandas.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_plasma.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_scalars.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_schema.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_serialization.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_strategies.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_table.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_tensor.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_types.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/test_util.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py36-linux/lib/python3.6/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_api.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_builtin.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_checker.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_code_segment.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_dict.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_doctests.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_imports.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_is_literal.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_match.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_other.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_type_annotations.py -.tox/py36-linux/lib/python3.6/site-packages/pyflakes/test/test_undefined_names.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_app.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_comms.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py36-linux/lib/python3.6/site-packages/qtconsole/tests/test_styles.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_macos_checks.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_main.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qt3drender.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtcharts.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtcore.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qthelp.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtlocation.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtqml.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtquick.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtserialport.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtsql.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtsvg.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qttest.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py36-linux/lib/python3.6/site-packages/qtpy/tests/test_uic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/special.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/_build_utils/tests/test_circular_imports.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test__util.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/cluster/tests/test_vq.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/constants/tests/test_codata.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/constants/tests/test_constants.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/tests/test_backend.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/tests/test_helper.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/tests/test_numpy.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fftpack/tests/test_import.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/tests/test_fortran.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/tests/test_idl.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/tests/test_mmio.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/tests/test_netcdf.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/tests/test_paths.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/io/tests/test_wavfile.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/cython_blas.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_blas.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_build.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/misc/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/misc/tests/test_doccer.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_ndimage.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/odr/tests/test_odr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__root.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_spectral.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/signal/tests/test_windows.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_construct.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_csc.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_csr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_extract.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test_distance.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/cython_special.pxd -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_bdtr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_boxcox.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_cdflib.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_cython_special.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_data.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_digamma.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_erfinv.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_gamma.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_gammainc.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_lambertw.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_loggamma.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_logit.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_mpmath.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_ndtr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_owens_t.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_pcf.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_pdtr.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_round.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_sf_error.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_sici.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_spence.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_trig.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/special/tests/test_zeta.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_contingency.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_distributions.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_fit.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_morestats.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_rank.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_stats.py -.tox/py36-linux/lib/python3.6/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_algorithms.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_axisgrid.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_categorical.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_core.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_decorators.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_distributions.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_docstrings.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_matrix.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_miscplot.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_palettes.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_rcmod.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_relational.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_statistics.py -.tox/py36-linux/lib/python3.6/site-packages/seaborn/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/compose/tests/test_target.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/impute/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/impute/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/impute/tests/test_impute.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/impute/tests/test_knn.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/svm/tests/test_svm.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_base.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_build.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_calibration.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_check_build.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_common.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_config.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_dummy.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_init.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_isotonic.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_metaestimators.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_multiclass.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_multioutput.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_pipeline.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tests/test_random_projection.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/_criterion.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/_splitter.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/_tree.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/_utils.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/tests/test_export.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/tree/tests/test_tree.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/_random.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/murmurhash.pxd -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_random.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_testing.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_utils.py -.tox/py36-linux/lib/python3.6/site-packages/sklearn/utils/tests/test_validation.py -.tox/py36-linux/lib/python3.6/site-packages/tests/test_config.py -.tox/py36-linux/lib/python3.6/site-packages/tests/test_core.py -.tox/py36-linux/lib/python3.6/site-packages/tests/test_linters.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/config/tests/test_application.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/config/tests/test_configurable.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/config/tests/test_loader.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/tests/test_traitlets.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py36-linux/lib/python3.6/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py36-linux/lib/python3.6/site-packages/wcwidth/tests/test_core.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/backend/cython/__init__.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/backend/cython/context.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/backend/cython/message.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/backend/cython/socket.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_asyncio.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_auth.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_cffi_backend.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_constants.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_context.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_cython.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_decorators.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_device.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_draft.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_error.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_etc.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_future.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_imports.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_includes.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_ioloop.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_log.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_message.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_monitor.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_monqueue.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_multipart.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_mypy.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_pair.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_poll.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_pubsub.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_reqrep.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_retry_eintr.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_security.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_socket.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_ssh.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_version.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_win32_shim.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_z85.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/tests/test_zmqstream.py -.tox/py36-linux/lib/python3.6/site-packages/zmq/utils/buffers.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Compiler/Code.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Compiler/Parsing.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Compiler/Scanning.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Compiler/Visitor.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py36/lib/python3.6/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py36/lib/python3.6/site-packages/Cython/Includes/openmp.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/array.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/float.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/function.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/int.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/list.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/long.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/method.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/module.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/number.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/object.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/set.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/string.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/type.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/version.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/errno.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/float.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/limits.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/locale.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/math.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/signal.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/string.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libc/time.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/numpy/math.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/mman.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/resource.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/select.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/signal.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/stat.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/strings.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/time.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/types.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Includes/posix/wait.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Plex/Actions.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Plex/Scanners.pxd -.tox/py36/lib/python3.6/site-packages/Cython/Runtime/refnanny.pyx -.tox/py36/lib/python3.6/site-packages/Cython/Utility/CConvert.pyx -.tox/py36/lib/python3.6/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py36/lib/python3.6/site-packages/Cython/Utility/CppConvert.pyx -.tox/py36/lib/python3.6/site-packages/Cython/Utility/MemoryView.pyx -.tox/py36/lib/python3.6/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py36/lib/python3.6/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_alias.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_application.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_autocall.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_compilerop.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_completer.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_completerlib.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_debugger.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_display.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_displayhook.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_events.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_extension.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_formatters.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_handlers.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_history.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_hooks.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_imports.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_iplib.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_logger.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_magic.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_oinspect.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_page.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_paths.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_prefilter.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_profile.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_prompts.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_run.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_shellapp.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_splitinput.py -.tox/py36/lib/python3.6/site-packages/IPython/core/tests/test_ultratb.py -.tox/py36/lib/python3.6/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py36/lib/python3.6/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_display.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_imports.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_latextools.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_lexers.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_pretty.py -.tox/py36/lib/python3.6/site-packages/IPython/lib/tests/test_security.py -.tox/py36/lib/python3.6/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py36/lib/python3.6/site-packages/IPython/terminal/tests/test_embed.py -.tox/py36/lib/python3.6/site-packages/IPython/terminal/tests/test_help.py -.tox/py36/lib/python3.6/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py36/lib/python3.6/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py36/lib/python3.6/site-packages/IPython/testing/plugin/test_refs.py -.tox/py36/lib/python3.6/site-packages/IPython/testing/tests/test_decorators.py -.tox/py36/lib/python3.6/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py36/lib/python3.6/site-packages/IPython/testing/tests/test_tools.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_capture.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_decorators.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_dir2.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_imports.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_importstring.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_io.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_openpy.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_path.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_process.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_text.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py36/lib/python3.6/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py36/lib/python3.6/site-packages/async_generator/_tests/test_async_generator.py -.tox/py36/lib/python3.6/site-packages/async_generator/_tests/test_util.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_check.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_classdef.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_detect.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_diff.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_extendpickle.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_fglobals.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_file.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_functions.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_functors.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_mixins.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_module.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_moduledict.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_nested.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_objects.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_properties.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_recursive.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_restricted.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_selected.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_source.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_temp.py -.tox/py36/lib/python3.6/site-packages/dill/tests/test_weakref.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_de.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_kde.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_proposal.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_stretch.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/integration/test_walk.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_backends.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_blobs.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_sampler.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_state.py -.tox/py36/lib/python3.6/site-packages/emcee/tests/unit/test_stretch.py -.tox/py36/lib/python3.6/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_anneal.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_criteria.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_domains.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_fmin.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_ipy.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_pchoice.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_plotting.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_progress.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_rand.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_randint.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_rdists.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_spark.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_tpe.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_vectorize.py -.tox/py36/lib/python3.6/site-packages/hyperopt/tests/test_webpage.py -.tox/py36/lib/python3.6/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py36/lib/python3.6/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_async.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_connect.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_eventloop.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_io.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_kernel.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_message_spec.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_serialize.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py36/lib/python3.6/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py36/lib/python3.6/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py36/lib/python3.6/site-packages/ipython_genutils/tests/test_path.py -.tox/py36/lib/python3.6/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py36/lib/python3.6/site-packages/ipython_genutils/tests/test_text.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/tests/test_embed.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py36/lib/python3.6/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_backports.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_dask.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_deprecated_objects.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_disk.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_format_stack.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_func_inspect.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_hashing.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_init.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_logger.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_memmapping.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_memory.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_module.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_my_exceptions.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_numpy_pickle.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_parallel.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_store_backends.py -.tox/py36/lib/python3.6/site-packages/joblib/test/test_testing.py -.tox/py36/lib/python3.6/site-packages/jsonschema/tests/test_cli.py -.tox/py36/lib/python3.6/site-packages/jsonschema/tests/test_exceptions.py -.tox/py36/lib/python3.6/site-packages/jsonschema/tests/test_format.py -.tox/py36/lib/python3.6/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py36/lib/python3.6/site-packages/jsonschema/tests/test_types.py -.tox/py36/lib/python3.6/site-packages/jsonschema/tests/test_validators.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_adapter.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_client.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_connect.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_manager.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_public_api.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_session.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_ssh.py -.tox/py36/lib/python3.6/site-packages/jupyter_client/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/jupyter_console/tests/test_console.py -.tox/py36/lib/python3.6/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py36/lib/python3.6/site-packages/jupyter_core/tests/test_application.py -.tox/py36/lib/python3.6/site-packages/jupyter_core/tests/test_command.py -.tox/py36/lib/python3.6/site-packages/jupyter_core/tests/test_migrate.py -.tox/py36/lib/python3.6/site-packages/jupyter_core/tests/test_paths.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_afm.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_agg.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_animation.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_artist.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_axes.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_basic.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_category.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_cbook.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_collections.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_colorbar.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_colors.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_compare_images.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_container.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_contour.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_cycles.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_dates.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_determinism.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_dviread.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_figure.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_font_manager.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_gridspec.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_image.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_legend.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_lines.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_marker.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_mathtext.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_mlab.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_patches.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_path.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_patheffects.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_pickle.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_png.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_polar.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_pyplot.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_quiver.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_rcparams.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_sankey.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_scale.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_simplification.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_skew.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_spines.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_streamplot.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_style.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_subplots.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_table.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_testing.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_texmanager.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_text.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_ticker.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_transforms.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_triangulation.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_ttconv.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_type1font.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_units.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_usetex.py -.tox/py36/lib/python3.6/site-packages/matplotlib/tests/test_widgets.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py36/lib/python3.6/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py36/lib/python3.6/site-packages/nbclient/tests/test_client.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py36/lib/python3.6/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py36/lib/python3.6/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py36/lib/python3.6/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py36/lib/python3.6/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py36/lib/python3.6/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py36/lib/python3.6/site-packages/nbconvert/utils/tests/test_io.py -.tox/py36/lib/python3.6/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py36/lib/python3.6/site-packages/nbconvert/utils/tests/test_version.py -.tox/py36/lib/python3.6/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py36/lib/python3.6/site-packages/nbconvert/writers/tests/test_files.py -.tox/py36/lib/python3.6/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py36/lib/python3.6/site-packages/nbformat/corpus/tests/test_words.py -.tox/py36/lib/python3.6/site-packages/nbformat/tests/test_api.py -.tox/py36/lib/python3.6/site-packages/nbformat/tests/test_convert.py -.tox/py36/lib/python3.6/site-packages/nbformat/tests/test_nbformat.py -.tox/py36/lib/python3.6/site-packages/nbformat/tests/test_reader.py -.tox/py36/lib/python3.6/site-packages/nbformat/tests/test_sign.py -.tox/py36/lib/python3.6/site-packages/nbformat/tests/test_validator.py -.tox/py36/lib/python3.6/site-packages/nbformat/v1/tests/test_json.py -.tox/py36/lib/python3.6/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py36/lib/python3.6/site-packages/nbformat/v2/tests/test_json.py -.tox/py36/lib/python3.6/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py36/lib/python3.6/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py36/lib/python3.6/site-packages/nbformat/v3/tests/test_json.py -.tox/py36/lib/python3.6/site-packages/nbformat/v3/tests/test_misc.py -.tox/py36/lib/python3.6/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py36/lib/python3.6/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py36/lib/python3.6/site-packages/nbformat/v4/tests/test_convert.py -.tox/py36/lib/python3.6/site-packages/nbformat/v4/tests/test_json.py -.tox/py36/lib/python3.6/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py36/lib/python3.6/site-packages/nbformat/v4/tests/test_validate.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_independent_set.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_core.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_minors.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py36/lib/python3.6/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_digraph.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_filters.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_function.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_graph.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_ordered.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_special.py -.tox/py36/lib/python3.6/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py36/lib/python3.6/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py36/lib/python3.6/site-packages/networkx/drawing/tests/test_layout.py -.tox/py36/lib/python3.6/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py36/lib/python3.6/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_atlas.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_classic.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_cographs.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_community.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_directed.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_duplication.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_ego.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_expanders.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_geometric.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_intersection.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_lattice.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_line.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_small.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_trees.py -.tox/py36/lib/python3.6/site-packages/networkx/generators/tests/test_triads.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py36/lib/python3.6/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py36/lib/python3.6/site-packages/networkx/readwrite/tests/test_yaml.py -.tox/py36/lib/python3.6/site-packages/networkx/testing/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_all_random_functions.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_convert.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_convert_numpy.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_convert_pandas.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_convert_scipy.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_exceptions.py -.tox/py36/lib/python3.6/site-packages/networkx/tests/test_relabel.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_decorators.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_heaps.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_misc.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_rcm.py -.tox/py36/lib/python3.6/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py36/lib/python3.6/site-packages/notebook/auth/tests/test_login.py -.tox/py36/lib/python3.6/site-packages/notebook/auth/tests/test_security.py -.tox/py36/lib/python3.6/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py36/lib/python3.6/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py36/lib/python3.6/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py36/lib/python3.6/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py36/lib/python3.6/site-packages/notebook/services/api/tests/test_api.py -.tox/py36/lib/python3.6/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py36/lib/python3.6/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py36/lib/python3.6/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py36/lib/python3.6/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py36/lib/python3.6/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py36/lib/python3.6/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py36/lib/python3.6/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py36/lib/python3.6/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py36/lib/python3.6/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py36/lib/python3.6/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py36/lib/python3.6/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_config_manager.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_files.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_gateway.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_i18n.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_log.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_nbextensions.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_notebookapp.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_paths.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_serialize.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_serverextensions.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_traittypes.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_save.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py36/lib/python3.6/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py36/lib/python3.6/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py36/lib/python3.6/site-packages/numpy/__init__.cython-30.pxd -.tox/py36/lib/python3.6/site-packages/numpy/__init__.pxd -.tox/py36/lib/python3.6/site-packages/numpy/compat/tests/test_compat.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test__exceptions.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_abc.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_api.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_datetime.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_defchararray.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_deprecations.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_dtype.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_einsum.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_errstate.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_extint128.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_function_base.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_getlimits.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_half.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_indexing.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_item_selection.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_longdouble.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_machar.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_memmap.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_multiarray.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_nditer.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_numeric.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_overrides.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_print.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_protocols.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_records.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_shape_base.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_ufunc.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_umath.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py36/lib/python3.6/site-packages/numpy/core/tests/test_unicode.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py36/lib/python3.6/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_callback.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_kind.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_size.py -.tox/py36/lib/python3.6/site-packages/numpy/f2py/tests/test_string.py -.tox/py36/lib/python3.6/site-packages/numpy/fft/tests/test_helper.py -.tox/py36/lib/python3.6/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test__datasource.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test__iotools.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test__version.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_financial.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_format.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_function_base.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_histograms.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_io.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_mixins.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_packbits.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_type_check.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py36/lib/python3.6/site-packages/numpy/lib/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/numpy/linalg/tests/test_build.py -.tox/py36/lib/python3.6/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py36/lib/python3.6/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py36/lib/python3.6/site-packages/numpy/linalg/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_core.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_extras.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py36/lib/python3.6/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py36/lib/python3.6/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py36/lib/python3.6/site-packages/numpy/random/__init__.pxd -.tox/py36/lib/python3.6/site-packages/numpy/random/_bounded_integers.pxd -.tox/py36/lib/python3.6/site-packages/numpy/random/_common.pxd -.tox/py36/lib/python3.6/site-packages/numpy/random/bit_generator.pxd -.tox/py36/lib/python3.6/site-packages/numpy/random/c_distributions.pxd -.tox/py36/lib/python3.6/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py36/lib/python3.6/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_direct.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_extending.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_random.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_randomstate.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py36/lib/python3.6/site-packages/numpy/random/tests/test_smoke.py -.tox/py36/lib/python3.6/site-packages/numpy/testing/tests/test_decorators.py -.tox/py36/lib/python3.6/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py36/lib/python3.6/site-packages/numpy/testing/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_ctypeslib.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_matlib.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_numpy_version.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_public_api.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_reloading.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_scripts.py -.tox/py36/lib/python3.6/site-packages/numpy/tests/test_warnings.py -.tox/py36/lib/python3.6/site-packages/numpydoc/tests/test_docscrape.py -.tox/py36/lib/python3.6/site-packages/numpydoc/tests/test_full.py -.tox/py36/lib/python3.6/site-packages/numpydoc/tests/test_main.py -.tox/py36/lib/python3.6/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py36/lib/python3.6/site-packages/numpydoc/tests/test_validate.py -.tox/py36/lib/python3.6/site-packages/numpydoc/tests/test_xref.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_aggregation.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_algos.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_downstream.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_errors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_expressions.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_lib.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_multilevel.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_nanops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_optional_dependency.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_register_accessor.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_sorting.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_strings.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/test_take.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/api/test_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/api/test_types.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/test_array.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_conversion.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_drop_duplicates.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_factorize.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_fillna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_misc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_transpose.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_unique.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/base/test_value_counts.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/computation/test_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/computation/test_eval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/config/test_config.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/config/test_localization.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_convert_objects.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/dtypes/cast/test_upcast.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_boolean.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_categorical.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_external_block.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_integer.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_interval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_numpy.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_sparse.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/test_string.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/json/test_json.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/extension/list/test_list.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_analytics.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_axis_select_reindex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_combine_concat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_missing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_operators.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_reshape.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_sort_values_level_as_str.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_subclass.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_timeseries.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_timezones.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_to_csv.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/test_validate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/apply/test_apply_relabeling.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/apply/test_frame_apply.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/test_finalize.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/test_frame.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/test_generic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/test_series.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/methods/test_dot.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/methods/test_first_valid_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/methods/test_reorder_levels.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/generic/methods/test_set_axis.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_apply.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_counting.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_filters.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_function.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_nth.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_rank.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_sample.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_size.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_base.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_engines.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_numeric.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_fillna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_insert.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_shift.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_snap.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/datetimes/test_to_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_asfreq.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_factorize.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_fillna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_shift.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_to_timestamp.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_fillna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_insert.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_partial_slicing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_shift.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_callable.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_floats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_indexing_slow.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_loc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_partial.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/test_timedelta.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_insert.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_ix.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/indexing/multiindex/test_xs.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/internals/test_internals.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_clipboard.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_compression.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_date_converters.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_feather.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_fsspec.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_gbq.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_gcs.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_html.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_orc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_parquet.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_pickle.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_s3.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_spss.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_sql.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/test_stata.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_style.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_console.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_css.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_format.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_info.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_style.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_compression.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_header.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_network.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/parser/test_usecols.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_backend.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_common.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_converter.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_frame.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_misc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/plotting/test_series.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_base.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_period_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_concat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_cut.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_melt.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/test_util.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/reshape/merge/test_pivot_old.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/test_nat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_alter_axes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_analytics.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_block_internals.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_combine_concat.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_constructors.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_cumulative.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_datetime_values.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_duplicates.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_internals.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_io.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_missing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_operators.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_reductions.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_repr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_subclass.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_timeseries.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_timezones.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_ufunc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/test_validate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/apply/test_apply_relabeling.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/apply/test_series_apply.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_alter_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_boolean.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_callable.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_iloc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_loc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_multiindex.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_numeric.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_align.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_append.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_at_time.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_between.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_between_time.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_count.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_droplevel.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_first_and_last.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_round.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_period.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_to_timestamp.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_update.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tools/test_to_time.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_deprecate.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_doc.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_hashing.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_numba.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_safe_import.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_show_versions.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_util.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_validate_args.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_api.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_apply.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_dtypes.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_ewm.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_expanding.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_grouper.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_numba.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_pairwise.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_rolling.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py36/lib/python3.6/site-packages/pandas/tests/window/test_window.py -.tox/py36/lib/python3.6/site-packages/pyaml/tests/test_dump.py -.tox/py36/lib/python3.6/site-packages/pyarrow/__init__.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_compute.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_compute.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_csv.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_csv.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_cuda.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_cuda.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_dataset.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_dataset.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_dataset_orc.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_feather.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_flight.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_fs.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_fs.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_hdfs.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_hdfsio.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_json.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_orc.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_orc.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_parquet.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/_parquet.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_plasma.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/_s3fs.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/gandiva.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/lib.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/lib.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/__init__.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/common.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libarrow.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/includes/libplasma.pxd -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_array.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_builder.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_cffi.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_compute.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_csv.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_cuda.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_cython.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_dataset.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_deprecations.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_extension_type.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_feather.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_filesystem.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_flight.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_fs.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_gandiva.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_hdfs.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_io.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_ipc.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_json.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_jvm.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_memory.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_misc.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_orc.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_pandas.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_plasma.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_scalars.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_schema.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_serialization.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_strategies.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_table.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_tensor.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_types.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/test_util.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py36/lib/python3.6/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_api.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_builtin.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_checker.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_code_segment.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_dict.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_doctests.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_imports.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_is_literal.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_match.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_other.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_type_annotations.py -.tox/py36/lib/python3.6/site-packages/pyflakes/test/test_undefined_names.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_app.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_comms.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py36/lib/python3.6/site-packages/qtconsole/tests/test_styles.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_macos_checks.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_main.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qt3drender.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtcharts.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtcore.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qthelp.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtlocation.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtqml.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtquick.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtserialport.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtsql.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtsvg.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qttest.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py36/lib/python3.6/site-packages/qtpy/tests/test_uic.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg.pxd -.tox/py36/lib/python3.6/site-packages/scipy/optimize.pxd -.tox/py36/lib/python3.6/site-packages/scipy/special.pxd -.tox/py36/lib/python3.6/site-packages/scipy/_build_utils/tests/test_circular_imports.py -.tox/py36/lib/python3.6/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test__util.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py36/lib/python3.6/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py36/lib/python3.6/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py36/lib/python3.6/site-packages/scipy/cluster/tests/test_vq.py -.tox/py36/lib/python3.6/site-packages/scipy/constants/tests/test_codata.py -.tox/py36/lib/python3.6/site-packages/scipy/constants/tests/test_constants.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/tests/test_backend.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/tests/test_helper.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/tests/test_numpy.py -.tox/py36/lib/python3.6/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py36/lib/python3.6/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py36/lib/python3.6/site-packages/scipy/fftpack/tests/test_import.py -.tox/py36/lib/python3.6/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py36/lib/python3.6/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py36/lib/python3.6/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py36/lib/python3.6/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py36/lib/python3.6/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py36/lib/python3.6/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py36/lib/python3.6/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py36/lib/python3.6/site-packages/scipy/io/tests/test_fortran.py -.tox/py36/lib/python3.6/site-packages/scipy/io/tests/test_idl.py -.tox/py36/lib/python3.6/site-packages/scipy/io/tests/test_mmio.py -.tox/py36/lib/python3.6/site-packages/scipy/io/tests/test_netcdf.py -.tox/py36/lib/python3.6/site-packages/scipy/io/tests/test_paths.py -.tox/py36/lib/python3.6/site-packages/scipy/io/tests/test_wavfile.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/cython_blas.pxd -.tox/py36/lib/python3.6/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_blas.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_build.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py36/lib/python3.6/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py36/lib/python3.6/site-packages/scipy/misc/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/scipy/misc/tests/test_doccer.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_ndimage.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py36/lib/python3.6/site-packages/scipy/odr/tests/test_odr.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py36/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py36/lib/python3.6/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__root.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py36/lib/python3.6/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_spectral.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py36/lib/python3.6/site-packages/scipy/signal/tests/test_windows.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_construct.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_csc.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_csr.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_extract.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py36/lib/python3.6/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test_distance.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py36/lib/python3.6/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py36/lib/python3.6/site-packages/scipy/special/cython_special.pxd -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_bdtr.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_boxcox.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_cdflib.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_cython_special.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_data.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_digamma.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_erfinv.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_gamma.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_gammainc.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_lambertw.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_loggamma.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_logit.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_mpmath.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_ndtr.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_owens_t.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_pcf.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_pdtr.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_round.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_sf_error.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_sici.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_spence.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_trig.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py36/lib/python3.6/site-packages/scipy/special/tests/test_zeta.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_contingency.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_distributions.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_fit.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_morestats.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_rank.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_stats.py -.tox/py36/lib/python3.6/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_algorithms.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_axisgrid.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_categorical.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_core.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_decorators.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_distributions.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_docstrings.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_matrix.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_miscplot.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_palettes.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_rcmod.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_relational.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_statistics.py -.tox/py36/lib/python3.6/site-packages/seaborn/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py36/lib/python3.6/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py36/lib/python3.6/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py36/lib/python3.6/site-packages/sklearn/compose/tests/test_target.py -.tox/py36/lib/python3.6/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py36/lib/python3.6/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py36/lib/python3.6/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py36/lib/python3.6/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py36/lib/python3.6/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py36/lib/python3.6/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py36/lib/python3.6/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py36/lib/python3.6/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py36/lib/python3.6/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py36/lib/python3.6/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py36/lib/python3.6/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py36/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py36/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py36/lib/python3.6/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py36/lib/python3.6/site-packages/sklearn/impute/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/impute/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/impute/tests/test_impute.py -.tox/py36/lib/python3.6/site-packages/sklearn/impute/tests/test_knn.py -.tox/py36/lib/python3.6/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py36/lib/python3.6/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py36/lib/python3.6/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py36/lib/python3.6/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py36/lib/python3.6/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py36/lib/python3.6/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py36/lib/python3.6/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py36/lib/python3.6/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py36/lib/python3.6/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py36/lib/python3.6/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py36/lib/python3.6/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py36/lib/python3.6/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py36/lib/python3.6/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py36/lib/python3.6/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py36/lib/python3.6/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py36/lib/python3.6/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py36/lib/python3.6/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py36/lib/python3.6/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py36/lib/python3.6/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py36/lib/python3.6/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py36/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py36/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py36/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py36/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py36/lib/python3.6/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py36/lib/python3.6/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py36/lib/python3.6/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py36/lib/python3.6/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py36/lib/python3.6/site-packages/sklearn/svm/tests/test_svm.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_base.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_build.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_calibration.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_check_build.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_common.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_config.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_dummy.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_init.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_isotonic.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_metaestimators.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_multiclass.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_multioutput.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_pipeline.py -.tox/py36/lib/python3.6/site-packages/sklearn/tests/test_random_projection.py -.tox/py36/lib/python3.6/site-packages/sklearn/tree/_criterion.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/tree/_splitter.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/tree/_tree.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/tree/_utils.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/tree/tests/test_export.py -.tox/py36/lib/python3.6/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py36/lib/python3.6/site-packages/sklearn/tree/tests/test_tree.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/utils/_random.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/utils/murmurhash.pxd -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_random.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_testing.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_utils.py -.tox/py36/lib/python3.6/site-packages/sklearn/utils/tests/test_validation.py -.tox/py36/lib/python3.6/site-packages/tests/test_config.py -.tox/py36/lib/python3.6/site-packages/tests/test_core.py -.tox/py36/lib/python3.6/site-packages/tests/test_linters.py -.tox/py36/lib/python3.6/site-packages/traitlets/config/tests/test_application.py -.tox/py36/lib/python3.6/site-packages/traitlets/config/tests/test_configurable.py -.tox/py36/lib/python3.6/site-packages/traitlets/config/tests/test_loader.py -.tox/py36/lib/python3.6/site-packages/traitlets/tests/test_traitlets.py -.tox/py36/lib/python3.6/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py36/lib/python3.6/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py36/lib/python3.6/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py36/lib/python3.6/site-packages/wcwidth/tests/test_core.py -.tox/py36/lib/python3.6/site-packages/zmq/__init__.pxd -.tox/py36/lib/python3.6/site-packages/zmq/backend/cython/__init__.pxd -.tox/py36/lib/python3.6/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py36/lib/python3.6/site-packages/zmq/backend/cython/context.pxd -.tox/py36/lib/python3.6/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py36/lib/python3.6/site-packages/zmq/backend/cython/message.pxd -.tox/py36/lib/python3.6/site-packages/zmq/backend/cython/socket.pxd -.tox/py36/lib/python3.6/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_asyncio.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_auth.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_cffi_backend.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_constants.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_context.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_cython.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_decorators.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_device.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_draft.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_error.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_etc.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_future.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_imports.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_includes.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_ioloop.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_log.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_message.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_monitor.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_monqueue.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_multipart.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_mypy.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_pair.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_poll.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_pubsub.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_reqrep.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_retry_eintr.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_security.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_socket.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_ssh.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_version.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_win32_shim.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_z85.py -.tox/py36/lib/python3.6/site-packages/zmq/tests/test_zmqstream.py -.tox/py36/lib/python3.6/site-packages/zmq/utils/buffers.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Compiler/Code.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Compiler/Parsing.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Compiler/Scanning.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Compiler/Visitor.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/openmp.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/array.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/float.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/function.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/int.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/list.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/long.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/method.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/module.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/number.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/object.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/set.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/string.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/type.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/version.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/errno.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/float.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/limits.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/locale.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/math.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/signal.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/string.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libc/time.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/numpy/math.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/mman.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/resource.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/select.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/signal.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/stat.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/strings.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/time.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/types.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Includes/posix/wait.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Plex/Actions.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Plex/Scanners.pxd -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Runtime/refnanny.pyx -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Utility/CConvert.pyx -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Utility/CppConvert.pyx -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Utility/MemoryView.pyx -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py37-darwin/lib/python3.7/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_alias.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_application.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_autocall.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_compilerop.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_completer.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_completerlib.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_debugger.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_display.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_displayhook.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_events.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_extension.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_formatters.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_handlers.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_history.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_hooks.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_imports.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_iplib.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_logger.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_magic.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_oinspect.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_page.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_prefilter.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_profile.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_prompts.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_run.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_shellapp.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_splitinput.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/core/tests/test_ultratb.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_display.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_imports.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_latextools.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_lexers.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_pretty.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/lib/tests/test_security.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/terminal/tests/test_embed.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/terminal/tests/test_help.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/testing/plugin/test_refs.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/testing/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/testing/tests/test_tools.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_capture.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_dir2.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_imports.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_importstring.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_io.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_openpy.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_path.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_process.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_text.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py37-darwin/lib/python3.7/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_check.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_classdef.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_detect.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_diff.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_extendpickle.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_fglobals.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_file.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_functions.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_functors.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_mixins.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_module.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_moduledict.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_nested.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_objects.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_properties.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_recursive.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_restricted.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_selected.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_source.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_temp.py -.tox/py37-darwin/lib/python3.7/site-packages/dill/tests/test_weakref.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_de.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_kde.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_proposal.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_stretch.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/integration/test_walk.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_backends.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_blobs.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_sampler.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_state.py -.tox/py37-darwin/lib/python3.7/site-packages/emcee/tests/unit/test_stretch.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/binning/binning.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/binning/tests/test_discretizer.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/clipping/clipping.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/clipping/tests/test_clipping.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/encoder.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/imputers/imputer.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/imputers/tests/test_imputers.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/scalers/scaler.pyx -.tox/py37-darwin/lib/python3.7/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/transformers/tests/test_transformer.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/util/tests/test_benchmark.py -.tox/py37-darwin/lib/python3.7/site-packages/gators/util/tests/test_util.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_anneal.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_criteria.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_domains.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_fmin.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_ipy.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_pchoice.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_plotting.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_progress.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_rand.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_randint.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_rdists.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_spark.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_tpe.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_vectorize.py -.tox/py37-darwin/lib/python3.7/site-packages/hyperopt/tests/test_webpage.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_async.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_connect.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_eventloop.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_io.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_kernel.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_message_spec.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py37-darwin/lib/python3.7/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py37-darwin/lib/python3.7/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py37-darwin/lib/python3.7/site-packages/ipython_genutils/tests/test_path.py -.tox/py37-darwin/lib/python3.7/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py37-darwin/lib/python3.7/site-packages/ipython_genutils/tests/test_text.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/tests/test_embed.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py37-darwin/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_backports.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_dask.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_deprecated_objects.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_disk.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_format_stack.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_func_inspect.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_hashing.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_init.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_logger.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_memmapping.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_memory.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_module.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_my_exceptions.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_numpy_pickle.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_parallel.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_store_backends.py -.tox/py37-darwin/lib/python3.7/site-packages/joblib/test/test_testing.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_cli.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_deprecations.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_exceptions.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_format.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_types.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/jsonschema/tests/test_validators.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_adapter.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_client.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_connect.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_manager.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_public_api.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_session.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_ssh.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_client/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_console/tests/test_console.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_core/tests/test_application.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_core/tests/test_command.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_core/tests/test_migrate.py -.tox/py37-darwin/lib/python3.7/site-packages/jupyter_core/tests/test_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_afm.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_agg.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_animation.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_artist.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_axes.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_category.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_cbook.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_collections.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_colorbar.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_colors.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_compare_images.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_container.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_contour.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_cycles.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_dates.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_determinism.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_dviread.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_figure.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_font_manager.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_gridspec.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_image.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_legend.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_lines.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_marker.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_mathtext.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_mlab.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_patches.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_path.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_patheffects.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_pickle.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_png.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_polar.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_pyplot.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_quiver.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_rcparams.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_sankey.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_scale.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_simplification.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_skew.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_spines.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_streamplot.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_style.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_subplots.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_table.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_testing.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_texmanager.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_text.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_ticker.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_transforms.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_triangulation.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_ttconv.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_type1font.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_units.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_usetex.py -.tox/py37-darwin/lib/python3.7/site-packages/matplotlib/tests/test_widgets.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py37-darwin/lib/python3.7/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py37-darwin/lib/python3.7/site-packages/nbclient/tests/test_client.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/utils/tests/test_io.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/utils/tests/test_version.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/writers/tests/test_files.py -.tox/py37-darwin/lib/python3.7/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/corpus/tests/test_words.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/tests/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/tests/test_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/tests/test_nbformat.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/tests/test_reader.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/tests/test_sign.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/tests/test_validator.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v1/tests/test_json.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v2/tests/test_json.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v3/tests/test_json.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v3/tests/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v4/tests/test_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v4/tests/test_json.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py37-darwin/lib/python3.7/site-packages/nbformat/v4/tests/test_validate.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_core.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_digraph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_filters.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_function.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_graph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_ordered.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_special.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/drawing/tests/test_layout.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_atlas.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_classic.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_cographs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_community.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_directed.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_duplication.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_ego.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_expanders.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_geometric.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_intersection.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_lattice.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_line.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_small.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_trees.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/generators/tests/test_triads.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/readwrite/tests/test_text.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/testing/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_all_random_functions.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_convert_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_convert_pandas.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_convert_scipy.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_exceptions.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_import.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/tests/test_relabel.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test__init.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_heaps.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_rcm.py -.tox/py37-darwin/lib/python3.7/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/auth/tests/test_login.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/auth/tests/test_security.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/api/tests/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_config_manager.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_files.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_gateway.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_i18n.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_log.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_nbextensions.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_notebookapp.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_serialize.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_serverextensions.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_traittypes.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_save.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py37-darwin/lib/python3.7/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/__init__.cython-30.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/compat/tests/test_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test__exceptions.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_abc.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_defchararray.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_deprecations.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_dtype.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_einsum.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_errstate.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_extint128.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_function_base.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_getlimits.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_half.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_item_selection.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_longdouble.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_machar.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_memmap.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_multiarray.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_nditer.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_numeric.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_overrides.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_print.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_protocols.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_records.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_shape_base.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_ufunc.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_umath.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/core/tests/test_unicode.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_callback.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_kind.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_size.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/f2py/tests/test_string.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/fft/tests/test_helper.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test__datasource.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test__iotools.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test__version.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_financial.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_format.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_function_base.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_histograms.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_io.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_mixins.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_packbits.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_type_check.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/lib/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/linalg/tests/test_build.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/linalg/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_core.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_extras.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/_bounded_integers.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/_common.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/bit_generator.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/c_distributions.pxd -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_direct.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_extending.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_random.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_randomstate.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/random/tests/test_smoke.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/testing/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/testing/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_ctypeslib.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_matlib.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_numpy_version.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_public_api.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_reloading.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_scripts.py -.tox/py37-darwin/lib/python3.7/site-packages/numpy/tests/test_warnings.py -.tox/py37-darwin/lib/python3.7/site-packages/numpydoc/tests/test_docscrape.py -.tox/py37-darwin/lib/python3.7/site-packages/numpydoc/tests/test_full.py -.tox/py37-darwin/lib/python3.7/site-packages/numpydoc/tests/test_main.py -.tox/py37-darwin/lib/python3.7/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py37-darwin/lib/python3.7/site-packages/numpydoc/tests/test_validate.py -.tox/py37-darwin/lib/python3.7/site-packages/numpydoc/tests/test_xref.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/algos.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/algos.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/arrays.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/arrays.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/groupby.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/hashing.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/hashtable.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/hashtable.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/index.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/indexing.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/internals.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/interval.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/join.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/khash.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/lib.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/lib.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/missing.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/missing.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/ops.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/parsers.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/properties.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/reduction.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/reshape.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/sparse.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/testing.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslib.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/util.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/writers.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/_libs/window/indexers.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/io/sas/sas.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_aggregation.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_algos.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_downstream.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_errors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_expressions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_flags.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_multilevel.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_nanops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_optional_dependency.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_register_accessor.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_sorting.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/test_take.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/api/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/api/test_types.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_array.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_conversion.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_transpose.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_unique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/base/test_value_counts.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/computation/test_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/computation/test_eval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/config/test_config.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/config/test_localization.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_boolean.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_extension.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_external_block.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_floating.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_integer.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_interval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_sparse.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/test_string.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/json/test_json.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/extension/list/test_list.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_iteration.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_subclass.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_unary.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/test_validate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_finalize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_frame.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_generic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_series.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_apply.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_counting.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_filters.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_function.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_missing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_nth.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_rank.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_sample.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_size.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_engines.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_at.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_floats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_iat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_loc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_partial.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/internals/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/internals/test_internals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/internals/test_managers.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_clipboard.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_compression.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_date_converters.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_feather.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_fsspec.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_gbq.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_gcs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_html.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_orc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_parquet.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_pickle.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_s3.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_spss.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_sql.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_stata.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/test_user_agent.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_style.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_console.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_css.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_format.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_info.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_compression.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_header.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_network.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/libs/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/libs/test_lib.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_backend.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_converter.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_series.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/test_style.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_period_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_cut.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_melt.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/test_util.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/test_nat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_constructors.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_cumulative.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_iteration.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_missing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_reductions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_repr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_subclass.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_ufunc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_unary.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/test_validate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_align.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_append.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_between.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_count.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_item.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_round.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_update.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_values.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/series/methods/test_view.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_cat.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_extract.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_string_array.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/strings/test_strings.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tools/test_to_time.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_deprecate.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_doc.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_hashing.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_numba.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_safe_import.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_show_versions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_util.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_validate_args.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_apply.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_dtypes.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_ewm.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_expanding.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_groupby.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_numba.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_online.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_pairwise.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_rolling.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/test_win_type.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py37-darwin/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py37-darwin/lib/python3.7/site-packages/pyaml/tests/test_dump.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_compute.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_compute.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_csv.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_csv.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_cuda.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_cuda.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_dataset.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_dataset.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_dataset_orc.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_feather.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_flight.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_fs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_fs.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_hdfs.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_hdfsio.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_json.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_orc.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_orc.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_parquet.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_parquet.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_plasma.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/_s3fs.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/gandiva.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/lib.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/lib.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/common.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libarrow.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/includes/libplasma.pxd -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_array.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_builder.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_cffi.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_compute.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_csv.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_cuda.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_cython.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_dataset.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_deprecations.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_extension_type.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_feather.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_filesystem.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_flight.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_fs.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_gandiva.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_hdfs.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_io.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_ipc.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_json.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_jvm.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_memory.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_orc.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_pandas.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_plasma.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_scalars.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_schema.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_serialization.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_strategies.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_table.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_tensor.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_types.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/test_util.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py37-darwin/lib/python3.7/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_api.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_builtin.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_checker.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_code_segment.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_dict.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_doctests.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_imports.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_is_literal.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_match.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_other.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_type_annotations.py -.tox/py37-darwin/lib/python3.7/site-packages/pyflakes/test/test_undefined_names.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_app.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_comms.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py37-darwin/lib/python3.7/site-packages/qtconsole/tests/test_styles.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_macos_checks.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_main.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qt3drender.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtcharts.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtcore.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qthelp.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtlocation.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtqml.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtquick.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtserialport.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtsql.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtsvg.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qttest.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py37-darwin/lib/python3.7/site-packages/qtpy/tests/test_uic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test__util.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/cluster/tests/test_vq.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/constants/tests/test_codata.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/constants/tests/test_constants.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_backend.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_helper.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_numpy.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fftpack/tests/test_import.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/tests/test_fortran.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/tests/test_idl.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/tests/test_mmio.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/tests/test_netcdf.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/tests/test_paths.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/io/tests/test_wavfile.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/cython_blas.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_blas.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_build.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_misc.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/misc/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/misc/tests/test_doccer.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/odr/tests/test_odr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__root.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_result_type.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_spectral.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/signal/tests/test_windows.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_construct.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_csc.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_csr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_extract.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test_distance.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/cython_special.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_bdtr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_boxcox.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_cdflib.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_cython_special.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_data.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_digamma.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_erfinv.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_gamma.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_gammainc.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_lambertw.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_loggamma.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_logit.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_mpmath.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_ndtr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_owens_t.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_pcf.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_pdtr.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_round.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_sf_error.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_sici.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_spence.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_trig.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/special/tests/test_zeta.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/biasedurn.pxd -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_contingency.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_distributions.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_entropy.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_fit.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_morestats.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_qmc.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_rank.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_stats.py -.tox/py37-darwin/lib/python3.7/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_algorithms.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_axisgrid.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_categorical.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_core.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_distributions.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_docstrings.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_matrix.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_miscplot.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_palettes.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_rcmod.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_relational.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_statistics.py -.tox/py37-darwin/lib/python3.7/site-packages/seaborn/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/compose/tests/test_target.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/impute/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/impute/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/impute/tests/test_impute.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/impute/tests/test_knn.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/svm/tests/test_svm.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_base.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_build.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_calibration.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_check_build.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_common.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_config.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_dummy.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_init.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_isotonic.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_metaestimators.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_multiclass.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_multioutput.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_pipeline.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tests/test_random_projection.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/_criterion.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/_splitter.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/_tree.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/_utils.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/tests/test_export.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/tree/tests/test_tree.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/_random.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/murmurhash.pxd -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_random.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_testing.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_utils.py -.tox/py37-darwin/lib/python3.7/site-packages/sklearn/utils/tests/test_validation.py -.tox/py37-darwin/lib/python3.7/site-packages/tests/test_config.py -.tox/py37-darwin/lib/python3.7/site-packages/tests/test_core.py -.tox/py37-darwin/lib/python3.7/site-packages/tests/test_linters.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/config/tests/test_application.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/config/tests/test_configurable.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/config/tests/test_loader.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/tests/test_traitlets.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py37-darwin/lib/python3.7/site-packages/wcwidth/tests/test_core.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/backend/cython/__init__.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/backend/cython/context.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/backend/cython/message.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/backend/cython/socket.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_asyncio.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_auth.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_cffi_backend.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_constants.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_context.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_cython.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_decorators.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_device.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_draft.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_error.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_etc.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_future.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_imports.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_includes.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_ioloop.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_log.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_message.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_monitor.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_monqueue.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_multipart.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_mypy.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_pair.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_poll.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_pubsub.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_reqrep.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_retry_eintr.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_security.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_socket.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_ssh.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_version.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_win32_shim.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_z85.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/tests/test_zmqstream.py -.tox/py37-darwin/lib/python3.7/site-packages/zmq/utils/buffers.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Compiler/Code.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Compiler/Parsing.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Compiler/Scanning.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Compiler/Visitor.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py37-linux/lib/python3.7/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/openmp.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/array.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/float.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/function.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/int.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/list.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/long.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/method.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/module.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/number.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/object.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/set.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/string.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/type.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/version.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/errno.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/float.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/limits.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/locale.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/math.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/signal.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/string.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libc/time.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/numpy/math.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/mman.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/resource.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/select.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/signal.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/stat.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/strings.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/time.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/types.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Includes/posix/wait.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Plex/Actions.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Plex/Scanners.pxd -.tox/py37-linux/lib/python3.7/site-packages/Cython/Runtime/refnanny.pyx -.tox/py37-linux/lib/python3.7/site-packages/Cython/Utility/CConvert.pyx -.tox/py37-linux/lib/python3.7/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py37-linux/lib/python3.7/site-packages/Cython/Utility/CppConvert.pyx -.tox/py37-linux/lib/python3.7/site-packages/Cython/Utility/MemoryView.pyx -.tox/py37-linux/lib/python3.7/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py37-linux/lib/python3.7/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_alias.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_application.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_autocall.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_compilerop.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_completer.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_completerlib.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_debugger.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_display.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_displayhook.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_events.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_extension.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_formatters.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_handlers.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_history.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_hooks.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_imports.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_iplib.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_logger.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_magic.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_oinspect.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_page.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_paths.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_prefilter.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_profile.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_prompts.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_run.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_shellapp.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_splitinput.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/core/tests/test_ultratb.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_display.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_imports.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_latextools.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_lexers.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_pretty.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/lib/tests/test_security.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/terminal/tests/test_embed.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/terminal/tests/test_help.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/testing/plugin/test_refs.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/testing/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/testing/tests/test_tools.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_capture.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_dir2.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_imports.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_importstring.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_io.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_openpy.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_path.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_process.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_text.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py37-linux/lib/python3.7/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_check.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_classdef.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_detect.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_diff.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_extendpickle.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_fglobals.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_file.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_functions.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_functors.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_mixins.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_module.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_moduledict.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_nested.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_objects.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_properties.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_recursive.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_restricted.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_selected.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_source.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_temp.py -.tox/py37-linux/lib/python3.7/site-packages/dill/tests/test_weakref.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_de.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_kde.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_proposal.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_stretch.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/integration/test_walk.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_backends.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_blobs.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_sampler.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_state.py -.tox/py37-linux/lib/python3.7/site-packages/emcee/tests/unit/test_stretch.py -.tox/py37-linux/lib/python3.7/site-packages/gators/binning/binning.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py37-linux/lib/python3.7/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py37-linux/lib/python3.7/site-packages/gators/binning/tests/test_discretizer.py -.tox/py37-linux/lib/python3.7/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py37-linux/lib/python3.7/site-packages/gators/clipping/clipping.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/clipping/tests/test_clipping.py -.tox/py37-linux/lib/python3.7/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py37-linux/lib/python3.7/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py37-linux/lib/python3.7/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py37-linux/lib/python3.7/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/encoder.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py37-linux/lib/python3.7/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py37-linux/lib/python3.7/site-packages/gators/imputers/imputer.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/imputers/tests/test_imputers.py -.tox/py37-linux/lib/python3.7/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py37-linux/lib/python3.7/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py37-linux/lib/python3.7/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py37-linux/lib/python3.7/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py37-linux/lib/python3.7/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py37-linux/lib/python3.7/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py37-linux/lib/python3.7/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py37-linux/lib/python3.7/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py37-linux/lib/python3.7/site-packages/gators/scalers/scaler.pyx -.tox/py37-linux/lib/python3.7/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py37-linux/lib/python3.7/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py37-linux/lib/python3.7/site-packages/gators/transformers/tests/test_transformer.py -.tox/py37-linux/lib/python3.7/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py37-linux/lib/python3.7/site-packages/gators/util/tests/test_benchmark.py -.tox/py37-linux/lib/python3.7/site-packages/gators/util/tests/test_util.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_anneal.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_criteria.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_domains.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_fmin.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_ipy.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_pchoice.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_plotting.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_progress.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_rand.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_randint.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_rdists.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_spark.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_tpe.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_vectorize.py -.tox/py37-linux/lib/python3.7/site-packages/hyperopt/tests/test_webpage.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_async.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_connect.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_eventloop.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_io.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_kernel.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_message_spec.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py37-linux/lib/python3.7/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py37-linux/lib/python3.7/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py37-linux/lib/python3.7/site-packages/ipython_genutils/tests/test_path.py -.tox/py37-linux/lib/python3.7/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py37-linux/lib/python3.7/site-packages/ipython_genutils/tests/test_text.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/tests/test_embed.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py37-linux/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_backports.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_dask.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_deprecated_objects.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_disk.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_format_stack.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_func_inspect.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_hashing.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_init.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_logger.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_memmapping.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_memory.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_module.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_my_exceptions.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_numpy_pickle.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_parallel.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_store_backends.py -.tox/py37-linux/lib/python3.7/site-packages/joblib/test/test_testing.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_cli.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_deprecations.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_exceptions.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_format.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_types.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/jsonschema/tests/test_validators.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_adapter.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_client.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_connect.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_manager.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_public_api.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_session.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_ssh.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_client/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_console/tests/test_console.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_core/tests/test_application.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_core/tests/test_command.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_core/tests/test_migrate.py -.tox/py37-linux/lib/python3.7/site-packages/jupyter_core/tests/test_paths.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_afm.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_agg.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_animation.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_artist.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_axes.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_category.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_cbook.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_collections.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_colorbar.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_colors.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_compare_images.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_container.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_contour.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_cycles.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_dates.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_determinism.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_dviread.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_figure.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_font_manager.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_gridspec.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_image.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_legend.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_lines.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_marker.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_mathtext.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_mlab.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_patches.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_path.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_patheffects.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_pickle.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_png.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_polar.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_pyplot.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_quiver.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_rcparams.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_sankey.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_scale.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_simplification.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_skew.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_spines.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_streamplot.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_style.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_subplots.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_table.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_testing.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_texmanager.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_text.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_ticker.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_transforms.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_triangulation.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_ttconv.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_type1font.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_units.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_usetex.py -.tox/py37-linux/lib/python3.7/site-packages/matplotlib/tests/test_widgets.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py37-linux/lib/python3.7/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py37-linux/lib/python3.7/site-packages/nbclient/tests/test_client.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/utils/tests/test_io.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/utils/tests/test_version.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/writers/tests/test_files.py -.tox/py37-linux/lib/python3.7/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/corpus/tests/test_words.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/tests/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/tests/test_convert.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/tests/test_nbformat.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/tests/test_reader.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/tests/test_sign.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/tests/test_validator.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v1/tests/test_json.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v2/tests/test_json.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v3/tests/test_json.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v3/tests/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v4/tests/test_convert.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v4/tests/test_json.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py37-linux/lib/python3.7/site-packages/nbformat/v4/tests/test_validate.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_core.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_digraph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_filters.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_function.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_graph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_ordered.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_special.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/drawing/tests/test_layout.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_atlas.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_classic.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_cographs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_community.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_directed.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_duplication.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_ego.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_expanders.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_geometric.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_intersection.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_lattice.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_line.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_small.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_trees.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/generators/tests/test_triads.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/readwrite/tests/test_text.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/testing/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_all_random_functions.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_convert.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_convert_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_convert_pandas.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_convert_scipy.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_exceptions.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_import.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/tests/test_relabel.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test__init.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_heaps.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_rcm.py -.tox/py37-linux/lib/python3.7/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/auth/tests/test_login.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/auth/tests/test_security.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/api/tests/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_config_manager.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_files.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_gateway.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_i18n.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_log.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_nbextensions.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_notebookapp.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_paths.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_serialize.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_serverextensions.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_traittypes.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_save.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py37-linux/lib/python3.7/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/__init__.cython-30.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/compat/tests/test_compat.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test__exceptions.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_abc.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_defchararray.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_deprecations.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_dtype.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_einsum.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_errstate.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_extint128.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_function_base.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_getlimits.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_half.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_item_selection.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_longdouble.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_machar.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_memmap.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_multiarray.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_nditer.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_numeric.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_overrides.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_print.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_protocols.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_records.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_shape_base.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_ufunc.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_umath.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/core/tests/test_unicode.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_callback.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_kind.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_size.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/f2py/tests/test_string.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/fft/tests/test_helper.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test__datasource.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test__iotools.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test__version.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_financial.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_format.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_function_base.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_histograms.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_io.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_mixins.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_packbits.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_type_check.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/lib/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/linalg/tests/test_build.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/linalg/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_core.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_extras.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/_bounded_integers.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/_common.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/bit_generator.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/c_distributions.pxd -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_direct.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_extending.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_random.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_randomstate.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/random/tests/test_smoke.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/testing/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/testing/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_ctypeslib.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_matlib.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_numpy_version.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_public_api.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_reloading.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_scripts.py -.tox/py37-linux/lib/python3.7/site-packages/numpy/tests/test_warnings.py -.tox/py37-linux/lib/python3.7/site-packages/numpydoc/tests/test_docscrape.py -.tox/py37-linux/lib/python3.7/site-packages/numpydoc/tests/test_full.py -.tox/py37-linux/lib/python3.7/site-packages/numpydoc/tests/test_main.py -.tox/py37-linux/lib/python3.7/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py37-linux/lib/python3.7/site-packages/numpydoc/tests/test_validate.py -.tox/py37-linux/lib/python3.7/site-packages/numpydoc/tests/test_xref.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/algos.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/algos.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/arrays.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/arrays.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/groupby.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/hashing.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/hashtable.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/hashtable.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/index.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/indexing.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/internals.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/interval.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/join.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/khash.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/lib.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/lib.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/missing.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/missing.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/ops.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/parsers.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/properties.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/reduction.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/reshape.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/sparse.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/testing.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslib.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/util.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/writers.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/_libs/window/indexers.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/io/sas/sas.pyx -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_aggregation.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_algos.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_downstream.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_errors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_expressions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_flags.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_multilevel.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_nanops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_optional_dependency.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_register_accessor.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_sorting.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/test_take.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/api/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/api/test_types.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_array.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_conversion.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_transpose.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_unique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/base/test_value_counts.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/computation/test_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/computation/test_eval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/config/test_config.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/config/test_localization.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_boolean.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_extension.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_external_block.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_floating.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_integer.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_interval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_sparse.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/test_string.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/json/test_json.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/extension/list/test_list.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_iteration.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_subclass.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_unary.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/test_validate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_finalize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_frame.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_generic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_series.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_apply.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_counting.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_filters.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_function.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_missing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_nth.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_rank.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_sample.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_size.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_engines.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_at.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_floats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_iat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_loc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_partial.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/internals/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/internals/test_internals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/internals/test_managers.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_clipboard.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_compression.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_date_converters.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_feather.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_fsspec.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_gbq.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_gcs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_html.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_orc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_parquet.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_pickle.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_s3.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_spss.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_sql.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_stata.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/test_user_agent.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_style.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_console.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_css.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_format.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_info.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_compression.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_header.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_network.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/libs/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/libs/test_lib.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_backend.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_converter.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_series.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/test_style.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_period_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_cut.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_melt.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/test_util.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/test_nat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_constructors.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_cumulative.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_iteration.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_missing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_reductions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_repr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_subclass.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_ufunc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_unary.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/test_validate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_align.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_append.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_between.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_count.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_item.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_round.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_update.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_values.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/series/methods/test_view.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_cat.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_extract.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_string_array.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/strings/test_strings.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tools/test_to_time.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_deprecate.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_doc.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_hashing.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_numba.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_safe_import.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_show_versions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_util.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_validate_args.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_apply.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_dtypes.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_ewm.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_expanding.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_groupby.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_numba.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_online.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_pairwise.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_rolling.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/test_win_type.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py37-linux/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py37-linux/lib/python3.7/site-packages/pyaml/tests/test_dump.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_compute.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_compute.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_csv.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_csv.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_cuda.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_cuda.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_dataset.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_dataset.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_dataset_orc.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_feather.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_flight.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_fs.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_fs.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_hdfs.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_hdfsio.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_json.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_orc.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_orc.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_parquet.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_parquet.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_plasma.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/_s3fs.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/gandiva.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/lib.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/lib.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/common.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libarrow.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/includes/libplasma.pxd -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_array.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_builder.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_cffi.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_compute.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_csv.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_cuda.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_cython.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_dataset.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_deprecations.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_extension_type.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_feather.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_filesystem.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_flight.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_fs.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_gandiva.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_hdfs.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_io.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_ipc.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_json.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_jvm.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_memory.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_orc.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_pandas.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_plasma.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_scalars.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_schema.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_serialization.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_strategies.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_table.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_tensor.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_types.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/test_util.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py37-linux/lib/python3.7/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_api.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_builtin.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_checker.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_code_segment.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_dict.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_doctests.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_imports.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_is_literal.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_match.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_other.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_type_annotations.py -.tox/py37-linux/lib/python3.7/site-packages/pyflakes/test/test_undefined_names.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_app.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_comms.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py37-linux/lib/python3.7/site-packages/qtconsole/tests/test_styles.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_macos_checks.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_main.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qt3drender.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtcharts.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtcore.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qthelp.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtlocation.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtqml.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtquick.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtserialport.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtsql.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtsvg.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qttest.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py37-linux/lib/python3.7/site-packages/qtpy/tests/test_uic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/special.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test__util.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/cluster/tests/test_vq.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/constants/tests/test_codata.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/constants/tests/test_constants.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_backend.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_helper.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_numpy.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fftpack/tests/test_import.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/tests/test_fortran.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/tests/test_idl.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/tests/test_mmio.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/tests/test_netcdf.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/tests/test_paths.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/io/tests/test_wavfile.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/cython_blas.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_blas.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_build.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_misc.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/misc/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/misc/tests/test_doccer.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/odr/tests/test_odr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__root.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_result_type.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_spectral.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/signal/tests/test_windows.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_construct.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_csc.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_csr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_extract.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test_distance.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/cython_special.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_bdtr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_boxcox.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_cdflib.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_cython_special.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_data.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_digamma.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_erfinv.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_gamma.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_gammainc.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_lambertw.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_loggamma.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_logit.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_mpmath.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_ndtr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_owens_t.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_pcf.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_pdtr.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_round.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_sf_error.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_sici.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_spence.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_trig.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/special/tests/test_zeta.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/biasedurn.pxd -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_contingency.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_distributions.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_entropy.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_fit.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_morestats.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_qmc.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_rank.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_stats.py -.tox/py37-linux/lib/python3.7/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_algorithms.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_axisgrid.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_categorical.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_core.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_distributions.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_docstrings.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_matrix.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_miscplot.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_palettes.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_rcmod.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_relational.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_statistics.py -.tox/py37-linux/lib/python3.7/site-packages/seaborn/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/compose/tests/test_target.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/impute/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/impute/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/impute/tests/test_impute.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/impute/tests/test_knn.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/svm/tests/test_svm.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_base.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_build.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_calibration.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_check_build.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_common.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_config.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_dummy.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_init.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_isotonic.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_metaestimators.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_multiclass.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_multioutput.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_pipeline.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tests/test_random_projection.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/_criterion.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/_splitter.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/_tree.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/_utils.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/tests/test_export.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/tree/tests/test_tree.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/_random.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/murmurhash.pxd -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_random.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_testing.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_utils.py -.tox/py37-linux/lib/python3.7/site-packages/sklearn/utils/tests/test_validation.py -.tox/py37-linux/lib/python3.7/site-packages/tests/test_config.py -.tox/py37-linux/lib/python3.7/site-packages/tests/test_core.py -.tox/py37-linux/lib/python3.7/site-packages/tests/test_linters.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/config/tests/test_application.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/config/tests/test_configurable.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/config/tests/test_loader.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/tests/test_traitlets.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py37-linux/lib/python3.7/site-packages/wcwidth/tests/test_core.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/backend/cython/__init__.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/backend/cython/context.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/backend/cython/message.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/backend/cython/socket.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_asyncio.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_auth.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_cffi_backend.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_constants.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_context.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_cython.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_decorators.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_device.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_draft.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_error.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_etc.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_future.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_imports.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_includes.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_ioloop.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_log.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_message.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_monitor.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_monqueue.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_multipart.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_mypy.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_pair.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_poll.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_pubsub.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_reqrep.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_retry_eintr.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_security.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_socket.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_ssh.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_version.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_win32_shim.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_z85.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/tests/test_zmqstream.py -.tox/py37-linux/lib/python3.7/site-packages/zmq/utils/buffers.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Compiler/Code.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Compiler/Parsing.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Compiler/Scanning.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Compiler/Visitor.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py37/lib/python3.7/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py37/lib/python3.7/site-packages/Cython/Includes/openmp.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/array.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/float.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/function.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/int.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/list.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/long.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/method.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/module.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/number.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/object.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/set.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/string.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/type.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/version.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/errno.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/float.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/limits.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/locale.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/math.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/signal.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/string.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libc/time.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/numpy/math.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/mman.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/resource.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/select.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/signal.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/stat.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/strings.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/time.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/types.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Includes/posix/wait.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Plex/Actions.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Plex/Scanners.pxd -.tox/py37/lib/python3.7/site-packages/Cython/Runtime/refnanny.pyx -.tox/py37/lib/python3.7/site-packages/Cython/Utility/CConvert.pyx -.tox/py37/lib/python3.7/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py37/lib/python3.7/site-packages/Cython/Utility/CppConvert.pyx -.tox/py37/lib/python3.7/site-packages/Cython/Utility/MemoryView.pyx -.tox/py37/lib/python3.7/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py37/lib/python3.7/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_alias.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_application.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_autocall.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_compilerop.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_completer.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_completerlib.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_debugger.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_display.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_displayhook.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_events.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_extension.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_formatters.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_handlers.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_history.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_hooks.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_imports.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_iplib.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_logger.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_magic.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_oinspect.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_page.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_paths.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_prefilter.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_profile.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_prompts.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_run.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_shellapp.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_splitinput.py -.tox/py37/lib/python3.7/site-packages/IPython/core/tests/test_ultratb.py -.tox/py37/lib/python3.7/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py37/lib/python3.7/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_display.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_imports.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_latextools.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_lexers.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_pretty.py -.tox/py37/lib/python3.7/site-packages/IPython/lib/tests/test_security.py -.tox/py37/lib/python3.7/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py37/lib/python3.7/site-packages/IPython/terminal/tests/test_embed.py -.tox/py37/lib/python3.7/site-packages/IPython/terminal/tests/test_help.py -.tox/py37/lib/python3.7/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py37/lib/python3.7/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py37/lib/python3.7/site-packages/IPython/testing/plugin/test_refs.py -.tox/py37/lib/python3.7/site-packages/IPython/testing/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py37/lib/python3.7/site-packages/IPython/testing/tests/test_tools.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_capture.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_dir2.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_imports.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_importstring.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_io.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_openpy.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_path.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_process.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_text.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py37/lib/python3.7/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py37/lib/python3.7/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_check.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_classdef.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_detect.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_diff.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_extendpickle.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_fglobals.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_file.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_functions.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_functors.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_mixins.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_module.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_moduledict.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_nested.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_objects.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_properties.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_recursive.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_restricted.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_selected.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_source.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_temp.py -.tox/py37/lib/python3.7/site-packages/dill/tests/test_weakref.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_de.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_kde.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_proposal.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_stretch.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/integration/test_walk.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_backends.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_blobs.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_sampler.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_state.py -.tox/py37/lib/python3.7/site-packages/emcee/tests/unit/test_stretch.py -.tox/py37/lib/python3.7/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_anneal.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_criteria.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_domains.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_fmin.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_ipy.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_pchoice.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_plotting.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_progress.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_rand.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_randint.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_rdists.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_spark.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_tpe.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_vectorize.py -.tox/py37/lib/python3.7/site-packages/hyperopt/tests/test_webpage.py -.tox/py37/lib/python3.7/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py37/lib/python3.7/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_async.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_connect.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_eventloop.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_io.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_kernel.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_message_spec.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py37/lib/python3.7/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py37/lib/python3.7/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py37/lib/python3.7/site-packages/ipython_genutils/tests/test_path.py -.tox/py37/lib/python3.7/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py37/lib/python3.7/site-packages/ipython_genutils/tests/test_text.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/tests/test_embed.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py37/lib/python3.7/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_backports.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_dask.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_deprecated_objects.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_disk.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_format_stack.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_func_inspect.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_hashing.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_init.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_logger.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_memmapping.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_memory.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_module.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_my_exceptions.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_numpy_pickle.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_parallel.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_store_backends.py -.tox/py37/lib/python3.7/site-packages/joblib/test/test_testing.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_cli.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_deprecations.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_exceptions.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_format.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_types.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/jsonschema/tests/test_validators.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_adapter.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_client.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_connect.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_manager.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_public_api.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_session.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_ssh.py -.tox/py37/lib/python3.7/site-packages/jupyter_client/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/jupyter_console/tests/test_console.py -.tox/py37/lib/python3.7/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py37/lib/python3.7/site-packages/jupyter_core/tests/test_application.py -.tox/py37/lib/python3.7/site-packages/jupyter_core/tests/test_command.py -.tox/py37/lib/python3.7/site-packages/jupyter_core/tests/test_migrate.py -.tox/py37/lib/python3.7/site-packages/jupyter_core/tests/test_paths.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_afm.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_agg.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_animation.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_api.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_artist.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_axes.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_basic.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_category.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_cbook.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_collections.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_colorbar.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_colors.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_compare_images.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_container.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_contour.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_cycles.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_dates.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_determinism.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_dviread.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_figure.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_font_manager.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_gridspec.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_image.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_legend.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_lines.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_marker.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_mathtext.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_mlab.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_patches.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_path.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_patheffects.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_pickle.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_png.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_polar.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_pyplot.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_quiver.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_rcparams.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_sankey.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_scale.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_simplification.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_skew.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_spines.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_streamplot.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_style.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_subplots.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_table.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_testing.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_texmanager.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_text.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_ticker.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_transforms.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_triangulation.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_ttconv.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_type1font.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_units.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_usetex.py -.tox/py37/lib/python3.7/site-packages/matplotlib/tests/test_widgets.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py37/lib/python3.7/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py37/lib/python3.7/site-packages/nbclient/tests/test_client.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py37/lib/python3.7/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py37/lib/python3.7/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py37/lib/python3.7/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py37/lib/python3.7/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py37/lib/python3.7/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py37/lib/python3.7/site-packages/nbconvert/utils/tests/test_io.py -.tox/py37/lib/python3.7/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py37/lib/python3.7/site-packages/nbconvert/utils/tests/test_version.py -.tox/py37/lib/python3.7/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py37/lib/python3.7/site-packages/nbconvert/writers/tests/test_files.py -.tox/py37/lib/python3.7/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py37/lib/python3.7/site-packages/nbformat/corpus/tests/test_words.py -.tox/py37/lib/python3.7/site-packages/nbformat/tests/test_api.py -.tox/py37/lib/python3.7/site-packages/nbformat/tests/test_convert.py -.tox/py37/lib/python3.7/site-packages/nbformat/tests/test_nbformat.py -.tox/py37/lib/python3.7/site-packages/nbformat/tests/test_reader.py -.tox/py37/lib/python3.7/site-packages/nbformat/tests/test_sign.py -.tox/py37/lib/python3.7/site-packages/nbformat/tests/test_validator.py -.tox/py37/lib/python3.7/site-packages/nbformat/v1/tests/test_json.py -.tox/py37/lib/python3.7/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py37/lib/python3.7/site-packages/nbformat/v2/tests/test_json.py -.tox/py37/lib/python3.7/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py37/lib/python3.7/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py37/lib/python3.7/site-packages/nbformat/v3/tests/test_json.py -.tox/py37/lib/python3.7/site-packages/nbformat/v3/tests/test_misc.py -.tox/py37/lib/python3.7/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py37/lib/python3.7/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py37/lib/python3.7/site-packages/nbformat/v4/tests/test_convert.py -.tox/py37/lib/python3.7/site-packages/nbformat/v4/tests/test_json.py -.tox/py37/lib/python3.7/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py37/lib/python3.7/site-packages/nbformat/v4/tests/test_validate.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_core.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py37/lib/python3.7/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_digraph.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_filters.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_function.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_graph.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_ordered.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_special.py -.tox/py37/lib/python3.7/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py37/lib/python3.7/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py37/lib/python3.7/site-packages/networkx/drawing/tests/test_layout.py -.tox/py37/lib/python3.7/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py37/lib/python3.7/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_atlas.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_classic.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_cographs.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_community.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_directed.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_duplication.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_ego.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_expanders.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_geometric.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_intersection.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_lattice.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_line.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_small.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_trees.py -.tox/py37/lib/python3.7/site-packages/networkx/generators/tests/test_triads.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py37/lib/python3.7/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py37/lib/python3.7/site-packages/networkx/readwrite/tests/test_text.py -.tox/py37/lib/python3.7/site-packages/networkx/testing/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_all_random_functions.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_convert.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_convert_numpy.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_convert_pandas.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_convert_scipy.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_exceptions.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_import.py -.tox/py37/lib/python3.7/site-packages/networkx/tests/test_relabel.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test__init.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_heaps.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_misc.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_rcm.py -.tox/py37/lib/python3.7/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py37/lib/python3.7/site-packages/notebook/auth/tests/test_login.py -.tox/py37/lib/python3.7/site-packages/notebook/auth/tests/test_security.py -.tox/py37/lib/python3.7/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py37/lib/python3.7/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py37/lib/python3.7/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py37/lib/python3.7/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py37/lib/python3.7/site-packages/notebook/services/api/tests/test_api.py -.tox/py37/lib/python3.7/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py37/lib/python3.7/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py37/lib/python3.7/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py37/lib/python3.7/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py37/lib/python3.7/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py37/lib/python3.7/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py37/lib/python3.7/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py37/lib/python3.7/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py37/lib/python3.7/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py37/lib/python3.7/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py37/lib/python3.7/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_config_manager.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_files.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_gateway.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_i18n.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_log.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_nbextensions.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_notebookapp.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_paths.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_serialize.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_serverextensions.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_traittypes.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_save.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py37/lib/python3.7/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py37/lib/python3.7/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py37/lib/python3.7/site-packages/numpy/__init__.cython-30.pxd -.tox/py37/lib/python3.7/site-packages/numpy/__init__.pxd -.tox/py37/lib/python3.7/site-packages/numpy/compat/tests/test_compat.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test__exceptions.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_abc.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_api.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_datetime.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_defchararray.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_deprecations.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_dtype.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_einsum.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_errstate.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_extint128.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_function_base.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_getlimits.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_half.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_indexing.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_item_selection.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_longdouble.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_machar.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_memmap.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_multiarray.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_nditer.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_numeric.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_overrides.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_print.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_protocols.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_records.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_shape_base.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_ufunc.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_umath.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py37/lib/python3.7/site-packages/numpy/core/tests/test_unicode.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py37/lib/python3.7/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_callback.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_kind.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_size.py -.tox/py37/lib/python3.7/site-packages/numpy/f2py/tests/test_string.py -.tox/py37/lib/python3.7/site-packages/numpy/fft/tests/test_helper.py -.tox/py37/lib/python3.7/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test__datasource.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test__iotools.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test__version.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_financial.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_format.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_function_base.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_histograms.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_io.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_mixins.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_packbits.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_type_check.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py37/lib/python3.7/site-packages/numpy/lib/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/numpy/linalg/tests/test_build.py -.tox/py37/lib/python3.7/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py37/lib/python3.7/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py37/lib/python3.7/site-packages/numpy/linalg/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_core.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_extras.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py37/lib/python3.7/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py37/lib/python3.7/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py37/lib/python3.7/site-packages/numpy/random/__init__.pxd -.tox/py37/lib/python3.7/site-packages/numpy/random/_bounded_integers.pxd -.tox/py37/lib/python3.7/site-packages/numpy/random/_common.pxd -.tox/py37/lib/python3.7/site-packages/numpy/random/bit_generator.pxd -.tox/py37/lib/python3.7/site-packages/numpy/random/c_distributions.pxd -.tox/py37/lib/python3.7/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py37/lib/python3.7/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_direct.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_extending.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_random.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_randomstate.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py37/lib/python3.7/site-packages/numpy/random/tests/test_smoke.py -.tox/py37/lib/python3.7/site-packages/numpy/testing/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py37/lib/python3.7/site-packages/numpy/testing/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_ctypeslib.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_matlib.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_numpy_version.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_public_api.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_reloading.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_scripts.py -.tox/py37/lib/python3.7/site-packages/numpy/tests/test_warnings.py -.tox/py37/lib/python3.7/site-packages/numpydoc/tests/test_docscrape.py -.tox/py37/lib/python3.7/site-packages/numpydoc/tests/test_full.py -.tox/py37/lib/python3.7/site-packages/numpydoc/tests/test_main.py -.tox/py37/lib/python3.7/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py37/lib/python3.7/site-packages/numpydoc/tests/test_validate.py -.tox/py37/lib/python3.7/site-packages/numpydoc/tests/test_xref.py -.tox/py37/lib/python3.7/site-packages/pandas/_libs/algos.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/algos.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/arrays.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/arrays.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/groupby.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/hashing.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/hashtable.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/hashtable.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/index.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/indexing.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/internals.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/interval.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/join.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/khash.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/lib.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/lib.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/missing.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/missing.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/ops.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/parsers.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/properties.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/reduction.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/reshape.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/sparse.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/testing.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslib.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/util.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/writers.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py37/lib/python3.7/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py37/lib/python3.7/site-packages/pandas/_libs/window/indexers.pyx -.tox/py37/lib/python3.7/site-packages/pandas/io/sas/sas.pyx -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_aggregation.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_algos.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_downstream.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_errors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_expressions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_flags.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_multilevel.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_nanops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_optional_dependency.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_register_accessor.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_sorting.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/test_take.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/api/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/api/test_types.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_array.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_conversion.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_misc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_transpose.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_unique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/base/test_value_counts.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/computation/test_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/computation/test_eval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/config/test_config.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/config/test_localization.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/test_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_boolean.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_extension.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_external_block.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_floating.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_integer.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_interval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_numpy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_sparse.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/test_string.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/json/test_json.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/extension/list/test_list.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_iteration.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_subclass.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_unary.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/test_validate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_finalize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_frame.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_generic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_series.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_apply.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_counting.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_filters.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_function.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_missing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_nth.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_rank.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_sample.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_size.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_base.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_engines.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_at.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_floats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_iat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_loc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_partial.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/internals/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/internals/test_internals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/internals/test_managers.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_clipboard.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_compression.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_date_converters.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_feather.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_fsspec.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_gbq.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_gcs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_html.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_orc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_parquet.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_pickle.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_s3.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_spss.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_sql.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_stata.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/test_user_agent.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_style.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_console.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_css.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_format.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_info.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_compression.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_header.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_network.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/libs/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/libs/test_lib.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_backend.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_converter.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_misc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_series.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/test_style.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_base.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_period_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_cut.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_melt.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/test_util.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/test_nat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_constructors.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_cumulative.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_iteration.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_missing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_reductions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_repr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_subclass.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_ufunc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_unary.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/test_validate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_align.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_append.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_between.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_count.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_item.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_round.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_update.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_values.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/series/methods/test_view.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_cat.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_extract.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_string_array.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/strings/test_strings.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tools/test_to_time.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_deprecate.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_doc.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_hashing.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_numba.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_safe_import.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_show_versions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_util.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_validate_args.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_api.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_apply.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_dtypes.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_ewm.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_expanding.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_groupby.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_numba.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_online.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_pairwise.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_rolling.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/test_win_type.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py37/lib/python3.7/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py37/lib/python3.7/site-packages/pyaml/tests/test_dump.py -.tox/py37/lib/python3.7/site-packages/pyarrow/__init__.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_compute.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_compute.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_csv.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_csv.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_cuda.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_cuda.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_dataset.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_dataset.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_dataset_orc.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_feather.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_flight.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_fs.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_fs.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_hdfs.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_hdfsio.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_json.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_orc.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_orc.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_parquet.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/_parquet.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_plasma.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/_s3fs.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/gandiva.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/lib.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/lib.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/__init__.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/common.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libarrow.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/includes/libplasma.pxd -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_array.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_builder.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_cffi.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_compute.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_csv.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_cuda.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_cython.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_dataset.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_deprecations.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_extension_type.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_feather.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_filesystem.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_flight.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_fs.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_gandiva.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_hdfs.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_io.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_ipc.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_json.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_jvm.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_memory.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_misc.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_orc.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_pandas.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_plasma.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_scalars.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_schema.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_serialization.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_strategies.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_table.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_tensor.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_types.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/test_util.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py37/lib/python3.7/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_api.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_builtin.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_checker.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_code_segment.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_dict.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_doctests.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_imports.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_is_literal.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_match.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_other.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_type_annotations.py -.tox/py37/lib/python3.7/site-packages/pyflakes/test/test_undefined_names.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_app.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_comms.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py37/lib/python3.7/site-packages/qtconsole/tests/test_styles.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_macos_checks.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_main.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qt3drender.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtcharts.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtcore.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qthelp.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtlocation.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtqml.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtquick.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtserialport.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtsql.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtsvg.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qttest.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py37/lib/python3.7/site-packages/qtpy/tests/test_uic.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize.pxd -.tox/py37/lib/python3.7/site-packages/scipy/special.pxd -.tox/py37/lib/python3.7/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test__util.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py37/lib/python3.7/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py37/lib/python3.7/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py37/lib/python3.7/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py37/lib/python3.7/site-packages/scipy/cluster/tests/test_vq.py -.tox/py37/lib/python3.7/site-packages/scipy/constants/tests/test_codata.py -.tox/py37/lib/python3.7/site-packages/scipy/constants/tests/test_constants.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_backend.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_helper.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_numpy.py -.tox/py37/lib/python3.7/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py37/lib/python3.7/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py37/lib/python3.7/site-packages/scipy/fftpack/tests/test_import.py -.tox/py37/lib/python3.7/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py37/lib/python3.7/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py37/lib/python3.7/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py37/lib/python3.7/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py37/lib/python3.7/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py37/lib/python3.7/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py37/lib/python3.7/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py37/lib/python3.7/site-packages/scipy/io/tests/test_fortran.py -.tox/py37/lib/python3.7/site-packages/scipy/io/tests/test_idl.py -.tox/py37/lib/python3.7/site-packages/scipy/io/tests/test_mmio.py -.tox/py37/lib/python3.7/site-packages/scipy/io/tests/test_netcdf.py -.tox/py37/lib/python3.7/site-packages/scipy/io/tests/test_paths.py -.tox/py37/lib/python3.7/site-packages/scipy/io/tests/test_wavfile.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/cython_blas.pxd -.tox/py37/lib/python3.7/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_blas.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_build.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_misc.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py37/lib/python3.7/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py37/lib/python3.7/site-packages/scipy/misc/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/scipy/misc/tests/test_doccer.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py37/lib/python3.7/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py37/lib/python3.7/site-packages/scipy/odr/tests/test_odr.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__root.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py37/lib/python3.7/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_result_type.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_spectral.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py37/lib/python3.7/site-packages/scipy/signal/tests/test_windows.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_construct.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_csc.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_csr.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_extract.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py37/lib/python3.7/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test_distance.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py37/lib/python3.7/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py37/lib/python3.7/site-packages/scipy/special/cython_special.pxd -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_bdtr.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_boxcox.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_cdflib.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_cython_special.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_data.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_digamma.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_erfinv.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_gamma.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_gammainc.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_lambertw.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_loggamma.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_logit.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_mpmath.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_ndtr.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_owens_t.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_pcf.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_pdtr.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_round.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_sf_error.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_sici.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_spence.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_trig.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py37/lib/python3.7/site-packages/scipy/special/tests/test_zeta.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/biasedurn.pxd -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_contingency.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_distributions.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_entropy.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_fit.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_morestats.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_qmc.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_rank.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_stats.py -.tox/py37/lib/python3.7/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_algorithms.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_axisgrid.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_categorical.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_core.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_distributions.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_docstrings.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_matrix.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_miscplot.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_palettes.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_rcmod.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_relational.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_statistics.py -.tox/py37/lib/python3.7/site-packages/seaborn/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py37/lib/python3.7/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py37/lib/python3.7/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py37/lib/python3.7/site-packages/sklearn/compose/tests/test_target.py -.tox/py37/lib/python3.7/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py37/lib/python3.7/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py37/lib/python3.7/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py37/lib/python3.7/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py37/lib/python3.7/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py37/lib/python3.7/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py37/lib/python3.7/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py37/lib/python3.7/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py37/lib/python3.7/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py37/lib/python3.7/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py37/lib/python3.7/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py37/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py37/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py37/lib/python3.7/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py37/lib/python3.7/site-packages/sklearn/impute/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/impute/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/impute/tests/test_impute.py -.tox/py37/lib/python3.7/site-packages/sklearn/impute/tests/test_knn.py -.tox/py37/lib/python3.7/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py37/lib/python3.7/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py37/lib/python3.7/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py37/lib/python3.7/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py37/lib/python3.7/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py37/lib/python3.7/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py37/lib/python3.7/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py37/lib/python3.7/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py37/lib/python3.7/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py37/lib/python3.7/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py37/lib/python3.7/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py37/lib/python3.7/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py37/lib/python3.7/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py37/lib/python3.7/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py37/lib/python3.7/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py37/lib/python3.7/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py37/lib/python3.7/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py37/lib/python3.7/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py37/lib/python3.7/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py37/lib/python3.7/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py37/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py37/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py37/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py37/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py37/lib/python3.7/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py37/lib/python3.7/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py37/lib/python3.7/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py37/lib/python3.7/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py37/lib/python3.7/site-packages/sklearn/svm/tests/test_svm.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_base.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_build.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_calibration.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_check_build.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_common.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_config.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_dummy.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_init.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_isotonic.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_metaestimators.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_multiclass.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_multioutput.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_pipeline.py -.tox/py37/lib/python3.7/site-packages/sklearn/tests/test_random_projection.py -.tox/py37/lib/python3.7/site-packages/sklearn/tree/_criterion.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/tree/_splitter.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/tree/_tree.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/tree/_utils.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/tree/tests/test_export.py -.tox/py37/lib/python3.7/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py37/lib/python3.7/site-packages/sklearn/tree/tests/test_tree.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/utils/_random.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/utils/murmurhash.pxd -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_random.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_testing.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_utils.py -.tox/py37/lib/python3.7/site-packages/sklearn/utils/tests/test_validation.py -.tox/py37/lib/python3.7/site-packages/tests/test_config.py -.tox/py37/lib/python3.7/site-packages/tests/test_core.py -.tox/py37/lib/python3.7/site-packages/tests/test_linters.py -.tox/py37/lib/python3.7/site-packages/traitlets/config/tests/test_application.py -.tox/py37/lib/python3.7/site-packages/traitlets/config/tests/test_configurable.py -.tox/py37/lib/python3.7/site-packages/traitlets/config/tests/test_loader.py -.tox/py37/lib/python3.7/site-packages/traitlets/tests/test_traitlets.py -.tox/py37/lib/python3.7/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py37/lib/python3.7/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py37/lib/python3.7/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py37/lib/python3.7/site-packages/wcwidth/tests/test_core.py -.tox/py37/lib/python3.7/site-packages/zmq/__init__.pxd -.tox/py37/lib/python3.7/site-packages/zmq/backend/cython/__init__.pxd -.tox/py37/lib/python3.7/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py37/lib/python3.7/site-packages/zmq/backend/cython/context.pxd -.tox/py37/lib/python3.7/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py37/lib/python3.7/site-packages/zmq/backend/cython/message.pxd -.tox/py37/lib/python3.7/site-packages/zmq/backend/cython/socket.pxd -.tox/py37/lib/python3.7/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_asyncio.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_auth.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_cffi_backend.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_constants.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_context.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_cython.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_decorators.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_device.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_draft.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_error.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_etc.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_future.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_imports.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_includes.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_ioloop.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_log.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_message.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_monitor.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_monqueue.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_multipart.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_mypy.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_pair.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_poll.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_pubsub.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_reqrep.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_retry_eintr.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_security.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_socket.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_ssh.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_version.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_win32_shim.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_z85.py -.tox/py37/lib/python3.7/site-packages/zmq/tests/test_zmqstream.py -.tox/py37/lib/python3.7/site-packages/zmq/utils/buffers.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Compiler/Code.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Compiler/Parsing.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Compiler/Scanning.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Compiler/Visitor.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/openmp.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/array.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/float.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/function.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/int.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/list.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/long.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/method.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/module.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/number.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/object.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/set.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/string.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/version.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/errno.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/float.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/limits.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/locale.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/math.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/signal.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/string.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libc/time.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/numpy/math.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/mman.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/resource.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/select.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/signal.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/stat.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/strings.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/time.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/types.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Includes/posix/wait.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Plex/Actions.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Plex/Scanners.pxd -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Runtime/refnanny.pyx -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Utility/CConvert.pyx -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Utility/CppConvert.pyx -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Utility/MemoryView.pyx -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py38-darwin/lib/python3.8/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_alias.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_application.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_autocall.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_compilerop.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_completer.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_completerlib.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_debugger.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_display.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_displayhook.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_events.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_extension.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_formatters.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_handlers.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_history.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_hooks.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_imports.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_iplib.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_logger.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_magic.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_oinspect.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_page.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_prefilter.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_profile.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_prompts.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_run.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_shellapp.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_splitinput.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/core/tests/test_ultratb.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_display.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_imports.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_latextools.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_lexers.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_pretty.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/lib/tests/test_security.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/terminal/tests/test_embed.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/terminal/tests/test_help.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/testing/plugin/test_refs.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/testing/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/testing/tests/test_tools.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_capture.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_dir2.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_imports.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_importstring.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_io.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_openpy.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_path.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_process.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_text.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py38-darwin/lib/python3.8/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_check.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_classdef.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_detect.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_diff.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_extendpickle.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_fglobals.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_file.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_functions.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_functors.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_mixins.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_module.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_moduledict.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_nested.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_objects.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_properties.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_recursive.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_restricted.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_selected.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_source.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_temp.py -.tox/py38-darwin/lib/python3.8/site-packages/dill/tests/test_weakref.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_de.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_kde.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_proposal.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_stretch.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/integration/test_walk.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_backends.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_blobs.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_sampler.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_state.py -.tox/py38-darwin/lib/python3.8/site-packages/emcee/tests/unit/test_stretch.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/binning/binning.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/binning/tests/test_discretizer.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/clipping/clipping.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/clipping/tests/test_clipping.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/encoder.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/imputers/imputer.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/imputers/tests/test_imputers.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/scalers/scaler.pyx -.tox/py38-darwin/lib/python3.8/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/transformers/tests/test_transformer.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/util/tests/test_benchmark.py -.tox/py38-darwin/lib/python3.8/site-packages/gators/util/tests/test_util.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_anneal.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_criteria.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_domains.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_fmin.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_ipy.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_pchoice.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_plotting.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_progress.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_rand.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_randint.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_rdists.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_spark.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_tpe.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_vectorize.py -.tox/py38-darwin/lib/python3.8/site-packages/hyperopt/tests/test_webpage.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_async.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_connect.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_eventloop.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_io.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_kernel.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_message_spec.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py38-darwin/lib/python3.8/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py38-darwin/lib/python3.8/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py38-darwin/lib/python3.8/site-packages/ipython_genutils/tests/test_path.py -.tox/py38-darwin/lib/python3.8/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py38-darwin/lib/python3.8/site-packages/ipython_genutils/tests/test_text.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/tests/test_embed.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py38-darwin/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_backports.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_dask.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_deprecated_objects.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_disk.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_format_stack.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_func_inspect.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_hashing.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_init.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_logger.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_memmapping.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_memory.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_module.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_my_exceptions.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_numpy_pickle.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_parallel.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_store_backends.py -.tox/py38-darwin/lib/python3.8/site-packages/joblib/test/test_testing.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_cli.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_deprecations.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_exceptions.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_format.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_types.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/jsonschema/tests/test_validators.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_adapter.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_client.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_connect.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_manager.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_public_api.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_session.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_ssh.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_client/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_console/tests/test_console.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_core/tests/test_application.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_core/tests/test_command.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_core/tests/test_migrate.py -.tox/py38-darwin/lib/python3.8/site-packages/jupyter_core/tests/test_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_afm.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_agg.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_animation.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_artist.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_axes.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_category.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_cbook.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_collections.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_colorbar.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_colors.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_compare_images.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_container.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_contour.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_cycles.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_dates.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_determinism.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_dviread.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_figure.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_font_manager.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_gridspec.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_image.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_legend.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_lines.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_marker.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_mathtext.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_mlab.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_patches.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_path.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_patheffects.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_pickle.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_png.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_polar.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_pyplot.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_quiver.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_rcparams.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_sankey.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_scale.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_simplification.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_skew.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_spines.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_streamplot.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_style.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_subplots.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_table.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_testing.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_texmanager.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_text.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_ticker.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_transforms.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_triangulation.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_ttconv.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_type1font.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_units.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_usetex.py -.tox/py38-darwin/lib/python3.8/site-packages/matplotlib/tests/test_widgets.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py38-darwin/lib/python3.8/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py38-darwin/lib/python3.8/site-packages/nbclient/tests/test_client.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/utils/tests/test_io.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/utils/tests/test_version.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/writers/tests/test_files.py -.tox/py38-darwin/lib/python3.8/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/corpus/tests/test_words.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/tests/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/tests/test_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/tests/test_nbformat.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/tests/test_reader.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/tests/test_sign.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/tests/test_validator.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v1/tests/test_json.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v2/tests/test_json.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v3/tests/test_json.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v3/tests/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v4/tests/test_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v4/tests/test_json.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py38-darwin/lib/python3.8/site-packages/nbformat/v4/tests/test_validate.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_core.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_digraph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_filters.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_function.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_graph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_ordered.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_special.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/drawing/tests/test_layout.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_atlas.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_classic.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_cographs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_community.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_directed.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_duplication.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_ego.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_expanders.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_geometric.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_intersection.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_lattice.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_line.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_small.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_trees.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/generators/tests/test_triads.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/readwrite/tests/test_text.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/testing/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_all_random_functions.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_convert_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_convert_pandas.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_convert_scipy.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_exceptions.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_import.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/tests/test_relabel.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test__init.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_heaps.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_rcm.py -.tox/py38-darwin/lib/python3.8/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/auth/tests/test_login.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/auth/tests/test_security.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/api/tests/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_config_manager.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_files.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_gateway.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_i18n.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_log.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_nbextensions.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_notebookapp.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_serialize.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_serverextensions.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_traittypes.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_save.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py38-darwin/lib/python3.8/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/compat/tests/test_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test__exceptions.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_abc.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_defchararray.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_deprecations.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_dtype.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_einsum.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_errstate.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_extint128.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_function_base.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_getlimits.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_half.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_item_selection.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_longdouble.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_machar.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_memmap.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_multiarray.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_nditer.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_numeric.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_overrides.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_print.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_protocols.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_records.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_shape_base.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_ufunc.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_umath.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/core/tests/test_unicode.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_callback.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_kind.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_size.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/f2py/tests/test_string.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/fft/tests/test_helper.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test__datasource.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test__iotools.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test__version.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_financial.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_format.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_function_base.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_histograms.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_io.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_mixins.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_packbits.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_type_check.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/lib/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/linalg/tests/test_build.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/linalg/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_core.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_extras.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/_bounded_integers.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/_common.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/bit_generator.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/c_distributions.pxd -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_direct.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_extending.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_random.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_randomstate.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/random/tests/test_smoke.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/testing/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/testing/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_ctypeslib.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_matlib.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_numpy_version.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_public_api.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_reloading.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_scripts.py -.tox/py38-darwin/lib/python3.8/site-packages/numpy/tests/test_warnings.py -.tox/py38-darwin/lib/python3.8/site-packages/numpydoc/tests/test_docscrape.py -.tox/py38-darwin/lib/python3.8/site-packages/numpydoc/tests/test_full.py -.tox/py38-darwin/lib/python3.8/site-packages/numpydoc/tests/test_main.py -.tox/py38-darwin/lib/python3.8/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py38-darwin/lib/python3.8/site-packages/numpydoc/tests/test_validate.py -.tox/py38-darwin/lib/python3.8/site-packages/numpydoc/tests/test_xref.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/algos.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/algos.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/arrays.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/arrays.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/groupby.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/hashing.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/hashtable.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/hashtable.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/index.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/indexing.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/internals.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/interval.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/join.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/khash.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/lib.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/lib.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/missing.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/missing.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/ops.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/parsers.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/properties.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/reduction.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/reshape.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/sparse.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/testing.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslib.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/util.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/writers.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/_libs/window/indexers.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/io/sas/sas.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_aggregation.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_algos.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_downstream.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_errors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_expressions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_flags.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_multilevel.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_nanops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_optional_dependency.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_register_accessor.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_sorting.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/test_take.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/api/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/api/test_types.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_array.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_conversion.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_transpose.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_unique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/base/test_value_counts.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/computation/test_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/computation/test_eval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/config/test_config.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/config/test_localization.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_boolean.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_extension.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_external_block.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_floating.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_integer.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_interval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_sparse.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/test_string.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/json/test_json.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/extension/list/test_list.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_iteration.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_subclass.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_unary.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/test_validate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_finalize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_frame.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_generic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_series.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_apply.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_counting.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_filters.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_function.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_missing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_nth.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_rank.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_sample.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_size.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_engines.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_at.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_floats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_iat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_loc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_partial.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/internals/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/internals/test_internals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/internals/test_managers.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_clipboard.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_compression.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_date_converters.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_feather.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_fsspec.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_gbq.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_gcs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_html.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_orc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_parquet.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_pickle.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_s3.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_spss.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_sql.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_stata.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/test_user_agent.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_style.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_console.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_css.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_format.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_info.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_compression.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_header.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_network.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/libs/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/libs/test_lib.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_backend.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_converter.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_series.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/test_style.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_period_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_cut.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_melt.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/test_util.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/test_nat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_constructors.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_cumulative.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_iteration.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_missing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_reductions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_repr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_subclass.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_ufunc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_unary.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/test_validate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_align.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_append.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_between.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_count.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_item.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_round.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_update.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_values.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/series/methods/test_view.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_cat.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_extract.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_string_array.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/strings/test_strings.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tools/test_to_time.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_deprecate.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_doc.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_hashing.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_numba.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_safe_import.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_show_versions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_util.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_validate_args.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_apply.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_dtypes.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_ewm.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_expanding.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_groupby.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_numba.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_online.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_pairwise.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_rolling.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/test_win_type.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py38-darwin/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py38-darwin/lib/python3.8/site-packages/pyaml/tests/test_dump.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_compute.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_compute.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_csv.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_csv.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_cuda.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_cuda.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_dataset.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_dataset.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_dataset_orc.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_feather.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_flight.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_fs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_fs.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_hdfs.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_hdfsio.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_json.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_orc.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_orc.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_parquet.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_parquet.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_plasma.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/_s3fs.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/gandiva.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/lib.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/lib.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/common.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libarrow.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/includes/libplasma.pxd -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_array.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_builder.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_cffi.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_compute.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_csv.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_cuda.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_cython.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_dataset.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_deprecations.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_extension_type.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_feather.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_filesystem.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_flight.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_fs.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_gandiva.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_hdfs.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_io.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_ipc.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_json.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_jvm.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_memory.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_orc.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_pandas.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_plasma.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_scalars.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_schema.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_serialization.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_strategies.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_table.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_tensor.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_types.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/test_util.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py38-darwin/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_api.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_builtin.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_checker.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_code_segment.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_dict.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_doctests.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_imports.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_is_literal.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_match.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_other.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_type_annotations.py -.tox/py38-darwin/lib/python3.8/site-packages/pyflakes/test/test_undefined_names.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_app.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_comms.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py38-darwin/lib/python3.8/site-packages/qtconsole/tests/test_styles.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_macos_checks.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_main.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qt3drender.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtcharts.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtcore.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qthelp.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtlocation.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtqml.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtquick.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtserialport.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtsql.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtsvg.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qttest.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py38-darwin/lib/python3.8/site-packages/qtpy/tests/test_uic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test__util.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/cluster/tests/test_vq.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/constants/tests/test_codata.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/constants/tests/test_constants.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_backend.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_helper.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_numpy.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fftpack/tests/test_import.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/tests/test_fortran.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/tests/test_idl.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/tests/test_mmio.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/tests/test_netcdf.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/tests/test_paths.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/io/tests/test_wavfile.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/cython_blas.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_blas.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_build.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_misc.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/misc/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/misc/tests/test_doccer.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/odr/tests/test_odr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__root.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_result_type.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_spectral.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/signal/tests/test_windows.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_construct.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_csc.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_csr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_extract.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test_distance.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/cython_special.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_bdtr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_boxcox.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_cdflib.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_cython_special.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_data.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_digamma.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_erfinv.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_gamma.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_gammainc.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_lambertw.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_loggamma.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_logit.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_mpmath.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_ndtr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_owens_t.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_pcf.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_pdtr.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_round.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_sf_error.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_sici.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_spence.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_trig.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/special/tests/test_zeta.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/biasedurn.pxd -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_contingency.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_distributions.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_entropy.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_fit.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_morestats.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_qmc.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_rank.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_stats.py -.tox/py38-darwin/lib/python3.8/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_algorithms.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_axisgrid.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_categorical.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_core.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_distributions.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_docstrings.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_matrix.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_miscplot.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_palettes.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_rcmod.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_relational.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_statistics.py -.tox/py38-darwin/lib/python3.8/site-packages/seaborn/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/compose/tests/test_target.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/impute/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/impute/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/impute/tests/test_impute.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/impute/tests/test_knn.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/svm/tests/test_svm.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_base.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_build.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_calibration.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_check_build.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_common.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_config.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_dummy.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_init.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_isotonic.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_metaestimators.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_multiclass.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_multioutput.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_pipeline.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tests/test_random_projection.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/_criterion.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/_splitter.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/_tree.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/_utils.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/tests/test_export.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/tree/tests/test_tree.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/_random.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/murmurhash.pxd -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_random.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_testing.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_utils.py -.tox/py38-darwin/lib/python3.8/site-packages/sklearn/utils/tests/test_validation.py -.tox/py38-darwin/lib/python3.8/site-packages/tests/test_config.py -.tox/py38-darwin/lib/python3.8/site-packages/tests/test_core.py -.tox/py38-darwin/lib/python3.8/site-packages/tests/test_linters.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/config/tests/test_application.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/config/tests/test_configurable.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/config/tests/test_loader.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/tests/test_traitlets.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py38-darwin/lib/python3.8/site-packages/wcwidth/tests/test_core.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/backend/cython/__init__.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/backend/cython/context.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/backend/cython/message.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/backend/cython/socket.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_asyncio.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_auth.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_cffi_backend.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_constants.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_context.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_cython.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_decorators.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_device.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_draft.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_error.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_etc.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_future.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_imports.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_includes.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_ioloop.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_log.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_message.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_monitor.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_monqueue.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_multipart.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_mypy.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_pair.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_poll.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_pubsub.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_reqrep.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_retry_eintr.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_security.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_socket.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_ssh.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_version.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_win32_shim.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_z85.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/tests/test_zmqstream.py -.tox/py38-darwin/lib/python3.8/site-packages/zmq/utils/buffers.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Compiler/Code.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Compiler/Parsing.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Compiler/Scanning.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Compiler/Visitor.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py38-linux/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/openmp.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/array.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/float.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/function.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/int.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/list.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/long.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/method.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/module.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/number.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/object.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/set.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/string.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/version.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/errno.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/float.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/limits.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/locale.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/math.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/signal.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/string.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libc/time.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/numpy/math.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/mman.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/resource.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/select.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/signal.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/stat.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/strings.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/time.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/types.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Includes/posix/wait.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Plex/Actions.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Plex/Scanners.pxd -.tox/py38-linux/lib/python3.8/site-packages/Cython/Runtime/refnanny.pyx -.tox/py38-linux/lib/python3.8/site-packages/Cython/Utility/CConvert.pyx -.tox/py38-linux/lib/python3.8/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py38-linux/lib/python3.8/site-packages/Cython/Utility/CppConvert.pyx -.tox/py38-linux/lib/python3.8/site-packages/Cython/Utility/MemoryView.pyx -.tox/py38-linux/lib/python3.8/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py38-linux/lib/python3.8/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_alias.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_application.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_autocall.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_compilerop.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_completer.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_completerlib.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_debugger.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_display.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_displayhook.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_events.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_extension.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_formatters.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_handlers.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_history.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_hooks.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_imports.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_iplib.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_logger.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_magic.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_oinspect.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_page.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_paths.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_prefilter.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_profile.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_prompts.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_run.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_shellapp.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_splitinput.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/core/tests/test_ultratb.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_display.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_imports.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_latextools.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_lexers.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_pretty.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/lib/tests/test_security.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/terminal/tests/test_embed.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/terminal/tests/test_help.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/testing/plugin/test_refs.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/testing/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/testing/tests/test_tools.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_capture.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_dir2.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_imports.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_importstring.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_io.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_openpy.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_path.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_process.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_text.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py38-linux/lib/python3.8/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_check.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_classdef.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_detect.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_diff.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_extendpickle.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_fglobals.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_file.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_functions.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_functors.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_mixins.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_module.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_moduledict.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_nested.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_objects.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_properties.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_recursive.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_restricted.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_selected.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_source.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_temp.py -.tox/py38-linux/lib/python3.8/site-packages/dill/tests/test_weakref.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_de.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_kde.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_proposal.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_stretch.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/integration/test_walk.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_backends.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_blobs.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_sampler.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_state.py -.tox/py38-linux/lib/python3.8/site-packages/emcee/tests/unit/test_stretch.py -.tox/py38-linux/lib/python3.8/site-packages/gators/binning/binning.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py38-linux/lib/python3.8/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py38-linux/lib/python3.8/site-packages/gators/binning/tests/test_discretizer.py -.tox/py38-linux/lib/python3.8/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py38-linux/lib/python3.8/site-packages/gators/clipping/clipping.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/clipping/tests/test_clipping.py -.tox/py38-linux/lib/python3.8/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py38-linux/lib/python3.8/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py38-linux/lib/python3.8/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py38-linux/lib/python3.8/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/encoder.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py38-linux/lib/python3.8/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py38-linux/lib/python3.8/site-packages/gators/imputers/imputer.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/imputers/tests/test_imputers.py -.tox/py38-linux/lib/python3.8/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py38-linux/lib/python3.8/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py38-linux/lib/python3.8/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py38-linux/lib/python3.8/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py38-linux/lib/python3.8/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py38-linux/lib/python3.8/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py38-linux/lib/python3.8/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py38-linux/lib/python3.8/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py38-linux/lib/python3.8/site-packages/gators/scalers/scaler.pyx -.tox/py38-linux/lib/python3.8/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py38-linux/lib/python3.8/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py38-linux/lib/python3.8/site-packages/gators/transformers/tests/test_transformer.py -.tox/py38-linux/lib/python3.8/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py38-linux/lib/python3.8/site-packages/gators/util/tests/test_benchmark.py -.tox/py38-linux/lib/python3.8/site-packages/gators/util/tests/test_util.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_anneal.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_criteria.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_domains.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_fmin.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_ipy.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_pchoice.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_plotting.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_progress.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_rand.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_randint.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_rdists.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_spark.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_tpe.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_vectorize.py -.tox/py38-linux/lib/python3.8/site-packages/hyperopt/tests/test_webpage.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_async.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_connect.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_eventloop.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_io.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_kernel.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_message_spec.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py38-linux/lib/python3.8/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py38-linux/lib/python3.8/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py38-linux/lib/python3.8/site-packages/ipython_genutils/tests/test_path.py -.tox/py38-linux/lib/python3.8/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py38-linux/lib/python3.8/site-packages/ipython_genutils/tests/test_text.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/tests/test_embed.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py38-linux/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_backports.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_dask.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_deprecated_objects.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_disk.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_format_stack.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_func_inspect.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_hashing.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_init.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_logger.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_memmapping.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_memory.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_module.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_my_exceptions.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_numpy_pickle.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_parallel.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_store_backends.py -.tox/py38-linux/lib/python3.8/site-packages/joblib/test/test_testing.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_cli.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_deprecations.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_exceptions.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_format.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_types.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/jsonschema/tests/test_validators.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_adapter.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_client.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_connect.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_manager.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_public_api.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_session.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_ssh.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_client/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_console/tests/test_console.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_core/tests/test_application.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_core/tests/test_command.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_core/tests/test_migrate.py -.tox/py38-linux/lib/python3.8/site-packages/jupyter_core/tests/test_paths.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_afm.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_agg.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_animation.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_artist.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_axes.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_category.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_cbook.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_collections.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_colorbar.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_colors.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_compare_images.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_container.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_contour.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_cycles.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_dates.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_determinism.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_dviread.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_figure.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_font_manager.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_gridspec.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_image.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_legend.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_lines.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_marker.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_mathtext.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_mlab.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_patches.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_path.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_patheffects.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_pickle.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_png.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_polar.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_pyplot.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_quiver.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_rcparams.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_sankey.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_scale.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_simplification.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_skew.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_spines.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_streamplot.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_style.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_subplots.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_table.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_testing.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_texmanager.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_text.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_ticker.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_transforms.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_triangulation.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_ttconv.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_type1font.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_units.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_usetex.py -.tox/py38-linux/lib/python3.8/site-packages/matplotlib/tests/test_widgets.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py38-linux/lib/python3.8/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py38-linux/lib/python3.8/site-packages/nbclient/tests/test_client.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/utils/tests/test_io.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/utils/tests/test_version.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/writers/tests/test_files.py -.tox/py38-linux/lib/python3.8/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/corpus/tests/test_words.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/tests/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/tests/test_convert.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/tests/test_nbformat.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/tests/test_reader.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/tests/test_sign.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/tests/test_validator.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v1/tests/test_json.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v2/tests/test_json.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v3/tests/test_json.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v3/tests/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v4/tests/test_convert.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v4/tests/test_json.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py38-linux/lib/python3.8/site-packages/nbformat/v4/tests/test_validate.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_core.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_digraph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_filters.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_function.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_graph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_ordered.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_special.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/drawing/tests/test_layout.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_atlas.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_classic.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_cographs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_community.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_directed.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_duplication.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_ego.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_expanders.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_geometric.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_intersection.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_lattice.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_line.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_small.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_trees.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/generators/tests/test_triads.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/readwrite/tests/test_text.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/testing/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_all_random_functions.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_convert.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_convert_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_convert_pandas.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_convert_scipy.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_exceptions.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_import.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/tests/test_relabel.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test__init.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_heaps.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_rcm.py -.tox/py38-linux/lib/python3.8/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/auth/tests/test_login.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/auth/tests/test_security.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/api/tests/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_config_manager.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_files.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_gateway.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_i18n.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_log.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_nbextensions.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_notebookapp.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_paths.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_serialize.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_serverextensions.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_traittypes.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_save.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py38-linux/lib/python3.8/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/compat/tests/test_compat.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test__exceptions.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_abc.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_defchararray.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_deprecations.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_dtype.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_einsum.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_errstate.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_extint128.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_function_base.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_getlimits.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_half.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_item_selection.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_longdouble.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_machar.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_memmap.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_multiarray.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_nditer.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_numeric.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_overrides.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_print.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_protocols.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_records.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_shape_base.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_ufunc.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_umath.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/core/tests/test_unicode.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_callback.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_kind.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_size.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/f2py/tests/test_string.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/fft/tests/test_helper.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test__datasource.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test__iotools.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test__version.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_financial.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_format.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_function_base.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_histograms.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_io.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_mixins.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_packbits.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_type_check.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/lib/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/linalg/tests/test_build.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/linalg/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_core.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_extras.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/_bounded_integers.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/_common.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/bit_generator.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/c_distributions.pxd -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_direct.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_extending.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_random.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_randomstate.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/random/tests/test_smoke.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/testing/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/testing/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_ctypeslib.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_matlib.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_numpy_version.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_public_api.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_reloading.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_scripts.py -.tox/py38-linux/lib/python3.8/site-packages/numpy/tests/test_warnings.py -.tox/py38-linux/lib/python3.8/site-packages/numpydoc/tests/test_docscrape.py -.tox/py38-linux/lib/python3.8/site-packages/numpydoc/tests/test_full.py -.tox/py38-linux/lib/python3.8/site-packages/numpydoc/tests/test_main.py -.tox/py38-linux/lib/python3.8/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py38-linux/lib/python3.8/site-packages/numpydoc/tests/test_validate.py -.tox/py38-linux/lib/python3.8/site-packages/numpydoc/tests/test_xref.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/algos.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/algos.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/arrays.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/arrays.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/groupby.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/hashing.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/hashtable.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/hashtable.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/index.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/indexing.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/internals.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/interval.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/join.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/khash.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/lib.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/lib.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/missing.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/missing.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/ops.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/parsers.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/properties.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/reduction.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/reshape.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/sparse.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/testing.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslib.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/util.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/writers.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/_libs/window/indexers.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/io/sas/sas.pyx -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_aggregation.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_algos.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_downstream.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_errors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_expressions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_flags.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_multilevel.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_nanops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_optional_dependency.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_register_accessor.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_sorting.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/test_take.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/api/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/api/test_types.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_array.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_conversion.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_transpose.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_unique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/base/test_value_counts.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/computation/test_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/computation/test_eval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/config/test_config.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/config/test_localization.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_boolean.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_extension.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_external_block.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_floating.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_integer.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_interval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_sparse.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/test_string.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/json/test_json.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/extension/list/test_list.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_iteration.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_subclass.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_unary.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/test_validate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_finalize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_frame.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_generic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_series.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_apply.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_counting.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_filters.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_function.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_missing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_nth.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_rank.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_sample.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_size.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_engines.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_at.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_floats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_iat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_loc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_partial.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/internals/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/internals/test_internals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/internals/test_managers.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_clipboard.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_compression.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_date_converters.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_feather.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_fsspec.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_gbq.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_gcs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_html.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_orc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_parquet.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_pickle.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_s3.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_spss.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_sql.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_stata.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/test_user_agent.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_style.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_console.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_css.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_format.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_info.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_compression.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_header.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_network.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/libs/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/libs/test_lib.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_backend.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_converter.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_series.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/test_style.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_period_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_cut.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_melt.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/test_util.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/test_nat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_constructors.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_cumulative.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_iteration.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_missing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_reductions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_repr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_subclass.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_ufunc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_unary.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/test_validate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_align.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_append.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_between.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_count.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_item.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_round.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_update.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_values.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/series/methods/test_view.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_cat.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_extract.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_string_array.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/strings/test_strings.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tools/test_to_time.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_deprecate.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_doc.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_hashing.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_numba.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_safe_import.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_show_versions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_util.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_validate_args.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_apply.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_dtypes.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_ewm.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_expanding.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_groupby.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_numba.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_online.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_pairwise.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_rolling.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/test_win_type.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py38-linux/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py38-linux/lib/python3.8/site-packages/pyaml/tests/test_dump.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_compute.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_compute.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_csv.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_csv.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_cuda.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_cuda.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_dataset.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_dataset.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_dataset_orc.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_feather.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_flight.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_fs.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_fs.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_hdfs.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_hdfsio.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_json.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_orc.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_orc.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_parquet.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_parquet.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_plasma.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/_s3fs.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/gandiva.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/lib.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/lib.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/common.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libarrow.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/includes/libplasma.pxd -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_array.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_builder.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_cffi.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_compute.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_csv.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_cuda.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_cython.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_dataset.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_deprecations.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_extension_type.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_feather.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_filesystem.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_flight.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_fs.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_gandiva.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_hdfs.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_io.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_ipc.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_json.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_jvm.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_memory.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_orc.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_pandas.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_plasma.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_scalars.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_schema.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_serialization.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_strategies.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_table.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_tensor.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_types.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/test_util.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py38-linux/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_api.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_builtin.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_checker.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_code_segment.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_dict.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_doctests.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_imports.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_is_literal.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_match.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_other.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_type_annotations.py -.tox/py38-linux/lib/python3.8/site-packages/pyflakes/test/test_undefined_names.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_app.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_comms.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py38-linux/lib/python3.8/site-packages/qtconsole/tests/test_styles.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_macos_checks.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_main.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qt3drender.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtcharts.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtcore.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qthelp.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtlocation.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtqml.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtquick.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtserialport.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtsql.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtsvg.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qttest.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py38-linux/lib/python3.8/site-packages/qtpy/tests/test_uic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/special.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test__util.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/cluster/tests/test_vq.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/constants/tests/test_codata.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/constants/tests/test_constants.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_backend.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_helper.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_numpy.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fftpack/tests/test_import.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/tests/test_fortran.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/tests/test_idl.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/tests/test_mmio.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/tests/test_netcdf.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/tests/test_paths.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/io/tests/test_wavfile.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/cython_blas.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_blas.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_build.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_misc.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/misc/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/misc/tests/test_doccer.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/odr/tests/test_odr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__root.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_result_type.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_spectral.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/signal/tests/test_windows.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_construct.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_csc.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_csr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_extract.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test_distance.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/cython_special.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_bdtr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_boxcox.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_cdflib.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_cython_special.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_data.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_digamma.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_erfinv.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_gamma.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_gammainc.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_lambertw.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_loggamma.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_logit.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_mpmath.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_ndtr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_owens_t.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_pcf.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_pdtr.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_round.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_sf_error.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_sici.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_spence.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_trig.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/special/tests/test_zeta.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/biasedurn.pxd -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_contingency.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_distributions.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_entropy.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_fit.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_morestats.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_qmc.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_rank.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_stats.py -.tox/py38-linux/lib/python3.8/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_algorithms.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_axisgrid.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_categorical.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_core.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_distributions.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_docstrings.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_matrix.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_miscplot.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_palettes.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_rcmod.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_relational.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_statistics.py -.tox/py38-linux/lib/python3.8/site-packages/seaborn/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/compose/tests/test_target.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/impute/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/impute/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/impute/tests/test_impute.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/impute/tests/test_knn.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/svm/tests/test_svm.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_base.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_build.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_calibration.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_check_build.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_common.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_config.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_dummy.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_init.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_isotonic.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_metaestimators.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_multiclass.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_multioutput.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_pipeline.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tests/test_random_projection.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/_criterion.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/_splitter.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/_tree.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/_utils.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/tests/test_export.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/tree/tests/test_tree.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/_random.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/murmurhash.pxd -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_random.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_testing.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_utils.py -.tox/py38-linux/lib/python3.8/site-packages/sklearn/utils/tests/test_validation.py -.tox/py38-linux/lib/python3.8/site-packages/tests/test_config.py -.tox/py38-linux/lib/python3.8/site-packages/tests/test_core.py -.tox/py38-linux/lib/python3.8/site-packages/tests/test_linters.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/config/tests/test_application.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/config/tests/test_configurable.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/config/tests/test_loader.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/tests/test_traitlets.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py38-linux/lib/python3.8/site-packages/wcwidth/tests/test_core.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/backend/cython/__init__.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/backend/cython/context.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/backend/cython/message.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/backend/cython/socket.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_asyncio.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_auth.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_cffi_backend.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_constants.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_context.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_cython.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_decorators.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_device.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_draft.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_error.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_etc.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_future.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_imports.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_includes.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_ioloop.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_log.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_message.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_monitor.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_monqueue.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_multipart.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_mypy.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_pair.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_poll.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_pubsub.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_reqrep.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_retry_eintr.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_security.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_socket.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_ssh.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_version.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_win32_shim.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_z85.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/tests/test_zmqstream.py -.tox/py38-linux/lib/python3.8/site-packages/zmq/utils/buffers.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Compiler/Code.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Compiler/Parsing.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Compiler/Scanning.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Compiler/Visitor.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py38/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py38/lib/python3.8/site-packages/Cython/Includes/openmp.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/array.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/float.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/function.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/int.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/list.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/long.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/method.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/module.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/number.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/object.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/set.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/string.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/version.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/errno.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/float.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/limits.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/locale.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/math.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/signal.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/string.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libc/time.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/numpy/math.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/mman.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/resource.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/select.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/signal.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/stat.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/strings.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/time.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/types.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Includes/posix/wait.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Plex/Actions.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Plex/Scanners.pxd -.tox/py38/lib/python3.8/site-packages/Cython/Runtime/refnanny.pyx -.tox/py38/lib/python3.8/site-packages/Cython/Utility/CConvert.pyx -.tox/py38/lib/python3.8/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py38/lib/python3.8/site-packages/Cython/Utility/CppConvert.pyx -.tox/py38/lib/python3.8/site-packages/Cython/Utility/MemoryView.pyx -.tox/py38/lib/python3.8/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py38/lib/python3.8/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_alias.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_application.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_autocall.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_compilerop.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_completer.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_completerlib.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_debugger.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_display.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_displayhook.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_events.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_extension.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_formatters.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_handlers.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_history.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_hooks.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_imports.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_iplib.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_logger.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_magic.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_oinspect.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_page.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_paths.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_prefilter.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_profile.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_prompts.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_run.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_shellapp.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_splitinput.py -.tox/py38/lib/python3.8/site-packages/IPython/core/tests/test_ultratb.py -.tox/py38/lib/python3.8/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py38/lib/python3.8/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_display.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_imports.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_latextools.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_lexers.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_pretty.py -.tox/py38/lib/python3.8/site-packages/IPython/lib/tests/test_security.py -.tox/py38/lib/python3.8/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py38/lib/python3.8/site-packages/IPython/terminal/tests/test_embed.py -.tox/py38/lib/python3.8/site-packages/IPython/terminal/tests/test_help.py -.tox/py38/lib/python3.8/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py38/lib/python3.8/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py38/lib/python3.8/site-packages/IPython/testing/plugin/test_refs.py -.tox/py38/lib/python3.8/site-packages/IPython/testing/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py38/lib/python3.8/site-packages/IPython/testing/tests/test_tools.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_capture.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_dir2.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_imports.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_importstring.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_io.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_openpy.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_path.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_process.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_text.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py38/lib/python3.8/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py38/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_check.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_classdef.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_detect.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_diff.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_extendpickle.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_fglobals.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_file.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_functions.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_functors.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_mixins.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_module.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_moduledict.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_nested.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_objects.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_properties.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_recursive.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_restricted.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_selected.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_source.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_temp.py -.tox/py38/lib/python3.8/site-packages/dill/tests/test_weakref.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_de.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_kde.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_proposal.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_stretch.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/integration/test_walk.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_backends.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_blobs.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_sampler.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_state.py -.tox/py38/lib/python3.8/site-packages/emcee/tests/unit/test_stretch.py -.tox/py38/lib/python3.8/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_anneal.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_criteria.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_domains.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_fmin.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_ipy.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_pchoice.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_plotting.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_progress.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_rand.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_randint.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_rdists.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_spark.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_tpe.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_vectorize.py -.tox/py38/lib/python3.8/site-packages/hyperopt/tests/test_webpage.py -.tox/py38/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py38/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_async.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_connect.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_eventloop.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_io.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_kernel.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_message_spec.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py38/lib/python3.8/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py38/lib/python3.8/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py38/lib/python3.8/site-packages/ipython_genutils/tests/test_path.py -.tox/py38/lib/python3.8/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py38/lib/python3.8/site-packages/ipython_genutils/tests/test_text.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/tests/test_embed.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py38/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_backports.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_dask.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_deprecated_objects.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_disk.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_format_stack.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_func_inspect.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_hashing.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_init.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_logger.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_memmapping.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_memory.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_module.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_my_exceptions.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_numpy_pickle.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_parallel.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_store_backends.py -.tox/py38/lib/python3.8/site-packages/joblib/test/test_testing.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_cli.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_deprecations.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_exceptions.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_format.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_types.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/jsonschema/tests/test_validators.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_adapter.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_client.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_connect.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_manager.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_public_api.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_session.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_ssh.py -.tox/py38/lib/python3.8/site-packages/jupyter_client/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/jupyter_console/tests/test_console.py -.tox/py38/lib/python3.8/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py38/lib/python3.8/site-packages/jupyter_core/tests/test_application.py -.tox/py38/lib/python3.8/site-packages/jupyter_core/tests/test_command.py -.tox/py38/lib/python3.8/site-packages/jupyter_core/tests/test_migrate.py -.tox/py38/lib/python3.8/site-packages/jupyter_core/tests/test_paths.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_afm.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_agg.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_animation.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_api.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_artist.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_axes.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_basic.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_category.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_cbook.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_collections.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_colorbar.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_colors.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_compare_images.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_container.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_contour.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_cycles.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_dates.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_determinism.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_dviread.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_figure.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_font_manager.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_gridspec.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_image.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_legend.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_lines.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_marker.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_mathtext.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_mlab.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_patches.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_path.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_patheffects.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_pickle.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_png.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_polar.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_pyplot.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_quiver.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_rcparams.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_sankey.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_scale.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_simplification.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_skew.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_spines.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_streamplot.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_style.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_subplots.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_table.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_testing.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_texmanager.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_text.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_ticker.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_transforms.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_triangulation.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_ttconv.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_type1font.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_units.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_usetex.py -.tox/py38/lib/python3.8/site-packages/matplotlib/tests/test_widgets.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py38/lib/python3.8/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py38/lib/python3.8/site-packages/nbclient/tests/test_client.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py38/lib/python3.8/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py38/lib/python3.8/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py38/lib/python3.8/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py38/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py38/lib/python3.8/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py38/lib/python3.8/site-packages/nbconvert/utils/tests/test_io.py -.tox/py38/lib/python3.8/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py38/lib/python3.8/site-packages/nbconvert/utils/tests/test_version.py -.tox/py38/lib/python3.8/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py38/lib/python3.8/site-packages/nbconvert/writers/tests/test_files.py -.tox/py38/lib/python3.8/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py38/lib/python3.8/site-packages/nbformat/corpus/tests/test_words.py -.tox/py38/lib/python3.8/site-packages/nbformat/tests/test_api.py -.tox/py38/lib/python3.8/site-packages/nbformat/tests/test_convert.py -.tox/py38/lib/python3.8/site-packages/nbformat/tests/test_nbformat.py -.tox/py38/lib/python3.8/site-packages/nbformat/tests/test_reader.py -.tox/py38/lib/python3.8/site-packages/nbformat/tests/test_sign.py -.tox/py38/lib/python3.8/site-packages/nbformat/tests/test_validator.py -.tox/py38/lib/python3.8/site-packages/nbformat/v1/tests/test_json.py -.tox/py38/lib/python3.8/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py38/lib/python3.8/site-packages/nbformat/v2/tests/test_json.py -.tox/py38/lib/python3.8/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py38/lib/python3.8/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py38/lib/python3.8/site-packages/nbformat/v3/tests/test_json.py -.tox/py38/lib/python3.8/site-packages/nbformat/v3/tests/test_misc.py -.tox/py38/lib/python3.8/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py38/lib/python3.8/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py38/lib/python3.8/site-packages/nbformat/v4/tests/test_convert.py -.tox/py38/lib/python3.8/site-packages/nbformat/v4/tests/test_json.py -.tox/py38/lib/python3.8/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py38/lib/python3.8/site-packages/nbformat/v4/tests/test_validate.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_core.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py38/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_digraph.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_filters.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_function.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_graph.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_ordered.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_special.py -.tox/py38/lib/python3.8/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py38/lib/python3.8/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py38/lib/python3.8/site-packages/networkx/drawing/tests/test_layout.py -.tox/py38/lib/python3.8/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py38/lib/python3.8/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_atlas.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_classic.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_cographs.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_community.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_directed.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_duplication.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_ego.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_expanders.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_geometric.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_intersection.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_lattice.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_line.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_small.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_trees.py -.tox/py38/lib/python3.8/site-packages/networkx/generators/tests/test_triads.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py38/lib/python3.8/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py38/lib/python3.8/site-packages/networkx/readwrite/tests/test_text.py -.tox/py38/lib/python3.8/site-packages/networkx/testing/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_all_random_functions.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_convert.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_convert_numpy.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_convert_pandas.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_convert_scipy.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_exceptions.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_import.py -.tox/py38/lib/python3.8/site-packages/networkx/tests/test_relabel.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test__init.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_heaps.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_misc.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_rcm.py -.tox/py38/lib/python3.8/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py38/lib/python3.8/site-packages/notebook/auth/tests/test_login.py -.tox/py38/lib/python3.8/site-packages/notebook/auth/tests/test_security.py -.tox/py38/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py38/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py38/lib/python3.8/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py38/lib/python3.8/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py38/lib/python3.8/site-packages/notebook/services/api/tests/test_api.py -.tox/py38/lib/python3.8/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py38/lib/python3.8/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py38/lib/python3.8/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py38/lib/python3.8/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py38/lib/python3.8/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py38/lib/python3.8/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py38/lib/python3.8/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py38/lib/python3.8/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py38/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py38/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py38/lib/python3.8/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_config_manager.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_files.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_gateway.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_i18n.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_log.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_nbextensions.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_notebookapp.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_paths.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_serialize.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_serverextensions.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_traittypes.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_save.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py38/lib/python3.8/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py38/lib/python3.8/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py38/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd -.tox/py38/lib/python3.8/site-packages/numpy/__init__.pxd -.tox/py38/lib/python3.8/site-packages/numpy/compat/tests/test_compat.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test__exceptions.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_abc.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_api.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_datetime.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_defchararray.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_deprecations.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_dtype.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_einsum.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_errstate.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_extint128.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_function_base.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_getlimits.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_half.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_indexing.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_item_selection.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_longdouble.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_machar.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_memmap.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_multiarray.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_nditer.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_numeric.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_overrides.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_print.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_protocols.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_records.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_shape_base.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_ufunc.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_umath.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py38/lib/python3.8/site-packages/numpy/core/tests/test_unicode.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py38/lib/python3.8/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_callback.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_kind.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_size.py -.tox/py38/lib/python3.8/site-packages/numpy/f2py/tests/test_string.py -.tox/py38/lib/python3.8/site-packages/numpy/fft/tests/test_helper.py -.tox/py38/lib/python3.8/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test__datasource.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test__iotools.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test__version.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_financial.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_format.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_function_base.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_histograms.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_io.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_mixins.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_packbits.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_type_check.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py38/lib/python3.8/site-packages/numpy/lib/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/numpy/linalg/tests/test_build.py -.tox/py38/lib/python3.8/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py38/lib/python3.8/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py38/lib/python3.8/site-packages/numpy/linalg/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_core.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_extras.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py38/lib/python3.8/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py38/lib/python3.8/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py38/lib/python3.8/site-packages/numpy/random/__init__.pxd -.tox/py38/lib/python3.8/site-packages/numpy/random/_bounded_integers.pxd -.tox/py38/lib/python3.8/site-packages/numpy/random/_common.pxd -.tox/py38/lib/python3.8/site-packages/numpy/random/bit_generator.pxd -.tox/py38/lib/python3.8/site-packages/numpy/random/c_distributions.pxd -.tox/py38/lib/python3.8/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py38/lib/python3.8/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_direct.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_extending.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_random.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_randomstate.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py38/lib/python3.8/site-packages/numpy/random/tests/test_smoke.py -.tox/py38/lib/python3.8/site-packages/numpy/testing/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py38/lib/python3.8/site-packages/numpy/testing/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_ctypeslib.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_matlib.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_numpy_version.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_public_api.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_reloading.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_scripts.py -.tox/py38/lib/python3.8/site-packages/numpy/tests/test_warnings.py -.tox/py38/lib/python3.8/site-packages/numpydoc/tests/test_docscrape.py -.tox/py38/lib/python3.8/site-packages/numpydoc/tests/test_full.py -.tox/py38/lib/python3.8/site-packages/numpydoc/tests/test_main.py -.tox/py38/lib/python3.8/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py38/lib/python3.8/site-packages/numpydoc/tests/test_validate.py -.tox/py38/lib/python3.8/site-packages/numpydoc/tests/test_xref.py -.tox/py38/lib/python3.8/site-packages/pandas/_libs/algos.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/algos.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/arrays.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/arrays.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/groupby.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/hashing.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/hashtable.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/hashtable.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/index.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/indexing.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/internals.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/interval.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/join.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/khash.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/lib.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/lib.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/missing.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/missing.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/ops.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/parsers.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/properties.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/reduction.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/reshape.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/sparse.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/testing.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslib.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/util.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/writers.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py38/lib/python3.8/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py38/lib/python3.8/site-packages/pandas/_libs/window/indexers.pyx -.tox/py38/lib/python3.8/site-packages/pandas/io/sas/sas.pyx -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_aggregation.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_algos.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_downstream.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_errors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_expressions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_flags.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_multilevel.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_nanops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_optional_dependency.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_register_accessor.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_sorting.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/test_take.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/api/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/api/test_types.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_array.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_conversion.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_misc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_transpose.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_unique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/base/test_value_counts.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/computation/test_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/computation/test_eval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/config/test_config.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/config/test_localization.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/test_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_boolean.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_extension.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_external_block.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_floating.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_integer.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_interval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_numpy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_sparse.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/test_string.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/json/test_json.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/extension/list/test_list.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_iteration.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_subclass.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_unary.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/test_validate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_finalize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_frame.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_generic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_series.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_apply.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_counting.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_filters.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_function.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_missing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_nth.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_rank.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_sample.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_size.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_base.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_engines.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_at.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_floats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_iat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_loc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_partial.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/internals/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/internals/test_internals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/internals/test_managers.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_clipboard.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_compression.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_date_converters.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_feather.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_fsspec.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_gbq.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_gcs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_html.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_orc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_parquet.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_pickle.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_s3.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_spss.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_sql.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_stata.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/test_user_agent.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_style.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_console.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_css.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_format.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_info.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_compression.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_header.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_network.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/libs/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/libs/test_lib.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_backend.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_converter.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_misc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_series.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/test_style.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_base.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_period_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_cut.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_melt.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/test_util.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/test_nat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_constructors.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_cumulative.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_iteration.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_missing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_reductions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_repr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_subclass.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_ufunc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_unary.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/test_validate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_align.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_append.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_between.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_count.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_item.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_round.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_update.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_values.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/series/methods/test_view.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_cat.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_extract.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_string_array.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/strings/test_strings.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tools/test_to_time.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_deprecate.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_doc.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_hashing.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_numba.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_safe_import.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_show_versions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_util.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_validate_args.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_api.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_apply.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_dtypes.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_ewm.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_expanding.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_groupby.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_numba.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_online.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_pairwise.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_rolling.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/test_win_type.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py38/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py38/lib/python3.8/site-packages/pyaml/tests/test_dump.py -.tox/py38/lib/python3.8/site-packages/pyarrow/__init__.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_compute.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_compute.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_csv.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_csv.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_cuda.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_cuda.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_dataset.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_dataset.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_dataset_orc.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_feather.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_flight.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_fs.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_fs.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_hdfs.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_hdfsio.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_json.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_orc.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_orc.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_parquet.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/_parquet.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_plasma.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/_s3fs.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/gandiva.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/lib.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/lib.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/__init__.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/common.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libarrow.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/includes/libplasma.pxd -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_array.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_builder.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_cffi.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_compute.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_csv.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_cuda.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_cython.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_dataset.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_deprecations.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_extension_type.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_feather.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_filesystem.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_flight.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_fs.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_gandiva.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_hdfs.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_io.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_ipc.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_json.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_jvm.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_memory.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_misc.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_orc.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_pandas.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_plasma.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_scalars.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_schema.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_serialization.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_strategies.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_table.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_tensor.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_types.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/test_util.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py38/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_api.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_builtin.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_checker.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_code_segment.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_dict.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_doctests.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_imports.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_is_literal.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_match.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_other.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_type_annotations.py -.tox/py38/lib/python3.8/site-packages/pyflakes/test/test_undefined_names.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_app.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_comms.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py38/lib/python3.8/site-packages/qtconsole/tests/test_styles.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_macos_checks.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_main.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qt3drender.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtcharts.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtcore.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qthelp.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtlocation.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtqml.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtquick.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtserialport.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtsql.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtsvg.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qttest.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py38/lib/python3.8/site-packages/qtpy/tests/test_uic.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize.pxd -.tox/py38/lib/python3.8/site-packages/scipy/special.pxd -.tox/py38/lib/python3.8/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test__util.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py38/lib/python3.8/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py38/lib/python3.8/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py38/lib/python3.8/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py38/lib/python3.8/site-packages/scipy/cluster/tests/test_vq.py -.tox/py38/lib/python3.8/site-packages/scipy/constants/tests/test_codata.py -.tox/py38/lib/python3.8/site-packages/scipy/constants/tests/test_constants.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_backend.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_helper.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_numpy.py -.tox/py38/lib/python3.8/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py38/lib/python3.8/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py38/lib/python3.8/site-packages/scipy/fftpack/tests/test_import.py -.tox/py38/lib/python3.8/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py38/lib/python3.8/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py38/lib/python3.8/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py38/lib/python3.8/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py38/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py38/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py38/lib/python3.8/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py38/lib/python3.8/site-packages/scipy/io/tests/test_fortran.py -.tox/py38/lib/python3.8/site-packages/scipy/io/tests/test_idl.py -.tox/py38/lib/python3.8/site-packages/scipy/io/tests/test_mmio.py -.tox/py38/lib/python3.8/site-packages/scipy/io/tests/test_netcdf.py -.tox/py38/lib/python3.8/site-packages/scipy/io/tests/test_paths.py -.tox/py38/lib/python3.8/site-packages/scipy/io/tests/test_wavfile.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/cython_blas.pxd -.tox/py38/lib/python3.8/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_blas.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_build.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_misc.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py38/lib/python3.8/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py38/lib/python3.8/site-packages/scipy/misc/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/scipy/misc/tests/test_doccer.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py38/lib/python3.8/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py38/lib/python3.8/site-packages/scipy/odr/tests/test_odr.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__root.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py38/lib/python3.8/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_result_type.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_spectral.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py38/lib/python3.8/site-packages/scipy/signal/tests/test_windows.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_construct.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_csc.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_csr.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_extract.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py38/lib/python3.8/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test_distance.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py38/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py38/lib/python3.8/site-packages/scipy/special/cython_special.pxd -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_bdtr.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_boxcox.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_cdflib.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_cython_special.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_data.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_digamma.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_erfinv.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_gamma.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_gammainc.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_lambertw.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_loggamma.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_logit.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_mpmath.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_ndtr.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_owens_t.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_pcf.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_pdtr.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_round.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_sf_error.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_sici.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_spence.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_trig.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py38/lib/python3.8/site-packages/scipy/special/tests/test_zeta.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/biasedurn.pxd -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_contingency.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_distributions.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_entropy.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_fit.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_morestats.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_qmc.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_rank.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_stats.py -.tox/py38/lib/python3.8/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_algorithms.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_axisgrid.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_categorical.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_core.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_distributions.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_docstrings.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_matrix.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_miscplot.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_palettes.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_rcmod.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_relational.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_statistics.py -.tox/py38/lib/python3.8/site-packages/seaborn/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py38/lib/python3.8/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py38/lib/python3.8/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py38/lib/python3.8/site-packages/sklearn/compose/tests/test_target.py -.tox/py38/lib/python3.8/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py38/lib/python3.8/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py38/lib/python3.8/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py38/lib/python3.8/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py38/lib/python3.8/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py38/lib/python3.8/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py38/lib/python3.8/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py38/lib/python3.8/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py38/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py38/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py38/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py38/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py38/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py38/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py38/lib/python3.8/site-packages/sklearn/impute/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/impute/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/impute/tests/test_impute.py -.tox/py38/lib/python3.8/site-packages/sklearn/impute/tests/test_knn.py -.tox/py38/lib/python3.8/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py38/lib/python3.8/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py38/lib/python3.8/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py38/lib/python3.8/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py38/lib/python3.8/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py38/lib/python3.8/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py38/lib/python3.8/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py38/lib/python3.8/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py38/lib/python3.8/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py38/lib/python3.8/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py38/lib/python3.8/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py38/lib/python3.8/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py38/lib/python3.8/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py38/lib/python3.8/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py38/lib/python3.8/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py38/lib/python3.8/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py38/lib/python3.8/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py38/lib/python3.8/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py38/lib/python3.8/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py38/lib/python3.8/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py38/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py38/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py38/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py38/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py38/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py38/lib/python3.8/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py38/lib/python3.8/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py38/lib/python3.8/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py38/lib/python3.8/site-packages/sklearn/svm/tests/test_svm.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_base.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_build.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_calibration.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_check_build.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_common.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_config.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_dummy.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_init.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_isotonic.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_metaestimators.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_multiclass.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_multioutput.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_pipeline.py -.tox/py38/lib/python3.8/site-packages/sklearn/tests/test_random_projection.py -.tox/py38/lib/python3.8/site-packages/sklearn/tree/_criterion.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/tree/_splitter.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/tree/_tree.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/tree/_utils.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/tree/tests/test_export.py -.tox/py38/lib/python3.8/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py38/lib/python3.8/site-packages/sklearn/tree/tests/test_tree.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/utils/_random.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/utils/murmurhash.pxd -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_random.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_testing.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_utils.py -.tox/py38/lib/python3.8/site-packages/sklearn/utils/tests/test_validation.py -.tox/py38/lib/python3.8/site-packages/tests/test_config.py -.tox/py38/lib/python3.8/site-packages/tests/test_core.py -.tox/py38/lib/python3.8/site-packages/tests/test_linters.py -.tox/py38/lib/python3.8/site-packages/traitlets/config/tests/test_application.py -.tox/py38/lib/python3.8/site-packages/traitlets/config/tests/test_configurable.py -.tox/py38/lib/python3.8/site-packages/traitlets/config/tests/test_loader.py -.tox/py38/lib/python3.8/site-packages/traitlets/tests/test_traitlets.py -.tox/py38/lib/python3.8/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py38/lib/python3.8/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py38/lib/python3.8/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py38/lib/python3.8/site-packages/wcwidth/tests/test_core.py -.tox/py38/lib/python3.8/site-packages/zmq/__init__.pxd -.tox/py38/lib/python3.8/site-packages/zmq/backend/cython/__init__.pxd -.tox/py38/lib/python3.8/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py38/lib/python3.8/site-packages/zmq/backend/cython/context.pxd -.tox/py38/lib/python3.8/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py38/lib/python3.8/site-packages/zmq/backend/cython/message.pxd -.tox/py38/lib/python3.8/site-packages/zmq/backend/cython/socket.pxd -.tox/py38/lib/python3.8/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_asyncio.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_auth.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_cffi_backend.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_constants.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_context.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_cython.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_decorators.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_device.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_draft.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_error.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_etc.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_future.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_imports.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_includes.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_ioloop.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_log.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_message.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_monitor.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_monqueue.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_multipart.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_mypy.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_pair.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_poll.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_pubsub.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_reqrep.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_retry_eintr.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_security.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_socket.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_ssh.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_version.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_win32_shim.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_z85.py -.tox/py38/lib/python3.8/site-packages/zmq/tests/test_zmqstream.py -.tox/py38/lib/python3.8/site-packages/zmq/utils/buffers.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Compiler/Code.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Compiler/Parsing.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Compiler/Scanning.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Compiler/Visitor.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/openmp.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/array.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/float.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/function.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/int.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/list.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/long.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/method.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/module.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/number.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/object.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/set.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/string.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/type.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/version.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/errno.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/float.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/limits.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/locale.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/math.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/signal.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/string.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libc/time.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/numpy/math.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/mman.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/resource.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/select.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/signal.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/stat.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/strings.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/time.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/types.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Includes/posix/wait.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Plex/Actions.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Plex/Scanners.pxd -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Runtime/refnanny.pyx -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Utility/CConvert.pyx -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Utility/CppConvert.pyx -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Utility/MemoryView.pyx -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py39-darwin/lib/python3.9/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_alias.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_application.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_autocall.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_compilerop.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_completer.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_completerlib.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_debugger.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_display.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_displayhook.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_events.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_extension.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_formatters.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_handlers.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_history.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_hooks.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_imports.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_iplib.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_logger.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_magic.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_oinspect.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_page.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_prefilter.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_profile.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_prompts.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_run.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_shellapp.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_splitinput.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/core/tests/test_ultratb.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_display.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_imports.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_latextools.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_lexers.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_pretty.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/lib/tests/test_security.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/terminal/tests/test_embed.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/terminal/tests/test_help.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/testing/plugin/test_refs.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/testing/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/testing/tests/test_tools.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_capture.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_dir2.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_imports.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_importstring.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_io.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_openpy.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_path.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_process.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_text.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py39-darwin/lib/python3.9/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_check.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_classdef.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_detect.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_diff.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_extendpickle.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_fglobals.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_file.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_functions.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_functors.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_mixins.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_module.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_moduledict.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_nested.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_objects.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_properties.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_recursive.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_restricted.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_selected.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_source.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_temp.py -.tox/py39-darwin/lib/python3.9/site-packages/dill/tests/test_weakref.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_de.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_kde.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_proposal.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_stretch.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/integration/test_walk.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_backends.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_blobs.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_sampler.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_state.py -.tox/py39-darwin/lib/python3.9/site-packages/emcee/tests/unit/test_stretch.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/binning/binning.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/binning/tests/test_discretizer.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/clipping/clipping.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/clipping/tests/test_clipping.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/encoder.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/imputers/imputer.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/imputers/tests/test_imputers.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/scalers/scaler.pyx -.tox/py39-darwin/lib/python3.9/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/transformers/tests/test_transformer.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/util/tests/test_benchmark.py -.tox/py39-darwin/lib/python3.9/site-packages/gators/util/tests/test_util.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_anneal.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_criteria.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_domains.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_fmin.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_ipy.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_pchoice.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_plotting.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_progress.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_rand.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_randint.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_rdists.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_spark.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_tpe.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_vectorize.py -.tox/py39-darwin/lib/python3.9/site-packages/hyperopt/tests/test_webpage.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_async.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_connect.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_eventloop.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_io.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_kernel.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_message_spec.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py39-darwin/lib/python3.9/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py39-darwin/lib/python3.9/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py39-darwin/lib/python3.9/site-packages/ipython_genutils/tests/test_path.py -.tox/py39-darwin/lib/python3.9/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py39-darwin/lib/python3.9/site-packages/ipython_genutils/tests/test_text.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/tests/test_embed.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py39-darwin/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_backports.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_dask.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_deprecated_objects.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_disk.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_format_stack.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_func_inspect.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_hashing.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_init.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_logger.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_memmapping.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_memory.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_module.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_my_exceptions.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_numpy_pickle.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_parallel.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_store_backends.py -.tox/py39-darwin/lib/python3.9/site-packages/joblib/test/test_testing.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_cli.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_deprecations.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_exceptions.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_format.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_types.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/jsonschema/tests/test_validators.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_adapter.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_client.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_connect.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_manager.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_public_api.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_session.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_ssh.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_client/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_console/tests/test_console.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_core/tests/test_application.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_core/tests/test_command.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_core/tests/test_migrate.py -.tox/py39-darwin/lib/python3.9/site-packages/jupyter_core/tests/test_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_afm.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_agg.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_animation.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_artist.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_axes.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_category.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_cbook.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_collections.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_colorbar.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_colors.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_compare_images.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_container.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_contour.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_cycles.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_dates.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_determinism.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_dviread.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_figure.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_font_manager.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_gridspec.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_image.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_legend.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_lines.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_marker.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_mathtext.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_mlab.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_patches.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_path.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_patheffects.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_pickle.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_png.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_polar.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_pyplot.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_quiver.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_rcparams.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_sankey.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_scale.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_simplification.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_skew.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_spines.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_streamplot.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_style.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_subplots.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_table.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_testing.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_texmanager.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_text.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_ticker.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_transforms.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_triangulation.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_ttconv.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_type1font.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_units.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_usetex.py -.tox/py39-darwin/lib/python3.9/site-packages/matplotlib/tests/test_widgets.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py39-darwin/lib/python3.9/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py39-darwin/lib/python3.9/site-packages/nbclient/tests/test_client.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/utils/tests/test_io.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/utils/tests/test_version.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/writers/tests/test_files.py -.tox/py39-darwin/lib/python3.9/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/corpus/tests/test_words.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/tests/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/tests/test_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/tests/test_nbformat.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/tests/test_reader.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/tests/test_sign.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/tests/test_validator.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v1/tests/test_json.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v2/tests/test_json.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v3/tests/test_json.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v3/tests/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v4/tests/test_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v4/tests/test_json.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py39-darwin/lib/python3.9/site-packages/nbformat/v4/tests/test_validate.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_core.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_digraph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_filters.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_function.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_graph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_ordered.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_special.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/drawing/tests/test_layout.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_atlas.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_classic.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_cographs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_community.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_directed.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_duplication.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_ego.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_expanders.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_geometric.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_intersection.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_lattice.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_line.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_small.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_trees.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/generators/tests/test_triads.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/readwrite/tests/test_text.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/testing/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_all_random_functions.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_convert_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_convert_pandas.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_convert_scipy.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_exceptions.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_import.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/tests/test_relabel.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test__init.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_heaps.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_rcm.py -.tox/py39-darwin/lib/python3.9/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/auth/tests/test_login.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/auth/tests/test_security.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/api/tests/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_config_manager.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_files.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_gateway.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_i18n.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_log.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_nbextensions.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_notebookapp.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_serialize.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_serverextensions.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_traittypes.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_save.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py39-darwin/lib/python3.9/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/__init__.cython-30.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/compat/tests/test_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test__exceptions.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_abc.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_defchararray.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_deprecations.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_dtype.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_einsum.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_errstate.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_extint128.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_function_base.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_getlimits.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_half.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_item_selection.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_longdouble.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_machar.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_memmap.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_multiarray.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_nditer.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_numeric.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_overrides.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_print.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_protocols.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_records.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_shape_base.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_ufunc.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_umath.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/core/tests/test_unicode.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_callback.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_kind.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_size.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/f2py/tests/test_string.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/fft/tests/test_helper.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test__datasource.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test__iotools.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test__version.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_financial.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_format.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_function_base.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_histograms.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_io.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_mixins.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_packbits.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_type_check.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/lib/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/linalg/tests/test_build.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/linalg/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_core.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_extras.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/_bounded_integers.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/_common.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/bit_generator.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/c_distributions.pxd -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_direct.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_extending.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_random.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_randomstate.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/random/tests/test_smoke.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/testing/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/testing/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_ctypeslib.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_matlib.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_numpy_version.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_public_api.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_reloading.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_scripts.py -.tox/py39-darwin/lib/python3.9/site-packages/numpy/tests/test_warnings.py -.tox/py39-darwin/lib/python3.9/site-packages/numpydoc/tests/test_docscrape.py -.tox/py39-darwin/lib/python3.9/site-packages/numpydoc/tests/test_full.py -.tox/py39-darwin/lib/python3.9/site-packages/numpydoc/tests/test_main.py -.tox/py39-darwin/lib/python3.9/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py39-darwin/lib/python3.9/site-packages/numpydoc/tests/test_validate.py -.tox/py39-darwin/lib/python3.9/site-packages/numpydoc/tests/test_xref.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/algos.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/algos.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/arrays.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/arrays.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/groupby.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/hashing.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/hashtable.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/hashtable.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/index.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/indexing.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/internals.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/interval.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/join.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/khash.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/lib.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/lib.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/missing.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/missing.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/ops.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/parsers.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/properties.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/reduction.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/reshape.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/sparse.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/testing.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslib.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/util.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/writers.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/_libs/window/indexers.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/io/sas/sas.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_aggregation.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_algos.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_downstream.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_errors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_expressions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_flags.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_multilevel.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_nanops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_optional_dependency.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_register_accessor.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_sorting.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/test_take.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/api/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/api/test_types.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_array.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_conversion.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_transpose.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_unique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/base/test_value_counts.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/computation/test_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/computation/test_eval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/config/test_config.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/config/test_localization.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_boolean.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_extension.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_external_block.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_floating.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_integer.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_interval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_sparse.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/test_string.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/json/test_json.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/extension/list/test_list.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_iteration.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_subclass.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_unary.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/test_validate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_finalize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_frame.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_generic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_series.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_apply.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_counting.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_filters.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_function.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_missing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_nth.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_rank.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_sample.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_size.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_engines.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_at.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_floats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_iat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_loc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_partial.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/internals/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/internals/test_internals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/internals/test_managers.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_clipboard.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_compression.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_date_converters.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_feather.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_fsspec.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_gbq.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_gcs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_html.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_orc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_parquet.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_pickle.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_s3.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_spss.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_sql.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_stata.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/test_user_agent.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_style.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_console.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_css.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_format.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_info.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_compression.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_header.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_network.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/libs/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/libs/test_lib.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_backend.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_converter.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_series.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/test_style.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_period_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_cut.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_melt.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/test_util.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/test_nat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_constructors.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_cumulative.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_iteration.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_missing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_reductions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_repr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_subclass.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_ufunc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_unary.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/test_validate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_align.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_append.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_between.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_count.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_item.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_round.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_update.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_values.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/series/methods/test_view.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_cat.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_extract.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_string_array.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/strings/test_strings.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tools/test_to_time.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_deprecate.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_doc.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_hashing.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_numba.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_safe_import.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_show_versions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_util.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_validate_args.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_apply.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_dtypes.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_ewm.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_expanding.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_groupby.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_numba.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_online.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_pairwise.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_rolling.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/test_win_type.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py39-darwin/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py39-darwin/lib/python3.9/site-packages/pyaml/tests/test_dump.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_compute.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_compute.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_csv.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_csv.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_cuda.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_cuda.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_dataset.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_dataset.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_dataset_orc.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_feather.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_flight.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_fs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_fs.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_hdfs.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_hdfsio.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_json.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_orc.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_orc.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_parquet.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_parquet.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_plasma.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/_s3fs.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/gandiva.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/lib.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/lib.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/common.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libarrow.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/includes/libplasma.pxd -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_array.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_builder.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_cffi.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_compute.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_csv.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_cuda.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_cython.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_dataset.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_deprecations.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_extension_type.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_feather.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_filesystem.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_flight.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_fs.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_gandiva.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_hdfs.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_io.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_ipc.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_json.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_jvm.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_memory.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_orc.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_pandas.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_plasma.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_scalars.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_schema.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_serialization.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_strategies.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_table.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_tensor.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_types.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/test_util.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py39-darwin/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_api.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_builtin.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_checker.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_code_segment.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_dict.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_doctests.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_imports.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_is_literal.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_match.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_other.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_type_annotations.py -.tox/py39-darwin/lib/python3.9/site-packages/pyflakes/test/test_undefined_names.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_app.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_comms.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py39-darwin/lib/python3.9/site-packages/qtconsole/tests/test_styles.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_macos_checks.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_main.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qt3drender.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtcharts.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtcore.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qthelp.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtlocation.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtqml.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtquick.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtserialport.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtsql.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtsvg.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qttest.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py39-darwin/lib/python3.9/site-packages/qtpy/tests/test_uic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test__util.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/cluster/tests/test_vq.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/constants/tests/test_codata.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/constants/tests/test_constants.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_backend.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_helper.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_numpy.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fftpack/tests/test_import.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/tests/test_fortran.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/tests/test_idl.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/tests/test_mmio.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/tests/test_netcdf.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/tests/test_paths.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/io/tests/test_wavfile.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/cython_blas.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_blas.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_build.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_misc.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/misc/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/misc/tests/test_doccer.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/odr/tests/test_odr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__root.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_result_type.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_spectral.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/signal/tests/test_windows.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_construct.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_csc.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_csr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_extract.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test_distance.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/cython_special.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_bdtr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_boxcox.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_cdflib.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_cython_special.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_data.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_digamma.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_erfinv.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_gamma.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_gammainc.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_lambertw.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_loggamma.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_logit.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_mpmath.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_ndtr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_owens_t.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_pcf.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_pdtr.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_round.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_sf_error.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_sici.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_spence.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_trig.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/special/tests/test_zeta.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/biasedurn.pxd -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_contingency.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_distributions.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_entropy.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_fit.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_morestats.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_qmc.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_rank.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_stats.py -.tox/py39-darwin/lib/python3.9/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_algorithms.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_axisgrid.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_categorical.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_core.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_distributions.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_docstrings.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_matrix.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_miscplot.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_palettes.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_rcmod.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_relational.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_statistics.py -.tox/py39-darwin/lib/python3.9/site-packages/seaborn/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/compose/tests/test_target.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/impute/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/impute/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/impute/tests/test_impute.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/impute/tests/test_knn.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/svm/tests/test_svm.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_base.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_build.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_calibration.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_check_build.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_common.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_config.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_dummy.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_init.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_isotonic.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_metaestimators.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_multiclass.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_multioutput.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_pipeline.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tests/test_random_projection.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/_criterion.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/_splitter.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/_tree.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/_utils.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/tests/test_export.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/tree/tests/test_tree.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/_random.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/murmurhash.pxd -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_random.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_testing.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_utils.py -.tox/py39-darwin/lib/python3.9/site-packages/sklearn/utils/tests/test_validation.py -.tox/py39-darwin/lib/python3.9/site-packages/tests/test_config.py -.tox/py39-darwin/lib/python3.9/site-packages/tests/test_core.py -.tox/py39-darwin/lib/python3.9/site-packages/tests/test_linters.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/config/tests/test_application.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/config/tests/test_configurable.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/config/tests/test_loader.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/tests/test_traitlets.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py39-darwin/lib/python3.9/site-packages/wcwidth/tests/test_core.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/backend/cython/__init__.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/backend/cython/context.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/backend/cython/message.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/backend/cython/socket.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_asyncio.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_auth.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_cffi_backend.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_constants.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_context.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_cython.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_decorators.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_device.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_draft.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_error.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_etc.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_future.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_imports.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_includes.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_ioloop.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_log.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_message.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_monitor.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_monqueue.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_multipart.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_mypy.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_pair.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_poll.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_pubsub.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_reqrep.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_retry_eintr.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_security.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_socket.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_ssh.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_version.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_win32_shim.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_z85.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/tests/test_zmqstream.py -.tox/py39-darwin/lib/python3.9/site-packages/zmq/utils/buffers.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Compiler/Code.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Compiler/Parsing.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Compiler/Scanning.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Compiler/Visitor.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py39-linux/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/openmp.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/array.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/float.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/function.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/int.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/list.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/long.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/method.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/module.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/number.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/object.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/set.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/string.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/type.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/version.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/errno.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/float.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/limits.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/locale.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/math.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/signal.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/string.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libc/time.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/numpy/math.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/mman.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/resource.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/select.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/signal.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/stat.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/strings.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/time.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/types.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Includes/posix/wait.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Plex/Actions.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Plex/Scanners.pxd -.tox/py39-linux/lib/python3.9/site-packages/Cython/Runtime/refnanny.pyx -.tox/py39-linux/lib/python3.9/site-packages/Cython/Utility/CConvert.pyx -.tox/py39-linux/lib/python3.9/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py39-linux/lib/python3.9/site-packages/Cython/Utility/CppConvert.pyx -.tox/py39-linux/lib/python3.9/site-packages/Cython/Utility/MemoryView.pyx -.tox/py39-linux/lib/python3.9/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py39-linux/lib/python3.9/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_alias.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_application.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_autocall.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_compilerop.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_completer.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_completerlib.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_debugger.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_display.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_displayhook.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_events.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_extension.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_formatters.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_handlers.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_history.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_hooks.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_imports.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_iplib.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_logger.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_magic.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_oinspect.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_page.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_paths.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_prefilter.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_profile.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_prompts.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_run.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_shellapp.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_splitinput.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/core/tests/test_ultratb.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_display.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_imports.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_latextools.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_lexers.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_pretty.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/lib/tests/test_security.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/terminal/tests/test_embed.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/terminal/tests/test_help.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/testing/plugin/test_refs.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/testing/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/testing/tests/test_tools.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_capture.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_dir2.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_imports.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_importstring.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_io.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_openpy.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_path.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_process.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_text.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py39-linux/lib/python3.9/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_check.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_classdef.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_detect.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_diff.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_extendpickle.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_fglobals.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_file.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_functions.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_functors.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_mixins.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_module.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_moduledict.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_nested.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_objects.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_properties.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_recursive.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_restricted.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_selected.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_source.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_temp.py -.tox/py39-linux/lib/python3.9/site-packages/dill/tests/test_weakref.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_de.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_kde.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_proposal.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_stretch.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/integration/test_walk.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_backends.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_blobs.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_sampler.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_state.py -.tox/py39-linux/lib/python3.9/site-packages/emcee/tests/unit/test_stretch.py -.tox/py39-linux/lib/python3.9/site-packages/gators/binning/binning.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py39-linux/lib/python3.9/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py39-linux/lib/python3.9/site-packages/gators/binning/tests/test_discretizer.py -.tox/py39-linux/lib/python3.9/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py39-linux/lib/python3.9/site-packages/gators/clipping/clipping.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/clipping/tests/test_clipping.py -.tox/py39-linux/lib/python3.9/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py39-linux/lib/python3.9/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py39-linux/lib/python3.9/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py39-linux/lib/python3.9/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/encoder.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py39-linux/lib/python3.9/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py39-linux/lib/python3.9/site-packages/gators/imputers/imputer.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/imputers/tests/test_imputers.py -.tox/py39-linux/lib/python3.9/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py39-linux/lib/python3.9/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py39-linux/lib/python3.9/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py39-linux/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py39-linux/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py39-linux/lib/python3.9/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py39-linux/lib/python3.9/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py39-linux/lib/python3.9/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py39-linux/lib/python3.9/site-packages/gators/scalers/scaler.pyx -.tox/py39-linux/lib/python3.9/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py39-linux/lib/python3.9/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py39-linux/lib/python3.9/site-packages/gators/transformers/tests/test_transformer.py -.tox/py39-linux/lib/python3.9/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py39-linux/lib/python3.9/site-packages/gators/util/tests/test_benchmark.py -.tox/py39-linux/lib/python3.9/site-packages/gators/util/tests/test_util.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_anneal.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_criteria.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_domains.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_fmin.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_ipy.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_pchoice.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_plotting.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_progress.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_rand.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_randint.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_rdists.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_spark.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_tpe.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_vectorize.py -.tox/py39-linux/lib/python3.9/site-packages/hyperopt/tests/test_webpage.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_async.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_connect.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_eventloop.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_io.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_kernel.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_message_spec.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py39-linux/lib/python3.9/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py39-linux/lib/python3.9/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py39-linux/lib/python3.9/site-packages/ipython_genutils/tests/test_path.py -.tox/py39-linux/lib/python3.9/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py39-linux/lib/python3.9/site-packages/ipython_genutils/tests/test_text.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/tests/test_embed.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py39-linux/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_backports.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_dask.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_deprecated_objects.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_disk.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_format_stack.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_func_inspect.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_hashing.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_init.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_logger.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_memmapping.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_memory.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_module.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_my_exceptions.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_numpy_pickle.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_parallel.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_store_backends.py -.tox/py39-linux/lib/python3.9/site-packages/joblib/test/test_testing.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_cli.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_deprecations.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_exceptions.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_format.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_types.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/jsonschema/tests/test_validators.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_adapter.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_client.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_connect.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_manager.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_public_api.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_session.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_ssh.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_client/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_console/tests/test_console.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_core/tests/test_application.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_core/tests/test_command.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_core/tests/test_migrate.py -.tox/py39-linux/lib/python3.9/site-packages/jupyter_core/tests/test_paths.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_afm.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_agg.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_animation.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_artist.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_axes.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_category.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_cbook.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_collections.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_colorbar.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_colors.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_compare_images.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_container.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_contour.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_cycles.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_dates.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_determinism.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_dviread.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_figure.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_font_manager.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_gridspec.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_image.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_legend.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_lines.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_marker.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_mathtext.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_mlab.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_patches.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_path.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_patheffects.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_pickle.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_png.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_polar.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_pyplot.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_quiver.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_rcparams.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_sankey.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_scale.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_simplification.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_skew.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_spines.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_streamplot.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_style.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_subplots.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_table.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_testing.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_texmanager.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_text.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_ticker.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_transforms.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_triangulation.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_ttconv.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_type1font.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_units.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_usetex.py -.tox/py39-linux/lib/python3.9/site-packages/matplotlib/tests/test_widgets.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py39-linux/lib/python3.9/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py39-linux/lib/python3.9/site-packages/nbclient/tests/test_client.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/utils/tests/test_io.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/utils/tests/test_version.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/writers/tests/test_files.py -.tox/py39-linux/lib/python3.9/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/corpus/tests/test_words.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/tests/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/tests/test_convert.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/tests/test_nbformat.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/tests/test_reader.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/tests/test_sign.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/tests/test_validator.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v1/tests/test_json.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v2/tests/test_json.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v3/tests/test_json.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v3/tests/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v4/tests/test_convert.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v4/tests/test_json.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py39-linux/lib/python3.9/site-packages/nbformat/v4/tests/test_validate.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_core.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_digraph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_filters.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_function.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_graph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_ordered.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_special.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/drawing/tests/test_layout.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_atlas.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_classic.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_cographs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_community.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_directed.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_duplication.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_ego.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_expanders.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_geometric.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_intersection.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_lattice.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_line.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_small.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_trees.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/generators/tests/test_triads.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/readwrite/tests/test_text.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/testing/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_all_random_functions.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_convert.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_convert_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_convert_pandas.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_convert_scipy.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_exceptions.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_import.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/tests/test_relabel.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test__init.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_heaps.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_rcm.py -.tox/py39-linux/lib/python3.9/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/auth/tests/test_login.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/auth/tests/test_security.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/api/tests/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_config_manager.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_files.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_gateway.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_i18n.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_log.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_nbextensions.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_notebookapp.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_paths.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_serialize.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_serverextensions.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_traittypes.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_save.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py39-linux/lib/python3.9/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/__init__.cython-30.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/compat/tests/test_compat.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test__exceptions.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_abc.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_defchararray.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_deprecations.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_dtype.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_einsum.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_errstate.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_extint128.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_function_base.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_getlimits.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_half.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_item_selection.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_longdouble.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_machar.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_memmap.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_multiarray.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_nditer.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_numeric.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_overrides.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_print.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_protocols.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_records.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_shape_base.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_ufunc.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_umath.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/core/tests/test_unicode.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_callback.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_kind.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_size.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/f2py/tests/test_string.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/fft/tests/test_helper.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test__datasource.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test__iotools.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test__version.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_financial.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_format.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_function_base.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_histograms.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_io.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_mixins.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_packbits.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_type_check.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/lib/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/linalg/tests/test_build.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/linalg/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_core.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_extras.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/_bounded_integers.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/_common.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/bit_generator.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/c_distributions.pxd -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_direct.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_extending.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_random.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_randomstate.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/random/tests/test_smoke.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/testing/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/testing/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_ctypeslib.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_matlib.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_numpy_version.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_public_api.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_reloading.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_scripts.py -.tox/py39-linux/lib/python3.9/site-packages/numpy/tests/test_warnings.py -.tox/py39-linux/lib/python3.9/site-packages/numpydoc/tests/test_docscrape.py -.tox/py39-linux/lib/python3.9/site-packages/numpydoc/tests/test_full.py -.tox/py39-linux/lib/python3.9/site-packages/numpydoc/tests/test_main.py -.tox/py39-linux/lib/python3.9/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py39-linux/lib/python3.9/site-packages/numpydoc/tests/test_validate.py -.tox/py39-linux/lib/python3.9/site-packages/numpydoc/tests/test_xref.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/algos.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/algos.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/arrays.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/arrays.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/groupby.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/hashing.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/hashtable.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/hashtable.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/index.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/indexing.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/internals.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/interval.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/join.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/khash.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/lib.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/lib.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/missing.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/missing.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/ops.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/parsers.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/properties.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/reduction.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/reshape.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/sparse.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/testing.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslib.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/util.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/writers.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/_libs/window/indexers.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/io/sas/sas.pyx -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_aggregation.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_algos.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_downstream.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_errors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_expressions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_flags.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_multilevel.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_nanops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_optional_dependency.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_register_accessor.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_sorting.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/test_take.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/api/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/api/test_types.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_array.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_conversion.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_transpose.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_unique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/base/test_value_counts.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/computation/test_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/computation/test_eval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/config/test_config.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/config/test_localization.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_boolean.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_extension.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_external_block.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_floating.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_integer.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_interval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_sparse.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/test_string.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/json/test_json.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/extension/list/test_list.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_iteration.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_subclass.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_unary.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/test_validate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_finalize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_frame.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_generic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_series.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_apply.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_counting.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_filters.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_function.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_missing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_nth.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_rank.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_sample.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_size.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_engines.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_at.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_floats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_iat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_loc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_partial.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/internals/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/internals/test_internals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/internals/test_managers.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_clipboard.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_compression.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_date_converters.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_feather.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_fsspec.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_gbq.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_gcs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_html.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_orc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_parquet.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_pickle.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_s3.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_spss.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_sql.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_stata.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/test_user_agent.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_style.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_console.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_css.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_format.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_info.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_compression.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_header.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_network.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/libs/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/libs/test_lib.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_backend.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_converter.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_series.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/test_style.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_period_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_cut.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_melt.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/test_util.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/test_nat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_constructors.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_cumulative.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_iteration.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_missing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_reductions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_repr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_subclass.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_ufunc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_unary.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/test_validate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_align.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_append.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_between.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_count.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_item.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_round.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_update.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_values.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/series/methods/test_view.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_cat.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_extract.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_string_array.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/strings/test_strings.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tools/test_to_time.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_deprecate.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_doc.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_hashing.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_numba.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_safe_import.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_show_versions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_util.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_validate_args.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_apply.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_dtypes.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_ewm.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_expanding.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_groupby.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_numba.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_online.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_pairwise.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_rolling.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/test_win_type.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py39-linux/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py39-linux/lib/python3.9/site-packages/pyaml/tests/test_dump.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_compute.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_compute.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_csv.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_csv.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_cuda.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_cuda.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_dataset.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_dataset.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_dataset_orc.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_feather.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_flight.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_fs.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_fs.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_hdfs.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_hdfsio.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_json.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_orc.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_orc.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_parquet.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_parquet.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_plasma.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/_s3fs.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/gandiva.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/lib.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/lib.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/common.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libarrow.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/includes/libplasma.pxd -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_array.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_builder.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_cffi.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_compute.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_csv.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_cuda.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_cython.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_dataset.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_deprecations.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_extension_type.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_feather.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_filesystem.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_flight.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_fs.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_gandiva.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_hdfs.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_io.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_ipc.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_json.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_jvm.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_memory.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_orc.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_pandas.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_plasma.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_scalars.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_schema.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_serialization.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_strategies.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_table.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_tensor.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_types.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/test_util.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py39-linux/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_api.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_builtin.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_checker.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_code_segment.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_dict.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_doctests.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_imports.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_is_literal.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_match.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_other.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_type_annotations.py -.tox/py39-linux/lib/python3.9/site-packages/pyflakes/test/test_undefined_names.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_app.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_comms.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py39-linux/lib/python3.9/site-packages/qtconsole/tests/test_styles.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_macos_checks.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_main.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qt3drender.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtcharts.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtcore.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qthelp.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtlocation.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtqml.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtquick.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtserialport.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtsql.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtsvg.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qttest.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py39-linux/lib/python3.9/site-packages/qtpy/tests/test_uic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/special.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test__util.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/cluster/tests/test_vq.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/constants/tests/test_codata.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/constants/tests/test_constants.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_backend.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_helper.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_numpy.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fftpack/tests/test_import.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/tests/test_fortran.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/tests/test_idl.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/tests/test_mmio.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/tests/test_netcdf.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/tests/test_paths.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/io/tests/test_wavfile.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/cython_blas.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_blas.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_build.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_misc.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/misc/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/misc/tests/test_doccer.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/odr/tests/test_odr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__root.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_result_type.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_spectral.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/signal/tests/test_windows.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_construct.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_csc.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_csr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_extract.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test_distance.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/cython_special.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_bdtr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_boxcox.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_cdflib.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_cython_special.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_data.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_digamma.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_erfinv.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_gamma.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_gammainc.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_lambertw.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_loggamma.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_logit.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_mpmath.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_ndtr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_owens_t.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_pcf.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_pdtr.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_round.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_sf_error.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_sici.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_spence.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_trig.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/special/tests/test_zeta.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/biasedurn.pxd -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_contingency.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_distributions.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_entropy.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_fit.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_morestats.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_qmc.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_rank.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_stats.py -.tox/py39-linux/lib/python3.9/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_algorithms.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_axisgrid.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_categorical.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_core.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_distributions.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_docstrings.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_matrix.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_miscplot.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_palettes.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_rcmod.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_relational.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_statistics.py -.tox/py39-linux/lib/python3.9/site-packages/seaborn/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/compose/tests/test_target.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/impute/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/impute/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/impute/tests/test_impute.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/impute/tests/test_knn.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/svm/tests/test_svm.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_base.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_build.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_calibration.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_check_build.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_common.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_config.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_dummy.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_init.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_isotonic.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_metaestimators.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_multiclass.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_multioutput.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_pipeline.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tests/test_random_projection.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/_criterion.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/_splitter.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/_tree.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/_utils.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/tests/test_export.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/tree/tests/test_tree.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/_random.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/murmurhash.pxd -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_random.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_testing.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_utils.py -.tox/py39-linux/lib/python3.9/site-packages/sklearn/utils/tests/test_validation.py -.tox/py39-linux/lib/python3.9/site-packages/tests/test_config.py -.tox/py39-linux/lib/python3.9/site-packages/tests/test_core.py -.tox/py39-linux/lib/python3.9/site-packages/tests/test_linters.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/config/tests/test_application.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/config/tests/test_configurable.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/config/tests/test_loader.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/tests/test_traitlets.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py39-linux/lib/python3.9/site-packages/wcwidth/tests/test_core.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/backend/cython/__init__.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/backend/cython/context.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/backend/cython/message.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/backend/cython/socket.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_asyncio.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_auth.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_cffi_backend.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_constants.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_context.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_cython.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_decorators.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_device.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_draft.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_error.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_etc.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_future.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_imports.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_includes.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_ioloop.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_log.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_message.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_monitor.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_monqueue.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_multipart.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_mypy.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_pair.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_poll.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_pubsub.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_reqrep.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_retry_eintr.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_security.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_socket.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_ssh.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_version.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_win32_shim.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_z85.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/tests/test_zmqstream.py -.tox/py39-linux/lib/python3.9/site-packages/zmq/utils/buffers.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Compiler/Code.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Compiler/Parsing.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Compiler/Scanning.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Compiler/Visitor.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py39-macos/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/openmp.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/array.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/float.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/function.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/int.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/list.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/long.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/method.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/module.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/number.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/object.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/set.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/string.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/type.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/version.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/errno.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/float.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/limits.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/locale.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/math.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/signal.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/string.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libc/time.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/numpy/math.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/mman.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/resource.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/select.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/signal.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/stat.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/strings.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/time.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/types.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Includes/posix/wait.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Plex/Actions.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Plex/Scanners.pxd -.tox/py39-macos/lib/python3.9/site-packages/Cython/Runtime/refnanny.pyx -.tox/py39-macos/lib/python3.9/site-packages/Cython/Utility/CConvert.pyx -.tox/py39-macos/lib/python3.9/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py39-macos/lib/python3.9/site-packages/Cython/Utility/CppConvert.pyx -.tox/py39-macos/lib/python3.9/site-packages/Cython/Utility/MemoryView.pyx -.tox/py39-macos/lib/python3.9/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py39-macos/lib/python3.9/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_alias.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_application.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_autocall.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_compilerop.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_completer.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_completerlib.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_debugger.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_display.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_displayhook.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_events.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_extension.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_formatters.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_handlers.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_history.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_hooks.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_imports.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_iplib.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_logger.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_magic.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_oinspect.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_page.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_paths.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_prefilter.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_profile.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_prompts.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_run.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_shellapp.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_splitinput.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/core/tests/test_ultratb.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_display.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_imports.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_latextools.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_lexers.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_pretty.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/lib/tests/test_security.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/terminal/tests/test_embed.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/terminal/tests/test_help.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/testing/plugin/test_refs.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/testing/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/testing/tests/test_tools.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_capture.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_dir2.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_imports.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_importstring.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_io.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_openpy.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_path.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_process.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_text.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py39-macos/lib/python3.9/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_check.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_classdef.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_detect.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_diff.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_extendpickle.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_fglobals.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_file.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_functions.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_functors.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_mixins.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_module.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_moduledict.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_nested.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_objects.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_properties.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_recursive.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_restricted.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_selected.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_source.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_temp.py -.tox/py39-macos/lib/python3.9/site-packages/dill/tests/test_weakref.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_de.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_kde.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_proposal.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_stretch.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/integration/test_walk.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_backends.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_blobs.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_sampler.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_state.py -.tox/py39-macos/lib/python3.9/site-packages/emcee/tests/unit/test_stretch.py -.tox/py39-macos/lib/python3.9/site-packages/gators/binning/binning.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py39-macos/lib/python3.9/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py39-macos/lib/python3.9/site-packages/gators/binning/tests/test_discretizer.py -.tox/py39-macos/lib/python3.9/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py39-macos/lib/python3.9/site-packages/gators/clipping/clipping.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/clipping/tests/test_clipping.py -.tox/py39-macos/lib/python3.9/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py39-macos/lib/python3.9/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py39-macos/lib/python3.9/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py39-macos/lib/python3.9/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/encoder.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py39-macos/lib/python3.9/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py39-macos/lib/python3.9/site-packages/gators/imputers/imputer.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/imputers/tests/test_imputers.py -.tox/py39-macos/lib/python3.9/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py39-macos/lib/python3.9/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py39-macos/lib/python3.9/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py39-macos/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py39-macos/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py39-macos/lib/python3.9/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py39-macos/lib/python3.9/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py39-macos/lib/python3.9/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py39-macos/lib/python3.9/site-packages/gators/scalers/scaler.pyx -.tox/py39-macos/lib/python3.9/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py39-macos/lib/python3.9/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py39-macos/lib/python3.9/site-packages/gators/transformers/tests/test_transformer.py -.tox/py39-macos/lib/python3.9/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py39-macos/lib/python3.9/site-packages/gators/util/tests/test_benchmark.py -.tox/py39-macos/lib/python3.9/site-packages/gators/util/tests/test_util.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_anneal.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_criteria.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_domains.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_fmin.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_ipy.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_pchoice.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_plotting.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_progress.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_rand.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_randint.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_rdists.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_spark.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_tpe.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_vectorize.py -.tox/py39-macos/lib/python3.9/site-packages/hyperopt/tests/test_webpage.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_async.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_connect.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_eventloop.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_io.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_kernel.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_message_spec.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py39-macos/lib/python3.9/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py39-macos/lib/python3.9/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py39-macos/lib/python3.9/site-packages/ipython_genutils/tests/test_path.py -.tox/py39-macos/lib/python3.9/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py39-macos/lib/python3.9/site-packages/ipython_genutils/tests/test_text.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/tests/test_embed.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py39-macos/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_backports.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_dask.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_deprecated_objects.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_disk.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_format_stack.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_func_inspect.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_hashing.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_init.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_logger.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_memmapping.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_memory.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_module.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_my_exceptions.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_numpy_pickle.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_parallel.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_store_backends.py -.tox/py39-macos/lib/python3.9/site-packages/joblib/test/test_testing.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_cli.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_deprecations.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_exceptions.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_format.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_types.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/jsonschema/tests/test_validators.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_adapter.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_client.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_connect.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_manager.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_public_api.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_session.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_ssh.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_client/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_console/tests/test_console.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_core/tests/test_application.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_core/tests/test_command.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_core/tests/test_migrate.py -.tox/py39-macos/lib/python3.9/site-packages/jupyter_core/tests/test_paths.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_afm.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_agg.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_animation.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_artist.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_axes.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_category.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_cbook.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_collections.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_colorbar.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_colors.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_compare_images.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_container.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_contour.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_cycles.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_dates.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_determinism.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_dviread.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_figure.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_font_manager.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_gridspec.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_image.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_legend.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_lines.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_marker.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_mathtext.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_mlab.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_patches.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_path.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_patheffects.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_pickle.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_png.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_polar.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_pyplot.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_quiver.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_rcparams.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_sankey.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_scale.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_simplification.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_skew.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_spines.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_streamplot.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_style.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_subplots.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_table.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_testing.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_texmanager.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_text.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_ticker.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_transforms.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_triangulation.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_ttconv.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_type1font.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_units.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_usetex.py -.tox/py39-macos/lib/python3.9/site-packages/matplotlib/tests/test_widgets.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py39-macos/lib/python3.9/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py39-macos/lib/python3.9/site-packages/nbclient/tests/test_client.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/utils/tests/test_io.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/utils/tests/test_version.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/writers/tests/test_files.py -.tox/py39-macos/lib/python3.9/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/corpus/tests/test_words.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/tests/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/tests/test_convert.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/tests/test_nbformat.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/tests/test_reader.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/tests/test_sign.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/tests/test_validator.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v1/tests/test_json.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v2/tests/test_json.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v3/tests/test_json.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v3/tests/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v4/tests/test_convert.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v4/tests/test_json.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py39-macos/lib/python3.9/site-packages/nbformat/v4/tests/test_validate.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_core.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_digraph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_filters.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_function.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_graph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_ordered.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_special.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/drawing/tests/test_layout.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_atlas.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_classic.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_cographs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_community.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_directed.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_duplication.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_ego.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_expanders.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_geometric.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_intersection.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_lattice.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_line.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_small.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_trees.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/generators/tests/test_triads.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/readwrite/tests/test_text.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/testing/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_all_random_functions.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_convert.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_convert_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_convert_pandas.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_convert_scipy.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_exceptions.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_import.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/tests/test_relabel.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test__init.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_heaps.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_rcm.py -.tox/py39-macos/lib/python3.9/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/auth/tests/test_login.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/auth/tests/test_security.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/api/tests/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_config_manager.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_files.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_gateway.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_i18n.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_log.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_nbextensions.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_notebookapp.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_paths.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_serialize.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_serverextensions.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_traittypes.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_save.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py39-macos/lib/python3.9/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/__init__.cython-30.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/compat/tests/test_compat.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test__exceptions.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_abc.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_defchararray.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_deprecations.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_dtype.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_einsum.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_errstate.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_extint128.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_function_base.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_getlimits.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_half.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_item_selection.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_longdouble.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_machar.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_memmap.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_multiarray.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_nditer.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_numeric.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_overrides.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_print.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_protocols.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_records.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_shape_base.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_ufunc.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_umath.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/core/tests/test_unicode.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_callback.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_kind.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_size.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/f2py/tests/test_string.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/fft/tests/test_helper.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test__datasource.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test__iotools.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test__version.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_financial.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_format.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_function_base.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_histograms.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_io.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_mixins.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_packbits.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_type_check.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/lib/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/linalg/tests/test_build.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/linalg/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_core.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_extras.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/_bounded_integers.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/_common.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/bit_generator.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/c_distributions.pxd -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_direct.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_extending.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_random.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_randomstate.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/random/tests/test_smoke.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/testing/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/testing/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_ctypeslib.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_matlib.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_numpy_version.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_public_api.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_reloading.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_scripts.py -.tox/py39-macos/lib/python3.9/site-packages/numpy/tests/test_warnings.py -.tox/py39-macos/lib/python3.9/site-packages/numpydoc/tests/test_docscrape.py -.tox/py39-macos/lib/python3.9/site-packages/numpydoc/tests/test_full.py -.tox/py39-macos/lib/python3.9/site-packages/numpydoc/tests/test_main.py -.tox/py39-macos/lib/python3.9/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py39-macos/lib/python3.9/site-packages/numpydoc/tests/test_validate.py -.tox/py39-macos/lib/python3.9/site-packages/numpydoc/tests/test_xref.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/algos.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/algos.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/arrays.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/arrays.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/groupby.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/hashing.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/hashtable.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/hashtable.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/index.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/indexing.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/internals.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/interval.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/join.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/khash.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/lib.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/lib.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/missing.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/missing.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/ops.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/parsers.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/properties.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/reduction.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/reshape.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/sparse.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/testing.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslib.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/util.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/writers.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/_libs/window/indexers.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/io/sas/sas.pyx -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_aggregation.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_algos.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_downstream.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_errors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_expressions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_flags.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_multilevel.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_nanops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_optional_dependency.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_register_accessor.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_sorting.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/test_take.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/api/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/api/test_types.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_array.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_conversion.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_transpose.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_unique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/base/test_value_counts.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/computation/test_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/computation/test_eval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/config/test_config.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/config/test_localization.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_boolean.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_extension.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_external_block.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_floating.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_integer.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_interval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_sparse.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/test_string.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/json/test_json.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/extension/list/test_list.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_iteration.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_subclass.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_unary.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/test_validate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_finalize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_frame.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_generic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_series.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_apply.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_counting.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_filters.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_function.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_missing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_nth.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_rank.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_sample.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_size.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_engines.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_at.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_floats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_iat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_loc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_partial.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/internals/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/internals/test_internals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/internals/test_managers.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_clipboard.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_compression.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_date_converters.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_feather.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_fsspec.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_gbq.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_gcs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_html.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_orc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_parquet.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_pickle.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_s3.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_spss.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_sql.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_stata.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/test_user_agent.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_style.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_console.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_css.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_format.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_info.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_compression.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_header.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_network.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/libs/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/libs/test_lib.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_backend.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_converter.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_series.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/test_style.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_period_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_cut.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_melt.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/test_util.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/test_nat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_constructors.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_cumulative.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_iteration.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_missing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_reductions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_repr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_subclass.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_ufunc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_unary.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/test_validate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_align.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_append.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_between.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_count.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_item.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_round.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_update.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_values.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/series/methods/test_view.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_cat.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_extract.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_string_array.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/strings/test_strings.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tools/test_to_time.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_deprecate.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_doc.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_hashing.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_numba.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_safe_import.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_show_versions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_util.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_validate_args.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_apply.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_dtypes.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_ewm.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_expanding.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_groupby.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_numba.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_online.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_pairwise.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_rolling.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/test_win_type.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py39-macos/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py39-macos/lib/python3.9/site-packages/pyaml/tests/test_dump.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_compute.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_compute.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_csv.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_csv.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_cuda.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_cuda.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_dataset.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_feather.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_flight.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_fs.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_fs.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_hdfs.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_hdfsio.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_json.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_orc.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_orc.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_parquet.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_parquet.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_plasma.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/_s3fs.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/gandiva.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/lib.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/lib.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/common.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libarrow.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/includes/libplasma.pxd -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_array.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_builder.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_cffi.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_compute.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_csv.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_cuda.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_cython.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_dataset.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_deprecations.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_extension_type.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_feather.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_filesystem.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_flight.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_fs.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_gandiva.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_hdfs.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_io.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_ipc.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_json.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_jvm.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_memory.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_orc.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_pandas.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_plasma.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_scalars.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_schema.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_serialization.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_strategies.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_table.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_tensor.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_types.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/test_util.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py39-macos/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_api.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_builtin.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_checker.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_code_segment.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_dict.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_doctests.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_imports.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_is_literal.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_match.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_other.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_type_annotations.py -.tox/py39-macos/lib/python3.9/site-packages/pyflakes/test/test_undefined_names.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_app.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_comms.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py39-macos/lib/python3.9/site-packages/qtconsole/tests/test_styles.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_macos_checks.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_main.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qt3drender.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtcharts.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtcore.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qthelp.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtlocation.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtqml.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtquick.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtserialport.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtsql.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtsvg.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qttest.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py39-macos/lib/python3.9/site-packages/qtpy/tests/test_uic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/special.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test__util.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/cluster/tests/test_vq.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/constants/tests/test_codata.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/constants/tests/test_constants.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_backend.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_helper.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_numpy.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fftpack/tests/test_import.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/tests/test_fortran.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/tests/test_idl.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/tests/test_mmio.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/tests/test_netcdf.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/tests/test_paths.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/io/tests/test_wavfile.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/cython_blas.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_blas.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_build.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_misc.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/misc/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/misc/tests/test_doccer.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/odr/tests/test_odr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__root.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_result_type.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_spectral.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/signal/tests/test_windows.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_construct.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_csc.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_csr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_extract.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test_distance.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/cython_special.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_bdtr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_boxcox.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_cdflib.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_cython_special.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_data.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_digamma.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_erfinv.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_gamma.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_gammainc.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_lambertw.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_loggamma.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_logit.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_mpmath.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_ndtr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_owens_t.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_pcf.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_pdtr.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_round.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_sf_error.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_sici.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_spence.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_trig.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/special/tests/test_zeta.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/biasedurn.pxd -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_contingency.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_distributions.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_entropy.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_fit.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_morestats.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_qmc.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_rank.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_stats.py -.tox/py39-macos/lib/python3.9/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_algorithms.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_axisgrid.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_categorical.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_core.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_distributions.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_docstrings.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_matrix.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_miscplot.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_palettes.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_rcmod.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_relational.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_statistics.py -.tox/py39-macos/lib/python3.9/site-packages/seaborn/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/compose/tests/test_target.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/impute/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/impute/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/impute/tests/test_impute.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/impute/tests/test_knn.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/svm/tests/test_svm.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_base.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_build.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_calibration.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_check_build.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_common.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_config.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_dummy.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_init.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_isotonic.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_metaestimators.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_multiclass.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_multioutput.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_pipeline.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tests/test_random_projection.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/_criterion.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/_splitter.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/_tree.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/_utils.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/tests/test_export.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/tree/tests/test_tree.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/_random.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/murmurhash.pxd -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_random.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_testing.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_utils.py -.tox/py39-macos/lib/python3.9/site-packages/sklearn/utils/tests/test_validation.py -.tox/py39-macos/lib/python3.9/site-packages/tests/test_config.py -.tox/py39-macos/lib/python3.9/site-packages/tests/test_core.py -.tox/py39-macos/lib/python3.9/site-packages/tests/test_linters.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/config/tests/test_application.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/config/tests/test_configurable.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/config/tests/test_loader.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/tests/test_traitlets.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py39-macos/lib/python3.9/site-packages/wcwidth/tests/test_core.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/backend/cython/__init__.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/backend/cython/context.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/backend/cython/message.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/backend/cython/socket.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_asyncio.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_auth.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_cffi_backend.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_constants.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_context.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_cython.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_decorators.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_device.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_draft.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_error.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_etc.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_future.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_imports.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_includes.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_ioloop.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_log.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_message.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_monitor.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_monqueue.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_multipart.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_mypy.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_pair.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_poll.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_pubsub.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_reqrep.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_retry_eintr.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_security.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_socket.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_ssh.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_version.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_win32_shim.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_z85.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/tests/test_zmqstream.py -.tox/py39-macos/lib/python3.9/site-packages/zmq/utils/buffers.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Compiler/Code.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Compiler/Parsing.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Compiler/Scanning.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Compiler/Visitor.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py39-win/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/openmp.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/array.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/float.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/function.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/int.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/list.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/long.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/method.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/module.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/number.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/object.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/set.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/string.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/type.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/version.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/errno.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/float.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/limits.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/locale.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/math.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/signal.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/string.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libc/time.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/numpy/math.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/mman.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/resource.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/select.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/signal.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/stat.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/strings.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/time.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/types.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Includes/posix/wait.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Plex/Actions.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Plex/Scanners.pxd -.tox/py39-win/lib/python3.9/site-packages/Cython/Runtime/refnanny.pyx -.tox/py39-win/lib/python3.9/site-packages/Cython/Utility/CConvert.pyx -.tox/py39-win/lib/python3.9/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py39-win/lib/python3.9/site-packages/Cython/Utility/CppConvert.pyx -.tox/py39-win/lib/python3.9/site-packages/Cython/Utility/MemoryView.pyx -.tox/py39-win/lib/python3.9/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py39-win/lib/python3.9/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_alias.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_application.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_autocall.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_compilerop.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_completer.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_completerlib.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_debugger.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_display.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_displayhook.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_events.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_extension.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_formatters.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_handlers.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_history.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_hooks.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_imports.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_iplib.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_logger.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_magic.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_oinspect.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_page.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_paths.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_prefilter.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_profile.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_prompts.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_run.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_shellapp.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_splitinput.py -.tox/py39-win/lib/python3.9/site-packages/IPython/core/tests/test_ultratb.py -.tox/py39-win/lib/python3.9/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py39-win/lib/python3.9/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_display.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_imports.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_latextools.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_lexers.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_pretty.py -.tox/py39-win/lib/python3.9/site-packages/IPython/lib/tests/test_security.py -.tox/py39-win/lib/python3.9/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py39-win/lib/python3.9/site-packages/IPython/terminal/tests/test_embed.py -.tox/py39-win/lib/python3.9/site-packages/IPython/terminal/tests/test_help.py -.tox/py39-win/lib/python3.9/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py39-win/lib/python3.9/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py39-win/lib/python3.9/site-packages/IPython/testing/plugin/test_refs.py -.tox/py39-win/lib/python3.9/site-packages/IPython/testing/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py39-win/lib/python3.9/site-packages/IPython/testing/tests/test_tools.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_capture.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_dir2.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_imports.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_importstring.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_io.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_openpy.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_path.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_process.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_text.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py39-win/lib/python3.9/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_check.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_classdef.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_detect.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_diff.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_extendpickle.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_fglobals.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_file.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_functions.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_functors.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_mixins.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_module.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_moduledict.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_nested.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_objects.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_properties.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_recursive.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_restricted.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_selected.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_source.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_temp.py -.tox/py39-win/lib/python3.9/site-packages/dill/tests/test_weakref.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_de.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_kde.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_proposal.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_stretch.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/integration/test_walk.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_backends.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_blobs.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_sampler.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_state.py -.tox/py39-win/lib/python3.9/site-packages/emcee/tests/unit/test_stretch.py -.tox/py39-win/lib/python3.9/site-packages/gators/binning/binning.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/py39-win/lib/python3.9/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/py39-win/lib/python3.9/site-packages/gators/binning/tests/test_discretizer.py -.tox/py39-win/lib/python3.9/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/py39-win/lib/python3.9/site-packages/gators/clipping/clipping.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/clipping/tests/test_clipping.py -.tox/py39-win/lib/python3.9/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/py39-win/lib/python3.9/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/py39-win/lib/python3.9/site-packages/gators/converter/tests/test_to_numpy.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/py39-win/lib/python3.9/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/encoder.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/feature_gen.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/py39-win/lib/python3.9/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/py39-win/lib/python3.9/site-packages/gators/imputers/imputer.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/imputers/tests/test_imputers.py -.tox/py39-win/lib/python3.9/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/py39-win/lib/python3.9/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/py39-win/lib/python3.9/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/py39-win/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/py39-win/lib/python3.9/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/py39-win/lib/python3.9/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/py39-win/lib/python3.9/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/py39-win/lib/python3.9/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/py39-win/lib/python3.9/site-packages/gators/scalers/scaler.pyx -.tox/py39-win/lib/python3.9/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/py39-win/lib/python3.9/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/py39-win/lib/python3.9/site-packages/gators/transformers/tests/test_transformer.py -.tox/py39-win/lib/python3.9/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/py39-win/lib/python3.9/site-packages/gators/util/tests/test_benchmark.py -.tox/py39-win/lib/python3.9/site-packages/gators/util/tests/test_util.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_anneal.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_criteria.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_domains.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_fmin.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_ipy.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_pchoice.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_plotting.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_progress.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_rand.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_randint.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_rdists.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_spark.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_tpe.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_vectorize.py -.tox/py39-win/lib/python3.9/site-packages/hyperopt/tests/test_webpage.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_async.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_connect.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_eventloop.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_io.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_kernel.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_message_spec.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py39-win/lib/python3.9/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py39-win/lib/python3.9/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py39-win/lib/python3.9/site-packages/ipython_genutils/tests/test_path.py -.tox/py39-win/lib/python3.9/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py39-win/lib/python3.9/site-packages/ipython_genutils/tests/test_text.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/tests/test_embed.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py39-win/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_backports.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_dask.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_deprecated_objects.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_disk.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_format_stack.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_func_inspect.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_hashing.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_init.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_logger.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_memmapping.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_memory.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_module.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_my_exceptions.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_numpy_pickle.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_parallel.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_store_backends.py -.tox/py39-win/lib/python3.9/site-packages/joblib/test/test_testing.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_cli.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_deprecations.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_exceptions.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_format.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_types.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/jsonschema/tests/test_validators.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_adapter.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_client.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_connect.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_manager.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_public_api.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_session.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_ssh.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_client/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_console/tests/test_console.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_core/tests/test_application.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_core/tests/test_command.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_core/tests/test_migrate.py -.tox/py39-win/lib/python3.9/site-packages/jupyter_core/tests/test_paths.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_afm.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_agg.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_animation.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_api.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_artist.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_axes.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_category.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_cbook.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_collections.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_colorbar.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_colors.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_compare_images.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_container.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_contour.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_cycles.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_dates.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_determinism.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_dviread.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_figure.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_font_manager.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_gridspec.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_image.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_legend.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_lines.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_marker.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_mathtext.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_mlab.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_patches.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_path.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_patheffects.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_pickle.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_png.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_polar.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_pyplot.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_quiver.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_rcparams.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_sankey.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_scale.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_simplification.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_skew.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_spines.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_streamplot.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_style.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_subplots.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_table.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_testing.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_texmanager.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_text.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_ticker.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_transforms.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_triangulation.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_ttconv.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_type1font.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_units.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_usetex.py -.tox/py39-win/lib/python3.9/site-packages/matplotlib/tests/test_widgets.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py39-win/lib/python3.9/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py39-win/lib/python3.9/site-packages/nbclient/tests/test_client.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/utils/tests/test_io.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/utils/tests/test_version.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/writers/tests/test_files.py -.tox/py39-win/lib/python3.9/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/corpus/tests/test_words.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/tests/test_api.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/tests/test_convert.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/tests/test_nbformat.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/tests/test_reader.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/tests/test_sign.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/tests/test_validator.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v1/tests/test_json.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v2/tests/test_json.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v3/tests/test_json.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v3/tests/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v4/tests/test_convert.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v4/tests/test_json.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py39-win/lib/python3.9/site-packages/nbformat/v4/tests/test_validate.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_core.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py39-win/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_digraph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_filters.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_function.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_graph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_ordered.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_special.py -.tox/py39-win/lib/python3.9/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py39-win/lib/python3.9/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/drawing/tests/test_layout.py -.tox/py39-win/lib/python3.9/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py39-win/lib/python3.9/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_atlas.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_classic.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_cographs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_community.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_directed.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_duplication.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_ego.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_expanders.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_geometric.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_intersection.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_lattice.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_line.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_small.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_trees.py -.tox/py39-win/lib/python3.9/site-packages/networkx/generators/tests/test_triads.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py39-win/lib/python3.9/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py39-win/lib/python3.9/site-packages/networkx/readwrite/tests/test_text.py -.tox/py39-win/lib/python3.9/site-packages/networkx/testing/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_all_random_functions.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_convert.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_convert_numpy.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_convert_pandas.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_convert_scipy.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_exceptions.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_import.py -.tox/py39-win/lib/python3.9/site-packages/networkx/tests/test_relabel.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test__init.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_heaps.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_rcm.py -.tox/py39-win/lib/python3.9/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py39-win/lib/python3.9/site-packages/notebook/auth/tests/test_login.py -.tox/py39-win/lib/python3.9/site-packages/notebook/auth/tests/test_security.py -.tox/py39-win/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py39-win/lib/python3.9/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py39-win/lib/python3.9/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/api/tests/test_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py39-win/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_config_manager.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_files.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_gateway.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_i18n.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_log.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_nbextensions.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_notebookapp.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_paths.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_serialize.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_serverextensions.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_traittypes.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_save.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py39-win/lib/python3.9/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py39-win/lib/python3.9/site-packages/numpy/__init__.cython-30.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/compat/tests/test_compat.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test__exceptions.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_abc.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_api.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_defchararray.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_deprecations.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_dtype.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_einsum.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_errstate.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_extint128.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_function_base.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_getlimits.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_half.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_item_selection.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_longdouble.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_machar.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_memmap.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_multiarray.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_nditer.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_numeric.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_overrides.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_print.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_protocols.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_records.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_shape_base.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_ufunc.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_umath.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py39-win/lib/python3.9/site-packages/numpy/core/tests/test_unicode.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py39-win/lib/python3.9/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_callback.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_kind.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_size.py -.tox/py39-win/lib/python3.9/site-packages/numpy/f2py/tests/test_string.py -.tox/py39-win/lib/python3.9/site-packages/numpy/fft/tests/test_helper.py -.tox/py39-win/lib/python3.9/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test__datasource.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test__iotools.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test__version.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_financial.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_format.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_function_base.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_histograms.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_io.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_mixins.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_packbits.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_type_check.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py39-win/lib/python3.9/site-packages/numpy/lib/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/numpy/linalg/tests/test_build.py -.tox/py39-win/lib/python3.9/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py39-win/lib/python3.9/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py39-win/lib/python3.9/site-packages/numpy/linalg/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_core.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_extras.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py39-win/lib/python3.9/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py39-win/lib/python3.9/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/random/_bounded_integers.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/random/_common.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/random/bit_generator.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/random/c_distributions.pxd -.tox/py39-win/lib/python3.9/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py39-win/lib/python3.9/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_direct.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_extending.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_random.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_randomstate.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py39-win/lib/python3.9/site-packages/numpy/random/tests/test_smoke.py -.tox/py39-win/lib/python3.9/site-packages/numpy/testing/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py39-win/lib/python3.9/site-packages/numpy/testing/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_ctypeslib.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_matlib.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_numpy_version.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_public_api.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_reloading.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_scripts.py -.tox/py39-win/lib/python3.9/site-packages/numpy/tests/test_warnings.py -.tox/py39-win/lib/python3.9/site-packages/numpydoc/tests/test_docscrape.py -.tox/py39-win/lib/python3.9/site-packages/numpydoc/tests/test_full.py -.tox/py39-win/lib/python3.9/site-packages/numpydoc/tests/test_main.py -.tox/py39-win/lib/python3.9/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py39-win/lib/python3.9/site-packages/numpydoc/tests/test_validate.py -.tox/py39-win/lib/python3.9/site-packages/numpydoc/tests/test_xref.py -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/algos.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/algos.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/arrays.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/arrays.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/groupby.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/hashing.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/hashtable.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/hashtable.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/index.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/indexing.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/internals.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/interval.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/join.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/khash.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/lib.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/lib.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/missing.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/missing.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/ops.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/parsers.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/properties.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/reduction.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/reshape.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/sparse.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/testing.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslib.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/util.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/writers.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/_libs/window/indexers.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/io/sas/sas.pyx -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_aggregation.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_algos.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_downstream.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_errors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_expressions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_flags.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_multilevel.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_nanops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_optional_dependency.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_register_accessor.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_sorting.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/test_take.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/api/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/api/test_types.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_array.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_conversion.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_transpose.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_unique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/base/test_value_counts.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/computation/test_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/computation/test_eval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/config/test_config.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/config/test_localization.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/test_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_boolean.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_extension.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_external_block.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_floating.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_integer.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_interval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_numpy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_sparse.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/test_string.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/json/test_json.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/extension/list/test_list.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_iteration.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_subclass.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_unary.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/test_validate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_finalize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_frame.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_generic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_series.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_apply.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_counting.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_filters.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_function.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_missing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_nth.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_rank.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_sample.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_size.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_base.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_engines.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_at.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_floats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_iat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_loc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_partial.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/internals/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/internals/test_internals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/internals/test_managers.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_clipboard.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_compression.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_date_converters.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_feather.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_fsspec.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_gbq.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_gcs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_html.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_orc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_parquet.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_pickle.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_s3.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_spss.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_sql.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_stata.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/test_user_agent.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_style.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_console.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_css.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_format.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_info.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_compression.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_header.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_network.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/libs/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/libs/test_lib.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_backend.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_converter.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_series.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/test_style.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_base.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_period_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_cut.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_melt.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/test_util.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/test_nat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_constructors.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_cumulative.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_iteration.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_missing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_reductions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_repr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_subclass.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_ufunc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_unary.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/test_validate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_align.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_append.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_between.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_count.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_item.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_round.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_update.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_values.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/series/methods/test_view.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_cat.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_extract.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_string_array.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/strings/test_strings.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tools/test_to_time.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_deprecate.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_doc.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_hashing.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_numba.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_safe_import.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_show_versions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_util.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_validate_args.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_apply.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_dtypes.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_ewm.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_expanding.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_groupby.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_numba.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_online.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_pairwise.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_rolling.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/test_win_type.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py39-win/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py39-win/lib/python3.9/site-packages/pyaml/tests/test_dump.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_compute.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_compute.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_csv.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_csv.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_cuda.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_cuda.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_dataset.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_feather.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_flight.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_fs.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_fs.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_hdfs.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_hdfsio.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_json.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_orc.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_orc.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_parquet.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_parquet.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_plasma.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/_s3fs.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/gandiva.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/lib.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/lib.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/common.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libarrow.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/includes/libplasma.pxd -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_array.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_builder.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_cffi.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_compute.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_csv.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_cuda.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_cython.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_dataset.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_deprecations.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_extension_type.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_feather.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_filesystem.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_flight.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_fs.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_gandiva.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_hdfs.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_io.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_ipc.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_json.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_jvm.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_memory.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_orc.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_pandas.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_plasma.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_scalars.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_schema.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_serialization.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_strategies.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_table.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_tensor.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_types.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/test_util.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py39-win/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_api.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_builtin.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_checker.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_code_segment.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_dict.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_doctests.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_imports.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_is_literal.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_match.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_other.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_type_annotations.py -.tox/py39-win/lib/python3.9/site-packages/pyflakes/test/test_undefined_names.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_app.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_comms.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py39-win/lib/python3.9/site-packages/qtconsole/tests/test_styles.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_macos_checks.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_main.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qt3drender.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtcharts.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtcore.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qthelp.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtlocation.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtqml.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtquick.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtserialport.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtsql.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtsvg.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qttest.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py39-win/lib/python3.9/site-packages/qtpy/tests/test_uic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/special.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test__util.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py39-win/lib/python3.9/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py39-win/lib/python3.9/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py39-win/lib/python3.9/site-packages/scipy/cluster/tests/test_vq.py -.tox/py39-win/lib/python3.9/site-packages/scipy/constants/tests/test_codata.py -.tox/py39-win/lib/python3.9/site-packages/scipy/constants/tests/test_constants.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_backend.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_helper.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_numpy.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fftpack/tests/test_import.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py39-win/lib/python3.9/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/tests/test_fortran.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/tests/test_idl.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/tests/test_mmio.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/tests/test_netcdf.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/tests/test_paths.py -.tox/py39-win/lib/python3.9/site-packages/scipy/io/tests/test_wavfile.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/cython_blas.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_blas.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_build.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_misc.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py39-win/lib/python3.9/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py39-win/lib/python3.9/site-packages/scipy/misc/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/scipy/misc/tests/test_doccer.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py39-win/lib/python3.9/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py39-win/lib/python3.9/site-packages/scipy/odr/tests/test_odr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__root.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py39-win/lib/python3.9/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_result_type.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_spectral.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py39-win/lib/python3.9/site-packages/scipy/signal/tests/test_windows.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_construct.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_csc.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_csr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_extract.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test_distance.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py39-win/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/cython_special.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_bdtr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_boxcox.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_cdflib.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_cython_special.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_data.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_digamma.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_erfinv.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_gamma.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_gammainc.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_lambertw.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_loggamma.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_logit.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_mpmath.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_ndtr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_owens_t.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_pcf.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_pdtr.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_round.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_sf_error.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_sici.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_spence.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_trig.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py39-win/lib/python3.9/site-packages/scipy/special/tests/test_zeta.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/biasedurn.pxd -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_contingency.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_distributions.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_entropy.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_fit.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_morestats.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_qmc.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_rank.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_stats.py -.tox/py39-win/lib/python3.9/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_algorithms.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_axisgrid.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_categorical.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_core.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_distributions.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_docstrings.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_matrix.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_miscplot.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_palettes.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_rcmod.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_relational.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_statistics.py -.tox/py39-win/lib/python3.9/site-packages/seaborn/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/compose/tests/test_target.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/impute/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/impute/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/impute/tests/test_impute.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/impute/tests/test_knn.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/svm/tests/test_svm.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_base.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_build.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_calibration.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_check_build.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_common.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_config.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_dummy.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_init.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_isotonic.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_metaestimators.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_multiclass.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_multioutput.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_pipeline.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tests/test_random_projection.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/_criterion.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/_splitter.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/_tree.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/_utils.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/tests/test_export.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/tree/tests/test_tree.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/_random.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/murmurhash.pxd -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_random.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_testing.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_utils.py -.tox/py39-win/lib/python3.9/site-packages/sklearn/utils/tests/test_validation.py -.tox/py39-win/lib/python3.9/site-packages/tests/test_config.py -.tox/py39-win/lib/python3.9/site-packages/tests/test_core.py -.tox/py39-win/lib/python3.9/site-packages/tests/test_linters.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/config/tests/test_application.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/config/tests/test_configurable.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/config/tests/test_loader.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/tests/test_traitlets.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py39-win/lib/python3.9/site-packages/wcwidth/tests/test_core.py -.tox/py39-win/lib/python3.9/site-packages/zmq/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/backend/cython/__init__.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/backend/cython/context.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/backend/cython/message.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/backend/cython/socket.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_asyncio.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_auth.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_cffi_backend.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_constants.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_context.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_cython.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_decorators.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_device.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_draft.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_error.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_etc.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_future.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_imports.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_includes.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_ioloop.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_log.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_message.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_monitor.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_monqueue.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_multipart.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_mypy.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_pair.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_poll.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_pubsub.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_reqrep.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_retry_eintr.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_security.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_socket.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_ssh.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_version.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_win32_shim.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_z85.py -.tox/py39-win/lib/python3.9/site-packages/zmq/tests/test_zmqstream.py -.tox/py39-win/lib/python3.9/site-packages/zmq/utils/buffers.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Compiler/Code.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Compiler/FlowControl.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Compiler/Parsing.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Compiler/Scanning.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Compiler/Visitor.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/py39/lib/python3.9/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/py39/lib/python3.9/site-packages/Cython/Includes/openmp.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/array.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/bool.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/complex.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/dict.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/exc.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/float.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/function.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/instance.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/int.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/list.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/long.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/mem.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/method.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/module.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/number.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/object.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/ref.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/set.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/slice.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/string.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/type.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/version.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/__init__.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/errno.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/float.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/limits.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/locale.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/math.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/signal.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/stddef.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/stdint.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/stdio.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/string.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libc/time.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/list.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/map.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/set.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/string.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/numpy/math.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/__init__.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/mman.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/resource.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/select.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/signal.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/stat.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/stdio.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/strings.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/time.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/types.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/unistd.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Includes/posix/wait.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Plex/Actions.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Plex/Scanners.pxd -.tox/py39/lib/python3.9/site-packages/Cython/Runtime/refnanny.pyx -.tox/py39/lib/python3.9/site-packages/Cython/Utility/CConvert.pyx -.tox/py39/lib/python3.9/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/py39/lib/python3.9/site-packages/Cython/Utility/CppConvert.pyx -.tox/py39/lib/python3.9/site-packages/Cython/Utility/MemoryView.pyx -.tox/py39/lib/python3.9/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/py39/lib/python3.9/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_alias.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_application.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_async_helpers.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_autocall.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_compilerop.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_completer.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_completerlib.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_debugger.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_display.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_displayhook.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_events.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_extension.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_formatters.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_handlers.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_history.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_hooks.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_imports.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_iplib.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_logger.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_magic.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_oinspect.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_page.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_paths.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_prefilter.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_profile.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_prompts.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_pylabtools.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_run.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_shellapp.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_splitinput.py -.tox/py39/lib/python3.9/site-packages/IPython/core/tests/test_ultratb.py -.tox/py39/lib/python3.9/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/py39/lib/python3.9/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_clipboard.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_deepreload.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_display.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_imports.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_latextools.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_lexers.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_pretty.py -.tox/py39/lib/python3.9/site-packages/IPython/lib/tests/test_security.py -.tox/py39/lib/python3.9/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/py39/lib/python3.9/site-packages/IPython/terminal/tests/test_embed.py -.tox/py39/lib/python3.9/site-packages/IPython/terminal/tests/test_help.py -.tox/py39/lib/python3.9/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/py39/lib/python3.9/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/py39/lib/python3.9/site-packages/IPython/testing/plugin/test_refs.py -.tox/py39/lib/python3.9/site-packages/IPython/testing/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/py39/lib/python3.9/site-packages/IPython/testing/tests/test_tools.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_capture.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_dir2.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_imports.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_importstring.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_io.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_module_paths.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_openpy.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_path.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_process.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_tempdir.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_text.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/py39/lib/python3.9/site-packages/IPython/utils/tests/test_wildcard.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/py39/lib/python3.9/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_check.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_classdef.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_detect.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_diff.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_extendpickle.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_fglobals.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_file.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_functions.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_functors.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_mixins.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_module.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_moduledict.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_nested.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_objects.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_properties.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_recursive.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_restricted.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_selected.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_source.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_temp.py -.tox/py39/lib/python3.9/site-packages/dill/tests/test_weakref.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_de.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_gaussian.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_kde.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_longdouble.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_proposal.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_stretch.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/integration/test_walk.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_autocorr.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_backends.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_blobs.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_ensemble.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_sampler.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_state.py -.tox/py39/lib/python3.9/site-packages/emcee/tests/unit/test_stretch.py -.tox/py39/lib/python3.9/site-packages/hyperopt/pyll/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_anneal.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_criteria.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_domains.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_fmin.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_ipy.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_mongoexp.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_pchoice.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_plotting.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_progress.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_rand.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_randint.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_rdists.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_spark.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_tpe.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_vectorize.py -.tox/py39/lib/python3.9/site-packages/hyperopt/tests/test_webpage.py -.tox/py39/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/py39/lib/python3.9/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_async.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_connect.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_eventloop.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_heartbeat.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_io.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_jsonutil.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_kernel.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_kernelspec.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_message_spec.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_pickleutil.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_start_kernel.py -.tox/py39/lib/python3.9/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/py39/lib/python3.9/site-packages/ipython_genutils/tests/test_importstring.py -.tox/py39/lib/python3.9/site-packages/ipython_genutils/tests/test_path.py -.tox/py39/lib/python3.9/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/py39/lib/python3.9/site-packages/ipython_genutils/tests/test_text.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/tests/test_embed.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/py39/lib/python3.9/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_backports.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_dask.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_deprecated_objects.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_disk.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_format_stack.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_func_inspect.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_hashing.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_init.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_logger.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_memmapping.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_memory.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_module.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_my_exceptions.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_numpy_pickle.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_parallel.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_store_backends.py -.tox/py39/lib/python3.9/site-packages/joblib/test/test_testing.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_cli.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_deprecations.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_exceptions.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_format.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_types.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/jsonschema/tests/test_validators.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_adapter.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_client.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_connect.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_manager.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_provisioning.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_public_api.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_session.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_ssh.py -.tox/py39/lib/python3.9/site-packages/jupyter_client/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/jupyter_console/tests/test_console.py -.tox/py39/lib/python3.9/site-packages/jupyter_console/tests/test_image_handler.py -.tox/py39/lib/python3.9/site-packages/jupyter_core/tests/test_application.py -.tox/py39/lib/python3.9/site-packages/jupyter_core/tests/test_command.py -.tox/py39/lib/python3.9/site-packages/jupyter_core/tests/test_migrate.py -.tox/py39/lib/python3.9/site-packages/jupyter_core/tests/test_paths.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_afm.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_agg.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_agg_filter.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_animation.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_api.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_artist.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_axes.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_bases.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_ps.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_qt.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_svg.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_tk.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_tools.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_basic.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_category.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_cbook.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_collections.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_colorbar.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_colors.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_compare_images.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_container.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_contour.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_cycles.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_dates.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_determinism.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_dviread.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_figure.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_font_manager.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_gridspec.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_image.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_legend.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_lines.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_marker.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_mathtext.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_matplotlib.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_mlab.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_offsetbox.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_patches.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_path.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_patheffects.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_pickle.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_png.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_polar.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_pyplot.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_quiver.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_rcparams.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_sankey.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_scale.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_simplification.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_skew.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_sphinxext.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_spines.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_streamplot.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_style.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_subplots.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_table.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_testing.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_texmanager.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_text.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_ticker.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_tightlayout.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_transforms.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_triangulation.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_ttconv.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_type1font.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_units.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_usetex.py -.tox/py39/lib/python3.9/site-packages/matplotlib/tests/test_widgets.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/py39/lib/python3.9/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/py39/lib/python3.9/site-packages/nbclient/tests/test_client.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_export.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_html.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_python.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_script.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/py39/lib/python3.9/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_citation.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_latex.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/py39/lib/python3.9/site-packages/nbconvert/filters/tests/test_strings.py -.tox/py39/lib/python3.9/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/py39/lib/python3.9/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/py39/lib/python3.9/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/py39/lib/python3.9/site-packages/nbconvert/utils/tests/test_io.py -.tox/py39/lib/python3.9/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/py39/lib/python3.9/site-packages/nbconvert/utils/tests/test_version.py -.tox/py39/lib/python3.9/site-packages/nbconvert/writers/tests/test_debug.py -.tox/py39/lib/python3.9/site-packages/nbconvert/writers/tests/test_files.py -.tox/py39/lib/python3.9/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/py39/lib/python3.9/site-packages/nbformat/corpus/tests/test_words.py -.tox/py39/lib/python3.9/site-packages/nbformat/tests/test_api.py -.tox/py39/lib/python3.9/site-packages/nbformat/tests/test_convert.py -.tox/py39/lib/python3.9/site-packages/nbformat/tests/test_nbformat.py -.tox/py39/lib/python3.9/site-packages/nbformat/tests/test_reader.py -.tox/py39/lib/python3.9/site-packages/nbformat/tests/test_sign.py -.tox/py39/lib/python3.9/site-packages/nbformat/tests/test_validator.py -.tox/py39/lib/python3.9/site-packages/nbformat/v1/tests/test_json.py -.tox/py39/lib/python3.9/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/py39/lib/python3.9/site-packages/nbformat/v2/tests/test_json.py -.tox/py39/lib/python3.9/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/py39/lib/python3.9/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/py39/lib/python3.9/site-packages/nbformat/v3/tests/test_json.py -.tox/py39/lib/python3.9/site-packages/nbformat/v3/tests/test_misc.py -.tox/py39/lib/python3.9/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/py39/lib/python3.9/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/py39/lib/python3.9/site-packages/nbformat/v4/tests/test_convert.py -.tox/py39/lib/python3.9/site-packages/nbformat/v4/tests/test_json.py -.tox/py39/lib/python3.9/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/py39/lib/python3.9/site-packages/nbformat/v4/tests/test_validate.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_chains.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_clique.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_core.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_covering.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_dag.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_euler.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_matching.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_mis.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_moral.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_regular.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_swap.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_triads.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/py39/lib/python3.9/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_coreviews.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_digraph.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_filters.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_function.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_graph.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_graphviews.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_multigraph.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_ordered.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_reportviews.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_special.py -.tox/py39/lib/python3.9/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/py39/lib/python3.9/site-packages/networkx/drawing/tests/test_agraph.py -.tox/py39/lib/python3.9/site-packages/networkx/drawing/tests/test_layout.py -.tox/py39/lib/python3.9/site-packages/networkx/drawing/tests/test_pydot.py -.tox/py39/lib/python3.9/site-packages/networkx/drawing/tests/test_pylab.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_atlas.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_classic.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_cographs.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_community.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_directed.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_duplication.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_ego.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_expanders.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_geometric.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_intersection.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_lattice.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_line.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_mycielski.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_small.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_stochastic.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_sudoku.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_trees.py -.tox/py39/lib/python3.9/site-packages/networkx/generators/tests/test_triads.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_modularity.py -.tox/py39/lib/python3.9/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_gml.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_leda.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_shp.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/py39/lib/python3.9/site-packages/networkx/readwrite/tests/test_text.py -.tox/py39/lib/python3.9/site-packages/networkx/testing/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_all_random_functions.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_convert.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_convert_numpy.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_convert_pandas.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_convert_scipy.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_exceptions.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_import.py -.tox/py39/lib/python3.9/site-packages/networkx/tests/test_relabel.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test__init.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_heaps.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_misc.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_rcm.py -.tox/py39/lib/python3.9/site-packages/networkx/utils/tests/test_unionfind.py -.tox/py39/lib/python3.9/site-packages/notebook/auth/tests/test_login.py -.tox/py39/lib/python3.9/site-packages/notebook/auth/tests/test_security.py -.tox/py39/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/py39/lib/python3.9/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/py39/lib/python3.9/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/py39/lib/python3.9/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/py39/lib/python3.9/site-packages/notebook/services/api/tests/test_api.py -.tox/py39/lib/python3.9/site-packages/notebook/services/config/tests/test_config_api.py -.tox/py39/lib/python3.9/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/py39/lib/python3.9/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/py39/lib/python3.9/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/py39/lib/python3.9/site-packages/notebook/services/contents/tests/test_manager.py -.tox/py39/lib/python3.9/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/py39/lib/python3.9/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/py39/lib/python3.9/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/py39/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/py39/lib/python3.9/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/py39/lib/python3.9/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_config_manager.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_files.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_gateway.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_i18n.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_log.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_nbextensions.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_notebookapp.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_paths.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_serialize.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_serverextensions.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_traittypes.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_buffering.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_display_image.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_markdown.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_notifications.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_save.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/py39/lib/python3.9/site-packages/notebook/tests/selenium/test_undelete.py -.tox/py39/lib/python3.9/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/py39/lib/python3.9/site-packages/numpy/__init__.cython-30.pxd -.tox/py39/lib/python3.9/site-packages/numpy/__init__.pxd -.tox/py39/lib/python3.9/site-packages/numpy/compat/tests/test_compat.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test__exceptions.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_abc.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_api.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_arrayprint.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_cpu_features.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_datetime.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_defchararray.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_deprecations.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_dtype.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_einsum.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_errstate.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_extint128.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_function_base.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_getlimits.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_half.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_indexerrors.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_indexing.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_item_selection.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_longdouble.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_machar.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_memmap.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_multiarray.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_nditer.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_numeric.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_numerictypes.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_overrides.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_print.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_protocols.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_records.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_scalarmath.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_scalarprint.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_shape_base.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_ufunc.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_umath.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_umath_complex.py -.tox/py39/lib/python3.9/site-packages/numpy/core/tests/test_unicode.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_from_template.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/py39/lib/python3.9/site-packages/numpy/distutils/tests/test_system_info.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_callback.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_kind.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_mixed.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_parameter.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_return_character.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_return_real.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_size.py -.tox/py39/lib/python3.9/site-packages/numpy/f2py/tests/test_string.py -.tox/py39/lib/python3.9/site-packages/numpy/fft/tests/test_helper.py -.tox/py39/lib/python3.9/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test__datasource.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test__iotools.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test__version.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_arraypad.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_financial.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_format.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_function_base.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_histograms.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_io.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_mixins.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_packbits.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_polynomial.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_shape_base.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_type_check.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/py39/lib/python3.9/site-packages/numpy/lib/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/numpy/linalg/tests/test_build.py -.tox/py39/lib/python3.9/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/py39/lib/python3.9/site-packages/numpy/linalg/tests/test_linalg.py -.tox/py39/lib/python3.9/site-packages/numpy/linalg/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_core.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_deprecations.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_extras.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_mrecords.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_old_ma.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/ma/tests/test_subclassing.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/py39/lib/python3.9/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_classes.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/py39/lib/python3.9/site-packages/numpy/polynomial/tests/test_printing.py -.tox/py39/lib/python3.9/site-packages/numpy/random/__init__.pxd -.tox/py39/lib/python3.9/site-packages/numpy/random/_bounded_integers.pxd -.tox/py39/lib/python3.9/site-packages/numpy/random/_common.pxd -.tox/py39/lib/python3.9/site-packages/numpy/random/bit_generator.pxd -.tox/py39/lib/python3.9/site-packages/numpy/random/c_distributions.pxd -.tox/py39/lib/python3.9/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/py39/lib/python3.9/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_direct.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_extending.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_random.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_randomstate.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/py39/lib/python3.9/site-packages/numpy/random/tests/test_smoke.py -.tox/py39/lib/python3.9/site-packages/numpy/testing/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/numpy/testing/tests/test_doctesting.py -.tox/py39/lib/python3.9/site-packages/numpy/testing/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_ctypeslib.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_matlib.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_numpy_version.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_public_api.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_reloading.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_scripts.py -.tox/py39/lib/python3.9/site-packages/numpy/tests/test_warnings.py -.tox/py39/lib/python3.9/site-packages/numpydoc/tests/test_docscrape.py -.tox/py39/lib/python3.9/site-packages/numpydoc/tests/test_full.py -.tox/py39/lib/python3.9/site-packages/numpydoc/tests/test_main.py -.tox/py39/lib/python3.9/site-packages/numpydoc/tests/test_numpydoc.py -.tox/py39/lib/python3.9/site-packages/numpydoc/tests/test_validate.py -.tox/py39/lib/python3.9/site-packages/numpydoc/tests/test_xref.py -.tox/py39/lib/python3.9/site-packages/pandas/_libs/algos.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/algos.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/arrays.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/arrays.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/groupby.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/hashing.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/hashtable.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/hashtable.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/index.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/indexing.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/internals.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/interval.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/join.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/khash.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/lib.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/lib.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/missing.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/missing.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/ops.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/parsers.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/properties.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/reduction.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/reshape.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/sparse.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/testing.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslib.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/util.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/writers.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/base.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/period.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/util.pxd -.tox/py39/lib/python3.9/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/window/aggregations.pyx -.tox/py39/lib/python3.9/site-packages/pandas/_libs/window/indexers.pyx -.tox/py39/lib/python3.9/site-packages/pandas/io/sas/sas.pyx -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_aggregation.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_algos.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_downstream.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_errors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_expressions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_flags.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_multilevel.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_nanops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_optional_dependency.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_register_accessor.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_sorting.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/test_take.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/api/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/api/test_types.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/apply/test_series_transform.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_object.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_array.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_numpy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_conversion.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_misc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_transpose.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_unique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/base/test_value_counts.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/computation/test_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/computation/test_eval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/config/test_config.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/config/test_localization.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/construction/test_extract_array.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/test_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/test_concat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/test_generic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/test_inference.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/test_missing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_boolean.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_extension.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_external_block.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_floating.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_integer.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_interval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_numpy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_sparse.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/test_string.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/json/test_json.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/extension/list/test_list.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_block_internals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_cumulative.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_iteration.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_query_eval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_repr_info.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_subclass.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_ufunc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_unary.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/test_validate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_align.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_append.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_round.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_update.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/frame/methods/test_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_finalize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_frame.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_generic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_series.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_any_all.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_apply.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_counting.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_filters.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_function.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_grouping.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_min_max.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_missing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_nth.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_nunique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_pipe.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_quantile.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_rank.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_sample.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_size.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_any_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_base.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_engines.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_frozen.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_index_new.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_at.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_coercion.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_floats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_iat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_iloc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_indexers.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_loc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_partial.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/test_scalar.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/internals/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/internals/test_internals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/internals/test_managers.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_clipboard.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_compression.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_date_converters.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_feather.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_fsspec.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_gbq.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_gcs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_html.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_orc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_parquet.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_pickle.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_s3.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_spss.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_sql.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_stata.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/test_user_agent.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_odf.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_readers.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_style.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_writers.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_console.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_css.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_format.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_info.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_printing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_compression.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_normalize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_pandas.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_readlines.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/json/test_ujson.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_comment.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_compression.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_converters.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_header.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_network.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_append.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_put.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_read.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_select.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_store.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/sas/test_xport.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/io/xml/test_xml.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/libs/test_hashtable.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/libs/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/libs/test_lib.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_backend.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_converter.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_groupby.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_misc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_series.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/test_style.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reductions/test_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_base.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_deprecated.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_period_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_resample_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/resample/test_timedelta.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_cut.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_melt.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_qcut.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/test_util.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/test_nat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/period/test_period.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_arithmetic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_constructors.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_cumulative.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_iteration.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_logical_ops.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_missing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_npfuncs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_reductions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_repr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_subclass.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_ufunc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_unary.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/test_validate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_get.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_take.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_where.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_align.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_append.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_asof.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_astype.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_between.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_clip.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_compare.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_copy.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_count.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_describe.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_diff.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_equals.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_explode.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_isin.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_isna.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_item.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_pop.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_rank.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_replace.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_round.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_shift.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_unique.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_update.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_values.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/series/methods/test_view.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_case_justify.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_cat.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_extract.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_find_replace.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_split_partition.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_string_array.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/strings/test_strings.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tools/test_to_time.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_fields.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_deprecate.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_doc.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_hashing.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_numba.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_safe_import.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_show_versions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_util.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_validate_args.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_api.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_apply.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_base_indexer.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_dtypes.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_ewm.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_expanding.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_groupby.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_numba.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_online.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_pairwise.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_rolling.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/test_win_type.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/py39/lib/python3.9/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/py39/lib/python3.9/site-packages/pyaml/tests/test_dump.py -.tox/py39/lib/python3.9/site-packages/pyarrow/__init__.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_compute.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_compute.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_csv.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_csv.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_cuda.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_cuda.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_dataset.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_dataset.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_dataset_orc.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_feather.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_flight.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_fs.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_fs.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_hdfs.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_hdfsio.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_json.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_orc.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_orc.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_parquet.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/_parquet.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_plasma.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/_s3fs.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/gandiva.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/lib.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/lib.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/__init__.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/common.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libarrow.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libgandiva.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/includes/libplasma.pxd -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_array.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_builder.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_cffi.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_compute.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_csv.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_cuda.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_cython.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_dataset.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_deprecations.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_extension_type.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_feather.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_filesystem.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_flight.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_fs.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_gandiva.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_hdfs.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_io.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_ipc.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_json.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_jvm.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_memory.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_misc.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_orc.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_pandas.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_plasma.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_scalars.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_schema.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_serialization.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_strategies.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_table.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_tensor.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_types.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/test_util.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/py39/lib/python3.9/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_api.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_builtin.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_checker.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_code_segment.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_dict.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_doctests.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_imports.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_is_literal.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_match.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_other.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_type_annotations.py -.tox/py39/lib/python3.9/site-packages/pyflakes/test/test_undefined_names.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_app.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_comms.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_completion_widget.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_kill_ring.py -.tox/py39/lib/python3.9/site-packages/qtconsole/tests/test_styles.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_macos_checks.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_main.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qt3danimation.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qt3dcore.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qt3dextras.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qt3dinput.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qt3drender.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtcharts.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtcore.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtdesigner.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qthelp.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtlocation.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtnetwork.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtpositioning.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtqml.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtquick.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtserialport.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtsql.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtsvg.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qttest.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtwinextras.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/py39/lib/python3.9/site-packages/qtpy/tests/test_uic.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize.pxd -.tox/py39/lib/python3.9/site-packages/scipy/special.pxd -.tox/py39/lib/python3.9/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test__pep440.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test__testutils.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test__util.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test_bunch.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/py39/lib/python3.9/site-packages/scipy/_lib/tests/test_warnings.py -.tox/py39/lib/python3.9/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/py39/lib/python3.9/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/py39/lib/python3.9/site-packages/scipy/cluster/tests/test_vq.py -.tox/py39/lib/python3.9/site-packages/scipy/constants/tests/test_codata.py -.tox/py39/lib/python3.9/site-packages/scipy/constants/tests/test_constants.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_backend.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_fft_function.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_fftlog.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_helper.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_multithreading.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_numpy.py -.tox/py39/lib/python3.9/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/py39/lib/python3.9/site-packages/scipy/fftpack/tests/test_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/fftpack/tests/test_helper.py -.tox/py39/lib/python3.9/site-packages/scipy/fftpack/tests/test_import.py -.tox/py39/lib/python3.9/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/py39/lib/python3.9/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test_bvp.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test_integrate.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/py39/lib/python3.9/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_gil.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_pade.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/py39/lib/python3.9/site-packages/scipy/interpolate/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/py39/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/py39/lib/python3.9/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/py39/lib/python3.9/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/py39/lib/python3.9/site-packages/scipy/io/tests/test_fortran.py -.tox/py39/lib/python3.9/site-packages/scipy/io/tests/test_idl.py -.tox/py39/lib/python3.9/site-packages/scipy/io/tests/test_mmio.py -.tox/py39/lib/python3.9/site-packages/scipy/io/tests/test_netcdf.py -.tox/py39/lib/python3.9/site-packages/scipy/io/tests/test_paths.py -.tox/py39/lib/python3.9/site-packages/scipy/io/tests/test_wavfile.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/cython_blas.pxd -.tox/py39/lib/python3.9/site-packages/scipy/linalg/cython_lapack.pxd -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_blas.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_build.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_fblas.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_lapack.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_misc.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_sketches.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_solvers.py -.tox/py39/lib/python3.9/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/py39/lib/python3.9/site-packages/scipy/misc/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/scipy/misc/tests/test_doccer.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_filters.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/py39/lib/python3.9/site-packages/scipy/ndimage/tests/test_splines.py -.tox/py39/lib/python3.9/site-packages/scipy/odr/tests/test_odr.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/cython_optimize.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__root.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__shgo.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test__spectral.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_constraints.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_linprog.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_minpack.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_nnls.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_optimize.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_tnc.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/py39/lib/python3.9/site-packages/scipy/optimize/tests/test_zeros.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_array_tools.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_bsplines.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_dltisys.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_filter_design.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_ltisys.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_result_type.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_signaltools.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_spectral.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_waveforms.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_wavelets.py -.tox/py39/lib/python3.9/site-packages/scipy/signal/tests/test_windows.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_construct.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_csc.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_csr.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_extract.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/py39/lib/python3.9/site-packages/scipy/sparse/tests/test_sputils.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test_distance.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test_qhull.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test_slerp.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/py39/lib/python3.9/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/py39/lib/python3.9/site-packages/scipy/special/cython_special.pxd -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_bdtr.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_boxcox.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_cdflib.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_cython_special.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_data.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_digamma.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_erfinv.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_faddeeva.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_gamma.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_gammainc.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_lambertw.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_log_softmax.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_loggamma.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_logit.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_logsumexp.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_mpmath.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_ndtr.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_owens_t.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_pcf.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_pdtr.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_round.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_sf_error.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_sici.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_spence.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_sph_harm.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_trig.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_wrightomega.py -.tox/py39/lib/python3.9/site-packages/scipy/special/tests/test_zeta.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/biasedurn.pxd -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_contingency.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_crosstab.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_distributions.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_entropy.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_fit.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_hypotests.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_morestats.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_multivariate.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_qmc.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_rank.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_stats.py -.tox/py39/lib/python3.9/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_algorithms.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_axisgrid.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_categorical.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_core.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_distributions.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_docstrings.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_matrix.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_miscplot.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_palettes.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_rcmod.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_relational.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_statistics.py -.tox/py39/lib/python3.9/site-packages/seaborn/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_birch.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_optics.py -.tox/py39/lib/python3.9/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/py39/lib/python3.9/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/py39/lib/python3.9/site-packages/sklearn/compose/tests/test_target.py -.tox/py39/lib/python3.9/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/py39/lib/python3.9/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/py39/lib/python3.9/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/py39/lib/python3.9/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/py39/lib/python3.9/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_20news.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_openml.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/py39/lib/python3.9/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/py39/lib/python3.9/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/py39/lib/python3.9/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/py39/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/py39/lib/python3.9/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/py39/lib/python3.9/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/py39/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/py39/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/py39/lib/python3.9/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/py39/lib/python3.9/site-packages/sklearn/impute/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/impute/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/impute/tests/test_impute.py -.tox/py39/lib/python3.9/site-packages/sklearn/impute/tests/test_knn.py -.tox/py39/lib/python3.9/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/py39/lib/python3.9/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/py39/lib/python3.9/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/py39/lib/python3.9/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/py39/lib/python3.9/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/py39/lib/python3.9/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/py39/lib/python3.9/site-packages/sklearn/manifold/tests/test_mds.py -.tox/py39/lib/python3.9/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/py39/lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/tests/test_classification.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/tests/test_regression.py -.tox/py39/lib/python3.9/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/py39/lib/python3.9/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/py39/lib/python3.9/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/py39/lib/python3.9/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/py39/lib/python3.9/site-packages/sklearn/model_selection/tests/test_search.py -.tox/py39/lib/python3.9/site-packages/sklearn/model_selection/tests/test_split.py -.tox/py39/lib/python3.9/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/py39/lib/python3.9/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/py39/lib/python3.9/site-packages/sklearn/neural_network/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/py39/lib/python3.9/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/py39/lib/python3.9/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/py39/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/py39/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/py39/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/py39/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/py39/lib/python3.9/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/py39/lib/python3.9/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/py39/lib/python3.9/site-packages/sklearn/svm/tests/test_bounds.py -.tox/py39/lib/python3.9/site-packages/sklearn/svm/tests/test_sparse.py -.tox/py39/lib/python3.9/site-packages/sklearn/svm/tests/test_svm.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_base.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_build.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_calibration.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_check_build.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_common.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_config.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_dummy.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_import_deprecations.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_init.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_isotonic.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_metaestimators.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_multiclass.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_multioutput.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_naive_bayes.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_pipeline.py -.tox/py39/lib/python3.9/site-packages/sklearn/tests/test_random_projection.py -.tox/py39/lib/python3.9/site-packages/sklearn/tree/_criterion.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/tree/_splitter.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/tree/_tree.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/tree/_utils.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/tree/tests/test_export.py -.tox/py39/lib/python3.9/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/py39/lib/python3.9/site-packages/sklearn/tree/tests/test_tree.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/_cython_blas.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/utils/_fast_dict.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/utils/_random.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/utils/_weight_vector.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/utils/murmurhash.pxd -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_extmath.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_fixes.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_optimize.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_pprint.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_random.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_testing.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_utils.py -.tox/py39/lib/python3.9/site-packages/sklearn/utils/tests/test_validation.py -.tox/py39/lib/python3.9/site-packages/tests/test_config.py -.tox/py39/lib/python3.9/site-packages/tests/test_core.py -.tox/py39/lib/python3.9/site-packages/tests/test_linters.py -.tox/py39/lib/python3.9/site-packages/traitlets/config/tests/test_application.py -.tox/py39/lib/python3.9/site-packages/traitlets/config/tests/test_configurable.py -.tox/py39/lib/python3.9/site-packages/traitlets/config/tests/test_loader.py -.tox/py39/lib/python3.9/site-packages/traitlets/tests/test_traitlets.py -.tox/py39/lib/python3.9/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/py39/lib/python3.9/site-packages/traitlets/utils/tests/test_bunch.py -.tox/py39/lib/python3.9/site-packages/traitlets/utils/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/traitlets/utils/tests/test_importstring.py -.tox/py39/lib/python3.9/site-packages/wcwidth/tests/test_core.py -.tox/py39/lib/python3.9/site-packages/zmq/__init__.pxd -.tox/py39/lib/python3.9/site-packages/zmq/backend/cython/__init__.pxd -.tox/py39/lib/python3.9/site-packages/zmq/backend/cython/checkrc.pxd -.tox/py39/lib/python3.9/site-packages/zmq/backend/cython/context.pxd -.tox/py39/lib/python3.9/site-packages/zmq/backend/cython/libzmq.pxd -.tox/py39/lib/python3.9/site-packages/zmq/backend/cython/message.pxd -.tox/py39/lib/python3.9/site-packages/zmq/backend/cython/socket.pxd -.tox/py39/lib/python3.9/site-packages/zmq/devices/monitoredqueue.pxd -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_asyncio.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_auth.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_cffi_backend.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_constants.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_context.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_cython.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_decorators.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_device.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_draft.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_error.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_etc.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_future.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_imports.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_includes.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_ioloop.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_log.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_message.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_monitor.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_monqueue.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_multipart.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_mypy.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_pair.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_poll.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_proxy_steerable.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_pubsub.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_reqrep.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_retry_eintr.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_security.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_socket.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_ssh.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_version.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_win32_shim.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_z85.py -.tox/py39/lib/python3.9/site-packages/zmq/tests/test_zmqstream.py -.tox/py39/lib/python3.9/site-packages/zmq/utils/buffers.pxd -.tox/python/lib/python3.8/site-packages/Cython/Compiler/Code.pxd -.tox/python/lib/python3.8/site-packages/Cython/Compiler/FlowControl.pxd -.tox/python/lib/python3.8/site-packages/Cython/Compiler/ParseTreeTransforms.pxd -.tox/python/lib/python3.8/site-packages/Cython/Compiler/Parsing.pxd -.tox/python/lib/python3.8/site-packages/Cython/Compiler/Scanning.pxd -.tox/python/lib/python3.8/site-packages/Cython/Compiler/Visitor.pxd -.tox/python/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.py -.tox/python/lib/python3.8/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.py -.tox/python/lib/python3.8/site-packages/Cython/Includes/openmp.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bool.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_buffer.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_bytes.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_cobject.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_complex.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_dict.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_exc.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_float.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_function.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_getargs.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_instance.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_int.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_iterator.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_list.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_long.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mapping.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_mem.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_method.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_module.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_number.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_object.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_oldbuffer.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_pycapsule.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_ref.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_sequence.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_set.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_string.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_tuple.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_type.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_unicode.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_version.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/python_weakref.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdio.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/stdlib.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/Deprecated/stl.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/__init__.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/array.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/bool.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/buffer.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/bytearray.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/bytes.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/cellobject.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/ceval.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/cobject.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/codecs.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/complex.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/conversion.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/datetime.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/dict.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/exc.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/float.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/function.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/genobject.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/getargs.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/instance.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/int.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/iterator.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/iterobject.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/list.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/long.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/longintrepr.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/mapping.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/mem.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/memoryview.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/method.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/module.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/number.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/object.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/oldbuffer.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/pycapsule.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/pylifecycle.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/pystate.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/pythread.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/ref.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/sequence.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/set.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/slice.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/string.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/tuple.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/unicode.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/version.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/cpython/weakref.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/__init__.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/errno.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/float.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/limits.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/locale.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/math.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/setjmp.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/signal.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/stddef.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/stdint.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/stdio.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/stdlib.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/string.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libc/time.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/__init__.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/algorithm.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/cast.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/complex.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/deque.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/forward_list.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/functional.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/iterator.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/limits.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/list.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/map.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/memory.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/pair.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/queue.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/set.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/stack.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/string.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/typeindex.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/typeinfo.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_map.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/unordered_set.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/utility.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/libcpp/vector.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/numpy/__init__.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/numpy/math.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/__init__.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/dlfcn.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/fcntl.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/ioctl.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/mman.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/resource.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/select.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/signal.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/stat.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/stdio.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/stdlib.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/strings.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/time.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/types.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/unistd.pxd -.tox/python/lib/python3.8/site-packages/Cython/Includes/posix/wait.pxd -.tox/python/lib/python3.8/site-packages/Cython/Plex/Actions.pxd -.tox/python/lib/python3.8/site-packages/Cython/Plex/Scanners.pxd -.tox/python/lib/python3.8/site-packages/Cython/Runtime/refnanny.pyx -.tox/python/lib/python3.8/site-packages/Cython/Utility/CConvert.pyx -.tox/python/lib/python3.8/site-packages/Cython/Utility/CpdefEnums.pyx -.tox/python/lib/python3.8/site-packages/Cython/Utility/CppConvert.pyx -.tox/python/lib/python3.8/site-packages/Cython/Utility/MemoryView.pyx -.tox/python/lib/python3.8/site-packages/Cython/Utility/TestCyUtilityLoader.pyx -.tox/python/lib/python3.8/site-packages/Cython/Utility/TestCythonScope.pyx -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_alias.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_application.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_async_helpers.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_autocall.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_compilerop.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_completer.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_completerlib.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_debugger.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_display.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_displayhook.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_events.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_extension.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_formatters.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_handlers.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_history.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_hooks.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_imports.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_inputsplitter.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_inputtransformer2_line.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_interactiveshell.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_iplib.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_logger.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_magic.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_magic_arguments.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_magic_terminal.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_oinspect.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_page.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_paths.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_prefilter.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_profile.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_prompts.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_pylabtools.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_run.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_shellapp.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_splitinput.py -.tox/python/lib/python3.8/site-packages/IPython/core/tests/test_ultratb.py -.tox/python/lib/python3.8/site-packages/IPython/extensions/tests/test_autoreload.py -.tox/python/lib/python3.8/site-packages/IPython/extensions/tests/test_storemagic.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_backgroundjobs.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_clipboard.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_deepreload.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_display.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_editorhooks.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_imports.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_latextools.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_lexers.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_pretty.py -.tox/python/lib/python3.8/site-packages/IPython/lib/tests/test_security.py -.tox/python/lib/python3.8/site-packages/IPython/terminal/tests/test_debug_magic.py -.tox/python/lib/python3.8/site-packages/IPython/terminal/tests/test_embed.py -.tox/python/lib/python3.8/site-packages/IPython/terminal/tests/test_help.py -.tox/python/lib/python3.8/site-packages/IPython/terminal/tests/test_interactivshell.py -.tox/python/lib/python3.8/site-packages/IPython/testing/plugin/test_ipdoctest.py -.tox/python/lib/python3.8/site-packages/IPython/testing/plugin/test_refs.py -.tox/python/lib/python3.8/site-packages/IPython/testing/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/IPython/testing/tests/test_ipunittest.py -.tox/python/lib/python3.8/site-packages/IPython/testing/tests/test_tools.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_capture.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_dir2.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_imports.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_importstring.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_io.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_module_paths.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_openpy.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_path.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_process.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_pycolorize.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_shimmodule.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_sysinfo.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_tempdir.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_text.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_tokenutil.py -.tox/python/lib/python3.8/site-packages/IPython/utils/tests/test_wildcard.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py -.tox/python/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_check.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_classdef.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_detect.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_diff.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_extendpickle.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_fglobals.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_file.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_functions.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_functors.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_mixins.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_module.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_moduledict.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_nested.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_objects.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_properties.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_recursive.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_restricted.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_selected.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_source.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_temp.py -.tox/python/lib/python3.8/site-packages/dill/tests/test_weakref.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_de.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_de_snooker.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_gaussian.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_kde.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_longdouble.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_proposal.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_stretch.py -.tox/python/lib/python3.8/site-packages/emcee/tests/integration/test_walk.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_autocorr.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_backends.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_blobs.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_ensemble.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_sampler.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_state.py -.tox/python/lib/python3.8/site-packages/emcee/tests/unit/test_stretch.py -.tox/python/lib/python3.8/site-packages/gators/binning/binning.pyx -.tox/python/lib/python3.8/site-packages/gators/binning/tests/test_bin_rare_events.py -.tox/python/lib/python3.8/site-packages/gators/binning/tests/test_custom_discretizer.py -.tox/python/lib/python3.8/site-packages/gators/binning/tests/test_discretizer.py -.tox/python/lib/python3.8/site-packages/gators/binning/tests/test_quantile_discretizer.py -.tox/python/lib/python3.8/site-packages/gators/clipping/clipping.pyx -.tox/python/lib/python3.8/site-packages/gators/clipping/tests/test_clipping.py -.tox/python/lib/python3.8/site-packages/gators/converter/tests/test_convert_column_datatype.py -.tox/python/lib/python3.8/site-packages/gators/converter/tests/test_koalas_to_pandas.py -.tox/python/lib/python3.8/site-packages/gators/converter/tests/test_to_numpy.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/data_cleaning.pyx -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_columns.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_datatype_columns.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_high_cardinality.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_high_nan_ratio.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_drop_low_cardinality.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_keep_columns.py -.tox/python/lib/python3.8/site-packages/gators/data_cleaning/tests/test_replace.py -.tox/python/lib/python3.8/site-packages/gators/encoders/encoder.pyx -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_base_encoder.py -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_muticlass_encoder.py -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_onehot_encoder.py -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_ordinal_encoder.py -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_regression_encoder.py -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_target_encoder.py -.tox/python/lib/python3.8/site-packages/gators/encoders/tests/test_woe_encoder.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/feature_gen.pyx -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_cluster_statistics.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_elementary_arithmetics.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_is_equal.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_is_null.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_one_hot.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_plane_rotation.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation/tests/test_polynomial_features.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/feature_gen_dt.pyx -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_delta_time.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/feature_gen_str.pyx -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_extract.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_lower_case.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_split_extract.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_string_contains.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_string_length.py -.tox/python/lib/python3.8/site-packages/gators/feature_generation_str/tests/test_upper_case.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_correlation_filter.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_information_value.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_multiclass_information_value.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_regression_information_value.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_select_from_model.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_select_from_models.py -.tox/python/lib/python3.8/site-packages/gators/feature_selection/tests/test_variance_filter.py -.tox/python/lib/python3.8/site-packages/gators/imputers/imputer.pyx -.tox/python/lib/python3.8/site-packages/gators/imputers/tests/test_imputers.py -.tox/python/lib/python3.8/site-packages/gators/model_building/tests/test_hyperopt.py -.tox/python/lib/python3.8/site-packages/gators/model_building/tests/test_lgbm_treelite_dumper.py -.tox/python/lib/python3.8/site-packages/gators/model_building/tests/test_train_test_split.py -.tox/python/lib/python3.8/site-packages/gators/model_building/tests/test_xgb_booster_builder.py -.tox/python/lib/python3.8/site-packages/gators/model_building/tests/test_xgb_treelite_dumper.py -.tox/python/lib/python3.8/site-packages/gators/pipeline/tests/test_pipeline.py -.tox/python/lib/python3.8/site-packages/gators/sampling/tests/test_supervised_sampling.py -.tox/python/lib/python3.8/site-packages/gators/sampling/tests/test_unsupervised_sampling.py -.tox/python/lib/python3.8/site-packages/gators/scalers/scaler.pyx -.tox/python/lib/python3.8/site-packages/gators/scalers/tests/test_minmax_scaler.py -.tox/python/lib/python3.8/site-packages/gators/scalers/tests/test_standard_scaler.py -.tox/python/lib/python3.8/site-packages/gators/transformers/tests/test_transformer.py -.tox/python/lib/python3.8/site-packages/gators/transformers/tests/test_transformer_xy.py -.tox/python/lib/python3.8/site-packages/gators/util/tests/test_benchmark.py -.tox/python/lib/python3.8/site-packages/gators/util/tests/test_util.py -.tox/python/lib/python3.8/site-packages/hyperopt/pyll/tests/test_base.py -.tox/python/lib/python3.8/site-packages/hyperopt/pyll/tests/test_stochastic.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_anneal.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_atpe_basic.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_base.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_criteria.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_domains.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_fmin.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_ipy.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_mongoexp.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_pchoice.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_plotting.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_progress.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_pyll_utils.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_rand.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_randint.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_rdists.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_spark.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_tpe.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_vectorize.py -.tox/python/lib/python3.8/site-packages/hyperopt/tests/test_webpage.py -.tox/python/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernel.py -.tox/python/lib/python3.8/site-packages/ipykernel/inprocess/tests/test_kernelmanager.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_async.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_connect.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_embed_kernel.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_eventloop.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_heartbeat.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_io.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_jsonutil.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_kernel.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_kernelspec.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_message_spec.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_pickleutil.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_start_kernel.py -.tox/python/lib/python3.8/site-packages/ipykernel/tests/test_zmq_shell.py -.tox/python/lib/python3.8/site-packages/ipython_genutils/tests/test_importstring.py -.tox/python/lib/python3.8/site-packages/ipython_genutils/tests/test_path.py -.tox/python/lib/python3.8/site-packages/ipython_genutils/tests/test_tempdir.py -.tox/python/lib/python3.8/site-packages/ipython_genutils/tests/test_text.py -.tox/python/lib/python3.8/site-packages/ipywidgets/tests/test_embed.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_docutils.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_interaction.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_link.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_selectioncontainer.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_send_state.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_set_state.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_traits.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_box.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_float.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_image.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_output.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_selection.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_string.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_templates.py -.tox/python/lib/python3.8/site-packages/ipywidgets/widgets/tests/test_widget_upload.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_backports.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_dask.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_deprecated_objects.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_disk.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_format_stack.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_func_inspect.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_func_inspect_special_encoding.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_hashing.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_init.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_logger.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_memmapping.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_memory.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_module.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_my_exceptions.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_numpy_pickle.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_compat.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_numpy_pickle_utils.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_parallel.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_store_backends.py -.tox/python/lib/python3.8/site-packages/joblib/test/test_testing.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_cli.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_deprecations.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_exceptions.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_format.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_jsonschema_test_suite.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_types.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/jsonschema/tests/test_validators.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_adapter.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_client.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_connect.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_jsonutil.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_kernelapp.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_kernelmanager.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_kernelspec.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_localinterfaces.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_manager.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_multikernelmanager.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_provisioning.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_public_api.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_session.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_ssh.py -.tox/python/lib/python3.8/site-packages/jupyter_client/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/jupyter_console/tests/test_console.py -.tox/python/lib/python3.8/site-packages/jupyter_console/tests/test_image_handler.py -.tox/python/lib/python3.8/site-packages/jupyter_core/tests/test_application.py -.tox/python/lib/python3.8/site-packages/jupyter_core/tests/test_command.py -.tox/python/lib/python3.8/site-packages/jupyter_core/tests/test_migrate.py -.tox/python/lib/python3.8/site-packages/jupyter_core/tests/test_paths.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_afm.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_agg.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_agg_filter.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_animation.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_api.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_arrow_patches.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_artist.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_axes.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_bases.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_cairo.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_gtk3.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_nbagg.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_pdf.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_pgf.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_ps.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_qt.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_svg.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_tk.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_tools.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backend_webagg.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_backends_interactive.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_basic.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_bbox_tight.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_category.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_cbook.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_collections.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_colorbar.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_colors.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_compare_images.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_constrainedlayout.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_container.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_contour.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_cycles.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_dates.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_determinism.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_dviread.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_figure.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_font_manager.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_fontconfig_pattern.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_gridspec.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_image.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_legend.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_lines.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_marker.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_mathtext.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_matplotlib.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_mlab.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_offsetbox.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_patches.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_path.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_patheffects.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_pickle.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_png.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_polar.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_preprocess_data.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_pyplot.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_quiver.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_rcparams.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_sankey.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_scale.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_simplification.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_skew.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_sphinxext.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_spines.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_streamplot.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_style.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_subplots.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_table.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_testing.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_texmanager.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_text.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_ticker.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_tightlayout.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_transforms.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_triangulation.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_ttconv.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_type1font.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_units.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_usetex.py -.tox/python/lib/python3.8/site-packages/matplotlib/tests/test_widgets.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axes_grid1.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_angle_helper.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axis_artist.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_axislines.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_clip_path.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_floating_axes.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_finder.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_axisartist_grid_helper_curvelinear.py -.tox/python/lib/python3.8/site-packages/mpl_toolkits/tests/test_mplot3d.py -.tox/python/lib/python3.8/site-packages/nbclient/tests/test_client.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_asciidoc.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_export.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_exporter.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_html.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_latex.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_markdown.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_notebook.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_pdf.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_python.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_rst.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_script.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_slides.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_templateexporter.py -.tox/python/lib/python3.8/site-packages/nbconvert/exporters/tests/test_webpdf.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_ansi.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_citation.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_datatypefilter.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_highlight.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_latex.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_markdown.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_metadata.py -.tox/python/lib/python3.8/site-packages/nbconvert/filters/tests/test_strings.py -.tox/python/lib/python3.8/site-packages/nbconvert/postprocessors/tests/test_serve.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearmetadata.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_clearoutput.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_coalescestreams.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_csshtmlheader.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_execute.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_extractoutput.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_highlightmagics.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_latex.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_regexremove.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_sanitize.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_svg2pdf.py -.tox/python/lib/python3.8/site-packages/nbconvert/preprocessors/tests/test_tagremove.py -.tox/python/lib/python3.8/site-packages/nbconvert/tests/test_nbconvertapp.py -.tox/python/lib/python3.8/site-packages/nbconvert/utils/tests/test_io.py -.tox/python/lib/python3.8/site-packages/nbconvert/utils/tests/test_pandoc.py -.tox/python/lib/python3.8/site-packages/nbconvert/utils/tests/test_version.py -.tox/python/lib/python3.8/site-packages/nbconvert/writers/tests/test_debug.py -.tox/python/lib/python3.8/site-packages/nbconvert/writers/tests/test_files.py -.tox/python/lib/python3.8/site-packages/nbconvert/writers/tests/test_stdout.py -.tox/python/lib/python3.8/site-packages/nbformat/corpus/tests/test_words.py -.tox/python/lib/python3.8/site-packages/nbformat/tests/test_api.py -.tox/python/lib/python3.8/site-packages/nbformat/tests/test_convert.py -.tox/python/lib/python3.8/site-packages/nbformat/tests/test_nbformat.py -.tox/python/lib/python3.8/site-packages/nbformat/tests/test_reader.py -.tox/python/lib/python3.8/site-packages/nbformat/tests/test_sign.py -.tox/python/lib/python3.8/site-packages/nbformat/tests/test_validator.py -.tox/python/lib/python3.8/site-packages/nbformat/v1/tests/test_json.py -.tox/python/lib/python3.8/site-packages/nbformat/v1/tests/test_nbbase.py -.tox/python/lib/python3.8/site-packages/nbformat/v2/tests/test_json.py -.tox/python/lib/python3.8/site-packages/nbformat/v2/tests/test_nbbase.py -.tox/python/lib/python3.8/site-packages/nbformat/v2/tests/test_nbpy.py -.tox/python/lib/python3.8/site-packages/nbformat/v3/tests/test_json.py -.tox/python/lib/python3.8/site-packages/nbformat/v3/tests/test_misc.py -.tox/python/lib/python3.8/site-packages/nbformat/v3/tests/test_nbbase.py -.tox/python/lib/python3.8/site-packages/nbformat/v3/tests/test_nbpy.py -.tox/python/lib/python3.8/site-packages/nbformat/v4/tests/test_convert.py -.tox/python/lib/python3.8/site-packages/nbformat/v4/tests/test_json.py -.tox/python/lib/python3.8/site-packages/nbformat/v4/tests/test_nbbase.py -.tox/python/lib/python3.8/site-packages/nbformat/v4/tests/test_validate.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_clique.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_connectivity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_distance_measures.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_dominating_set.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_kcomponents.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_matching.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_maxcut.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_ramsey.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_steinertree.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_traveling_salesman.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_treewidth.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/approximation/tests/test_vertex_cover.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_connectivity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_correlation.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_mixing.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_neighbor_degree.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/assortativity/tests/test_pairs.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_basic.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_cluster.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_covering.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_edgelist.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_generators.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matching.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_matrix.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_project.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_redundancy.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_closeness_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_current_flow_closeness.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_degree_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_dispersion.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_group.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_harmonic_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_katz_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_load_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_percolation_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_reaching.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_second_order_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_subgraph.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_trophic.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/centrality/tests/test_voterank.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/coloring/tests/test_coloring.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_asyn_fluid.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_centrality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kclique.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_kernighan_lin.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_label_propagation.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_lukes.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_modularity_max.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_quality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/community/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_attracting.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_biconnected.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_connected.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_semiconnected.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_strongly_connected.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/components/tests/test_weakly_connected.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_connectivity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_cuts.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_disjoint_paths.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_augmentation.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcomponents.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_kcutsets.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/connectivity/tests/test_stoer_wagner.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_gomory_hu.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_maxflow_large_graph.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_mincost.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/flow/tests/test_networksimplex.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_ismags.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphism.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_match_helpers.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_hits.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/link_analysis/tests/test_pagerank.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/minors/tests/test_contraction.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_harmonic_function.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/node_classification/tests/test_local_and_global_consistency.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_all.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_binary.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_product.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/operators/tests/test_unary.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_astar.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_generic.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_unweighted.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/shortest_paths/tests/test_weighted.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_asteroidal.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_boundary.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_bridges.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_chains.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_chordal.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_clique.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_cluster.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_communicability.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_core.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_covering.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_cuts.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_cycles.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_d_separation.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_dag.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_measures.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_distance_regular.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominance.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_dominating.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_efficiency.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_euler.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_graph_hashing.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_graphical.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_hierarchy.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_hybrid.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_isolate.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_link_prediction.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_lowest_common_ancestors.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_matching.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_max_weight_clique.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_mis.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_moral.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_non_randomness.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_planar_drawing.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_planarity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_reciprocity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_regular.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_richclub.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_similarity.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_simple_paths.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_smallworld.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_smetric.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_sparsifiers.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_structuralholes.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_summarization.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_swap.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_threshold.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_tournament.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_triads.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_vitality.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_voronoi.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tests/test_wiener.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_beamsearch.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_bfs.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_dfs.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgebfs.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/traversal/tests/test_edgedfs.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_branchings.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_coding.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_decomposition.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_mst.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_operations.py -.tox/python/lib/python3.8/site-packages/networkx/algorithms/tree/tests/test_recognition.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_coreviews.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_digraph.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_digraph_historical.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_filters.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_function.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_graph.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_graph_historical.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_graphviews.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_multidigraph.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_multigraph.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_ordered.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_reportviews.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_special.py -.tox/python/lib/python3.8/site-packages/networkx/classes/tests/test_subgraphviews.py -.tox/python/lib/python3.8/site-packages/networkx/drawing/tests/test_agraph.py -.tox/python/lib/python3.8/site-packages/networkx/drawing/tests/test_layout.py -.tox/python/lib/python3.8/site-packages/networkx/drawing/tests/test_pydot.py -.tox/python/lib/python3.8/site-packages/networkx/drawing/tests/test_pylab.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_atlas.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_classic.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_cographs.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_community.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_degree_seq.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_directed.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_duplication.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_ego.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_expanders.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_geometric.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_harary_graph.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_internet_as_graphs.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_intersection.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_interval_graph.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_joint_degree_seq.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_lattice.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_line.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_mycielski.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_nonisomorphic_trees.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_random_clustered.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_random_graphs.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_small.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_spectral_graph_forge.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_stochastic.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_sudoku.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_trees.py -.tox/python/lib/python3.8/site-packages/networkx/generators/tests/test_triads.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_algebraic_connectivity.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_attrmatrix.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_bethehessian.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_graphmatrix.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_laplacian.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_modularity.py -.tox/python/lib/python3.8/site-packages/networkx/linalg/tests/test_spectrum.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_adjacency.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_cytoscape.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_jit.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_node_link.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/json_graph/tests/test_tree.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_adjlist.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_edgelist.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_getattr_nxyaml_removal.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_gexf.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_gml.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_gpickle.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_graph6.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_graphml.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_leda.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_p2g.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_pajek.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_shp.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_sparse6.py -.tox/python/lib/python3.8/site-packages/networkx/readwrite/tests/test_text.py -.tox/python/lib/python3.8/site-packages/networkx/testing/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_all_random_functions.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_convert.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_convert_numpy.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_convert_pandas.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_convert_scipy.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_exceptions.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_import.py -.tox/python/lib/python3.8/site-packages/networkx/tests/test_relabel.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test__init.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_contextmanager.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_heaps.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_mapped_queue.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_misc.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_random_sequence.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_rcm.py -.tox/python/lib/python3.8/site-packages/networkx/utils/tests/test_unionfind.py -.tox/python/lib/python3.8/site-packages/notebook/auth/tests/test_login.py -.tox/python/lib/python3.8/site-packages/notebook/auth/tests/test_security.py -.tox/python/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_api.py -.tox/python/lib/python3.8/site-packages/notebook/bundler/tests/test_bundler_tools.py -.tox/python/lib/python3.8/site-packages/notebook/bundler/tests/test_bundlerextension.py -.tox/python/lib/python3.8/site-packages/notebook/nbconvert/tests/test_nbconvert_handlers.py -.tox/python/lib/python3.8/site-packages/notebook/services/api/tests/test_api.py -.tox/python/lib/python3.8/site-packages/notebook/services/config/tests/test_config_api.py -.tox/python/lib/python3.8/site-packages/notebook/services/contents/tests/test_contents_api.py -.tox/python/lib/python3.8/site-packages/notebook/services/contents/tests/test_fileio.py -.tox/python/lib/python3.8/site-packages/notebook/services/contents/tests/test_largefilemanager.py -.tox/python/lib/python3.8/site-packages/notebook/services/contents/tests/test_manager.py -.tox/python/lib/python3.8/site-packages/notebook/services/kernels/tests/test_kernels_api.py -.tox/python/lib/python3.8/site-packages/notebook/services/kernelspecs/tests/test_kernelspecs_api.py -.tox/python/lib/python3.8/site-packages/notebook/services/nbconvert/tests/test_nbconvert_api.py -.tox/python/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessionmanager.py -.tox/python/lib/python3.8/site-packages/notebook/services/sessions/tests/test_sessions_api.py -.tox/python/lib/python3.8/site-packages/notebook/terminal/tests/test_terminals_api.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_config_manager.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_files.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_gateway.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_i18n.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_log.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_nbextensions.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_notebookapp.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_notebookapp_integration.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_paths.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_serialize.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_serverextensions.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_traittypes.py -.tox/python/lib/python3.8/site-packages/notebook/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_buffering.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_clipboard_multiselect.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dashboard_nav.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_deletecell.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_display_image.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_display_isolation.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_arrows.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_cellmode.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_clipboard.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_execute.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_insertcell.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_dualmode_markdown.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_execute_code.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_find_and_replace.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_interrupt.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_kernel_menu.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_markdown.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_merge_cells.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_move_multiselection.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_multiselect_toggle.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_notifications.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_prompt_numbers.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_save.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_save_as_notebook.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_save_readonly_as.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_shutdown.py -.tox/python/lib/python3.8/site-packages/notebook/tests/selenium/test_undelete.py -.tox/python/lib/python3.8/site-packages/notebook/tree/tests/test_tree_handler.py -.tox/python/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd -.tox/python/lib/python3.8/site-packages/numpy/__init__.pxd -.tox/python/lib/python3.8/site-packages/numpy/compat/tests/test_compat.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test__exceptions.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_abc.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_api.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_arrayprint.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_conversion_utils.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_cpu_features.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_datetime.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_defchararray.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_deprecations.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_dtype.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_einsum.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_errstate.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_extint128.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_function_base.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_getlimits.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_half.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_indexerrors.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_indexing.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_item_selection.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_longdouble.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_machar.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_mem_overlap.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_memmap.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_multiarray.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_nditer.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_numeric.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_numerictypes.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_overrides.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_print.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_protocols.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_records.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_scalar_ctors.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_scalar_methods.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_scalarbuffer.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_scalarinherit.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_scalarmath.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_scalarprint.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_shape_base.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_ufunc.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_umath.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_umath_accuracy.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_umath_complex.py -.tox/python/lib/python3.8/site-packages/numpy/core/tests/test_unicode.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_exec_command.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_gnu.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_intel.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_fcompiler_nagfor.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_from_template.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_mingw32ccompiler.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_misc_util.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_npy_pkg_config.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_shell_utils.py -.tox/python/lib/python3.8/site-packages/numpy/distutils/tests/test_system_info.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_array_from_pyobj.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_assumed_shape.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_block_docstring.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_callback.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_common.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_compile_function.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_crackfortran.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_kind.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_mixed.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_parameter.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_quoted_character.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_return_character.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_return_complex.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_return_integer.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_return_logical.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_return_real.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_semicolon_split.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_size.py -.tox/python/lib/python3.8/site-packages/numpy/f2py/tests/test_string.py -.tox/python/lib/python3.8/site-packages/numpy/fft/tests/test_helper.py -.tox/python/lib/python3.8/site-packages/numpy/fft/tests/test_pocketfft.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test__datasource.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test__iotools.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test__version.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_arraypad.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_arraysetops.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_arrayterator.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_financial.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_format.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_function_base.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_histograms.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_index_tricks.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_io.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_mixins.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_nanfunctions.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_packbits.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_polynomial.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_recfunctions.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_shape_base.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_stride_tricks.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_twodim_base.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_type_check.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_ufunclike.py -.tox/python/lib/python3.8/site-packages/numpy/lib/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/numpy/linalg/tests/test_build.py -.tox/python/lib/python3.8/site-packages/numpy/linalg/tests/test_deprecations.py -.tox/python/lib/python3.8/site-packages/numpy/linalg/tests/test_linalg.py -.tox/python/lib/python3.8/site-packages/numpy/linalg/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_core.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_deprecations.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_extras.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_mrecords.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_old_ma.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/ma/tests/test_subclassing.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_defmatrix.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_interaction.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_masked_matrix.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_matrix_linalg.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_multiarray.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_numeric.py -.tox/python/lib/python3.8/site-packages/numpy/matrixlib/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_chebyshev.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_classes.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_hermite_e.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_laguerre.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_legendre.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_polynomial.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_polyutils.py -.tox/python/lib/python3.8/site-packages/numpy/polynomial/tests/test_printing.py -.tox/python/lib/python3.8/site-packages/numpy/random/__init__.pxd -.tox/python/lib/python3.8/site-packages/numpy/random/_bounded_integers.pxd -.tox/python/lib/python3.8/site-packages/numpy/random/_common.pxd -.tox/python/lib/python3.8/site-packages/numpy/random/bit_generator.pxd -.tox/python/lib/python3.8/site-packages/numpy/random/c_distributions.pxd -.tox/python/lib/python3.8/site-packages/numpy/random/_examples/cython/extending.pyx -.tox/python/lib/python3.8/site-packages/numpy/random/_examples/cython/extending_distributions.pyx -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_direct.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_extending.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_generator_mt19937_regressions.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_random.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_randomstate.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_randomstate_regression.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_seed_sequence.py -.tox/python/lib/python3.8/site-packages/numpy/random/tests/test_smoke.py -.tox/python/lib/python3.8/site-packages/numpy/testing/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/numpy/testing/tests/test_doctesting.py -.tox/python/lib/python3.8/site-packages/numpy/testing/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_ctypeslib.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_matlib.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_numpy_version.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_public_api.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_reloading.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_scripts.py -.tox/python/lib/python3.8/site-packages/numpy/tests/test_warnings.py -.tox/python/lib/python3.8/site-packages/numpydoc/tests/test_docscrape.py -.tox/python/lib/python3.8/site-packages/numpydoc/tests/test_full.py -.tox/python/lib/python3.8/site-packages/numpydoc/tests/test_main.py -.tox/python/lib/python3.8/site-packages/numpydoc/tests/test_numpydoc.py -.tox/python/lib/python3.8/site-packages/numpydoc/tests/test_validate.py -.tox/python/lib/python3.8/site-packages/numpydoc/tests/test_xref.py -.tox/python/lib/python3.8/site-packages/pandas/_libs/algos.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/algos.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/arrays.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/arrays.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/groupby.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/hashing.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/hashtable.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/hashtable.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/index.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/indexing.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/internals.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/interval.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/join.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/khash.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/lib.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/lib.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/missing.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/missing.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/ops.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/ops_dispatch.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/parsers.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/properties.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/reduction.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/reshape.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/sparse.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/testing.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslib.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/util.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/writers.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/base.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/fields.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/period.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/strptime.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/util.pxd -.tox/python/lib/python3.8/site-packages/pandas/_libs/tslibs/vectorized.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/window/aggregations.pyx -.tox/python/lib/python3.8/site-packages/pandas/_libs/window/indexers.pyx -.tox/python/lib/python3.8/site-packages/pandas/io/sas/sas.pyx -.tox/python/lib/python3.8/site-packages/pandas/tests/test_aggregation.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_algos.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_downstream.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_errors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_expressions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_flags.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_multilevel.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_nanops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_optional_dependency.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_register_accessor.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_sorting.py -.tox/python/lib/python3.8/site-packages/pandas/tests/test_take.py -.tox/python/lib/python3.8/site-packages/pandas/tests/api/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/api/test_types.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_frame_apply_relabeling.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_frame_transform.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_invalid_arg.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_series_apply_relabeling.py -.tox/python/lib/python3.8/site-packages/pandas/tests/apply/test_series_transform.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_array_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_datetime64.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_interval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_numeric.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_object.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arithmetic/test_timedelta64.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_array.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimelike.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_datetimes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_ndarray_backed.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_numpy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/test_timedeltas.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_comparison.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_construction.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_function.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_logical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_reduction.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/boolean/test_repr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_algos.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_analytics.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_missing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_operators.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_replace.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_repr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_sorting.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_subclass.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_take.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/categorical/test_warnings.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/datetimes/test_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_comparison.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_concat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_construction.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_function.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_repr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/floating/test_to_numpy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_comparison.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_concat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_construction.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_function.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/integer/test_repr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_interval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/interval/test_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_arrow_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/masked/test_function.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/period/test_arrow_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/period/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/period/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/period/test_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_accessor.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_arithmetics.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_array.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_combine_concat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_dtype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/sparse/test_libsparse.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/string_/test_string_arrow.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/arrays/timedeltas/test_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_conversion.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_misc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_transpose.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_unique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/base/test_value_counts.py -.tox/python/lib/python3.8/site-packages/pandas/tests/computation/test_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/computation/test_eval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/config/test_config.py -.tox/python/lib/python3.8/site-packages/pandas/tests/config/test_localization.py -.tox/python/lib/python3.8/site-packages/pandas/tests/construction/test_extract_array.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/test_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/test_concat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/test_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/test_generic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/test_inference.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/test_missing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_from_scalar.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_ndarray.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_construct_object_arr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_dict_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_downcast.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_find_common_type.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_datetimelike.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_infer_dtype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_maybe_box_native.py -.tox/python/lib/python3.8/site-packages/pandas/tests/dtypes/cast/test_promote.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_boolean.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_extension.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_external_block.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_floating.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_integer.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_interval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_numpy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_sparse.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/test_string.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_bool.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_string.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/arrow/test_timestamp.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/decimal/test_decimal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/json/test_json.py -.tox/python/lib/python3.8/site-packages/pandas/tests/extension/list/test_list.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_alter_axes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_block_internals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_cumulative.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_iteration.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_logical_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_nonunique_indexes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_npfuncs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_query_eval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_repr_info.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_stack_unstack.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_subclass.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_ufunc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_unary.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/test_validate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_dict.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/constructors/test_from_records.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_delitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_get_value.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_getitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_insert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_lookup.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_mask.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_set_value.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_setitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_take.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_where.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/indexing/test_xs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_add_prefix_suffix.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_align.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_append.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asfreq.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_asof.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_assign.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_at_time.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_between_time.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_clip.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_combine_first.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_compare.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_convert_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_copy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_count_with_level_deprecated.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_cov_corr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_describe.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_diff.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dot.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_drop_duplicates.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_droplevel.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dropna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_duplicated.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_equals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_explode.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_filter.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_and_last.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_first_valid_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_get_numeric_data.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_head_tail.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_infer_objects.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_interpolate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_is_homogeneous_dtype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_isin.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_matmul.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_nlargest.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pct_change.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pipe.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_pop.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_quantile.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rank.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reindex_like.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_rename_axis.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reorder_levels.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_replace.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_reset_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_round.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sample.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_select_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_axis.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_set_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_shift.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_sort_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swapaxes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_swaplevel.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_csv.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_dict_of_blocks.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_numpy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_records.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_to_timestamp.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_transpose.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_truncate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_convert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_tz_localize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_update.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_value_counts.py -.tox/python/lib/python3.8/site-packages/pandas/tests/frame/methods/test_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_duplicate_labels.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_finalize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_frame.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_generic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_label_or_level_utils.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_series.py -.tox/python/lib/python3.8/site-packages/pandas/tests/generic/test_to_xarray.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_allowlist.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_any_all.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_apply.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_apply_mutate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_bin_groupby.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_counting.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_filters.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_function.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_dropna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_shift_diff.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_groupby_subclass.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_grouping.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_index_as_string.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_libgroupby.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_min_max.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_missing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_nth.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_nunique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_pipe.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_quantile.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_rank.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_sample.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_size.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_timegrouper.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/test_value_counts.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_aggregate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_cython.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_numba.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/aggregate/test_other.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_numba.py -.tox/python/lib/python3.8/site-packages/pandas/tests/groupby/transform/test_transform.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_any_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_base.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_engines.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_frozen.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_index_new.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_numpy_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_reshape.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/base_class/test_where.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_append.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_category.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_equals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_map.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/categorical/test_reindex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_drop_duplicates.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_equals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_nat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_sort_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimelike_/test_value_counts.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_asof.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_date_range.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_datetimelike.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_delete.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_map.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_misc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_npfuncs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_partial_slicing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_pickle.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_reindex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_scalar_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_timezones.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/test_unique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_factorize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_insert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_repeat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_shift.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_snap.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_frame.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/datetimes/methods/test_to_series.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_base.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_equals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_range.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_interval_tree.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_analytics.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_conversion.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_copy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_drop.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_duplicates.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_equivalence.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_level_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_get_set.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_integrity.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_isin.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_lexsort.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_missing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_monotonic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_names.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_partial_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reindex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_reshape.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_sorting.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/multi/test_take.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_numeric.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/numeric/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/object/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/object/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_monotonic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_partial_slicing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_period_range.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_scalar_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_searchsorted.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/test_tools.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_asfreq.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_factorize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_insert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_is_full.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_repeat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_shift.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/period/methods/test_to_timestamp.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_range.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/ranges/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_delete.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_scalar_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_searchsorted.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_setops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/test_timedelta_range.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_factorize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_insert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_repeat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexes/timedeltas/methods/test_shift.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_at.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_chaining_and_caching.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_check_indexer.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_coercion.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_floats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_iat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_iloc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_indexers.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_loc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_na_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_partial.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/test_scalar.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/interval/test_interval_new.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_chaining_and_caching.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_getitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_iloc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_indexing_slow.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_loc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_multiindex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_partial.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_setitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_slice.py -.tox/python/lib/python3.8/site-packages/pandas/tests/indexing/multiindex/test_sorted.py -.tox/python/lib/python3.8/site-packages/pandas/tests/internals/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/internals/test_internals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/internals/test_managers.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_clipboard.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_compression.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_date_converters.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_feather.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_fsspec.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_gbq.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_gcs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_html.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_orc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_parquet.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_pickle.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_s3.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_spss.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_sql.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_stata.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/test_user_agent.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_odf.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_odswriter.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_openpyxl.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_readers.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_style.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_writers.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlrd.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlsxwriter.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/excel/test_xlwt.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_console.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_css.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_eng_formatting.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_format.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_info.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_printing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_csv.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_excel.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_html.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_latex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_markdown.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/test_to_string.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_align.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_format.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_highlight.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_html.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_matplotlib.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_non_unique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_style.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_to_latex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/formats/style/test_tooltip.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_compression.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_deprecated_kwargs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_json_table_schema.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_normalize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_pandas.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_readlines.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/json/test_ujson.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_c_parser_only.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_comment.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_compression.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_converters.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_dialect.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_encoding.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_header.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_index_col.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_mangle_dupes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_multi_thread.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_na_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_network.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_parse_dates.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_python_parser_only.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_quoting.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_read_fwf.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_skiprows.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_textreader.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/test_unsupported.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_chunksize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_common_basic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_data_list.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_decimal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_file_buffer_url.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_float.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_inf.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_ints.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_iterator.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_read_errors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/common/test_verbose.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_dtypes_basic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/dtypes/test_empty.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_parse_dates.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_strings.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/parser/usecols/test_usecols_basic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_append.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_compat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_complex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_errors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_file_handling.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_keys.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_put.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_pytables_missing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_read.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_retain_attributes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_round_trip.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_select.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_store.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_subclass.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_time_series.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/pytables/test_timezones.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/sas/test_sas7bdat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/sas/test_xport.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/xml/test_to_xml.py -.tox/python/lib/python3.8/site-packages/pandas/tests/io/xml/test_xml.py -.tox/python/lib/python3.8/site-packages/pandas/tests/libs/test_hashtable.py -.tox/python/lib/python3.8/site-packages/pandas/tests/libs/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/libs/test_lib.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_backend.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_boxplot_method.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_converter.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_datetimelike.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_groupby.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_hist_method.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_misc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_series.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/test_style.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_color.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_groupby.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_legend.py -.tox/python/lib/python3.8/site-packages/pandas/tests/plotting/frame/test_frame_subplots.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reductions/test_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reductions/test_stat_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_base.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_datetime_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_deprecated.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_period_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_resample_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_resampler_grouper.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_time_grouper.py -.tox/python/lib/python3.8/site-packages/pandas/tests/resample/test_timedelta.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_crosstab.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_cut.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_get_dummies.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_melt.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_pivot_multilevel.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_qcut.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_union_categoricals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/test_util.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_append_common.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_categorical.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_concat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_dataframe.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_datetimes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_empty.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_invalid.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_series.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/concat/test_sort.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_join.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_asof.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_cross.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_index_as_string.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_merge_ordered.py -.tox/python/lib/python3.8/site-packages/pandas/tests/reshape/merge/test_multi.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/test_na_scalar.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/test_nat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_interval.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/interval/test_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/period/test_asfreq.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/period/test_period.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_formats.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timedelta/test_timedelta.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_comparisons.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_rendering.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timestamp.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_timezones.py -.tox/python/lib/python3.8/site-packages/pandas/tests/scalar/timestamp/test_unary_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_arithmetic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_constructors.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_cumulative.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_iteration.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_logical_ops.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_missing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_npfuncs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_reductions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_repr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_subclass.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_ufunc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_unary.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/test_validate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/accessors/test_cat_accessor.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/accessors/test_dt_accessor.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/accessors/test_sparse_accessor.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/accessors/test_str_accessor.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_delitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_get.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_getitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_indexing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_mask.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_set_value.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_setitem.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_take.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_where.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/indexing/test_xs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_align.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_append.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_argsort.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_asfreq.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_asof.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_astype.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_autocorr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_between.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_clip.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_combine_first.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_compare.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_convert_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_copy.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_count.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_cov_corr.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_describe.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_diff.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_drop_duplicates.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_dropna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_duplicated.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_equals.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_explode.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_fillna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_get_numeric_data.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_head_tail.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_infer_objects.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_interpolate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_monotonic.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_is_unique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_isin.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_isna.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_item.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_matmul.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_nlargest.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_nunique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_pct_change.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_pop.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_quantile.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_rank.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_reindex_like.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_rename_axis.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_repeat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_replace.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_reset_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_round.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_searchsorted.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_set_name.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_shift.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_index.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_sort_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_csv.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_dict.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_to_frame.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_truncate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_convert.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_tz_localize.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_unique.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_unstack.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_update.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_value_counts.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_values.py -.tox/python/lib/python3.8/site-packages/pandas/tests/series/methods/test_view.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_case_justify.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_cat.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_extract.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_find_replace.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_get_dummies.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_split_partition.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_string_array.py -.tox/python/lib/python3.8/site-packages/pandas/tests/strings/test_strings.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tools/test_to_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tools/test_to_numeric.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tools/test_to_time.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tools/test_to_timedelta.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_freq_code.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_frequencies.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/frequencies/test_inference.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_calendar.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_federal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_holiday.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/holiday/test_observance.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_day.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_business_hour.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_custom_business_hour.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_dst.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_fiscal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_month.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_offsets_properties.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_opening_times.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_ticks.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_week.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tseries/offsets/test_yqm_offsets.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_array_to_datetime.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_ccalendar.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_conversion.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_fields.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_libfrequencies.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_liboffsets.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_parse_iso8601.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_parsing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_period_asfreq.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_timedeltas.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_timezones.py -.tox/python/lib/python3.8/site-packages/pandas/tests/tslibs/test_to_offset.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_almost_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_attr_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_categorical_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_extension_array_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_frame_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_index_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_interval_array_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_numpy_array_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_produces_warning.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_assert_series_equal.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_deprecate.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_kwarg.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_deprecate_nonkeyword_arguments.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_doc.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_hashing.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_numba.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_safe_import.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_show_versions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_util.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_validate_args.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_validate_args_and_kwargs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/util/test_validate_kwargs.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_api.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_apply.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_base_indexer.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_dtypes.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_ewm.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_expanding.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_groupby.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_numba.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_online.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_pairwise.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_rolling.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_timeseries_window.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/test_win_type.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_ewm.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_expanding.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_consistency_rolling.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_ewm.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_apply.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_functions.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_quantile.py -.tox/python/lib/python3.8/site-packages/pandas/tests/window/moments/test_moments_rolling_skew_kurt.py -.tox/python/lib/python3.8/site-packages/pyaml/tests/test_dump.py -.tox/python/lib/python3.8/site-packages/pyarrow/__init__.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_compute.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_compute.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_csv.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_csv.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_cuda.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_cuda.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_dataset.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_feather.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_flight.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_fs.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_fs.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_hdfs.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_hdfsio.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_json.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_orc.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_orc.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_parquet.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/_parquet.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_plasma.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/_s3fs.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/gandiva.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/lib.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/lib.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/includes/__init__.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/common.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libarrow.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libarrow_cuda.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libarrow_dataset.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libarrow_feather.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libarrow_flight.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libarrow_fs.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libgandiva.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/includes/libplasma.pxd -.tox/python/lib/python3.8/site-packages/pyarrow/tests/bound_function_visit_strings.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/tests/pyarrow_cython_example.pyx -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_adhoc_memory_leak.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_array.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_builder.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_cffi.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_compute.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_convert_builtin.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_csv.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_cuda.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_cuda_numba_interop.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_cython.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_dataset.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_deprecations.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_extension_type.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_feather.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_filesystem.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_flight.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_fs.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_gandiva.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_hdfs.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_io.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_ipc.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_json.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_jvm.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_memory.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_misc.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_orc.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_pandas.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_plasma.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_plasma_tf_op.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_scalars.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_schema.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_serialization.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_serialization_deprecated.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_sparse_tensor.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_strategies.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_table.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_tensor.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_types.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/test_util.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_basic.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_compliant_nested_type.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_data_types.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_dataset.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_datetime.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_metadata.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_pandas.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_file.py -.tox/python/lib/python3.8/site-packages/pyarrow/tests/parquet/test_parquet_writer.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_api.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_builtin.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_checker.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_code_segment.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_dict.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_doctests.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_imports.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_is_literal.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_match.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_other.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_return_with_arguments_inside_generator.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_type_annotations.py -.tox/python/lib/python3.8/site-packages/pyflakes/test/test_undefined_names.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_00_console_widget.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_ansi_code_processor.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_app.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_comms.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_completion_widget.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_frontend_widget.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_jupyter_widget.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_kill_ring.py -.tox/python/lib/python3.8/site-packages/qtconsole/tests/test_styles.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_macos_checks.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_main.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_patch_qcombobox.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_patch_qheaderview.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qdesktopservice_split.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qt3danimation.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qt3dcore.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qt3dextras.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qt3dinput.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qt3dlogic.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qt3drender.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtcharts.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtcore.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtdatavisualization.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtdesigner.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qthelp.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtlocation.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtmultimedia.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtmultimediawidgets.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtnetwork.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtpositioning.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtprintsupport.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtqml.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtquick.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtquickwidgets.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtserialport.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtsql.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtsvg.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qttest.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtwebchannel.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtwebenginewidgets.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtwebsockets.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtwinextras.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_qtxmlpatterns.py -.tox/python/lib/python3.8/site-packages/qtpy/tests/test_uic.py -.tox/python/lib/python3.8/site-packages/scipy/linalg.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize.pxd -.tox/python/lib/python3.8/site-packages/scipy/special.pxd -.tox/python/lib/python3.8/site-packages/scipy/_build_utils/tests/test_scipy_version.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test__gcutils.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test__pep440.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test__testutils.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test__threadsafety.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test__util.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test_bunch.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test_ccallback.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test_deprecation.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test_import_cycles.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test_tmpdirs.py -.tox/python/lib/python3.8/site-packages/scipy/_lib/tests/test_warnings.py -.tox/python/lib/python3.8/site-packages/scipy/cluster/tests/test_disjoint_set.py -.tox/python/lib/python3.8/site-packages/scipy/cluster/tests/test_hierarchy.py -.tox/python/lib/python3.8/site-packages/scipy/cluster/tests/test_vq.py -.tox/python/lib/python3.8/site-packages/scipy/constants/tests/test_codata.py -.tox/python/lib/python3.8/site-packages/scipy/constants/tests/test_constants.py -.tox/python/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_basic.py -.tox/python/lib/python3.8/site-packages/scipy/fft/_pocketfft/tests/test_real_transforms.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_backend.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_fft_function.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_fftlog.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_helper.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_multithreading.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_numpy.py -.tox/python/lib/python3.8/site-packages/scipy/fft/tests/test_real_transforms.py -.tox/python/lib/python3.8/site-packages/scipy/fftpack/tests/test_basic.py -.tox/python/lib/python3.8/site-packages/scipy/fftpack/tests/test_helper.py -.tox/python/lib/python3.8/site-packages/scipy/fftpack/tests/test_import.py -.tox/python/lib/python3.8/site-packages/scipy/fftpack/tests/test_pseudo_diffs.py -.tox/python/lib/python3.8/site-packages/scipy/fftpack/tests/test_real_transforms.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_ivp.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/_ivp/tests/test_rk.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test__quad_vec.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test_bvp.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test_integrate.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test_odeint_jac.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test_quadpack.py -.tox/python/lib/python3.8/site-packages/scipy/integrate/tests/test_quadrature.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_bsplines.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_fitpack2.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_gil.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpnd.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_interpolate.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_ndgriddata.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_pade.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_polyint.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbf.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_rbfinterp.py -.tox/python/lib/python3.8/site-packages/scipy/interpolate/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/scipy/io/arff/tests/test_arffread.py -.tox/python/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_fortran_format.py -.tox/python/lib/python3.8/site-packages/scipy/io/harwell_boeing/tests/test_hb.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_byteordercodes.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio5_utils.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_funcs.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_mio_utils.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_miobase.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_pathological.py -.tox/python/lib/python3.8/site-packages/scipy/io/matlab/tests/test_streams.py -.tox/python/lib/python3.8/site-packages/scipy/io/tests/test_fortran.py -.tox/python/lib/python3.8/site-packages/scipy/io/tests/test_idl.py -.tox/python/lib/python3.8/site-packages/scipy/io/tests/test_mmio.py -.tox/python/lib/python3.8/site-packages/scipy/io/tests/test_netcdf.py -.tox/python/lib/python3.8/site-packages/scipy/io/tests/test_paths.py -.tox/python/lib/python3.8/site-packages/scipy/io/tests/test_wavfile.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/cython_blas.pxd -.tox/python/lib/python3.8/site-packages/scipy/linalg/cython_lapack.pxd -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_basic.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_blas.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_build.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_blas.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_cython_lapack.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cholesky.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_cossin.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_ldl.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_polar.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_decomp_update.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_fblas.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_interpolative.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_lapack.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_matfuncs.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_matmul_toeplitz.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_misc.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_procrustes.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_sketches.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_solve_toeplitz.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_solvers.py -.tox/python/lib/python3.8/site-packages/scipy/linalg/tests/test_special_matrices.py -.tox/python/lib/python3.8/site-packages/scipy/misc/tests/test_common.py -.tox/python/lib/python3.8/site-packages/scipy/misc/tests/test_doccer.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_c_api.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_datatypes.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_filters.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_fourier.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_interpolation.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_measurements.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_morphology.py -.tox/python/lib/python3.8/site-packages/scipy/ndimage/tests/test_splines.py -.tox/python/lib/python3.8/site-packages/scipy/odr/tests/test_odr.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/cython_optimize.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HConst.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/Highs.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsIO.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsInfo.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLp.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsLpUtils.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsModelUtils.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsOptions.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsRuntimeOptions.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/HighsStatus.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/SimplexConst.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_highs/cython/src/highs_c_api.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_projections.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/_trustregion_constr/tests/test_report.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/cython_optimize/_zeros.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/cython_optimize/c_zeros.pxd -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__basinhopping.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__differential_evolution.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__dual_annealing.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__linprog_clean_inputs.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__numdiff.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__remove_redundancy.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__root.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__shgo.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test__spectral.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_cobyla.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_constraint_conversion.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_constraints.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_cython_optimize.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_differentiable_functions.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_hessinv.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_lbfgsb_setulb.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_least_squares.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_linear_assignment.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_linesearch.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_linprog.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_common.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_lsq_linear.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_minimize_constrained.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_minpack.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_nnls.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_nonlin.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_optimize.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_quadratic_assignment.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_slsqp.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_tnc.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_exact.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_trustregion_krylov.py -.tox/python/lib/python3.8/site-packages/scipy/optimize/tests/test_zeros.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_array_tools.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_bsplines.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_cont2discrete.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_dltisys.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_filter_design.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_fir_filter_design.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_ltisys.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_max_len_seq.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_peak_finding.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_result_type.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_savitzky_golay.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_signaltools.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_spectral.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_upfirdn.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_waveforms.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_wavelets.py -.tox/python/lib/python3.8/site-packages/scipy/signal/tests/test_windows.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_connected_components.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_conversions.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_flow.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_matching.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_reordering.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_shortest_path.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_spanning_tree.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/csgraph/tests/test_traversal.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/dsolve/tests/test_linsolve.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_gcrotmk.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lgmres.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsmr.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_lsqr.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_minres.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/isolve/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_interface.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_matfuncs.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_norm.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_onenormest.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/linalg/tests/test_pydata_sparse.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_base.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_construct.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_csc.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_csr.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_extract.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_matrix_io.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_sparsetools.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_spfuncs.py -.tox/python/lib/python3.8/site-packages/scipy/sparse/tests/test_sputils.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test__plotutils.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test__procrustes.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test_distance.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test_hausdorff.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test_kdtree.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test_qhull.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test_slerp.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/tests/test_spherical_voronoi.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_groups.py -.tox/python/lib/python3.8/site-packages/scipy/spatial/transform/tests/test_rotation_spline.py -.tox/python/lib/python3.8/site-packages/scipy/special/cython_special.pxd -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_basic.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_bdtr.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_boxcox.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_cdflib.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_cosine_distr.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_cython_special.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_data.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_digamma.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_ellip_harm.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_erfinv.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_exponential_integrals.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_faddeeva.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_gamma.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_gammainc.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_hypergeometric.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_kolmogorov.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_lambertw.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_log_softmax.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_loggamma.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_logit.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_logsumexp.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_mpmath.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_nan_inputs.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_ndtr.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_ndtri_exp.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_orthogonal_eval.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_owens_t.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_pcf.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_pdtr.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_precompute_expn_asy.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_precompute_gammainc.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_precompute_utils.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_round.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_sf_error.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_sici.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_spence.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_spfun_stats.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_sph_harm.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_spherical_bessel.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_trig.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_wright_bessel.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_wrightomega.py -.tox/python/lib/python3.8/site-packages/scipy/special/tests/test_zeta.py -.tox/python/lib/python3.8/site-packages/scipy/stats/biasedurn.pxd -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_binned_statistic.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_bootstrap.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_contingency.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_continuous_basic.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_crosstab.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_basic.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_discrete_distns.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_distributions.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_entropy.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_fit.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_hypotests.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_kdeoth.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_morestats.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_basic.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_mstats_extras.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_multivariate.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_qmc.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_rank.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_relative_risk.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_stats.py -.tox/python/lib/python3.8/site-packages/scipy/stats/tests/test_tukeylambda_stats.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_algorithms.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_axisgrid.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_categorical.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_core.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_distributions.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_docstrings.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_matrix.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_miscplot.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_palettes.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_rcmod.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_relational.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_statistics.py -.tox/python/lib/python3.8/site-packages/seaborn/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/sklearn/_loss/tests/test_glm_distribution.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/_k_means_fast.pxd -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_affinity_propagation.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_bicluster.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_birch.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_dbscan.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_feature_agglomeration.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_hierarchical.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_k_means.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_mean_shift.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_optics.py -.tox/python/lib/python3.8/site-packages/sklearn/cluster/tests/test_spectral.py -.tox/python/lib/python3.8/site-packages/sklearn/compose/tests/test_column_transformer.py -.tox/python/lib/python3.8/site-packages/sklearn/compose/tests/test_target.py -.tox/python/lib/python3.8/site-packages/sklearn/covariance/tests/test_covariance.py -.tox/python/lib/python3.8/site-packages/sklearn/covariance/tests/test_elliptic_envelope.py -.tox/python/lib/python3.8/site-packages/sklearn/covariance/tests/test_graphical_lasso.py -.tox/python/lib/python3.8/site-packages/sklearn/covariance/tests/test_robust_covariance.py -.tox/python/lib/python3.8/site-packages/sklearn/cross_decomposition/tests/test_pls.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_20news.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_california_housing.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_covtype.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_kddcup99.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_lfw.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_olivetti_faces.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_openml.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_rcv1.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_samples_generator.py -.tox/python/lib/python3.8/site-packages/sklearn/datasets/tests/test_svmlight_format.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_dict_learning.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_factor_analysis.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_fastica.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_incremental_pca.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_kernel_pca.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_nmf.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_online_lda.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_pca.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_sparse_pca.py -.tox/python/lib/python3.8/site-packages/sklearn/decomposition/tests/test_truncated_svd.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/common.pxd -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_binning.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_compare_lightgbm.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_grower.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_histogram.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_loss.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_monotonic_contraints.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_predictor.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_splitting.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/_hist_gradient_boosting/tests/test_warm_start.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_bagging.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_forest.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_gradient_boosting_loss_functions.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_iforest.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_stacking.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_voting.py -.tox/python/lib/python3.8/site-packages/sklearn/ensemble/tests/test_weight_boosting.py -.tox/python/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py -.tox/python/lib/python3.8/site-packages/sklearn/experimental/tests/test_enable_iterative_imputer.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_dict_vectorizer.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_feature_hasher.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_image.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_text.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_chi2.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_feature_select.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_from_model.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_mutual_info.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_rfe.py -.tox/python/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_variance_threshold.py -.tox/python/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpc.py -.tox/python/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_gpr.py -.tox/python/lib/python3.8/site-packages/sklearn/gaussian_process/tests/test_kernels.py -.tox/python/lib/python3.8/site-packages/sklearn/impute/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/impute/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/impute/tests/test_impute.py -.tox/python/lib/python3.8/site-packages/sklearn/impute/tests/test_knn.py -.tox/python/lib/python3.8/site-packages/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py -.tox/python/lib/python3.8/site-packages/sklearn/inspection/tests/test_partial_dependence.py -.tox/python/lib/python3.8/site-packages/sklearn/inspection/tests/test_permutation_importance.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/_sgd_fast.pxd -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_glm.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/_glm/tests/test_link.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_bayes.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_coordinate_descent.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_huber.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_least_angle.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_logistic.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_omp.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_passive_aggressive.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_perceptron.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ransac.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ridge.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sag.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sgd.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_sparse_coordinate_descent.py -.tox/python/lib/python3.8/site-packages/sklearn/linear_model/tests/test_theil_sen.py -.tox/python/lib/python3.8/site-packages/sklearn/manifold/tests/test_isomap.py -.tox/python/lib/python3.8/site-packages/sklearn/manifold/tests/test_locally_linear.py -.tox/python/lib/python3.8/site-packages/sklearn/manifold/tests/test_mds.py -.tox/python/lib/python3.8/site-packages/sklearn/manifold/tests/test_spectral_embedding.py -.tox/python/lib/python3.8/site-packages/sklearn/manifold/tests/test_t_sne.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_confusion_matrix.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_precision_recall.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/_plot/tests/test_plot_roc_curve.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_bicluster.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_supervised.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/cluster/tests/test_unsupervised.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/tests/test_classification.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/tests/test_pairwise.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/tests/test_ranking.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/tests/test_regression.py -.tox/python/lib/python3.8/site-packages/sklearn/metrics/tests/test_score_objects.py -.tox/python/lib/python3.8/site-packages/sklearn/mixture/tests/test_bayesian_mixture.py -.tox/python/lib/python3.8/site-packages/sklearn/mixture/tests/test_gaussian_mixture.py -.tox/python/lib/python3.8/site-packages/sklearn/mixture/tests/test_mixture.py -.tox/python/lib/python3.8/site-packages/sklearn/model_selection/tests/test_search.py -.tox/python/lib/python3.8/site-packages/sklearn/model_selection/tests/test_split.py -.tox/python/lib/python3.8/site-packages/sklearn/model_selection/tests/test_validation.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/_dist_metrics.pxd -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/_quad_tree.pxd -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/_typedefs.pxd -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_ball_tree.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_dist_metrics.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_graph.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kd_tree.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_kde.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_lof.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nca.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nearest_centroid.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_pipeline.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_neighbors_tree.py -.tox/python/lib/python3.8/site-packages/sklearn/neighbors/tests/test_quad_tree.py -.tox/python/lib/python3.8/site-packages/sklearn/neural_network/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/neural_network/tests/test_mlp.py -.tox/python/lib/python3.8/site-packages/sklearn/neural_network/tests/test_rbm.py -.tox/python/lib/python3.8/site-packages/sklearn/neural_network/tests/test_stochastic_optimizers.py -.tox/python/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_data.py -.tox/python/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_discretization.py -.tox/python/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_encoders.py -.tox/python/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_function_transformer.py -.tox/python/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_label.py -.tox/python/lib/python3.8/site-packages/sklearn/semi_supervised/tests/test_label_propagation.py -.tox/python/lib/python3.8/site-packages/sklearn/svm/tests/test_bounds.py -.tox/python/lib/python3.8/site-packages/sklearn/svm/tests/test_sparse.py -.tox/python/lib/python3.8/site-packages/sklearn/svm/tests/test_svm.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_base.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_build.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_calibration.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_check_build.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_common.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_config.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_discriminant_analysis.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_docstring_parameters.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_dummy.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_import_deprecations.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_init.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_isotonic.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_kernel_approximation.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_kernel_ridge.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_metaestimators.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_multiclass.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_multioutput.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_naive_bayes.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_pipeline.py -.tox/python/lib/python3.8/site-packages/sklearn/tests/test_random_projection.py -.tox/python/lib/python3.8/site-packages/sklearn/tree/_criterion.pxd -.tox/python/lib/python3.8/site-packages/sklearn/tree/_splitter.pxd -.tox/python/lib/python3.8/site-packages/sklearn/tree/_tree.pxd -.tox/python/lib/python3.8/site-packages/sklearn/tree/_utils.pxd -.tox/python/lib/python3.8/site-packages/sklearn/tree/tests/test_export.py -.tox/python/lib/python3.8/site-packages/sklearn/tree/tests/test_reingold_tilford.py -.tox/python/lib/python3.8/site-packages/sklearn/tree/tests/test_tree.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/_cython_blas.pxd -.tox/python/lib/python3.8/site-packages/sklearn/utils/_fast_dict.pxd -.tox/python/lib/python3.8/site-packages/sklearn/utils/_random.pxd -.tox/python/lib/python3.8/site-packages/sklearn/utils/_seq_dataset.pxd -.tox/python/lib/python3.8/site-packages/sklearn/utils/_weight_vector.pxd -.tox/python/lib/python3.8/site-packages/sklearn/utils/murmurhash.pxd -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_class_weight.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_cython_blas.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecated_utils.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_deprecation.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_checks.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_estimator_html_repr.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_extmath.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_fast_dict.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_fixes.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_metaestimators.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_multiclass.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_murmurhash.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_optimize.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_pprint.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_random.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_seq_dataset.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_shortest_path.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_show_versions.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_sparsefuncs.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_testing.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_utils.py -.tox/python/lib/python3.8/site-packages/sklearn/utils/tests/test_validation.py -.tox/python/lib/python3.8/site-packages/tests/test_config.py -.tox/python/lib/python3.8/site-packages/tests/test_core.py -.tox/python/lib/python3.8/site-packages/tests/test_linters.py -.tox/python/lib/python3.8/site-packages/traitlets/config/tests/test_application.py -.tox/python/lib/python3.8/site-packages/traitlets/config/tests/test_configurable.py -.tox/python/lib/python3.8/site-packages/traitlets/config/tests/test_loader.py -.tox/python/lib/python3.8/site-packages/traitlets/tests/test_traitlets.py -.tox/python/lib/python3.8/site-packages/traitlets/tests/test_traitlets_enum.py -.tox/python/lib/python3.8/site-packages/traitlets/utils/tests/test_bunch.py -.tox/python/lib/python3.8/site-packages/traitlets/utils/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/traitlets/utils/tests/test_importstring.py -.tox/python/lib/python3.8/site-packages/wcwidth/tests/test_core.py -.tox/python/lib/python3.8/site-packages/zmq/__init__.pxd -.tox/python/lib/python3.8/site-packages/zmq/backend/cython/__init__.pxd -.tox/python/lib/python3.8/site-packages/zmq/backend/cython/checkrc.pxd -.tox/python/lib/python3.8/site-packages/zmq/backend/cython/context.pxd -.tox/python/lib/python3.8/site-packages/zmq/backend/cython/libzmq.pxd -.tox/python/lib/python3.8/site-packages/zmq/backend/cython/message.pxd -.tox/python/lib/python3.8/site-packages/zmq/backend/cython/socket.pxd -.tox/python/lib/python3.8/site-packages/zmq/devices/monitoredqueue.pxd -.tox/python/lib/python3.8/site-packages/zmq/tests/test_asyncio.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_auth.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_cffi_backend.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_constants.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_context.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_cython.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_decorators.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_device.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_draft.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_error.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_etc.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_future.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_imports.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_includes.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_ioloop.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_log.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_message.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_monitor.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_monqueue.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_multipart.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_mypy.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_pair.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_poll.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_proxy_steerable.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_pubsub.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_reqrep.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_retry_eintr.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_security.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_socket.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_ssh.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_version.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_win32_shim.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_z85.py -.tox/python/lib/python3.8/site-packages/zmq/tests/test_zmqstream.py -.tox/python/lib/python3.8/site-packages/zmq/utils/buffers.pxd +.github/workflows/build.yml +benchmarks/benchmark.py +benchmarks/benchmark_fit_transform.csv +benchmarks/benchmark_fit_transform.ipynb +benchmarks/benchmark_transform_numpy.ipynb +benchmarks/figs/BinRareCategories_fit_transform.jpg +benchmarks/figs/BinRareCategories_transform_numpy.jpg +benchmarks/figs/Binning_fit_transform.jpg +benchmarks/figs/Binning_transform_numpy.jpg +benchmarks/figs/Clipping_fit_transform.jpg +benchmarks/figs/Clipping_transform_numpy.jpg +benchmarks/figs/ClusterStatistics_fit_transform.jpg +benchmarks/figs/ClusterStatistics_transform_numpy.jpg +benchmarks/figs/CustomBinning_transform_numpy.jpg +benchmarks/figs/CyclicDayOfMonth_fit_transform.jpg +benchmarks/figs/CyclicDayOfMonth_transform_numpy.jpg +benchmarks/figs/CyclicDayOfWeek_fit_transform.jpg +benchmarks/figs/CyclicDayOfWeek_transform_numpy.jpg +benchmarks/figs/CyclicHourOfDay_fit_transform.jpg +benchmarks/figs/CyclicHourOfDay_transform_numpy.jpg +benchmarks/figs/CyclicMinuteOfHour_fit_transform.jpg +benchmarks/figs/CyclicMinuteOfHour_transform_numpy.jpg +benchmarks/figs/CyclicMonthOfYear_fit_transform.jpg +benchmarks/figs/CyclicMonthOfYear_transform_numpy.jpg +benchmarks/figs/DeltaTime_fit_transform.jpg +benchmarks/figs/DeltaTime_transform_numpy.jpg +benchmarks/figs/DropColumns_fit_transform.jpg +benchmarks/figs/DropColumns_transform_numpy.jpg +benchmarks/figs/DropDatatypeColumns_fit_transform.jpg +benchmarks/figs/DropDatatypeColumns_transform_numpy.jpg +benchmarks/figs/DropHighCardinality_fit_transform.jpg +benchmarks/figs/DropHighCardinality_transform_numpy.jpg +benchmarks/figs/DropHighNaNRatio_fit_transform.jpg +benchmarks/figs/DropHighNaNRatio_transform_numpy.jpg +benchmarks/figs/DropLowCardinality_fit_transform.jpg +benchmarks/figs/DropLowCardinality_transform_numpy.jpg +benchmarks/figs/ElementaryArithmetics_fit_transform.jpg +benchmarks/figs/ElementaryArithmetics_transform_numpy.jpg +benchmarks/figs/Extract_fit_transform.jpg +benchmarks/figs/Extract_transform_numpy.jpg +benchmarks/figs/FloatImputer_transform_numpy.jpg +benchmarks/figs/IntImputer_transform_numpy.jpg +benchmarks/figs/IsEqual_fit_transform.jpg +benchmarks/figs/IsEqual_transform_numpy.jpg +benchmarks/figs/IsNull_fit_transform.jpg +benchmarks/figs/IsNull_transform_numpy.jpg +benchmarks/figs/KeepColumns_fit_transform.jpg +benchmarks/figs/KeepColumns_transform_numpy.jpg +benchmarks/figs/LowerCase_fit_transform.jpg +benchmarks/figs/LowerCase_transform_numpy.jpg +benchmarks/figs/MinMaxScaler_fit_transform.jpg +benchmarks/figs/MinMaxScaler_transform_numpy.jpg +benchmarks/figs/NumericsImputer_fit_transform.jpg +benchmarks/figs/NumericsImputer_transform_numpy.jpg +benchmarks/figs/ObjectImputer_fit_transform.jpg +benchmarks/figs/ObjectImputer_transform_numpy.jpg +benchmarks/figs/OneHotEncoder_fit_transform.jpg +benchmarks/figs/OneHotEncoder_transform_numpy.jpg +benchmarks/figs/OneHot_fit_transform.jpg +benchmarks/figs/OneHot_transform_numpy.jpg +benchmarks/figs/OrdinalDayOfMonth_fit_transform.jpg +benchmarks/figs/OrdinalDayOfMonth_transform_numpy.jpg +benchmarks/figs/OrdinalDayOfWeek_fit_transform.jpg +benchmarks/figs/OrdinalDayOfWeek_transform_numpy.jpg +benchmarks/figs/OrdinalEncoder_fit_transform.jpg +benchmarks/figs/OrdinalEncoder_transform_numpy.jpg +benchmarks/figs/OrdinalHourOfDay_fit_transform.jpg +benchmarks/figs/OrdinalHourOfDay_transform_numpy.jpg +benchmarks/figs/OrdinalMinuteOfHour_fit_transform.jpg +benchmarks/figs/OrdinalMinuteOfHour_transform_numpy.jpg +benchmarks/figs/OrdinalMonthOfYear_fit_transform.jpg +benchmarks/figs/OrdinalMonthOfYear_transform_numpy.jpg +benchmarks/figs/PlaneRotation_fit_transform.jpg +benchmarks/figs/PlaneRotation_transform_numpy.jpg +benchmarks/figs/PolynomialFeatures_fit_transform.jpg +benchmarks/figs/PolynomialFeatures_transform_numpy.jpg +benchmarks/figs/QuantileBinning_fit_transform.jpg +benchmarks/figs/QuantileBinning_transform_numpy.jpg +benchmarks/figs/Replace_transform_numpy.jpg +benchmarks/figs/SplitExtract_fit_transform.jpg +benchmarks/figs/SplitExtract_transform_numpy.jpg +benchmarks/figs/StandardScaler_fit_transform.jpg +benchmarks/figs/StandardScaler_transform_numpy.jpg +benchmarks/figs/StringContains_fit_transform.jpg +benchmarks/figs/StringContains_transform_numpy.jpg +benchmarks/figs/StringLength_fit_transform.jpg +benchmarks/figs/StringLength_transform_numpy.jpg +benchmarks/figs/SupervisedSampling_fit_transform.jpg +benchmarks/figs/TargetEncoder_fit_transform.jpg +benchmarks/figs/TargetEncoder_transform_numpy.jpg +benchmarks/figs/TreeBinning_fit_transform.jpg +benchmarks/figs/UnsupervisedSampling_fit_transform.jpg +benchmarks/figs/UpperCase_fit_transform.jpg +benchmarks/figs/UpperCase_transform_numpy.jpg +benchmarks/figs/WOEEncoder_fit_transform.jpg +benchmarks/figs/WOEEncoder_transform_numpy.jpg +cov_html/coverage_html.js +cov_html/d_06c032577783e370_clipping_py.html +cov_html/d_1cfcd38d8af35d51_util_py.html +cov_html/d_2e7b559919172292__base_encoder_py.html +cov_html/d_2e7b559919172292_binned_columns_encoder_py.html +cov_html/d_2e7b559919172292_onehot_encoder_py.html +cov_html/d_2e7b559919172292_ordinal_encoder_py.html +cov_html/d_2e7b559919172292_target_encoder_py.html +cov_html/d_2e7b559919172292_woe_encoder_py.html +cov_html/d_8813d29e2db35b41__base_imputer_py.html +cov_html/d_8813d29e2db35b41_numerics_imputer_py.html +cov_html/d_8813d29e2db35b41_object_imputer_py.html +cov_html/d_b016ed27f73af4c4_minmax_scaler_py.html +cov_html/d_b016ed27f73af4c4_standard_scaler_py.html +cov_html/d_b13ffdfa7fdfb0fb__base_binning_py.html +cov_html/d_c5ff3984fec972b3_xgb_treelite_dumper_py.html +cov_html/favicon_32.png +cov_html/index.html +cov_html/jquery.ba-throttle-debounce.min.js +cov_html/jquery.hotkeys.js +cov_html/jquery.isonscreen.js +cov_html/jquery.min.js +cov_html/jquery.tablesorter.min.js +cov_html/keybd_closed.png +cov_html/keybd_open.png +cov_html/status.json +cov_html/style.css +doc_data/GATORS_LOGO.png +doc_data/SplitExtract.jpg +doc_data/cython_logo.jpeg +doc_data/dask_logo.jpeg +doc_data/dask_logo.png +doc_data/gators.css +doc_data/gators.pptx +doc_data/gators_logo.ico +doc_data/gators_logo.jpg +doc_data/hyperopt_logo copy.png +doc_data/hyperopt_logo.png +doc_data/koalas_logo.png +doc_data/lightgbm_logo.png +doc_data/numpy_logo.png +doc_data/pandas_logo.png +doc_data/sklearn_logo.png +doc_data/treelite.png +doc_data/treelite_logo.png +doc_data/xgboost_logo.png +docker/dockerfile +docker_ppnb/Dockerfile +examples/10min.ipynb +examples/dummy_lgbm_model.txt +examples/house_price.ipynb +examples/libraries.ipynb +examples/sf_crime.ipynb +examples/templates.ipynb +examples/titanic.ipynb +examples/data/house_prices.parquet +examples/data/sf_crime.csv +examples/data/titanic.csv +examples/data/titanic.parquet +examples/data/sf_crime.parquet/._SUCCESS.crc +examples/data/sf_crime.parquet/.part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet.crc +examples/data/sf_crime.parquet/_SUCCESS +examples/data/sf_crime.parquet/part-00000-88e609c2-e153-4fb1-8a8a-4b29dc7ded2c-c000.snappy.parquet +examples/models/model_lgbm_house.dill +examples/models/model_titanic.dill +examples/models/model_xgb_sfcrime.dill +examples/models/treelite_lgbm_house.zip +examples/models/treelite_lgbm_sfcrime.zip gators/__init__.py gators.egg-info/PKG-INFO gators.egg-info/SOURCES.txt @@ -39658,30 +183,109 @@ gators.egg-info/dependency_links.txt gators.egg-info/not-zip-safe gators.egg-info/requires.txt gators.egg-info/top_level.txt +gators/__pycache__/__init__.cpython-36.pyc gators/binning/__init__.py -gators/binning/_base_discretizer.py -gators/binning/bin_rare_events.py +gators/binning/_base_binning.py +gators/binning/bin_rare_categories.py +gators/binning/bin_single_target_class_categories.py +gators/binning/binning.py gators/binning/binning.pyx -gators/binning/custom_discretizer.py -gators/binning/discretizer.py -gators/binning/quantile_discretizer.py -gators/binning/tests/test_bin_rare_events.py -gators/binning/tests/test_custom_discretizer.py -gators/binning/tests/test_discretizer.py -gators/binning/tests/test_quantile_discretizer.py +gators/binning/custom_binning.py +gators/binning/quantile_binning.py +gators/binning/tree_binning.py +gators/binning/tests/test_bin_rare_categories_dd.py +gators/binning/tests/test_bin_rare_categories_ks.py +gators/binning/tests/test_bin_rare_categories_pd.py +gators/binning/tests/test_bin_single_target_class_categories_dd.py +gators/binning/tests/test_bin_single_target_class_categories_ks.py +gators/binning/tests/test_bin_single_target_class_categories_pd.py +gators/binning/tests/test_binning_dd.py +gators/binning/tests/test_binning_ks.py +gators/binning/tests/test_binning_pd.py +gators/binning/tests/test_custom_binning_dd.py +gators/binning/tests/test_custom_binning_ks.py +gators/binning/tests/test_custom_binning_pd.py +gators/binning/tests/test_quantile_binning_dd.py +gators/binning/tests/test_quantile_binning_ks.py +gators/binning/tests/test_quantile_binning_pd.py +gators/binning/tests/test_tree_binning_dd.py +gators/binning/tests/test_tree_binning_ks.py +gators/binning/tests/test_tree_binning_pd.py +gators/binning/tests/__pycache__/test_bin_rare_events.cpython-36-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events.cpython-37-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events_dd.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events_dd.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events_ks.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events_ks.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events_pd.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_bin_rare_events_pd.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer.cpython-36-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer.cpython-37-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer_dd.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer_ks.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_custom_discretizer_pd.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_discretizer.cpython-36-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_discretizer.cpython-37-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_discretizer.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_discretizer.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_discretizer_ks.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_discretizer_pd.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer.cpython-36-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer.cpython-37-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer.cpython-38-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer_dd.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer_ks.cpython-39-pytest-6.2.5.pyc +gators/binning/tests/__pycache__/test_quantile_discretizer_pd.cpython-39-pytest-6.2.5.pyc gators/clipping/__init__.py gators/clipping/clipping.py gators/clipping/clipping.pyx -gators/clipping/tests/test_clipping.py +gators/clipping/quantile_clipping.py +gators/clipping/__pycache__/__init__.cpython-38.pyc +gators/clipping/__pycache__/clipping.cpython-38.pyc +gators/clipping/tests/test_clipping_dd.py +gators/clipping/tests/test_clipping_ks.py +gators/clipping/tests/test_clipping_pd.py +gators/clipping/tests/test_quantile_clipping_dd.py +gators/clipping/tests/test_quantile_clipping_ks.py +gators/clipping/tests/test_quantile_clipping_pd.py +gators/clipping/tests/__pycache__/test_clipping.cpython-36-pytest-6.2.5.pyc +gators/clipping/tests/__pycache__/test_clipping.cpython-37-pytest-6.2.5.pyc +gators/clipping/tests/__pycache__/test_clipping.cpython-38-pytest-6.2.5.pyc +gators/clipping/tests/__pycache__/test_clipping.cpython-39-pytest-6.2.5.pyc gators/converter/__init__.py -gators/converter/convert_column_datatype.py -gators/converter/koalas_to_pandas.py gators/converter/to_numpy.py -gators/converter/tests/test_convert_column_datatype.py -gators/converter/tests/test_koalas_to_pandas.py -gators/converter/tests/test_to_numpy.py +gators/converter/to_pandas.py +gators/converter/__pycache__/__init__.cpython-38.pyc +gators/converter/__pycache__/convert_column_datatype.cpython-38.pyc +gators/converter/__pycache__/koalas_to_pandas.cpython-38.pyc +gators/converter/__pycache__/to_numpy.cpython-38.pyc +gators/converter/tests/test_to_numpy_dd.py +gators/converter/tests/test_to_numpy_ks.py +gators/converter/tests/test_to_numpy_pd.py +gators/converter/tests/test_to_pandas_dd.py +gators/converter/tests/test_to_pandas_ks.py +gators/converter/tests/test_to_pandas_pd.py +gators/converter/tests/__pycache__/test_convert_column_datatype.cpython-36-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_convert_column_datatype.cpython-37-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_convert_column_datatype.cpython-38-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_convert_column_datatype.cpython-39-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_koalas_to_pandas.cpython-36-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_koalas_to_pandas.cpython-37-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_koalas_to_pandas.cpython-38-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_koalas_to_pandas.cpython-39-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_to_numpy.cpython-36-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_to_numpy.cpython-37-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_to_numpy.cpython-38-pytest-6.2.5.pyc +gators/converter/tests/__pycache__/test_to_numpy.cpython-39-pytest-6.2.5.pyc +gators/data_cleaning/.gitignore gators/data_cleaning/__init__.py gators/data_cleaning/_base_data_cleaning.py +gators/data_cleaning/convert_column_datatype.py gators/data_cleaning/data_cleaning.pyx gators/data_cleaning/drop_columns.py gators/data_cleaning/drop_datatype_columns.py @@ -39689,47 +293,150 @@ gators/data_cleaning/drop_high_cardinality.py gators/data_cleaning/drop_high_nan_ratio.py gators/data_cleaning/drop_low_cardinality.py gators/data_cleaning/keep_columns.py +gators/data_cleaning/rename_columns.py gators/data_cleaning/replace.py -gators/data_cleaning/tests/test_drop_columns.py -gators/data_cleaning/tests/test_drop_datatype_columns.py -gators/data_cleaning/tests/test_drop_high_cardinality.py -gators/data_cleaning/tests/test_drop_high_nan_ratio.py -gators/data_cleaning/tests/test_drop_low_cardinality.py -gators/data_cleaning/tests/test_keep_columns.py -gators/data_cleaning/tests/test_replace.py +gators/data_cleaning/tests/test_convert_column_datatype_dd.py +gators/data_cleaning/tests/test_convert_column_datatype_ks.py +gators/data_cleaning/tests/test_convert_column_datatype_pd.py +gators/data_cleaning/tests/test_drop_columns_dd.py +gators/data_cleaning/tests/test_drop_columns_ks.py +gators/data_cleaning/tests/test_drop_columns_pd.py +gators/data_cleaning/tests/test_drop_datatype_columns_dd.py +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py +gators/data_cleaning/tests/test_drop_datatype_columns_pd.py +gators/data_cleaning/tests/test_drop_high_cardinality_dd.py +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py +gators/data_cleaning/tests/test_drop_high_cardinality_pd.py +gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py +gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py +gators/data_cleaning/tests/test_drop_low_cardinality_dd.py +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py +gators/data_cleaning/tests/test_drop_low_cardinality_pd.py +gators/data_cleaning/tests/test_keep_columns_dd.py +gators/data_cleaning/tests/test_keep_columns_ks.py +gators/data_cleaning/tests/test_keep_columns_pd.py +gators/data_cleaning/tests/test_rename_columns_dd.py +gators/data_cleaning/tests/test_rename_columns_ks.py +gators/data_cleaning/tests/test_rename_columns_pd.py +gators/data_cleaning/tests/test_replace_dd.py +gators/data_cleaning/tests/test_replace_ks.py +gators/data_cleaning/tests/test_replace_pd.py +gators/data_cleaning/tests/__pycache__/test_convert_column_datatype_dd.py +gators/data_cleaning/tests/__pycache__/test_convert_column_datatype_ks.py +gators/data_cleaning/tests/__pycache__/test_convert_column_datatype_pd.py gators/encoders/__init__.py gators/encoders/_base_encoder.py +gators/encoders/count_encoder.py gators/encoders/encoder.pyx -gators/encoders/multiclass_encoder.py gators/encoders/onehot_encoder.py gators/encoders/ordinal_encoder.py -gators/encoders/regression_encoder.py gators/encoders/target_encoder.py gators/encoders/woe_encoder.py +gators/encoders/__pycache__/__init__.cpython-38.pyc +gators/encoders/__pycache__/_base_encoder.cpython-38.pyc +gators/encoders/__pycache__/multiclass_encoder.cpython-38.pyc +gators/encoders/__pycache__/onehot_encoder.cpython-38.pyc +gators/encoders/__pycache__/ordinal_encoder.cpython-38.pyc +gators/encoders/__pycache__/regression_encoder.cpython-38.pyc +gators/encoders/__pycache__/target_encoder.cpython-38.pyc +gators/encoders/__pycache__/woe_encoder.cpython-38.pyc gators/encoders/tests/test_base_encoder.py -gators/encoders/tests/test_muticlass_encoder.py -gators/encoders/tests/test_onehot_encoder.py -gators/encoders/tests/test_ordinal_encoder.py -gators/encoders/tests/test_regression_encoder.py -gators/encoders/tests/test_target_encoder.py -gators/encoders/tests/test_woe_encoder.py +gators/encoders/tests/test_count_encoder_pd.py +gators/encoders/tests/test_onehot_encoder_dd.py +gators/encoders/tests/test_onehot_encoder_ks.py +gators/encoders/tests/test_onehot_encoder_pd.py +gators/encoders/tests/test_ordinal_encoder_dd.py +gators/encoders/tests/test_ordinal_encoder_ks.py +gators/encoders/tests/test_ordinal_encoder_pd.py +gators/encoders/tests/test_target_encoder_dd.py +gators/encoders/tests/test_target_encoder_ks.py +gators/encoders/tests/test_target_encoder_pd.py +gators/encoders/tests/test_woe_encoder_dd.py +gators/encoders/tests/test_woe_encoder_ks.py +gators/encoders/tests/test_woe_encoder_pd.py +gators/encoders/tests/__pycache__/test_base_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_base_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_base_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_base_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder_dd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder_ks.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_muticlass_encoder_pd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder_dd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder_ks.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_onehot_encoder_pd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder_dd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder_ks.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_ordinal_encoder_pd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_regression_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_regression_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_regression_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_regression_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder_dd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder_ks.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_target_encoder_pd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder.cpython-36-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder.cpython-37-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder.cpython-39-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder_dd.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder_ks.cpython-38-pytest-6.2.5.pyc +gators/encoders/tests/__pycache__/test_woe_encoder_pd.cpython-38-pytest-6.2.5.pyc +gators/feature_generation/.gitignore gators/feature_generation/__init__.py gators/feature_generation/_base_feature_generation.py gators/feature_generation/cluster_statistics.py gators/feature_generation/elementary_arithmethics.py gators/feature_generation/feature_gen.pyx gators/feature_generation/is_equal.py +gators/feature_generation/is_larger_than.py gators/feature_generation/is_null.py +gators/feature_generation/is_smaller_than.py +gators/feature_generation/negation_bool.py gators/feature_generation/one_hot.py -gators/feature_generation/plane_rotation.py +gators/feature_generation/plan_rotation.py gators/feature_generation/polynomial_features.py -gators/feature_generation/tests/test_cluster_statistics.py -gators/feature_generation/tests/test_elementary_arithmetics.py -gators/feature_generation/tests/test_is_equal.py -gators/feature_generation/tests/test_is_null.py -gators/feature_generation/tests/test_one_hot.py -gators/feature_generation/tests/test_plane_rotation.py -gators/feature_generation/tests/test_polynomial_features.py +gators/feature_generation/polynomial_object_features.py +gators/feature_generation/tests/test_cluster_statistics_dd.py +gators/feature_generation/tests/test_cluster_statistics_ks.py +gators/feature_generation/tests/test_cluster_statistics_pd.py +gators/feature_generation/tests/test_elementary_arithmetics_dd.py +gators/feature_generation/tests/test_elementary_arithmetics_ks.py +gators/feature_generation/tests/test_elementary_arithmetics_pd.py +gators/feature_generation/tests/test_is_equal_dd.py +gators/feature_generation/tests/test_is_equal_ks.py +gators/feature_generation/tests/test_is_equal_pd.py +gators/feature_generation/tests/test_is_null_dd.py +gators/feature_generation/tests/test_is_null_ks.py +gators/feature_generation/tests/test_is_null_pd.py +gators/feature_generation/tests/test_one_hot_dd.py +gators/feature_generation/tests/test_one_hot_ks.py +gators/feature_generation/tests/test_one_hot_pd.py +gators/feature_generation/tests/test_plane_rotation_dd.py +gators/feature_generation/tests/test_plane_rotation_ks.py +gators/feature_generation/tests/test_plane_rotation_pd.py +gators/feature_generation/tests/test_polynomial_features_dd.py +gators/feature_generation/tests/test_polynomial_features_ks.py +gators/feature_generation/tests/test_polynomial_features_pd.py +gators/feature_generation/tests/test_polynomial_object_features_dd.py +gators/feature_generation/tests/test_polynomial_object_features_ks.py +gators/feature_generation/tests/test_polynomial_object_features_pd.py gators/feature_generation_dt/__init__.py gators/feature_generation_dt/_base_datetime_feature.py gators/feature_generation_dt/cyclic_day_of_month.py @@ -39744,89 +451,312 @@ gators/feature_generation_dt/ordinal_day_of_week.py gators/feature_generation_dt/ordinal_hour_of_day.py gators/feature_generation_dt/ordinal_minute_of_hour.py gators/feature_generation_dt/ordinal_month_of_year.py +gators/feature_generation_dt/__pycache__/__init__.cpython-38.pyc +gators/feature_generation_dt/__pycache__/_base_datetime_feature.cpython-38.pyc +gators/feature_generation_dt/__pycache__/cyclic_day_of_month.cpython-38.pyc +gators/feature_generation_dt/__pycache__/cyclic_day_of_week.cpython-38.pyc +gators/feature_generation_dt/__pycache__/cyclic_hour_of_day.cpython-38.pyc +gators/feature_generation_dt/__pycache__/cyclic_minute_of_hour.cpython-38.pyc +gators/feature_generation_dt/__pycache__/cyclic_month_of_year.cpython-38.pyc +gators/feature_generation_dt/__pycache__/delta_time.cpython-38.pyc +gators/feature_generation_dt/__pycache__/ordinal_day_of_month.cpython-38.pyc +gators/feature_generation_dt/__pycache__/ordinal_day_of_week.cpython-38.pyc +gators/feature_generation_dt/__pycache__/ordinal_hour_of_day.cpython-38.pyc +gators/feature_generation_dt/__pycache__/ordinal_minute_of_hour.cpython-38.pyc +gators/feature_generation_dt/__pycache__/ordinal_month_of_year.cpython-38.pyc gators/feature_generation_dt/tests/test_base_datetime_features_dt.py -gators/feature_generation_dt/tests/test_cyclic_day_of_month.py -gators/feature_generation_dt/tests/test_cyclic_day_of_week.py -gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py -gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py -gators/feature_generation_dt/tests/test_cyclic_month_of_year.py -gators/feature_generation_dt/tests/test_delta_time.py -gators/feature_generation_dt/tests/test_ordinal_day_of_month.py -gators/feature_generation_dt/tests/test_ordinal_day_of_week.py -gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py -gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py -gators/feature_generation_dt/tests/test_ordinal_month_of_year.py +gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py +gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py +gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py +gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py +gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py +gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py +gators/feature_generation_dt/tests/test_delta_time_dd.py +gators/feature_generation_dt/tests/test_delta_time_ks.py +gators/feature_generation_dt/tests/test_delta_time_pd.py +gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py +gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py +gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py +gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py +gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py +gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py +gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time_dd.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time_ks.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_delta_time_pd.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-39-pytest-6.2.5.pyc gators/feature_generation_str/__init__.py gators/feature_generation_str/_base_string_feature.py +gators/feature_generation_str/contains.py +gators/feature_generation_str/endswith.py gators/feature_generation_str/extract.py gators/feature_generation_str/feature_gen_str.pyx +gators/feature_generation_str/length.py gators/feature_generation_str/lower_case.py gators/feature_generation_str/split_extract.py -gators/feature_generation_str/string_contains.py -gators/feature_generation_str/string_length.py +gators/feature_generation_str/startswith.py gators/feature_generation_str/upper_case.py -gators/feature_generation_str/tests/test_extract.py -gators/feature_generation_str/tests/test_lower_case.py -gators/feature_generation_str/tests/test_split_extract.py -gators/feature_generation_str/tests/test_string_contains.py -gators/feature_generation_str/tests/test_string_length.py -gators/feature_generation_str/tests/test_upper_case.py +gators/feature_generation_str/__pycache__/__init__.cpython-38.pyc +gators/feature_generation_str/__pycache__/_base_string_feature.cpython-38.pyc +gators/feature_generation_str/__pycache__/extract.cpython-38.pyc +gators/feature_generation_str/__pycache__/lower_case.cpython-38.pyc +gators/feature_generation_str/__pycache__/split_extract.cpython-38.pyc +gators/feature_generation_str/__pycache__/string_contains.cpython-38.pyc +gators/feature_generation_str/__pycache__/string_length.cpython-38.pyc +gators/feature_generation_str/__pycache__/upper_case.cpython-38.pyc +gators/feature_generation_str/tests/test_extract_dd.py +gators/feature_generation_str/tests/test_extract_ks.py +gators/feature_generation_str/tests/test_extract_pd.py +gators/feature_generation_str/tests/test_lower_case_dd.py +gators/feature_generation_str/tests/test_lower_case_ks.py +gators/feature_generation_str/tests/test_lower_case_pd.py +gators/feature_generation_str/tests/test_split_extract_dd.py +gators/feature_generation_str/tests/test_split_extract_ks.py +gators/feature_generation_str/tests/test_split_extract_pd.py +gators/feature_generation_str/tests/test_string_contains_dd.py +gators/feature_generation_str/tests/test_string_contains_ks.py +gators/feature_generation_str/tests/test_string_contains_pd.py +gators/feature_generation_str/tests/test_string_length_dd.py +gators/feature_generation_str/tests/test_string_length_ks.py +gators/feature_generation_str/tests/test_string_length_pd.py +gators/feature_generation_str/tests/test_upper_case_dd.py +gators/feature_generation_str/tests/test_upper_case_ks.py +gators/feature_generation_str/tests/test_upper_case_pd.py +gators/feature_generation_str/tests/__pycache__/test_extract.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_extract.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_extract.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_extract.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_lower_case.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_lower_case.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_lower_case.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_lower_case.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_split_extract.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_split_extract.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_split_extract.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_split_extract.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_contains.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_contains.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_contains.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_contains.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_length.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_length.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_length.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_string_length.cpython-39-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_upper_case.cpython-36-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_upper_case.cpython-37-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_upper_case.cpython-38-pytest-6.2.5.pyc +gators/feature_generation_str/tests/__pycache__/test_upper_case.cpython-39-pytest-6.2.5.pyc gators/feature_selection/__init__.py gators/feature_selection/_base_feature_selection.py gators/feature_selection/correlation_filter.py gators/feature_selection/information_value.py -gators/feature_selection/multiclass_information_value.py -gators/feature_selection/regression_information_value.py gators/feature_selection/select_from_model.py gators/feature_selection/select_from_models.py +gators/feature_selection/supervized_correlation_filter.py +gators/feature_selection/supervized_correlation_filter_new.py gators/feature_selection/variance_filter.py -gators/feature_selection/tests/test_correlation_filter.py -gators/feature_selection/tests/test_information_value.py -gators/feature_selection/tests/test_multiclass_information_value.py -gators/feature_selection/tests/test_regression_information_value.py -gators/feature_selection/tests/test_select_from_model.py -gators/feature_selection/tests/test_select_from_models.py -gators/feature_selection/tests/test_variance_filter.py +gators/feature_selection/__pycache__/__init__.cpython-38.pyc +gators/feature_selection/__pycache__/_base_feature_selection.cpython-38.pyc +gators/feature_selection/__pycache__/correlation_filter.cpython-38.pyc +gators/feature_selection/__pycache__/information_value.cpython-38.pyc +gators/feature_selection/__pycache__/multiclass_information_value.cpython-38.pyc +gators/feature_selection/__pycache__/regression_information_value.cpython-38.pyc +gators/feature_selection/__pycache__/select_from_model.cpython-38.pyc +gators/feature_selection/__pycache__/select_from_models.cpython-38.pyc +gators/feature_selection/__pycache__/variance_filter.cpython-38.pyc +gators/feature_selection/tests/test_correlation_filter_dd.py +gators/feature_selection/tests/test_correlation_filter_ks.py +gators/feature_selection/tests/test_correlation_filter_pd.py +gators/feature_selection/tests/test_information_value_dd.py +gators/feature_selection/tests/test_information_value_ks.py +gators/feature_selection/tests/test_information_value_pd.py +gators/feature_selection/tests/test_select_from_model_dd.py +gators/feature_selection/tests/test_select_from_model_ks.py +gators/feature_selection/tests/test_select_from_model_pd.py +gators/feature_selection/tests/test_select_from_models_dd.py +gators/feature_selection/tests/test_select_from_models_ks.py +gators/feature_selection/tests/test_select_from_models_pd.py +gators/feature_selection/tests/test_supervized_correlation_filter_dd.py +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py +gators/feature_selection/tests/test_supervized_correlation_filter_pd.py +gators/feature_selection/tests/test_variance_filter_dd.py +gators/feature_selection/tests/test_variance_filter_ks.py +gators/feature_selection/tests/test_variance_filter_pd.py +gators/feature_selection/tests/__pycache__/test_correlation_filter.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_correlation_filter.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_correlation_filter.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_correlation_filter.cpython-39-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_information_value.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_information_value.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_information_value.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_information_value.cpython-39-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_multiclass_information_value.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_multiclass_information_value.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_multiclass_information_value.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_multiclass_information_value.cpython-39-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_regression_information_value.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_regression_information_value.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_regression_information_value.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_regression_information_value.cpython-39-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_model.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_model.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_model.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_model.cpython-39-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_models.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_models.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_models.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_select_from_models.cpython-39-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_variance_filter.cpython-36-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_variance_filter.cpython-37-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_variance_filter.cpython-38-pytest-6.2.5.pyc +gators/feature_selection/tests/__pycache__/test_variance_filter.cpython-39-pytest-6.2.5.pyc gators/imputers/__init__.py gators/imputers/_base_imputer.py -gators/imputers/float_imputer.py gators/imputers/imputer.pyx -gators/imputers/int_imputer.py -gators/imputers/numerics_imputer.py +gators/imputers/numeric_imputer.py gators/imputers/object_imputer.py -gators/imputers/tests/test_imputers.py -gators/model_building/__init__.py -gators/model_building/hyperopt.py -gators/model_building/lgbm_treelite_dumper.py -gators/model_building/train_test_split.py -gators/model_building/xgb_booster_builder.py -gators/model_building/xgb_treelite_dumper.py -gators/model_building/tests/test_hyperopt.py -gators/model_building/tests/test_lgbm_treelite_dumper.py -gators/model_building/tests/test_train_test_split.py -gators/model_building/tests/test_xgb_booster_builder.py -gators/model_building/tests/test_xgb_treelite_dumper.py +gators/imputers/tests/test_imputers_dd.py +gators/imputers/tests/test_imputers_ks.py +gators/imputers/tests/test_imputers_pd.py gators/pipeline/__init__.py gators/pipeline/pipeline.py -gators/pipeline/tests/test_pipeline.py +gators/pipeline/tests/test_pipeline_dd.py +gators/pipeline/tests/test_pipeline_ks.py +gators/pipeline/tests/test_pipeline_pd.py gators/sampling/__init__.py gators/sampling/supervised_sampling.py gators/sampling/unsupervised_sampling.py -gators/sampling/tests/test_supervised_sampling.py -gators/sampling/tests/test_unsupervised_sampling.py +gators/sampling/__pycache__/__init__.cpython-38.pyc +gators/sampling/__pycache__/supervised_sampling.cpython-38.pyc +gators/sampling/__pycache__/unsupervised_sampling.cpython-38.pyc +gators/sampling/tests/test_supervised_sampling_dd.py +gators/sampling/tests/test_supervised_sampling_ks.py +gators/sampling/tests/test_supervised_sampling_pd.py +gators/sampling/tests/test_unsupervised_sampling_dd.py +gators/sampling/tests/test_unsupervised_sampling_ks.py +gators/sampling/tests/test_unsupervised_sampling_pd.py +gators/sampling/tests/__pycache__/test_supervised_sampling.cpython-36-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_supervised_sampling.cpython-37-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_supervised_sampling.cpython-38-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_supervised_sampling.cpython-39-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_unsupervised_sampling.cpython-36-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_unsupervised_sampling.cpython-37-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_unsupervised_sampling.cpython-38-pytest-6.2.5.pyc +gators/sampling/tests/__pycache__/test_unsupervised_sampling.cpython-39-pytest-6.2.5.pyc gators/scalers/__init__.py +gators/scalers/_base_scaler.py gators/scalers/minmax_scaler.py gators/scalers/scaler.pyx gators/scalers/standard_scaler.py -gators/scalers/tests/test_minmax_scaler.py -gators/scalers/tests/test_standard_scaler.py +gators/scalers/yeo_johnson.py +gators/scalers/__pycache__/__init__.cpython-38.pyc +gators/scalers/__pycache__/minmax_scaler.cpython-38.pyc +gators/scalers/__pycache__/standard_scaler.cpython-38.pyc +gators/scalers/tests/test_minmax_scaler_dd.py +gators/scalers/tests/test_minmax_scaler_ks.py +gators/scalers/tests/test_minmax_scaler_pd.py +gators/scalers/tests/test_standard_scaler_dd.py +gators/scalers/tests/test_standard_scaler_ks.py +gators/scalers/tests/test_standard_scaler_pd.py +gators/scalers/tests/test_yeo_johnson_dd.py +gators/scalers/tests/test_yeo_johnson_ks.py +gators/scalers/tests/test_yeo_johnson_pd.py +gators/scalers/tests/__pycache__/test_minmax_scaler.cpython-36-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_minmax_scaler.cpython-37-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_minmax_scaler.cpython-38-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_minmax_scaler.cpython-39-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_standard_scaler.cpython-36-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_standard_scaler.cpython-37-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_standard_scaler.cpython-38-pytest-6.2.5.pyc +gators/scalers/tests/__pycache__/test_standard_scaler.cpython-39-pytest-6.2.5.pyc gators/transformers/__init__.py gators/transformers/transformer.py gators/transformers/transformer_xy.py -gators/transformers/tests/test_transformer.py -gators/transformers/tests/test_transformer_xy.py +gators/transformers/__pycache__/__init__.cpython-38.pyc +gators/transformers/tests/test_transformer_dd.py +gators/transformers/tests/test_transformer_ks.py +gators/transformers/tests/test_transformer_pd.py +gators/transformers/tests/test_transformer_xy_dd.py +gators/transformers/tests/test_transformer_xy_ks.py +gators/transformers/tests/test_transformer_xy_pd.py +gators/transformers/tests/__pycache__/test_transformer.cpython-36-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer.cpython-37-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer.cpython-38-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer.cpython-39-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer_xy.cpython-36-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer_xy.cpython-37-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer_xy.cpython-38-pytest-6.2.5.pyc +gators/transformers/tests/__pycache__/test_transformer_xy.cpython-39-pytest-6.2.5.pyc +gators/util/.gitignore +gators/util/README.md gators/util/__init__.py -gators/util/benchmark.py +gators/util/iv.py gators/util/util.py -gators/util/tests/test_benchmark.py -gators/util/tests/test_util.py \ No newline at end of file +gators/util/tests/test_iv_pd.py +gators/util/tests/test_util_dd.py +gators/util/tests/test_util_ks.py +gators/util/tests/test_util_pd.py \ No newline at end of file diff --git a/gators.egg-info/requires.txt b/gators.egg-info/requires.txt index 6604fe65..2f129b3d 100644 --- a/gators.egg-info/requires.txt +++ b/gators.egg-info/requires.txt @@ -1,33 +1,35 @@ -Cython -setuptools>=41.0.0 -numpy==1.19.5 -requests>=2.23.0 -tqdm>=4.43.0 -scipy>=1.5.2 -Cython>=0.29.21 -dill>=0.3.1.1 -scikit-learn -seaborn>=0.11.0 +scikit-learn>=1.0.1 pandas -treelite>=0.93 -treelite-runtime>=0.93 -xgboost>=0.90 -pyDOE>=0.3.8 -scikit-optimize>=0.8.1 -emcee>=3.0.2 -pyspark>=2.4.3 -koalas -hyperopt>=0.2.5 -Lightgbm -pytest>=5.0.0 -pytest-cov>=2.6.0 -pylama>=7.6.5 -docutils==0.16.0 -sphinx>=3.3.0 -nbsphinx>=0.8.0 -pydata_sphinx_theme -ipykernel +pyarrow +lightgbm +xgboost +dill + +[dask] +fsspec>=0.3.3 +distributed +dask + +[dev] +docutils +pytest +pytest-cov +coverage +pylama jupyter numpydoc +sphinx +nbsphinx +pydata_sphinx_theme +pandoc tox tox-wheel +black +isort +pyspark +distributed +dask +numpy<=1.24.6 + +[pyspark] +pyspark diff --git a/gators/.DS_Store b/gators/.DS_Store deleted file mode 100644 index 2f10ea34..00000000 Binary files a/gators/.DS_Store and /dev/null differ diff --git a/gators/__init__.py b/gators/__init__.py index b490589e..ae884bc9 100644 --- a/gators/__init__.py +++ b/gators/__init__.py @@ -1,4 +1,18 @@ +import contextlib import os +from typing import TypeVar -__version__ = "0.1.0" +__version__ = "0.3.4" os.environ["PYARROW_IGNORE_TIMEZONE"] = "1" + +DataFrame = TypeVar("Union[pd.DataFrame, ps.DataFrame, dd.DataFrame]") +Series = TypeVar("Union[pd.Series, ps.Series, dd.Series]") + +with contextlib.suppress(ImportError): + import spark + import pyspark.pandas as ps + import warnings + + prev = spark.conf.get("spark.sql.execution.arrow.enabled") + ps.set_option("compute.default_index_type", "distributed") + warnings.filterwarnings("ignore") diff --git a/gators/__pycache__/__init__.cpython-36.pyc b/gators/__pycache__/__init__.cpython-36.pyc index 0dad24d4..18e443c4 100644 Binary files a/gators/__pycache__/__init__.cpython-36.pyc and b/gators/__pycache__/__init__.cpython-36.pyc differ diff --git a/gators/__pycache__/__init__.cpython-37.pyc b/gators/__pycache__/__init__.cpython-37.pyc index 61eac35d..c0e31a1f 100644 Binary files a/gators/__pycache__/__init__.cpython-37.pyc and b/gators/__pycache__/__init__.cpython-37.pyc differ diff --git a/gators/__pycache__/__init__.cpython-38.pyc b/gators/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 53264fb4..00000000 Binary files a/gators/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/gators/__pycache__/__init__.cpython-39.pyc b/gators/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 177feba0..00000000 Binary files a/gators/__pycache__/__init__.cpython-39.pyc and /dev/null differ diff --git a/gators/binning/__init__.py b/gators/binning/__init__.py index 61f8ecaa..67fa7e1f 100644 --- a/gators/binning/__init__.py +++ b/gators/binning/__init__.py @@ -1,13 +1,17 @@ -from ._base_discretizer import _BaseDiscretizer -from .bin_rare_events import BinRareEvents -from .custom_discretizer import CustomDiscretizer -from .discretizer import Discretizer -from .quantile_discretizer import QuantileDiscretizer +from ._base_binning import _BaseBinning +from .bin_rare_categories import BinRareCategories +from .bin_single_target_class_categories import BinSingleTargetClassCategories +from .custom_binning import CustomBinning +from .binning import Binning +from .quantile_binning import QuantileBinning +from .tree_binning import TreeBinning __all__ = [ - "_BaseDiscretizer", - "Discretizer", - "CustomDiscretizer", - "QuantileDiscretizer", - "BinRareEvents", + "_BaseBinning", + "BinSingleTargetClassCategories", + "BinRareCategories", + "Binning", + "CustomBinning", + "QuantileBinning", + "TreeBinning", ] diff --git a/gators/binning/__pycache__/__init__.cpython-38.pyc b/gators/binning/__pycache__/__init__.cpython-38.pyc index 6c5f1d4f..d86b5b1f 100644 Binary files a/gators/binning/__pycache__/__init__.cpython-38.pyc and b/gators/binning/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/binning/__pycache__/_base_discretizer.cpython-38.pyc b/gators/binning/__pycache__/_base_discretizer.cpython-38.pyc deleted file mode 100644 index 41ca0197..00000000 Binary files a/gators/binning/__pycache__/_base_discretizer.cpython-38.pyc and /dev/null differ diff --git a/gators/binning/__pycache__/bin_rare_events.cpython-38.pyc b/gators/binning/__pycache__/bin_rare_events.cpython-38.pyc deleted file mode 100644 index 5958bd0a..00000000 Binary files a/gators/binning/__pycache__/bin_rare_events.cpython-38.pyc and /dev/null differ diff --git a/gators/binning/__pycache__/custom_discretizer.cpython-38.pyc b/gators/binning/__pycache__/custom_discretizer.cpython-38.pyc deleted file mode 100644 index 5620e578..00000000 Binary files a/gators/binning/__pycache__/custom_discretizer.cpython-38.pyc and /dev/null differ diff --git a/gators/binning/__pycache__/discretizer.cpython-38.pyc b/gators/binning/__pycache__/discretizer.cpython-38.pyc deleted file mode 100644 index 45934db3..00000000 Binary files a/gators/binning/__pycache__/discretizer.cpython-38.pyc and /dev/null differ diff --git a/gators/binning/__pycache__/quantile_discretizer.cpython-38.pyc b/gators/binning/__pycache__/quantile_discretizer.cpython-38.pyc deleted file mode 100644 index 771a96a3..00000000 Binary files a/gators/binning/__pycache__/quantile_discretizer.cpython-38.pyc and /dev/null differ diff --git a/gators/binning/_base_binning.py b/gators/binning/_base_binning.py new file mode 100644 index 00000000..cb655575 --- /dev/null +++ b/gators/binning/_base_binning.py @@ -0,0 +1,177 @@ +# License: Apache-2.0 +from typing import Dict + +import pandas as pd +import numpy as np + +from binning import binning_new + +from ..transformers.transformer import Transformer +from ..util import util + +from gators import DataFrame, Series + + +class _BaseBinning(Transformer): + """Base binning transformer class. + + Parameters + ---------- + n_bins : int + Number of bins to use. + inplace : bool + If False, return the dataframe with the new binned columns + with the names *column_name__bin*). Otherwise, + return the dataframe with the existing binned columns. + """ + + def __init__(self, n_bins: int, inplace: bool): + if (not isinstance(n_bins, int)) or (n_bins <= 0): + raise TypeError("`n_bins` should be a positive int.") + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") + Transformer.__init__(self) + self.n_bins = n_bins + self.inplace = inplace + self.base_columns = [] + self.columns = [] + self.column_names = [] + self.idx_columns = np.array([]) + self.bins = {} + self.mapping = {} + self.bins_np = np.array([]) + + def fit(self, X: DataFrame, y: Series = None) -> "Transformer": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : 'Transformer' + Instance of itself. + """ + self.check_dataframe(X) + # self.base_columns = list(X.columns) + # self.columns = util.get_numerical_columns(X) + # self.column_names = self.get_column_names( + # inplace=False, columns=self.columns, suffix="bin" + # ) + # self.idx_columns = util.get_idx_columns(X.columns, self.columns) + self.set_columns(X, include=[int, float], suffix="bin") + if self.idx_columns.size == 0: + return self + self.bins_dict, self.pretty_bins_dict, self.bins_np = self.compute_bins( + X[self.columns], y + ) + self.labels, self.labels_np = self.get_labels(self.pretty_bins_dict) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + if self.idx_columns.size == 0: + return X + + new_series_list = [] + for c, n in zip(self.columns, self.column_names): + n_bins = len(self.bins_dict[c]) + dummy = X[c].where(~(X[c] < self.bins_dict[c][1]), self.labels[c][0]) + for j in range(1, n_bins - 1): + dummy = dummy.where( + ~( + (X[c] >= self.bins_dict[c][j]) + & (X[c] < self.bins_dict[c][j + 1]) + ), + self.labels[c][j], + ) + dummy = dummy.where(~(X[c] > self.bins_dict[c][-2]), self.labels[c][-1]) + new_series_list.append(dummy.rename(n)) + + X_binning = util.get_function(X).concat(new_series_list, axis=1) + if self.inplace: + columns_dict = dict(zip(self.column_names, self.columns)) + if len(self.base_columns) == len(self.column_names): + return X_binning.rename(columns=columns_dict) + return ( + util.get_function(X) + .concat([X.drop(self.columns, axis=1), X_binning], axis=1) + .rename(columns=columns_dict)[self.base_columns] + ) + return util.get_function(X).concat([X, X_binning], axis=1) + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + if self.idx_columns.size == 0: + return X + X_bin = binning_new( + X[:, self.idx_columns].astype(float), self.bins_np, self.labels_np + ) + if self.inplace: + X = X.astype(object) + X[:, self.idx_columns] = X_bin + return X + return np.concatenate((X, X_bin), axis=1) + + @staticmethod + def get_labels(pretty_bins_dict: Dict[str, np.array]): + """Get the labels of the bins. + + Parameters + ---------- + pretty_bins_dict : Dict[str, np.array]) + pretified bins used to generate the labels. + + Returns + ------- + Dict[str, np.array] + Labels. + np.array + Labels. + """ + labels = {} + for col, bins in pretty_bins_dict.items(): + if len(bins) == 2: + labels[col] = ["(-inf, inf)"] + else: + labels[col] = ( + [f"(-inf, {bins[1]})"] + + [f"[{b1}, {b2})" for b1, b2 in zip(bins[1:-2], bins[2:-1])] + + [f"[{bins[-2]}, inf)"] + ) + labels_np = ( + pd.DataFrame( + {k: {i: x for i, x in enumerate(v)} for k, v in labels.items()} + ) + .fillna(0) + .to_numpy() + ) + return labels, labels_np diff --git a/gators/binning/_base_discretizer.py b/gators/binning/_base_discretizer.py deleted file mode 100644 index 094fb379..00000000 --- a/gators/binning/_base_discretizer.py +++ /dev/null @@ -1,265 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd -from pyspark.ml.feature import Bucketizer - -from binning import discretizer, discretizer_inplace - -from ..transformers.transformer import Transformer -from ..util import util - -EPSILON = 1e-10 - - -class _BaseDiscretizer(Transformer): - """Base discretizer transformer class. - - Parameters - ---------- - n_bins : int - Number of bins to use. - inplace : bool - If False, return the dataframe with the new discretized columns - with the names '`column_name`__bin'). Otherwise, - return the dataframe with the existing binned columns. - - """ - - def __init__(self, n_bins: int, inplace: bool): - if not isinstance(n_bins, int): - raise TypeError("`n_bins` should be an int.") - if not isinstance(inplace, bool): - raise TypeError("`inplace` should be a bool.") - Transformer.__init__(self) - self.n_bins = n_bins - self.inplace = inplace - self.columns = [] - self.output_columns = [] - self.idx_columns: np.ndarray = np.array([]) - self.bins = {} - self.bins_np = np.array([]) - self.bins_ks: List[List[float]] = [[]] - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "_BaseDiscretizer": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - 'Discretizer' - Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.get_numerical_columns(X) - self.output_columns = [f"{c}__bin" for c in self.columns] - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - if self.idx_columns.size == 0: - return self - - self.bins, self.bins_np = self.compute_bins(X[self.columns], self.n_bins) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if self.idx_columns.size == 0: - return X - if isinstance(X, pd.DataFrame): - if self.inplace: - return self.bin_pd_inplace( - X, self.columns, self.output_columns, self.bins - ) - return self.bin_pd(X, self.columns, self.output_columns, self.bins) - if self.inplace: - return self.bin_ks_inplace(X, self.columns, self.output_columns, self.bins)[ - X.columns - ] - - return self.bin_ks(X, self.columns, self.output_columns, self.bins) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array. - - Parameters - ---------- - X : np.ndarray - NumPy array. - - Returns - ------- - np.ndarray - Transformed NumPy array. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if self.inplace: - if X.dtype == object: - return discretizer_inplace(X, self.bins_np, self.idx_columns) - return discretizer_inplace(X.astype(object), self.bins_np, self.idx_columns) - if X.dtype == object: - return discretizer(X, self.bins_np, self.idx_columns) - return discretizer(X.astype(object), self.bins_np, self.idx_columns) - - @staticmethod - def bin_pd_inplace( - X: pd.DataFrame, columns: List[str], output_columns: List[str], bins - ): - """Perform the binning inplace for pandas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - pd.DataFrame - Dataframe. - """ - - def f(x, bins, columns): - name = x.name - if name not in columns: - return x - return ( - pd.cut( - x, - bins[name], - labels=np.arange(len(bins[name]) - 1), - duplicates="drop", - ) - .fillna(0) - .astype(float) - .astype(str) - ) - - return X.apply(f, args=(bins, columns)) - - @staticmethod - def bin_pd(X, columns, output_columns, bins): - """Perform the binning not inplace for pandas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - pd.DataFrame - Dataframe. - """ - - def f(x, bins, columns): - name = x.name - return ( - pd.cut( - x, - bins[name], - labels=np.arange(len(bins[name]) - 1), - duplicates="drop", - ) - .fillna(0) - .astype(float) - .astype(str) - ) - - return X.join( - X[columns] - .apply(f, args=(bins, columns)) - .astype(object) - .rename(columns=dict(zip(columns, output_columns))) - ) - - @staticmethod - def bin_ks_inplace(X, columns, output_columns, bins): - """Perform the binning not inplace for kolas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - ks.DataFrame - Dataframe. - """ - X = ( - Bucketizer(splitsArray=bins, inputCols=columns, outputCols=output_columns) - .transform(X.to_spark()) - .to_koalas() - .drop(columns, axis=1) - .rename(columns=dict(zip(output_columns, columns))) - ) - X[columns] = X[columns].astype(str) - return X - - @staticmethod - def bin_ks(X, columns, output_columns, bins): - """Perform the binning inplace for kolas dataframes. - - Parameters - ---------- - X : pd.DataFrame - Dataframe. - columns : List[str] - Columns to be binnned. - output_columns : List[str] - Binnned column names. - bins : [type] - [description] - - Returns - ------- - ks.DataFrame - Dataframe. - """ - X = ( - Bucketizer(splitsArray=bins, inputCols=columns, outputCols=output_columns) - .transform(X.to_spark()) - .to_koalas() - ) - X[output_columns] = X[output_columns].astype(str) - return X diff --git a/gators/binning/bin_rare_categories.py b/gators/binning/bin_rare_categories.py new file mode 100644 index 00000000..289dfe65 --- /dev/null +++ b/gators/binning/bin_rare_categories.py @@ -0,0 +1,242 @@ +# License: Apache-2.0 +import warnings +from typing import Dict, List, Union + +import numpy as np + +from binning import bin_rare_events + +from ..transformers.transformer import Transformer +from ..util import util + +from gators import DataFrame, Series + + +class BinRareCategories(Transformer): + """Replace low occurence categories by the value "OTHERS". + + Use `BinRareCategories` to reduce the cardinality + of high cardinal columns. This transformer is also useful + to replace unseen categories by a value which is already + taken it account by the encoders. + + Parameters + ---------- + min_ratio : float + Min occurence ratio per category. + inplace : bool, default False + If False, return the dataframe with the new binned columns + with the names "column_name__bin_rare"). Otherwise, return + the dataframe with the existing binned columns. + + Examples + --------- + + Imports and initialization: + + >>> from gators.binning import BinRareCategories + >>> obj = BinRareCategories(min_ratio=0.5) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B + 0 a OTHERS + 1 a OTHERS + 2 OTHERS OTHERS + + Independly of the dataframe library used to fit the transformer, + the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. + Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> obj.transform_numpy(X.to_numpy()) + array([['a', 'OTHERS'], + ['a', 'OTHERS'], + ['OTHERS', 'OTHERS']], dtype=object) + """ + + def __init__(self, min_ratio: float, inplace: bool = True): + if not isinstance(min_ratio, (int, float)) or min_ratio < 0 or min_ratio > 1: + raise TypeError( + """`min_ratio` should be a positive float betwwen 0.0 and 1.0.""" + ) + Transformer.__init__(self) + self.min_ratio = min_ratio + self.inplace = inplace + self.columns = [] + self.idx_columns: np.ndarray = np.array([]) + self.categories_to_keep_np: np.ndarray = None + self.n_categories_to_keep_np: np.ndarray = None + self.categories_to_keep_dict: Dict[str, np.ndarray] = {} + self.categories_to_bin_dict: Dict[str, np.ndarray] = {} + + def fit(self, X: DataFrame, y: Series = None) -> "BinRareCategories": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + BinRareCategories + Instance of itself. + """ + self.check_dataframe(X) + self.base_columns = list(X.columns) + self.columns = util.get_datatype_columns(X, datatype=object) + if not self.columns: + return self + self.column_names = self.get_column_names( + self.inplace, self.columns, "bin_rare" + ) + ( + self.categories_to_keep_dict, + self.categories_to_bin_dict, + ) = self.compute_mappings( + X=X[self.columns], + min_ratio=self.min_ratio, + ) + self.categories_to_keep_np = self.get_categories_to_keep_np( + categories_to_keep_dict=self.categories_to_keep_dict, + ) + self.n_categories_to_keep_np = self.categories_to_keep_np.shape[0] - ( + self.categories_to_keep_np == None + ).sum(0) + self.idx_columns = util.get_idx_columns( + columns=X.columns, selected_columns=self.columns + ) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + if not self.columns: + return X + for name, col in zip(self.column_names, self.columns): + X[name] = X[col].mask( + ~X[col].isin(self.categories_to_keep_dict[col]), "OTHERS" + ) + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + if self.idx_columns.size == 0: + return X + X_rare = bin_rare_events( + X[:, self.idx_columns], + self.categories_to_keep_np, + self.n_categories_to_keep_np, + ) + if self.inplace: + X[:, self.idx_columns] = X_rare + return X + return np.concatenate((X, X_rare), axis=1) + + @staticmethod + def compute_mappings( + X: DataFrame, min_ratio: float + ) -> Union[Dict[str, List[str]], Dict[str, List[str]]]: + """Compute the category frequency. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + min_ratio : float + Min occurence per category. + + Returns + ------- + mapping : Dict[str, List[str]] + Categories to keep. + """ + freq = ( + util.get_function(X).to_pandas( + util.get_function(X).melt(X).groupby(["variable", "value"]).size() + / len(X) + ) + ).sort_values() + + cats_to_keep_dict = {} + cats_to_bin_dict = {} + for col in X.columns: + freq_column = freq.loc[col] + mask = freq_column >= min_ratio + cats_to_bin = list(mask[~mask].index) + cats_to_keep = list(mask[mask].index) + if (freq_column[cats_to_bin].sum() < min_ratio) and cats_to_bin: + cats_to_bin.append(cats_to_keep[0]) + cats_to_keep = cats_to_keep[1:] + cats_to_keep_dict[col] = cats_to_keep + cats_to_bin_dict[col] = cats_to_bin + return cats_to_keep_dict, cats_to_bin_dict + + @staticmethod + def get_categories_to_keep_np( + categories_to_keep_dict: Dict[str, np.ndarray] + ) -> np.ndarray: + """Get the categories to keep. + + Parameters + ---------- + categories_to_keep_dict : Dict[str, np.ndarray]) + Categories to keep. + + Returns + ------- + categories_to_keep_np : np.ndarray + Categories to keep. + """ + max_category = max([len(val) for val in categories_to_keep_dict.values()]) + n_columns = len(categories_to_keep_dict) + categories_to_keep_np = np.empty((max_category, n_columns), dtype="object") + for i, val in enumerate(categories_to_keep_dict.values()): + categories_to_keep_np[: len(val), i] = val + return categories_to_keep_np diff --git a/gators/binning/bin_rare_events.py b/gators/binning/bin_rare_events.py deleted file mode 100644 index 1cc6173c..00000000 --- a/gators/binning/bin_rare_events.py +++ /dev/null @@ -1,231 +0,0 @@ -# License: Apache-2.0 -import warnings -from typing import Dict, List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from binning import bin_rare_events - -from ..transformers.transformer import Transformer -from ..util import util - - -class BinRareEvents(Transformer): - """Replace low occurence categories by the value "OTHERS". - - Use `BinRareEvents` to reduce the cardinality - of high cardinal columns. This transformer is also useful - to replace unseen categories by a value which is already - taken it account by the encoders. - - Parameters - ---------- - min_ratio : float - Min occurence ratio per category. - - Examples - --------- - - >>> import pandas as pd - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> obj.fit_transform(X) - A B - 0 a OTHERS - 1 a OTHERS - 2 OTHERS OTHERS - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> obj.fit_transform(X) - A B - 0 a OTHERS - 1 a OTHERS - 2 OTHERS OTHERS - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'OTHERS'], - ['a', 'OTHERS'], - ['OTHERS', 'OTHERS']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import BinRareEvents - >>> obj = BinRareEvents(min_ratio=0.5) - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['a', 'b', 'c']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'OTHERS'], - ['a', 'OTHERS'], - ['OTHERS', 'OTHERS']], dtype=object) - - """ - - def __init__(self, min_ratio: float): - if not isinstance(min_ratio, float): - raise TypeError("""`min_ratio` should be a float.""") - Transformer.__init__(self) - self.min_ratio = min_ratio - self.columns = [] - self.idx_columns: np.ndarray = np.array([]) - self.categories_to_keep_np: np.ndarray = None - self.n_categories_to_keep_np: np.ndarray = None - self.categories_to_keep_dict: Dict[str, np.ndarray] = {} - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "BinRareEvents": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - BinRareEvents - Instance of itself. - """ - self.check_dataframe(X) - if object not in X.dtypes.to_numpy(): - warnings.warn( - """`X` does not contain object columns: - `BinRareEvents` is not needed""" - ) - return self - self.columns = util.get_datatype_columns(X, datatype=object) - self.categories_to_keep_dict = self.compute_categories_to_keep_dict( - X=X[self.columns], - min_ratio=self.min_ratio, - ) - self.categories_to_keep_np = self.get_categories_to_keep_np( - categories_to_keep_dict=self.categories_to_keep_dict, - ) - self.n_categories_to_keep_np = self.categories_to_keep_np.shape[0] - ( - self.categories_to_keep_np == None - ).sum(0) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - - def f(x): - name = x.name - if name not in self.categories_to_keep_dict: - return x - return x.mask(~x.isin(self.categories_to_keep_dict[name]), "OTHERS") - - return X.apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array. - - Parameters - ---------- - X : np.ndarray - NumPy array. - - Returns - ------- - np.ndarray - Transformed NumPy array. - - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if self.categories_to_keep_np.shape[0] == 0: - X[:, self.idx_columns] = "OTHERS" - return X - return bin_rare_events( - X, - self.categories_to_keep_np, - self.n_categories_to_keep_np, - self.idx_columns, - ) - - @staticmethod - def compute_categories_to_keep_dict( - X: Union[pd.DataFrame, ks.DataFrame], min_ratio: float - ) -> Dict[str, List[str]]: - """Compute the category frequency. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - min_ratio : float - Min occurence per category. - - Returns - ------- - Dict[str, List[str]]: Categories to keep. - """ - - def f(x): - freq = x.astype("object").value_counts(normalize=True).sort_values() - freq = freq[freq >= min_ratio] - return list(freq.index) - - mapping = X.apply(f).to_dict() - mapping = { - key: val if isinstance(val, list) else list(val.values()) - for key, val in mapping.items() - } - return mapping - - @staticmethod - def get_categories_to_keep_np( - categories_to_keep_dict: Dict[str, np.ndarray] - ) -> np.ndarray: - """Get the categories to keep. - - Parameters - ---------- - categories_to_keep_dict : Dict[str, np.ndarray]) - Categories to keep. - - Returns - ------- - np.ndarray - Categories to keep. - """ - max_category = max([len(val) for val in categories_to_keep_dict.values()]) - n_columns = len(categories_to_keep_dict) - categories_to_keep_np = np.empty((max_category, n_columns), dtype="object") - for i, val in enumerate(categories_to_keep_dict.values()): - categories_to_keep_np[: len(val), i] = val - return categories_to_keep_np diff --git a/gators/binning/bin_single_target_class_categories.py b/gators/binning/bin_single_target_class_categories.py new file mode 100644 index 00000000..f5cc068e --- /dev/null +++ b/gators/binning/bin_single_target_class_categories.py @@ -0,0 +1,208 @@ +# License: Apache-2.0 +import warnings + +import numpy as np + +from ..transformers.transformer import Transformer +from ..data_cleaning.replace import Replace +from ..util import util + +from gators import DataFrame, Series + + +class BinSingleTargetClassCategories(Transformer): + """Bin single target class categories. + + Ensure that the target class ratio for each categy is between 0 and 1 excluded. + Note that this transformer should only be used for binary classification problems. + + Parameters + ---------- + inplace : bool + If False, return the dataframe with the new binned columns + with the names *column_name__bin_single*). Otherwise, + return the dataframe with the existing binned columns. + + Examples + --------- + + Imports and initialization: + + >>> from gators.binning import BinSingleTargetClassCategories + >>> obj = BinSingleTargetClassCategories() + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... "A": ["_0", "_1", "_2", '_2', '_1'], + ... "B": ["_1", "_2", "_1", '_1', '_1'], + ... "C": ["_0", "_0", "_1", '_2', '_2'], + ... "D": ["_0", '_0', '_1', '_1', '_1'], + ... "E": [1, 2, 3, 4, 5]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([0, 1, 1, 0, 0], name='Target'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... "A": ["_0", "_1", "_2", '_2', '_1'], + ... "B": ["_1", "_2", "_1", '_1', '_1'], + ... "C": ["_0", "_0", "_1", '_2', '_2'], + ... "D": ["_0", '_0', '_1', '_1', '_1'], + ... "E": [1, 2, 3, 4, 5]}) + >>> y = ps.Series([0, 1, 1, 0, 0], name='Target') + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({ + ... "A": ["_0", "_1", "_2", '_2', '_1'], + ... "B": ["_1", "_2", "_1", '_1', '_1'], + ... "C": ["_0", "_0", "_1", '_2', '_2'], + ... "D": ["_0", '_0', '_1', '_1', '_1'], + ... "E": [1, 2, 3, 4, 5]}) + >>> y = pd.Series([0, 1, 1, 0, 0], name='Target') + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X, y) + A B C D E + 0 _0|_1 _1|_2 _0|_1|_2 _0 1 + 1 _0|_1 _1|_2 _0|_1|_2 _0 2 + 2 _2 _1|_2 _0|_1|_2 _1 3 + 3 _2 _1|_2 _0|_1|_2 _1 4 + 4 _0|_1 _1|_2 _0|_1|_2 _1 5 + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> obj.transform_numpy(X.to_numpy()) + array([['_0|_1', '_1|_2', '_0|_1|_2', '_0', 1], + ['_0|_1', '_1|_2', '_0|_1|_2', '_0', 2], + ['_2', '_1|_2', '_0|_1|_2', '_1', 3], + ['_2', '_1|_2', '_0|_1|_2', '_1', 4], + ['_0|_1', '_1|_2', '_0|_1|_2', '_1', 5]], dtype=object) + """ + + def __init__(self, inplace: bool = True): + Transformer.__init__(self) + self.inplace = inplace + self.replace = None + self.columns = [] + self.idx_columns: np.ndarray = np.array([]) + self.to_replace_dict = {} + self.is_binned = False + + def fit(self, X: DataFrame, y: Series) -> "BinSingleTargetClassCategories": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : Series. + Target values. + + Returns + ------- + BinSingleTargetClassCategories + Instance of itself. + """ + self.check_dataframe(X) + self.check_target(X, y) + y_name = y.name + self.base_columns = list(X.columns) + self.columns = util.get_datatype_columns(X, datatype=object) + if not self.columns: + self.is_binned = False + return self + means = ( + util.get_function(X) + .melt( + util.get_function(X).join(X[self.columns], y.to_frame()), id_vars=y_name + ) + .groupby( + ["variable", "value"], + ) + .mean()[y_name] + ) + means = util.get_function(X).to_pandas(means) + means = ( + means.groupby("variable") + .apply(lambda x: x.sort_index(level=1).sort_values()) + .droplevel(0) + ) + extreme_columns = ( + means[(means == 0) | (means == 1)].index.get_level_values(0).unique() + ) + self.to_replace_dict = {c: {} for c in extreme_columns} + self.column_names = self.get_column_names( + self.inplace, extreme_columns, "bin_single" + ) + for c in extreme_columns: + cats_0, cats_1 = [], [] + idx = (means[c] == 0).sum() + if idx: + cats_0 = list(means[c].index[: idx + 1]) + idx = (means[c] == 1).sum() + if idx: + cats_1 = list(means[c].index[-idx - 1 :]) + if bool(set(cats_0) & set(cats_1)): + cats_0 = sorted(list(set(cats_0 + cats_1))) + cats_1 = sorted(list(set(cats_0 + cats_1))) + + d_0 = dict(zip(cats_0, len(cats_0) * ["|".join(cats_0)])) + d_1 = dict(zip(cats_1, len(cats_1) * ["|".join(cats_1)])) + self.to_replace_dict[c] = {**d_0, **d_1} + self.is_binned = ( + True if sum([len(val) for val in self.to_replace_dict.values()]) else False + ) + if not self.is_binned: + return self + self.replace = Replace( + to_replace_dict=self.to_replace_dict, inplace=self.inplace + ).fit(X) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + + if not self.is_binned: + return X + columns = dict(zip(self.replace.column_names, self.column_names)) + return self.replace.transform(X).rename(columns=columns) + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + if not self.is_binned: + return X + return self.replace.transform_numpy(X) diff --git a/gators/binning/binning.c b/gators/binning/binning.c new file mode 100644 index 00000000..a6e75c8d --- /dev/null +++ b/gators/binning/binning.c @@ -0,0 +1,47596 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "binning", + "sources": [ + "gators/binning/binning.pyx" + ] + }, + "module_name": "binning" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__binning +#define __PYX_HAVE_API__binning +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#include "pythread.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/binning/binning.pyx", + "", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS +#define __pyx_atomic_int_type int +#define __pyx_nonatomic_int_type int +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__)) + #include +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ + (defined(_MSC_VER) && _MSC_VER >= 1700))) + #include +#endif +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type atomic_int + #define __pyx_atomic_incr_aligned(value) atomic_fetch_add_explicit(value, 1, memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) atomic_fetch_sub_explicit(value, 1, memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C atomics" + #endif +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ +\ + (defined(_MSC_VER) && _MSC_VER >= 1700)) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type std::atomic_int + #define __pyx_atomic_incr_aligned(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) std::atomic_fetch_sub_explicit(value, 1, std::memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C++ atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C++ atomics" + #endif +#elif CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 &&\ + (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2)))) + #define __pyx_atomic_incr_aligned(value) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type long + #undef __pyx_nonatomic_int_type + #define __pyx_nonatomic_int_type long + #pragma intrinsic (_InterlockedExchangeAdd) + #define __pyx_atomic_incr_aligned(value) _InterlockedExchangeAdd(value, 1) + #define __pyx_atomic_decr_aligned(value) _InterlockedExchangeAdd(value, -1) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview)) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview)) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_defaults; +typedef struct __pyx_defaults __pyx_defaults; +struct __pyx_defaults1; +typedef struct __pyx_defaults1 __pyx_defaults1; +struct __pyx_defaults2; +typedef struct __pyx_defaults2 __pyx_defaults2; +struct __pyx_defaults3; +typedef struct __pyx_defaults3 __pyx_defaults3; +struct __pyx_defaults { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults1 { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults2 { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults3 { + PyObject *__pyx_arg__fused_sigindex; +}; + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":302 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int_type acquisition_count; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); + PyObject *(*_get_base)(struct __pyx_memoryview_obj *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* BuildPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char); + +/* JoinPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* PyObjectFormatSimple.proto */ +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#elif PY_MAJOR_VERSION < 3 + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") :\ + PyObject_Format(s, f)) +#elif CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_repr(s) :\ + likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_repr(s) :\ + PyObject_Format(s, f)) +#else + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#endif + +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* DivInt[Py_ssize_t].proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define __Pyx_UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* AssertionsEnabled.proto */ +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (1) +#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) + static int __pyx_assertions_enabled_flag; + #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) + static int __Pyx_init_assertions_enabled(void) { + PyObject *builtins, *debug, *debug_str; + int flag; + builtins = PyEval_GetBuiltins(); + if (!builtins) goto bad; + debug_str = PyUnicode_FromStringAndSize("__debug__", 9); + if (!debug_str) goto bad; + debug = PyObject_GetItem(builtins, debug_str); + Py_DECREF(debug_str); + if (!debug) goto bad; + flag = PyObject_IsTrue(debug); + Py_DECREF(debug); + if (flag == -1) goto bad; + __pyx_assertions_enabled_flag = flag; + return 0; + bad: + __pyx_assertions_enabled_flag = 1; + return -1; + } +#else + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (!Py_OptimizeFlag) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* PySequenceMultiply.proto */ +#define __Pyx_PySequence_Multiply_Left(mul, seq) __Pyx_PySequence_Multiply(seq, mul) +static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul); + +/* SetItemInt.proto */ +#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, + int is_list, int wraparound, int boundscheck); + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* DivInt[long].proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 +#define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) +#else +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); +#endif + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_itemsize(o) PyMemoryView_GET_BUFFER(o)->itemsize +#else + // can't get format like this unfortunately. It's unicode via getattr +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj); +#endif + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_ndim(o) PyMemoryView_GET_BUFFER(o)->ndim +#else + // can't get format like this unfortunately. It's unicode via getattr +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj); +#endif + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* py_dict_values.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d); + +/* UnpackUnboundCMethod.proto */ +typedef struct { + PyObject *type; + PyObject **method_name; + PyCFunction func; + PyObject *method; + int flag; +} __Pyx_CachedCFunction; + +/* CallUnboundCMethod0.proto */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CallUnboundCMethod0(cfunc, self)\ + (likely((cfunc)->func) ?\ + (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) :\ + (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\ + (PY_VERSION_HEX >= 0x030700A0 ?\ + (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\ + (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\ + (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\ + ((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, __pyx_empty_tuple) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)) +#else +#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self) +#endif + +/* dict_getitem_default.proto */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); + +/* CallUnboundCMethod1.proto */ +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#else +#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg) +#endif + +/* CallUnboundCMethod2.proto */ +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2); +#else +#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2) __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* PyObject_Str.proto */ +#define __Pyx_PyObject_Str(obj)\ + (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) + +/* pybytes_as_double.proto */ +static double __Pyx_SlowPyString_AsDouble(PyObject *obj); +static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length); +static CYTHON_INLINE double __Pyx_PyBytes_AsDouble(PyObject *obj) { + char* as_c_string; + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + as_c_string = PyBytes_AS_STRING(obj); + size = PyBytes_GET_SIZE(obj); +#else + if (PyBytes_AsStringAndSize(obj, &as_c_string, &size) < 0) { + return (double)-1; + } +#endif + return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); +} +static CYTHON_INLINE double __Pyx_PyByteArray_AsDouble(PyObject *obj) { + char* as_c_string; + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + as_c_string = PyByteArray_AS_STRING(obj); + size = PyByteArray_GET_SIZE(obj); +#else + as_c_string = PyByteArray_AsString(obj); + if (as_c_string == NULL) { + return (double)-1; + } + size = PyByteArray_Size(obj); +#endif + return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); +} + +/* pyunicode_as_double.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS +static const char* __Pyx__PyUnicode_AsDouble_Copy(const void* data, const int kind, char* buffer, Py_ssize_t start, Py_ssize_t end) { + int last_was_punctuation; + Py_ssize_t i; + last_was_punctuation = 1; + for (i=start; i <= end; i++) { + Py_UCS4 chr = PyUnicode_READ(kind, data, i); + int is_punctuation = (chr == '_') | (chr == '.'); + *buffer = (char)chr; + buffer += (chr != '_'); + if (unlikely(chr > 127)) goto parse_failure; + if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; + last_was_punctuation = is_punctuation; + } + if (unlikely(last_was_punctuation)) goto parse_failure; + *buffer = '\0'; + return buffer; +parse_failure: + return NULL; +} +static double __Pyx__PyUnicode_AsDouble_inf_nan(const void* data, int kind, Py_ssize_t start, Py_ssize_t length) { + int matches = 1; + Py_UCS4 chr; + Py_UCS4 sign = PyUnicode_READ(kind, data, start); + int is_signed = (sign == '-') | (sign == '+'); + start += is_signed; + length -= is_signed; + switch (PyUnicode_READ(kind, data, start)) { + #ifdef Py_NAN + case 'n': + case 'N': + if (unlikely(length != 3)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+1); + matches &= (chr == 'a') | (chr == 'A'); + chr = PyUnicode_READ(kind, data, start+2); + matches &= (chr == 'n') | (chr == 'N'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_NAN : Py_NAN; + #endif + case 'i': + case 'I': + if (unlikely(length < 3)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+1); + matches &= (chr == 'n') | (chr == 'N'); + chr = PyUnicode_READ(kind, data, start+2); + matches &= (chr == 'f') | (chr == 'F'); + if (likely(length == 3 && matches)) + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + if (unlikely(length != 8)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+3); + matches &= (chr == 'i') | (chr == 'I'); + chr = PyUnicode_READ(kind, data, start+4); + matches &= (chr == 'n') | (chr == 'N'); + chr = PyUnicode_READ(kind, data, start+5); + matches &= (chr == 'i') | (chr == 'I'); + chr = PyUnicode_READ(kind, data, start+6); + matches &= (chr == 't') | (chr == 'T'); + chr = PyUnicode_READ(kind, data, start+7); + matches &= (chr == 'y') | (chr == 'Y'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default: + goto parse_failure; + } + return 0.0; +parse_failure: + return -1.0; +} +static double __Pyx_PyUnicode_AsDouble_WithSpaces(PyObject *obj) { + double value; + const char *last; + char *end; + Py_ssize_t start, length = PyUnicode_GET_LENGTH(obj); + const int kind = PyUnicode_KIND(obj); + const void* data = PyUnicode_DATA(obj); + start = 0; + while (Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, start))) + start++; + while (start < length - 1 && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, length - 1))) + length--; + length -= start; + if (unlikely(length <= 0)) goto fallback; + value = __Pyx__PyUnicode_AsDouble_inf_nan(data, kind, start, length); + if (unlikely(value == -1.0)) goto fallback; + if (value != 0.0) return value; + if (length < 40) { + char number[40]; + last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); + if (unlikely(!last)) goto fallback; + value = PyOS_string_to_double(number, &end, NULL); + } else { + char *number = (char*) PyMem_Malloc((length + 1) * sizeof(char)); + if (unlikely(!number)) goto fallback; + last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); + if (unlikely(!last)) { + PyMem_Free(number); + goto fallback; + } + value = PyOS_string_to_double(number, &end, NULL); + PyMem_Free(number); + } + if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { + return value; + } +fallback: + return __Pyx_SlowPyString_AsDouble(obj); +} +#endif +static CYTHON_INLINE double __Pyx_PyUnicode_AsDouble(PyObject *obj) { +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS + if (unlikely(__Pyx_PyUnicode_READY(obj) == -1)) + return (double)-1; + if (likely(PyUnicode_IS_ASCII(obj))) { + const char *s; + Py_ssize_t length; + s = PyUnicode_AsUTF8AndSize(obj, &length); + return __Pyx__PyBytes_AsDouble(obj, s, length); + } + return __Pyx_PyUnicode_AsDouble_WithSpaces(obj); +#else + return __Pyx_SlowPyString_AsDouble(obj); +#endif +} + +/* pyobject_as_double.proto */ +static double __Pyx__PyObject_AsDouble(PyObject* obj); +#if CYTHON_COMPILING_IN_PYPY +#define __Pyx_PyObject_AsDouble(obj)\ +(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) :\ + likely(PyInt_CheckExact(obj)) ?\ + PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) +#else +#define __Pyx_PyObject_AsDouble(obj)\ +((likely(PyFloat_CheckExact(obj))) ? PyFloat_AS_DOUBLE(obj) :\ + likely(PyLong_CheckExact(obj)) ?\ + PyLong_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) +#endif + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* FusedFunction.proto */ +typedef struct { + __pyx_CyFunctionObject func; + PyObject *__signatures__; + PyObject *self; +} __pyx_FusedFunctionObject; +static PyObject *__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code); +static int __pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self); +static int __pyx_FusedFunction_init(PyObject *module); +#define __Pyx_FusedFunction_USED + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *, int writable_flag); + +/* PyUCS4InUnicode.proto */ +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (&memview->acquisition_count) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XCLEAR_MEMVIEW(slice, have_gil) __Pyx_XCLEAR_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_long(npy_long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_long __Pyx_PyInt_As_npy_long(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int16(npy_int16 value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int32(npy_int32 value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + +/* ImportNumPyArray.proto */ +static PyObject *__pyx_numpy_ndarray = NULL; +static PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "binning" */ +static PyObject *__pyx_collections_abc_Sequence = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_bin_Numeric(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_bin_Numeric(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_bin_Numeric(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_bin_Numeric(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_bin_Numeric(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_binning_inplace(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_binning_inplace(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_binning_inplace(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_binning_inplace(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_binning_inplace(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_binning(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_binning(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_binning(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_binning(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_binning(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_binning_new(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_binning_new(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_binning_new(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_binning_new(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_binning_new(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static int assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, PyObject *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, PyObject *); /*proto*/ +static int __pyx_memoryview_err_no_memory(void); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int_t = { "int_t", NULL, sizeof(__pyx_t_5numpy_int_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t = { "int16_t", NULL, sizeof(__pyx_t_5numpy_int16_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int16_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int16_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int32_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t = { "float32_t", NULL, sizeof(__pyx_t_5numpy_float32_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "binning" +extern int __pyx_module_is_main_binning; +int __pyx_module_is_main_binning = 0; + +/* Implementation of "binning" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_object; +static PyObject *__pyx_builtin___import__; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_AssertionError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = ": "; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_X[] = "X"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_j[] = "j"; +static const char __pyx_k_k[] = "k"; +static const char __pyx_k_l[] = "l"; +static const char __pyx_k_s[] = "s"; +static const char __pyx_k__2[] = "."; +static const char __pyx_k__3[] = "*"; +static const char __pyx_k__6[] = "'"; +static const char __pyx_k__7[] = ")"; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__11[] = "()"; +static const char __pyx_k__12[] = "|"; +static const char __pyx_k__15[] = "_"; +static const char __pyx_k__56[] = "?"; +static const char __pyx_k_abc[] = "abc"; +static const char __pyx_k_and[] = " and "; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_got[] = " (got "; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_val[] = "val"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_axis[] = "axis"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_bins[] = "bins"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_kind[] = "kind"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_count[] = "count"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_empty[] = "empty"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_index[] = "index"; +static const char __pyx_k_j_col[] = "j_col"; +static const char __pyx_k_l_max[] = "l_max"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_split[] = "split"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_strip[] = "strip"; +static const char __pyx_k_OTHERS[] = "OTHERS"; +static const char __pyx_k_X_rare[] = "X_rare"; +static const char __pyx_k_enable[] = "enable"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_kwargs[] = "kwargs"; +static const char __pyx_k_n_cols[] = "n_cols"; +static const char __pyx_k_n_rows[] = "n_rows"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_object[] = "object"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_values[] = "values"; +static const char __pyx_k_binning[] = "binning"; +static const char __pyx_k_bins_np[] = "bins_np"; +static const char __pyx_k_disable[] = "disable"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_int16_t[] = "int16_t"; +static const char __pyx_k_int32_t[] = "int32_t"; +static const char __pyx_k_int64_t[] = "int64_t"; +static const char __pyx_k_is_rare[] = "is_rare"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_Sequence[] = "Sequence"; +static const char __pyx_k_defaults[] = "defaults"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_register[] = "register"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_float32_t[] = "float32_t"; +static const char __pyx_k_float64_t[] = "float64_t"; +static const char __pyx_k_isenabled[] = "isenabled"; +static const char __pyx_k_labels_np[] = "labels_np"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_bin_limits[] = "bin_limits"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_signatures[] = "signatures"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_bin_Numeric[] = "bin_Numeric"; +static const char __pyx_k_binning_new[] = "binning_new"; +static const char __pyx_k_collections[] = "collections"; +static const char __pyx_k_concatenate[] = "concatenate"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = ""; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_class_getitem[] = "__class_getitem__"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_AssertionError[] = "AssertionError"; +static const char __pyx_k_fused_sigindex[] = "_fused_sigindex"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_bin_rare_events[] = "bin_rare_events"; +static const char __pyx_k_binning_inplace[] = "binning_inplace"; +static const char __pyx_k_collections_abc[] = "collections.abc"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_fuse_0binning[] = "__pyx_fuse_0binning"; +static const char __pyx_k_pyx_fuse_1binning[] = "__pyx_fuse_1binning"; +static const char __pyx_k_pyx_fuse_2binning[] = "__pyx_fuse_2binning"; +static const char __pyx_k_pyx_fuse_3binning[] = "__pyx_fuse_3binning"; +static const char __pyx_k_pyx_fuse_4binning[] = "__pyx_fuse_4binning"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_n_categories_to_keep[] = "n_categories_to_keep"; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_Invalid_shape_in_axis[] = "Invalid shape in axis "; +static const char __pyx_k_categories_to_keep_np[] = "categories_to_keep_np"; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_pyx_fuse_0bin_Numeric[] = "__pyx_fuse_0bin_Numeric"; +static const char __pyx_k_pyx_fuse_0binning_new[] = "__pyx_fuse_0binning_new"; +static const char __pyx_k_pyx_fuse_1bin_Numeric[] = "__pyx_fuse_1bin_Numeric"; +static const char __pyx_k_pyx_fuse_1binning_new[] = "__pyx_fuse_1binning_new"; +static const char __pyx_k_pyx_fuse_2bin_Numeric[] = "__pyx_fuse_2bin_Numeric"; +static const char __pyx_k_pyx_fuse_2binning_new[] = "__pyx_fuse_2binning_new"; +static const char __pyx_k_pyx_fuse_3bin_Numeric[] = "__pyx_fuse_3bin_Numeric"; +static const char __pyx_k_pyx_fuse_3binning_new[] = "__pyx_fuse_3binning_new"; +static const char __pyx_k_pyx_fuse_4bin_Numeric[] = "__pyx_fuse_4bin_Numeric"; +static const char __pyx_k_pyx_fuse_4binning_new[] = "__pyx_fuse_4binning_new"; +static const char __pyx_k_Cannot_index_with_type[] = "Cannot index with type '"; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_Dimension_d_is_not_direct[] = "Dimension %d is not direct"; +static const char __pyx_k_pyx_fuse_0binning_inplace[] = "__pyx_fuse_0binning_inplace"; +static const char __pyx_k_pyx_fuse_1binning_inplace[] = "__pyx_fuse_1binning_inplace"; +static const char __pyx_k_pyx_fuse_2binning_inplace[] = "__pyx_fuse_2binning_inplace"; +static const char __pyx_k_pyx_fuse_3binning_inplace[] = "__pyx_fuse_3binning_inplace"; +static const char __pyx_k_pyx_fuse_4binning_inplace[] = "__pyx_fuse_4binning_inplace"; +static const char __pyx_k_Index_out_of_bounds_axis_d[] = "Index out of bounds (axis %d)"; +static const char __pyx_k_gators_binning_binning_pyx[] = "gators/binning/binning.pyx"; +static const char __pyx_k_No_matching_signature_found[] = "No matching signature found"; +static const char __pyx_k_Step_may_not_be_zero_axis_d[] = "Step may not be zero (axis %d)"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_All_dimensions_preceding_dimensi[] = "All dimensions preceding dimension %d must be indexed and not sliced"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Cannot_transpose_memoryview_with[] = "Cannot transpose memoryview with indirect dimensions"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Expected_at_least_d_argument_s_g[] = "Expected at least %d argument%s, got %d"; +static const char __pyx_k_Function_call_with_ambiguous_arg[] = "Function call with ambiguous argument types"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got "; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis "; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension "; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +/* #### Code section: decls ### */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_7binning_bin_rare_events(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_categories_to_keep_np, PyArrayObject *__pyx_v_n_categories_to_keep); /* proto */ +static PyObject *__pyx_pf_7binning_2bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_7binning_10__pyx_fuse_0bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_12__pyx_fuse_1bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_14__pyx_fuse_2bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_16__pyx_fuse_3bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_18__pyx_fuse_4bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_4binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_7binning_22__pyx_fuse_0binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_24__pyx_fuse_1binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_26__pyx_fuse_2binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_28__pyx_fuse_3binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_30__pyx_fuse_4binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_6binning(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_7binning_34__pyx_fuse_0binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_36__pyx_fuse_1binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_38__pyx_fuse_2binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_40__pyx_fuse_3binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_42__pyx_fuse_4binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7binning_8binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_7binning_46__pyx_fuse_0binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np); /* proto */ +static PyObject *__pyx_pf_7binning_48__pyx_fuse_1binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np); /* proto */ +static PyObject *__pyx_pf_7binning_50__pyx_fuse_2binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np); /* proto */ +static PyObject *__pyx_pf_7binning_52__pyx_fuse_3binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np); /* proto */ +static PyObject *__pyx_pf_7binning_54__pyx_fuse_4binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, 0, 0, 0, 0}; +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_values = {0, 0, 0, 0, 0}; +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type___pyx_array; + PyObject *__pyx_type___pyx_MemviewEnum; + PyObject *__pyx_type___pyx_memoryview; + PyObject *__pyx_type___pyx_memoryviewslice; + #endif + PyTypeObject *__pyx_array_type; + PyTypeObject *__pyx_MemviewEnum_type; + PyTypeObject *__pyx_memoryview_type; + PyTypeObject *__pyx_memoryviewslice_type; + PyObject *__pyx_kp_u_; + PyObject *__pyx_n_s_ASCII; + PyObject *__pyx_kp_s_All_dimensions_preceding_dimensi; + PyObject *__pyx_n_s_AssertionError; + PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; + PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; + PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; + PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; + PyObject *__pyx_kp_u_Cannot_index_with_type; + PyObject *__pyx_kp_s_Cannot_transpose_memoryview_with; + PyObject *__pyx_kp_s_Dimension_d_is_not_direct; + PyObject *__pyx_n_s_Ellipsis; + PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; + PyObject *__pyx_kp_s_Expected_at_least_d_argument_s_g; + PyObject *__pyx_kp_s_Function_call_with_ambiguous_arg; + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + PyObject *__pyx_n_s_IndexError; + PyObject *__pyx_kp_s_Index_out_of_bounds_axis_d; + PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; + PyObject *__pyx_kp_u_Invalid_mode_expected_c_or_fortr; + PyObject *__pyx_kp_u_Invalid_shape_in_axis; + PyObject *__pyx_n_s_MemoryError; + PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; + PyObject *__pyx_kp_s_MemoryView_of_r_object; + PyObject *__pyx_kp_s_No_matching_signature_found; + PyObject *__pyx_n_b_O; + PyObject *__pyx_n_u_OTHERS; + PyObject *__pyx_kp_u_Out_of_bounds_on_buffer_access_a; + PyObject *__pyx_n_s_PickleError; + PyObject *__pyx_n_s_Sequence; + PyObject *__pyx_kp_s_Step_may_not_be_zero_axis_d; + PyObject *__pyx_n_s_TypeError; + PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; + PyObject *__pyx_n_s_ValueError; + PyObject *__pyx_n_s_View_MemoryView; + PyObject *__pyx_n_s_X; + PyObject *__pyx_n_s_X_rare; + PyObject *__pyx_kp_s__11; + PyObject *__pyx_kp_s__12; + PyObject *__pyx_kp_u__12; + PyObject *__pyx_n_u__15; + PyObject *__pyx_kp_u__2; + PyObject *__pyx_n_s__3; + PyObject *__pyx_n_s__56; + PyObject *__pyx_kp_u__6; + PyObject *__pyx_kp_u__7; + PyObject *__pyx_n_s_abc; + PyObject *__pyx_n_s_allocate_buffer; + PyObject *__pyx_kp_u_and; + PyObject *__pyx_n_s_args; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_axis; + PyObject *__pyx_n_s_base; + PyObject *__pyx_n_s_bin_Numeric; + PyObject *__pyx_n_s_bin_limits; + PyObject *__pyx_n_s_bin_rare_events; + PyObject *__pyx_n_s_binning; + PyObject *__pyx_n_s_binning_inplace; + PyObject *__pyx_n_s_binning_new; + PyObject *__pyx_n_s_bins; + PyObject *__pyx_n_s_bins_np; + PyObject *__pyx_n_s_c; + PyObject *__pyx_n_u_c; + PyObject *__pyx_n_s_categories_to_keep_np; + PyObject *__pyx_n_s_class; + PyObject *__pyx_n_s_class_getitem; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_collections; + PyObject *__pyx_kp_s_collections_abc; + PyObject *__pyx_n_s_concatenate; + PyObject *__pyx_kp_s_contiguous_and_direct; + PyObject *__pyx_kp_s_contiguous_and_indirect; + PyObject *__pyx_n_s_count; + PyObject *__pyx_n_s_defaults; + PyObject *__pyx_n_s_dict; + PyObject *__pyx_kp_u_disable; + PyObject *__pyx_n_s_dtype; + PyObject *__pyx_n_s_dtype_is_object; + PyObject *__pyx_n_s_empty; + PyObject *__pyx_kp_u_enable; + PyObject *__pyx_n_s_encode; + PyObject *__pyx_n_s_enumerate; + PyObject *__pyx_n_s_error; + PyObject *__pyx_n_s_flags; + PyObject *__pyx_n_s_float32_t; + PyObject *__pyx_n_s_float64_t; + PyObject *__pyx_n_s_format; + PyObject *__pyx_n_s_fortran; + PyObject *__pyx_n_u_fortran; + PyObject *__pyx_n_s_fused_sigindex; + PyObject *__pyx_kp_s_gators_binning_binning_pyx; + PyObject *__pyx_kp_u_gc; + PyObject *__pyx_n_s_get; + PyObject *__pyx_n_s_getstate; + PyObject *__pyx_kp_u_got; + PyObject *__pyx_kp_u_got_differing_extents_in_dimensi; + PyObject *__pyx_n_s_id; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_index; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_int16_t; + PyObject *__pyx_n_s_int32_t; + PyObject *__pyx_n_s_int64_t; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_n_s_is_rare; + PyObject *__pyx_kp_u_isenabled; + PyObject *__pyx_n_s_itemsize; + PyObject *__pyx_kp_s_itemsize_0_for_cython_array; + PyObject *__pyx_n_s_j; + PyObject *__pyx_n_s_j_col; + PyObject *__pyx_n_s_k; + PyObject *__pyx_n_s_kind; + PyObject *__pyx_n_s_kwargs; + PyObject *__pyx_n_s_l; + PyObject *__pyx_n_s_l_max; + PyObject *__pyx_n_s_labels_np; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_memview; + PyObject *__pyx_n_s_mode; + PyObject *__pyx_n_s_n_categories_to_keep; + PyObject *__pyx_n_s_n_cols; + PyObject *__pyx_n_s_n_rows; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_name_2; + PyObject *__pyx_n_s_ndim; + PyObject *__pyx_n_s_new; + PyObject *__pyx_kp_s_no_default___reduce___due_to_non; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_obj; + PyObject *__pyx_n_s_object; + PyObject *__pyx_n_s_pack; + PyObject *__pyx_n_s_pickle; + PyObject *__pyx_n_s_pyx_PickleError; + PyObject *__pyx_n_s_pyx_checksum; + PyObject *__pyx_n_s_pyx_fuse_0bin_Numeric; + PyObject *__pyx_n_s_pyx_fuse_0binning; + PyObject *__pyx_n_s_pyx_fuse_0binning_inplace; + PyObject *__pyx_n_s_pyx_fuse_0binning_new; + PyObject *__pyx_n_s_pyx_fuse_1bin_Numeric; + PyObject *__pyx_n_s_pyx_fuse_1binning; + PyObject *__pyx_n_s_pyx_fuse_1binning_inplace; + PyObject *__pyx_n_s_pyx_fuse_1binning_new; + PyObject *__pyx_n_s_pyx_fuse_2bin_Numeric; + PyObject *__pyx_n_s_pyx_fuse_2binning; + PyObject *__pyx_n_s_pyx_fuse_2binning_inplace; + PyObject *__pyx_n_s_pyx_fuse_2binning_new; + PyObject *__pyx_n_s_pyx_fuse_3bin_Numeric; + PyObject *__pyx_n_s_pyx_fuse_3binning; + PyObject *__pyx_n_s_pyx_fuse_3binning_inplace; + PyObject *__pyx_n_s_pyx_fuse_3binning_new; + PyObject *__pyx_n_s_pyx_fuse_4bin_Numeric; + PyObject *__pyx_n_s_pyx_fuse_4binning; + PyObject *__pyx_n_s_pyx_fuse_4binning_inplace; + PyObject *__pyx_n_s_pyx_fuse_4binning_new; + PyObject *__pyx_n_s_pyx_result; + PyObject *__pyx_n_s_pyx_state; + PyObject *__pyx_n_s_pyx_type; + PyObject *__pyx_n_s_pyx_unpickle_Enum; + PyObject *__pyx_n_s_pyx_vtable; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_reduce; + PyObject *__pyx_n_s_reduce_cython; + PyObject *__pyx_n_s_reduce_ex; + PyObject *__pyx_n_s_register; + PyObject *__pyx_n_s_s; + PyObject *__pyx_n_s_setstate; + PyObject *__pyx_n_s_setstate_cython; + PyObject *__pyx_n_s_shape; + PyObject *__pyx_n_s_signatures; + PyObject *__pyx_n_s_size; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_split; + PyObject *__pyx_n_s_start; + PyObject *__pyx_n_s_step; + PyObject *__pyx_n_s_stop; + PyObject *__pyx_kp_s_strided_and_direct; + PyObject *__pyx_kp_s_strided_and_direct_or_indirect; + PyObject *__pyx_kp_s_strided_and_indirect; + PyObject *__pyx_kp_s_stringsource; + PyObject *__pyx_n_s_strip; + PyObject *__pyx_n_s_struct; + PyObject *__pyx_n_s_sys; + PyObject *__pyx_n_s_test; + PyObject *__pyx_kp_s_unable_to_allocate_array_data; + PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; + PyObject *__pyx_n_s_unpack; + PyObject *__pyx_n_s_update; + PyObject *__pyx_n_s_val; + PyObject *__pyx_n_s_values; + PyObject *__pyx_n_s_version_info; + PyObject *__pyx_int_0; + PyObject *__pyx_int_1; + PyObject *__pyx_int_3; + PyObject *__pyx_int_4; + PyObject *__pyx_int_112105877; + PyObject *__pyx_int_136983863; + PyObject *__pyx_int_184977713; + PyObject *__pyx_int_neg_1; + PyObject *__pyx_slice__5; + PyObject *__pyx_tuple__4; + PyObject *__pyx_tuple__8; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__10; + PyObject *__pyx_tuple__13; + PyObject *__pyx_tuple__14; + PyObject *__pyx_tuple__16; + PyObject *__pyx_tuple__17; + PyObject *__pyx_tuple__18; + PyObject *__pyx_tuple__19; + PyObject *__pyx_tuple__20; + PyObject *__pyx_tuple__21; + PyObject *__pyx_tuple__22; + PyObject *__pyx_tuple__23; + PyObject *__pyx_tuple__24; + PyObject *__pyx_tuple__25; + PyObject *__pyx_tuple__27; + PyObject *__pyx_tuple__29; + PyObject *__pyx_tuple__36; + PyObject *__pyx_tuple__49; + PyObject *__pyx_codeobj__26; + PyObject *__pyx_codeobj__28; + PyObject *__pyx_codeobj__30; + PyObject *__pyx_codeobj__31; + PyObject *__pyx_codeobj__32; + PyObject *__pyx_codeobj__33; + PyObject *__pyx_codeobj__34; + PyObject *__pyx_codeobj__35; + PyObject *__pyx_codeobj__37; + PyObject *__pyx_codeobj__38; + PyObject *__pyx_codeobj__39; + PyObject *__pyx_codeobj__40; + PyObject *__pyx_codeobj__41; + PyObject *__pyx_codeobj__42; + PyObject *__pyx_codeobj__43; + PyObject *__pyx_codeobj__44; + PyObject *__pyx_codeobj__45; + PyObject *__pyx_codeobj__46; + PyObject *__pyx_codeobj__47; + PyObject *__pyx_codeobj__48; + PyObject *__pyx_codeobj__50; + PyObject *__pyx_codeobj__51; + PyObject *__pyx_codeobj__52; + PyObject *__pyx_codeobj__53; + PyObject *__pyx_codeobj__54; + PyObject *__pyx_codeobj__55; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_array_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_array); + Py_CLEAR(clear_module_state->__pyx_MemviewEnum_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_MemviewEnum); + Py_CLEAR(clear_module_state->__pyx_memoryview_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryview); + Py_CLEAR(clear_module_state->__pyx_memoryviewslice_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryviewslice); + Py_CLEAR(clear_module_state->__pyx_kp_u_); + Py_CLEAR(clear_module_state->__pyx_n_s_ASCII); + Py_CLEAR(clear_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_CLEAR(clear_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_CLEAR(clear_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_CLEAR(clear_module_state->__pyx_n_s_Ellipsis); + Py_CLEAR(clear_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_CLEAR(clear_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_n_s_IndexError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_CLEAR(clear_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_CLEAR(clear_module_state->__pyx_kp_s_No_matching_signature_found); + Py_CLEAR(clear_module_state->__pyx_n_b_O); + Py_CLEAR(clear_module_state->__pyx_n_u_OTHERS); + Py_CLEAR(clear_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_Sequence); + Py_CLEAR(clear_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); + Py_CLEAR(clear_module_state->__pyx_n_s_View_MemoryView); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_n_s_X_rare); + Py_CLEAR(clear_module_state->__pyx_kp_s__11); + Py_CLEAR(clear_module_state->__pyx_kp_s__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__12); + Py_CLEAR(clear_module_state->__pyx_n_u__15); + Py_CLEAR(clear_module_state->__pyx_kp_u__2); + Py_CLEAR(clear_module_state->__pyx_n_s__3); + Py_CLEAR(clear_module_state->__pyx_n_s__56); + Py_CLEAR(clear_module_state->__pyx_kp_u__6); + Py_CLEAR(clear_module_state->__pyx_kp_u__7); + Py_CLEAR(clear_module_state->__pyx_n_s_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_allocate_buffer); + Py_CLEAR(clear_module_state->__pyx_kp_u_and); + Py_CLEAR(clear_module_state->__pyx_n_s_args); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_base); + Py_CLEAR(clear_module_state->__pyx_n_s_bin_Numeric); + Py_CLEAR(clear_module_state->__pyx_n_s_bin_limits); + Py_CLEAR(clear_module_state->__pyx_n_s_bin_rare_events); + Py_CLEAR(clear_module_state->__pyx_n_s_binning); + Py_CLEAR(clear_module_state->__pyx_n_s_binning_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_binning_new); + Py_CLEAR(clear_module_state->__pyx_n_s_bins); + Py_CLEAR(clear_module_state->__pyx_n_s_bins_np); + Py_CLEAR(clear_module_state->__pyx_n_s_c); + Py_CLEAR(clear_module_state->__pyx_n_u_c); + Py_CLEAR(clear_module_state->__pyx_n_s_categories_to_keep_np); + Py_CLEAR(clear_module_state->__pyx_n_s_class); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_collections); + Py_CLEAR(clear_module_state->__pyx_kp_s_collections_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_concatenate); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_CLEAR(clear_module_state->__pyx_n_s_count); + Py_CLEAR(clear_module_state->__pyx_n_s_defaults); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype_is_object); + Py_CLEAR(clear_module_state->__pyx_n_s_empty); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_encode); + Py_CLEAR(clear_module_state->__pyx_n_s_enumerate); + Py_CLEAR(clear_module_state->__pyx_n_s_error); + Py_CLEAR(clear_module_state->__pyx_n_s_flags); + Py_CLEAR(clear_module_state->__pyx_n_s_float32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_float64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_format); + Py_CLEAR(clear_module_state->__pyx_n_s_fortran); + Py_CLEAR(clear_module_state->__pyx_n_u_fortran); + Py_CLEAR(clear_module_state->__pyx_n_s_fused_sigindex); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_binning_binning_pyx); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_kp_u_got); + Py_CLEAR(clear_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_id); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_index); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_int16_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_is_rare); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_itemsize); + Py_CLEAR(clear_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_CLEAR(clear_module_state->__pyx_n_s_j); + Py_CLEAR(clear_module_state->__pyx_n_s_j_col); + Py_CLEAR(clear_module_state->__pyx_n_s_k); + Py_CLEAR(clear_module_state->__pyx_n_s_kind); + Py_CLEAR(clear_module_state->__pyx_n_s_kwargs); + Py_CLEAR(clear_module_state->__pyx_n_s_l); + Py_CLEAR(clear_module_state->__pyx_n_s_l_max); + Py_CLEAR(clear_module_state->__pyx_n_s_labels_np); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_memview); + Py_CLEAR(clear_module_state->__pyx_n_s_mode); + Py_CLEAR(clear_module_state->__pyx_n_s_n_categories_to_keep); + Py_CLEAR(clear_module_state->__pyx_n_s_n_cols); + Py_CLEAR(clear_module_state->__pyx_n_s_n_rows); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_name_2); + Py_CLEAR(clear_module_state->__pyx_n_s_ndim); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_object); + Py_CLEAR(clear_module_state->__pyx_n_s_pack); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0bin_Numeric); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0binning); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0binning_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0binning_new); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1bin_Numeric); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1binning); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1binning_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1binning_new); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2bin_Numeric); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2binning); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2binning_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2binning_new); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3bin_Numeric); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3binning); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3binning_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3binning_new); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4bin_Numeric); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4binning); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4binning_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4binning_new); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_register); + Py_CLEAR(clear_module_state->__pyx_n_s_s); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_shape); + Py_CLEAR(clear_module_state->__pyx_n_s_signatures); + Py_CLEAR(clear_module_state->__pyx_n_s_size); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_split); + Py_CLEAR(clear_module_state->__pyx_n_s_start); + Py_CLEAR(clear_module_state->__pyx_n_s_step); + Py_CLEAR(clear_module_state->__pyx_n_s_stop); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_strip); + Py_CLEAR(clear_module_state->__pyx_n_s_struct); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_CLEAR(clear_module_state->__pyx_n_s_unpack); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_val); + Py_CLEAR(clear_module_state->__pyx_n_s_values); + Py_CLEAR(clear_module_state->__pyx_n_s_version_info); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_3); + Py_CLEAR(clear_module_state->__pyx_int_4); + Py_CLEAR(clear_module_state->__pyx_int_112105877); + Py_CLEAR(clear_module_state->__pyx_int_136983863); + Py_CLEAR(clear_module_state->__pyx_int_184977713); + Py_CLEAR(clear_module_state->__pyx_int_neg_1); + Py_CLEAR(clear_module_state->__pyx_slice__5); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_tuple__8); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__10); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_tuple__17); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__19); + Py_CLEAR(clear_module_state->__pyx_tuple__20); + Py_CLEAR(clear_module_state->__pyx_tuple__21); + Py_CLEAR(clear_module_state->__pyx_tuple__22); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__24); + Py_CLEAR(clear_module_state->__pyx_tuple__25); + Py_CLEAR(clear_module_state->__pyx_tuple__27); + Py_CLEAR(clear_module_state->__pyx_tuple__29); + Py_CLEAR(clear_module_state->__pyx_tuple__36); + Py_CLEAR(clear_module_state->__pyx_tuple__49); + Py_CLEAR(clear_module_state->__pyx_codeobj__26); + Py_CLEAR(clear_module_state->__pyx_codeobj__28); + Py_CLEAR(clear_module_state->__pyx_codeobj__30); + Py_CLEAR(clear_module_state->__pyx_codeobj__31); + Py_CLEAR(clear_module_state->__pyx_codeobj__32); + Py_CLEAR(clear_module_state->__pyx_codeobj__33); + Py_CLEAR(clear_module_state->__pyx_codeobj__34); + Py_CLEAR(clear_module_state->__pyx_codeobj__35); + Py_CLEAR(clear_module_state->__pyx_codeobj__37); + Py_CLEAR(clear_module_state->__pyx_codeobj__38); + Py_CLEAR(clear_module_state->__pyx_codeobj__39); + Py_CLEAR(clear_module_state->__pyx_codeobj__40); + Py_CLEAR(clear_module_state->__pyx_codeobj__41); + Py_CLEAR(clear_module_state->__pyx_codeobj__42); + Py_CLEAR(clear_module_state->__pyx_codeobj__43); + Py_CLEAR(clear_module_state->__pyx_codeobj__44); + Py_CLEAR(clear_module_state->__pyx_codeobj__45); + Py_CLEAR(clear_module_state->__pyx_codeobj__46); + Py_CLEAR(clear_module_state->__pyx_codeobj__47); + Py_CLEAR(clear_module_state->__pyx_codeobj__48); + Py_CLEAR(clear_module_state->__pyx_codeobj__50); + Py_CLEAR(clear_module_state->__pyx_codeobj__51); + Py_CLEAR(clear_module_state->__pyx_codeobj__52); + Py_CLEAR(clear_module_state->__pyx_codeobj__53); + Py_CLEAR(clear_module_state->__pyx_codeobj__54); + Py_CLEAR(clear_module_state->__pyx_codeobj__55); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_array_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_array); + Py_VISIT(traverse_module_state->__pyx_MemviewEnum_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_MemviewEnum); + Py_VISIT(traverse_module_state->__pyx_memoryview_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryview); + Py_VISIT(traverse_module_state->__pyx_memoryviewslice_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryviewslice); + Py_VISIT(traverse_module_state->__pyx_kp_u_); + Py_VISIT(traverse_module_state->__pyx_n_s_ASCII); + Py_VISIT(traverse_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_VISIT(traverse_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_VISIT(traverse_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_VISIT(traverse_module_state->__pyx_n_s_Ellipsis); + Py_VISIT(traverse_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_VISIT(traverse_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_n_s_IndexError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_VISIT(traverse_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_VISIT(traverse_module_state->__pyx_kp_s_No_matching_signature_found); + Py_VISIT(traverse_module_state->__pyx_n_b_O); + Py_VISIT(traverse_module_state->__pyx_n_u_OTHERS); + Py_VISIT(traverse_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_Sequence); + Py_VISIT(traverse_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); + Py_VISIT(traverse_module_state->__pyx_n_s_View_MemoryView); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_n_s_X_rare); + Py_VISIT(traverse_module_state->__pyx_kp_s__11); + Py_VISIT(traverse_module_state->__pyx_kp_s__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__12); + Py_VISIT(traverse_module_state->__pyx_n_u__15); + Py_VISIT(traverse_module_state->__pyx_kp_u__2); + Py_VISIT(traverse_module_state->__pyx_n_s__3); + Py_VISIT(traverse_module_state->__pyx_n_s__56); + Py_VISIT(traverse_module_state->__pyx_kp_u__6); + Py_VISIT(traverse_module_state->__pyx_kp_u__7); + Py_VISIT(traverse_module_state->__pyx_n_s_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_allocate_buffer); + Py_VISIT(traverse_module_state->__pyx_kp_u_and); + Py_VISIT(traverse_module_state->__pyx_n_s_args); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_base); + Py_VISIT(traverse_module_state->__pyx_n_s_bin_Numeric); + Py_VISIT(traverse_module_state->__pyx_n_s_bin_limits); + Py_VISIT(traverse_module_state->__pyx_n_s_bin_rare_events); + Py_VISIT(traverse_module_state->__pyx_n_s_binning); + Py_VISIT(traverse_module_state->__pyx_n_s_binning_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_binning_new); + Py_VISIT(traverse_module_state->__pyx_n_s_bins); + Py_VISIT(traverse_module_state->__pyx_n_s_bins_np); + Py_VISIT(traverse_module_state->__pyx_n_s_c); + Py_VISIT(traverse_module_state->__pyx_n_u_c); + Py_VISIT(traverse_module_state->__pyx_n_s_categories_to_keep_np); + Py_VISIT(traverse_module_state->__pyx_n_s_class); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_collections); + Py_VISIT(traverse_module_state->__pyx_kp_s_collections_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_concatenate); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_VISIT(traverse_module_state->__pyx_n_s_count); + Py_VISIT(traverse_module_state->__pyx_n_s_defaults); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype_is_object); + Py_VISIT(traverse_module_state->__pyx_n_s_empty); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_encode); + Py_VISIT(traverse_module_state->__pyx_n_s_enumerate); + Py_VISIT(traverse_module_state->__pyx_n_s_error); + Py_VISIT(traverse_module_state->__pyx_n_s_flags); + Py_VISIT(traverse_module_state->__pyx_n_s_float32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_float64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_format); + Py_VISIT(traverse_module_state->__pyx_n_s_fortran); + Py_VISIT(traverse_module_state->__pyx_n_u_fortran); + Py_VISIT(traverse_module_state->__pyx_n_s_fused_sigindex); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_binning_binning_pyx); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_kp_u_got); + Py_VISIT(traverse_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_id); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_index); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_int16_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_is_rare); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_itemsize); + Py_VISIT(traverse_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_VISIT(traverse_module_state->__pyx_n_s_j); + Py_VISIT(traverse_module_state->__pyx_n_s_j_col); + Py_VISIT(traverse_module_state->__pyx_n_s_k); + Py_VISIT(traverse_module_state->__pyx_n_s_kind); + Py_VISIT(traverse_module_state->__pyx_n_s_kwargs); + Py_VISIT(traverse_module_state->__pyx_n_s_l); + Py_VISIT(traverse_module_state->__pyx_n_s_l_max); + Py_VISIT(traverse_module_state->__pyx_n_s_labels_np); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_memview); + Py_VISIT(traverse_module_state->__pyx_n_s_mode); + Py_VISIT(traverse_module_state->__pyx_n_s_n_categories_to_keep); + Py_VISIT(traverse_module_state->__pyx_n_s_n_cols); + Py_VISIT(traverse_module_state->__pyx_n_s_n_rows); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_name_2); + Py_VISIT(traverse_module_state->__pyx_n_s_ndim); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_object); + Py_VISIT(traverse_module_state->__pyx_n_s_pack); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0bin_Numeric); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0binning); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0binning_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0binning_new); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1bin_Numeric); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1binning); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1binning_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1binning_new); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2bin_Numeric); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2binning); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2binning_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2binning_new); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3bin_Numeric); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3binning); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3binning_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3binning_new); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4bin_Numeric); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4binning); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4binning_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4binning_new); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_register); + Py_VISIT(traverse_module_state->__pyx_n_s_s); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_shape); + Py_VISIT(traverse_module_state->__pyx_n_s_signatures); + Py_VISIT(traverse_module_state->__pyx_n_s_size); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_split); + Py_VISIT(traverse_module_state->__pyx_n_s_start); + Py_VISIT(traverse_module_state->__pyx_n_s_step); + Py_VISIT(traverse_module_state->__pyx_n_s_stop); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_strip); + Py_VISIT(traverse_module_state->__pyx_n_s_struct); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_VISIT(traverse_module_state->__pyx_n_s_unpack); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_val); + Py_VISIT(traverse_module_state->__pyx_n_s_values); + Py_VISIT(traverse_module_state->__pyx_n_s_version_info); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_3); + Py_VISIT(traverse_module_state->__pyx_int_4); + Py_VISIT(traverse_module_state->__pyx_int_112105877); + Py_VISIT(traverse_module_state->__pyx_int_136983863); + Py_VISIT(traverse_module_state->__pyx_int_184977713); + Py_VISIT(traverse_module_state->__pyx_int_neg_1); + Py_VISIT(traverse_module_state->__pyx_slice__5); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_tuple__8); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__10); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_tuple__17); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__19); + Py_VISIT(traverse_module_state->__pyx_tuple__20); + Py_VISIT(traverse_module_state->__pyx_tuple__21); + Py_VISIT(traverse_module_state->__pyx_tuple__22); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__24); + Py_VISIT(traverse_module_state->__pyx_tuple__25); + Py_VISIT(traverse_module_state->__pyx_tuple__27); + Py_VISIT(traverse_module_state->__pyx_tuple__29); + Py_VISIT(traverse_module_state->__pyx_tuple__36); + Py_VISIT(traverse_module_state->__pyx_tuple__49); + Py_VISIT(traverse_module_state->__pyx_codeobj__26); + Py_VISIT(traverse_module_state->__pyx_codeobj__28); + Py_VISIT(traverse_module_state->__pyx_codeobj__30); + Py_VISIT(traverse_module_state->__pyx_codeobj__31); + Py_VISIT(traverse_module_state->__pyx_codeobj__32); + Py_VISIT(traverse_module_state->__pyx_codeobj__33); + Py_VISIT(traverse_module_state->__pyx_codeobj__34); + Py_VISIT(traverse_module_state->__pyx_codeobj__35); + Py_VISIT(traverse_module_state->__pyx_codeobj__37); + Py_VISIT(traverse_module_state->__pyx_codeobj__38); + Py_VISIT(traverse_module_state->__pyx_codeobj__39); + Py_VISIT(traverse_module_state->__pyx_codeobj__40); + Py_VISIT(traverse_module_state->__pyx_codeobj__41); + Py_VISIT(traverse_module_state->__pyx_codeobj__42); + Py_VISIT(traverse_module_state->__pyx_codeobj__43); + Py_VISIT(traverse_module_state->__pyx_codeobj__44); + Py_VISIT(traverse_module_state->__pyx_codeobj__45); + Py_VISIT(traverse_module_state->__pyx_codeobj__46); + Py_VISIT(traverse_module_state->__pyx_codeobj__47); + Py_VISIT(traverse_module_state->__pyx_codeobj__48); + Py_VISIT(traverse_module_state->__pyx_codeobj__50); + Py_VISIT(traverse_module_state->__pyx_codeobj__51); + Py_VISIT(traverse_module_state->__pyx_codeobj__52); + Py_VISIT(traverse_module_state->__pyx_codeobj__53); + Py_VISIT(traverse_module_state->__pyx_codeobj__54); + Py_VISIT(traverse_module_state->__pyx_codeobj__55); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#define __pyx_type___pyx_array __pyx_mstate_global->__pyx_type___pyx_array +#define __pyx_type___pyx_MemviewEnum __pyx_mstate_global->__pyx_type___pyx_MemviewEnum +#define __pyx_type___pyx_memoryview __pyx_mstate_global->__pyx_type___pyx_memoryview +#define __pyx_type___pyx_memoryviewslice __pyx_mstate_global->__pyx_type___pyx_memoryviewslice +#endif +#define __pyx_array_type __pyx_mstate_global->__pyx_array_type +#define __pyx_MemviewEnum_type __pyx_mstate_global->__pyx_MemviewEnum_type +#define __pyx_memoryview_type __pyx_mstate_global->__pyx_memoryview_type +#define __pyx_memoryviewslice_type __pyx_mstate_global->__pyx_memoryviewslice_type +#define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ +#define __pyx_n_s_ASCII __pyx_mstate_global->__pyx_n_s_ASCII +#define __pyx_kp_s_All_dimensions_preceding_dimensi __pyx_mstate_global->__pyx_kp_s_All_dimensions_preceding_dimensi +#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError +#define __pyx_kp_s_Buffer_view_does_not_expose_stri __pyx_mstate_global->__pyx_kp_s_Buffer_view_does_not_expose_stri +#define __pyx_kp_s_Can_only_create_a_buffer_that_is __pyx_mstate_global->__pyx_kp_s_Can_only_create_a_buffer_that_is +#define __pyx_kp_s_Cannot_assign_to_read_only_memor __pyx_mstate_global->__pyx_kp_s_Cannot_assign_to_read_only_memor +#define __pyx_kp_s_Cannot_create_writable_memory_vi __pyx_mstate_global->__pyx_kp_s_Cannot_create_writable_memory_vi +#define __pyx_kp_u_Cannot_index_with_type __pyx_mstate_global->__pyx_kp_u_Cannot_index_with_type +#define __pyx_kp_s_Cannot_transpose_memoryview_with __pyx_mstate_global->__pyx_kp_s_Cannot_transpose_memoryview_with +#define __pyx_kp_s_Dimension_d_is_not_direct __pyx_mstate_global->__pyx_kp_s_Dimension_d_is_not_direct +#define __pyx_n_s_Ellipsis __pyx_mstate_global->__pyx_n_s_Ellipsis +#define __pyx_kp_s_Empty_shape_tuple_for_cython_arr __pyx_mstate_global->__pyx_kp_s_Empty_shape_tuple_for_cython_arr +#define __pyx_kp_s_Expected_at_least_d_argument_s_g __pyx_mstate_global->__pyx_kp_s_Expected_at_least_d_argument_s_g +#define __pyx_kp_s_Function_call_with_ambiguous_arg __pyx_mstate_global->__pyx_kp_s_Function_call_with_ambiguous_arg +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_n_s_IndexError __pyx_mstate_global->__pyx_n_s_IndexError +#define __pyx_kp_s_Index_out_of_bounds_axis_d __pyx_mstate_global->__pyx_kp_s_Index_out_of_bounds_axis_d +#define __pyx_kp_s_Indirect_dimensions_not_supporte __pyx_mstate_global->__pyx_kp_s_Indirect_dimensions_not_supporte +#define __pyx_kp_u_Invalid_mode_expected_c_or_fortr __pyx_mstate_global->__pyx_kp_u_Invalid_mode_expected_c_or_fortr +#define __pyx_kp_u_Invalid_shape_in_axis __pyx_mstate_global->__pyx_kp_u_Invalid_shape_in_axis +#define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError +#define __pyx_kp_s_MemoryView_of_r_at_0x_x __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_at_0x_x +#define __pyx_kp_s_MemoryView_of_r_object __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_object +#define __pyx_kp_s_No_matching_signature_found __pyx_mstate_global->__pyx_kp_s_No_matching_signature_found +#define __pyx_n_b_O __pyx_mstate_global->__pyx_n_b_O +#define __pyx_n_u_OTHERS __pyx_mstate_global->__pyx_n_u_OTHERS +#define __pyx_kp_u_Out_of_bounds_on_buffer_access_a __pyx_mstate_global->__pyx_kp_u_Out_of_bounds_on_buffer_access_a +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_Sequence __pyx_mstate_global->__pyx_n_s_Sequence +#define __pyx_kp_s_Step_may_not_be_zero_axis_d __pyx_mstate_global->__pyx_kp_s_Step_may_not_be_zero_axis_d +#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError +#define __pyx_kp_s_Unable_to_convert_item_to_object __pyx_mstate_global->__pyx_kp_s_Unable_to_convert_item_to_object +#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError +#define __pyx_n_s_View_MemoryView __pyx_mstate_global->__pyx_n_s_View_MemoryView +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_n_s_X_rare __pyx_mstate_global->__pyx_n_s_X_rare +#define __pyx_kp_s__11 __pyx_mstate_global->__pyx_kp_s__11 +#define __pyx_kp_s__12 __pyx_mstate_global->__pyx_kp_s__12 +#define __pyx_kp_u__12 __pyx_mstate_global->__pyx_kp_u__12 +#define __pyx_n_u__15 __pyx_mstate_global->__pyx_n_u__15 +#define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 +#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 +#define __pyx_n_s__56 __pyx_mstate_global->__pyx_n_s__56 +#define __pyx_kp_u__6 __pyx_mstate_global->__pyx_kp_u__6 +#define __pyx_kp_u__7 __pyx_mstate_global->__pyx_kp_u__7 +#define __pyx_n_s_abc __pyx_mstate_global->__pyx_n_s_abc +#define __pyx_n_s_allocate_buffer __pyx_mstate_global->__pyx_n_s_allocate_buffer +#define __pyx_kp_u_and __pyx_mstate_global->__pyx_kp_u_and +#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_axis __pyx_mstate_global->__pyx_n_s_axis +#define __pyx_n_s_base __pyx_mstate_global->__pyx_n_s_base +#define __pyx_n_s_bin_Numeric __pyx_mstate_global->__pyx_n_s_bin_Numeric +#define __pyx_n_s_bin_limits __pyx_mstate_global->__pyx_n_s_bin_limits +#define __pyx_n_s_bin_rare_events __pyx_mstate_global->__pyx_n_s_bin_rare_events +#define __pyx_n_s_binning __pyx_mstate_global->__pyx_n_s_binning +#define __pyx_n_s_binning_inplace __pyx_mstate_global->__pyx_n_s_binning_inplace +#define __pyx_n_s_binning_new __pyx_mstate_global->__pyx_n_s_binning_new +#define __pyx_n_s_bins __pyx_mstate_global->__pyx_n_s_bins +#define __pyx_n_s_bins_np __pyx_mstate_global->__pyx_n_s_bins_np +#define __pyx_n_s_c __pyx_mstate_global->__pyx_n_s_c +#define __pyx_n_u_c __pyx_mstate_global->__pyx_n_u_c +#define __pyx_n_s_categories_to_keep_np __pyx_mstate_global->__pyx_n_s_categories_to_keep_np +#define __pyx_n_s_class __pyx_mstate_global->__pyx_n_s_class +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_collections __pyx_mstate_global->__pyx_n_s_collections +#define __pyx_kp_s_collections_abc __pyx_mstate_global->__pyx_kp_s_collections_abc +#define __pyx_n_s_concatenate __pyx_mstate_global->__pyx_n_s_concatenate +#define __pyx_kp_s_contiguous_and_direct __pyx_mstate_global->__pyx_kp_s_contiguous_and_direct +#define __pyx_kp_s_contiguous_and_indirect __pyx_mstate_global->__pyx_kp_s_contiguous_and_indirect +#define __pyx_n_s_count __pyx_mstate_global->__pyx_n_s_count +#define __pyx_n_s_defaults __pyx_mstate_global->__pyx_n_s_defaults +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_dtype __pyx_mstate_global->__pyx_n_s_dtype +#define __pyx_n_s_dtype_is_object __pyx_mstate_global->__pyx_n_s_dtype_is_object +#define __pyx_n_s_empty __pyx_mstate_global->__pyx_n_s_empty +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode +#define __pyx_n_s_enumerate __pyx_mstate_global->__pyx_n_s_enumerate +#define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error +#define __pyx_n_s_flags __pyx_mstate_global->__pyx_n_s_flags +#define __pyx_n_s_float32_t __pyx_mstate_global->__pyx_n_s_float32_t +#define __pyx_n_s_float64_t __pyx_mstate_global->__pyx_n_s_float64_t +#define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format +#define __pyx_n_s_fortran __pyx_mstate_global->__pyx_n_s_fortran +#define __pyx_n_u_fortran __pyx_mstate_global->__pyx_n_u_fortran +#define __pyx_n_s_fused_sigindex __pyx_mstate_global->__pyx_n_s_fused_sigindex +#define __pyx_kp_s_gators_binning_binning_pyx __pyx_mstate_global->__pyx_kp_s_gators_binning_binning_pyx +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_kp_u_got __pyx_mstate_global->__pyx_kp_u_got +#define __pyx_kp_u_got_differing_extents_in_dimensi __pyx_mstate_global->__pyx_kp_u_got_differing_extents_in_dimensi +#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_index __pyx_mstate_global->__pyx_n_s_index +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_int16_t __pyx_mstate_global->__pyx_n_s_int16_t +#define __pyx_n_s_int32_t __pyx_mstate_global->__pyx_n_s_int32_t +#define __pyx_n_s_int64_t __pyx_mstate_global->__pyx_n_s_int64_t +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_is_rare __pyx_mstate_global->__pyx_n_s_is_rare +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_itemsize __pyx_mstate_global->__pyx_n_s_itemsize +#define __pyx_kp_s_itemsize_0_for_cython_array __pyx_mstate_global->__pyx_kp_s_itemsize_0_for_cython_array +#define __pyx_n_s_j __pyx_mstate_global->__pyx_n_s_j +#define __pyx_n_s_j_col __pyx_mstate_global->__pyx_n_s_j_col +#define __pyx_n_s_k __pyx_mstate_global->__pyx_n_s_k +#define __pyx_n_s_kind __pyx_mstate_global->__pyx_n_s_kind +#define __pyx_n_s_kwargs __pyx_mstate_global->__pyx_n_s_kwargs +#define __pyx_n_s_l __pyx_mstate_global->__pyx_n_s_l +#define __pyx_n_s_l_max __pyx_mstate_global->__pyx_n_s_l_max +#define __pyx_n_s_labels_np __pyx_mstate_global->__pyx_n_s_labels_np +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_memview __pyx_mstate_global->__pyx_n_s_memview +#define __pyx_n_s_mode __pyx_mstate_global->__pyx_n_s_mode +#define __pyx_n_s_n_categories_to_keep __pyx_mstate_global->__pyx_n_s_n_categories_to_keep +#define __pyx_n_s_n_cols __pyx_mstate_global->__pyx_n_s_n_cols +#define __pyx_n_s_n_rows __pyx_mstate_global->__pyx_n_s_n_rows +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2 +#define __pyx_n_s_ndim __pyx_mstate_global->__pyx_n_s_ndim +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj +#define __pyx_n_s_object __pyx_mstate_global->__pyx_n_s_object +#define __pyx_n_s_pack __pyx_mstate_global->__pyx_n_s_pack +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_fuse_0bin_Numeric __pyx_mstate_global->__pyx_n_s_pyx_fuse_0bin_Numeric +#define __pyx_n_s_pyx_fuse_0binning __pyx_mstate_global->__pyx_n_s_pyx_fuse_0binning +#define __pyx_n_s_pyx_fuse_0binning_inplace __pyx_mstate_global->__pyx_n_s_pyx_fuse_0binning_inplace +#define __pyx_n_s_pyx_fuse_0binning_new __pyx_mstate_global->__pyx_n_s_pyx_fuse_0binning_new +#define __pyx_n_s_pyx_fuse_1bin_Numeric __pyx_mstate_global->__pyx_n_s_pyx_fuse_1bin_Numeric +#define __pyx_n_s_pyx_fuse_1binning __pyx_mstate_global->__pyx_n_s_pyx_fuse_1binning +#define __pyx_n_s_pyx_fuse_1binning_inplace __pyx_mstate_global->__pyx_n_s_pyx_fuse_1binning_inplace +#define __pyx_n_s_pyx_fuse_1binning_new __pyx_mstate_global->__pyx_n_s_pyx_fuse_1binning_new +#define __pyx_n_s_pyx_fuse_2bin_Numeric __pyx_mstate_global->__pyx_n_s_pyx_fuse_2bin_Numeric +#define __pyx_n_s_pyx_fuse_2binning __pyx_mstate_global->__pyx_n_s_pyx_fuse_2binning +#define __pyx_n_s_pyx_fuse_2binning_inplace __pyx_mstate_global->__pyx_n_s_pyx_fuse_2binning_inplace +#define __pyx_n_s_pyx_fuse_2binning_new __pyx_mstate_global->__pyx_n_s_pyx_fuse_2binning_new +#define __pyx_n_s_pyx_fuse_3bin_Numeric __pyx_mstate_global->__pyx_n_s_pyx_fuse_3bin_Numeric +#define __pyx_n_s_pyx_fuse_3binning __pyx_mstate_global->__pyx_n_s_pyx_fuse_3binning +#define __pyx_n_s_pyx_fuse_3binning_inplace __pyx_mstate_global->__pyx_n_s_pyx_fuse_3binning_inplace +#define __pyx_n_s_pyx_fuse_3binning_new __pyx_mstate_global->__pyx_n_s_pyx_fuse_3binning_new +#define __pyx_n_s_pyx_fuse_4bin_Numeric __pyx_mstate_global->__pyx_n_s_pyx_fuse_4bin_Numeric +#define __pyx_n_s_pyx_fuse_4binning __pyx_mstate_global->__pyx_n_s_pyx_fuse_4binning +#define __pyx_n_s_pyx_fuse_4binning_inplace __pyx_mstate_global->__pyx_n_s_pyx_fuse_4binning_inplace +#define __pyx_n_s_pyx_fuse_4binning_new __pyx_mstate_global->__pyx_n_s_pyx_fuse_4binning_new +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_Enum __pyx_mstate_global->__pyx_n_s_pyx_unpickle_Enum +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_register __pyx_mstate_global->__pyx_n_s_register +#define __pyx_n_s_s __pyx_mstate_global->__pyx_n_s_s +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_shape __pyx_mstate_global->__pyx_n_s_shape +#define __pyx_n_s_signatures __pyx_mstate_global->__pyx_n_s_signatures +#define __pyx_n_s_size __pyx_mstate_global->__pyx_n_s_size +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split +#define __pyx_n_s_start __pyx_mstate_global->__pyx_n_s_start +#define __pyx_n_s_step __pyx_mstate_global->__pyx_n_s_step +#define __pyx_n_s_stop __pyx_mstate_global->__pyx_n_s_stop +#define __pyx_kp_s_strided_and_direct __pyx_mstate_global->__pyx_kp_s_strided_and_direct +#define __pyx_kp_s_strided_and_direct_or_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_direct_or_indirect +#define __pyx_kp_s_strided_and_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_indirect +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_strip __pyx_mstate_global->__pyx_n_s_strip +#define __pyx_n_s_struct __pyx_mstate_global->__pyx_n_s_struct +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_kp_s_unable_to_allocate_array_data __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_array_data +#define __pyx_kp_s_unable_to_allocate_shape_and_str __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_shape_and_str +#define __pyx_n_s_unpack __pyx_mstate_global->__pyx_n_s_unpack +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_val __pyx_mstate_global->__pyx_n_s_val +#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values +#define __pyx_n_s_version_info __pyx_mstate_global->__pyx_n_s_version_info +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 +#define __pyx_int_4 __pyx_mstate_global->__pyx_int_4 +#define __pyx_int_112105877 __pyx_mstate_global->__pyx_int_112105877 +#define __pyx_int_136983863 __pyx_mstate_global->__pyx_int_136983863 +#define __pyx_int_184977713 __pyx_mstate_global->__pyx_int_184977713 +#define __pyx_int_neg_1 __pyx_mstate_global->__pyx_int_neg_1 +#define __pyx_slice__5 __pyx_mstate_global->__pyx_slice__5 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 +#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 +#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 +#define __pyx_tuple__22 __pyx_mstate_global->__pyx_tuple__22 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24 +#define __pyx_tuple__25 __pyx_mstate_global->__pyx_tuple__25 +#define __pyx_tuple__27 __pyx_mstate_global->__pyx_tuple__27 +#define __pyx_tuple__29 __pyx_mstate_global->__pyx_tuple__29 +#define __pyx_tuple__36 __pyx_mstate_global->__pyx_tuple__36 +#define __pyx_tuple__49 __pyx_mstate_global->__pyx_tuple__49 +#define __pyx_codeobj__26 __pyx_mstate_global->__pyx_codeobj__26 +#define __pyx_codeobj__28 __pyx_mstate_global->__pyx_codeobj__28 +#define __pyx_codeobj__30 __pyx_mstate_global->__pyx_codeobj__30 +#define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 +#define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 +#define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 +#define __pyx_codeobj__34 __pyx_mstate_global->__pyx_codeobj__34 +#define __pyx_codeobj__35 __pyx_mstate_global->__pyx_codeobj__35 +#define __pyx_codeobj__37 __pyx_mstate_global->__pyx_codeobj__37 +#define __pyx_codeobj__38 __pyx_mstate_global->__pyx_codeobj__38 +#define __pyx_codeobj__39 __pyx_mstate_global->__pyx_codeobj__39 +#define __pyx_codeobj__40 __pyx_mstate_global->__pyx_codeobj__40 +#define __pyx_codeobj__41 __pyx_mstate_global->__pyx_codeobj__41 +#define __pyx_codeobj__42 __pyx_mstate_global->__pyx_codeobj__42 +#define __pyx_codeobj__43 __pyx_mstate_global->__pyx_codeobj__43 +#define __pyx_codeobj__44 __pyx_mstate_global->__pyx_codeobj__44 +#define __pyx_codeobj__45 __pyx_mstate_global->__pyx_codeobj__45 +#define __pyx_codeobj__46 __pyx_mstate_global->__pyx_codeobj__46 +#define __pyx_codeobj__47 __pyx_mstate_global->__pyx_codeobj__47 +#define __pyx_codeobj__48 __pyx_mstate_global->__pyx_codeobj__48 +#define __pyx_codeobj__50 __pyx_mstate_global->__pyx_codeobj__50 +#define __pyx_codeobj__51 __pyx_mstate_global->__pyx_codeobj__51 +#define __pyx_codeobj__52 __pyx_mstate_global->__pyx_codeobj__52 +#define __pyx_codeobj__53 __pyx_mstate_global->__pyx_codeobj__53 +#define __pyx_codeobj__54 __pyx_mstate_global->__pyx_codeobj__54 +#define __pyx_codeobj__55 __pyx_mstate_global->__pyx_codeobj__55 +/* #### Code section: module_code ### */ + +/* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)__pyx_n_s_c)); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_itemsize)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_format)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mode); + if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_allocate_buffer); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 131, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 132, __pyx_L3_error) + } else { + + /* "View.MemoryView":132 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, __pyx_nargs); __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 131, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 131, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_dim; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + char *__pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_UCS4 __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":137 + * cdef Py_ssize_t dim + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 137, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 137, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":138 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + __pyx_t_2 = (!(__pyx_v_self->ndim != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":141 + * + * if not self.ndim: + * raise ValueError, "Empty shape tuple for cython.array" # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Empty_shape_tuple_for_cython_arr, 0, 0); + __PYX_ERR(1, 141, __pyx_L1_error) + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + } + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + __pyx_t_2 = (__pyx_v_itemsize <= 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":144 + * + * if itemsize <= 0: + * raise ValueError, "itemsize <= 0 for cython.array" # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_itemsize_0_for_cython_array, 0, 0); + __PYX_ERR(1, 144, __pyx_L1_error) + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + } + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_3 = (!__pyx_t_2); + if (__pyx_t_3) { + + /* "View.MemoryView":147 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_n_s_ASCII}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":148 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_format))) __PYX_ERR(1, 148, __pyx_L1_error) + __pyx_t_4 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":149 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 149, __pyx_L1_error) + } + __pyx_t_8 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) __PYX_ERR(1, 149, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_8; + + /* "View.MemoryView":152 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":153 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + __pyx_t_3 = (!(__pyx_v_self->_shape != 0)); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":156 + * + * if not self._shape: + * raise MemoryError, "unable to allocate shape and strides." # <<<<<<<<<<<<<< + * + * + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_shape_and_str, 0, 0); + __PYX_ERR(1, 156, __pyx_L1_error) + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + } + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + __pyx_t_7 = 0; + __pyx_t_4 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_4); + __pyx_t_1 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #endif + if (__pyx_t_1 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_9; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + __pyx_t_3 = (__pyx_v_dim <= 0); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":161 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_5 = PyTuple_New(5); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = 0; + __pyx_t_10 = 127; + __Pyx_INCREF(__pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_9 += 22; + __Pyx_GIVEREF(__pyx_kp_u_Invalid_shape_in_axis); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_6 = __Pyx_PyUnicode_From_int(__pyx_v_idx, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u_); + __pyx_t_9 += 2; + __Pyx_GIVEREF(__pyx_kp_u_); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u_); + __pyx_t_6 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u__2); + __pyx_t_9 += 1; + __Pyx_GIVEREF(__pyx_kp_u__2); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_kp_u__2); + __pyx_t_6 = __Pyx_PyUnicode_Join(__pyx_t_5, 5, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 161, __pyx_L1_error) + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":162 + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 165, __pyx_L1_error) + if (__pyx_t_3) { + + /* "View.MemoryView":166 + * cdef char order + * if mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * elif mode == 'fortran': + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":167 + * if mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * elif mode == 'fortran': + * order = b'F' + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 168, __pyx_L1_error) + if (likely(__pyx_t_3)) { + + /* "View.MemoryView":169 + * self.mode = u'c' + * elif mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * else: + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":170 + * elif mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":172 + * self.mode = u'fortran' + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_FormatSimple(__pyx_v_mode, __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 172, __pyx_L1_error) + } + __pyx_L11:; + + /* "View.MemoryView":174 + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) # <<<<<<<<<<<<<< + * + * self.free_data = allocate_buffer + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":176 + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":177 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * + * if allocate_buffer: + */ + __pyx_t_6 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 177, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_3; + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + if (__pyx_v_allocate_buffer) { + + /* "View.MemoryView":180 + * + * if allocate_buffer: + * _allocate_buffer(self) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_t_7 = __pyx_array_allocate_buffer(__pyx_v_self); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(1, 180, __pyx_L1_error) + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + } + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + char *__pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_ssize_t *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":184 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_t_1 = ((__pyx_v_flags & ((PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS) | PyBUF_ANY_CONTIGUOUS)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 186, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":187 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L4; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 188, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L4:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + __pyx_t_1 = (!((__pyx_v_flags & __pyx_v_bufmode) != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Can_only_create_a_buffer_that_is, 0, 0); + __PYX_ERR(1, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + } + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * + */ + __pyx_t_2 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_2; + + /* "View.MemoryView":193 + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_3; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":196 + * + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_4 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_4; + + /* "View.MemoryView":197 + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * else: + */ + __pyx_t_5 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":198 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * else: + * info.ndim = 1 + */ + __pyx_t_5 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_5; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + goto __pyx_L6; + } + + /* "View.MemoryView":200 + * info.strides = self._strides + * else: + * info.ndim = 1 # <<<<<<<<<<<<<< + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL + */ + /*else*/ { + __pyx_v_info->ndim = 1; + + /* "View.MemoryView":201 + * else: + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL # <<<<<<<<<<<<<< + * info.strides = NULL + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + __pyx_t_5 = (&__pyx_v_self->len); + } else { + __pyx_t_5 = NULL; + } + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":202 + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL # <<<<<<<<<<<<<< + * + * info.suboffsets = NULL + */ + __pyx_v_info->strides = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":204 + * info.strides = NULL + * + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":205 + * + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + */ + __pyx_t_3 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_3; + + /* "View.MemoryView":206 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":207 + * info.itemsize = self.itemsize + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_self->format; + } else { + __pyx_t_2 = NULL; + } + __pyx_v_info->format = __pyx_t_2; + + /* "View.MemoryView":208 + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + __pyx_t_1 = (__pyx_v_self->callback_free_data != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + if (__pyx_v_self->free_data) { + } else { + __pyx_t_1 = __pyx_v_self->free_data; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->data != NULL); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":215 + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) # <<<<<<<<<<<<<< + * free(self.data) + * PyObject_Free(self._shape) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + } + + /* "View.MemoryView":216 + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + } + __pyx_L3:; + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ +} + +/* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":221 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_memview", 1); + + /* "View.MemoryView":225 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":226 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + + /* "View.MemoryView":229 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getattr__", 1); + + /* "View.MemoryView":232 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":235 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 1); + + /* "View.MemoryView":238 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0))) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_i; + PyObject **__pyx_v_p; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":254 + * cdef PyObject **p + * + * self.free_data = True # <<<<<<<<<<<<<< + * self.data = malloc(self.len) + * if not self.data: + */ + __pyx_v_self->free_data = 1; + + /* "View.MemoryView":255 + * + * self.free_data = True + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError, "unable to allocate array data." + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + __pyx_t_1 = (!(__pyx_v_self->data != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":257 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError, "unable to allocate array data." # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_array_data, 0, 0); + __PYX_ERR(1, 257, __pyx_L1_error) + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":260 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":261 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len // self.itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_self->itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_self->itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_self->itemsize); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":262 + * p = self.data + * for i in range(self.len // self.itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * return 0 + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":263 + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * return 0 + * + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + } + + /* "View.MemoryView":264 + * p[i] = Py_None + * Py_INCREF(Py_None) + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_c_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + PyObject *__pyx_v_mode = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("array_cwrapper", 1); + + /* "View.MemoryView":270 + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. # <<<<<<<<<<<<<< + * + * if buf is NULL: + */ + __pyx_t_2 = ((__pyx_v_c_mode[0]) == 'f'); + if (__pyx_t_2) { + __Pyx_INCREF(__pyx_n_s_fortran); + __pyx_t_1 = __pyx_n_s_fortran; + } else { + __Pyx_INCREF(__pyx_n_s_c); + __pyx_t_1 = __pyx_n_s_c; + } + __pyx_v_mode = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + __pyx_t_2 = (__pyx_v_buf == NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":273 + * + * if buf is NULL: + * result = array.__new__(array, shape, itemsize, format, mode) # <<<<<<<<<<<<<< + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + */ + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_shape)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_mode)) __PYX_ERR(1, 273, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_4, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":275 + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + /*else*/ { + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_mode)) __PYX_ERR(1, 275, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 275, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_1, __pyx_t_4)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":276 + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":278 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_mode); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 304, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 304, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 304, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "View.MemoryView":305 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":307 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 349, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_dtype_is_object); + if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 349, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, __pyx_nargs); __PYX_ERR(1, 349, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_intptr_t __pyx_t_4; + size_t __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 1); + + /* "View.MemoryView":350 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":351 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_obj != Py_None); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":353 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_3 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 353, __pyx_L1_error) + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = (((PyObject *)__pyx_v_self->view.obj) == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":356 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + __pyx_t_1 = (!__PYX_CYTHON_ATOMICS_ENABLED()); + if (__pyx_t_1) { + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = (__pyx_memoryview_thread_locks_used < 8); + if (__pyx_t_1) { + + /* "View.MemoryView":361 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":362 + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":364 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":366 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(1, 366, __pyx_L1_error) + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + } + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":369 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = ((__pyx_v_self->view.format[0]) == 'O'); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_self->view.format[1]) == '\x00'); + __pyx_t_1 = __pyx_t_2; + __pyx_L12_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":371 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L11:; + + /* "View.MemoryView":373 + * self.dtype_is_object = dtype_is_object + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 # <<<<<<<<<<<<<< + * self.typeinfo = NULL + * + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_4 = ((Py_intptr_t)((void *)(&__pyx_v_self->acquisition_count))); + __pyx_t_5 = (sizeof(__pyx_atomic_int_type)); + if (unlikely(__pyx_t_5 == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 373, __pyx_L1_error) + } + __pyx_t_1 = ((__pyx_t_4 % __pyx_t_5) == 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 373, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 373, __pyx_L1_error) + #endif + + /* "View.MemoryView":374 + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyThread_type_lock __pyx_t_5; + PyThread_type_lock __pyx_t_6; + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":378 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + __pyx_t_1 = (((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":381 + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< + * Py_DECREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; + + /* "View.MemoryView":382 + * + * (<__pyx_buffer *> &self.view).obj = NULL + * Py_DECREF(Py_None) # <<<<<<<<<<<<<< + * + * cdef int i + */ + Py_DECREF(Py_None); + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + } + __pyx_L3:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_1 = (__pyx_v_self->lock != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":387 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_2 = __pyx_memoryview_thread_locks_used; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock); + if (__pyx_t_1) { + + /* "View.MemoryView":389 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_1 = (__pyx_v_i != __pyx_memoryview_thread_locks_used); + if (__pyx_t_1) { + + /* "View.MemoryView":392 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_5 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":391 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_5; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_6; + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":393 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":395 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ +} + +/* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_item_pointer", 1); + + /* "View.MemoryView":399 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 401, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 401, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":402 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":404 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + if (__pyx_t_1) { + + /* "View.MemoryView":409 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":411 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 411, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 411, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_indices = __pyx_t_4; + __pyx_t_4 = 0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 414, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":415 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":417 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_5 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(1, 417, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_5; + + /* "View.MemoryView":418 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + if (unlikely(__pyx_v_self->view.readonly)) { + + /* "View.MemoryView":422 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_Cannot_assign_to_read_only_memor, 0, 0); + __PYX_ERR(1, 422, __pyx_L1_error) + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + } + + /* "View.MemoryView":424 + * raise TypeError, "Cannot assign to read-only memoryview" + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_1 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 424, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 424, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 426, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":427 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 428, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":429 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_1 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_1, __pyx_v_obj); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":431 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 431, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_3), __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":433 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":439 + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 439, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":440 + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 440, __pyx_L6_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + + /* "View.MemoryView":441 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __pyx_L6_except_error:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":443 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + __Pyx_memviewslice __pyx_v_msrc; + __Pyx_memviewslice __pyx_v_mdst; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 1); + + /* "View.MemoryView":448 + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_v_msrc = (__pyx_t_1[0]); + + /* "View.MemoryView":449 + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] # <<<<<<<<<<<<<< + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_v_mdst = (__pyx_t_1[0]); + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = __pyx_memoryview_copy_contents(__pyx_v_msrc, __pyx_v_mdst, __pyx_t_3, __pyx_t_4, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 451, __pyx_L1_error) + + /* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + char const *__pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 1); + + /* "View.MemoryView":455 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":460 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 460, __pyx_L1_error) + __pyx_v_dst_slice = __pyx_t_1; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_2 = (((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))); + if (__pyx_t_2) { + + /* "View.MemoryView":463 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_2 = (__pyx_v_tmp == NULL); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":465 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(1, 465, __pyx_L1_error) + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":466 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":468 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":470 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":472 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":474 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 474, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_2 = (__pyx_v_self->view.suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":479 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_4 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 479, __pyx_L6_error) + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":480 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":483 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_indexed", 1); + + /* "View.MemoryView":486 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 486, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":487 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 487, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":492 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 492, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":495 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":497 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError, "Unable to convert item to object" + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_9 = __Pyx_ssize_strlen(__pyx_v_self->view.format); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(1, 501, __pyx_L5_except_error) + __pyx_t_10 = (__pyx_t_9 == 1); + if (__pyx_t_10) { + + /* "View.MemoryView":502 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 502, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":503 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":498 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError, "Unable to convert item to object" + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_6); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "View.MemoryView":499 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError, "Unable to convert item to object" # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Unable_to_convert_item_to_object, 0, 0); + __PYX_ERR(1, 499, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + char *__pyx_t_9; + char *__pyx_t_10; + char *__pyx_t_11; + char *__pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":508 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + if (__pyx_t_2) { + + /* "View.MemoryView":514 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 514, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":516 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_v_value}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 516, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 518, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_8 = __pyx_v_bytesvalue; + __pyx_t_10 = PyBytes_AS_STRING(__pyx_t_8); + __pyx_t_11 = (__pyx_t_10 + PyBytes_GET_SIZE(__pyx_t_8)); + for (__pyx_t_12 = __pyx_t_10; __pyx_t_12 < __pyx_t_11; __pyx_t_12++) { + __pyx_t_9 = __pyx_t_12; + __pyx_v_c = (__pyx_t_9[0]); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_7; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + char *__pyx_t_4; + void *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":524 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError, "Cannot create writable memory view from read-only memoryview" # <<<<<<<<<<<<<< + * + * if flags & PyBUF_ND: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Cannot_create_writable_memory_vi, 0, 0); + __PYX_ERR(1, 524, __pyx_L1_error) + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + } + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":527 + * + * if flags & PyBUF_ND: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_3 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_3; + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":529 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":532 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_3 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_3; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":534 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":537 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_3 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_3; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":539 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":542 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":544 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":546 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_5 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_5; + + /* "View.MemoryView":547 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_6 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":548 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_7 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_7; + + /* "View.MemoryView":549 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_7 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_7; + + /* "View.MemoryView":550 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":551 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":556 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 556, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 556, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":557 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(1, 557, __pyx_L1_error) + + /* "View.MemoryView":558 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":562 + * @property + * def base(self): + * return self._get_base() # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->_get_base(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 562, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.base.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":565 + * + * cdef _get_base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_7genexpr__pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":569 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_7genexpr__pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_7genexpr__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } /* exit inner scope */ + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr1__pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + __pyx_t_1 = (__pyx_v_self->view.strides == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":575 + * if self.view.strides == NULL: + * + * raise ValueError, "Buffer view does not expose strides" # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Buffer_view_does_not_expose_stri, 0, 0); + __PYX_ERR(1, 575, __pyx_L1_error) + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + } + + /* "View.MemoryView":577 + * raise ValueError, "Buffer view does not expose strides" + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr1__pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr1__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr2__pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = (__pyx_v_self->view.suboffsets == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PySequence_Multiply(__pyx_tuple__4, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":584 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.suboffsets; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr2__pyx_v_suboffset = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr2__pyx_v_suboffset); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":588 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 588, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":592 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 592, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":596 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":601 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":603 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_t_5 = PyInt_FromSsize_t((__pyx_t_2[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 603, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":604 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_5 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 604, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_5); + __pyx_t_5 = 0; + } + + /* "View.MemoryView":606 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":608 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = (__pyx_v_self->view.ndim >= 1); + if (__pyx_t_1) { + + /* "View.MemoryView":612 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":614 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":618 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 1); + + /* "View.MemoryView":621 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_c_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_c_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_c_contig", 1); + + /* "View.MemoryView":627 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 627, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":628 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_f_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_f_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_f_contig", 1); + + /* "View.MemoryView":633 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 633, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":634 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy", 1); + + /* "View.MemoryView":638 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":640 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":641 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 641, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":646 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 646, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy_fortran", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy_fortran", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy_fortran", 1); + + /* "View.MemoryView":650 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":652 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":653 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 653, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":658 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 1); + + /* "View.MemoryView":663 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":664 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":665 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":669 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_idx; + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_UCS4 __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_unellipsify", 1); + + /* "View.MemoryView":677 + * """ + * cdef Py_ssize_t idx + * tup = index if isinstance(index, tuple) else (index,) # <<<<<<<<<<<<<< + * + * result = [slice(None)] * ndim + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_index); + if (__pyx_t_2) { + __Pyx_INCREF(((PyObject*)__pyx_v_index)); + __pyx_t_1 = __pyx_v_index; + } else { + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index)) __PYX_ERR(1, 677, __pyx_L1_error); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_v_tup = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_1 = PyList_New(1 * ((__pyx_v_ndim<0) ? 0:__pyx_v_ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_ndim; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error); + } + } + __pyx_v_result = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":680 + * + * result = [slice(None)] * ndim + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * idx = 0 + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":681 + * result = [slice(None)] * ndim + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * idx = 0 + * for item in tup: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":682 + * have_slices = False + * seen_ellipsis = False + * idx = 0 # <<<<<<<<<<<<<< + * for item in tup: + * if item is Ellipsis: + */ + __pyx_v_idx = 0; + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 683, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_1); + __pyx_t_4 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #endif + if (__pyx_t_4 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 683, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + __pyx_t_2 = (!__pyx_v_seen_ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":686 + * if item is Ellipsis: + * if not seen_ellipsis: + * idx += ndim - len(tup) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * have_slices = True + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 686, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(__pyx_v_tup); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 686, __pyx_L1_error) + __pyx_v_idx = (__pyx_v_idx + (__pyx_v_ndim - __pyx_t_5)); + + /* "View.MemoryView":687 + * if not seen_ellipsis: + * idx += ndim - len(tup) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + } + + /* "View.MemoryView":688 + * idx += ndim - len(tup) + * seen_ellipsis = True + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if isinstance(item, slice): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + if (__pyx_t_2) { + + /* "View.MemoryView":691 + * else: + * if isinstance(item, slice): + * have_slices = True # <<<<<<<<<<<<<< + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + goto __pyx_L7; + } + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + __pyx_t_2 = (!(PyIndex_Check(__pyx_v_item) != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":693 + * have_slices = True + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" # <<<<<<<<<<<<<< + * result[idx] = item + * idx += 1 + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_6 = 127; + __Pyx_INCREF(__pyx_kp_u_Cannot_index_with_type); + __pyx_t_5 += 24; + __Pyx_GIVEREF(__pyx_kp_u_Cannot_index_with_type); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Cannot_index_with_type); + __pyx_t_7 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_item)), __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6; + __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_kp_u__6); + __pyx_t_5 += 1; + __Pyx_GIVEREF(__pyx_kp_u__6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__6); + __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_t_7, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(1, 693, __pyx_L1_error) + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + } + __pyx_L7:; + + /* "View.MemoryView":694 + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item # <<<<<<<<<<<<<< + * idx += 1 + * + */ + if (unlikely((__Pyx_SetItemInt(__pyx_v_result, __pyx_v_idx, __pyx_v_item, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1) < 0))) __PYX_ERR(1, 694, __pyx_L1_error) + } + __pyx_L5:; + + /* "View.MemoryView":695 + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + * idx += 1 # <<<<<<<<<<<<<< + * + * nslices = ndim - idx + */ + __pyx_v_idx = (__pyx_v_idx + 1); + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":697 + * idx += 1 + * + * nslices = ndim - idx # <<<<<<<<<<<<<< + * return have_slices or nslices, tuple(result) + * + */ + __pyx_v_nslices = (__pyx_v_ndim - __pyx_v_idx); + + /* "View.MemoryView":698 + * + * nslices = ndim - idx + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_7 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + __pyx_L9_bool_binop_done:; + __pyx_t_7 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 698, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_7 = 0; + __pyx_r = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static int assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + int __pyx_r; + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":701 + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + __pyx_t_4 = (__pyx_v_suboffset >= 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":703 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" # <<<<<<<<<<<<<< + * return 0 # return type just used as an error flag + * + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Indirect_dimensions_not_supporte, 0, 0); + __PYX_ERR(1, 703, __pyx_L1_error) + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + } + } + + /* "View.MemoryView":704 + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + Py_ssize_t __pyx_v_cindex; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + struct __pyx_memoryview_obj *__pyx_t_3; + char *__pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + PyObject *(*__pyx_t_7)(PyObject *); + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memview_slice", 1); + + /* "View.MemoryView":712 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":719 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":723 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_1 = (__pyx_v_memview->view.ndim > 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 723, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 723, __pyx_L1_error) + #endif + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":726 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 726, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":727 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":729 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":730 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":736 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_3 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_3; + + /* "View.MemoryView":737 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_4; + + /* "View.MemoryView":742 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step, cindex + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":743 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step, cindex + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + __pyx_t_5 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_2 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_2); + __pyx_t_6 = 0; + __pyx_t_7 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 747, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_7)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_7(__pyx_t_2); + if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 747, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_dim = __pyx_t_5; + __pyx_t_5 = (__pyx_t_5 + 1); + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + __pyx_t_1 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":749 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * cindex = index # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 749, __pyx_L1_error) + __pyx_v_cindex = __pyx_t_9; + + /* "View.MemoryView":750 + * if PyIndex_Check(index): + * cindex = index + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_cindex, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 750, __pyx_L1_error) + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + goto __pyx_L6; + } + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_1 = (__pyx_v_index == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":757 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":758 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":759 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":760 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":762 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 762, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 762, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_9; + + /* "View.MemoryView":763 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 763, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 763, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 763, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_9; + + /* "View.MemoryView":764 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 764, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 764, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 764, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_9; + + /* "View.MemoryView":766 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":767 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 767, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":768 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":770 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 770, __pyx_L1_error) + + /* "View.MemoryView":776 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":780 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 780, __pyx_L1_error) } + + /* "View.MemoryView":781 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 781, __pyx_L1_error) } + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 779, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":785 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 784, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = (!__pyx_v_is_slice); + if (__pyx_t_1) { + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = (__pyx_v_start < 0); + if (__pyx_t_1) { + + /* "View.MemoryView":816 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":818 + * start += shape + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 818, __pyx_L1_error) + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_have_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":822 + * + * if have_step: + * negative_step = step < 0 # <<<<<<<<<<<<<< + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + */ + __pyx_v_negative_step = (__pyx_v_step < 0); + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + __pyx_t_2 = (__pyx_v_step == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":824 + * negative_step = step < 0 + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * negative_step = False + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 824, __pyx_L1_error) + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":826 + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + * negative_step = False # <<<<<<<<<<<<<< + * step = 1 + * + */ + /*else*/ { + __pyx_v_negative_step = 0; + + /* "View.MemoryView":827 + * else: + * negative_step = False + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + } + __pyx_L6:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":832 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":834 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = (__pyx_v_start >= __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + if (__pyx_v_negative_step) { + + /* "View.MemoryView":837 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":839 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L11:; + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L9:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L8; + } + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":842 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":844 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L12:; + } + __pyx_L8:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":850 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = (__pyx_v_stop > __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":852 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L14:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L13; + } + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":855 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L16; + } + + /* "View.MemoryView":857 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L16:; + } + __pyx_L13:; + + /* "View.MemoryView":861 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":864 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = (__pyx_v_new_shape < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":867 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":870 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":871 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":872 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = ((__pyx_v_suboffset_dim[0]) < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":878 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L19:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = (!__pyx_v_is_slice); + if (__pyx_t_2) { + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = (__pyx_v_new_ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":883 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L22; + } + + /* "View.MemoryView":885 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":886 + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 885, __pyx_L1_error) + } + __pyx_L22:; + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L21; + } + + /* "View.MemoryView":888 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L21:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":890 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_UCS4 __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("pybuffer_index", 1); + + /* "View.MemoryView":898 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":899 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + __pyx_t_2 = (__pyx_v_view->ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":903 + * + * if view.ndim == 0: + * shape = view.len // itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":904 + * if view.ndim == 0: + * shape = view.len // itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":906 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":907 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = (__pyx_v_view->suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":909 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":914 + * index += view.shape[dim] + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_5 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__7); + __pyx_t_5 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 914, __pyx_L1_error) + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index >= __pyx_v_shape); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":917 + * + * if index >= shape: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_3 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u__7); + __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_5, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 917, __pyx_L1_error) + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":919 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":923 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":930 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":932 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":933 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":937 + * + * cdef int i, j + * for i in range(ndim // 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":938 + * cdef int i, j + * for i in range(ndim // 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":939 + * for i in range(ndim // 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":940 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":943 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_t_9 = __pyx_memoryview_err(PyExc_ValueError, __pyx_kp_s_Cannot_transpose_memoryview_with); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L1_error) + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":945 + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + + /* "View.MemoryView":964 + * + * def __dealloc__(self): + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XCLEAR_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_object_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":968 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 968, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":970 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 970, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_dtype_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":974 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 974, __pyx_L1_error) + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":976 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":979 + * + * cdef _get_base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_fromslice", 1); + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_memviewslice.memview) == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":1008 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1013 + * + * + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = ((PyObject *)__pyx_tp_new__memoryviewslice(((PyTypeObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1015 + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1016 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview)._get_base() + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1018 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview)._get_base() # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->__pyx_vtab)->_get_base(((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1018, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1019 + * + * result.from_object = ( memviewslice.memview)._get_base() + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1021 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1022 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1023 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1024 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1025 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1028 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1030 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1032 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1033 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1036 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1037 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = (__pyx_v_suboffset >= 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1039 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1040 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1042 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1043 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1043, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1044 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1046 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1047 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1049 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_slice_from_memview", 1); + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1056 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1056, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1057 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1059 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1060 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1067 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1068 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1069 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1071 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1072 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1074 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1075 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1076 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1077 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + __pyx_t_6 = (__pyx_v_suboffsets != 0); + if (__pyx_t_6) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ +} + +/* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy", 1); + + /* "View.MemoryView":1083 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1084 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1084, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *(*__pyx_t_2)(char *); + int (*__pyx_t_3)(char *, PyObject *); + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 1); + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1095 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_2 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_2; + + /* "View.MemoryView":1096 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_3; + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1098 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1099 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1101 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1103 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":1110 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: + * return -arg if arg < 0 else arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + __pyx_t_2 = (__pyx_v_arg < 0); + if (__pyx_t_2) { + __pyx_t_1 = (-__pyx_v_arg); + } else { + __pyx_t_1 = __pyx_v_arg; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1118 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1119 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1121 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1123 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1124 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1126 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1128 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1129 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = (abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)); + if (__pyx_t_2) { + + /* "View.MemoryView":1132 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1134 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + + /* "View.MemoryView":1144 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1146 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = (__pyx_v_src_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_dst_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1151 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_1 = __pyx_t_2; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1152 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1154 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1155 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1156 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1157 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1159 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1160 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1164 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1165 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1170 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + + /* "View.MemoryView":1176 + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for shape in src.shape[:ndim]: + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1178 + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * + * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< + * size *= shape + * + */ + __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); + for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_shape = (__pyx_t_2[0]); + + /* "View.MemoryView":1179 + * + * for shape in src.shape[:ndim]: + * size *= shape # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * __pyx_v_shape); + } + + /* "View.MemoryView":1181 + * size *= shape + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = (__pyx_v_order == 'F'); + if (__pyx_t_1) { + + /* "View.MemoryView":1194 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1195 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1196 + * for idx in range(ndim): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1198 + * stride *= shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1199 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1200 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1202 + * stride *= shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1216 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1217 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1219 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err_no_memory() + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + __pyx_t_2 = (!(__pyx_v_result != 0)); + if (__pyx_t_2) { + + /* "View.MemoryView":1221 + * result = malloc(size) + * if not result: + * _err_no_memory() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_no_memory(); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1221, __pyx_L1_error) + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + } + + /* "View.MemoryView":1224 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1225 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1226 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1227 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1228 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1230 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) # <<<<<<<<<<<<<< + * + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = ((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = __pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_UCS4 __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = PyTuple_New(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = 0; + __pyx_t_3 = 127; + __Pyx_INCREF(__pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_2 += 35; + __Pyx_GIVEREF(__pyx_kp_u_got_differing_extents_in_dimensi); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_i, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_got); + __pyx_t_2 += 6; + __Pyx_GIVEREF(__pyx_kp_u_got); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_got); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent1, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_and); + __pyx_t_2 += 5; + __Pyx_GIVEREF(__pyx_kp_u_and); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_kp_u_and); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent2, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_2 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_kp_u__7); + __pyx_t_4 = __Pyx_PyUnicode_Join(__pyx_t_1, 7, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, PyObject *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1253 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: + * raise error, msg % dim # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_v_msg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_t_2, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1253, __pyx_L1_error) + + /* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, PyObject *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1257 + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: + * raise error, msg # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_no_memory') + */ + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_v_msg, 0, 0); + __PYX_ERR(1, 1257, __pyx_L1_error) + + /* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + +static int __pyx_memoryview_err_no_memory(void) { + int __pyx_r; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1261 + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: + * raise MemoryError # <<<<<<<<<<<<<< + * + * + */ + PyErr_NoMemory(); __PYX_ERR(1, 1261, __pyx_L1_error) + + /* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err_no_memory", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1273 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1274 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1276 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1277 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1278 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = (__pyx_v_src_ndim < __pyx_v_dst_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1282 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = (__pyx_v_dst_ndim < __pyx_v_src_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1284 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1286 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + __pyx_t_2 = (__pyx_t_3 > __pyx_t_4); + if (__pyx_t_2) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1288 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1291 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1292 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1294 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1294, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = ((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1297 + * + * if src.suboffsets[i] >= 0: + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Dimension_d_is_not_direct, __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1297, __pyx_L1_error) + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = __pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = (!__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim)); + if (__pyx_t_2) { + + /* "View.MemoryView":1302 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1304 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1304, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1305 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (!__pyx_v_broadcasting); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1311 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1313 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + if (__pyx_v_direct_copy) { + + /* "View.MemoryView":1317 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1318 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1319 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1320 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1321 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + if (__pyx_t_2) { + + /* "View.MemoryView":1326 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1326, __pyx_L1_error) + + /* "View.MemoryView":1327 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1327, __pyx_L1_error) + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1329 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1330 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1331 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1333 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1334 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1341 + * int ndim_other) noexcept nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1343 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1344 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1345 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1346 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1348 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1349 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1350 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1351 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + if (__pyx_v_dtype_is_object) { + + /* "View.MemoryView":1362 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + } + + /* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1368 + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + + /* function exit code */ + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1374 + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * + * for i in range(shape[0]): + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1376 + * cdef Py_ssize_t stride = strides[0] + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = (__pyx_v_ndim == 1); + if (__pyx_t_4) { + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + if (__pyx_v_inc) { + + /* "View.MemoryView":1379 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1381 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1383 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += stride + */ + /*else*/ { + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1385 + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + * + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + + /* function exit code */ +} + +/* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1394 + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1395 + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) # <<<<<<<<<<<<<< + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1396 + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1404 + * size_t itemsize, void *item) noexcept nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1405 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1408 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1409 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1410 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1412 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1413 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) # <<<<<<<<<<<<<< + * data += stride + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1414 + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__8, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "binning.pyx":15 + * + * + * @cython.boundscheck(False) # <<<<<<<<<<<<<< + * @cython.wraparound(False) + * def bin_rare_events( + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_1bin_rare_events(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_7binning_1bin_rare_events = {"bin_rare_events", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7binning_1bin_rare_events, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_1bin_rare_events(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_categories_to_keep_np = 0; + PyArrayObject *__pyx_v_n_categories_to_keep = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("bin_rare_events (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_categories_to_keep_np,&__pyx_n_s_n_categories_to_keep,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_categories_to_keep_np)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("bin_rare_events", 1, 3, 3, 1); __PYX_ERR(0, 15, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_n_categories_to_keep)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("bin_rare_events", 1, 3, 3, 2); __PYX_ERR(0, 15, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "bin_rare_events") < 0)) __PYX_ERR(0, 15, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_categories_to_keep_np = ((PyArrayObject *)values[1]); + __pyx_v_n_categories_to_keep = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("bin_rare_events", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 15, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.bin_rare_events", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_categories_to_keep_np), __pyx_ptype_5numpy_ndarray, 1, "categories_to_keep_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_n_categories_to_keep), __pyx_ptype_5numpy_ndarray, 1, "n_categories_to_keep", 0))) __PYX_ERR(0, 20, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_bin_rare_events(__pyx_self, __pyx_v_X, __pyx_v_categories_to_keep_np, __pyx_v_n_categories_to_keep); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_bin_rare_events(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_categories_to_keep_np, PyArrayObject *__pyx_v_n_categories_to_keep) { + __pyx_t_5numpy_int_t __pyx_v_l; + __pyx_t_5numpy_int_t __pyx_v_l_max; + __pyx_t_5numpy_int_t __pyx_v_n_rows; + __pyx_t_5numpy_int_t __pyx_v_n_cols; + PyObject *__pyx_v_val = 0; + __pyx_t_5numpy_int_t __pyx_v_is_rare; + PyArrayObject *__pyx_v_X_rare = 0; + __pyx_t_5numpy_int_t __pyx_v_j; + __pyx_t_5numpy_int_t __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_rare; + __Pyx_Buffer __pyx_pybuffer_X_rare; + __Pyx_LocalBuf_ND __pyx_pybuffernd_categories_to_keep_np; + __Pyx_Buffer __pyx_pybuffer_categories_to_keep_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_n_categories_to_keep; + __Pyx_Buffer __pyx_pybuffer_n_categories_to_keep; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + __pyx_t_5numpy_int_t __pyx_t_9; + __pyx_t_5numpy_int_t __pyx_t_10; + __pyx_t_5numpy_int_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_t_13; + __pyx_t_5numpy_int_t __pyx_t_14; + __pyx_t_5numpy_int_t __pyx_t_15; + __pyx_t_5numpy_int_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + PyObject **__pyx_t_18; + __pyx_t_5numpy_int_t __pyx_t_19; + __pyx_t_5numpy_int_t __pyx_t_20; + __pyx_t_5numpy_int_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("bin_rare_events", 1); + __pyx_pybuffer_X_rare.pybuffer.buf = NULL; + __pyx_pybuffer_X_rare.refcount = 0; + __pyx_pybuffernd_X_rare.data = NULL; + __pyx_pybuffernd_X_rare.rcbuffer = &__pyx_pybuffer_X_rare; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_categories_to_keep_np.pybuffer.buf = NULL; + __pyx_pybuffer_categories_to_keep_np.refcount = 0; + __pyx_pybuffernd_categories_to_keep_np.data = NULL; + __pyx_pybuffernd_categories_to_keep_np.rcbuffer = &__pyx_pybuffer_categories_to_keep_np; + __pyx_pybuffer_n_categories_to_keep.pybuffer.buf = NULL; + __pyx_pybuffer_n_categories_to_keep.refcount = 0; + __pyx_pybuffernd_n_categories_to_keep.data = NULL; + __pyx_pybuffernd_n_categories_to_keep.rcbuffer = &__pyx_pybuffer_n_categories_to_keep; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_categories_to_keep_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_categories_to_keep_np.diminfo[0].strides = __pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_to_keep_np.diminfo[0].shape = __pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_categories_to_keep_np.diminfo[1].strides = __pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_categories_to_keep_np.diminfo[1].shape = __pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_categories_to_keep.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_categories_to_keep, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_n_categories_to_keep.diminfo[0].strides = __pyx_pybuffernd_n_categories_to_keep.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_n_categories_to_keep.diminfo[0].shape = __pyx_pybuffernd_n_categories_to_keep.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":24 + * cdef np.int_t j_col + * cdef np.int_t l_max + * cdef np.int_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int_t n_cols = X.shape[1] + * cdef object val = 'OTHERS' + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":25 + * cdef np.int_t l_max + * cdef np.int_t n_rows = X.shape[0] + * cdef np.int_t n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef object val = 'OTHERS' + * cdef np.int_t is_rare = 1 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "binning.pyx":26 + * cdef np.int_t n_rows = X.shape[0] + * cdef np.int_t n_cols = X.shape[1] + * cdef object val = 'OTHERS' # <<<<<<<<<<<<<< + * cdef np.int_t is_rare = 1 + * cdef np.ndarray[object, ndim=2] X_rare = np.empty((n_rows, n_cols), X.dtype) + */ + __Pyx_INCREF(__pyx_n_u_OTHERS); + __pyx_v_val = __pyx_n_u_OTHERS; + + /* "binning.pyx":27 + * cdef np.int_t n_cols = X.shape[1] + * cdef object val = 'OTHERS' + * cdef np.int_t is_rare = 1 # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_rare = np.empty((n_rows, n_cols), X.dtype) + * for j in range(n_cols): + */ + __pyx_v_is_rare = 1; + + /* "binning.pyx":28 + * cdef object val = 'OTHERS' + * cdef np.int_t is_rare = 1 + * cdef np.ndarray[object, ndim=2] X_rare = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * for j in range(n_cols): + * l_max = n_categories_to_keep[j] + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_npy_long(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_npy_long(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 28, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 28, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_rare.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_rare = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 28, __pyx_L1_error) + } else {__pyx_pybuffernd_X_rare.diminfo[0].strides = __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_rare.diminfo[0].shape = __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_rare.diminfo[1].strides = __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_rare.diminfo[1].shape = __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_rare = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":29 + * cdef np.int_t is_rare = 1 + * cdef np.ndarray[object, ndim=2] X_rare = np.empty((n_rows, n_cols), X.dtype) + * for j in range(n_cols): # <<<<<<<<<<<<<< + * l_max = n_categories_to_keep[j] + * if l_max == 0: + */ + __pyx_t_9 = __pyx_v_n_cols; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_j = __pyx_t_11; + + /* "binning.pyx":30 + * cdef np.ndarray[object, ndim=2] X_rare = np.empty((n_rows, n_cols), X.dtype) + * for j in range(n_cols): + * l_max = n_categories_to_keep[j] # <<<<<<<<<<<<<< + * if l_max == 0: + * for k in range(n_rows): + */ + __pyx_t_12 = __pyx_v_j; + __pyx_v_l_max = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_n_categories_to_keep.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_n_categories_to_keep.diminfo[0].strides)); + + /* "binning.pyx":31 + * for j in range(n_cols): + * l_max = n_categories_to_keep[j] + * if l_max == 0: # <<<<<<<<<<<<<< + * for k in range(n_rows): + * X_rare[k, j] = val + */ + __pyx_t_13 = (__pyx_v_l_max == 0); + if (__pyx_t_13) { + + /* "binning.pyx":32 + * l_max = n_categories_to_keep[j] + * if l_max == 0: + * for k in range(n_rows): # <<<<<<<<<<<<<< + * X_rare[k, j] = val + * else: + */ + __pyx_t_14 = __pyx_v_n_rows; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":33 + * if l_max == 0: + * for k in range(n_rows): + * X_rare[k, j] = val # <<<<<<<<<<<<<< + * else: + * for k in range(n_rows): + */ + __pyx_t_12 = __pyx_v_k; + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X_rare.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X_rare.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_18); + __Pyx_INCREF(__pyx_v_val); __Pyx_XDECREF(*__pyx_t_18); + *__pyx_t_18 = __pyx_v_val; + __Pyx_XGIVEREF(*__pyx_t_18); + } + + /* "binning.pyx":31 + * for j in range(n_cols): + * l_max = n_categories_to_keep[j] + * if l_max == 0: # <<<<<<<<<<<<<< + * for k in range(n_rows): + * X_rare[k, j] = val + */ + goto __pyx_L5; + } + + /* "binning.pyx":35 + * X_rare[k, j] = val + * else: + * for k in range(n_rows): # <<<<<<<<<<<<<< + * X_rare[k, j] = X[k, j] + * is_rare = 1 + */ + /*else*/ { + __pyx_t_14 = __pyx_v_n_rows; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":36 + * else: + * for k in range(n_rows): + * X_rare[k, j] = X[k, j] # <<<<<<<<<<<<<< + * is_rare = 1 + * for l in range(l_max): + */ + __pyx_t_17 = __pyx_v_k; + __pyx_t_12 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_12 = __pyx_v_k; + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X_rare.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X_rare.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_18); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_18); + *__pyx_t_18 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_18); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":37 + * for k in range(n_rows): + * X_rare[k, j] = X[k, j] + * is_rare = 1 # <<<<<<<<<<<<<< + * for l in range(l_max): + * if X[k, j] == categories_to_keep_np[l, j]: + */ + __pyx_v_is_rare = 1; + + /* "binning.pyx":38 + * X_rare[k, j] = X[k, j] + * is_rare = 1 + * for l in range(l_max): # <<<<<<<<<<<<<< + * if X[k, j] == categories_to_keep_np[l, j]: + * is_rare = 0 + */ + __pyx_t_19 = __pyx_v_l_max; + __pyx_t_20 = __pyx_t_19; + for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) { + __pyx_v_l = __pyx_t_21; + + /* "binning.pyx":39 + * is_rare = 1 + * for l in range(l_max): + * if X[k, j] == categories_to_keep_np[l, j]: # <<<<<<<<<<<<<< + * is_rare = 0 + * break + */ + __pyx_t_17 = __pyx_v_k; + __pyx_t_12 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_12 = __pyx_v_l; + __pyx_t_17 = __pyx_v_j; + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_categories_to_keep_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_categories_to_keep_np.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_13) { + + /* "binning.pyx":40 + * for l in range(l_max): + * if X[k, j] == categories_to_keep_np[l, j]: + * is_rare = 0 # <<<<<<<<<<<<<< + * break + * if is_rare: + */ + __pyx_v_is_rare = 0; + + /* "binning.pyx":41 + * if X[k, j] == categories_to_keep_np[l, j]: + * is_rare = 0 + * break # <<<<<<<<<<<<<< + * if is_rare: + * X_rare[k, j] = val + */ + goto __pyx_L11_break; + + /* "binning.pyx":39 + * is_rare = 1 + * for l in range(l_max): + * if X[k, j] == categories_to_keep_np[l, j]: # <<<<<<<<<<<<<< + * is_rare = 0 + * break + */ + } + } + __pyx_L11_break:; + + /* "binning.pyx":42 + * is_rare = 0 + * break + * if is_rare: # <<<<<<<<<<<<<< + * X_rare[k, j] = val + * return X_rare + */ + __pyx_t_13 = (__pyx_v_is_rare != 0); + if (__pyx_t_13) { + + /* "binning.pyx":43 + * break + * if is_rare: + * X_rare[k, j] = val # <<<<<<<<<<<<<< + * return X_rare + * + */ + __pyx_t_17 = __pyx_v_k; + __pyx_t_12 = __pyx_v_j; + __pyx_t_18 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_rare.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X_rare.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X_rare.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_18); + __Pyx_INCREF(__pyx_v_val); __Pyx_XDECREF(*__pyx_t_18); + *__pyx_t_18 = __pyx_v_val; + __Pyx_XGIVEREF(*__pyx_t_18); + + /* "binning.pyx":42 + * is_rare = 0 + * break + * if is_rare: # <<<<<<<<<<<<<< + * X_rare[k, j] = val + * return X_rare + */ + } + } + } + __pyx_L5:; + } + + /* "binning.pyx":44 + * if is_rare: + * X_rare[k, j] = val + * return X_rare # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_rare); + __pyx_r = ((PyObject *)__pyx_v_X_rare); + goto __pyx_L0; + + /* "binning.pyx":15 + * + * + * @cython.boundscheck(False) # <<<<<<<<<<<<<< + * @cython.wraparound(False) + * def bin_rare_events( + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_rare.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_categories_to_keep.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.bin_rare_events", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_rare.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_to_keep_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_categories_to_keep.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XDECREF((PyObject *)__pyx_v_X_rare); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7binning_3bin_Numeric = {"bin_Numeric", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_3bin_Numeric, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 49, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 49, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7binning_2bin_Numeric(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_2bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("bin_Numeric", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 49, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_4); + __Pyx_GIVEREF(__pyx_int_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_4)) __PYX_ERR(0, 49, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 49, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 49, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 49, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 49, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 49, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 49, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 49, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 49, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_11__pyx_fuse_0bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_bin_Numeric(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __pyx_t_5numpy_int16_t __pyx_v_val; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0bin_Numeric", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":58 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":59 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bin_limits)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":62 + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 62, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":63 + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":64 + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * val = X[i, j_col] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":65 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * val = X[i, j_col] + * for k in range(1, n_bins): + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":66 + * for j in range(n_cols): + * j_col = idx_columns[j] + * val = X[i, j_col] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j_col; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "binning.pyx":67 + * j_col = idx_columns[j] + * val = X[i, j_col] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + */ + __pyx_t_16 = __pyx_v_n_bins; + __pyx_t_17 = __pyx_t_16; + for (__pyx_t_18 = 1; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_k = __pyx_t_18; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + __pyx_t_15 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_19 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_bin_limits.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bin_limits.diminfo[1].strides))); + if (__pyx_t_19) { + + /* "binning.pyx":69 + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_14 = (__pyx_v_k - 1); + __pyx_t_15 = __pyx_v_j; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_bin.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_bins.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_bins.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_bins.diminfo[1].strides)); + + /* "binning.pyx":70 + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":71 + * X_bin[i, j] = bins[k-1, j] + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 71, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_11__pyx_fuse_0bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_7binning_11__pyx_fuse_0bin_Numeric = {"__pyx_fuse_0bin_Numeric", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_11__pyx_fuse_0bin_Numeric, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_11__pyx_fuse_0bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bin_limits = 0; + PyArrayObject *__pyx_v_bins = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0bin_Numeric (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bin_limits,&__pyx_n_s_bins,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bin_limits)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0bin_Numeric", 1, 4, 4, 1); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0bin_Numeric", 1, 4, 4, 2); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0bin_Numeric", 1, 4, 4, 3); __PYX_ERR(0, 49, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0bin_Numeric") < 0)) __PYX_ERR(0, 49, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bin_limits = ((PyArrayObject *)values[1]); + __pyx_v_bins = ((PyArrayObject *)values[2]); + __pyx_v_idx_columns = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0bin_Numeric", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 49, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_0bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 50, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bin_limits), __pyx_ptype_5numpy_ndarray, 1, "bin_limits", 0))) __PYX_ERR(0, 51, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins), __pyx_ptype_5numpy_ndarray, 1, "bins", 0))) __PYX_ERR(0, 52, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 53, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_10__pyx_fuse_0bin_Numeric(__pyx_self, __pyx_v_X, __pyx_v_bin_limits, __pyx_v_bins, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_10__pyx_fuse_0bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0bin_Numeric", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_7binning_bin_Numeric(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bin_limits), ((PyArrayObject *)__pyx_v_bins), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_0bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_13__pyx_fuse_1bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_bin_Numeric(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __pyx_t_5numpy_int32_t __pyx_v_val; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1bin_Numeric", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":58 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":59 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bin_limits)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":62 + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 62, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":63 + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":64 + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * val = X[i, j_col] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":65 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * val = X[i, j_col] + * for k in range(1, n_bins): + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":66 + * for j in range(n_cols): + * j_col = idx_columns[j] + * val = X[i, j_col] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j_col; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "binning.pyx":67 + * j_col = idx_columns[j] + * val = X[i, j_col] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + */ + __pyx_t_16 = __pyx_v_n_bins; + __pyx_t_17 = __pyx_t_16; + for (__pyx_t_18 = 1; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_k = __pyx_t_18; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + __pyx_t_15 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_19 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_bin_limits.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bin_limits.diminfo[1].strides))); + if (__pyx_t_19) { + + /* "binning.pyx":69 + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_14 = (__pyx_v_k - 1); + __pyx_t_15 = __pyx_v_j; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_bin.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_bins.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_bins.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_bins.diminfo[1].strides)); + + /* "binning.pyx":70 + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":71 + * X_bin[i, j] = bins[k-1, j] + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 71, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_13__pyx_fuse_1bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_7binning_13__pyx_fuse_1bin_Numeric = {"__pyx_fuse_1bin_Numeric", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_13__pyx_fuse_1bin_Numeric, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_13__pyx_fuse_1bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bin_limits = 0; + PyArrayObject *__pyx_v_bins = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1bin_Numeric (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bin_limits,&__pyx_n_s_bins,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bin_limits)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1bin_Numeric", 1, 4, 4, 1); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1bin_Numeric", 1, 4, 4, 2); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1bin_Numeric", 1, 4, 4, 3); __PYX_ERR(0, 49, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1bin_Numeric") < 0)) __PYX_ERR(0, 49, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bin_limits = ((PyArrayObject *)values[1]); + __pyx_v_bins = ((PyArrayObject *)values[2]); + __pyx_v_idx_columns = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1bin_Numeric", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 49, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_1bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 50, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bin_limits), __pyx_ptype_5numpy_ndarray, 1, "bin_limits", 0))) __PYX_ERR(0, 51, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins), __pyx_ptype_5numpy_ndarray, 1, "bins", 0))) __PYX_ERR(0, 52, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 53, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_12__pyx_fuse_1bin_Numeric(__pyx_self, __pyx_v_X, __pyx_v_bin_limits, __pyx_v_bins, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_12__pyx_fuse_1bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1bin_Numeric", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_7binning_bin_Numeric(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bin_limits), ((PyArrayObject *)__pyx_v_bins), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_1bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_15__pyx_fuse_2bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_bin_Numeric(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __pyx_t_5numpy_int64_t __pyx_v_val; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2bin_Numeric", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":58 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":59 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bin_limits)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":62 + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 62, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":63 + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":64 + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * val = X[i, j_col] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":65 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * val = X[i, j_col] + * for k in range(1, n_bins): + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":66 + * for j in range(n_cols): + * j_col = idx_columns[j] + * val = X[i, j_col] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j_col; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "binning.pyx":67 + * j_col = idx_columns[j] + * val = X[i, j_col] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + */ + __pyx_t_16 = __pyx_v_n_bins; + __pyx_t_17 = __pyx_t_16; + for (__pyx_t_18 = 1; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_k = __pyx_t_18; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + __pyx_t_15 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_19 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_bin_limits.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bin_limits.diminfo[1].strides))); + if (__pyx_t_19) { + + /* "binning.pyx":69 + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_14 = (__pyx_v_k - 1); + __pyx_t_15 = __pyx_v_j; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_bin.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bins.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_bins.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_bins.diminfo[1].strides)); + + /* "binning.pyx":70 + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":71 + * X_bin[i, j] = bins[k-1, j] + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 71, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_15__pyx_fuse_2bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_7binning_15__pyx_fuse_2bin_Numeric = {"__pyx_fuse_2bin_Numeric", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_15__pyx_fuse_2bin_Numeric, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_15__pyx_fuse_2bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bin_limits = 0; + PyArrayObject *__pyx_v_bins = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2bin_Numeric (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bin_limits,&__pyx_n_s_bins,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bin_limits)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2bin_Numeric", 1, 4, 4, 1); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2bin_Numeric", 1, 4, 4, 2); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2bin_Numeric", 1, 4, 4, 3); __PYX_ERR(0, 49, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2bin_Numeric") < 0)) __PYX_ERR(0, 49, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bin_limits = ((PyArrayObject *)values[1]); + __pyx_v_bins = ((PyArrayObject *)values[2]); + __pyx_v_idx_columns = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2bin_Numeric", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 49, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_2bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 50, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bin_limits), __pyx_ptype_5numpy_ndarray, 1, "bin_limits", 0))) __PYX_ERR(0, 51, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins), __pyx_ptype_5numpy_ndarray, 1, "bins", 0))) __PYX_ERR(0, 52, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 53, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_14__pyx_fuse_2bin_Numeric(__pyx_self, __pyx_v_X, __pyx_v_bin_limits, __pyx_v_bins, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_14__pyx_fuse_2bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2bin_Numeric", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_7binning_bin_Numeric(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bin_limits), ((PyArrayObject *)__pyx_v_bins), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_2bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_17__pyx_fuse_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_bin_Numeric(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __pyx_t_5numpy_float32_t __pyx_v_val; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3bin_Numeric", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":58 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":59 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bin_limits)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":62 + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 62, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":63 + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":64 + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * val = X[i, j_col] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":65 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * val = X[i, j_col] + * for k in range(1, n_bins): + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":66 + * for j in range(n_cols): + * j_col = idx_columns[j] + * val = X[i, j_col] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j_col; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "binning.pyx":67 + * j_col = idx_columns[j] + * val = X[i, j_col] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + */ + __pyx_t_16 = __pyx_v_n_bins; + __pyx_t_17 = __pyx_t_16; + for (__pyx_t_18 = 1; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_k = __pyx_t_18; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + __pyx_t_15 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_19 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_bin_limits.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bin_limits.diminfo[1].strides))); + if (__pyx_t_19) { + + /* "binning.pyx":69 + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_14 = (__pyx_v_k - 1); + __pyx_t_15 = __pyx_v_j; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_bin.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_bins.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_bins.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_bins.diminfo[1].strides)); + + /* "binning.pyx":70 + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":71 + * X_bin[i, j] = bins[k-1, j] + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 71, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_17__pyx_fuse_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_7binning_17__pyx_fuse_3bin_Numeric = {"__pyx_fuse_3bin_Numeric", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_17__pyx_fuse_3bin_Numeric, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_17__pyx_fuse_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bin_limits = 0; + PyArrayObject *__pyx_v_bins = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3bin_Numeric (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bin_limits,&__pyx_n_s_bins,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bin_limits)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3bin_Numeric", 1, 4, 4, 1); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3bin_Numeric", 1, 4, 4, 2); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3bin_Numeric", 1, 4, 4, 3); __PYX_ERR(0, 49, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3bin_Numeric") < 0)) __PYX_ERR(0, 49, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bin_limits = ((PyArrayObject *)values[1]); + __pyx_v_bins = ((PyArrayObject *)values[2]); + __pyx_v_idx_columns = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3bin_Numeric", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 49, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_3bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 50, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bin_limits), __pyx_ptype_5numpy_ndarray, 1, "bin_limits", 0))) __PYX_ERR(0, 51, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins), __pyx_ptype_5numpy_ndarray, 1, "bins", 0))) __PYX_ERR(0, 52, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 53, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_16__pyx_fuse_3bin_Numeric(__pyx_self, __pyx_v_X, __pyx_v_bin_limits, __pyx_v_bins, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_16__pyx_fuse_3bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3bin_Numeric", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_7binning_bin_Numeric(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bin_limits), ((PyArrayObject *)__pyx_v_bins), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_3bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_19__pyx_fuse_4bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_3bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_bin_Numeric(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __pyx_t_5numpy_float64_t __pyx_v_val; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4bin_Numeric", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":58 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":59 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bin_limits.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bin_limits)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":62 + * cdef int n_bins = bin_limits.shape[0] + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 62, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":63 + * cdef num_t val + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":64 + * cdef np.ndarray[num_t, ndim=2] X_bin = np.empty((n_rows, n_cols), X.dtype) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * val = X[i, j_col] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":65 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * val = X[i, j_col] + * for k in range(1, n_bins): + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":66 + * for j in range(n_cols): + * j_col = idx_columns[j] + * val = X[i, j_col] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j_col; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "binning.pyx":67 + * j_col = idx_columns[j] + * val = X[i, j_col] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + */ + __pyx_t_16 = __pyx_v_n_bins; + __pyx_t_17 = __pyx_t_16; + for (__pyx_t_18 = 1; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_k = __pyx_t_18; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + __pyx_t_15 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_19 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_bin_limits.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bin_limits.diminfo[1].strides))); + if (__pyx_t_19) { + + /* "binning.pyx":69 + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_14 = (__pyx_v_k - 1); + __pyx_t_15 = __pyx_v_j; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_bin.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_bins.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_bins.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_bins.diminfo[1].strides)); + + /* "binning.pyx":70 + * if val < bin_limits[k, j]: + * X_bin[i, j] = bins[k-1, j] + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":68 + * val = X[i, j_col] + * for k in range(1, n_bins): + * if val < bin_limits[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = bins[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":71 + * X_bin[i, j] = bins[k-1, j] + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 71, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_19__pyx_fuse_4bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_7binning_19__pyx_fuse_4bin_Numeric = {"__pyx_fuse_4bin_Numeric", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_19__pyx_fuse_4bin_Numeric, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_19__pyx_fuse_4bin_Numeric(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bin_limits = 0; + PyArrayObject *__pyx_v_bins = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4bin_Numeric (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bin_limits,&__pyx_n_s_bins,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bin_limits)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4bin_Numeric", 1, 4, 4, 1); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4bin_Numeric", 1, 4, 4, 2); __PYX_ERR(0, 49, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 49, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4bin_Numeric", 1, 4, 4, 3); __PYX_ERR(0, 49, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4bin_Numeric") < 0)) __PYX_ERR(0, 49, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bin_limits = ((PyArrayObject *)values[1]); + __pyx_v_bins = ((PyArrayObject *)values[2]); + __pyx_v_idx_columns = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4bin_Numeric", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 49, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_4bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 50, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bin_limits), __pyx_ptype_5numpy_ndarray, 1, "bin_limits", 0))) __PYX_ERR(0, 51, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins), __pyx_ptype_5numpy_ndarray, 1, "bins", 0))) __PYX_ERR(0, 52, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 53, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_18__pyx_fuse_4bin_Numeric(__pyx_self, __pyx_v_X, __pyx_v_bin_limits, __pyx_v_bins, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_18__pyx_fuse_4bin_Numeric(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bin_limits, PyArrayObject *__pyx_v_bins, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bin_limits; + __Pyx_Buffer __pyx_pybuffer_bin_limits; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins; + __Pyx_Buffer __pyx_pybuffer_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4bin_Numeric", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bin_limits.pybuffer.buf = NULL; + __pyx_pybuffer_bin_limits.refcount = 0; + __pyx_pybuffernd_bin_limits.data = NULL; + __pyx_pybuffernd_bin_limits.rcbuffer = &__pyx_pybuffer_bin_limits; + __pyx_pybuffer_bins.pybuffer.buf = NULL; + __pyx_pybuffer_bins.refcount = 0; + __pyx_pybuffernd_bins.data = NULL; + __pyx_pybuffernd_bins.rcbuffer = &__pyx_pybuffer_bins; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer, (PyObject*)__pyx_v_bin_limits, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bin_limits.diminfo[0].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bin_limits.diminfo[0].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bin_limits.diminfo[1].strides = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bin_limits.diminfo[1].shape = __pyx_pybuffernd_bin_limits.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_bins.diminfo[0].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins.diminfo[0].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins.diminfo[1].strides = __pyx_pybuffernd_bins.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins.diminfo[1].shape = __pyx_pybuffernd_bins.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 49, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_7binning_bin_Numeric(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bin_limits), ((PyArrayObject *)__pyx_v_bins), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_4bin_Numeric", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bin_limits.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7binning_5binning_inplace = {"binning_inplace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_5binning_inplace, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults1 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 76, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 76, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7binning_4binning_inplace(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_4binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binning_inplace", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 76, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_2 = (1 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_bins_np, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_bins_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 76, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 76, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 76, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 76, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 76, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 76, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 76, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 76, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 76, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_23__pyx_fuse_0binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_binning_inplace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + PyObject **__pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":84 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":85 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":86 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":87 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "binning.pyx":88 + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "binning.pyx":89 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":90 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + */ + __pyx_t_9 = __pyx_v_n_bins; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_k = __pyx_t_11; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_12 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_12 == NULL)) __pyx_t_12 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_12); + __pyx_t_13 = __pyx_v_k; + __pyx_t_8 = __pyx_v_j; + __pyx_t_14 = __Pyx_PyInt_From_npy_int16((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_bins_np.diminfo[1].strides))); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = PyObject_RichCompare(__pyx_t_12, __pyx_t_14, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (__pyx_t_16) { + + /* "binning.pyx":92 + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_15 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_14 = __Pyx_PyObject_Str(__pyx_t_15); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = PyNumber_Add(__pyx_n_u__15, __pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_17 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_17); + __Pyx_INCREF(__pyx_t_15); __Pyx_XDECREF(*__pyx_t_17); + *__pyx_t_17 = __pyx_t_15; + __Pyx_XGIVEREF(*__pyx_t_17); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + + /* "binning.pyx":93 + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":94 + * X[i, j_col] = '_' + str(k - 1) + * break + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_23__pyx_fuse_0binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_7binning_23__pyx_fuse_0binning_inplace = {"__pyx_fuse_0binning_inplace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_23__pyx_fuse_0binning_inplace, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_23__pyx_fuse_0binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0binning_inplace (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning_inplace", 1, 3, 3, 1); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning_inplace", 1, 3, 3, 2); __PYX_ERR(0, 76, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0binning_inplace") < 0)) __PYX_ERR(0, 76, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning_inplace", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 76, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_0binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 78, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_22__pyx_fuse_0binning_inplace(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_22__pyx_fuse_0binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_7binning_binning_inplace(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_0binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_25__pyx_fuse_1binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_binning_inplace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + PyObject **__pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":84 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":85 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":86 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":87 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "binning.pyx":88 + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "binning.pyx":89 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":90 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + */ + __pyx_t_9 = __pyx_v_n_bins; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_k = __pyx_t_11; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_12 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_12 == NULL)) __pyx_t_12 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_12); + __pyx_t_13 = __pyx_v_k; + __pyx_t_8 = __pyx_v_j; + __pyx_t_14 = __Pyx_PyInt_From_npy_int32((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_bins_np.diminfo[1].strides))); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = PyObject_RichCompare(__pyx_t_12, __pyx_t_14, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (__pyx_t_16) { + + /* "binning.pyx":92 + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_15 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_14 = __Pyx_PyObject_Str(__pyx_t_15); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = PyNumber_Add(__pyx_n_u__15, __pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_17 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_17); + __Pyx_INCREF(__pyx_t_15); __Pyx_XDECREF(*__pyx_t_17); + *__pyx_t_17 = __pyx_t_15; + __Pyx_XGIVEREF(*__pyx_t_17); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + + /* "binning.pyx":93 + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":94 + * X[i, j_col] = '_' + str(k - 1) + * break + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_25__pyx_fuse_1binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_7binning_25__pyx_fuse_1binning_inplace = {"__pyx_fuse_1binning_inplace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_25__pyx_fuse_1binning_inplace, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_25__pyx_fuse_1binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1binning_inplace (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning_inplace", 1, 3, 3, 1); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning_inplace", 1, 3, 3, 2); __PYX_ERR(0, 76, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1binning_inplace") < 0)) __PYX_ERR(0, 76, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning_inplace", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 76, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_1binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 78, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_24__pyx_fuse_1binning_inplace(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_24__pyx_fuse_1binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_7binning_binning_inplace(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_1binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_27__pyx_fuse_2binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_binning_inplace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + PyObject **__pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":84 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":85 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":86 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":87 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "binning.pyx":88 + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "binning.pyx":89 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":90 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + */ + __pyx_t_9 = __pyx_v_n_bins; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_k = __pyx_t_11; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_12 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_12 == NULL)) __pyx_t_12 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_12); + __pyx_t_13 = __pyx_v_k; + __pyx_t_8 = __pyx_v_j; + __pyx_t_14 = __Pyx_PyInt_From_npy_int64((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_bins_np.diminfo[1].strides))); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = PyObject_RichCompare(__pyx_t_12, __pyx_t_14, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (__pyx_t_16) { + + /* "binning.pyx":92 + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_15 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_14 = __Pyx_PyObject_Str(__pyx_t_15); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = PyNumber_Add(__pyx_n_u__15, __pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_17 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_17); + __Pyx_INCREF(__pyx_t_15); __Pyx_XDECREF(*__pyx_t_17); + *__pyx_t_17 = __pyx_t_15; + __Pyx_XGIVEREF(*__pyx_t_17); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + + /* "binning.pyx":93 + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":94 + * X[i, j_col] = '_' + str(k - 1) + * break + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_27__pyx_fuse_2binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_7binning_27__pyx_fuse_2binning_inplace = {"__pyx_fuse_2binning_inplace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_27__pyx_fuse_2binning_inplace, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_27__pyx_fuse_2binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2binning_inplace (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning_inplace", 1, 3, 3, 1); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning_inplace", 1, 3, 3, 2); __PYX_ERR(0, 76, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2binning_inplace") < 0)) __PYX_ERR(0, 76, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning_inplace", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 76, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_2binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 78, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_26__pyx_fuse_2binning_inplace(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_26__pyx_fuse_2binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_7binning_binning_inplace(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_2binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_29__pyx_fuse_3binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_binning_inplace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + PyObject **__pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":84 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":85 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":86 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":87 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "binning.pyx":88 + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "binning.pyx":89 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":90 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + */ + __pyx_t_9 = __pyx_v_n_bins; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_k = __pyx_t_11; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_12 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_12 == NULL)) __pyx_t_12 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_12); + __pyx_t_13 = __pyx_v_k; + __pyx_t_8 = __pyx_v_j; + __pyx_t_14 = PyFloat_FromDouble((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_bins_np.diminfo[1].strides))); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = PyObject_RichCompare(__pyx_t_12, __pyx_t_14, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (__pyx_t_16) { + + /* "binning.pyx":92 + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_15 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_14 = __Pyx_PyObject_Str(__pyx_t_15); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = PyNumber_Add(__pyx_n_u__15, __pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_17 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_17); + __Pyx_INCREF(__pyx_t_15); __Pyx_XDECREF(*__pyx_t_17); + *__pyx_t_17 = __pyx_t_15; + __Pyx_XGIVEREF(*__pyx_t_17); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + + /* "binning.pyx":93 + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":94 + * X[i, j_col] = '_' + str(k - 1) + * break + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_29__pyx_fuse_3binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_7binning_29__pyx_fuse_3binning_inplace = {"__pyx_fuse_3binning_inplace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_29__pyx_fuse_3binning_inplace, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_29__pyx_fuse_3binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3binning_inplace (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning_inplace", 1, 3, 3, 1); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning_inplace", 1, 3, 3, 2); __PYX_ERR(0, 76, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3binning_inplace") < 0)) __PYX_ERR(0, 76, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning_inplace", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 76, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_3binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 78, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_28__pyx_fuse_3binning_inplace(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_28__pyx_fuse_3binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_7binning_binning_inplace(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_3binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_31__pyx_fuse_4binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_5binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_binning_inplace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + PyObject **__pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":84 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":85 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":86 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":87 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "binning.pyx":88 + * cdef int n_bins = bins_np.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "binning.pyx":89 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":90 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + */ + __pyx_t_9 = __pyx_v_n_bins; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_k = __pyx_t_11; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_12 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_12 == NULL)) __pyx_t_12 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_12); + __pyx_t_13 = __pyx_v_k; + __pyx_t_8 = __pyx_v_j; + __pyx_t_14 = PyFloat_FromDouble((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_bins_np.diminfo[1].strides))); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = PyObject_RichCompare(__pyx_t_12, __pyx_t_14, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 91, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (__pyx_t_16) { + + /* "binning.pyx":92 + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_15 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_14 = __Pyx_PyObject_Str(__pyx_t_15); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = PyNumber_Add(__pyx_n_u__15, __pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_8 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j_col; + __pyx_t_17 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_17); + __Pyx_INCREF(__pyx_t_15); __Pyx_XDECREF(*__pyx_t_17); + *__pyx_t_17 = __pyx_t_15; + __Pyx_XGIVEREF(*__pyx_t_17); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + + /* "binning.pyx":93 + * if X[i, j_col] < bins_np[k, j]: + * X[i, j_col] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":91 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if X[i, j_col] < bins_np[k, j]: # <<<<<<<<<<<<<< + * X[i, j_col] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":94 + * X[i, j_col] = '_' + str(k - 1) + * break + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_31__pyx_fuse_4binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_7binning_31__pyx_fuse_4binning_inplace = {"__pyx_fuse_4binning_inplace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_31__pyx_fuse_4binning_inplace, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_31__pyx_fuse_4binning_inplace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4binning_inplace (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning_inplace", 1, 3, 3, 1); __PYX_ERR(0, 76, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning_inplace", 1, 3, 3, 2); __PYX_ERR(0, 76, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4binning_inplace") < 0)) __PYX_ERR(0, 76, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning_inplace", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 76, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_4binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 77, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 78, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_30__pyx_fuse_4binning_inplace(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_30__pyx_fuse_4binning_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4binning_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 76, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_7binning_binning_inplace(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_4binning_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7binning_7binning = {"binning", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_7binning, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults2 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults2, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 99, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 99, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7binning_6binning(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_6binning(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binning", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 99, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_2 = (1 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_bins_np, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_bins_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 99, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 99, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 99, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 99, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 99, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 99, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 99, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 99, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 99, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_35__pyx_fuse_0binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_binning(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + Py_ssize_t __pyx_t_18; + double __pyx_t_19; + int __pyx_t_20; + PyObject **__pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0binning", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":107 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":108 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":109 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":110 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 110, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":111 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":112 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":113 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":114 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + */ + __pyx_t_15 = __pyx_v_n_bins; + __pyx_t_16 = __pyx_t_15; + for (__pyx_t_17 = 1; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { + __pyx_v_k = __pyx_t_17; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j_col; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __Pyx_PyObject_AsDouble(__pyx_t_2); if (unlikely(__pyx_t_19 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_20 = (__pyx_t_19 < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_20) { + + /* "binning.pyx":116 + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_n_u__15, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_21 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_21); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_21); + *__pyx_t_21 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_21); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":117 + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":118 + * X_bin[i, j] = '_' + str(k - 1) + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 118, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_35__pyx_fuse_0binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_7binning_35__pyx_fuse_0binning = {"__pyx_fuse_0binning", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_35__pyx_fuse_0binning, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_35__pyx_fuse_0binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0binning (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning", 1, 3, 3, 1); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning", 1, 3, 3, 2); __PYX_ERR(0, 99, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0binning") < 0)) __PYX_ERR(0, 99, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 99, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_0binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_34__pyx_fuse_0binning(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_34__pyx_fuse_0binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0binning", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_7binning_binning(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_0binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_37__pyx_fuse_1binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_binning(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + Py_ssize_t __pyx_t_18; + double __pyx_t_19; + int __pyx_t_20; + PyObject **__pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1binning", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":107 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":108 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":109 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":110 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 110, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":111 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":112 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":113 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":114 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + */ + __pyx_t_15 = __pyx_v_n_bins; + __pyx_t_16 = __pyx_t_15; + for (__pyx_t_17 = 1; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { + __pyx_v_k = __pyx_t_17; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j_col; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __Pyx_PyObject_AsDouble(__pyx_t_2); if (unlikely(__pyx_t_19 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_20 = (__pyx_t_19 < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_20) { + + /* "binning.pyx":116 + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_n_u__15, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_21 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_21); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_21); + *__pyx_t_21 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_21); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":117 + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":118 + * X_bin[i, j] = '_' + str(k - 1) + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 118, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_37__pyx_fuse_1binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_7binning_37__pyx_fuse_1binning = {"__pyx_fuse_1binning", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_37__pyx_fuse_1binning, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_37__pyx_fuse_1binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1binning (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning", 1, 3, 3, 1); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning", 1, 3, 3, 2); __PYX_ERR(0, 99, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1binning") < 0)) __PYX_ERR(0, 99, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 99, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_1binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_36__pyx_fuse_1binning(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_36__pyx_fuse_1binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1binning", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_7binning_binning(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_1binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_39__pyx_fuse_2binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_binning(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + Py_ssize_t __pyx_t_18; + double __pyx_t_19; + int __pyx_t_20; + PyObject **__pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2binning", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":107 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":108 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":109 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":110 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 110, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":111 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":112 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":113 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":114 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + */ + __pyx_t_15 = __pyx_v_n_bins; + __pyx_t_16 = __pyx_t_15; + for (__pyx_t_17 = 1; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { + __pyx_v_k = __pyx_t_17; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j_col; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __Pyx_PyObject_AsDouble(__pyx_t_2); if (unlikely(__pyx_t_19 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_20 = (__pyx_t_19 < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_20) { + + /* "binning.pyx":116 + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_n_u__15, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_21 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_21); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_21); + *__pyx_t_21 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_21); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":117 + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":118 + * X_bin[i, j] = '_' + str(k - 1) + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 118, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_39__pyx_fuse_2binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_7binning_39__pyx_fuse_2binning = {"__pyx_fuse_2binning", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_39__pyx_fuse_2binning, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_39__pyx_fuse_2binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2binning (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning", 1, 3, 3, 1); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning", 1, 3, 3, 2); __PYX_ERR(0, 99, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2binning") < 0)) __PYX_ERR(0, 99, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 99, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_2binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_38__pyx_fuse_2binning(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_38__pyx_fuse_2binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2binning", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_7binning_binning(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_2binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_41__pyx_fuse_3binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_binning(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + Py_ssize_t __pyx_t_18; + double __pyx_t_19; + int __pyx_t_20; + PyObject **__pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3binning", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":107 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":108 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":109 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":110 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 110, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":111 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":112 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":113 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":114 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + */ + __pyx_t_15 = __pyx_v_n_bins; + __pyx_t_16 = __pyx_t_15; + for (__pyx_t_17 = 1; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { + __pyx_v_k = __pyx_t_17; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j_col; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __Pyx_PyObject_AsDouble(__pyx_t_2); if (unlikely(__pyx_t_19 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_20 = (__pyx_t_19 < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_20) { + + /* "binning.pyx":116 + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_n_u__15, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_21 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_21); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_21); + *__pyx_t_21 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_21); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":117 + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":118 + * X_bin[i, j] = '_' + str(k - 1) + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 118, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_41__pyx_fuse_3binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_7binning_41__pyx_fuse_3binning = {"__pyx_fuse_3binning", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_41__pyx_fuse_3binning, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_41__pyx_fuse_3binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3binning (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning", 1, 3, 3, 1); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning", 1, 3, 3, 2); __PYX_ERR(0, 99, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3binning") < 0)) __PYX_ERR(0, 99, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 99, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_3binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_40__pyx_fuse_3binning(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_40__pyx_fuse_3binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3binning", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_7binning_binning(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_3binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_43__pyx_fuse_4binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_7binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_binning(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_j_col; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + Py_ssize_t __pyx_t_18; + double __pyx_t_19; + int __pyx_t_20; + PyObject **__pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4binning", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "binning.pyx":107 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":108 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "binning.pyx":109 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":110 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 110, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 110, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":111 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * j_col = idx_columns[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":112 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * j_col = idx_columns[j] + * for k in range(1, n_bins): + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":113 + * for i in range(n_rows): + * for j in range(n_cols): + * j_col = idx_columns[j] # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + */ + __pyx_t_14 = __pyx_v_j; + __pyx_v_j_col = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + + /* "binning.pyx":114 + * for j in range(n_cols): + * j_col = idx_columns[j] + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + */ + __pyx_t_15 = __pyx_v_n_bins; + __pyx_t_16 = __pyx_t_15; + for (__pyx_t_17 = 1; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { + __pyx_v_k = __pyx_t_17; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j_col; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __Pyx_PyObject_AsDouble(__pyx_t_2); if (unlikely(__pyx_t_19 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __pyx_v_k; + __pyx_t_14 = __pyx_v_j; + __pyx_t_20 = (__pyx_t_19 < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_20) { + + /* "binning.pyx":116 + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_bin), axis=1) + */ + __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_k - 1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_n_u__15, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_21 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_21); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_21); + *__pyx_t_21 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_21); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":117 + * if float(X[i, j_col]) < bins_np[k, j]: + * X_bin[i, j] = '_' + str(k - 1) + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_bin), axis=1) + * + */ + goto __pyx_L8_break; + + /* "binning.pyx":115 + * j_col = idx_columns[j] + * for k in range(1, n_bins): + * if float(X[i, j_col]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = '_' + str(k - 1) + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":118 + * X_bin[i, j] = '_' + str(k - 1) + * break + * return np.concatenate((X, X_bin), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 118, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_bin); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_bin))) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 118, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_43__pyx_fuse_4binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_7binning_43__pyx_fuse_4binning = {"__pyx_fuse_4binning", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_43__pyx_fuse_4binning, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_43__pyx_fuse_4binning(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4binning (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning", 1, 3, 3, 1); __PYX_ERR(0, 99, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning", 1, 3, 3, 2); __PYX_ERR(0, 99, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4binning") < 0)) __PYX_ERR(0, 99, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 99, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_4binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_42__pyx_fuse_4binning(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_42__pyx_fuse_4binning(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4binning", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 99, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_7binning_binning(__pyx_v_X, ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_4binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7binning_9binning_new = {"binning_new", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_9binning_new, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults3 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults3, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7binning_8binning_new(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_8binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binning_new", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 123, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 123, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 123, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 123, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 123, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 123, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 123, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 123, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 123, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 123, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("binning.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_47__pyx_fuse_0binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7binning_binning_new(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + int __pyx_t_21; + PyObject **__pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0binning_new", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + + /* "binning.pyx":132 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":133 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "binning.pyx":134 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":135 + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 135, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 135, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":136 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(1, n_bins): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":137 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":138 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + */ + __pyx_t_14 = __pyx_v_n_bins; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 1; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_21 = (((double)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides))) < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_21) { + + /* "binning.pyx":140 + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] # <<<<<<<<<<<<<< + * break + * return X_bin + */ + __pyx_t_20 = (__pyx_v_k - 1); + __pyx_t_19 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_labels_np.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_labels_np.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = __pyx_v_j; + __pyx_t_22 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_22); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_22); + *__pyx_t_22 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_22); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":141 + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + * break # <<<<<<<<<<<<<< + * return X_bin + */ + goto __pyx_L8_break; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":142 + * X_bin[i, j] = labels_np[k-1, j] + * break + * return X_bin # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __pyx_r = ((PyArrayObject *)__pyx_v_X_bin); + goto __pyx_L0; + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_47__pyx_fuse_0binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_7binning_47__pyx_fuse_0binning_new = {"__pyx_fuse_0binning_new", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_47__pyx_fuse_0binning_new, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_47__pyx_fuse_0binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_labels_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0binning_new (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_labels_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning_new", 1, 3, 3, 1); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_labels_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning_new", 1, 3, 3, 2); __PYX_ERR(0, 123, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0binning_new") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_labels_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0binning_new", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_0binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 124, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 125, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_labels_np), __pyx_ptype_5numpy_ndarray, 1, "labels_np", 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_46__pyx_fuse_0binning_new(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_labels_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_46__pyx_fuse_0binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0binning_new", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_7binning_binning_new(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_labels_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_0binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_49__pyx_fuse_1binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7binning_binning_new(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + int __pyx_t_21; + PyObject **__pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1binning_new", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + + /* "binning.pyx":132 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":133 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "binning.pyx":134 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":135 + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 135, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 135, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":136 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(1, n_bins): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":137 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":138 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + */ + __pyx_t_14 = __pyx_v_n_bins; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 1; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_21 = (((double)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides))) < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_21) { + + /* "binning.pyx":140 + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] # <<<<<<<<<<<<<< + * break + * return X_bin + */ + __pyx_t_20 = (__pyx_v_k - 1); + __pyx_t_19 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_labels_np.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_labels_np.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = __pyx_v_j; + __pyx_t_22 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_22); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_22); + *__pyx_t_22 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_22); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":141 + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + * break # <<<<<<<<<<<<<< + * return X_bin + */ + goto __pyx_L8_break; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":142 + * X_bin[i, j] = labels_np[k-1, j] + * break + * return X_bin # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __pyx_r = ((PyArrayObject *)__pyx_v_X_bin); + goto __pyx_L0; + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_49__pyx_fuse_1binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_7binning_49__pyx_fuse_1binning_new = {"__pyx_fuse_1binning_new", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_49__pyx_fuse_1binning_new, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_49__pyx_fuse_1binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_labels_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1binning_new (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_labels_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning_new", 1, 3, 3, 1); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_labels_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning_new", 1, 3, 3, 2); __PYX_ERR(0, 123, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1binning_new") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_labels_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1binning_new", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_1binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 124, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 125, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_labels_np), __pyx_ptype_5numpy_ndarray, 1, "labels_np", 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_48__pyx_fuse_1binning_new(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_labels_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_48__pyx_fuse_1binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1binning_new", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_7binning_binning_new(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_labels_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_1binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_51__pyx_fuse_2binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_7binning_binning_new(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + int __pyx_t_21; + PyObject **__pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2binning_new", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + + /* "binning.pyx":132 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":133 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "binning.pyx":134 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":135 + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 135, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 135, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":136 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(1, n_bins): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":137 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":138 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + */ + __pyx_t_14 = __pyx_v_n_bins; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 1; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_21 = (((double)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides))) < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_21) { + + /* "binning.pyx":140 + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] # <<<<<<<<<<<<<< + * break + * return X_bin + */ + __pyx_t_20 = (__pyx_v_k - 1); + __pyx_t_19 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_labels_np.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_labels_np.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = __pyx_v_j; + __pyx_t_22 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_22); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_22); + *__pyx_t_22 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_22); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":141 + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + * break # <<<<<<<<<<<<<< + * return X_bin + */ + goto __pyx_L8_break; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":142 + * X_bin[i, j] = labels_np[k-1, j] + * break + * return X_bin # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __pyx_r = ((PyArrayObject *)__pyx_v_X_bin); + goto __pyx_L0; + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_51__pyx_fuse_2binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_7binning_51__pyx_fuse_2binning_new = {"__pyx_fuse_2binning_new", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_51__pyx_fuse_2binning_new, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_51__pyx_fuse_2binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_labels_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2binning_new (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_labels_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning_new", 1, 3, 3, 1); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_labels_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning_new", 1, 3, 3, 2); __PYX_ERR(0, 123, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2binning_new") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_labels_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2binning_new", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_2binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 124, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 125, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_labels_np), __pyx_ptype_5numpy_ndarray, 1, "labels_np", 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_50__pyx_fuse_2binning_new(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_labels_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_50__pyx_fuse_2binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2binning_new", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_7binning_binning_new(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_labels_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_2binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_53__pyx_fuse_3binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_7binning_binning_new(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + int __pyx_t_21; + PyObject **__pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3binning_new", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + + /* "binning.pyx":132 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":133 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "binning.pyx":134 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":135 + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 135, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 135, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":136 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(1, n_bins): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":137 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":138 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + */ + __pyx_t_14 = __pyx_v_n_bins; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 1; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_21 = (((double)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides))) < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_21) { + + /* "binning.pyx":140 + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] # <<<<<<<<<<<<<< + * break + * return X_bin + */ + __pyx_t_20 = (__pyx_v_k - 1); + __pyx_t_19 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_labels_np.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_labels_np.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = __pyx_v_j; + __pyx_t_22 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_22); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_22); + *__pyx_t_22 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_22); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":141 + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + * break # <<<<<<<<<<<<<< + * return X_bin + */ + goto __pyx_L8_break; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":142 + * X_bin[i, j] = labels_np[k-1, j] + * break + * return X_bin # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __pyx_r = ((PyArrayObject *)__pyx_v_X_bin); + goto __pyx_L0; + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_53__pyx_fuse_3binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_7binning_53__pyx_fuse_3binning_new = {"__pyx_fuse_3binning_new", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_53__pyx_fuse_3binning_new, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_53__pyx_fuse_3binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_labels_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3binning_new (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_labels_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning_new", 1, 3, 3, 1); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_labels_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning_new", 1, 3, 3, 2); __PYX_ERR(0, 123, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3binning_new") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_labels_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3binning_new", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_3binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 124, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 125, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_labels_np), __pyx_ptype_5numpy_ndarray, 1, "labels_np", 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_52__pyx_fuse_3binning_new(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_labels_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_52__pyx_fuse_3binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3binning_new", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_7binning_binning_new(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_labels_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_3binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7binning_55__pyx_fuse_4binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7binning_9binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_7binning_binning_new(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_bins; + PyArrayObject *__pyx_v_X_bin = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_bin; + __Pyx_Buffer __pyx_pybuffer_X_bin; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + int __pyx_t_21; + PyObject **__pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4binning_new", 1); + __pyx_pybuffer_X_bin.pybuffer.buf = NULL; + __pyx_pybuffer_X_bin.refcount = 0; + __pyx_pybuffernd_X_bin.data = NULL; + __pyx_pybuffernd_X_bin.rcbuffer = &__pyx_pybuffer_X_bin; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + + /* "binning.pyx":132 + * cdef int k + * cdef int j_col + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "binning.pyx":133 + * cdef int j_col + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "binning.pyx":134 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_bins_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_v_n_bins = (__pyx_t_1[0]); + + /* "binning.pyx":135 + * cdef int n_cols = X.shape[1] + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 135, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 135, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_bin = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 135, __pyx_L1_error) + } else {__pyx_pybuffernd_X_bin.diminfo[0].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_bin.diminfo[0].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_bin.diminfo[1].strides = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_bin.diminfo[1].shape = __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_bin = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "binning.pyx":136 + * cdef int n_bins = bins_np.shape[0] + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(1, n_bins): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "binning.pyx":137 + * cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "binning.pyx":138 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(1, n_bins): # <<<<<<<<<<<<<< + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + */ + __pyx_t_14 = __pyx_v_n_bins; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 1; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_21 = (((double)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides))) < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_bins_np.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_bins_np.diminfo[1].strides))); + if (__pyx_t_21) { + + /* "binning.pyx":140 + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] # <<<<<<<<<<<<<< + * break + * return X_bin + */ + __pyx_t_20 = (__pyx_v_k - 1); + __pyx_t_19 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_labels_np.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_labels_np.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = __pyx_v_j; + __pyx_t_22 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_bin.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X_bin.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X_bin.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_22); + __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF(*__pyx_t_22); + *__pyx_t_22 = __pyx_t_2; + __Pyx_XGIVEREF(*__pyx_t_22); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "binning.pyx":141 + * if float(X[i, j]) < bins_np[k, j]: + * X_bin[i, j] = labels_np[k-1, j] + * break # <<<<<<<<<<<<<< + * return X_bin + */ + goto __pyx_L8_break; + + /* "binning.pyx":139 + * for j in range(n_cols): + * for k in range(1, n_bins): + * if float(X[i, j]) < bins_np[k, j]: # <<<<<<<<<<<<<< + * X_bin[i, j] = labels_np[k-1, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "binning.pyx":142 + * X_bin[i, j] = labels_np[k-1, j] + * break + * return X_bin # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_bin); + __pyx_r = ((PyArrayObject *)__pyx_v_X_bin); + goto __pyx_L0; + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_bin.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_bin); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7binning_55__pyx_fuse_4binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_7binning_55__pyx_fuse_4binning_new = {"__pyx_fuse_4binning_new", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7binning_55__pyx_fuse_4binning_new, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7binning_55__pyx_fuse_4binning_new(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bins_np = 0; + PyArrayObject *__pyx_v_labels_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4binning_new (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bins_np,&__pyx_n_s_labels_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bins_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning_new", 1, 3, 3, 1); __PYX_ERR(0, 123, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_labels_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning_new", 1, 3, 3, 2); __PYX_ERR(0, 123, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4binning_new") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bins_np = ((PyArrayObject *)values[1]); + __pyx_v_labels_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4binning_new", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("binning.__pyx_fuse_4binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 124, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bins_np), __pyx_ptype_5numpy_ndarray, 1, "bins_np", 0))) __PYX_ERR(0, 125, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_labels_np), __pyx_ptype_5numpy_ndarray, 1, "labels_np", 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_r = __pyx_pf_7binning_54__pyx_fuse_4binning_new(__pyx_self, __pyx_v_X, __pyx_v_bins_np, __pyx_v_labels_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7binning_54__pyx_fuse_4binning_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bins_np, PyArrayObject *__pyx_v_labels_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bins_np; + __Pyx_Buffer __pyx_pybuffer_bins_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_labels_np; + __Pyx_Buffer __pyx_pybuffer_labels_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4binning_new", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bins_np.pybuffer.buf = NULL; + __pyx_pybuffer_bins_np.refcount = 0; + __pyx_pybuffernd_bins_np.data = NULL; + __pyx_pybuffernd_bins_np.rcbuffer = &__pyx_pybuffer_bins_np; + __pyx_pybuffer_labels_np.pybuffer.buf = NULL; + __pyx_pybuffer_labels_np.refcount = 0; + __pyx_pybuffernd_labels_np.data = NULL; + __pyx_pybuffernd_labels_np.rcbuffer = &__pyx_pybuffer_labels_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_bins_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_bins_np.diminfo[0].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bins_np.diminfo[0].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bins_np.diminfo[1].strides = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bins_np.diminfo[1].shape = __pyx_pybuffernd_bins_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_labels_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 123, __pyx_L1_error) + } + __pyx_pybuffernd_labels_np.diminfo[0].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_labels_np.diminfo[0].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_labels_np.diminfo[1].strides = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_labels_np.diminfo[1].shape = __pyx_pybuffernd_labels_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_7binning_binning_new(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_bins_np), __pyx_v_labels_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("binning.__pyx_fuse_4binning_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bins_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_labels_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_array) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_array___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_array_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_array}, + {Py_sq_length, (void *)__pyx_array___len__}, + {Py_sq_item, (void *)__pyx_sq_item_array}, + {Py_mp_length, (void *)__pyx_array___len__}, + {Py_mp_subscript, (void *)__pyx_array___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_array}, + {Py_tp_getattro, (void *)__pyx_tp_getattro_array}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_array_getbuffer}, + #endif + {Py_tp_methods, (void *)__pyx_methods_array}, + {Py_tp_getset, (void *)__pyx_getsets_array}, + {Py_tp_new, (void *)__pyx_tp_new_array}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_array_spec = { + "binning.array", + sizeof(struct __pyx_array_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_array_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "binning.""array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_Enum) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_specialmethod___pyx_MemviewEnum___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_MemviewEnum___repr__(self); +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_MemviewEnum___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_MemviewEnum_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_Enum}, + {Py_tp_repr, (void *)__pyx_MemviewEnum___repr__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_Enum}, + {Py_tp_clear, (void *)__pyx_tp_clear_Enum}, + {Py_tp_methods, (void *)__pyx_methods_Enum}, + {Py_tp_init, (void *)__pyx_MemviewEnum___init__}, + {Py_tp_new, (void *)__pyx_tp_new_Enum}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_MemviewEnum_spec = { + "binning.Enum", + sizeof(struct __pyx_MemviewEnum_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_MemviewEnum_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "binning.""Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_memoryview) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryview___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyObject *__pyx_specialmethod___pyx_memoryview___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_memoryview___repr__(self); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_memoryview___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"is_c_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_c_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"is_f_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_f_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy_fortran", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy_fortran, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_memoryview_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_memoryview}, + {Py_tp_repr, (void *)__pyx_memoryview___repr__}, + {Py_sq_length, (void *)__pyx_memoryview___len__}, + {Py_sq_item, (void *)__pyx_sq_item_memoryview}, + {Py_mp_length, (void *)__pyx_memoryview___len__}, + {Py_mp_subscript, (void *)__pyx_memoryview___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_memoryview}, + {Py_tp_str, (void *)__pyx_memoryview___str__}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_memoryview_getbuffer}, + #endif + {Py_tp_traverse, (void *)__pyx_tp_traverse_memoryview}, + {Py_tp_clear, (void *)__pyx_tp_clear_memoryview}, + {Py_tp_methods, (void *)__pyx_methods_memoryview}, + {Py_tp_getset, (void *)__pyx_getsets_memoryview}, + {Py_tp_new, (void *)__pyx_tp_new_memoryview}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryview_spec = { + "binning.memoryview", + sizeof(struct __pyx_memoryview_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_memoryview_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "binning.""memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc__memoryviewslice) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryviewslice___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XCLEAR_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_memoryviewslice_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc__memoryviewslice}, + {Py_tp_doc, (void *)PyDoc_STR("Internal class for passing memoryview slices to Python")}, + {Py_tp_traverse, (void *)__pyx_tp_traverse__memoryviewslice}, + {Py_tp_clear, (void *)__pyx_tp_clear__memoryviewslice}, + {Py_tp_methods, (void *)__pyx_methods__memoryviewslice}, + {Py_tp_new, (void *)__pyx_tp_new__memoryviewslice}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryviewslice_spec = { + "binning._memoryviewslice", + sizeof(struct __pyx_memoryviewslice_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_memoryviewslice_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "binning.""_memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + PyDoc_STR("Internal class for passing memoryview slices to Python"), /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_k_All_dimensions_preceding_dimensi, sizeof(__pyx_k_All_dimensions_preceding_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_u_Cannot_index_with_type, __pyx_k_Cannot_index_with_type, sizeof(__pyx_k_Cannot_index_with_type), 0, 1, 0, 0}, + {&__pyx_kp_s_Cannot_transpose_memoryview_with, __pyx_k_Cannot_transpose_memoryview_with, sizeof(__pyx_k_Cannot_transpose_memoryview_with), 0, 0, 1, 0}, + {&__pyx_kp_s_Dimension_d_is_not_direct, __pyx_k_Dimension_d_is_not_direct, sizeof(__pyx_k_Dimension_d_is_not_direct), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_k_Expected_at_least_d_argument_s_g, sizeof(__pyx_k_Expected_at_least_d_argument_s_g), 0, 0, 1, 0}, + {&__pyx_kp_s_Function_call_with_ambiguous_arg, __pyx_k_Function_call_with_ambiguous_arg, sizeof(__pyx_k_Function_call_with_ambiguous_arg), 0, 0, 1, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_k_Index_out_of_bounds_axis_d, sizeof(__pyx_k_Index_out_of_bounds_axis_d), 0, 0, 1, 0}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 1, 0, 0}, + {&__pyx_kp_u_Invalid_shape_in_axis, __pyx_k_Invalid_shape_in_axis, sizeof(__pyx_k_Invalid_shape_in_axis), 0, 1, 0, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_kp_s_No_matching_signature_found, __pyx_k_No_matching_signature_found, sizeof(__pyx_k_No_matching_signature_found), 0, 0, 1, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_n_u_OTHERS, __pyx_k_OTHERS, sizeof(__pyx_k_OTHERS), 0, 1, 0, 1}, + {&__pyx_kp_u_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 1, 0, 0}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_Sequence, __pyx_k_Sequence, sizeof(__pyx_k_Sequence), 0, 0, 1, 1}, + {&__pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_k_Step_may_not_be_zero_axis_d, sizeof(__pyx_k_Step_may_not_be_zero_axis_d), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_n_s_X_rare, __pyx_k_X_rare, sizeof(__pyx_k_X_rare), 0, 0, 1, 1}, + {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0}, + {&__pyx_kp_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 0}, + {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, + {&__pyx_n_u__15, __pyx_k__15, sizeof(__pyx_k__15), 0, 1, 0, 1}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, + {&__pyx_n_s__56, __pyx_k__56, sizeof(__pyx_k__56), 0, 0, 1, 1}, + {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_n_s_abc, __pyx_k_abc, sizeof(__pyx_k_abc), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_kp_u_and, __pyx_k_and, sizeof(__pyx_k_and), 0, 1, 0, 0}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_axis, __pyx_k_axis, sizeof(__pyx_k_axis), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_bin_Numeric, __pyx_k_bin_Numeric, sizeof(__pyx_k_bin_Numeric), 0, 0, 1, 1}, + {&__pyx_n_s_bin_limits, __pyx_k_bin_limits, sizeof(__pyx_k_bin_limits), 0, 0, 1, 1}, + {&__pyx_n_s_bin_rare_events, __pyx_k_bin_rare_events, sizeof(__pyx_k_bin_rare_events), 0, 0, 1, 1}, + {&__pyx_n_s_binning, __pyx_k_binning, sizeof(__pyx_k_binning), 0, 0, 1, 1}, + {&__pyx_n_s_binning_inplace, __pyx_k_binning_inplace, sizeof(__pyx_k_binning_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_binning_new, __pyx_k_binning_new, sizeof(__pyx_k_binning_new), 0, 0, 1, 1}, + {&__pyx_n_s_bins, __pyx_k_bins, sizeof(__pyx_k_bins), 0, 0, 1, 1}, + {&__pyx_n_s_bins_np, __pyx_k_bins_np, sizeof(__pyx_k_bins_np), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_categories_to_keep_np, __pyx_k_categories_to_keep_np, sizeof(__pyx_k_categories_to_keep_np), 0, 0, 1, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_collections, __pyx_k_collections, sizeof(__pyx_k_collections), 0, 0, 1, 1}, + {&__pyx_kp_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 0}, + {&__pyx_n_s_concatenate, __pyx_k_concatenate, sizeof(__pyx_k_concatenate), 0, 0, 1, 1}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, + {&__pyx_n_s_defaults, __pyx_k_defaults, sizeof(__pyx_k_defaults), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32_t, __pyx_k_float32_t, sizeof(__pyx_k_float32_t), 0, 0, 1, 1}, + {&__pyx_n_s_float64_t, __pyx_k_float64_t, sizeof(__pyx_k_float64_t), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_fused_sigindex, __pyx_k_fused_sigindex, sizeof(__pyx_k_fused_sigindex), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_binning_binning_pyx, __pyx_k_gators_binning_binning_pyx, sizeof(__pyx_k_gators_binning_binning_pyx), 0, 0, 1, 0}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_u_got, __pyx_k_got, sizeof(__pyx_k_got), 0, 1, 0, 0}, + {&__pyx_kp_u_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 1, 0, 0}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_int16_t, __pyx_k_int16_t, sizeof(__pyx_k_int16_t), 0, 0, 1, 1}, + {&__pyx_n_s_int32_t, __pyx_k_int32_t, sizeof(__pyx_k_int32_t), 0, 0, 1, 1}, + {&__pyx_n_s_int64_t, __pyx_k_int64_t, sizeof(__pyx_k_int64_t), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_is_rare, __pyx_k_is_rare, sizeof(__pyx_k_is_rare), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, + {&__pyx_n_s_j_col, __pyx_k_j_col, sizeof(__pyx_k_j_col), 0, 0, 1, 1}, + {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1}, + {&__pyx_n_s_kind, __pyx_k_kind, sizeof(__pyx_k_kind), 0, 0, 1, 1}, + {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1}, + {&__pyx_n_s_l, __pyx_k_l, sizeof(__pyx_k_l), 0, 0, 1, 1}, + {&__pyx_n_s_l_max, __pyx_k_l_max, sizeof(__pyx_k_l_max), 0, 0, 1, 1}, + {&__pyx_n_s_labels_np, __pyx_k_labels_np, sizeof(__pyx_k_labels_np), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_n_categories_to_keep, __pyx_k_n_categories_to_keep, sizeof(__pyx_k_n_categories_to_keep), 0, 0, 1, 1}, + {&__pyx_n_s_n_cols, __pyx_k_n_cols, sizeof(__pyx_k_n_cols), 0, 0, 1, 1}, + {&__pyx_n_s_n_rows, __pyx_k_n_rows, sizeof(__pyx_k_n_rows), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_object, __pyx_k_object, sizeof(__pyx_k_object), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0bin_Numeric, __pyx_k_pyx_fuse_0bin_Numeric, sizeof(__pyx_k_pyx_fuse_0bin_Numeric), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0binning, __pyx_k_pyx_fuse_0binning, sizeof(__pyx_k_pyx_fuse_0binning), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0binning_inplace, __pyx_k_pyx_fuse_0binning_inplace, sizeof(__pyx_k_pyx_fuse_0binning_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0binning_new, __pyx_k_pyx_fuse_0binning_new, sizeof(__pyx_k_pyx_fuse_0binning_new), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1bin_Numeric, __pyx_k_pyx_fuse_1bin_Numeric, sizeof(__pyx_k_pyx_fuse_1bin_Numeric), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1binning, __pyx_k_pyx_fuse_1binning, sizeof(__pyx_k_pyx_fuse_1binning), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1binning_inplace, __pyx_k_pyx_fuse_1binning_inplace, sizeof(__pyx_k_pyx_fuse_1binning_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1binning_new, __pyx_k_pyx_fuse_1binning_new, sizeof(__pyx_k_pyx_fuse_1binning_new), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2bin_Numeric, __pyx_k_pyx_fuse_2bin_Numeric, sizeof(__pyx_k_pyx_fuse_2bin_Numeric), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2binning, __pyx_k_pyx_fuse_2binning, sizeof(__pyx_k_pyx_fuse_2binning), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2binning_inplace, __pyx_k_pyx_fuse_2binning_inplace, sizeof(__pyx_k_pyx_fuse_2binning_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2binning_new, __pyx_k_pyx_fuse_2binning_new, sizeof(__pyx_k_pyx_fuse_2binning_new), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3bin_Numeric, __pyx_k_pyx_fuse_3bin_Numeric, sizeof(__pyx_k_pyx_fuse_3bin_Numeric), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3binning, __pyx_k_pyx_fuse_3binning, sizeof(__pyx_k_pyx_fuse_3binning), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3binning_inplace, __pyx_k_pyx_fuse_3binning_inplace, sizeof(__pyx_k_pyx_fuse_3binning_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3binning_new, __pyx_k_pyx_fuse_3binning_new, sizeof(__pyx_k_pyx_fuse_3binning_new), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4bin_Numeric, __pyx_k_pyx_fuse_4bin_Numeric, sizeof(__pyx_k_pyx_fuse_4bin_Numeric), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4binning, __pyx_k_pyx_fuse_4binning, sizeof(__pyx_k_pyx_fuse_4binning), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4binning_inplace, __pyx_k_pyx_fuse_4binning_inplace, sizeof(__pyx_k_pyx_fuse_4binning_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4binning_new, __pyx_k_pyx_fuse_4binning_new, sizeof(__pyx_k_pyx_fuse_4binning_new), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1}, + {&__pyx_n_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_signatures, __pyx_k_signatures, sizeof(__pyx_k_signatures), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_builtin_object = __Pyx_GetBuiltinName(__pyx_n_s_object); if (!__pyx_builtin_object) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_builtin___import__ = __Pyx_GetBuiltinName(__pyx_n_s_import); if (!__pyx_builtin___import__) __PYX_ERR(1, 100, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 156, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 159, __pyx_L1_error) + __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(1, 373, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 408, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 618, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 914, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__4 = PyTuple_New(1); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_tuple__4, 0, __pyx_int_neg_1)) __PYX_ERR(1, 582, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_slice__5 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_tuple__8 = PyTuple_Pack(3, __pyx_int_136983863, __pyx_int_112105877, __pyx_int_184977713); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_No_matching_signature_found); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_Function_call_with_ambiguous_arg); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_n_s_sys); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_tuple__17 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_3); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_collections_abc); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_n_s_collections); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__25 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "binning.pyx":15 + * + * + * @cython.boundscheck(False) # <<<<<<<<<<<<<< + * @cython.wraparound(False) + * def bin_rare_events( + */ + __pyx_tuple__27 = PyTuple_Pack(13, __pyx_n_s_X, __pyx_n_s_categories_to_keep_np, __pyx_n_s_n_categories_to_keep, __pyx_n_s_l, __pyx_n_s_j_col, __pyx_n_s_l_max, __pyx_n_s_n_rows, __pyx_n_s_n_cols, __pyx_n_s_val, __pyx_n_s_is_rare, __pyx_n_s_X_rare, __pyx_n_s_j, __pyx_n_s_k); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); + __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_bin_rare_events, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 15, __pyx_L1_error) + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + __pyx_tuple__29 = PyTuple_Pack(4, __pyx_n_s_X, __pyx_n_s_bin_limits, __pyx_n_s_bins, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0bin_Numeric, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0bin_Numeric, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_1bin_Numeric, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_2bin_Numeric, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_3bin_Numeric, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_4bin_Numeric, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 49, __pyx_L1_error) + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + __pyx_tuple__36 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_bins_np, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); + __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0binning_inplace, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0binning_inplace, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_1binning_inplace, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_2binning_inplace, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_3binning_inplace, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_4binning_inplace, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 76, __pyx_L1_error) + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0binning, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0binning, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_1binning, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_2binning, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_3binning, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_4binning, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(0, 99, __pyx_L1_error) + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + __pyx_tuple__49 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_bins_np, __pyx_n_s_labels_np); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__49); + __Pyx_GIVEREF(__pyx_tuple__49); + __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0binning_new, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_0binning_new, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_1binning_new, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_codeobj__53 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_2binning_new, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__53)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_3binning_new, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_binning_binning_pyx, __pyx_n_s_pyx_fuse_4binning_new, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get; + __pyx_umethod_PyDict_Type_values.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_values.method_name = &__pyx_n_s_values; + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_112105877 = PyInt_FromLong(112105877L); if (unlikely(!__pyx_int_112105877)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_136983863 = PyInt_FromLong(136983863L); if (unlikely(!__pyx_int_136983863)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* AssertionsEnabled.init */ + if (likely(__Pyx_init_assertions_enabled() == 0)); else + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_collections_abc_Sequence = Py_None; Py_INCREF(Py_None); + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + #if CYTHON_USE_TYPE_SPECS + __pyx_array_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_array_spec, NULL); if (unlikely(!__pyx_array_type)) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_array_type->tp_as_buffer = &__pyx_tp_as_buffer_array; + if (!__pyx_array_type->tp_as_buffer->bf_releasebuffer && __pyx_array_type->tp_base->tp_as_buffer && __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_array_type->tp_as_buffer->bf_releasebuffer = __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_array_spec, __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #else + __pyx_array_type = &__pyx_type___pyx_array; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_array_type->tp_print = 0; + #endif + if (__Pyx_SetVtable(__pyx_array_type, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_MemviewEnum_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_MemviewEnum_spec, NULL); if (unlikely(!__pyx_MemviewEnum_type)) __PYX_ERR(1, 302, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_MemviewEnum_spec, __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #else + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_MemviewEnum_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_MemviewEnum_type->tp_dictoffset && __pyx_MemviewEnum_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_MemviewEnum_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + __pyx_vtable_memoryview._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryview__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_memoryview_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryview_spec, NULL); if (unlikely(!__pyx_memoryview_type)) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryview_type->tp_as_buffer = &__pyx_tp_as_buffer_memoryview; + if (!__pyx_memoryview_type->tp_as_buffer->bf_releasebuffer && __pyx_memoryview_type->tp_base->tp_as_buffer && __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_memoryview_type->tp_as_buffer->bf_releasebuffer = __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryview_spec, __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #else + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryview_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryview_type->tp_dictoffset && __pyx_memoryview_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryview_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryview_type, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_vtable__memoryviewslice.__pyx_base._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryviewslice__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_memoryview_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 952, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_memoryviewslice_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryviewslice_spec, __pyx_t_1); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_memoryviewslice_type)) __PYX_ERR(1, 952, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryviewslice_spec, __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #else + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryviewslice_type->tp_base = __pyx_memoryview_type; + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryviewslice_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryviewslice_type->tp_dictoffset && __pyx_memoryviewslice_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryviewslice_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryviewslice_type, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_binning(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_binning}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "binning", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initbinning(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initbinning(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_binning(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_binning(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_binning(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + static PyThread_type_lock __pyx_t_8[8]; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'binning' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("binning", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "binning" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_binning(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_binning) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "binning")) { + if (unlikely((PyDict_SetItemString(modules, "binning", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_version_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_tuple__17, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_abc); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L7_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":104 + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + * except: # <<<<<<<<<<<<<< + * + * __pyx_collections_abc_Sequence = None + */ + /*except:*/ { + __Pyx_AddTraceback("View.MemoryView", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(1, 104, __pyx_L4_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + + /* "View.MemoryView":106 + * except: + * + * __pyx_collections_abc_Sequence = None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF(Py_None); + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + __pyx_L4_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L7_try_end:; + } + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":242 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":243 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L16_try_end; + __pyx_L11_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":244 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L12_exception_handled; + } + __pyx_L12_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L16_try_end:; + } + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":323 + * + * + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":324 + * + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_8[0] = PyThread_allocate_lock(); + __pyx_t_8[1] = PyThread_allocate_lock(); + __pyx_t_8[2] = PyThread_allocate_lock(); + __pyx_t_8[3] = PyThread_allocate_lock(); + __pyx_t_8[4] = PyThread_allocate_lock(); + __pyx_t_8[5] = PyThread_allocate_lock(); + __pyx_t_8[6] = PyThread_allocate_lock(); + __pyx_t_8[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_8, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":983 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":984 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L22_try_end; + __pyx_L17_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":985 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L18_exception_handled; + } + __pyx_L18_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L22_try_end:; + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_collections_abc_Sequence); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 989, __pyx_L23_error) + if (__pyx_t_6) { + + /* "View.MemoryView":993 + * + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence.register(array) + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, ((PyObject *)__pyx_memoryviewslice_type)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":994 + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) # <<<<<<<<<<<<<< + * except: + * pass # ignore failure, it's a minor issue + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_array_type)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L28_try_end; + __pyx_L23_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":995 + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) + * except: # <<<<<<<<<<<<<< + * pass # ignore failure, it's a minor issue + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L24_exception_handled; + } + __pyx_L24_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L28_try_end:; + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_7 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_7) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "binning.pyx":5 + * cimport numpy as np + * + * import numpy as np # <<<<<<<<<<<<<< + * + * ctypedef fused num_t: + */ + __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 5, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "binning.pyx":15 + * + * + * @cython.boundscheck(False) # <<<<<<<<<<<<<< + * @cython.wraparound(False) + * def bin_rare_events( + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7binning_1bin_rare_events, 0, __pyx_n_s_bin_rare_events, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_rare_events, __pyx_t_7) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "binning.pyx":49 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bin_limits, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_11__pyx_fuse_0bin_Numeric, 0, __pyx_n_s_pyx_fuse_0bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_Numeric, __pyx_t_7) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_13__pyx_fuse_1bin_Numeric, 0, __pyx_n_s_pyx_fuse_1bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_Numeric, __pyx_t_7) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_15__pyx_fuse_2bin_Numeric, 0, __pyx_n_s_pyx_fuse_2bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_Numeric, __pyx_t_7) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_17__pyx_fuse_3bin_Numeric, 0, __pyx_n_s_pyx_fuse_3bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_Numeric, __pyx_t_7) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_19__pyx_fuse_4bin_Numeric, 0, __pyx_n_s_pyx_fuse_4bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_Numeric, __pyx_t_7) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_11__pyx_fuse_0bin_Numeric, 0, __pyx_n_s_pyx_fuse_0bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int16_t, __pyx_t_4) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_13__pyx_fuse_1bin_Numeric, 0, __pyx_n_s_pyx_fuse_1bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int32_t, __pyx_t_4) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_15__pyx_fuse_2bin_Numeric, 0, __pyx_n_s_pyx_fuse_2bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int64_t, __pyx_t_4) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_17__pyx_fuse_3bin_Numeric, 0, __pyx_n_s_pyx_fuse_3bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_19__pyx_fuse_4bin_Numeric, 0, __pyx_n_s_pyx_fuse_4bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_7binning_3bin_Numeric, 0, __pyx_n_s_bin_Numeric, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults), 1)) __PYX_ERR(0, 49, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bin_Numeric, __pyx_t_4) < 0) __PYX_ERR(0, 49, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "binning.pyx":76 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_23__pyx_fuse_0binning_inplace, 0, __pyx_n_s_pyx_fuse_0binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_inplace, __pyx_t_4) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_25__pyx_fuse_1binning_inplace, 0, __pyx_n_s_pyx_fuse_1binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_inplace, __pyx_t_4) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_27__pyx_fuse_2binning_inplace, 0, __pyx_n_s_pyx_fuse_2binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_inplace, __pyx_t_4) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_29__pyx_fuse_3binning_inplace, 0, __pyx_n_s_pyx_fuse_3binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_inplace, __pyx_t_4) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_31__pyx_fuse_4binning_inplace, 0, __pyx_n_s_pyx_fuse_4binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_inplace, __pyx_t_4) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_23__pyx_fuse_0binning_inplace, 0, __pyx_n_s_pyx_fuse_0binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int16_t, __pyx_t_7) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_25__pyx_fuse_1binning_inplace, 0, __pyx_n_s_pyx_fuse_1binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int32_t, __pyx_t_7) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_27__pyx_fuse_2binning_inplace, 0, __pyx_n_s_pyx_fuse_2binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int64_t, __pyx_t_7) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_29__pyx_fuse_3binning_inplace, 0, __pyx_n_s_pyx_fuse_3binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_31__pyx_fuse_4binning_inplace, 0, __pyx_n_s_pyx_fuse_4binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_7binning_5binning_inplace, 0, __pyx_n_s_binning_inplace, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults1), 1)) __PYX_ERR(0, 76, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_inplace, __pyx_t_7) < 0) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "binning.pyx":99 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_35__pyx_fuse_0binning, 0, __pyx_n_s_pyx_fuse_0binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning, __pyx_t_7) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_37__pyx_fuse_1binning, 0, __pyx_n_s_pyx_fuse_1binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__45)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning, __pyx_t_7) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_39__pyx_fuse_2binning, 0, __pyx_n_s_pyx_fuse_2binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning, __pyx_t_7) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_41__pyx_fuse_3binning, 0, __pyx_n_s_pyx_fuse_3binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__47)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning, __pyx_t_7) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_43__pyx_fuse_4binning, 0, __pyx_n_s_pyx_fuse_4binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning, __pyx_t_7) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_35__pyx_fuse_0binning, 0, __pyx_n_s_pyx_fuse_0binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int16_t, __pyx_t_4) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_37__pyx_fuse_1binning, 0, __pyx_n_s_pyx_fuse_1binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int32_t, __pyx_t_4) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_39__pyx_fuse_2binning, 0, __pyx_n_s_pyx_fuse_2binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int64_t, __pyx_t_4) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_41__pyx_fuse_3binning, 0, __pyx_n_s_pyx_fuse_3binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_43__pyx_fuse_4binning, 0, __pyx_n_s_pyx_fuse_4binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_7binning_7binning, 0, __pyx_n_s_binning, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults2), 1)) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults2, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning, __pyx_t_4) < 0) __PYX_ERR(0, 99, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "binning.pyx":123 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] binning_new( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] bins_np, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_47__pyx_fuse_0binning_new, 0, __pyx_n_s_pyx_fuse_0binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__51)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_new, __pyx_t_4) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_49__pyx_fuse_1binning_new, 0, __pyx_n_s_pyx_fuse_1binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_new, __pyx_t_4) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_51__pyx_fuse_2binning_new, 0, __pyx_n_s_pyx_fuse_2binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__53)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_new, __pyx_t_4) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_53__pyx_fuse_3binning_new, 0, __pyx_n_s_pyx_fuse_3binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_new, __pyx_t_4) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_55__pyx_fuse_4binning_new, 0, __pyx_n_s_pyx_fuse_4binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__55)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_new, __pyx_t_4) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_7binning_47__pyx_fuse_0binning_new, 0, __pyx_n_s_pyx_fuse_0binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int16_t, __pyx_t_7) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_7binning_49__pyx_fuse_1binning_new, 0, __pyx_n_s_pyx_fuse_1binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int32_t, __pyx_t_7) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_7binning_51__pyx_fuse_2binning_new, 0, __pyx_n_s_pyx_fuse_2binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int64_t, __pyx_t_7) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_7binning_53__pyx_fuse_3binning_new, 0, __pyx_n_s_pyx_fuse_3binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_7binning_55__pyx_fuse_4binning_new, 0, __pyx_n_s_pyx_fuse_4binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_7binning_9binning_new, 0, __pyx_n_s_binning_new, NULL, __pyx_n_s_binning, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults3), 1)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults3, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binning_new, __pyx_t_7) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "binning.pyx":1 + * # License: Apache-2.0 # <<<<<<<<<<<<<< + * cimport cython + * cimport numpy as np + */ + __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init binning", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init binning"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* CIntToDigits */ +static const char DIGIT_PAIRS_10[2*10*10+1] = { + "00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" +}; +static const char DIGIT_PAIRS_8[2*8*8+1] = { + "0001020304050607" + "1011121314151617" + "2021222324252627" + "3031323334353637" + "4041424344454647" + "5051525354555657" + "6061626364656667" + "7071727374757677" +}; +static const char DIGITS_HEX[2*16+1] = { + "0123456789abcdef" + "0123456789ABCDEF" +}; + +/* BuildPyUnicode */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char) { + PyObject *uval; + Py_ssize_t uoffset = ulength - clength; +#if CYTHON_USE_UNICODE_INTERNALS + Py_ssize_t i; +#if CYTHON_PEP393_ENABLED + void *udata; + uval = PyUnicode_New(ulength, 127); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_DATA(uval); +#else + Py_UNICODE *udata; + uval = PyUnicode_FromUnicode(NULL, ulength); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_AS_UNICODE(uval); +#endif + if (uoffset > 0) { + i = 0; + if (prepend_sign) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-'); + i++; + } + for (; i < uoffset; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char); + } + } + for (i=0; i < clength; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]); + } +#else + { + PyObject *sign = NULL, *padding = NULL; + uval = NULL; + if (uoffset > 0) { + prepend_sign = !!prepend_sign; + if (uoffset > prepend_sign) { + padding = PyUnicode_FromOrdinal(padding_char); + if (likely(padding) && uoffset > prepend_sign + 1) { + PyObject *tmp; + PyObject *repeat = PyInt_FromSsize_t(uoffset - prepend_sign); + if (unlikely(!repeat)) goto done_or_error; + tmp = PyNumber_Multiply(padding, repeat); + Py_DECREF(repeat); + Py_DECREF(padding); + padding = tmp; + } + if (unlikely(!padding)) goto done_or_error; + } + if (prepend_sign) { + sign = PyUnicode_FromOrdinal('-'); + if (unlikely(!sign)) goto done_or_error; + } + } + uval = PyUnicode_DecodeASCII(chars, clength, NULL); + if (likely(uval) && padding) { + PyObject *tmp = PyNumber_Add(padding, uval); + Py_DECREF(uval); + uval = tmp; + } + if (likely(uval) && sign) { + PyObject *tmp = PyNumber_Add(sign, uval); + Py_DECREF(uval); + uval = tmp; + } +done_or_error: + Py_XDECREF(padding); + Py_XDECREF(sign); + } +#endif + return uval; +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(int)*3+2]; + char *dpos, *end = digits + sizeof(int)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + int remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (int) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (int) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (int) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(Py_ssize_t)*3+2]; + char *dpos, *end = digits + sizeof(Py_ssize_t)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + Py_ssize_t remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const Py_ssize_t neg_one = (Py_ssize_t) -1, const_zero = (Py_ssize_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (Py_ssize_t) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (Py_ssize_t) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (Py_ssize_t) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* JoinPyUnicode */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char) { +#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *result_uval; + int result_ukind, kind_shift; + Py_ssize_t i, char_pos; + void *result_udata; + CYTHON_MAYBE_UNUSED_VAR(max_char); +#if CYTHON_PEP393_ENABLED + result_uval = PyUnicode_New(result_ulength, max_char); + if (unlikely(!result_uval)) return NULL; + result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND; + kind_shift = (result_ukind == PyUnicode_4BYTE_KIND) ? 2 : result_ukind - 1; + result_udata = PyUnicode_DATA(result_uval); +#else + result_uval = PyUnicode_FromUnicode(NULL, result_ulength); + if (unlikely(!result_uval)) return NULL; + result_ukind = sizeof(Py_UNICODE); + kind_shift = (result_ukind == 4) ? 2 : result_ukind - 1; + result_udata = PyUnicode_AS_UNICODE(result_uval); +#endif + assert(kind_shift == 2 || kind_shift == 1 || kind_shift == 0); + char_pos = 0; + for (i=0; i < value_count; i++) { + int ukind; + Py_ssize_t ulength; + void *udata; + PyObject *uval = PyTuple_GET_ITEM(value_tuple, i); + if (unlikely(__Pyx_PyUnicode_READY(uval))) + goto bad; + ulength = __Pyx_PyUnicode_GET_LENGTH(uval); + if (unlikely(!ulength)) + continue; + if (unlikely((PY_SSIZE_T_MAX >> kind_shift) - ulength < char_pos)) + goto overflow; + ukind = __Pyx_PyUnicode_KIND(uval); + udata = __Pyx_PyUnicode_DATA(uval); + if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) { + memcpy((char *)result_udata + (char_pos << kind_shift), udata, (size_t) (ulength << kind_shift)); + } else { + #if PY_VERSION_HEX >= 0x030d0000 + if (unlikely(PyUnicode_CopyCharacters(result_uval, char_pos, uval, 0, ulength) < 0)) goto bad; + #elif CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters) + _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength); + #else + Py_ssize_t j; + for (j=0; j < ulength; j++) { + Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j); + __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar); + } + #endif + } + char_pos += ulength; + } + return result_uval; +overflow: + PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string"); +bad: + Py_DECREF(result_uval); + return NULL; +#else + CYTHON_UNUSED_VAR(max_char); + CYTHON_UNUSED_VAR(result_ulength); + CYTHON_UNUSED_VAR(value_count); + return PyUnicode_Join(__pyx_empty_unicode, value_tuple); +#endif +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kw, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { + Py_ssize_t kwsize; +#if CYTHON_ASSUME_SAFE_MACROS + kwsize = PyTuple_GET_SIZE(kw); +#else + kwsize = PyTuple_Size(kw); + if (kwsize < 0) return 0; +#endif + if (unlikely(kwsize == 0)) + return 1; + if (!kw_allowed) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, 0); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + goto invalid_keyword; + } +#if PY_VERSION_HEX < 0x03090000 + for (pos = 0; pos < kwsize; pos++) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, pos); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } +#endif + return 1; + } + while (PyDict_Next(kw, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if (!kw_allowed && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* DivInt[Py_ssize_t] */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__3; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; itp_as_sequence && type->tp_as_sequence->sq_repeat)) { + return type->tp_as_sequence->sq_repeat(seq, mul); + } else +#endif + { + return __Pyx_PySequence_Multiply_Generic(seq, mul); + } +} + +/* SetItemInt */ +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { + int r; + if (unlikely(!j)) return -1; + r = PyObject_SetItem(o, j, v); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, + CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_ass_subscript) { + int r; + PyObject *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return -1; + r = mm->mp_ass_subscript(o, key, v); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_ass_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return -1; + PyErr_Clear(); + } + } + return sm->sq_ass_item(o, i, v); + } + } +#else + if (is_list || !PyMapping_Check(o)) + { + return PySequence_SetItem(o, i, v); + } +#endif + return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); +} + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* DivInt[long] */ +static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__2); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* DictGetItem */ + #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* UnicodeAsUCS4 */ + static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ + static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + __Pyx_TypeName c_type_name = __Pyx_PyType_GetName(Py_TYPE(c)); + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but " __Pyx_FMT_TYPENAME " found", + c_type_name); + __Pyx_DECREF_TypeName(c_type_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* memoryview_get_from_buffer */ + #if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj) { + Py_ssize_t result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_itemsize); + if (!attr) { + goto bad; + } + result = PyLong_AsSsize_t(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* memoryview_get_from_buffer */ + #if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj) { + int result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_ndim); + if (!attr) { + goto bad; + } + result = PyLong_AsLong(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* IterFinish */ + static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* PyObjectCallNoArg */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ + static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ + static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* UnpackItemEndCheck */ + static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* UnpackTupleError */ + static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ + static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ + #if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* UnpackUnboundCMethod */ + static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { + PyObject *result; + PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); + if (unlikely(!selfless_args)) return NULL; + result = PyObject_Call(method, selfless_args, kwargs); + Py_DECREF(selfless_args); + return result; +} +static PyMethodDef __Pyx_UnboundCMethod_Def = { + "CythonUnboundCMethod", + __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), + METH_VARARGS | METH_KEYWORDS, + NULL +}; +static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { + PyObject *method; + method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); + if (unlikely(!method)) + return -1; + target->method = method; +#if CYTHON_COMPILING_IN_CPYTHON + #if PY_MAJOR_VERSION >= 3 + if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) + #else + if (likely(!__Pyx_CyOrPyCFunction_Check(method))) + #endif + { + PyMethodDescrObject *descr = (PyMethodDescrObject*) method; + target->func = descr->d_method->ml_meth; + target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); + } else +#endif +#if CYTHON_COMPILING_IN_PYPY +#else + if (PyCFunction_Check(method)) +#endif + { + PyObject *self; + int self_found; +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + self = PyObject_GetAttrString(method, "__self__"); + if (!self) { + PyErr_Clear(); + } +#else + self = PyCFunction_GET_SELF(method); +#endif + self_found = (self && self != Py_None); +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + Py_XDECREF(self); +#endif + if (self_found) { + PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); + if (unlikely(!unbound_method)) return -1; + Py_DECREF(method); + target->method = unbound_method; + } + } + return 0; +} + +/* CallUnboundCMethod0 */ + static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) { + PyObject *args, *result = NULL; + if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_ASSUME_SAFE_MACROS + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); +#else + args = PyTuple_Pack(1, self); + if (unlikely(!args)) goto bad; +#endif + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + Py_DECREF(args); +bad: + return result; +} + +/* py_dict_values */ + static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) { + if (PY_MAJOR_VERSION >= 3) + return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_values, d); + else + return PyDict_Values(d); +} + +/* CallUnboundCMethod1 */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) { + if (likely(cfunc->func)) { + int flag = cfunc->flag; + if (flag == METH_O) { + return (*(cfunc->func))(self, arg); + } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + #endif + } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) { + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + } + } + return __Pyx__CallUnboundCMethod1(cfunc, self, arg); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(2, self, arg); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* CallUnboundCMethod2 */ + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) { + if (likely(cfunc->func)) { + PyObject *args[2] = {arg1, arg2}; + if (cfunc->flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + #if PY_VERSION_HEX >= 0x030700A0 + if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS)) + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(3); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 1, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 2, arg2); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(3, self, arg1, arg2); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* dict_getitem_default */ + static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { + PyObject* value; +#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (unlikely(PyErr_Occurred())) + return NULL; + value = default_value; + } + Py_INCREF(value); + if ((1)); +#else + if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { + value = PyDict_GetItem(d, key); + if (unlikely(!value)) { + value = default_value; + } + Py_INCREF(value); + } +#endif + else { + if (default_value == Py_None) + value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key); + else + value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value); + } + return value; +} + +/* pybytes_as_double */ + static double __Pyx_SlowPyString_AsDouble(PyObject *obj) { + PyObject *float_value; +#if PY_MAJOR_VERSION >= 3 + float_value = PyFloat_FromString(obj); +#else + float_value = PyFloat_FromString(obj, 0); +#endif + if (likely(float_value)) { +#if CYTHON_ASSUME_SAFE_MACROS + double value = PyFloat_AS_DOUBLE(float_value); +#else + double value = PyFloat_AsDouble(float_value); +#endif + Py_DECREF(float_value); + return value; + } + return (double)-1; +} +static const char* __Pyx__PyBytes_AsDouble_Copy(const char* start, char* buffer, Py_ssize_t length) { + int last_was_punctuation = 1; + Py_ssize_t i; + for (i=0; i < length; i++) { + char chr = start[i]; + int is_punctuation = (chr == '_') | (chr == '.') | (chr == 'e') | (chr == 'E'); + *buffer = chr; + buffer += (chr != '_'); + if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; + last_was_punctuation = is_punctuation; + } + if (unlikely(last_was_punctuation)) goto parse_failure; + *buffer = '\0'; + return buffer; +parse_failure: + return NULL; +} +static double __Pyx__PyBytes_AsDouble_inf_nan(const char* start, Py_ssize_t length) { + int matches = 1; + char sign = start[0]; + int is_signed = (sign == '+') | (sign == '-'); + start += is_signed; + length -= is_signed; + switch (start[0]) { + #ifdef Py_NAN + case 'n': + case 'N': + if (unlikely(length != 3)) goto parse_failure; + matches &= (start[1] == 'a' || start[1] == 'A'); + matches &= (start[2] == 'n' || start[2] == 'N'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_NAN : Py_NAN; + #endif + case 'i': + case 'I': + if (unlikely(length < 3)) goto parse_failure; + matches &= (start[1] == 'n' || start[1] == 'N'); + matches &= (start[2] == 'f' || start[2] == 'F'); + if (likely(length == 3 && matches)) + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + if (unlikely(length != 8)) goto parse_failure; + matches &= (start[3] == 'i' || start[3] == 'I'); + matches &= (start[4] == 'n' || start[4] == 'N'); + matches &= (start[5] == 'i' || start[5] == 'I'); + matches &= (start[6] == 't' || start[6] == 'T'); + matches &= (start[7] == 'y' || start[7] == 'Y'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default: + goto parse_failure; + } + return 0.0; +parse_failure: + return -1.0; +} +static CYTHON_INLINE int __Pyx__PyBytes_AsDouble_IsSpace(char ch) { + return (ch == 0x20) | !((ch < 0x9) | (ch > 0xd)); +} +CYTHON_UNUSED static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length) { + double value; + Py_ssize_t i, digits; + const char *last = start + length; + char *end; + while (__Pyx__PyBytes_AsDouble_IsSpace(*start)) + start++; + while (start < last - 1 && __Pyx__PyBytes_AsDouble_IsSpace(last[-1])) + last--; + length = last - start; + if (unlikely(length <= 0)) goto fallback; + value = __Pyx__PyBytes_AsDouble_inf_nan(start, length); + if (unlikely(value == -1.0)) goto fallback; + if (value != 0.0) return value; + digits = 0; + for (i=0; i < length; digits += start[i++] != '_'); + if (likely(digits == length)) { + value = PyOS_string_to_double(start, &end, NULL); + } else if (digits < 40) { + char number[40]; + last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); + if (unlikely(!last)) goto fallback; + value = PyOS_string_to_double(number, &end, NULL); + } else { + char *number = (char*) PyMem_Malloc((digits + 1) * sizeof(char)); + if (unlikely(!number)) goto fallback; + last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); + if (unlikely(!last)) { + PyMem_Free(number); + goto fallback; + } + value = PyOS_string_to_double(number, &end, NULL); + PyMem_Free(number); + } + if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { + return value; + } +fallback: + return __Pyx_SlowPyString_AsDouble(obj); +} + +/* pyobject_as_double */ + static double __Pyx__PyObject_AsDouble(PyObject* obj) { + if (PyUnicode_CheckExact(obj)) { + return __Pyx_PyUnicode_AsDouble(obj); + } else if (PyBytes_CheckExact(obj)) { + return __Pyx_PyBytes_AsDouble(obj); + } else if (PyByteArray_CheckExact(obj)) { + return __Pyx_PyByteArray_AsDouble(obj); + } else { + PyObject* float_value; +#if !CYTHON_USE_TYPE_SLOTS + float_value = PyNumber_Float(obj); if ((0)) goto bad; + (void)__Pyx_PyObject_CallOneArg; +#else + PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; + if (likely(nb) && likely(nb->nb_float)) { + float_value = nb->nb_float(obj); + if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { + __Pyx_TypeName float_value_type_name = __Pyx_PyType_GetName(Py_TYPE(float_value)); + PyErr_Format(PyExc_TypeError, + "__float__ returned non-float (type " __Pyx_FMT_TYPENAME ")", + float_value_type_name); + __Pyx_DECREF_TypeName(float_value_type_name); + Py_DECREF(float_value); + goto bad; + } + } else { + float_value = __Pyx_PyObject_CallOneArg((PyObject*)&PyFloat_Type, obj); + } +#endif + if (likely(float_value)) { + double value = PyFloat_AS_DOUBLE(float_value); + Py_DECREF(float_value); + return value; + } + } +bad: + return (double)-1; +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ + #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ + static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* SetVTable */ + static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ + static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* FusedFunction */ + static PyObject * +__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code) +{ + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_FusedFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + __pyx_FusedFunctionObject *fusedfunc = (__pyx_FusedFunctionObject *) op; + fusedfunc->__signatures__ = NULL; + fusedfunc->self = NULL; + PyObject_GC_Track(op); + } + return op; +} +static void +__pyx_FusedFunction_dealloc(__pyx_FusedFunctionObject *self) +{ + PyObject_GC_UnTrack(self); + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + __Pyx__CyFunction_dealloc((__pyx_CyFunctionObject *) self); +} +static int +__pyx_FusedFunction_traverse(__pyx_FusedFunctionObject *self, + visitproc visit, + void *arg) +{ + Py_VISIT(self->self); + Py_VISIT(self->__signatures__); + return __Pyx_CyFunction_traverse((__pyx_CyFunctionObject *) self, visit, arg); +} +static int +__pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self) +{ + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + return __Pyx_CyFunction_clear((__pyx_CyFunctionObject *) self); +} +static PyObject * +__pyx_FusedFunction_descr_get(PyObject *self, PyObject *obj, PyObject *type) +{ + __pyx_FusedFunctionObject *func, *meth; + func = (__pyx_FusedFunctionObject *) self; + if (func->self || func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(self); + return self; + } + if (obj == Py_None) + obj = NULL; + if (func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD) + obj = type; + if (obj == NULL) { + Py_INCREF(self); + return self; + } + meth = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_New( + ((PyCFunctionObject *) func)->m_ml, + ((__pyx_CyFunctionObject *) func)->flags, + ((__pyx_CyFunctionObject *) func)->func_qualname, + ((__pyx_CyFunctionObject *) func)->func_closure, + ((PyCFunctionObject *) func)->m_module, + ((__pyx_CyFunctionObject *) func)->func_globals, + ((__pyx_CyFunctionObject *) func)->func_code); + if (unlikely(!meth)) + return NULL; + if (func->func.defaults) { + PyObject **pydefaults; + int i; + if (unlikely(!__Pyx_CyFunction_InitDefaults( + (PyObject*)meth, + func->func.defaults_size, + func->func.defaults_pyobjects))) { + Py_XDECREF((PyObject*)meth); + return NULL; + } + memcpy(meth->func.defaults, func->func.defaults, func->func.defaults_size); + pydefaults = __Pyx_CyFunction_Defaults(PyObject *, meth); + for (i = 0; i < meth->func.defaults_pyobjects; i++) + Py_XINCREF(pydefaults[i]); + } + __Pyx_CyFunction_SetClassObj(meth, __Pyx_CyFunction_GetClassObj(func)); + Py_XINCREF(func->__signatures__); + meth->__signatures__ = func->__signatures__; + Py_XINCREF(func->func.defaults_tuple); + meth->func.defaults_tuple = func->func.defaults_tuple; + Py_XINCREF(obj); + meth->self = obj; + return (PyObject *) meth; +} +static PyObject * +_obj_to_string(PyObject *obj) +{ + if (PyUnicode_CheckExact(obj)) + return __Pyx_NewRef(obj); +#if PY_MAJOR_VERSION == 2 + else if (PyString_Check(obj)) + return PyUnicode_FromEncodedObject(obj, NULL, "strict"); +#endif + else if (PyType_Check(obj)) + return PyObject_GetAttr(obj, __pyx_n_s_name_2); + else + return PyObject_Unicode(obj); +} +static PyObject * +__pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx) +{ + PyObject *signature = NULL; + PyObject *unbound_result_func; + PyObject *result_func = NULL; + if (unlikely(self->__signatures__ == NULL)) { + PyErr_SetString(PyExc_TypeError, "Function is not fused"); + return NULL; + } + if (PyTuple_Check(idx)) { + Py_ssize_t n = PyTuple_GET_SIZE(idx); + PyObject *list = PyList_New(n); + int i; + if (unlikely(!list)) + return NULL; + for (i = 0; i < n; i++) { + PyObject *string; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(idx, i); +#else + PyObject *item = PySequence_ITEM(idx, i); if (unlikely(!item)) goto __pyx_err; +#endif + string = _obj_to_string(item); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(item); +#endif + if (unlikely(!string)) goto __pyx_err; + PyList_SET_ITEM(list, i, string); + } + signature = PyUnicode_Join(__pyx_kp_u__12, list); +__pyx_err:; + Py_DECREF(list); + } else { + signature = _obj_to_string(idx); + } + if (unlikely(!signature)) + return NULL; + unbound_result_func = PyObject_GetItem(self->__signatures__, signature); + if (likely(unbound_result_func)) { + if (self->self) { + __pyx_FusedFunctionObject *unbound = (__pyx_FusedFunctionObject *) unbound_result_func; + __Pyx_CyFunction_SetClassObj(unbound, __Pyx_CyFunction_GetClassObj(self)); + result_func = __pyx_FusedFunction_descr_get(unbound_result_func, + self->self, self->self); + } else { + result_func = unbound_result_func; + Py_INCREF(result_func); + } + } + Py_DECREF(signature); + Py_XDECREF(unbound_result_func); + return result_func; +} +static PyObject * +__pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; + int static_specialized = (cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD && + !((__pyx_FusedFunctionObject *) func)->__signatures__); + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !static_specialized) { + return __Pyx_CyFunction_CallAsMethod(func, args, kw); + } else { + return __Pyx_CyFunction_Call(func, args, kw); + } +} +static PyObject * +__pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_FusedFunctionObject *binding_func = (__pyx_FusedFunctionObject *) func; + Py_ssize_t argc = PyTuple_GET_SIZE(args); + PyObject *new_args = NULL; + __pyx_FusedFunctionObject *new_func = NULL; + PyObject *result = NULL; + int is_staticmethod = binding_func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD; + if (binding_func->self) { + PyObject *self; + Py_ssize_t i; + new_args = PyTuple_New(argc + 1); + if (unlikely(!new_args)) + return NULL; + self = binding_func->self; + Py_INCREF(self); + PyTuple_SET_ITEM(new_args, 0, self); + self = NULL; + for (i = 0; i < argc; i++) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(args, i); + Py_INCREF(item); +#else + PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad; +#endif + PyTuple_SET_ITEM(new_args, i + 1, item); + } + args = new_args; + } + if (binding_func->__signatures__) { + PyObject *tup; + if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) { + tup = PyTuple_Pack(3, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod( + func, binding_func->__signatures__, tup, NULL); + } else { + tup = PyTuple_Pack(4, binding_func->__signatures__, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL); + } + Py_DECREF(tup); + if (unlikely(!new_func)) + goto bad; + __Pyx_CyFunction_SetClassObj(new_func, __Pyx_CyFunction_GetClassObj(binding_func)); + func = (PyObject *) new_func; + } + result = __pyx_FusedFunction_callfunction(func, args, kw); +bad: + Py_XDECREF(new_args); + Py_XDECREF((PyObject *) new_func); + return result; +} +static PyMemberDef __pyx_FusedFunction_members[] = { + {(char *) "__signatures__", + T_OBJECT, + offsetof(__pyx_FusedFunctionObject, __signatures__), + READONLY, + 0}, + {(char *) "__self__", T_OBJECT_EX, offsetof(__pyx_FusedFunctionObject, self), READONLY, 0}, + {0, 0, 0, 0, 0}, +}; +static PyGetSetDef __pyx_FusedFunction_getsets[] = { + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_FusedFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__pyx_FusedFunction_dealloc}, + {Py_tp_call, (void *)__pyx_FusedFunction_call}, + {Py_tp_traverse, (void *)__pyx_FusedFunction_traverse}, + {Py_tp_clear, (void *)__pyx_FusedFunction_clear}, + {Py_tp_members, (void *)__pyx_FusedFunction_members}, + {Py_tp_getset, (void *)__pyx_FusedFunction_getsets}, + {Py_tp_descr_get, (void *)__pyx_FusedFunction_descr_get}, + {Py_mp_subscript, (void *)__pyx_FusedFunction_getitem}, + {0, 0}, +}; +static PyType_Spec __pyx_FusedFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_FusedFunctionType_slots +}; +#else +static PyMappingMethods __pyx_FusedFunction_mapping_methods = { + 0, + (binaryfunc) __pyx_FusedFunction_getitem, + 0, +}; +static PyTypeObject __pyx_FusedFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + (destructor) __pyx_FusedFunction_dealloc, + 0, + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + 0, + 0, + 0, + &__pyx_FusedFunction_mapping_methods, + 0, + (ternaryfunc) __pyx_FusedFunction_call, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __pyx_FusedFunction_traverse, + (inquiry) __pyx_FusedFunction_clear, + 0, + 0, + 0, + 0, + 0, + __pyx_FusedFunction_members, + __pyx_FusedFunction_getsets, + &__pyx_CyFunctionType_type, + 0, + __pyx_FusedFunction_descr_get, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_FusedFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + PyObject *bases = PyTuple_Pack(1, __pyx_CyFunctionType); + if (unlikely(!bases)) { + return -1; + } + __pyx_FusedFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_FusedFunctionType_spec, bases); + Py_DECREF(bases); +#else + CYTHON_UNUSED_VAR(module); + __pyx_FusedFunctionType_type.tp_base = __pyx_CyFunctionType; + __pyx_FusedFunctionType = __Pyx_FetchCommonType(&__pyx_FusedFunctionType_type); +#endif + if (unlikely(__pyx_FusedFunctionType == NULL)) { + return -1; + } + return 0; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (unlikely(buf->strides[dim] != sizeof(void *))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (unlikely(buf->strides[dim] != buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (unlikely(stride < buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (unlikely(buf->suboffsets)) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, int ndim, int spec) +{ + CYTHON_UNUSED_VAR(ndim); + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (unlikely(buf->ndim != ndim)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; + } + if (unlikely((unsigned) buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->len > 0) { + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; + } + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) + goto fail; + } + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* PyUCS4InUnicode */ + #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if PY_VERSION_HEX < 0x03090000 +#define __Pyx_PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(op) +#define __Pyx_PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(op) +#else +#define __Pyx_PyUnicode_AS_UNICODE(op) (((PyASCIIObject *)(op))->wstr) +#define __Pyx_PyUnicode_GET_SIZE(op) ((PyCompactUnicodeObject *)(op))->wstr_length +#endif +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 +static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE high_val, low_val; + Py_UNICODE* pos; + high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1))); + low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1))); + for (pos=buffer; pos < buffer+length-1; pos++) { + if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1; + } + return 0; +} +#endif +static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE uchar; + Py_UNICODE* pos; + uchar = (Py_UNICODE) character; + for (pos=buffer; pos < buffer+length; pos++) { + if (unlikely(uchar == pos[0])) return 1; + } + return 0; +} +#endif +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { +#if CYTHON_PEP393_ENABLED + const int kind = PyUnicode_KIND(unicode); + #ifdef PyUnicode_WCHAR_KIND + if (likely(kind != PyUnicode_WCHAR_KIND)) + #endif + { + Py_ssize_t i; + const void* udata = PyUnicode_DATA(unicode); + const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); + for (i=0; i < length; i++) { + if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1; + } + return 0; + } +#elif PY_VERSION_HEX >= 0x03090000 + #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. +#elif !defined(PyUnicode_AS_UNICODE) + #error Cannot use "UChar in Unicode" in Python < 3.9 without Py_UNICODE support. +#endif +#if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 + if ((sizeof(Py_UNICODE) == 2) && unlikely(character > 65535)) { + return __Pyx_PyUnicodeBufferContainsUCS4_SP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } else +#endif + { + return __Pyx_PyUnicodeBufferContainsUCS4_BMP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } +#endif +} + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (unlikely(from_mvs->suboffsets[i] >= 0)) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (unlikely(memviewslice->memview || memviewslice->data)) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#if PY_VERSION_HEX >= 0x030A0000 || defined(HAVE_STDARG_PROTOTYPES) + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + return; + } + old_acquisition_count = __pyx_add_acquisition_count(memview); + if (unlikely(old_acquisition_count <= 0)) { + if (likely(old_acquisition_count == 0)) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count+1, lineno); + } + } +} +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + memslice->memview = NULL; + return; + } + old_acquisition_count = __pyx_sub_acquisition_count(memview); + memslice->data = NULL; + if (likely(old_acquisition_count > 1)) { + memslice->memview = NULL; + } else if (likely(old_acquisition_count == 1)) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count-1, lineno); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_long(npy_long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_long neg_one = (npy_long) -1, const_zero = (npy_long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_long __Pyx_PyInt_As_npy_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_long neg_one = (npy_long) -1, const_zero = (npy_long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(npy_long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(npy_long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(npy_long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(npy_long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) >= 2 * PyLong_SHIFT)) { + return (npy_long) (((((npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(npy_long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) >= 3 * PyLong_SHIFT)) { + return (npy_long) (((((((npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(npy_long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) >= 4 * PyLong_SHIFT)) { + return (npy_long) (((((((((npy_long)digits[3]) << PyLong_SHIFT) | (npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(npy_long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(npy_long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(npy_long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(npy_long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) - 1 > 2 * PyLong_SHIFT)) { + return (npy_long) (((npy_long)-1)*(((((npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(npy_long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) - 1 > 2 * PyLong_SHIFT)) { + return (npy_long) ((((((npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(npy_long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) - 1 > 3 * PyLong_SHIFT)) { + return (npy_long) (((npy_long)-1)*(((((((npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(npy_long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) - 1 > 3 * PyLong_SHIFT)) { + return (npy_long) ((((((((npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(npy_long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) - 1 > 4 * PyLong_SHIFT)) { + return (npy_long) (((npy_long)-1)*(((((((((npy_long)digits[3]) << PyLong_SHIFT) | (npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(npy_long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_long) - 1 > 4 * PyLong_SHIFT)) { + return (npy_long) ((((((((((npy_long)digits[3]) << PyLong_SHIFT) | (npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(npy_long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(npy_long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + npy_long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (npy_long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (npy_long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (npy_long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (npy_long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(npy_long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((npy_long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(npy_long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((npy_long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((npy_long) 1) << (sizeof(npy_long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (npy_long) -1; + } + } else { + npy_long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_long) -1; + val = __Pyx_PyInt_As_npy_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_long"); + return (npy_long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_long"); + return (npy_long) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int16(npy_int16 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int16 neg_one = (npy_int16) -1, const_zero = (npy_int16) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int16) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int16) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int16) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int16) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int16) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_int16), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_int16)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int32(npy_int32 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int32 neg_one = (npy_int32) -1, const_zero = (npy_int32) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int32) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int32) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int32) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int32) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int32) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_int32), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_int32)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_int64)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* ImportNumPyArray */ + static PyObject* __Pyx__ImportNumPyArray(void) { + PyObject *numpy_module, *ndarray_object = NULL; + numpy_module = __Pyx_Import(__pyx_n_s_numpy, NULL, 0); + if (likely(numpy_module)) { + ndarray_object = PyObject_GetAttrString(numpy_module, "ndarray"); + Py_DECREF(numpy_module); + } + if (unlikely(!ndarray_object)) { + PyErr_Clear(); + } + if (unlikely(!ndarray_object || !PyObject_TypeCheck(ndarray_object, &PyType_Type))) { + Py_XDECREF(ndarray_object); + Py_INCREF(Py_None); + ndarray_object = Py_None; + } + return ndarray_object; +} +static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void) { + if (unlikely(!__pyx_numpy_ndarray)) { + __pyx_numpy_ndarray = __Pyx__ImportNumPyArray(); + } + Py_INCREF(__pyx_numpy_ndarray); + return __pyx_numpy_ndarray; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const char neg_one = (char) -1, const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(char) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 2 * PyLong_SHIFT)) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 3 * PyLong_SHIFT)) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 4 * PyLong_SHIFT)) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(char) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(char) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(char) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (char) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (char) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (char) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (char) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(char) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(char) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((char) 1) << (sizeof(char) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name_2); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__56); + } + return name; +} +#endif + +/* CheckBinaryVersion */ + static unsigned long __Pyx_get_runtime_version(void) { +#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/binning/binning.py b/gators/binning/binning.py new file mode 100644 index 00000000..270fded1 --- /dev/null +++ b/gators/binning/binning.py @@ -0,0 +1,145 @@ +# License: Apache-2.0 +from typing import List, Tuple + +import numpy as np +import pandas as pd + +from ..util import util +from ._base_binning import _BaseBinning + +EPSILON = 1e-10 + +from gators import DataFrame, Series + + +class Binning(_BaseBinning): + """Bin the columns using equal distance splits. + + The binning can be done inplace or by adding the binned + columns to the existing data. + + Parameters + ---------- + n_bins : int + Number of bins to use. + inplace : bool, default False + If False, return the dataframe with the new binned columns + with the names "column_name__bin"). Otherwise, return + the dataframe with the existing binned columns. + + Examples + --------- + Imports and initialization: + + >>> from gators.binning import Binning + + The binning can be done inplace by modifying the existing columns + + >>> obj = Binning(n_bins=3, inplace=True) + + or by adding new binned columns + + >>> obj = Binning(n_bins=3, inplace=False) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + * with `inplace=True` + + >>> obj = Binning(n_bins=3, inplace=True) + >>> obj.fit_transform(X) + A B + 0 (-inf, -0.33) [2.0, inf) + 1 [-0.33, 0.33) [1.0, 2.0) + 2 [0.33, inf) (-inf, 1.0) + + * with `inplace=False` + + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) + >>> obj = Binning(n_bins=3, inplace=False) + >>> obj.fit_transform(X) + A B A__bin B__bin + 0 -1 3 (-inf, -0.33) [2.0, inf) + 1 0 1 [-0.33, 0.33) [1.0, 2.0) + 2 1 0 [0.33, inf) (-inf, 1.0) + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 1, 0]}) + >>> obj.transform_numpy(X.to_numpy()) + array([[-1, 3, '(-inf, -0.33)', '[2.0, inf)'], + [0, 1, '[-0.33, 0.33)', '[1.0, 2.0)'], + [1, 0, '[0.33, inf)', '(-inf, 1.0)']], dtype=object) + + See Also + -------- + gators.binning.CustomBinning + Bin using the splits given by the user. + gators.binning.QuantileBinning + Bin using splits based on quantiles. + gators.binning.TreeBinning + Bin using splits based on decision trees. + + """ + + def __init__(self, n_bins: int, inplace=False): + _BaseBinning.__init__(self, n_bins=n_bins, inplace=inplace) + + def compute_bins( + self, X: DataFrame, y: Series = None + ) -> Tuple[List[List[float]], np.ndarray]: + """Compute the bins list and the bins array. + The bin list is used for dataframes and + the bins array is used for arrays. + + Parameters + ---------- + X : DataFrame + Input dataframe. + n_bins : int + Number of bins to use. + + Returns + ------- + bins : List[List[float]] + Bin splits definition. + The dictionary keys are the column names to bin, + its values are the split arrays. + bins_np : np.ndarray + Bin splits definition for NumPy. + """ + n_cols = X.shape[1] + bins_np = np.empty((self.n_bins + 1, n_cols)) + bins_np[0, :] = -np.inf + bins_np[-1, :] = np.inf + x_min = util.get_function(X).to_pandas(X.min()) + x_max = util.get_function(X).to_pandas(X.max()) + deltas = x_max - x_min + for i in range(1, self.n_bins): + bins_np[i, :] = x_min + i * deltas / self.n_bins + bins_dict = pd.DataFrame(bins_np, columns=X.columns).to_dict(orient="list") + bins_dict = {k: np.unique(v) for k, v in bins_dict.items()} + pretty_bins_dict = { + k: [util.prettify_number(x, precision=2) for x in v] + for k, v in bins_dict.items() + } + return bins_dict, pretty_bins_dict, bins_np diff --git a/gators/binning/binning.pyx b/gators/binning/binning.pyx index a3646b8d..cdee1252 100644 --- a/gators/binning/binning.pyx +++ b/gators/binning/binning.pyx @@ -17,36 +17,36 @@ ctypedef fused num_t: def bin_rare_events( np.ndarray[object, ndim=2] X, np.ndarray[object, ndim=2] categories_to_keep_np, - np.ndarray[np.int_t, ndim=1] n_categories_to_keep, - np.ndarray[np.int_t, ndim=1] idx_columns): + np.ndarray[np.int_t, ndim=1] n_categories_to_keep): cdef np.int_t l cdef np.int_t j_col cdef np.int_t l_max cdef np.int_t n_rows = X.shape[0] - cdef np.int_t n_cols = idx_columns.shape[0] + cdef np.int_t n_cols = X.shape[1] cdef object val = 'OTHERS' cdef np.int_t is_rare = 1 + cdef np.ndarray[object, ndim=2] X_rare = np.empty((n_rows, n_cols), X.dtype) for j in range(n_cols): - j_col = idx_columns[j] l_max = n_categories_to_keep[j] if l_max == 0: for k in range(n_rows): - X[k, j_col] = val + X_rare[k, j] = val else: for k in range(n_rows): + X_rare[k, j] = X[k, j] is_rare = 1 for l in range(l_max): - if X[k, j_col] == categories_to_keep_np[l, j]: + if X[k, j] == categories_to_keep_np[l, j]: is_rare = 0 break if is_rare: - X[k, j_col] = val - return X + X_rare[k, j] = val + return X_rare @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[num_t, ndim = 2] bin_numerics( +cpdef np.ndarray[num_t, ndim = 2] bin_Numeric( np.ndarray[num_t, ndim=2] X, np.ndarray[num_t, ndim=2] bin_limits, np.ndarray[num_t, ndim=2] bins, @@ -65,7 +65,7 @@ cpdef np.ndarray[num_t, ndim = 2] bin_numerics( j_col = idx_columns[j] val = X[i, j_col] for k in range(1, n_bins): - if val <= bin_limits[k, j]: + if val < bin_limits[k, j]: X_bin[i, j] = bins[k-1, j] break return np.concatenate((X, X_bin), axis=1) @@ -73,7 +73,7 @@ cpdef np.ndarray[num_t, ndim = 2] bin_numerics( @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] discretizer_inplace( +cpdef np.ndarray[object, ndim = 2] binning_inplace( np.ndarray[object, ndim=2] X, np.ndarray[num_t, ndim=2] bins_np, np.ndarray[np.int64_t, ndim=1] idx_columns): @@ -88,15 +88,15 @@ cpdef np.ndarray[object, ndim = 2] discretizer_inplace( for j in range(n_cols): j_col = idx_columns[j] for k in range(1, n_bins): - if X[i, j_col] <= bins_np[k, j]: - X[i, j_col] = str(float(k - 1)) + if X[i, j_col] < bins_np[k, j]: + X[i, j_col] = '_' + str(k - 1) break return X @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] discretizer( +cpdef np.ndarray[object, ndim = 2] binning( np.ndarray[object, ndim=2] X, np.ndarray[num_t, ndim=2] bins_np, np.ndarray[np.int64_t, ndim=1] idx_columns): @@ -112,7 +112,31 @@ cpdef np.ndarray[object, ndim = 2] discretizer( for j in range(n_cols): j_col = idx_columns[j] for k in range(1, n_bins): - if float(X[i, j_col]) <= bins_np[k, j]: - X_bin[i, j] = str(float(k - 1)) + if float(X[i, j_col]) < bins_np[k, j]: + X_bin[i, j] = '_' + str(k - 1) + break + return np.concatenate((X, X_bin), axis=1) + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim = 2] binning_new( + np.ndarray[num_t, ndim=2] X, + np.ndarray[num_t, ndim=2] bins_np, + np.ndarray[object, ndim=2] labels_np, + ): + cdef int i + cdef int j + cdef int k + cdef int j_col + cdef int n_rows = X.shape[0] + cdef int n_cols = X.shape[1] + cdef int n_bins = bins_np.shape[0] + cdef np.ndarray[object, ndim=2] X_bin = np.empty((n_rows, n_cols), object) + for i in range(n_rows): + for j in range(n_cols): + for k in range(1, n_bins): + if float(X[i, j]) < bins_np[k, j]: + X_bin[i, j] = labels_np[k-1, j] break - return np.concatenate((X, X_bin), axis=1) \ No newline at end of file + return X_bin \ No newline at end of file diff --git a/gators/binning/custom_binning.py b/gators/binning/custom_binning.py new file mode 100644 index 00000000..d173f8e0 --- /dev/null +++ b/gators/binning/custom_binning.py @@ -0,0 +1,145 @@ +# License: Apache-2.0 +from typing import Dict, List + +import pandas as pd +import numpy as np + +from ..util import util +from ._base_binning import _BaseBinning + +EPSILON = 1e-10 + + +from gators import DataFrame, Series + + +class CustomBinning(_BaseBinning): + """Bin the columns using the splits given by the user. + + The binning can be done inplace or by adding the binned + columns to the existing data. + + Parameters + ---------- + bins_dict : Dict[str, List[float]] + Bin splits definition. The dictionary keys are the column names to + bin, its values are the split arrays. + inplace : bool, default False + If False, return the dataframe with the new binned columns + with the names "column_name__bin"). Otherwise, return + the dataframe with the existing binned columns. + + Examples + -------- + >>> import numpy as np + >>> from gators.binning import Binning + + >>> bins_dict = {'A':[-np.inf, 1, np.inf], 'B':[-np.inf, 2, np.inf]} + + The binning can be done inplace by modifying the existing columns: + + >>> obj = CustomBinning(bins_dict=bins_dict, inplace=True) + + or by adding new binned columns: + + >>> obj = CustomBinning(bins_dict=bins_dict, inplace=True) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + * with `inplace=True` + + >>> obj = CustomBinning(bins_dict=bins_dict, inplace=True) + >>> obj.fit_transform(X) + A B + 0 (-inf, 1.0) [2.0, inf) + 1 (-inf, 1.0) [2.0, inf) + 2 [1.0, inf) (-inf, 2.0) + + * with `inplace=False` + + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + >>> obj = CustomBinning(bins_dict=bins_dict, inplace=False) + >>> obj.fit_transform(X) + A B A__bin B__bin + 0 -1 3 (-inf, 1.0) [2.0, inf) + 1 0 2 (-inf, 1.0) [2.0, inf) + 2 1 1 [1.0, inf) (-inf, 2.0) + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + >>> obj.transform_numpy(X.to_numpy()) + array([[-1, 3, '(-inf, 1.0)', '[2.0, inf)'], + [0, 2, '(-inf, 1.0)', '[2.0, inf)'], + [1, 1, '[1.0, inf)', '(-inf, 2.0)']], dtype=object) + + + See Also + -------- + gators.binning.Binning + Bin using equal splits. + gators.binning.QuantileBinning + Bin using splits based on quantiles. + gators.binning.TreeBinning + Bin using tree-based splits. + """ + + def __init__(self, bins_dict: Dict[str, List[float]], inplace=False): + if not isinstance(bins_dict, dict): + raise TypeError("`bins_dict` should be a dict.") + _BaseBinning.__init__(self, n_bins=1, inplace=inplace) + self.bins_dict = {key: np.array(val) for key, val in bins_dict.items()} + + def fit(self, X: DataFrame, y: Series = None) -> "CustomBinning": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : 'CustomBinning' + Instance of itself. + """ + self.check_dataframe(X) + self.base_columns = list(X.columns) + self.columns = list(self.bins_dict.keys()) + self.column_names = [f"{c}__bin" for c in self.columns] + self.idx_columns = util.get_idx_columns(X.columns, self.columns) + n_cols = self.idx_columns.size + if n_cols == 0: + return self + self.pretty_bins_dict = { + k: [util.prettify_number(x, precision=2) for x in v] + for k, v in self.bins_dict.items() + } + self.labels, self.labels_np = self.get_labels(self.pretty_bins_dict) + max_bins = max([len(v) for v in self.bins_dict.values()]) + self.bins_np = np.inf * np.ones((max_bins, n_cols)) + for i, b in enumerate(self.bins_dict.values()): + self.bins_np[: len(b), i] = b + return self diff --git a/gators/binning/custom_discretizer.py b/gators/binning/custom_discretizer.py deleted file mode 100644 index 1ba2be2b..00000000 --- a/gators/binning/custom_discretizer.py +++ /dev/null @@ -1,148 +0,0 @@ -# License: Apache-2.0 -from typing import Dict, List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..util import util -from ._base_discretizer import _BaseDiscretizer - -EPSILON = 1e-10 - - -class CustomDiscretizer(_BaseDiscretizer): - """Discretize the columns using the splits given by the user. - - The discretization can be done inplace or by adding the discretized - columns to the existing data. - - Parameters - ---------- - bins : Dict[str, List[float]] - Bin splits definition. The dictionary keys are the column names to - discretize, its values are the split arrays. - inplace : bool, default False - If False, return the dataframe with the new discretized columns - with the names "`column_name`__bin"). Otherwise, return - the dataframe with the existing binned columns. - - Examples - -------- - * fit & transform with `pandas` - - - inplace discretization - >>> import pandas as pd - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins, inplace=True) - >>> obj.fit_transform(X) - A B - 0 0.0 0.0 - 1 0.0 1.0 - 2 1.0 1.0 - - - add discretization - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins, inplace=False) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 0.0 1.0 - 2 1 3 1.0 1.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 0.0 1.0 - 2 1 3 1.0 1.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '0.0', '1.0'], - [1, 3, '1.0', '1.0']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.binning import CustomDiscretizer - >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = CustomDiscretizer(bins=bins) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '0.0', '1.0'], - [1, 3, '1.0', '1.0']], dtype=object) - - See Also - -------- - gators.binning.Discretizer - Discretize using equal splits. - gators.binning.QuantileDiscretizer - Discretize using splits based on quantiles. - - """ - - def __init__(self, bins: Dict[str, List[float]], inplace=False): - if not isinstance(bins, dict): - raise TypeError("`bins` should be a dict.") - _BaseDiscretizer.__init__(self, n_bins=0, inplace=inplace) - self.bins = {key: np.array(val) for key, val in bins.items()} - - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "CustomDiscretizer": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - 'CustomDiscretizer' - Instance of itself. - """ - self.check_dataframe(X) - self.columns = list(self.bins.keys()) - self.output_columns = [f"{c}__bin" for c in self.columns] - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - n_cols = len(self.idx_columns) - if n_cols == 0: - return self - max_bins = max([len(v) for v in self.bins.values()]) - self.labels = np.arange(max_bins - 1) - self.bins_np = np.inf * np.ones((max_bins, n_cols)) - for i, b in enumerate(self.bins.values()): - self.bins_np[: len(b), i] = b - if isinstance(X, ks.DataFrame): - self.bins = self.bins_np.T.tolist() - self.bins = [np.unique(b) + EPSILON for b in self.bins] - return self diff --git a/gators/binning/discretizer.py b/gators/binning/discretizer.py deleted file mode 100644 index d2b4db6b..00000000 --- a/gators/binning/discretizer.py +++ /dev/null @@ -1,150 +0,0 @@ -# License: Apache-2.0 -from typing import List, Tuple, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..util import util -from ._base_discretizer import _BaseDiscretizer - -EPSILON = 1e-10 - - -class Discretizer(_BaseDiscretizer): - """Discretize the columns using equal distance splits. - - The discretization can be done inplace or by adding the discretized - columns to the existing data. - - Parameters - ---------- - n_bins : int - Number of bins to use. - inplace : bool, default False - If False, return the dataframe with the new discretized columns - with the names "`column_name`__bin"). Otherwise, return - the dataframe with the existing binned columns. - - Examples - --------- - * fit & transform with `pandas` - - - inplace discretization - - >>> import pandas as pd - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3, inplace=True) - >>> obj.fit_transform(X) - A B - 0 0.0 0.0 - 1 1.0 1.0 - 2 2.0 2.0 - - - add discretization - - >>> import pandas as pd - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3, inplace=False) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) - >>> obj = Discretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1.0, 1.0, '0.0', '0.0'], - [0.0, 2.0, '1.0', '1.0'], - [1.0, 3.0, '2.0', '2.0']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = Discretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '1.0', '1.0'], - [1, 3, '2.0', '2.0']], dtype=object) - - See Also - -------- - gators.binning.CustomDiscretizer - Discretize using the splits given by the user. - gators.binning.QuantileDiscretizer - Discretize using splits based on quantiles. - - """ - - def __init__(self, n_bins: int, inplace=False): - _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) - - @staticmethod - def compute_bins( - X: Union[pd.DataFrame, ks.DataFrame], n_bins: int - ) -> Tuple[List[List[float]], np.ndarray]: - """Compute the bins list and the bins array. - The bin list is used for dataframes and - the bins array is used for arrays. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - n_bins : int - Number of bins to use. - - Returns - ------- - bins : List[List[float]] - Bin splits definition. - The dictionary keys are the column names to discretize, - its values are the split arrays. - bins_np : np.ndarray - Bin splits definition for NumPy. - """ - n_cols = X.shape[1] - X_dtype = X.dtypes.to_numpy()[0] - if isinstance(X, pd.DataFrame): - deltas = X.max() - X.min() - bins_np = np.empty((n_bins + 1, n_cols)) - bins_np[0, :] = util.get_bounds(X_dtype)[0] - bins_np[-1, :] = util.get_bounds(X_dtype)[1] - for i in range(1, n_bins): - bins_np[i, :] = X.min() + i * deltas / n_bins - - bins = pd.DataFrame(bins_np, columns=X.columns).to_dict(orient="list") - return bins, bins_np - x_min = X.min().to_pandas() - x_max = X.max().to_pandas() - deltas = x_max - x_min - bins_np = np.empty((n_bins + 1, n_cols)) - bins_np[0, :] = util.get_bounds(X_dtype)[0] - bins_np[-1, :] = util.get_bounds(X_dtype)[1] - for i in range(1, n_bins): - bins_np[i, :] = x_min + i * deltas / n_bins - bins = (bins_np.T + EPSILON).tolist() - return bins, bins_np diff --git a/gators/binning/quantile_binning.py b/gators/binning/quantile_binning.py new file mode 100644 index 00000000..70841ef3 --- /dev/null +++ b/gators/binning/quantile_binning.py @@ -0,0 +1,138 @@ +# License: Apache-2.0 +from typing import List, Tuple + +import numpy as np + +from ..util import util +from ._base_binning import _BaseBinning +from gators import DataFrame, Series + + +class QuantileBinning(_BaseBinning): + """Bin the columns using quantile-based splits. + + The binning can be done inplace or by adding the binned + columns to the existing data. + + Parameters + ---------- + n_bins : int + Number of bins to use. + inplace : bool, default False + If False, return the dataframe with the new binned columns + with the names "column_name__bin"). Otherwise, return + the dataframe with the existing binned columns. + + Examples + --------- + >>> from gators.binning import QuantileBinning + + The binning can be done inplace by modifying the existing columns + + >>> obj = QuantileBinning(n_bins=3, inplace=True) + + or by adding new binned columns + + >>> obj = QuantileBinning(n_bins=3, inplace=True) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + * with `inplace=True` + + >>> obj = QuantileBinning(n_bins=3, inplace=True) + >>> obj.fit_transform(X) + A B + 0 (-inf, -0.33) [2.33, inf) + 1 [-0.33, 0.33) [1.67, 2.33) + 2 [0.33, inf) (-inf, 1.67) + + * with `inplace=False` + + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + >>> obj = QuantileBinning(n_bins=3, inplace=False) + >>> obj.fit_transform(X) + A B A__bin B__bin + 0 -1 3 (-inf, -0.33) [2.33, inf) + 1 0 2 [-0.33, 0.33) [1.67, 2.33) + 2 1 1 [0.33, inf) (-inf, 1.67) + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [3, 2, 1]}) + >>> obj.transform_numpy(X.to_numpy()) + array([[-1, 3, '(-inf, -0.33)', '[2.33, inf)'], + [0, 2, '[-0.33, 0.33)', '[1.67, 2.33)'], + [1, 1, '[0.33, inf)', '(-inf, 1.67)']], dtype=object) + + See Also + -------- + gators.binning.Binning + Bin using equal splits. + gators.binning.CustomBinning + Bin using the variable quantiles. + gators.binning.TreeBinning + Bin using tree-based splits. + """ + + def __init__(self, n_bins: int, inplace=False): + _BaseBinning.__init__(self, n_bins=n_bins, inplace=inplace) + + def compute_bins( + self, X: DataFrame, y: Series = None + ) -> Tuple[List[List[float]], np.ndarray]: + """Compute the bins list and the bins array. + The bin list is used for dataframes and + the bins array is used for arrays. + + Parameters + ---------- + X : DataFrame + Input dataframe. + n_bins : int + Number of bins to use. + + Returns + ------- + bins : List[List[float]] + Bin splits definition. + The dictionary keys are the column names to bin, + its values are the split arrays. + bins_np : np.ndarray + Bin splits definition for NumPy. + """ + q = np.linspace(0.0, 1.0, self.n_bins + 1).tolist()[1:-1] + bins = X.quantile(q=q) + bins = util.get_function(bins).to_pandas(bins) + bins_dict = { + c: [-np.inf] + list(bins[c].unique()) + [np.inf] for c in X.columns + } + + pretty_bins_dict = { + k: [util.prettify_number(x, precision=2) for x in v] + for k, v in bins_dict.items() + } + max_bins = max(len(v) for v in bins_dict.values()) + bins_np = np.inf * np.ones((max_bins, len(bins_dict))) + for i, b in enumerate(bins_dict.values()): + bins_np[: len(b), i] = b + return bins_dict, pretty_bins_dict, bins_np diff --git a/gators/binning/quantile_discretizer.py b/gators/binning/quantile_discretizer.py deleted file mode 100644 index a99b164e..00000000 --- a/gators/binning/quantile_discretizer.py +++ /dev/null @@ -1,151 +0,0 @@ -# License: Apache-2.0 -from typing import List, Tuple, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..util import util -from ._base_discretizer import _BaseDiscretizer - -EPSILON = 1e-10 - - -class QuantileDiscretizer(_BaseDiscretizer): - """Discretize the columns using quantile-based splits. - - The discretization can be done inplace or by adding the discretized - columns to the existing data. - - Parameters - ---------- - n_bins : int - Number of bins to use. - inplace : bool, default to False - If False, return the dataframe with the new discretized columns - with the names '`column_name`__bin'). Otherwise, return - the dataframe with the existing binned columns. - - Examples - --------- - * fit & transform with `pandas` - - - inplace discretization - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3, inplace=True) - >>> obj.fit_transform(X) - A B - 0 0.0 0.0 - 1 1.0 1.0 - 2 2.0 2.0 - - - add discretization - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> X = pd.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3, inplace=False) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3) - >>> obj.fit_transform(X) - A B A__bin B__bin - 0 -1 1 0.0 0.0 - 1 0 2 1.0 1.0 - 2 1 3 2.0 2.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> X = pd.DataFrame({'A': [-1., 0., 1.], 'B': [1., 2., 3.]}) - >>> obj = QuantileDiscretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1.0, 1.0, '0.0', '0.0'], - [0.0, 2.0, '1.0', '1.0'], - [1.0, 3.0, '2.0', '2.0']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> X = ks.DataFrame({'A': [-1, 0, 1], 'B': [1, 2, 3]}) - >>> obj = QuantileDiscretizer(n_bins=3) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1, 1, '0.0', '0.0'], - [0, 2, '1.0', '1.0'], - [1, 3, '2.0', '2.0']], dtype=object) - - See Also - -------- - gators.binning.Discretizer - Discretize using equal splits. - gators.binning.CustomDiscretizer - Discretize using the variable quantiles. - - """ - - def __init__(self, n_bins: int, inplace=False): - _BaseDiscretizer.__init__(self, n_bins=n_bins, inplace=inplace) - - @staticmethod - def compute_bins( - X: Union[pd.DataFrame, ks.DataFrame], n_bins: int - ) -> Tuple[List[List[float]], np.ndarray]: - """Compute the bins list and the bins array. - The bin list is used for dataframes and - the bins array is used for arrays. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - n_bins : int - Number of bins to use. - - Returns - ------- - bins : List[List[float]] - Bin splits definition. - The dictionary keys are the column names to discretize, - its values are the split arrays. - bins_np : np.ndarray - Bin splits definition for NumPy. - """ - q = np.linspace(0, 1, n_bins + 1)[1:-1].tolist() - X_dtype = X.dtypes.to_numpy()[0] - - def f(x): - return x.quantile(q=q) - - bins = X.apply(f) - if isinstance(bins, ks.DataFrame): - bins = bins.to_pandas() - bins.loc[-np.inf, :] = util.get_bounds(X_dtype)[0] - bins.loc[np.inf, :] = util.get_bounds(X_dtype)[1] - bins = bins.sort_index() - for c in X.columns: - unique_bins = bins[c].iloc[1:-1].unique() - n_unique = unique_bins.shape[0] - bins[c].iloc[1 : 1 + n_unique] = unique_bins - bins[c].iloc[1 + n_unique :] = util.get_bounds(X_dtype)[1] - bins_np = bins.to_numpy() - if isinstance(X, pd.DataFrame): - return bins.to_dict(orient="list"), bins_np - else: - bins = bins_np.T.tolist() - return [np.unique(b) + EPSILON for b in bins], bins_np diff --git a/gators/binning/tests/__pycache__/test_bin_rare_events_dd.cpython-38-pytest-6.2.5.pyc b/gators/binning/tests/__pycache__/test_bin_rare_events_dd.cpython-38-pytest-6.2.5.pyc index 294735f3..25926e14 100644 Binary files a/gators/binning/tests/__pycache__/test_bin_rare_events_dd.cpython-38-pytest-6.2.5.pyc and b/gators/binning/tests/__pycache__/test_bin_rare_events_dd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/binning/tests/__pycache__/test_bin_rare_events_ks.cpython-38-pytest-6.2.5.pyc b/gators/binning/tests/__pycache__/test_bin_rare_events_ks.cpython-38-pytest-6.2.5.pyc index bcafe6ae..3f0ea15d 100644 Binary files a/gators/binning/tests/__pycache__/test_bin_rare_events_ks.cpython-38-pytest-6.2.5.pyc and b/gators/binning/tests/__pycache__/test_bin_rare_events_ks.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/binning/tests/__pycache__/test_bin_rare_events_pd.cpython-38-pytest-6.2.5.pyc b/gators/binning/tests/__pycache__/test_bin_rare_events_pd.cpython-38-pytest-6.2.5.pyc index 1cefd7ef..8dcbbe77 100644 Binary files a/gators/binning/tests/__pycache__/test_bin_rare_events_pd.cpython-38-pytest-6.2.5.pyc and b/gators/binning/tests/__pycache__/test_bin_rare_events_pd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/binning/tests/test_bin_rare_categories_dd.py b/gators/binning/tests/test_bin_rare_categories_dd.py new file mode 100644 index 00000000..a4715197 --- /dev/null +++ b/gators/binning/tests/test_bin_rare_categories_dd.py @@ -0,0 +1,142 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning.bin_rare_categories import BinRareCategories + + +columns = list("ABC") + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.5).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_all_others(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "B": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "C": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_other(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ), + npartitions=1, + ) + obj = BinRareCategories(min_ratio=0.0).fit(X) + return obj, X, X.compute().copy() + + +@pytest.fixture +def data_num(): + X = dd.from_pandas( + pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [1, 2, 3, 4, 5, 6]}), npartitions=1 + ) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X.compute().copy() + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[columns] = X_new[columns].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +# def test_num_dd(data_num): +# obj, X, X_expected = data_num +# X_new = obj.transform(X).compute() +# assert_frame_equal(X_new, X_expected) + + +# def test_num_dd_np(data_num): +# obj, X, X_expected = data_num +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) +# assert_frame_equal(X_new, X_expected) + + +# def test_no_other_dd(data_no_other): +# obj, X, X_expected = data_no_other +# X_new = obj.transform(X).compute() +# X_new[columns] = X_new[columns].astype(object) +# assert_frame_equal(X_new, X_expected) + + +# def test_no_other_dd_np(data_no_other): +# obj, X, X_expected = data_no_other +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) +# assert_frame_equal(X_new, X_expected.astype(object)) + + +# def test_all_others_dd(data_all_others): +# obj, X, X_expected = data_all_others +# X_new = obj.transform(X).compute() +# X_new[columns] = X_new[columns].astype(object) +# assert_frame_equal(X_new, X_expected) + + +# def test_all_others_dd_np(data_all_others): +# obj, X, X_expected = data_all_others +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) +# assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_bin_rare_categories_ks.py b/gators/binning/tests/test_bin_rare_categories_ks.py new file mode 100644 index 00000000..923e1484 --- /dev/null +++ b/gators/binning/tests/test_bin_rare_categories_ks.py @@ -0,0 +1,243 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning.bin_rare_categories import BinRareCategories + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.5).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace_ks(): + X = ps.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + "A__bin_rare": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], + "B__bin_rare": ["x", "x", "w", "w", "w", "x"], + "C__bin_rare": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], + } + ) + obj = BinRareCategories(min_ratio=0.5, inplace=False).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_all_others(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "B": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "C": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_other(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.0).fit(X) + obj = BinRareCategories(min_ratio=0.0).fit(X) + return obj, X, X.copy() + + +@pytest.fixture +def data_num(): + X = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [1, 2, 3, 4, 5, 6]}) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X.copy() + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.5).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_all_others_ks(): + X = ps.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "B": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "C": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_other_ks(): + X = ps.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.0).fit(X) + obj = BinRareCategories(min_ratio=0.0).fit(X) + return obj, X, X.to_pandas().copy() + + +@pytest.fixture +def data_num_ks(): + X = ps.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [1, 2, 3, 4, 5, 6]}) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X.to_pandas().copy() + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_not_inplace_ks(data_not_inplace_ks): + obj, X, X_expected = data_not_inplace_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_not_inplace_ks_np(data_not_inplace_ks): + obj, X, X_expected = data_not_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_num_ks(data_num_ks): + obj, X, X_expected = data_num_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_num_ks_np(data_num_ks): + obj, X, X_expected = data_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_no_other_ks(data_no_other_ks): + obj, X, X_expected = data_no_other_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_other_ks_np(data_no_other_ks): + obj, X, X_expected = data_no_other_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_all_others_ks(data_all_others_ks): + obj, X, X_expected = data_all_others_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_all_others_ks_np(data_all_others_ks): + obj, X, X_expected = data_all_others_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_bin_rare_categories_pd.py b/gators/binning/tests/test_bin_rare_categories_pd.py new file mode 100644 index 00000000..594f35b5 --- /dev/null +++ b/gators/binning/tests/test_bin_rare_categories_pd.py @@ -0,0 +1,169 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning.bin_rare_categories import BinRareCategories + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.5).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + "A__bin_rare": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], + "B__bin_rare": ["x", "x", "w", "w", "w", "x"], + "C__bin_rare": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], + } + ) + obj = BinRareCategories(min_ratio=0.5, inplace=False).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_all_others(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + X_expected = pd.DataFrame( + { + "A": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "B": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "C": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_other(): + X = pd.DataFrame( + { + "A": ["w", "z", "q", "q", "q", "z"], + "B": ["x", "x", "w", "w", "w", "x"], + "C": ["c", "c", "e", "d", "d", "c"], + "D": [1, 2, 3, 4, 5, 6], + } + ) + obj = BinRareCategories(min_ratio=0.0).fit(X) + obj = BinRareCategories(min_ratio=0.0).fit(X) + return obj, X, X.copy() + + +@pytest.fixture +def data_num(): + X = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [1, 2, 3, 4, 5, 6]}) + obj = BinRareCategories(min_ratio=1.0).fit(X) + return obj, X, X.copy() + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_pd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_num_pd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_other_pd(data_no_other): + obj, X, X_expected = data_no_other + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_other_pd_np(data_no_other): + obj, X, X_expected = data_no_other + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_all_others_pd(data_all_others): + obj, X, X_expected = data_all_others + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_all_others_pd_np(data_all_others): + obj, X, X_expected = data_all_others + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = BinRareCategories(min_ratio=2.0) diff --git a/gators/binning/tests/test_bin_rare_events.py b/gators/binning/tests/test_bin_rare_events.py deleted file mode 100644 index 9976c210..00000000 --- a/gators/binning/tests/test_bin_rare_events.py +++ /dev/null @@ -1,308 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning.bin_rare_events import BinRareEvents - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["w", "z", "q", "q", "q", "z"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "e", "d", "d", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - X_expected = pd.DataFrame( - { - "A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_1object(): - X = pd.DataFrame({"A": ["w", "z", "q", "q", "q", "z"], "D": [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame( - {"A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], "D": [1, 2, 3, 4, 5, 6]} - ) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_all_others(): - X = pd.DataFrame( - { - "A": ["w", "z", "q", "q", "q", "z"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "e", "d", "d", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - X_expected = pd.DataFrame( - { - "A": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], - "B": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], - "C": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - obj = BinRareEvents(min_ratio=1.0).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_other(): - X = pd.DataFrame( - { - "A": ["w", "z", "q", "q", "q", "z"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "e", "d", "d", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - obj = BinRareEvents(min_ratio=0.0).fit(X) - obj = BinRareEvents(min_ratio=0.0).fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_num(): - X = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=1.0).fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["w", "z", "q", "q", "q", "z"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "e", "d", "d", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - X_expected = pd.DataFrame( - { - "A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "OTHERS", "OTHERS", "OTHERS", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_1object_ks(): - X = ks.DataFrame({"A": ["w", "z", "q", "q", "q", "z"], "D": [1, 2, 3, 4, 5, 6]}) - X_expected = pd.DataFrame( - {"A": ["OTHERS", "OTHERS", "q", "q", "q", "OTHERS"], "D": [1, 2, 3, 4, 5, 6]} - ) - obj = BinRareEvents(min_ratio=0.5).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_all_others_ks(): - X = ks.DataFrame( - { - "A": ["w", "z", "q", "q", "q", "z"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "e", "d", "d", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - X_expected = pd.DataFrame( - { - "A": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], - "B": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], - "C": ["OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS", "OTHERS"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - obj = BinRareEvents(min_ratio=1.0).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_other_ks(): - X = ks.DataFrame( - { - "A": ["w", "z", "q", "q", "q", "z"], - "B": ["x", "x", "w", "w", "w", "x"], - "C": ["c", "c", "e", "d", "d", "c"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - obj = BinRareEvents(min_ratio=0.0).fit(X) - obj = BinRareEvents(min_ratio=0.0).fit(X) - return obj, X, X.to_pandas().copy() - - -@pytest.fixture -def data_num_ks(): - X = ks.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [1, 2, 3, 4, 5, 6]}) - obj = BinRareEvents(min_ratio=1.0).fit(X) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - X_expected.index = X_new.index - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - X_expected.index = X_new.index - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_other_pd(data_no_other): - obj, X, X_expected = data_no_other - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_other_ks(data_no_other_ks): - obj, X, X_expected = data_no_other_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_other_pd_np(data_no_other): - obj, X, X_expected = data_no_other - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_other_ks_np(data_no_other_ks): - obj, X, X_expected = data_no_other_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_1object_pd(data_1object): - obj, X, X_expected = data_1object - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_1object_ks(data_1object_ks): - obj, X, X_expected = data_1object_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_1object_pd_np(data_1object): - obj, X, X_expected = data_1object - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_1object_ks_np(data_1object_ks): - obj, X, X_expected = data_1object_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_all_others_pd(data_all_others): - obj, X, X_expected = data_all_others - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_all_others_ks(data_all_others_ks): - obj, X, X_expected = data_all_others_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_all_others_pd_np(data_all_others): - obj, X, X_expected = data_all_others - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_all_others_ks_np(data_all_others_ks): - obj, X, X_expected = data_all_others_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = BinRareEvents(min_ratio=1) diff --git a/gators/binning/tests/test_bin_single_target_class_categories_dd.py b/gators/binning/tests/test_bin_single_target_class_categories_dd.py new file mode 100644 index 00000000..012d390e --- /dev/null +++ b/gators/binning/tests/test_bin_single_target_class_categories_dd.py @@ -0,0 +1,55 @@ +# License: Apache-2.0 +import pandas as pd +import dask.dataframe as dd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import BinSingleTargetClassCategories + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["_0", "_1", "_2", "_2", "_1"], + "B": ["_1", "_2", "_1", "_1", "_1"], + "C": ["_0", "_0", "_1", "_2", "_2"], + "D": ["_0", "_0", "_1", "_1", "_1"], + "E": [1, 2, 3, 4, 5], + } + ), + npartitions=1, + ) + y = dd.from_pandas( + pd.Series([0, 1, 1, 0, 0], name="Target"), + npartitions=1, + ) + + X_expected = pd.DataFrame( + { + "A": ["_0|_1", "_0|_1", "_2", "_2", "_0|_1"], + "B": ["_1|_2", "_1|_2", "_1|_2", "_1|_2", "_1|_2"], + "C": ["_0|_1|_2", "_0|_1|_2", "_0|_1|_2", "_0|_1|_2", "_0|_1|_2"], + "D": ["_0", "_0", "_1", "_1", "_1"], + "E": [1, 2, 3, 4, 5], + } + ) + obj = BinSingleTargetClassCategories().fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + columns = ["A", "B", "C", "D"] + X_new[columns] = X_new[columns].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_bin_single_target_class_categories_ks.py b/gators/binning/tests/test_bin_single_target_class_categories_ks.py new file mode 100644 index 00000000..7030b450 --- /dev/null +++ b/gators/binning/tests/test_bin_single_target_class_categories_ks.py @@ -0,0 +1,49 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import BinSingleTargetClassCategories + + +@pytest.fixture +def data(): + X = ps.DataFrame( + { + "A": ["_0", "_1", "_2", "_2", "_1"], + "B": ["_1", "_2", "_1", "_1", "_1"], + "C": ["_0", "_0", "_1", "_2", "_2"], + "D": ["_0", "_0", "_1", "_1", "_1"], + "E": [1, 2, 3, 4, 5], + } + ) + y = ps.Series([0, 1, 1, 0, 0], name="Target") + + X_expected = pd.DataFrame( + { + "A": ["_0|_1", "_0|_1", "_2", "_2", "_0|_1"], + "B": ["_1|_2", "_1|_2", "_1|_2", "_1|_2", "_1|_2"], + "C": ["_0|_1|_2", "_0|_1|_2", "_0|_1|_2", "_0|_1|_2", "_0|_1|_2"], + "D": ["_0", "_0", "_1", "_1", "_1"], + "E": [1, 2, 3, 4, 5], + } + ) + obj = BinSingleTargetClassCategories().fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def tesks_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_bin_single_target_class_categories_pd.py b/gators/binning/tests/test_bin_single_target_class_categories_pd.py new file mode 100644 index 00000000..124798b7 --- /dev/null +++ b/gators/binning/tests/test_bin_single_target_class_categories_pd.py @@ -0,0 +1,108 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import BinSingleTargetClassCategories + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["_0", "_1", "_2", "_2", "_1"], + "B": ["_1", "_2", "_1", "_1", "_1"], + "C": ["_0", "_0", "_1", "_2", "_2"], + "D": ["_0", "_0", "_1", "_1", "_1"], + "E": [1, 2, 3, 4, 5], + } + ) + y = pd.Series([0, 1, 1, 0, 0], name="Target") + + X_expected = pd.DataFrame( + { + "A": ["_0|_1", "_0|_1", "_2", "_2", "_0|_1"], + "B": ["_1|_2", "_1|_2", "_1|_2", "_1|_2", "_1|_2"], + "C": ["_0|_1|_2", "_0|_1|_2", "_0|_1|_2", "_0|_1|_2", "_0|_1|_2"], + "D": ["_0", "_0", "_1", "_1", "_1"], + "E": [1, 2, 3, 4, 5], + } + ) + obj = BinSingleTargetClassCategories().fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_binning(): + X = pd.DataFrame( + { + "A": ["_0", "_1", "_0", "_0", "_1"], + } + ) + y = pd.Series([0, 1, 1, 0, 0], name="Target") + X_expected = pd.DataFrame( + { + "A": ["_0", "_1", "_0", "_0", "_1"], + } + ) + obj = BinSingleTargetClassCategories().fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + X = pd.DataFrame( + { + "D": [1, 2, 3, 4, 5], + } + ) + y = pd.Series([0, 1, 1, 0, 0], name="Target") + X_expected = pd.DataFrame( + { + "D": [1, 2, 3, 4, 5], + } + ) + obj = BinSingleTargetClassCategories().fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_binning_pd(data_no_binning): + obj, X, X_expected = data_no_binning + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_binning_pd_np(data_no_binning): + obj, X, X_expected = data_no_binning + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test__num_pd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd__num_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + X_expected.index = X_new.index + assert_frame_equal(X_new, X_expected) diff --git a/gators/binning/tests/test_binning_dd.py b/gators/binning/tests/test_binning_dd.py new file mode 100644 index 00000000..8cb3dde3 --- /dev/null +++ b/gators/binning/tests/test_binning_dd.py @@ -0,0 +1,337 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import Binning + + +obj_columns = ["C", "A__bin", "B__bin", "D__bin", "F__bin"] +obj_columns_no_num = ["C"] +obj_columns_num = ["A__bin", "B__bin", "D__bin", "F__bin"] +obj_columns_num_inplace = ["A", "B", "D", "F"] +obj_columns_inplace = ["A", "B", "C", "D", "F"] + + +@pytest.fixture +def data(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B__bin": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F__bin": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = dd.from_pandas( + pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}), npartitions=1 + ) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + n_bins = 3 + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B__bin": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F__bin": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[obj_columns] = X_new[obj_columns].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_dd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X).compute() + X_new[obj_columns_no_num] = X_new[obj_columns_no_num].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_dd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_dd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X).compute() + X_new[obj_columns_num] = X_new[obj_columns_num].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_num_dd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # # inplace + + +def test_inplace_dd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X).compute() + X_new[obj_columns_inplace] = X_new[obj_columns_inplace].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_dd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_num_dd(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_new = obj.transform(X).compute() + X_new[obj_columns_num_inplace] = X_new[obj_columns_num_inplace].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_num_dd_np(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_binning_ks.py b/gators/binning/tests/test_binning_ks.py new file mode 100644 index 00000000..cb7aca99 --- /dev/null +++ b/gators/binning/tests/test_binning_ks.py @@ -0,0 +1,320 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import Binning + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B__bin": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F__bin": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num_ks(): + X = ps.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + n_bins = 3 + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B__bin": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F__bin": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_num_ks(data_no_num_ks): + obj, X, X_expected = data_no_num_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_num_ks_np(data_no_num_ks): + obj, X, X_expected = data_no_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_num_ks(data_num_ks): + obj, X, X_expected = data_num_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_num_ks_np(data_num_ks): + obj, X, X_expected = data_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_inplace_ks(data_inplace_ks): + obj, X, X_expected = data_inplace_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_inplace_ks_np(data_inplace_ks): + obj, X, X_expected = data_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_inplace_num_ks(data_num_inplace_ks): + obj, X, X_expected = data_num_inplace_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_inplace_num_ks_np(data_num_inplace_ks): + obj, X, X_expected = data_num_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_binning_pd.py b/gators/binning/tests/test_binning_pd.py new file mode 100644 index 00000000..ec956651 --- /dev/null +++ b/gators/binning/tests/test_binning_pd.py @@ -0,0 +1,317 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import Binning + + +@pytest.fixture +def data(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B__bin": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F__bin": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=False).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + n_bins = 3 + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B__bin": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F__bin": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 23.26)", + "[55.27, inf)", + "(-inf, 23.26)", + "[39.27, 55.27)", + "(-inf, 23.26)", + "(-inf, 23.26)", + ], + "B": [ + "[0.75, inf)", + "[0.75, inf)", + "(-inf, 0.25)", + "[0.75, inf)", + "(-inf, 0.25)", + "(-inf, 0.25)", + ], + "D": [ + "(-inf, 26.0)", + "[34.0, inf)", + "[26.0, 30.0)", + "[34.0, inf)", + "[34.0, inf)", + "[30.0, 34.0)", + ], + "F": [ + "[2.5, inf)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "(-inf, 1.5)", + "[2.0, 2.5)", + "[2.5, inf)", + ], + } + ) + obj = Binning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_pd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_pd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_pd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_num_pd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # inplace + + +def test_inplace_pd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_pd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_num_pd(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_num_pd_np(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = Binning(n_bins="a") + with pytest.raises(TypeError): + _ = Binning(n_bins=2, inplace="a") diff --git a/gators/binning/tests/test_custom_binning_dd.py b/gators/binning/tests/test_custom_binning_dd.py new file mode 100644 index 00000000..25f04273 --- /dev/null +++ b/gators/binning/tests/test_custom_binning_dd.py @@ -0,0 +1,328 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import CustomBinning + + +columns = ["C", "A__bin", "D__bin", "F__bin"] +columns_inplace = ["A", "C", "D", "F"] +columns_num = ["A__bin", "D__bin", "F__bin"] +columns_num_inplace = ["A", "D", "F"] +columns_no_num = ["C"] + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "D__bin": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F__bin": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = dd.from_pandas( + pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}), npartitions=1 + ) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "D__bin": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F__bin": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "B": [1, 1, 0, 1, 0, 0], + "D": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins, inplace=True).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[columns] = X_new[columns].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_dd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X).compute() + X_new[columns_no_num] = X_new[columns_no_num].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_dd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_dd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X).compute() + X_new[columns_num] = X_new[columns_num].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_num_dd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # inplace + + +def test_inplace_dd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X).compute() + X_new[columns_inplace] = X_new[columns_inplace].astype(object) + + assert_frame_equal(X_new, X_expected) + + +def test_inplace_dd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_num_dd(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_new = obj.transform(X).compute() + X_new[columns_num_inplace] = X_new[columns_num_inplace].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_num_dd_np(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_custom_binning_ks.py b/gators/binning/tests/test_custom_binning_ks.py new file mode 100644 index 00000000..21722411 --- /dev/null +++ b/gators/binning/tests/test_custom_binning_ks.py @@ -0,0 +1,313 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import CustomBinning + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "D__bin": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F__bin": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num_ks(): + X = ps.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace_ks(): + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_ks(): + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "D__bin": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F__bin": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace_ks(): + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "B": [1, 1, 0, 1, 0, 0], + "D": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_num_ks(data_no_num_ks): + obj, X, X_expected = data_no_num_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_num_ks_np(data_no_num_ks): + obj, X, X_expected = data_no_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_num_ks(data_num_ks): + obj, X, X_expected = data_num_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_num_ks_np(data_num_ks): + obj, X, X_expected = data_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # inplace + + +@pytest.mark.pyspark +def test_inplace_ks(data_inplace_ks): + obj, X, X_expected = data_inplace_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_inplace_ks_np(data_inplace_ks): + obj, X, X_expected = data_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_inplace_num_ks(data_num_inplace_ks): + obj, X, X_expected = data_num_inplace_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_inplace_num_ks_np(data_num_inplace_ks): + obj, X, X_expected = data_num_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_custom_binning_pd.py b/gators/binning/tests/test_custom_binning_pd.py new file mode 100644 index 00000000..ab489c10 --- /dev/null +++ b/gators/binning/tests/test_custom_binning_pd.py @@ -0,0 +1,307 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import CustomBinning + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "D__bin": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F__bin": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F": [ + "(-inf, inf)", + "(-inf, inf)", + "(-inf, inf)", + "(-inf, inf)", + "(-inf, inf)", + "(-inf, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, np.inf], + } + obj = CustomBinning(bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "D__bin": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F__bin": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2.0, np.inf], + } + obj = CustomBinning(bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace(): + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 8.0)", + "[40.0, inf)", + "(-inf, 8.0)", + "[40.0, inf)", + "[8.0, 40.0)", + "[8.0, 40.0)", + ], + "B": [1, 1, 0, 1, 0, 0], + "D": [ + "(-inf, 30.0)", + "[30.0, inf)", + "(-inf, 30.0)", + "[30.0, inf)", + "[30.0, inf)", + "[30.0, inf)", + ], + "F": [ + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "(-inf, 2.0)", + "[2.0, inf)", + "[2.0, inf)", + ], + } + ) + bins = { + "A": [-np.inf, 8.0, 40.0, np.inf], + "D": [-np.inf, 30, np.inf], + "F": [-np.inf, 2, np.inf], + } + obj = CustomBinning(bins, inplace=True).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_pd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_pd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_pd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_num_pd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # # inplace + + +def test_inplace_pd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_pd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_num_pd(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_num_pd_np(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = CustomBinning(bins_dict="a") + with pytest.raises(TypeError): + _ = CustomBinning(bins_dict={"A": [-np.inf, np.inf]}, inplace="a") diff --git a/gators/binning/tests/test_custom_discretizer.py b/gators/binning/tests/test_custom_discretizer.py deleted file mode 100644 index c01072fb..00000000 --- a/gators/binning/tests/test_custom_discretizer.py +++ /dev/null @@ -1,540 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning import CustomDiscretizer - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "D__bin": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F__bin": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X[list("ABDF")] = X[list("ABDF")].astype(np.int16) - X_expected = pd.DataFrame( - { - "A": {0: 7, 1: 71, 2: 7, 3: 53, 4: 8, 5: 8}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22, 1: 38, 2: 26, 3: 35, 4: 35, 5: 31}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F__bin": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - X_expected[list("ABDF")] = X_expected[list("ABDF")].astype(np.int16) - bins = {"A": [-1000, 8, 40, 1000], "D": [-1000, 30, 1000], "F": [-1000, 1.0, 1000]} - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num(): - X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace(): - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num(): - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "D__bin": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F__bin": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace(): - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "D__bin": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F__bin": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X[list("ABDF")] = X[list("ABDF")].astype(np.int16) - X_expected = pd.DataFrame( - { - "A": {0: 7, 1: 71, 2: 7, 3: 53, 4: 8, 5: 8}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22, 1: 38, 2: 26, 3: 35, 4: 35, 5: 31}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F__bin": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - X_expected[list("ABDF")] = X_expected[list("ABDF")].astype(np.int16) - bins = {"A": [-1000, 8, 40, 1000], "D": [-1000, 30, 1000], "F": [-1000, 1.0, 1000]} - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num_ks(): - X = ks.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace_ks(): - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "D__bin": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F__bin": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace_ks(): - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "1.0", 5: "1.0"}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: "0.0", 1: "1.0", 2: "0.0", 3: "1.0", 4: "1.0", 5: "1.0"}, - "F": {0: "1.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "1.0"}, - } - ) - bins = { - "A": [-np.inf, 8.0, 40.0, np.inf], - "D": [-np.inf, 30, np.inf], - "F": [-np.inf, 1.0, np.inf], - } - obj = CustomDiscretizer(bins, inplace=True).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_num_pd(data_no_num): - obj, X, X_expected = data_no_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_num_ks(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_no_num_pd_np(data_no_num): - obj, X, X_expected = data_no_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_num_ks_np(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -# # inplace - - -def test_inplace_pd(data_inplace): - obj, X, X_expected = data_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_ks(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_pd_np(data_inplace): - obj, X, X_expected = data_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_ks_np(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_inplace_num_pd(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_num_ks(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_num_pd_np(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_num_ks_np(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = CustomDiscretizer(bins="a") - with pytest.raises(TypeError): - _ = CustomDiscretizer(bins={"A": [-np.inf, np.inf]}, inplace="a") diff --git a/gators/binning/tests/test_discretizer.py b/gators/binning/tests/test_discretizer.py deleted file mode 100644 index 65dd6124..00000000 --- a/gators/binning/tests/test_discretizer.py +++ /dev/null @@ -1,509 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning import Discretizer - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B__bin": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X[list("ABDF")] = X[list("ABDF")].astype(np.int16) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B__bin": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - X_expected[list("ABDF")] = X_expected[list("ABDF")].astype(np.int16) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num(): - X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - n_bins = 3 - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B__bin": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -### - - -@pytest.fixture -def data_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B__bin": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X[list("ABDF")] = X[list("ABDF")].astype(np.int16) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B__bin": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - X_expected[list("ABDF")] = X_expected[list("ABDF")].astype(np.int16) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num_ks(): - X = ks.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - n_bins = 3 - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B__bin": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "B": {0: "3.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "0.0", 5: "0.0"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "3.0", 5: "2.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = Discretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_num_pd(data_no_num): - obj, X, X_expected = data_no_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_num_ks(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_no_num_pd_np(data_no_num): - obj, X, X_expected = data_no_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_num_ks_np(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -# # inplace - - -def test_inplace_pd(data_inplace): - obj, X, X_expected = data_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_ks(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_pd_np(data_inplace): - obj, X, X_expected = data_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_ks_np(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_inplace_num_pd(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_num_ks(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_num_pd_np(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_num_ks_np(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = Discretizer(n_bins="a") - with pytest.raises(TypeError): - _ = Discretizer(n_bins=2, inplace="a") diff --git a/gators/binning/tests/test_quantile_binning_dd.py b/gators/binning/tests/test_quantile_binning_dd.py new file mode 100644 index 00000000..1c117b90 --- /dev/null +++ b/gators/binning/tests/test_quantile_binning_dd.py @@ -0,0 +1,336 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import QuantileBinning + +columns = ["C", "A__bin", "B__bin", "D__bin", "F__bin"] +columns_inplace = ["A", "B", "C", "D", "F"] +columns_num = ["A__bin", "B__bin", "D__bin", "F__bin"] +columns_num_inplace = ["A", "B", "D", "F"] +columns_no_num = ["C"] + + +@pytest.fixture +def data(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B__bin": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "D__bin": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F__bin": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = dd.from_pandas( + pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}), npartitions=1 + ) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + n_bins = 3 + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B__bin": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "D__bin": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F__bin": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace(): + n_bins = 4 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "D": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[columns] = X_new[columns].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_dd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X).compute() + X_new[columns_no_num] = X_new[columns_no_num].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_dd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_dd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X).compute() + X_new[columns_num] = X_new[columns_num].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_num_dd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # # inplace + + +def test_inplace_dd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X).compute() + X_new[columns_inplace] = X_new[columns_inplace].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_dd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_num_dd(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_new = obj.transform(X).compute() + X_new[columns_num_inplace] = X_new[columns_num_inplace].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_num_dd_np(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_quantile_binning_ks.py b/gators/binning/tests/test_quantile_binning_ks.py new file mode 100644 index 00000000..55dc708b --- /dev/null +++ b/gators/binning/tests/test_quantile_binning_ks.py @@ -0,0 +1,324 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import QuantileBinning + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 7.92)", + "[53.1, inf)", + "[7.92, 8.05)", + "[53.1, inf)", + "[8.05, 53.1)", + "[8.05, 53.1)", + ], + "B__bin": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 1.0)", + "[1.0, inf)", + "[0.0, 1.0)", + "[0.0, 1.0)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[30.0, inf)", + "[26.0, 27.2)", + "[30.0, inf)", + "[30.0, inf)", + "[27.2, 30.0)", + ], + "F__bin": [ + "[3.0, inf)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[3.0, inf)", + ], + } + ) + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 7.92)", + "[53.1, inf)", + "[7.92, 8.05)", + "[53.1, inf)", + "[8.05, 53.1)", + "[8.05, 53.1)", + ], + "B": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 1.0)", + "[1.0, inf)", + "[0.0, 1.0)", + "[0.0, 1.0)", + ], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 26.0)", + "[30.0, inf)", + "[26.0, 27.2)", + "[30.0, inf)", + "[30.0, inf)", + "[27.2, 30.0)", + ], + "F": [ + "[3.0, inf)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[3.0, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num_ks(): + n_bins = 3 + X = ps.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 7.92)", + "[53.1, inf)", + "[7.92, 8.05)", + "[53.1, inf)", + "[8.05, 53.1)", + "[8.05, 53.1)", + ], + "B__bin": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 1.0)", + "[1.0, inf)", + "[0.0, 1.0)", + "[0.0, 1.0)", + ], + "D__bin": [ + "(-inf, 26.0)", + "[30.0, inf)", + "[26.0, 27.2)", + "[30.0, inf)", + "[30.0, inf)", + "[27.2, 30.0)", + ], + "F__bin": [ + "[3.0, inf)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[3.0, inf)", + ], + } + ) + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace_ks(): + n_bins = 4 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 7.92)", + "[53.1, inf)", + "[7.92, 8.05)", + "[53.1, inf)", + "[8.05, 53.1)", + "[8.05, 53.1)", + ], + "B": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 1.0)", + "[1.0, inf)", + "[0.0, 1.0)", + "[0.0, 1.0)", + ], + "D": [ + "(-inf, 26.0)", + "[30.0, inf)", + "[26.0, 27.2)", + "[30.0, inf)", + "[30.0, inf)", + "[27.2, 30.0)", + ], + "F": [ + "[3.0, inf)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[1.0, 2.0)", + "[2.0, 3.0)", + "[3.0, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_num_ks(data_no_num_ks): + obj, X, X_expected = data_no_num_ks + X_new = obj.transform(X) + X_new = X_new.to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_no_num_ks_np(data_no_num_ks): + obj, X, X_expected = data_no_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_num_ks(data_num_ks): + obj, X, X_expected = data_num_ks + X_new = obj.transform(X) + X_new = X_new.to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_num_ks_np(data_num_ks): + obj, X, X_expected = data_num_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_inplace_ks(data_inplace_ks): + obj, X, X_expected = data_inplace_ks + X_new = obj.transform(X) + X_new = X_new.to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_inplace_ks_np(data_inplace_ks): + obj, X, X_expected = data_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_inplace_num_ks(data_num_inplace_ks): + obj, X, X_expected = data_num_inplace_ks + X_new = obj.transform(X) + X_new = X_new.to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_inplace_num_ks_np(data_num_inplace_ks): + obj, X, X_expected = data_num_inplace_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_quantile_binning_pd.py b/gators/binning/tests/test_quantile_binning_pd.py new file mode 100644 index 00000000..79d58036 --- /dev/null +++ b/gators/binning/tests/test_quantile_binning_pd.py @@ -0,0 +1,317 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning import QuantileBinning + + +@pytest.fixture +def data(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B__bin": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "D__bin": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F__bin": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "C": ["a", "b", "c", "d", "e", "f"], + "D": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + n_bins = 3 + obj = QuantileBinning(n_bins).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + "A__bin": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B__bin": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "D__bin": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F__bin": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=False).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_num_inplace(): + n_bins = 4 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 30.0, 30.0, 27.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": [ + "(-inf, 7.96)", + "[41.94, inf)", + "(-inf, 7.96)", + "[41.94, inf)", + "[7.96, 8.25)", + "[8.25, 41.94)", + ], + "B": [ + "[1.0, inf)", + "[1.0, inf)", + "[0.0, 0.5)", + "[1.0, inf)", + "[0.0, 0.5)", + "[0.0, 0.5)", + ], + "D": [ + "(-inf, 26.3)", + "[30.0, inf)", + "(-inf, 26.3)", + "[30.0, inf)", + "[30.0, inf)", + "[26.3, 28.6)", + ], + "F": [ + "[2.75, inf)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "(-inf, 1.25)", + "[2.0, 2.75)", + "[2.75, inf)", + ], + } + ) + obj = QuantileBinning(n_bins, inplace=True).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_pd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_pd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_num_pd(data_num): + obj, X, X_expected = data_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_num_pd_np(data_num): + obj, X, X_expected = data_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +# # # inplace + + +def test_inplace_pd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_pd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_num_pd(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_num_pd_np(data_num_inplace): + obj, X, X_expected = data_num_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = QuantileBinning(n_bins="a") + with pytest.raises(TypeError): + _ = QuantileBinning(n_bins=2, inplace="a") diff --git a/gators/binning/tests/test_quantile_discretizer.py b/gators/binning/tests/test_quantile_discretizer.py deleted file mode 100644 index 1a52864a..00000000 --- a/gators/binning/tests/test_quantile_discretizer.py +++ /dev/null @@ -1,476 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning import QuantileDiscretizer - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B__bin": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X[list("ABDF")] = X[list("ABDF")].astype(np.int16) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B__bin": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - X_expected[list("ABDF")] = X_expected[list("ABDF")].astype(np.int16) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num(): - X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - n_bins = 3 - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B__bin": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace(): - n_bins = 4 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -### - - -@pytest.fixture -def data_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B__bin": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X[list("ABDF")] = X[list("ABDF")].astype(np.int16) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B__bin": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - X_expected[list("ABDF")] = X_expected[list("ABDF")].astype(np.int16) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_inplace_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "c", "d", "e", "f"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "C": {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_num_ks(): - n_bins = 3 - X = ks.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: 7.25, 1: 71.2833, 2: 7.925, 3: 53.1, 4: 8.05, 5: 8.4583}, - "B": {0: 1, 1: 1, 2: 0, 3: 1, 4: 0, 5: 0}, - "D": {0: 22.0, 1: 38.0, 2: 26.0, 3: 35.0, 4: 35.0, 5: 31.2}, - "F": {0: 3, 1: 1, 2: 2, 3: 1, 4: 2, 5: 3}, - "A__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B__bin": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D__bin": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F__bin": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_inplace_ks(): - n_bins = 4 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "0.0", 1: "3.0", 2: "0.0", 3: "3.0", 4: "1.0", 5: "2.0"}, - "B": {0: "2.0", 1: "2.0", 2: "0.0", 3: "2.0", 4: "0.0", 5: "0.0"}, - "D": {0: "0.0", 1: "3.0", 2: "0.0", 3: "2.0", 4: "2.0", 5: "1.0"}, - "F": {0: "3.0", 1: "0.0", 2: "1.0", 3: "0.0", 4: "1.0", 5: "3.0"}, - } - ) - obj = QuantileDiscretizer(n_bins, inplace=True).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_num_pd(data_no_num): - obj, X, X_expected = data_no_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_num_ks(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_no_num_pd_np(data_no_num): - obj, X, X_expected = data_no_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_num_ks_np(data_no_num_ks): - obj, X, X_expected = data_no_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_num_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_num_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_num_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_num_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -# # inplace - - -def test_inplace_pd(data_inplace): - obj, X, X_expected = data_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_ks(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_pd_np(data_inplace): - obj, X, X_expected = data_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_ks_np(data_inplace_ks): - obj, X, X_expected = data_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_inplace_num_pd(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inplace_num_ks(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_inplace_num_pd_np(data_num_inplace): - obj, X, X_expected = data_num_inplace - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_inplace_num_ks_np(data_num_inplace_ks): - obj, X, X_expected = data_num_inplace_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, index=X_expected.index - ) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = QuantileDiscretizer(n_bins="a") - with pytest.raises(TypeError): - _ = QuantileDiscretizer(n_bins=2, inplace="a") diff --git a/gators/binning/tests/test_tree_binning_dd.py b/gators/binning/tests/test_tree_binning_dd.py new file mode 100644 index 00000000..4247be7c --- /dev/null +++ b/gators/binning/tests/test_tree_binning_dd.py @@ -0,0 +1,104 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor + +from gators.binning import TreeBinning + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [1.07, -2.59, -1.54, 1.72], + "B": [-1.19, -0.22, -0.28, 1.28], + "C": [-1.15, 1.92, 1.09, -0.95], + "D": ["a", "b", "c", "d"], + } + ), + npartitions=1, + ) + y = dd.from_pandas(pd.Series([0, 1, 0, 1], name="TARGET"), npartitions=1) + X_expected = pd.DataFrame( + { + "A": [1.07, -2.59, -1.54, 1.72], + "B": [-1.19, -0.22, -0.28, 1.28], + "C": [-1.15, 1.92, 1.09, -0.95], + "D": ["a", "b", "c", "d"], + "A__bin": ["[-2.06, 1.4)", "(-inf, -2.06)", "[-2.06, 1.4)", "[1.4, inf)"], + "B__bin": [ + "(-inf, -0.25)", + "[-0.25, inf)", + "(-inf, -0.25)", + "[-0.25, inf)", + ], + "C__bin": ["(-inf, -1.05)", "[0.07, inf)", "[0.07, inf)", "[-1.05, 0.07)"], + } + ) + tree = DecisionTreeClassifier(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_regression(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [-0.1, 1.45, 0.98, -0.98], + "B": [-0.15, 0.14, 0.4, 1.87], + "C": [0.95, 0.41, 1.76, 2.24], + } + ), + npartitions=1, + ) + y = dd.from_pandas( + pd.Series([39.9596835, 36.65644911, 137.24445075, 300.15325913], name="TARGET"), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["[-0.54, 1.22)", "[1.22, inf)", "[-0.54, 1.22)", "(-inf, -0.54)"], + "B": ["(-inf, 0.27)", "(-inf, 0.27)", "[0.27, 1.14)", "[1.14, inf)"], + "C": ["(-inf, 1.35)", "(-inf, 1.35)", "[1.35, 2.0)", "[2.0, inf)"], + } + ) + tree = DecisionTreeRegressor(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree, inplace=True).fit(X, y) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + columns = ["A__bin", "B__bin", "C__bin", "D"] + X_new[columns] = X_new[columns].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_regression_dd(data_regression): + obj, X, X_expected = data_regression + X_new = obj.transform(X).compute() + X_new[list("ABC")] = X_new[list("ABC")].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_regression_dd_np(data_regression): + obj, X, X_expected = data_regression + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_tree_binning_ks.py b/gators/binning/tests/test_tree_binning_ks.py new file mode 100644 index 00000000..0d6cf92b --- /dev/null +++ b/gators/binning/tests/test_tree_binning_ks.py @@ -0,0 +1,99 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor + +ps.set_option("compute.default_index_type", "distributed-sequence") + +from gators.binning import TreeBinning + + +@pytest.fixture +def data(): + X = ps.DataFrame( + { + "A": [1.07, -2.59, -1.54, 1.72], + "B": [-1.19, -0.22, -0.28, 1.28], + "C": [-1.15, 1.92, 1.09, -0.95], + "D": ["a", "b", "c", "d"], + } + ) + y = ps.Series([0, 1, 0, 1], name="TARGET") + X_expected = pd.DataFrame( + { + "A": [1.07, -2.59, -1.54, 1.72], + "B": [-1.19, -0.22, -0.28, 1.28], + "C": [-1.15, 1.92, 1.09, -0.95], + "D": ["a", "b", "c", "d"], + "A__bin": ["[-2.06, 1.4)", "(-inf, -2.06)", "[-2.06, 1.4)", "[1.4, inf)"], + "B__bin": [ + "(-inf, -0.25)", + "[-0.25, inf)", + "(-inf, -0.25)", + "[-0.25, inf)", + ], + "C__bin": ["(-inf, -1.05)", "[0.07, inf)", "[0.07, inf)", "[-1.05, 0.07)"], + } + ) + tree = DecisionTreeClassifier(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_regression(): + max_depth = 2 + X = ps.DataFrame( + { + "A": [-0.1, 1.45, 0.98, -0.98], + "B": [-0.15, 0.14, 0.4, 1.87], + "C": [0.95, 0.41, 1.76, 2.24], + } + ) + y = ps.Series([39.9596835, 36.65644911, 137.24445075, 300.15325913], name="TARGET") + X_expected = pd.DataFrame( + { + "A": ["[-0.54, 1.22)", "[1.22, inf)", "[-0.54, 1.22)", "(-inf, -0.54)"], + "B": ["(-inf, 0.27)", "(-inf, 0.27)", "[0.27, 1.14)", "[1.14, inf)"], + "C": ["(-inf, 1.35)", "(-inf, 1.35)", "[1.35, 2.0)", "[2.0, inf)"], + } + ) + tree = DecisionTreeRegressor(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree, inplace=True).fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_regression_ks(data_regression): + obj, X, X_expected = data_regression + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_regression_ks_np(data_regression): + obj, X, X_expected = data_regression + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/binning/tests/test_tree_binning_pd.py b/gators/binning/tests/test_tree_binning_pd.py new file mode 100644 index 00000000..4975bbf8 --- /dev/null +++ b/gators/binning/tests/test_tree_binning_pd.py @@ -0,0 +1,122 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor + +from gators.binning import TreeBinning + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [1.07, -2.59, -1.54, 1.72], + "B": [-1.19, -0.22, -0.28, 1.28], + "C": [-1.15, 1.92, 1.09, -0.95], + "D": ["a", "b", "c", "d"], + } + ) + y = pd.Series([0, 1, 0, 1], name="TARGET") + X_expected = pd.DataFrame( + { + "A": [1.07, -2.59, -1.54, 1.72], + "B": [-1.19, -0.22, -0.28, 1.28], + "C": [-1.15, 1.92, 1.09, -0.95], + "D": ["a", "b", "c", "d"], + "A__bin": ["[-2.06, 1.4)", "(-inf, -2.06)", "[-2.06, 1.4)", "[1.4, inf)"], + "B__bin": [ + "(-inf, -0.25)", + "[-0.25, inf)", + "(-inf, -0.25)", + "[-0.25, inf)", + ], + "C__bin": ["(-inf, -1.05)", "[0.07, inf)", "[0.07, inf)", "[-1.05, 0.07)"], + } + ) + tree = DecisionTreeClassifier(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree, inplace=False).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_regression(): + X = pd.DataFrame( + { + "A": [-0.1, 1.45, 0.98, -0.98], + "B": [-0.15, 0.14, 0.4, 1.87], + "C": [0.95, 0.41, 1.76, 2.24], + } + ) + y = pd.Series([39.9596835, 36.65644911, 137.24445075, 300.15325913], name="TARGET") + X_expected = pd.DataFrame( + { + "A": ["[-0.54, 1.22)", "[1.22, inf)", "[-0.54, 1.22)", "(-inf, -0.54)"], + "B": ["(-inf, 0.27)", "(-inf, 0.27)", "[0.27, 1.14)", "[1.14, inf)"], + "C": ["(-inf, 1.35)", "(-inf, 1.35)", "[1.35, 2.0)", "[2.0, inf)"], + } + ) + tree = DecisionTreeRegressor(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree, inplace=True).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_num(): + X = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + y = pd.Series([0, 1, 2, 3, 4, 5], name="TARGET") + X_expected = pd.DataFrame({"C": ["a", "b", "c", "d", "e", "f"]}) + tree = DecisionTreeClassifier(max_depth=2, random_state=0) + obj = TreeBinning(tree=tree).fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_regression_pd(data_regression): + obj, X, X_expected = data_regression + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_regression_pd_np(data_regression): + obj, X, X_expected = data_regression + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_num_pd(data_no_num): + obj, X, X_expected = data_no_num + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_num_pd_np(data_no_num): + obj, X, X_expected = data_no_num + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, index=X_expected.index + ) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = TreeBinning(max_depth="a") diff --git a/gators/binning/tree_binning.py b/gators/binning/tree_binning.py new file mode 100644 index 00000000..93afa28f --- /dev/null +++ b/gators/binning/tree_binning.py @@ -0,0 +1,190 @@ +# License: Apache-2.0 +from typing import Union + +import numpy as np +from sklearn import tree +from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor + +from ..util import util +from ._base_binning import _BaseBinning + + +from gators import DataFrame + + +class TreeBinning(_BaseBinning): + """Bin the columns using decision tree based splits. + + The binning can be done inplace or by adding the binned + columns to the existing data. + + Parameters + ---------- + tree : 'DecisionTree' + Decision tree model used to create the bin intervals. + inplace : bool, default False + If False, return the dataframe with the new binned columns + with the names "column_name__bin"). Otherwise, return + the dataframe with the existing binned columns. + + Examples + --------- + >>> from gators.binning import TreeBinning + >>> from sklearn.tree import DecisionTreeClassifier + + The binning can be done inplace by modifying the existing columns + + >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=True) + + or by adding new binned columns + + >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=True) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [1.07, -2.59, -1.54, 1.72], + ... 'B': [-1.19, -0.22, -0.28, 1.28], + ... 'C': [-1.15, 1.92, 1.09, -0.95]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([0, 1, 0, 1], name="TARGET"), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': [1.07, -2.59, -1.54, 1.72], + ... 'B': [-1.19, -0.22, -0.28, 1.28], + ... 'C': [-1.15, 1.92, 1.09, -0.95]}) + >>> y = ps.Series([0, 1, 0, 1], name="TARGET") + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({ + ... 'A': [1.07, -2.59, -1.54, 1.72], + ... 'B': [-1.19, -0.22, -0.28, 1.28], + ... 'C': [-1.15, 1.92, 1.09, -0.95]}) + >>> y = pd.Series([0, 1, 0, 1], name="TARGET") + + The result is a transformed dataframe belonging to the same dataframe library. + + * with `inplace=True` + + >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=True) + >>> obj.fit_transform(X, y) + A B C + 0 [-2.06, 1.4) (-inf, -0.25) (-inf, -1.05) + 1 (-inf, -2.06) [-0.25, inf) [0.07, inf) + 2 [-2.06, 1.4) (-inf, -0.25) [0.07, inf) + 3 [1.4, inf) [-0.25, inf) [-1.05, 0.07) + + * with `inplace=False` + + >>> X = pd.DataFrame({ + ... 'A': [1.07, -2.59, -1.54, 1.72], + ... 'B': [-1.19, -0.22, -0.28, 1.28], + ... 'C': [-1.15, 1.92, 1.09, -0.95]}) + >>> obj = TreeBinning(tree=DecisionTreeClassifier(max_depth=2, random_state=0), inplace=False) + >>> obj.fit_transform(X, y) + A B C A__bin B__bin C__bin + 0 1.07 -1.19 -1.15 [-2.06, 1.4) (-inf, -0.25) (-inf, -1.05) + 1 -2.59 -0.22 1.92 (-inf, -2.06) [-0.25, inf) [0.07, inf) + 2 -1.54 -0.28 1.09 [-2.06, 1.4) (-inf, -0.25) [0.07, inf) + 3 1.72 1.28 -0.95 [1.4, inf) [-0.25, inf) [-1.05, 0.07) + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame({ + ... 'A': [1.07, -2.59, -1.54, 1.72], + ... 'B': [-1.19, -0.22, -0.28, 1.28], + ... 'C': [-1.15, 1.92, 1.09, -0.95]}) + >>> obj.transform_numpy(X.to_numpy()) + array([[1.07, -1.19, -1.15, '[-2.06, 1.4)', '(-inf, -0.25)', + '(-inf, -1.05)'], + [-2.59, -0.22, 1.92, '(-inf, -2.06)', '[-0.25, inf)', + '[0.07, inf)'], + [-1.54, -0.28, 1.09, '[-2.06, 1.4)', '(-inf, -0.25)', + '[0.07, inf)'], + [1.72, 1.28, -0.95, '[1.4, inf)', '[-0.25, inf)', '[-1.05, 0.07)']], + dtype=object) + + See Also + -------- + gators.binning.CustomBinning + Bin using user input splits. + gators.binning.Binning + Bin using equal splits. + gators.binning.CustomBinning + Bin using the variable quantiles. + + """ + + def __init__( + self, tree: Union[DecisionTreeClassifier, DecisionTreeRegressor], inplace=False + ): + _BaseBinning.__init__(self, n_bins=1, inplace=inplace) + self.tree = tree + + def fit(self, X: DataFrame, y) -> "TreeBinning": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + "TreeBinning" + Instance of itself. + """ + self.check_dataframe(X) + self.check_target(X, y) + self.base_columns = list(X.columns) + self.columns = util.get_numerical_columns(X) + self.column_names = [f"{c}__bin" for c in self.columns] + self.idx_columns = util.get_idx_columns(X.columns, self.columns) + n_cols = self.idx_columns.size + if n_cols == 0: + return self + self.bins = {} + for c in self.columns: + self.tree.fit( + util.get_function(X).to_numpy(X[[c]]).astype(np.float32), + util.get_function(X).to_numpy(y).astype(np.int32), + ) + splits = sorted( + [ + float(node.split("<=")[1]) + for node in tree.export_text(self.tree, decimals=6).split("| ") + if "<=" in node + ] + ) + self.bins[c] = ( + np.unique( + [-np.inf] + + [util.prettify_number(x, precision=2) for x in splits] + + [np.inf] + ) + if len(splits) + else np.array([-np.inf, np.inf]) + ) + max_bins = max(len(v) for v in self.bins.values()) + self.bins_np = np.inf * np.ones((max_bins, n_cols)) + for i, b in enumerate(self.bins.values()): + self.bins_np[: len(b), i] = b + self.bins_dict = {col: np.unique(self.bins[col]) for col in self.bins} + self.pretty_bins_dict = { + k: [util.prettify_number(x, precision=2) for x in v] + for k, v in self.bins_dict.items() + } + self.labels, self.labels_np = self.get_labels(self.pretty_bins_dict) + return self diff --git a/gators/clipping/__init__.py b/gators/clipping/__init__.py index 71cd4b28..59aa0d3d 100644 --- a/gators/clipping/__init__.py +++ b/gators/clipping/__init__.py @@ -1,5 +1,7 @@ from .clipping import Clipping +from .quantile_clipping import QuantileClipping __all__ = [ "Clipping", + "QuantileClipping", ] diff --git a/gators/clipping/__pycache__/__init__.cpython-38.pyc b/gators/clipping/__pycache__/__init__.cpython-38.pyc index b30600df..0a7e7aaa 100644 Binary files a/gators/clipping/__pycache__/__init__.cpython-38.pyc and b/gators/clipping/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/clipping/__pycache__/clipping.cpython-38.pyc b/gators/clipping/__pycache__/clipping.cpython-38.pyc index b20364d1..413aee51 100644 Binary files a/gators/clipping/__pycache__/clipping.cpython-38.pyc and b/gators/clipping/__pycache__/clipping.cpython-38.pyc differ diff --git a/gators/clipping/clipping.c b/gators/clipping/clipping.c new file mode 100644 index 00000000..aba2c69f --- /dev/null +++ b/gators/clipping/clipping.c @@ -0,0 +1,38576 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "clipping", + "sources": [ + "gators/clipping/clipping.pyx" + ] + }, + "module_name": "clipping" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__clipping +#define __PYX_HAVE_API__clipping +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#include "pythread.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/clipping/clipping.pyx", + "", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS +#define __pyx_atomic_int_type int +#define __pyx_nonatomic_int_type int +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__)) + #include +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ + (defined(_MSC_VER) && _MSC_VER >= 1700))) + #include +#endif +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type atomic_int + #define __pyx_atomic_incr_aligned(value) atomic_fetch_add_explicit(value, 1, memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) atomic_fetch_sub_explicit(value, 1, memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C atomics" + #endif +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ +\ + (defined(_MSC_VER) && _MSC_VER >= 1700)) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type std::atomic_int + #define __pyx_atomic_incr_aligned(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) std::atomic_fetch_sub_explicit(value, 1, std::memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C++ atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C++ atomics" + #endif +#elif CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 &&\ + (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2)))) + #define __pyx_atomic_incr_aligned(value) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type long + #undef __pyx_nonatomic_int_type + #define __pyx_nonatomic_int_type long + #pragma intrinsic (_InterlockedExchangeAdd) + #define __pyx_atomic_incr_aligned(value) _InterlockedExchangeAdd(value, 1) + #define __pyx_atomic_decr_aligned(value) _InterlockedExchangeAdd(value, -1) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview)) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview)) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_defaults; +typedef struct __pyx_defaults __pyx_defaults; +struct __pyx_defaults1; +typedef struct __pyx_defaults1 __pyx_defaults1; +struct __pyx_defaults { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults1 { + PyObject *__pyx_arg__fused_sigindex; +}; + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":302 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int_type acquisition_count; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); + PyObject *(*_get_base)(struct __pyx_memoryview_obj *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* BuildPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char); + +/* JoinPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* PyObjectFormatSimple.proto */ +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#elif PY_MAJOR_VERSION < 3 + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") :\ + PyObject_Format(s, f)) +#elif CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_repr(s) :\ + likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_repr(s) :\ + PyObject_Format(s, f)) +#else + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#endif + +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* DivInt[Py_ssize_t].proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define __Pyx_UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* AssertionsEnabled.proto */ +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (1) +#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) + static int __pyx_assertions_enabled_flag; + #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) + static int __Pyx_init_assertions_enabled(void) { + PyObject *builtins, *debug, *debug_str; + int flag; + builtins = PyEval_GetBuiltins(); + if (!builtins) goto bad; + debug_str = PyUnicode_FromStringAndSize("__debug__", 9); + if (!debug_str) goto bad; + debug = PyObject_GetItem(builtins, debug_str); + Py_DECREF(debug_str); + if (!debug) goto bad; + flag = PyObject_IsTrue(debug); + Py_DECREF(debug); + if (flag == -1) goto bad; + __pyx_assertions_enabled_flag = flag; + return 0; + bad: + __pyx_assertions_enabled_flag = 1; + return -1; + } +#else + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (!Py_OptimizeFlag) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* PySequenceMultiply.proto */ +#define __Pyx_PySequence_Multiply_Left(mul, seq) __Pyx_PySequence_Multiply(seq, mul) +static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul); + +/* SetItemInt.proto */ +#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, + int is_list, int wraparound, int boundscheck); + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* DivInt[long].proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 +#define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) +#else +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); +#endif + +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_itemsize(o) PyMemoryView_GET_BUFFER(o)->itemsize +#else + // can't get format like this unfortunately. It's unicode via getattr +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj); +#endif + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_ndim(o) PyMemoryView_GET_BUFFER(o)->ndim +#else + // can't get format like this unfortunately. It's unicode via getattr +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj); +#endif + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* py_dict_values.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d); + +/* UnpackUnboundCMethod.proto */ +typedef struct { + PyObject *type; + PyObject **method_name; + PyCFunction func; + PyObject *method; + int flag; +} __Pyx_CachedCFunction; + +/* CallUnboundCMethod0.proto */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CallUnboundCMethod0(cfunc, self)\ + (likely((cfunc)->func) ?\ + (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) :\ + (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\ + (PY_VERSION_HEX >= 0x030700A0 ?\ + (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\ + (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\ + (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\ + ((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, __pyx_empty_tuple) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)) +#else +#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self) +#endif + +/* dict_getitem_default.proto */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); + +/* CallUnboundCMethod1.proto */ +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#else +#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg) +#endif + +/* CallUnboundCMethod2.proto */ +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2); +#else +#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2) __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* FusedFunction.proto */ +typedef struct { + __pyx_CyFunctionObject func; + PyObject *__signatures__; + PyObject *self; +} __pyx_FusedFunctionObject; +static PyObject *__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code); +static int __pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self); +static int __pyx_FusedFunction_init(PyObject *module); +#define __Pyx_FusedFunction_USED + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int8_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *, int writable_flag); + +/* PyUCS4InUnicode.proto */ +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (&memview->acquisition_count) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XCLEAR_MEMVIEW(slice, have_gil) __Pyx_XCLEAR_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* ImportNumPyArray.proto */ +static PyObject *__pyx_numpy_ndarray = NULL; +static PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "clipping" */ +static PyObject *__pyx_collections_abc_Sequence = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static PyArrayObject *__pyx_fuse_0__pyx_f_8clipping_clipping(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_8clipping_clipping(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_8clipping_clipping(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_8clipping_clipping(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_8clipping_clipping(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_5__pyx_f_8clipping_clipping(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_8clipping__clipping(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_8clipping__clipping(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_8clipping__clipping(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_8clipping__clipping(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_8clipping__clipping(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_5__pyx_f_8clipping__clipping(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static int assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, PyObject *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, PyObject *); /*proto*/ +static int __pyx_memoryview_err_no_memory(void); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t = { "int8_t", NULL, sizeof(__pyx_t_5numpy_int8_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int8_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int8_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t = { "int16_t", NULL, sizeof(__pyx_t_5numpy_int16_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int16_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int16_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int32_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t = { "float32_t", NULL, sizeof(__pyx_t_5numpy_float32_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "clipping" +extern int __pyx_module_is_main_clipping; +int __pyx_module_is_main_clipping = 0; + +/* Implementation of "clipping" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin___import__; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_AssertionError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = ": "; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_X[] = "X"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_s[] = "s"; +static const char __pyx_k__2[] = "."; +static const char __pyx_k__3[] = "*"; +static const char __pyx_k__6[] = "'"; +static const char __pyx_k__7[] = ")"; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__11[] = "()"; +static const char __pyx_k__12[] = "|"; +static const char __pyx_k__42[] = "?"; +static const char __pyx_k_abc[] = "abc"; +static const char __pyx_k_and[] = " and "; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_got[] = " (got "; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_kind[] = "kind"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_count[] = "count"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_index[] = "index"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_split[] = "split"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_strip[] = "strip"; +static const char __pyx_k_enable[] = "enable"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_int8_t[] = "int8_t"; +static const char __pyx_k_kwargs[] = "kwargs"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_values[] = "values"; +static const char __pyx_k_clip_np[] = "clip_np"; +static const char __pyx_k_disable[] = "disable"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_int16_t[] = "int16_t"; +static const char __pyx_k_int32_t[] = "int32_t"; +static const char __pyx_k_int64_t[] = "int64_t"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_Sequence[] = "Sequence"; +static const char __pyx_k_clipping[] = "clipping"; +static const char __pyx_k_defaults[] = "defaults"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_register[] = "register"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_float32_t[] = "float32_t"; +static const char __pyx_k_float64_t[] = "float64_t"; +static const char __pyx_k_isenabled[] = "isenabled"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_clipping_2[] = "_clipping"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_signatures[] = "signatures"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_collections[] = "collections"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = ""; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_class_getitem[] = "__class_getitem__"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_AssertionError[] = "AssertionError"; +static const char __pyx_k_fused_sigindex[] = "_fused_sigindex"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_collections_abc[] = "collections.abc"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_pyx_fuse_0clipping[] = "__pyx_fuse_0clipping"; +static const char __pyx_k_pyx_fuse_1clipping[] = "__pyx_fuse_1clipping"; +static const char __pyx_k_pyx_fuse_2clipping[] = "__pyx_fuse_2clipping"; +static const char __pyx_k_pyx_fuse_3clipping[] = "__pyx_fuse_3clipping"; +static const char __pyx_k_pyx_fuse_4clipping[] = "__pyx_fuse_4clipping"; +static const char __pyx_k_pyx_fuse_5clipping[] = "__pyx_fuse_5clipping"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_pyx_fuse_0_clipping[] = "__pyx_fuse_0_clipping"; +static const char __pyx_k_pyx_fuse_1_clipping[] = "__pyx_fuse_1_clipping"; +static const char __pyx_k_pyx_fuse_2_clipping[] = "__pyx_fuse_2_clipping"; +static const char __pyx_k_pyx_fuse_3_clipping[] = "__pyx_fuse_3_clipping"; +static const char __pyx_k_pyx_fuse_4_clipping[] = "__pyx_fuse_4_clipping"; +static const char __pyx_k_pyx_fuse_5_clipping[] = "__pyx_fuse_5_clipping"; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_Invalid_shape_in_axis[] = "Invalid shape in axis "; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_Cannot_index_with_type[] = "Cannot index with type '"; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_Dimension_d_is_not_direct[] = "Dimension %d is not direct"; +static const char __pyx_k_Index_out_of_bounds_axis_d[] = "Index out of bounds (axis %d)"; +static const char __pyx_k_No_matching_signature_found[] = "No matching signature found"; +static const char __pyx_k_Step_may_not_be_zero_axis_d[] = "Step may not be zero (axis %d)"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_gators_clipping_clipping_pyx[] = "gators/clipping/clipping.pyx"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_All_dimensions_preceding_dimensi[] = "All dimensions preceding dimension %d must be indexed and not sliced"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Cannot_transpose_memoryview_with[] = "Cannot transpose memoryview with indirect dimensions"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Expected_at_least_d_argument_s_g[] = "Expected at least %d argument%s, got %d"; +static const char __pyx_k_Function_call_with_ambiguous_arg[] = "Function call with ambiguous argument types"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got "; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis "; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension "; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +/* #### Code section: decls ### */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_8clipping_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_8clipping_4__pyx_fuse_0clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_6__pyx_fuse_1clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_8__pyx_fuse_2clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_10__pyx_fuse_3clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_12__pyx_fuse_4clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_14__pyx_fuse_5clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_2_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_8clipping_18__pyx_fuse_0_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_20__pyx_fuse_1_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_22__pyx_fuse_2_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_24__pyx_fuse_3_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_26__pyx_fuse_4_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_pf_8clipping_28__pyx_fuse_5_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, 0, 0, 0, 0}; +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_values = {0, 0, 0, 0, 0}; +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type___pyx_array; + PyObject *__pyx_type___pyx_MemviewEnum; + PyObject *__pyx_type___pyx_memoryview; + PyObject *__pyx_type___pyx_memoryviewslice; + #endif + PyTypeObject *__pyx_array_type; + PyTypeObject *__pyx_MemviewEnum_type; + PyTypeObject *__pyx_memoryview_type; + PyTypeObject *__pyx_memoryviewslice_type; + PyObject *__pyx_kp_u_; + PyObject *__pyx_n_s_ASCII; + PyObject *__pyx_kp_s_All_dimensions_preceding_dimensi; + PyObject *__pyx_n_s_AssertionError; + PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; + PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; + PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; + PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; + PyObject *__pyx_kp_u_Cannot_index_with_type; + PyObject *__pyx_kp_s_Cannot_transpose_memoryview_with; + PyObject *__pyx_kp_s_Dimension_d_is_not_direct; + PyObject *__pyx_n_s_Ellipsis; + PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; + PyObject *__pyx_kp_s_Expected_at_least_d_argument_s_g; + PyObject *__pyx_kp_s_Function_call_with_ambiguous_arg; + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + PyObject *__pyx_n_s_IndexError; + PyObject *__pyx_kp_s_Index_out_of_bounds_axis_d; + PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; + PyObject *__pyx_kp_u_Invalid_mode_expected_c_or_fortr; + PyObject *__pyx_kp_u_Invalid_shape_in_axis; + PyObject *__pyx_n_s_MemoryError; + PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; + PyObject *__pyx_kp_s_MemoryView_of_r_object; + PyObject *__pyx_kp_s_No_matching_signature_found; + PyObject *__pyx_n_b_O; + PyObject *__pyx_kp_u_Out_of_bounds_on_buffer_access_a; + PyObject *__pyx_n_s_PickleError; + PyObject *__pyx_n_s_Sequence; + PyObject *__pyx_kp_s_Step_may_not_be_zero_axis_d; + PyObject *__pyx_n_s_TypeError; + PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; + PyObject *__pyx_n_s_ValueError; + PyObject *__pyx_n_s_View_MemoryView; + PyObject *__pyx_n_s_X; + PyObject *__pyx_kp_s__11; + PyObject *__pyx_kp_s__12; + PyObject *__pyx_kp_u__12; + PyObject *__pyx_kp_u__2; + PyObject *__pyx_n_s__3; + PyObject *__pyx_n_s__42; + PyObject *__pyx_kp_u__6; + PyObject *__pyx_kp_u__7; + PyObject *__pyx_n_s_abc; + PyObject *__pyx_n_s_allocate_buffer; + PyObject *__pyx_kp_u_and; + PyObject *__pyx_n_s_args; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_base; + PyObject *__pyx_n_s_c; + PyObject *__pyx_n_u_c; + PyObject *__pyx_n_s_class; + PyObject *__pyx_n_s_class_getitem; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_clip_np; + PyObject *__pyx_n_s_clipping; + PyObject *__pyx_n_s_clipping_2; + PyObject *__pyx_n_s_collections; + PyObject *__pyx_kp_s_collections_abc; + PyObject *__pyx_kp_s_contiguous_and_direct; + PyObject *__pyx_kp_s_contiguous_and_indirect; + PyObject *__pyx_n_s_count; + PyObject *__pyx_n_s_defaults; + PyObject *__pyx_n_s_dict; + PyObject *__pyx_kp_u_disable; + PyObject *__pyx_n_s_dtype; + PyObject *__pyx_n_s_dtype_is_object; + PyObject *__pyx_kp_u_enable; + PyObject *__pyx_n_s_encode; + PyObject *__pyx_n_s_enumerate; + PyObject *__pyx_n_s_error; + PyObject *__pyx_n_s_flags; + PyObject *__pyx_n_s_float32_t; + PyObject *__pyx_n_s_float64_t; + PyObject *__pyx_n_s_format; + PyObject *__pyx_n_s_fortran; + PyObject *__pyx_n_u_fortran; + PyObject *__pyx_n_s_fused_sigindex; + PyObject *__pyx_kp_s_gators_clipping_clipping_pyx; + PyObject *__pyx_kp_u_gc; + PyObject *__pyx_n_s_get; + PyObject *__pyx_n_s_getstate; + PyObject *__pyx_kp_u_got; + PyObject *__pyx_kp_u_got_differing_extents_in_dimensi; + PyObject *__pyx_n_s_id; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_index; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_int16_t; + PyObject *__pyx_n_s_int32_t; + PyObject *__pyx_n_s_int64_t; + PyObject *__pyx_n_s_int8_t; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_kp_u_isenabled; + PyObject *__pyx_n_s_itemsize; + PyObject *__pyx_kp_s_itemsize_0_for_cython_array; + PyObject *__pyx_n_s_kind; + PyObject *__pyx_n_s_kwargs; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_memview; + PyObject *__pyx_n_s_mode; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_name_2; + PyObject *__pyx_n_s_ndim; + PyObject *__pyx_n_s_new; + PyObject *__pyx_kp_s_no_default___reduce___due_to_non; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_obj; + PyObject *__pyx_n_s_pack; + PyObject *__pyx_n_s_pickle; + PyObject *__pyx_n_s_pyx_PickleError; + PyObject *__pyx_n_s_pyx_checksum; + PyObject *__pyx_n_s_pyx_fuse_0_clipping; + PyObject *__pyx_n_s_pyx_fuse_0clipping; + PyObject *__pyx_n_s_pyx_fuse_1_clipping; + PyObject *__pyx_n_s_pyx_fuse_1clipping; + PyObject *__pyx_n_s_pyx_fuse_2_clipping; + PyObject *__pyx_n_s_pyx_fuse_2clipping; + PyObject *__pyx_n_s_pyx_fuse_3_clipping; + PyObject *__pyx_n_s_pyx_fuse_3clipping; + PyObject *__pyx_n_s_pyx_fuse_4_clipping; + PyObject *__pyx_n_s_pyx_fuse_4clipping; + PyObject *__pyx_n_s_pyx_fuse_5_clipping; + PyObject *__pyx_n_s_pyx_fuse_5clipping; + PyObject *__pyx_n_s_pyx_result; + PyObject *__pyx_n_s_pyx_state; + PyObject *__pyx_n_s_pyx_type; + PyObject *__pyx_n_s_pyx_unpickle_Enum; + PyObject *__pyx_n_s_pyx_vtable; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_reduce; + PyObject *__pyx_n_s_reduce_cython; + PyObject *__pyx_n_s_reduce_ex; + PyObject *__pyx_n_s_register; + PyObject *__pyx_n_s_s; + PyObject *__pyx_n_s_setstate; + PyObject *__pyx_n_s_setstate_cython; + PyObject *__pyx_n_s_shape; + PyObject *__pyx_n_s_signatures; + PyObject *__pyx_n_s_size; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_split; + PyObject *__pyx_n_s_start; + PyObject *__pyx_n_s_step; + PyObject *__pyx_n_s_stop; + PyObject *__pyx_kp_s_strided_and_direct; + PyObject *__pyx_kp_s_strided_and_direct_or_indirect; + PyObject *__pyx_kp_s_strided_and_indirect; + PyObject *__pyx_kp_s_stringsource; + PyObject *__pyx_n_s_strip; + PyObject *__pyx_n_s_struct; + PyObject *__pyx_n_s_sys; + PyObject *__pyx_n_s_test; + PyObject *__pyx_kp_s_unable_to_allocate_array_data; + PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; + PyObject *__pyx_n_s_unpack; + PyObject *__pyx_n_s_update; + PyObject *__pyx_n_s_values; + PyObject *__pyx_n_s_version_info; + PyObject *__pyx_int_0; + PyObject *__pyx_int_1; + PyObject *__pyx_int_2; + PyObject *__pyx_int_3; + PyObject *__pyx_int_112105877; + PyObject *__pyx_int_136983863; + PyObject *__pyx_int_184977713; + PyObject *__pyx_int_neg_1; + PyObject *__pyx_slice__5; + PyObject *__pyx_tuple__4; + PyObject *__pyx_tuple__8; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__10; + PyObject *__pyx_tuple__13; + PyObject *__pyx_tuple__14; + PyObject *__pyx_tuple__15; + PyObject *__pyx_tuple__16; + PyObject *__pyx_tuple__17; + PyObject *__pyx_tuple__18; + PyObject *__pyx_tuple__19; + PyObject *__pyx_tuple__20; + PyObject *__pyx_tuple__21; + PyObject *__pyx_tuple__22; + PyObject *__pyx_tuple__23; + PyObject *__pyx_tuple__24; + PyObject *__pyx_tuple__26; + PyObject *__pyx_tuple__34; + PyObject *__pyx_codeobj__25; + PyObject *__pyx_codeobj__27; + PyObject *__pyx_codeobj__28; + PyObject *__pyx_codeobj__29; + PyObject *__pyx_codeobj__30; + PyObject *__pyx_codeobj__31; + PyObject *__pyx_codeobj__32; + PyObject *__pyx_codeobj__33; + PyObject *__pyx_codeobj__35; + PyObject *__pyx_codeobj__36; + PyObject *__pyx_codeobj__37; + PyObject *__pyx_codeobj__38; + PyObject *__pyx_codeobj__39; + PyObject *__pyx_codeobj__40; + PyObject *__pyx_codeobj__41; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_array_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_array); + Py_CLEAR(clear_module_state->__pyx_MemviewEnum_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_MemviewEnum); + Py_CLEAR(clear_module_state->__pyx_memoryview_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryview); + Py_CLEAR(clear_module_state->__pyx_memoryviewslice_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryviewslice); + Py_CLEAR(clear_module_state->__pyx_kp_u_); + Py_CLEAR(clear_module_state->__pyx_n_s_ASCII); + Py_CLEAR(clear_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_CLEAR(clear_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_CLEAR(clear_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_CLEAR(clear_module_state->__pyx_n_s_Ellipsis); + Py_CLEAR(clear_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_CLEAR(clear_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_n_s_IndexError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_CLEAR(clear_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_CLEAR(clear_module_state->__pyx_kp_s_No_matching_signature_found); + Py_CLEAR(clear_module_state->__pyx_n_b_O); + Py_CLEAR(clear_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_Sequence); + Py_CLEAR(clear_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); + Py_CLEAR(clear_module_state->__pyx_n_s_View_MemoryView); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_kp_s__11); + Py_CLEAR(clear_module_state->__pyx_kp_s__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__2); + Py_CLEAR(clear_module_state->__pyx_n_s__3); + Py_CLEAR(clear_module_state->__pyx_n_s__42); + Py_CLEAR(clear_module_state->__pyx_kp_u__6); + Py_CLEAR(clear_module_state->__pyx_kp_u__7); + Py_CLEAR(clear_module_state->__pyx_n_s_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_allocate_buffer); + Py_CLEAR(clear_module_state->__pyx_kp_u_and); + Py_CLEAR(clear_module_state->__pyx_n_s_args); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_base); + Py_CLEAR(clear_module_state->__pyx_n_s_c); + Py_CLEAR(clear_module_state->__pyx_n_u_c); + Py_CLEAR(clear_module_state->__pyx_n_s_class); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_clip_np); + Py_CLEAR(clear_module_state->__pyx_n_s_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_clipping_2); + Py_CLEAR(clear_module_state->__pyx_n_s_collections); + Py_CLEAR(clear_module_state->__pyx_kp_s_collections_abc); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_CLEAR(clear_module_state->__pyx_n_s_count); + Py_CLEAR(clear_module_state->__pyx_n_s_defaults); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype_is_object); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_encode); + Py_CLEAR(clear_module_state->__pyx_n_s_enumerate); + Py_CLEAR(clear_module_state->__pyx_n_s_error); + Py_CLEAR(clear_module_state->__pyx_n_s_flags); + Py_CLEAR(clear_module_state->__pyx_n_s_float32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_float64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_format); + Py_CLEAR(clear_module_state->__pyx_n_s_fortran); + Py_CLEAR(clear_module_state->__pyx_n_u_fortran); + Py_CLEAR(clear_module_state->__pyx_n_s_fused_sigindex); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_clipping_clipping_pyx); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_kp_u_got); + Py_CLEAR(clear_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_id); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_index); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_int16_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int8_t); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_itemsize); + Py_CLEAR(clear_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_CLEAR(clear_module_state->__pyx_n_s_kind); + Py_CLEAR(clear_module_state->__pyx_n_s_kwargs); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_memview); + Py_CLEAR(clear_module_state->__pyx_n_s_mode); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_name_2); + Py_CLEAR(clear_module_state->__pyx_n_s_ndim); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_pack); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_5_clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_5clipping); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_register); + Py_CLEAR(clear_module_state->__pyx_n_s_s); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_shape); + Py_CLEAR(clear_module_state->__pyx_n_s_signatures); + Py_CLEAR(clear_module_state->__pyx_n_s_size); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_split); + Py_CLEAR(clear_module_state->__pyx_n_s_start); + Py_CLEAR(clear_module_state->__pyx_n_s_step); + Py_CLEAR(clear_module_state->__pyx_n_s_stop); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_strip); + Py_CLEAR(clear_module_state->__pyx_n_s_struct); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_CLEAR(clear_module_state->__pyx_n_s_unpack); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_values); + Py_CLEAR(clear_module_state->__pyx_n_s_version_info); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_2); + Py_CLEAR(clear_module_state->__pyx_int_3); + Py_CLEAR(clear_module_state->__pyx_int_112105877); + Py_CLEAR(clear_module_state->__pyx_int_136983863); + Py_CLEAR(clear_module_state->__pyx_int_184977713); + Py_CLEAR(clear_module_state->__pyx_int_neg_1); + Py_CLEAR(clear_module_state->__pyx_slice__5); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_tuple__8); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__10); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__15); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_tuple__17); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__19); + Py_CLEAR(clear_module_state->__pyx_tuple__20); + Py_CLEAR(clear_module_state->__pyx_tuple__21); + Py_CLEAR(clear_module_state->__pyx_tuple__22); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__24); + Py_CLEAR(clear_module_state->__pyx_tuple__26); + Py_CLEAR(clear_module_state->__pyx_tuple__34); + Py_CLEAR(clear_module_state->__pyx_codeobj__25); + Py_CLEAR(clear_module_state->__pyx_codeobj__27); + Py_CLEAR(clear_module_state->__pyx_codeobj__28); + Py_CLEAR(clear_module_state->__pyx_codeobj__29); + Py_CLEAR(clear_module_state->__pyx_codeobj__30); + Py_CLEAR(clear_module_state->__pyx_codeobj__31); + Py_CLEAR(clear_module_state->__pyx_codeobj__32); + Py_CLEAR(clear_module_state->__pyx_codeobj__33); + Py_CLEAR(clear_module_state->__pyx_codeobj__35); + Py_CLEAR(clear_module_state->__pyx_codeobj__36); + Py_CLEAR(clear_module_state->__pyx_codeobj__37); + Py_CLEAR(clear_module_state->__pyx_codeobj__38); + Py_CLEAR(clear_module_state->__pyx_codeobj__39); + Py_CLEAR(clear_module_state->__pyx_codeobj__40); + Py_CLEAR(clear_module_state->__pyx_codeobj__41); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_array_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_array); + Py_VISIT(traverse_module_state->__pyx_MemviewEnum_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_MemviewEnum); + Py_VISIT(traverse_module_state->__pyx_memoryview_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryview); + Py_VISIT(traverse_module_state->__pyx_memoryviewslice_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryviewslice); + Py_VISIT(traverse_module_state->__pyx_kp_u_); + Py_VISIT(traverse_module_state->__pyx_n_s_ASCII); + Py_VISIT(traverse_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_VISIT(traverse_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_VISIT(traverse_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_VISIT(traverse_module_state->__pyx_n_s_Ellipsis); + Py_VISIT(traverse_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_VISIT(traverse_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_n_s_IndexError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_VISIT(traverse_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_VISIT(traverse_module_state->__pyx_kp_s_No_matching_signature_found); + Py_VISIT(traverse_module_state->__pyx_n_b_O); + Py_VISIT(traverse_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_Sequence); + Py_VISIT(traverse_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); + Py_VISIT(traverse_module_state->__pyx_n_s_View_MemoryView); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_kp_s__11); + Py_VISIT(traverse_module_state->__pyx_kp_s__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__2); + Py_VISIT(traverse_module_state->__pyx_n_s__3); + Py_VISIT(traverse_module_state->__pyx_n_s__42); + Py_VISIT(traverse_module_state->__pyx_kp_u__6); + Py_VISIT(traverse_module_state->__pyx_kp_u__7); + Py_VISIT(traverse_module_state->__pyx_n_s_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_allocate_buffer); + Py_VISIT(traverse_module_state->__pyx_kp_u_and); + Py_VISIT(traverse_module_state->__pyx_n_s_args); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_base); + Py_VISIT(traverse_module_state->__pyx_n_s_c); + Py_VISIT(traverse_module_state->__pyx_n_u_c); + Py_VISIT(traverse_module_state->__pyx_n_s_class); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_clip_np); + Py_VISIT(traverse_module_state->__pyx_n_s_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_clipping_2); + Py_VISIT(traverse_module_state->__pyx_n_s_collections); + Py_VISIT(traverse_module_state->__pyx_kp_s_collections_abc); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_VISIT(traverse_module_state->__pyx_n_s_count); + Py_VISIT(traverse_module_state->__pyx_n_s_defaults); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype_is_object); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_encode); + Py_VISIT(traverse_module_state->__pyx_n_s_enumerate); + Py_VISIT(traverse_module_state->__pyx_n_s_error); + Py_VISIT(traverse_module_state->__pyx_n_s_flags); + Py_VISIT(traverse_module_state->__pyx_n_s_float32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_float64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_format); + Py_VISIT(traverse_module_state->__pyx_n_s_fortran); + Py_VISIT(traverse_module_state->__pyx_n_u_fortran); + Py_VISIT(traverse_module_state->__pyx_n_s_fused_sigindex); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_clipping_clipping_pyx); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_kp_u_got); + Py_VISIT(traverse_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_id); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_index); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_int16_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int8_t); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_itemsize); + Py_VISIT(traverse_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_VISIT(traverse_module_state->__pyx_n_s_kind); + Py_VISIT(traverse_module_state->__pyx_n_s_kwargs); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_memview); + Py_VISIT(traverse_module_state->__pyx_n_s_mode); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_name_2); + Py_VISIT(traverse_module_state->__pyx_n_s_ndim); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_pack); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_5_clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_5clipping); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_register); + Py_VISIT(traverse_module_state->__pyx_n_s_s); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_shape); + Py_VISIT(traverse_module_state->__pyx_n_s_signatures); + Py_VISIT(traverse_module_state->__pyx_n_s_size); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_split); + Py_VISIT(traverse_module_state->__pyx_n_s_start); + Py_VISIT(traverse_module_state->__pyx_n_s_step); + Py_VISIT(traverse_module_state->__pyx_n_s_stop); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_strip); + Py_VISIT(traverse_module_state->__pyx_n_s_struct); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_VISIT(traverse_module_state->__pyx_n_s_unpack); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_values); + Py_VISIT(traverse_module_state->__pyx_n_s_version_info); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_2); + Py_VISIT(traverse_module_state->__pyx_int_3); + Py_VISIT(traverse_module_state->__pyx_int_112105877); + Py_VISIT(traverse_module_state->__pyx_int_136983863); + Py_VISIT(traverse_module_state->__pyx_int_184977713); + Py_VISIT(traverse_module_state->__pyx_int_neg_1); + Py_VISIT(traverse_module_state->__pyx_slice__5); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_tuple__8); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__10); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__15); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_tuple__17); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__19); + Py_VISIT(traverse_module_state->__pyx_tuple__20); + Py_VISIT(traverse_module_state->__pyx_tuple__21); + Py_VISIT(traverse_module_state->__pyx_tuple__22); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__24); + Py_VISIT(traverse_module_state->__pyx_tuple__26); + Py_VISIT(traverse_module_state->__pyx_tuple__34); + Py_VISIT(traverse_module_state->__pyx_codeobj__25); + Py_VISIT(traverse_module_state->__pyx_codeobj__27); + Py_VISIT(traverse_module_state->__pyx_codeobj__28); + Py_VISIT(traverse_module_state->__pyx_codeobj__29); + Py_VISIT(traverse_module_state->__pyx_codeobj__30); + Py_VISIT(traverse_module_state->__pyx_codeobj__31); + Py_VISIT(traverse_module_state->__pyx_codeobj__32); + Py_VISIT(traverse_module_state->__pyx_codeobj__33); + Py_VISIT(traverse_module_state->__pyx_codeobj__35); + Py_VISIT(traverse_module_state->__pyx_codeobj__36); + Py_VISIT(traverse_module_state->__pyx_codeobj__37); + Py_VISIT(traverse_module_state->__pyx_codeobj__38); + Py_VISIT(traverse_module_state->__pyx_codeobj__39); + Py_VISIT(traverse_module_state->__pyx_codeobj__40); + Py_VISIT(traverse_module_state->__pyx_codeobj__41); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#define __pyx_type___pyx_array __pyx_mstate_global->__pyx_type___pyx_array +#define __pyx_type___pyx_MemviewEnum __pyx_mstate_global->__pyx_type___pyx_MemviewEnum +#define __pyx_type___pyx_memoryview __pyx_mstate_global->__pyx_type___pyx_memoryview +#define __pyx_type___pyx_memoryviewslice __pyx_mstate_global->__pyx_type___pyx_memoryviewslice +#endif +#define __pyx_array_type __pyx_mstate_global->__pyx_array_type +#define __pyx_MemviewEnum_type __pyx_mstate_global->__pyx_MemviewEnum_type +#define __pyx_memoryview_type __pyx_mstate_global->__pyx_memoryview_type +#define __pyx_memoryviewslice_type __pyx_mstate_global->__pyx_memoryviewslice_type +#define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ +#define __pyx_n_s_ASCII __pyx_mstate_global->__pyx_n_s_ASCII +#define __pyx_kp_s_All_dimensions_preceding_dimensi __pyx_mstate_global->__pyx_kp_s_All_dimensions_preceding_dimensi +#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError +#define __pyx_kp_s_Buffer_view_does_not_expose_stri __pyx_mstate_global->__pyx_kp_s_Buffer_view_does_not_expose_stri +#define __pyx_kp_s_Can_only_create_a_buffer_that_is __pyx_mstate_global->__pyx_kp_s_Can_only_create_a_buffer_that_is +#define __pyx_kp_s_Cannot_assign_to_read_only_memor __pyx_mstate_global->__pyx_kp_s_Cannot_assign_to_read_only_memor +#define __pyx_kp_s_Cannot_create_writable_memory_vi __pyx_mstate_global->__pyx_kp_s_Cannot_create_writable_memory_vi +#define __pyx_kp_u_Cannot_index_with_type __pyx_mstate_global->__pyx_kp_u_Cannot_index_with_type +#define __pyx_kp_s_Cannot_transpose_memoryview_with __pyx_mstate_global->__pyx_kp_s_Cannot_transpose_memoryview_with +#define __pyx_kp_s_Dimension_d_is_not_direct __pyx_mstate_global->__pyx_kp_s_Dimension_d_is_not_direct +#define __pyx_n_s_Ellipsis __pyx_mstate_global->__pyx_n_s_Ellipsis +#define __pyx_kp_s_Empty_shape_tuple_for_cython_arr __pyx_mstate_global->__pyx_kp_s_Empty_shape_tuple_for_cython_arr +#define __pyx_kp_s_Expected_at_least_d_argument_s_g __pyx_mstate_global->__pyx_kp_s_Expected_at_least_d_argument_s_g +#define __pyx_kp_s_Function_call_with_ambiguous_arg __pyx_mstate_global->__pyx_kp_s_Function_call_with_ambiguous_arg +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_n_s_IndexError __pyx_mstate_global->__pyx_n_s_IndexError +#define __pyx_kp_s_Index_out_of_bounds_axis_d __pyx_mstate_global->__pyx_kp_s_Index_out_of_bounds_axis_d +#define __pyx_kp_s_Indirect_dimensions_not_supporte __pyx_mstate_global->__pyx_kp_s_Indirect_dimensions_not_supporte +#define __pyx_kp_u_Invalid_mode_expected_c_or_fortr __pyx_mstate_global->__pyx_kp_u_Invalid_mode_expected_c_or_fortr +#define __pyx_kp_u_Invalid_shape_in_axis __pyx_mstate_global->__pyx_kp_u_Invalid_shape_in_axis +#define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError +#define __pyx_kp_s_MemoryView_of_r_at_0x_x __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_at_0x_x +#define __pyx_kp_s_MemoryView_of_r_object __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_object +#define __pyx_kp_s_No_matching_signature_found __pyx_mstate_global->__pyx_kp_s_No_matching_signature_found +#define __pyx_n_b_O __pyx_mstate_global->__pyx_n_b_O +#define __pyx_kp_u_Out_of_bounds_on_buffer_access_a __pyx_mstate_global->__pyx_kp_u_Out_of_bounds_on_buffer_access_a +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_Sequence __pyx_mstate_global->__pyx_n_s_Sequence +#define __pyx_kp_s_Step_may_not_be_zero_axis_d __pyx_mstate_global->__pyx_kp_s_Step_may_not_be_zero_axis_d +#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError +#define __pyx_kp_s_Unable_to_convert_item_to_object __pyx_mstate_global->__pyx_kp_s_Unable_to_convert_item_to_object +#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError +#define __pyx_n_s_View_MemoryView __pyx_mstate_global->__pyx_n_s_View_MemoryView +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_kp_s__11 __pyx_mstate_global->__pyx_kp_s__11 +#define __pyx_kp_s__12 __pyx_mstate_global->__pyx_kp_s__12 +#define __pyx_kp_u__12 __pyx_mstate_global->__pyx_kp_u__12 +#define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 +#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 +#define __pyx_n_s__42 __pyx_mstate_global->__pyx_n_s__42 +#define __pyx_kp_u__6 __pyx_mstate_global->__pyx_kp_u__6 +#define __pyx_kp_u__7 __pyx_mstate_global->__pyx_kp_u__7 +#define __pyx_n_s_abc __pyx_mstate_global->__pyx_n_s_abc +#define __pyx_n_s_allocate_buffer __pyx_mstate_global->__pyx_n_s_allocate_buffer +#define __pyx_kp_u_and __pyx_mstate_global->__pyx_kp_u_and +#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_base __pyx_mstate_global->__pyx_n_s_base +#define __pyx_n_s_c __pyx_mstate_global->__pyx_n_s_c +#define __pyx_n_u_c __pyx_mstate_global->__pyx_n_u_c +#define __pyx_n_s_class __pyx_mstate_global->__pyx_n_s_class +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_clip_np __pyx_mstate_global->__pyx_n_s_clip_np +#define __pyx_n_s_clipping __pyx_mstate_global->__pyx_n_s_clipping +#define __pyx_n_s_clipping_2 __pyx_mstate_global->__pyx_n_s_clipping_2 +#define __pyx_n_s_collections __pyx_mstate_global->__pyx_n_s_collections +#define __pyx_kp_s_collections_abc __pyx_mstate_global->__pyx_kp_s_collections_abc +#define __pyx_kp_s_contiguous_and_direct __pyx_mstate_global->__pyx_kp_s_contiguous_and_direct +#define __pyx_kp_s_contiguous_and_indirect __pyx_mstate_global->__pyx_kp_s_contiguous_and_indirect +#define __pyx_n_s_count __pyx_mstate_global->__pyx_n_s_count +#define __pyx_n_s_defaults __pyx_mstate_global->__pyx_n_s_defaults +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_dtype __pyx_mstate_global->__pyx_n_s_dtype +#define __pyx_n_s_dtype_is_object __pyx_mstate_global->__pyx_n_s_dtype_is_object +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode +#define __pyx_n_s_enumerate __pyx_mstate_global->__pyx_n_s_enumerate +#define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error +#define __pyx_n_s_flags __pyx_mstate_global->__pyx_n_s_flags +#define __pyx_n_s_float32_t __pyx_mstate_global->__pyx_n_s_float32_t +#define __pyx_n_s_float64_t __pyx_mstate_global->__pyx_n_s_float64_t +#define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format +#define __pyx_n_s_fortran __pyx_mstate_global->__pyx_n_s_fortran +#define __pyx_n_u_fortran __pyx_mstate_global->__pyx_n_u_fortran +#define __pyx_n_s_fused_sigindex __pyx_mstate_global->__pyx_n_s_fused_sigindex +#define __pyx_kp_s_gators_clipping_clipping_pyx __pyx_mstate_global->__pyx_kp_s_gators_clipping_clipping_pyx +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_kp_u_got __pyx_mstate_global->__pyx_kp_u_got +#define __pyx_kp_u_got_differing_extents_in_dimensi __pyx_mstate_global->__pyx_kp_u_got_differing_extents_in_dimensi +#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_index __pyx_mstate_global->__pyx_n_s_index +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_int16_t __pyx_mstate_global->__pyx_n_s_int16_t +#define __pyx_n_s_int32_t __pyx_mstate_global->__pyx_n_s_int32_t +#define __pyx_n_s_int64_t __pyx_mstate_global->__pyx_n_s_int64_t +#define __pyx_n_s_int8_t __pyx_mstate_global->__pyx_n_s_int8_t +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_itemsize __pyx_mstate_global->__pyx_n_s_itemsize +#define __pyx_kp_s_itemsize_0_for_cython_array __pyx_mstate_global->__pyx_kp_s_itemsize_0_for_cython_array +#define __pyx_n_s_kind __pyx_mstate_global->__pyx_n_s_kind +#define __pyx_n_s_kwargs __pyx_mstate_global->__pyx_n_s_kwargs +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_memview __pyx_mstate_global->__pyx_n_s_memview +#define __pyx_n_s_mode __pyx_mstate_global->__pyx_n_s_mode +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2 +#define __pyx_n_s_ndim __pyx_mstate_global->__pyx_n_s_ndim +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj +#define __pyx_n_s_pack __pyx_mstate_global->__pyx_n_s_pack +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_fuse_0_clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_0_clipping +#define __pyx_n_s_pyx_fuse_0clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_0clipping +#define __pyx_n_s_pyx_fuse_1_clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_1_clipping +#define __pyx_n_s_pyx_fuse_1clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_1clipping +#define __pyx_n_s_pyx_fuse_2_clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_2_clipping +#define __pyx_n_s_pyx_fuse_2clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_2clipping +#define __pyx_n_s_pyx_fuse_3_clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_3_clipping +#define __pyx_n_s_pyx_fuse_3clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_3clipping +#define __pyx_n_s_pyx_fuse_4_clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_4_clipping +#define __pyx_n_s_pyx_fuse_4clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_4clipping +#define __pyx_n_s_pyx_fuse_5_clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_5_clipping +#define __pyx_n_s_pyx_fuse_5clipping __pyx_mstate_global->__pyx_n_s_pyx_fuse_5clipping +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_Enum __pyx_mstate_global->__pyx_n_s_pyx_unpickle_Enum +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_register __pyx_mstate_global->__pyx_n_s_register +#define __pyx_n_s_s __pyx_mstate_global->__pyx_n_s_s +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_shape __pyx_mstate_global->__pyx_n_s_shape +#define __pyx_n_s_signatures __pyx_mstate_global->__pyx_n_s_signatures +#define __pyx_n_s_size __pyx_mstate_global->__pyx_n_s_size +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split +#define __pyx_n_s_start __pyx_mstate_global->__pyx_n_s_start +#define __pyx_n_s_step __pyx_mstate_global->__pyx_n_s_step +#define __pyx_n_s_stop __pyx_mstate_global->__pyx_n_s_stop +#define __pyx_kp_s_strided_and_direct __pyx_mstate_global->__pyx_kp_s_strided_and_direct +#define __pyx_kp_s_strided_and_direct_or_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_direct_or_indirect +#define __pyx_kp_s_strided_and_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_indirect +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_strip __pyx_mstate_global->__pyx_n_s_strip +#define __pyx_n_s_struct __pyx_mstate_global->__pyx_n_s_struct +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_kp_s_unable_to_allocate_array_data __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_array_data +#define __pyx_kp_s_unable_to_allocate_shape_and_str __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_shape_and_str +#define __pyx_n_s_unpack __pyx_mstate_global->__pyx_n_s_unpack +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values +#define __pyx_n_s_version_info __pyx_mstate_global->__pyx_n_s_version_info +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 +#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 +#define __pyx_int_112105877 __pyx_mstate_global->__pyx_int_112105877 +#define __pyx_int_136983863 __pyx_mstate_global->__pyx_int_136983863 +#define __pyx_int_184977713 __pyx_mstate_global->__pyx_int_184977713 +#define __pyx_int_neg_1 __pyx_mstate_global->__pyx_int_neg_1 +#define __pyx_slice__5 __pyx_mstate_global->__pyx_slice__5 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__15 __pyx_mstate_global->__pyx_tuple__15 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 +#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 +#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 +#define __pyx_tuple__22 __pyx_mstate_global->__pyx_tuple__22 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24 +#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26 +#define __pyx_tuple__34 __pyx_mstate_global->__pyx_tuple__34 +#define __pyx_codeobj__25 __pyx_mstate_global->__pyx_codeobj__25 +#define __pyx_codeobj__27 __pyx_mstate_global->__pyx_codeobj__27 +#define __pyx_codeobj__28 __pyx_mstate_global->__pyx_codeobj__28 +#define __pyx_codeobj__29 __pyx_mstate_global->__pyx_codeobj__29 +#define __pyx_codeobj__30 __pyx_mstate_global->__pyx_codeobj__30 +#define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 +#define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 +#define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 +#define __pyx_codeobj__35 __pyx_mstate_global->__pyx_codeobj__35 +#define __pyx_codeobj__36 __pyx_mstate_global->__pyx_codeobj__36 +#define __pyx_codeobj__37 __pyx_mstate_global->__pyx_codeobj__37 +#define __pyx_codeobj__38 __pyx_mstate_global->__pyx_codeobj__38 +#define __pyx_codeobj__39 __pyx_mstate_global->__pyx_codeobj__39 +#define __pyx_codeobj__40 __pyx_mstate_global->__pyx_codeobj__40 +#define __pyx_codeobj__41 __pyx_mstate_global->__pyx_codeobj__41 +/* #### Code section: module_code ### */ + +/* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)__pyx_n_s_c)); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_itemsize)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_format)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mode); + if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_allocate_buffer); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 131, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 132, __pyx_L3_error) + } else { + + /* "View.MemoryView":132 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, __pyx_nargs); __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 131, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 131, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_dim; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + char *__pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_UCS4 __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":137 + * cdef Py_ssize_t dim + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 137, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 137, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":138 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + __pyx_t_2 = (!(__pyx_v_self->ndim != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":141 + * + * if not self.ndim: + * raise ValueError, "Empty shape tuple for cython.array" # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Empty_shape_tuple_for_cython_arr, 0, 0); + __PYX_ERR(1, 141, __pyx_L1_error) + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + } + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + __pyx_t_2 = (__pyx_v_itemsize <= 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":144 + * + * if itemsize <= 0: + * raise ValueError, "itemsize <= 0 for cython.array" # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_itemsize_0_for_cython_array, 0, 0); + __PYX_ERR(1, 144, __pyx_L1_error) + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + } + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_3 = (!__pyx_t_2); + if (__pyx_t_3) { + + /* "View.MemoryView":147 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_n_s_ASCII}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":148 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_format))) __PYX_ERR(1, 148, __pyx_L1_error) + __pyx_t_4 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":149 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 149, __pyx_L1_error) + } + __pyx_t_8 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) __PYX_ERR(1, 149, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_8; + + /* "View.MemoryView":152 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":153 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + __pyx_t_3 = (!(__pyx_v_self->_shape != 0)); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":156 + * + * if not self._shape: + * raise MemoryError, "unable to allocate shape and strides." # <<<<<<<<<<<<<< + * + * + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_shape_and_str, 0, 0); + __PYX_ERR(1, 156, __pyx_L1_error) + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + } + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + __pyx_t_7 = 0; + __pyx_t_4 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_4); + __pyx_t_1 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #endif + if (__pyx_t_1 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_9; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + __pyx_t_3 = (__pyx_v_dim <= 0); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":161 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_5 = PyTuple_New(5); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = 0; + __pyx_t_10 = 127; + __Pyx_INCREF(__pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_9 += 22; + __Pyx_GIVEREF(__pyx_kp_u_Invalid_shape_in_axis); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_6 = __Pyx_PyUnicode_From_int(__pyx_v_idx, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u_); + __pyx_t_9 += 2; + __Pyx_GIVEREF(__pyx_kp_u_); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u_); + __pyx_t_6 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u__2); + __pyx_t_9 += 1; + __Pyx_GIVEREF(__pyx_kp_u__2); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_kp_u__2); + __pyx_t_6 = __Pyx_PyUnicode_Join(__pyx_t_5, 5, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 161, __pyx_L1_error) + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":162 + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 165, __pyx_L1_error) + if (__pyx_t_3) { + + /* "View.MemoryView":166 + * cdef char order + * if mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * elif mode == 'fortran': + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":167 + * if mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * elif mode == 'fortran': + * order = b'F' + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 168, __pyx_L1_error) + if (likely(__pyx_t_3)) { + + /* "View.MemoryView":169 + * self.mode = u'c' + * elif mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * else: + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":170 + * elif mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":172 + * self.mode = u'fortran' + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_FormatSimple(__pyx_v_mode, __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 172, __pyx_L1_error) + } + __pyx_L11:; + + /* "View.MemoryView":174 + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) # <<<<<<<<<<<<<< + * + * self.free_data = allocate_buffer + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":176 + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":177 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * + * if allocate_buffer: + */ + __pyx_t_6 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 177, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_3; + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + if (__pyx_v_allocate_buffer) { + + /* "View.MemoryView":180 + * + * if allocate_buffer: + * _allocate_buffer(self) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_t_7 = __pyx_array_allocate_buffer(__pyx_v_self); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(1, 180, __pyx_L1_error) + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + } + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + char *__pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_ssize_t *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":184 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_t_1 = ((__pyx_v_flags & ((PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS) | PyBUF_ANY_CONTIGUOUS)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 186, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":187 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L4; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 188, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L4:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + __pyx_t_1 = (!((__pyx_v_flags & __pyx_v_bufmode) != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Can_only_create_a_buffer_that_is, 0, 0); + __PYX_ERR(1, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + } + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * + */ + __pyx_t_2 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_2; + + /* "View.MemoryView":193 + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_3; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":196 + * + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_4 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_4; + + /* "View.MemoryView":197 + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * else: + */ + __pyx_t_5 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":198 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * else: + * info.ndim = 1 + */ + __pyx_t_5 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_5; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + goto __pyx_L6; + } + + /* "View.MemoryView":200 + * info.strides = self._strides + * else: + * info.ndim = 1 # <<<<<<<<<<<<<< + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL + */ + /*else*/ { + __pyx_v_info->ndim = 1; + + /* "View.MemoryView":201 + * else: + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL # <<<<<<<<<<<<<< + * info.strides = NULL + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + __pyx_t_5 = (&__pyx_v_self->len); + } else { + __pyx_t_5 = NULL; + } + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":202 + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL # <<<<<<<<<<<<<< + * + * info.suboffsets = NULL + */ + __pyx_v_info->strides = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":204 + * info.strides = NULL + * + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":205 + * + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + */ + __pyx_t_3 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_3; + + /* "View.MemoryView":206 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":207 + * info.itemsize = self.itemsize + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_self->format; + } else { + __pyx_t_2 = NULL; + } + __pyx_v_info->format = __pyx_t_2; + + /* "View.MemoryView":208 + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + __pyx_t_1 = (__pyx_v_self->callback_free_data != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + if (__pyx_v_self->free_data) { + } else { + __pyx_t_1 = __pyx_v_self->free_data; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->data != NULL); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":215 + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) # <<<<<<<<<<<<<< + * free(self.data) + * PyObject_Free(self._shape) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + } + + /* "View.MemoryView":216 + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + } + __pyx_L3:; + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ +} + +/* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":221 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_memview", 1); + + /* "View.MemoryView":225 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":226 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + + /* "View.MemoryView":229 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getattr__", 1); + + /* "View.MemoryView":232 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":235 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 1); + + /* "View.MemoryView":238 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0))) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_i; + PyObject **__pyx_v_p; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":254 + * cdef PyObject **p + * + * self.free_data = True # <<<<<<<<<<<<<< + * self.data = malloc(self.len) + * if not self.data: + */ + __pyx_v_self->free_data = 1; + + /* "View.MemoryView":255 + * + * self.free_data = True + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError, "unable to allocate array data." + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + __pyx_t_1 = (!(__pyx_v_self->data != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":257 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError, "unable to allocate array data." # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_array_data, 0, 0); + __PYX_ERR(1, 257, __pyx_L1_error) + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":260 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":261 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len // self.itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_self->itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_self->itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_self->itemsize); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":262 + * p = self.data + * for i in range(self.len // self.itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * return 0 + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":263 + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * return 0 + * + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + } + + /* "View.MemoryView":264 + * p[i] = Py_None + * Py_INCREF(Py_None) + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_c_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + PyObject *__pyx_v_mode = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("array_cwrapper", 1); + + /* "View.MemoryView":270 + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. # <<<<<<<<<<<<<< + * + * if buf is NULL: + */ + __pyx_t_2 = ((__pyx_v_c_mode[0]) == 'f'); + if (__pyx_t_2) { + __Pyx_INCREF(__pyx_n_s_fortran); + __pyx_t_1 = __pyx_n_s_fortran; + } else { + __Pyx_INCREF(__pyx_n_s_c); + __pyx_t_1 = __pyx_n_s_c; + } + __pyx_v_mode = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + __pyx_t_2 = (__pyx_v_buf == NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":273 + * + * if buf is NULL: + * result = array.__new__(array, shape, itemsize, format, mode) # <<<<<<<<<<<<<< + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + */ + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_shape)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_mode)) __PYX_ERR(1, 273, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_4, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":275 + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + /*else*/ { + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_mode)) __PYX_ERR(1, 275, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 275, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_1, __pyx_t_4)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":276 + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":278 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_mode); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 304, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 304, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 304, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "View.MemoryView":305 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":307 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 349, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_dtype_is_object); + if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 349, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, __pyx_nargs); __PYX_ERR(1, 349, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_intptr_t __pyx_t_4; + size_t __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 1); + + /* "View.MemoryView":350 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":351 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_obj != Py_None); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":353 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_3 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 353, __pyx_L1_error) + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = (((PyObject *)__pyx_v_self->view.obj) == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":356 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + __pyx_t_1 = (!__PYX_CYTHON_ATOMICS_ENABLED()); + if (__pyx_t_1) { + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = (__pyx_memoryview_thread_locks_used < 8); + if (__pyx_t_1) { + + /* "View.MemoryView":361 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":362 + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":364 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":366 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(1, 366, __pyx_L1_error) + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + } + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":369 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = ((__pyx_v_self->view.format[0]) == 'O'); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_self->view.format[1]) == '\x00'); + __pyx_t_1 = __pyx_t_2; + __pyx_L12_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":371 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L11:; + + /* "View.MemoryView":373 + * self.dtype_is_object = dtype_is_object + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 # <<<<<<<<<<<<<< + * self.typeinfo = NULL + * + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_4 = ((Py_intptr_t)((void *)(&__pyx_v_self->acquisition_count))); + __pyx_t_5 = (sizeof(__pyx_atomic_int_type)); + if (unlikely(__pyx_t_5 == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 373, __pyx_L1_error) + } + __pyx_t_1 = ((__pyx_t_4 % __pyx_t_5) == 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 373, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 373, __pyx_L1_error) + #endif + + /* "View.MemoryView":374 + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyThread_type_lock __pyx_t_5; + PyThread_type_lock __pyx_t_6; + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":378 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + __pyx_t_1 = (((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":381 + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< + * Py_DECREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; + + /* "View.MemoryView":382 + * + * (<__pyx_buffer *> &self.view).obj = NULL + * Py_DECREF(Py_None) # <<<<<<<<<<<<<< + * + * cdef int i + */ + Py_DECREF(Py_None); + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + } + __pyx_L3:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_1 = (__pyx_v_self->lock != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":387 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_2 = __pyx_memoryview_thread_locks_used; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock); + if (__pyx_t_1) { + + /* "View.MemoryView":389 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_1 = (__pyx_v_i != __pyx_memoryview_thread_locks_used); + if (__pyx_t_1) { + + /* "View.MemoryView":392 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_5 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":391 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_5; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_6; + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":393 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":395 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ +} + +/* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_item_pointer", 1); + + /* "View.MemoryView":399 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 401, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 401, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":402 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":404 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + if (__pyx_t_1) { + + /* "View.MemoryView":409 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":411 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 411, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 411, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_indices = __pyx_t_4; + __pyx_t_4 = 0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 414, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":415 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":417 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_5 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(1, 417, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_5; + + /* "View.MemoryView":418 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + if (unlikely(__pyx_v_self->view.readonly)) { + + /* "View.MemoryView":422 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_Cannot_assign_to_read_only_memor, 0, 0); + __PYX_ERR(1, 422, __pyx_L1_error) + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + } + + /* "View.MemoryView":424 + * raise TypeError, "Cannot assign to read-only memoryview" + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_1 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 424, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 424, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 426, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":427 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 428, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":429 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_1 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_1, __pyx_v_obj); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":431 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 431, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_3), __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":433 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":439 + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 439, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":440 + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 440, __pyx_L6_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + + /* "View.MemoryView":441 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __pyx_L6_except_error:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":443 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + __Pyx_memviewslice __pyx_v_msrc; + __Pyx_memviewslice __pyx_v_mdst; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 1); + + /* "View.MemoryView":448 + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_v_msrc = (__pyx_t_1[0]); + + /* "View.MemoryView":449 + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] # <<<<<<<<<<<<<< + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_v_mdst = (__pyx_t_1[0]); + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = __pyx_memoryview_copy_contents(__pyx_v_msrc, __pyx_v_mdst, __pyx_t_3, __pyx_t_4, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 451, __pyx_L1_error) + + /* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + char const *__pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 1); + + /* "View.MemoryView":455 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":460 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 460, __pyx_L1_error) + __pyx_v_dst_slice = __pyx_t_1; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_2 = (((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))); + if (__pyx_t_2) { + + /* "View.MemoryView":463 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_2 = (__pyx_v_tmp == NULL); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":465 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(1, 465, __pyx_L1_error) + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":466 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":468 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":470 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":472 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":474 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 474, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_2 = (__pyx_v_self->view.suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":479 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_4 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 479, __pyx_L6_error) + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":480 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":483 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_indexed", 1); + + /* "View.MemoryView":486 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 486, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":487 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 487, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":492 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 492, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":495 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":497 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError, "Unable to convert item to object" + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_9 = __Pyx_ssize_strlen(__pyx_v_self->view.format); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(1, 501, __pyx_L5_except_error) + __pyx_t_10 = (__pyx_t_9 == 1); + if (__pyx_t_10) { + + /* "View.MemoryView":502 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 502, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":503 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":498 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError, "Unable to convert item to object" + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_6); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "View.MemoryView":499 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError, "Unable to convert item to object" # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Unable_to_convert_item_to_object, 0, 0); + __PYX_ERR(1, 499, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + char *__pyx_t_9; + char *__pyx_t_10; + char *__pyx_t_11; + char *__pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":508 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + if (__pyx_t_2) { + + /* "View.MemoryView":514 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 514, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":516 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_v_value}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 516, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 518, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_8 = __pyx_v_bytesvalue; + __pyx_t_10 = PyBytes_AS_STRING(__pyx_t_8); + __pyx_t_11 = (__pyx_t_10 + PyBytes_GET_SIZE(__pyx_t_8)); + for (__pyx_t_12 = __pyx_t_10; __pyx_t_12 < __pyx_t_11; __pyx_t_12++) { + __pyx_t_9 = __pyx_t_12; + __pyx_v_c = (__pyx_t_9[0]); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_7; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + char *__pyx_t_4; + void *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":524 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError, "Cannot create writable memory view from read-only memoryview" # <<<<<<<<<<<<<< + * + * if flags & PyBUF_ND: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Cannot_create_writable_memory_vi, 0, 0); + __PYX_ERR(1, 524, __pyx_L1_error) + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + } + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":527 + * + * if flags & PyBUF_ND: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_3 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_3; + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":529 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":532 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_3 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_3; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":534 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":537 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_3 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_3; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":539 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":542 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":544 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":546 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_5 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_5; + + /* "View.MemoryView":547 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_6 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":548 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_7 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_7; + + /* "View.MemoryView":549 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_7 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_7; + + /* "View.MemoryView":550 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":551 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":556 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 556, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 556, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":557 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(1, 557, __pyx_L1_error) + + /* "View.MemoryView":558 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":562 + * @property + * def base(self): + * return self._get_base() # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->_get_base(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 562, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.base.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":565 + * + * cdef _get_base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_7genexpr__pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":569 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_7genexpr__pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_7genexpr__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } /* exit inner scope */ + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr1__pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + __pyx_t_1 = (__pyx_v_self->view.strides == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":575 + * if self.view.strides == NULL: + * + * raise ValueError, "Buffer view does not expose strides" # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Buffer_view_does_not_expose_stri, 0, 0); + __PYX_ERR(1, 575, __pyx_L1_error) + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + } + + /* "View.MemoryView":577 + * raise ValueError, "Buffer view does not expose strides" + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr1__pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr1__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr2__pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = (__pyx_v_self->view.suboffsets == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PySequence_Multiply(__pyx_tuple__4, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":584 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.suboffsets; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr2__pyx_v_suboffset = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr2__pyx_v_suboffset); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":588 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 588, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":592 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 592, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":596 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":601 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":603 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_t_5 = PyInt_FromSsize_t((__pyx_t_2[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 603, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":604 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_5 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 604, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_5); + __pyx_t_5 = 0; + } + + /* "View.MemoryView":606 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":608 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = (__pyx_v_self->view.ndim >= 1); + if (__pyx_t_1) { + + /* "View.MemoryView":612 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":614 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":618 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 1); + + /* "View.MemoryView":621 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_c_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_c_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_c_contig", 1); + + /* "View.MemoryView":627 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 627, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":628 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_f_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_f_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_f_contig", 1); + + /* "View.MemoryView":633 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 633, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":634 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy", 1); + + /* "View.MemoryView":638 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":640 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":641 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 641, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":646 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 646, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy_fortran", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy_fortran", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy_fortran", 1); + + /* "View.MemoryView":650 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":652 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":653 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 653, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":658 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 1); + + /* "View.MemoryView":663 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":664 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":665 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":669 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_idx; + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_UCS4 __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_unellipsify", 1); + + /* "View.MemoryView":677 + * """ + * cdef Py_ssize_t idx + * tup = index if isinstance(index, tuple) else (index,) # <<<<<<<<<<<<<< + * + * result = [slice(None)] * ndim + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_index); + if (__pyx_t_2) { + __Pyx_INCREF(((PyObject*)__pyx_v_index)); + __pyx_t_1 = __pyx_v_index; + } else { + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index)) __PYX_ERR(1, 677, __pyx_L1_error); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_v_tup = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_1 = PyList_New(1 * ((__pyx_v_ndim<0) ? 0:__pyx_v_ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_ndim; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error); + } + } + __pyx_v_result = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":680 + * + * result = [slice(None)] * ndim + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * idx = 0 + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":681 + * result = [slice(None)] * ndim + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * idx = 0 + * for item in tup: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":682 + * have_slices = False + * seen_ellipsis = False + * idx = 0 # <<<<<<<<<<<<<< + * for item in tup: + * if item is Ellipsis: + */ + __pyx_v_idx = 0; + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 683, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_1); + __pyx_t_4 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #endif + if (__pyx_t_4 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 683, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + __pyx_t_2 = (!__pyx_v_seen_ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":686 + * if item is Ellipsis: + * if not seen_ellipsis: + * idx += ndim - len(tup) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * have_slices = True + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 686, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(__pyx_v_tup); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 686, __pyx_L1_error) + __pyx_v_idx = (__pyx_v_idx + (__pyx_v_ndim - __pyx_t_5)); + + /* "View.MemoryView":687 + * if not seen_ellipsis: + * idx += ndim - len(tup) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + } + + /* "View.MemoryView":688 + * idx += ndim - len(tup) + * seen_ellipsis = True + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if isinstance(item, slice): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + if (__pyx_t_2) { + + /* "View.MemoryView":691 + * else: + * if isinstance(item, slice): + * have_slices = True # <<<<<<<<<<<<<< + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + goto __pyx_L7; + } + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + __pyx_t_2 = (!(PyIndex_Check(__pyx_v_item) != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":693 + * have_slices = True + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" # <<<<<<<<<<<<<< + * result[idx] = item + * idx += 1 + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_6 = 127; + __Pyx_INCREF(__pyx_kp_u_Cannot_index_with_type); + __pyx_t_5 += 24; + __Pyx_GIVEREF(__pyx_kp_u_Cannot_index_with_type); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Cannot_index_with_type); + __pyx_t_7 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_item)), __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6; + __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_kp_u__6); + __pyx_t_5 += 1; + __Pyx_GIVEREF(__pyx_kp_u__6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__6); + __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_t_7, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(1, 693, __pyx_L1_error) + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + } + __pyx_L7:; + + /* "View.MemoryView":694 + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item # <<<<<<<<<<<<<< + * idx += 1 + * + */ + if (unlikely((__Pyx_SetItemInt(__pyx_v_result, __pyx_v_idx, __pyx_v_item, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1) < 0))) __PYX_ERR(1, 694, __pyx_L1_error) + } + __pyx_L5:; + + /* "View.MemoryView":695 + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + * idx += 1 # <<<<<<<<<<<<<< + * + * nslices = ndim - idx + */ + __pyx_v_idx = (__pyx_v_idx + 1); + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":697 + * idx += 1 + * + * nslices = ndim - idx # <<<<<<<<<<<<<< + * return have_slices or nslices, tuple(result) + * + */ + __pyx_v_nslices = (__pyx_v_ndim - __pyx_v_idx); + + /* "View.MemoryView":698 + * + * nslices = ndim - idx + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_7 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + __pyx_L9_bool_binop_done:; + __pyx_t_7 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 698, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_7 = 0; + __pyx_r = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static int assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + int __pyx_r; + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":701 + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + __pyx_t_4 = (__pyx_v_suboffset >= 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":703 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" # <<<<<<<<<<<<<< + * return 0 # return type just used as an error flag + * + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Indirect_dimensions_not_supporte, 0, 0); + __PYX_ERR(1, 703, __pyx_L1_error) + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + } + } + + /* "View.MemoryView":704 + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + Py_ssize_t __pyx_v_cindex; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + struct __pyx_memoryview_obj *__pyx_t_3; + char *__pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + PyObject *(*__pyx_t_7)(PyObject *); + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memview_slice", 1); + + /* "View.MemoryView":712 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":719 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":723 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_1 = (__pyx_v_memview->view.ndim > 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 723, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 723, __pyx_L1_error) + #endif + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":726 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 726, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":727 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":729 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":730 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":736 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_3 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_3; + + /* "View.MemoryView":737 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_4; + + /* "View.MemoryView":742 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step, cindex + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":743 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step, cindex + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + __pyx_t_5 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_2 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_2); + __pyx_t_6 = 0; + __pyx_t_7 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 747, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_7)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_7(__pyx_t_2); + if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 747, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_dim = __pyx_t_5; + __pyx_t_5 = (__pyx_t_5 + 1); + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + __pyx_t_1 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":749 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * cindex = index # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 749, __pyx_L1_error) + __pyx_v_cindex = __pyx_t_9; + + /* "View.MemoryView":750 + * if PyIndex_Check(index): + * cindex = index + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_cindex, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 750, __pyx_L1_error) + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + goto __pyx_L6; + } + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_1 = (__pyx_v_index == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":757 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":758 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":759 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":760 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":762 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 762, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 762, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_9; + + /* "View.MemoryView":763 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 763, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 763, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 763, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_9; + + /* "View.MemoryView":764 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 764, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 764, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 764, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_9; + + /* "View.MemoryView":766 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":767 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 767, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":768 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":770 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 770, __pyx_L1_error) + + /* "View.MemoryView":776 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":780 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 780, __pyx_L1_error) } + + /* "View.MemoryView":781 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 781, __pyx_L1_error) } + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 779, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":785 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 784, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = (!__pyx_v_is_slice); + if (__pyx_t_1) { + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = (__pyx_v_start < 0); + if (__pyx_t_1) { + + /* "View.MemoryView":816 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":818 + * start += shape + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 818, __pyx_L1_error) + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_have_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":822 + * + * if have_step: + * negative_step = step < 0 # <<<<<<<<<<<<<< + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + */ + __pyx_v_negative_step = (__pyx_v_step < 0); + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + __pyx_t_2 = (__pyx_v_step == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":824 + * negative_step = step < 0 + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * negative_step = False + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 824, __pyx_L1_error) + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":826 + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + * negative_step = False # <<<<<<<<<<<<<< + * step = 1 + * + */ + /*else*/ { + __pyx_v_negative_step = 0; + + /* "View.MemoryView":827 + * else: + * negative_step = False + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + } + __pyx_L6:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":832 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":834 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = (__pyx_v_start >= __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + if (__pyx_v_negative_step) { + + /* "View.MemoryView":837 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":839 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L11:; + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L9:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L8; + } + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":842 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":844 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L12:; + } + __pyx_L8:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":850 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = (__pyx_v_stop > __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":852 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L14:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L13; + } + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":855 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L16; + } + + /* "View.MemoryView":857 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L16:; + } + __pyx_L13:; + + /* "View.MemoryView":861 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":864 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = (__pyx_v_new_shape < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":867 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":870 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":871 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":872 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = ((__pyx_v_suboffset_dim[0]) < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":878 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L19:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = (!__pyx_v_is_slice); + if (__pyx_t_2) { + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = (__pyx_v_new_ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":883 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L22; + } + + /* "View.MemoryView":885 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":886 + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 885, __pyx_L1_error) + } + __pyx_L22:; + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L21; + } + + /* "View.MemoryView":888 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L21:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":890 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_UCS4 __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("pybuffer_index", 1); + + /* "View.MemoryView":898 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":899 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + __pyx_t_2 = (__pyx_v_view->ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":903 + * + * if view.ndim == 0: + * shape = view.len // itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":904 + * if view.ndim == 0: + * shape = view.len // itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":906 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":907 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = (__pyx_v_view->suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":909 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":914 + * index += view.shape[dim] + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_5 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__7); + __pyx_t_5 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 914, __pyx_L1_error) + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index >= __pyx_v_shape); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":917 + * + * if index >= shape: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_3 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u__7); + __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_5, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 917, __pyx_L1_error) + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":919 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":923 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":930 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":932 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":933 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":937 + * + * cdef int i, j + * for i in range(ndim // 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":938 + * cdef int i, j + * for i in range(ndim // 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":939 + * for i in range(ndim // 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":940 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":943 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_t_9 = __pyx_memoryview_err(PyExc_ValueError, __pyx_kp_s_Cannot_transpose_memoryview_with); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L1_error) + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":945 + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + + /* "View.MemoryView":964 + * + * def __dealloc__(self): + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XCLEAR_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_object_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":968 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 968, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":970 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 970, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_dtype_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":974 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 974, __pyx_L1_error) + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":976 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":979 + * + * cdef _get_base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_fromslice", 1); + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_memviewslice.memview) == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":1008 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1013 + * + * + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = ((PyObject *)__pyx_tp_new__memoryviewslice(((PyTypeObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1015 + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1016 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview)._get_base() + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1018 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview)._get_base() # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->__pyx_vtab)->_get_base(((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1018, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1019 + * + * result.from_object = ( memviewslice.memview)._get_base() + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1021 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1022 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1023 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1024 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1025 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1028 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1030 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1032 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1033 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1036 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1037 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = (__pyx_v_suboffset >= 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1039 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1040 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1042 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1043 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1043, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1044 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1046 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1047 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1049 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_slice_from_memview", 1); + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1056 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1056, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1057 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1059 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1060 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1067 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1068 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1069 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1071 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1072 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1074 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1075 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1076 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1077 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + __pyx_t_6 = (__pyx_v_suboffsets != 0); + if (__pyx_t_6) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ +} + +/* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy", 1); + + /* "View.MemoryView":1083 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1084 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1084, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *(*__pyx_t_2)(char *); + int (*__pyx_t_3)(char *, PyObject *); + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 1); + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1095 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_2 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_2; + + /* "View.MemoryView":1096 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_3; + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1098 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1099 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1101 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1103 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":1110 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: + * return -arg if arg < 0 else arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + __pyx_t_2 = (__pyx_v_arg < 0); + if (__pyx_t_2) { + __pyx_t_1 = (-__pyx_v_arg); + } else { + __pyx_t_1 = __pyx_v_arg; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1118 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1119 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1121 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1123 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1124 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1126 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1128 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1129 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = (abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)); + if (__pyx_t_2) { + + /* "View.MemoryView":1132 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1134 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + + /* "View.MemoryView":1144 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1146 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = (__pyx_v_src_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_dst_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1151 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_1 = __pyx_t_2; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1152 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1154 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1155 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1156 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1157 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1159 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1160 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1164 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1165 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1170 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + + /* "View.MemoryView":1176 + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for shape in src.shape[:ndim]: + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1178 + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * + * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< + * size *= shape + * + */ + __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); + for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_shape = (__pyx_t_2[0]); + + /* "View.MemoryView":1179 + * + * for shape in src.shape[:ndim]: + * size *= shape # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * __pyx_v_shape); + } + + /* "View.MemoryView":1181 + * size *= shape + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = (__pyx_v_order == 'F'); + if (__pyx_t_1) { + + /* "View.MemoryView":1194 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1195 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1196 + * for idx in range(ndim): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1198 + * stride *= shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1199 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1200 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1202 + * stride *= shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1216 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1217 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1219 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err_no_memory() + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + __pyx_t_2 = (!(__pyx_v_result != 0)); + if (__pyx_t_2) { + + /* "View.MemoryView":1221 + * result = malloc(size) + * if not result: + * _err_no_memory() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_no_memory(); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1221, __pyx_L1_error) + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + } + + /* "View.MemoryView":1224 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1225 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1226 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1227 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1228 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1230 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) # <<<<<<<<<<<<<< + * + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = ((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = __pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_UCS4 __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = PyTuple_New(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = 0; + __pyx_t_3 = 127; + __Pyx_INCREF(__pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_2 += 35; + __Pyx_GIVEREF(__pyx_kp_u_got_differing_extents_in_dimensi); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_i, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_got); + __pyx_t_2 += 6; + __Pyx_GIVEREF(__pyx_kp_u_got); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_got); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent1, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_and); + __pyx_t_2 += 5; + __Pyx_GIVEREF(__pyx_kp_u_and); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_kp_u_and); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent2, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_2 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_kp_u__7); + __pyx_t_4 = __Pyx_PyUnicode_Join(__pyx_t_1, 7, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, PyObject *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1253 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: + * raise error, msg % dim # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_v_msg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_t_2, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1253, __pyx_L1_error) + + /* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, PyObject *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1257 + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: + * raise error, msg # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_no_memory') + */ + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_v_msg, 0, 0); + __PYX_ERR(1, 1257, __pyx_L1_error) + + /* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + +static int __pyx_memoryview_err_no_memory(void) { + int __pyx_r; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1261 + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: + * raise MemoryError # <<<<<<<<<<<<<< + * + * + */ + PyErr_NoMemory(); __PYX_ERR(1, 1261, __pyx_L1_error) + + /* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err_no_memory", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1273 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1274 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1276 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1277 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1278 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = (__pyx_v_src_ndim < __pyx_v_dst_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1282 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = (__pyx_v_dst_ndim < __pyx_v_src_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1284 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1286 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + __pyx_t_2 = (__pyx_t_3 > __pyx_t_4); + if (__pyx_t_2) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1288 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1291 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1292 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1294 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1294, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = ((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1297 + * + * if src.suboffsets[i] >= 0: + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Dimension_d_is_not_direct, __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1297, __pyx_L1_error) + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = __pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = (!__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim)); + if (__pyx_t_2) { + + /* "View.MemoryView":1302 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1304 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1304, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1305 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (!__pyx_v_broadcasting); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1311 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1313 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + if (__pyx_v_direct_copy) { + + /* "View.MemoryView":1317 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1318 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1319 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1320 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1321 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + if (__pyx_t_2) { + + /* "View.MemoryView":1326 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1326, __pyx_L1_error) + + /* "View.MemoryView":1327 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1327, __pyx_L1_error) + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1329 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1330 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1331 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1333 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1334 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1341 + * int ndim_other) noexcept nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1343 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1344 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1345 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1346 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1348 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1349 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1350 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1351 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + if (__pyx_v_dtype_is_object) { + + /* "View.MemoryView":1362 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + } + + /* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1368 + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + + /* function exit code */ + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1374 + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * + * for i in range(shape[0]): + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1376 + * cdef Py_ssize_t stride = strides[0] + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = (__pyx_v_ndim == 1); + if (__pyx_t_4) { + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + if (__pyx_v_inc) { + + /* "View.MemoryView":1379 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1381 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1383 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += stride + */ + /*else*/ { + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1385 + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + * + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + + /* function exit code */ +} + +/* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1394 + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1395 + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) # <<<<<<<<<<<<<< + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1396 + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1404 + * size_t itemsize, void *item) noexcept nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1405 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1408 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1409 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1410 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1412 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1413 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) # <<<<<<<<<<<<<< + * data += stride + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1414 + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__8, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_8clipping_1clipping = {"clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_1clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_8clipping_clipping(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int8__t_is_signed; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("clipping", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 16, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int8__t_is_signed = (!(((__pyx_t_5numpy_int8_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 16, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 16, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int8_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int8__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int8_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L32_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L32_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L35_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L35_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int8_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L49_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int8_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L48_next_and; + } + __pyx_L49_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int8_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L47_bool_binop_done; + } + __pyx_L48_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L47_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int8_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int8_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L55_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L54_next_and; + } + __pyx_L55_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L53_bool_binop_done; + } + __pyx_L54_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L53_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L61_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L60_next_and; + } + __pyx_L61_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L59_bool_binop_done; + } + __pyx_L60_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L59_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L67_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L66_next_and; + } + __pyx_L67_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L65_bool_binop_done; + } + __pyx_L66_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L65_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L73_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L72_next_and; + } + __pyx_L73_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L71_bool_binop_done; + } + __pyx_L72_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L71_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L79_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L78_next_and; + } + __pyx_L79_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L77_bool_binop_done; + } + __pyx_L78_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L77_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L45_try_end; + __pyx_L38_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("clipping.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 16, __pyx_L40_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L39_exception_handled; + } + goto __pyx_L40_except_error; + __pyx_L40_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L43_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L39_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L45_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 16, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L89; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L89:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 16, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L93; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 16, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 16, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 16, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L93:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L108_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L108_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L92_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L110_for_end; + __pyx_L92_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L110_for_end; + __pyx_L110_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 16, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("clipping.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_5__pyx_fuse_0clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_8clipping_clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int8_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":24 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":25 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":29 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":30 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":31 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":33 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":34 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":36 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":37 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":38 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_5__pyx_fuse_0clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_8clipping_5__pyx_fuse_0clipping = {"__pyx_fuse_0clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_5__pyx_fuse_0clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_5__pyx_fuse_0clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0clipping", 1, 3, 3, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0clipping", 1, 3, 3, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0clipping") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_clip_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0clipping", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_0clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_4__pyx_fuse_0clipping(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_4__pyx_fuse_0clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_8clipping_clipping(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_0clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_7__pyx_fuse_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_8clipping_clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int16_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":24 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":25 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":29 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":30 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":31 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":33 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":34 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":36 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":37 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":38 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_7__pyx_fuse_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_8clipping_7__pyx_fuse_1clipping = {"__pyx_fuse_1clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_7__pyx_fuse_1clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_7__pyx_fuse_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1clipping", 1, 3, 3, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1clipping", 1, 3, 3, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1clipping") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_clip_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1clipping", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_1clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_6__pyx_fuse_1clipping(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_6__pyx_fuse_1clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_8clipping_clipping(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_1clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_9__pyx_fuse_2clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_8clipping_clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int32_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":24 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":25 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":29 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":30 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":31 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":33 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":34 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":36 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":37 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":38 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_9__pyx_fuse_2clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_8clipping_9__pyx_fuse_2clipping = {"__pyx_fuse_2clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_9__pyx_fuse_2clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_9__pyx_fuse_2clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2clipping", 1, 3, 3, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2clipping", 1, 3, 3, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2clipping") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_clip_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2clipping", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_2clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_8__pyx_fuse_2clipping(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_8__pyx_fuse_2clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_8clipping_clipping(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_2clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_11__pyx_fuse_3clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_8clipping_clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int64_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":24 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":25 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":29 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":30 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":31 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":33 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":34 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":36 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":37 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":38 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_11__pyx_fuse_3clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_8clipping_11__pyx_fuse_3clipping = {"__pyx_fuse_3clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_11__pyx_fuse_3clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_11__pyx_fuse_3clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3clipping", 1, 3, 3, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3clipping", 1, 3, 3, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3clipping") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_clip_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3clipping", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_3clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_10__pyx_fuse_3clipping(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_10__pyx_fuse_3clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_8clipping_clipping(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_3clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_13__pyx_fuse_4clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_8clipping_clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_float32_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":24 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":25 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":29 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":30 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":31 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":33 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":34 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":36 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":37 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":38 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_13__pyx_fuse_4clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_8clipping_13__pyx_fuse_4clipping = {"__pyx_fuse_4clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_13__pyx_fuse_4clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_13__pyx_fuse_4clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4clipping", 1, 3, 3, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4clipping", 1, 3, 3, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4clipping") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_clip_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4clipping", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_4clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_12__pyx_fuse_4clipping(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_12__pyx_fuse_4clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_8clipping_clipping(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_4clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_15__pyx_fuse_5clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_1clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_5__pyx_f_8clipping_clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_float64_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_5clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":24 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":25 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":29 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":30 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":31 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":33 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":34 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":32 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":36 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":37 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":35 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":28 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":38 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_15__pyx_fuse_5clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_5__pyx_mdef_8clipping_15__pyx_fuse_5clipping = {"__pyx_fuse_5clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_15__pyx_fuse_5clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_15__pyx_fuse_5clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_5clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_5clipping", 1, 3, 3, 1); __PYX_ERR(0, 16, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_5clipping", 1, 3, 3, 2); __PYX_ERR(0, 16, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_5clipping") < 0)) __PYX_ERR(0, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_clip_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_5clipping", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_5clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_14__pyx_fuse_5clipping(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_14__pyx_fuse_5clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_5clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 16, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_5__pyx_f_8clipping_clipping(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_5clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_8clipping_3_clipping = {"_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_3_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults1 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 44, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 44, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_8clipping_2_clipping(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_2_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int8__t_is_signed; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_clipping", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 44, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int8__t_is_signed = (!(((__pyx_t_5numpy_int8_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_2); + __Pyx_GIVEREF(__pyx_int_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_2)) __PYX_ERR(0, 44, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 44, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int8_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int8__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int8_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L32_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L32_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L35_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L35_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int8_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L38_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L49_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int8_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L48_next_and; + } + __pyx_L49_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int8_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L47_bool_binop_done; + } + __pyx_L48_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L47_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int8_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int8_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L55_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L54_next_and; + } + __pyx_L55_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L53_bool_binop_done; + } + __pyx_L54_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L53_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L61_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L60_next_and; + } + __pyx_L61_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L59_bool_binop_done; + } + __pyx_L60_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L59_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L67_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L66_next_and; + } + __pyx_L67_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L65_bool_binop_done; + } + __pyx_L66_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L65_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L73_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L72_next_and; + } + __pyx_L73_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L71_bool_binop_done; + } + __pyx_L72_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L71_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L79_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L78_next_and; + } + __pyx_L79_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L77_bool_binop_done; + } + __pyx_L78_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L40_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L77_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L40_except_error) + goto __pyx_L43_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L45_try_end; + __pyx_L38_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("clipping.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 44, __pyx_L40_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L39_exception_handled; + } + goto __pyx_L40_except_error; + __pyx_L40_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L43_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L39_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L45_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 44, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L89; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L89:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 44, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L93; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 44, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 44, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 44, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L93:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L108_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L108_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L92_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L110_for_end; + __pyx_L92_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L110_for_end; + __pyx_L110_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 44, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("clipping.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_19__pyx_fuse_0_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_8clipping__clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int8_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":51 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":52 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":56 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":57 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":58 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":60 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":61 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":63 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int8_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":64 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":65 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping._clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_19__pyx_fuse_0_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_8clipping_19__pyx_fuse_0_clipping = {"__pyx_fuse_0_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_19__pyx_fuse_0_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_19__pyx_fuse_0_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0_clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0_clipping", 1, 2, 2, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0_clipping") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_clip_np = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0_clipping", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_0_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 45, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_18__pyx_fuse_0_clipping(__pyx_self, __pyx_v_X, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_18__pyx_fuse_0_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_8clipping__clipping(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_0_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_21__pyx_fuse_1_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_8clipping__clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int16_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":51 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":52 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":56 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":57 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":58 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":60 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":61 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":63 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":64 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":65 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping._clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_21__pyx_fuse_1_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_8clipping_21__pyx_fuse_1_clipping = {"__pyx_fuse_1_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_21__pyx_fuse_1_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_21__pyx_fuse_1_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1_clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1_clipping", 1, 2, 2, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1_clipping") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_clip_np = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1_clipping", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_1_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 45, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_20__pyx_fuse_1_clipping(__pyx_self, __pyx_v_X, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_20__pyx_fuse_1_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_8clipping__clipping(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_1_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_23__pyx_fuse_2_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_8clipping__clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int32_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":51 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":52 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":56 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":57 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":58 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":60 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":61 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":63 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":64 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":65 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping._clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_23__pyx_fuse_2_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_8clipping_23__pyx_fuse_2_clipping = {"__pyx_fuse_2_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_23__pyx_fuse_2_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_23__pyx_fuse_2_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2_clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2_clipping", 1, 2, 2, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2_clipping") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_clip_np = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2_clipping", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_2_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 45, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_22__pyx_fuse_2_clipping(__pyx_self, __pyx_v_X, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_22__pyx_fuse_2_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_8clipping__clipping(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_2_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_25__pyx_fuse_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_8clipping__clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_int64_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":51 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":52 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":56 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":57 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":58 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":60 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":61 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":63 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":64 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":65 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping._clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_25__pyx_fuse_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_8clipping_25__pyx_fuse_3_clipping = {"__pyx_fuse_3_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_25__pyx_fuse_3_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_25__pyx_fuse_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3_clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3_clipping", 1, 2, 2, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3_clipping") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_clip_np = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3_clipping", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_3_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 45, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_24__pyx_fuse_3_clipping(__pyx_self, __pyx_v_X, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_24__pyx_fuse_3_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_8clipping__clipping(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_3_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_27__pyx_fuse_4_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_8clipping__clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_float32_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":51 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":52 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":56 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":57 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":58 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":60 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":61 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":63 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":64 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":65 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping._clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_27__pyx_fuse_4_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_8clipping_27__pyx_fuse_4_clipping = {"__pyx_fuse_4_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_27__pyx_fuse_4_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_27__pyx_fuse_4_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4_clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4_clipping", 1, 2, 2, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4_clipping") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_clip_np = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4_clipping", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_4_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 45, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_26__pyx_fuse_4_clipping(__pyx_self, __pyx_v_X, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_26__pyx_fuse_4_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_8clipping__clipping(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_4_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_8clipping_29__pyx_fuse_5_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_8clipping_3_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_5__pyx_f_8clipping__clipping(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __pyx_t_5numpy_float64_t __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_5_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + + /* "clipping.pyx":51 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef num_t val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "clipping.pyx":52 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef num_t val + * + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "clipping.pyx":56 + * + * with nogil: + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, j] + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "clipping.pyx":57 + * with nogil: + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, j] + * if val < clip_np[j, 0]: + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "clipping.pyx":58 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, j] # <<<<<<<<<<<<<< + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_val = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 0; + __pyx_t_10 = (__pyx_v_val < (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":60 + * val = X[i, j] + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] # <<<<<<<<<<<<<< + * continue + * if val > clip_np[j, 1]: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 0; + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":61 + * if val < clip_np[j, 0]: + * X[i, j] = clip_np[j, 0] + * continue # <<<<<<<<<<<<<< + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":59 + * for i in range(n_rows): + * val = X[i, j] + * if val < clip_np[j, 0]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 0] + * continue + */ + } + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + __pyx_t_9 = __pyx_v_j; + __pyx_t_8 = 1; + __pyx_t_10 = (__pyx_v_val > (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "clipping.pyx":63 + * continue + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] # <<<<<<<<<<<<<< + * continue + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = 1; + __pyx_t_12 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_clip_np.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_clip_np.diminfo[1].strides)); + + /* "clipping.pyx":64 + * if val > clip_np[j, 1]: + * X[i, j] = clip_np[j, 1] + * continue # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_continue; + + /* "clipping.pyx":62 + * X[i, j] = clip_np[j, 0] + * continue + * if val > clip_np[j, 1]: # <<<<<<<<<<<<<< + * X[i, j] = clip_np[j, 1] + * continue + */ + } + __pyx_L8_continue:; + } + } + } + + /* "clipping.pyx":55 + * cdef num_t val + * + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "clipping.pyx":65 + * X[i, j] = clip_np[j, 1] + * continue + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping._clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_8clipping_29__pyx_fuse_5_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_5__pyx_mdef_8clipping_29__pyx_fuse_5_clipping = {"__pyx_fuse_5_clipping", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8clipping_29__pyx_fuse_5_clipping, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_8clipping_29__pyx_fuse_5_clipping(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_clip_np = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_5_clipping (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_clip_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_clip_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_5_clipping", 1, 2, 2, 1); __PYX_ERR(0, 44, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_5_clipping") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_clip_np = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_5_clipping", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 44, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("clipping.__pyx_fuse_5_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 45, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_clip_np), __pyx_ptype_5numpy_ndarray, 1, "clip_np", 0))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_r = __pyx_pf_8clipping_28__pyx_fuse_5_clipping(__pyx_self, __pyx_v_X, __pyx_v_clip_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_8clipping_28__pyx_fuse_5_clipping(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_clip_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_clip_np; + __Pyx_Buffer __pyx_pybuffer_clip_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_5_clipping", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_clip_np.pybuffer.buf = NULL; + __pyx_pybuffer_clip_np.refcount = 0; + __pyx_pybuffernd_clip_np.data = NULL; + __pyx_pybuffernd_clip_np.rcbuffer = &__pyx_pybuffer_clip_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_clip_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 44, __pyx_L1_error) + } + __pyx_pybuffernd_clip_np.diminfo[0].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_clip_np.diminfo[0].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_clip_np.diminfo[1].strides = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_clip_np.diminfo[1].shape = __pyx_pybuffernd_clip_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_5__pyx_f_8clipping__clipping(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_clip_np), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("clipping.__pyx_fuse_5_clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_clip_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_array) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_array___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_array_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_array}, + {Py_sq_length, (void *)__pyx_array___len__}, + {Py_sq_item, (void *)__pyx_sq_item_array}, + {Py_mp_length, (void *)__pyx_array___len__}, + {Py_mp_subscript, (void *)__pyx_array___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_array}, + {Py_tp_getattro, (void *)__pyx_tp_getattro_array}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_array_getbuffer}, + #endif + {Py_tp_methods, (void *)__pyx_methods_array}, + {Py_tp_getset, (void *)__pyx_getsets_array}, + {Py_tp_new, (void *)__pyx_tp_new_array}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_array_spec = { + "clipping.array", + sizeof(struct __pyx_array_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_array_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "clipping.""array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_Enum) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_specialmethod___pyx_MemviewEnum___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_MemviewEnum___repr__(self); +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_MemviewEnum___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_MemviewEnum_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_Enum}, + {Py_tp_repr, (void *)__pyx_MemviewEnum___repr__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_Enum}, + {Py_tp_clear, (void *)__pyx_tp_clear_Enum}, + {Py_tp_methods, (void *)__pyx_methods_Enum}, + {Py_tp_init, (void *)__pyx_MemviewEnum___init__}, + {Py_tp_new, (void *)__pyx_tp_new_Enum}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_MemviewEnum_spec = { + "clipping.Enum", + sizeof(struct __pyx_MemviewEnum_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_MemviewEnum_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "clipping.""Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_memoryview) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryview___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyObject *__pyx_specialmethod___pyx_memoryview___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_memoryview___repr__(self); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_memoryview___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"is_c_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_c_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"is_f_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_f_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy_fortran", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy_fortran, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_memoryview_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_memoryview}, + {Py_tp_repr, (void *)__pyx_memoryview___repr__}, + {Py_sq_length, (void *)__pyx_memoryview___len__}, + {Py_sq_item, (void *)__pyx_sq_item_memoryview}, + {Py_mp_length, (void *)__pyx_memoryview___len__}, + {Py_mp_subscript, (void *)__pyx_memoryview___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_memoryview}, + {Py_tp_str, (void *)__pyx_memoryview___str__}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_memoryview_getbuffer}, + #endif + {Py_tp_traverse, (void *)__pyx_tp_traverse_memoryview}, + {Py_tp_clear, (void *)__pyx_tp_clear_memoryview}, + {Py_tp_methods, (void *)__pyx_methods_memoryview}, + {Py_tp_getset, (void *)__pyx_getsets_memoryview}, + {Py_tp_new, (void *)__pyx_tp_new_memoryview}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryview_spec = { + "clipping.memoryview", + sizeof(struct __pyx_memoryview_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_memoryview_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "clipping.""memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc__memoryviewslice) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryviewslice___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XCLEAR_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_memoryviewslice_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc__memoryviewslice}, + {Py_tp_doc, (void *)PyDoc_STR("Internal class for passing memoryview slices to Python")}, + {Py_tp_traverse, (void *)__pyx_tp_traverse__memoryviewslice}, + {Py_tp_clear, (void *)__pyx_tp_clear__memoryviewslice}, + {Py_tp_methods, (void *)__pyx_methods__memoryviewslice}, + {Py_tp_new, (void *)__pyx_tp_new__memoryviewslice}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryviewslice_spec = { + "clipping._memoryviewslice", + sizeof(struct __pyx_memoryviewslice_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_memoryviewslice_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "clipping.""_memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + PyDoc_STR("Internal class for passing memoryview slices to Python"), /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_k_All_dimensions_preceding_dimensi, sizeof(__pyx_k_All_dimensions_preceding_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_u_Cannot_index_with_type, __pyx_k_Cannot_index_with_type, sizeof(__pyx_k_Cannot_index_with_type), 0, 1, 0, 0}, + {&__pyx_kp_s_Cannot_transpose_memoryview_with, __pyx_k_Cannot_transpose_memoryview_with, sizeof(__pyx_k_Cannot_transpose_memoryview_with), 0, 0, 1, 0}, + {&__pyx_kp_s_Dimension_d_is_not_direct, __pyx_k_Dimension_d_is_not_direct, sizeof(__pyx_k_Dimension_d_is_not_direct), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_k_Expected_at_least_d_argument_s_g, sizeof(__pyx_k_Expected_at_least_d_argument_s_g), 0, 0, 1, 0}, + {&__pyx_kp_s_Function_call_with_ambiguous_arg, __pyx_k_Function_call_with_ambiguous_arg, sizeof(__pyx_k_Function_call_with_ambiguous_arg), 0, 0, 1, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_k_Index_out_of_bounds_axis_d, sizeof(__pyx_k_Index_out_of_bounds_axis_d), 0, 0, 1, 0}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 1, 0, 0}, + {&__pyx_kp_u_Invalid_shape_in_axis, __pyx_k_Invalid_shape_in_axis, sizeof(__pyx_k_Invalid_shape_in_axis), 0, 1, 0, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_kp_s_No_matching_signature_found, __pyx_k_No_matching_signature_found, sizeof(__pyx_k_No_matching_signature_found), 0, 0, 1, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_u_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 1, 0, 0}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_Sequence, __pyx_k_Sequence, sizeof(__pyx_k_Sequence), 0, 0, 1, 1}, + {&__pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_k_Step_may_not_be_zero_axis_d, sizeof(__pyx_k_Step_may_not_be_zero_axis_d), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0}, + {&__pyx_kp_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 0}, + {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, + {&__pyx_n_s__42, __pyx_k__42, sizeof(__pyx_k__42), 0, 0, 1, 1}, + {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_n_s_abc, __pyx_k_abc, sizeof(__pyx_k_abc), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_kp_u_and, __pyx_k_and, sizeof(__pyx_k_and), 0, 1, 0, 0}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_clip_np, __pyx_k_clip_np, sizeof(__pyx_k_clip_np), 0, 0, 1, 1}, + {&__pyx_n_s_clipping, __pyx_k_clipping, sizeof(__pyx_k_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_clipping_2, __pyx_k_clipping_2, sizeof(__pyx_k_clipping_2), 0, 0, 1, 1}, + {&__pyx_n_s_collections, __pyx_k_collections, sizeof(__pyx_k_collections), 0, 0, 1, 1}, + {&__pyx_kp_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, + {&__pyx_n_s_defaults, __pyx_k_defaults, sizeof(__pyx_k_defaults), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32_t, __pyx_k_float32_t, sizeof(__pyx_k_float32_t), 0, 0, 1, 1}, + {&__pyx_n_s_float64_t, __pyx_k_float64_t, sizeof(__pyx_k_float64_t), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_fused_sigindex, __pyx_k_fused_sigindex, sizeof(__pyx_k_fused_sigindex), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_clipping_clipping_pyx, __pyx_k_gators_clipping_clipping_pyx, sizeof(__pyx_k_gators_clipping_clipping_pyx), 0, 0, 1, 0}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_u_got, __pyx_k_got, sizeof(__pyx_k_got), 0, 1, 0, 0}, + {&__pyx_kp_u_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 1, 0, 0}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_int16_t, __pyx_k_int16_t, sizeof(__pyx_k_int16_t), 0, 0, 1, 1}, + {&__pyx_n_s_int32_t, __pyx_k_int32_t, sizeof(__pyx_k_int32_t), 0, 0, 1, 1}, + {&__pyx_n_s_int64_t, __pyx_k_int64_t, sizeof(__pyx_k_int64_t), 0, 0, 1, 1}, + {&__pyx_n_s_int8_t, __pyx_k_int8_t, sizeof(__pyx_k_int8_t), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_kind, __pyx_k_kind, sizeof(__pyx_k_kind), 0, 0, 1, 1}, + {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0_clipping, __pyx_k_pyx_fuse_0_clipping, sizeof(__pyx_k_pyx_fuse_0_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0clipping, __pyx_k_pyx_fuse_0clipping, sizeof(__pyx_k_pyx_fuse_0clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1_clipping, __pyx_k_pyx_fuse_1_clipping, sizeof(__pyx_k_pyx_fuse_1_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1clipping, __pyx_k_pyx_fuse_1clipping, sizeof(__pyx_k_pyx_fuse_1clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2_clipping, __pyx_k_pyx_fuse_2_clipping, sizeof(__pyx_k_pyx_fuse_2_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2clipping, __pyx_k_pyx_fuse_2clipping, sizeof(__pyx_k_pyx_fuse_2clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3_clipping, __pyx_k_pyx_fuse_3_clipping, sizeof(__pyx_k_pyx_fuse_3_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3clipping, __pyx_k_pyx_fuse_3clipping, sizeof(__pyx_k_pyx_fuse_3clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4_clipping, __pyx_k_pyx_fuse_4_clipping, sizeof(__pyx_k_pyx_fuse_4_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4clipping, __pyx_k_pyx_fuse_4clipping, sizeof(__pyx_k_pyx_fuse_4clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_5_clipping, __pyx_k_pyx_fuse_5_clipping, sizeof(__pyx_k_pyx_fuse_5_clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_5clipping, __pyx_k_pyx_fuse_5clipping, sizeof(__pyx_k_pyx_fuse_5clipping), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1}, + {&__pyx_n_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_signatures, __pyx_k_signatures, sizeof(__pyx_k_signatures), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_builtin___import__ = __Pyx_GetBuiltinName(__pyx_n_s_import); if (!__pyx_builtin___import__) __PYX_ERR(1, 100, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 156, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 159, __pyx_L1_error) + __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(1, 373, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 408, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 618, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 914, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__4 = PyTuple_New(1); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_tuple__4, 0, __pyx_int_neg_1)) __PYX_ERR(1, 582, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_slice__5 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_tuple__8 = PyTuple_Pack(3, __pyx_int_136983863, __pyx_int_112105877, __pyx_int_184977713); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_No_matching_signature_found); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_Function_call_with_ambiguous_arg); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_n_s_sys); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_tuple__16 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_3); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_collections_abc); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_n_s_collections); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__24 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__26 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_clip_np); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_0clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_0clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_1clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_2clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_3clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_4clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_5clipping, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 16, __pyx_L1_error) + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + __pyx_tuple__34 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_clip_np); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__34); + __Pyx_GIVEREF(__pyx_tuple__34); + __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_0_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_0_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_1_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_2_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_3_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_4_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_clipping_clipping_pyx, __pyx_n_s_pyx_fuse_5_clipping, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get; + __pyx_umethod_PyDict_Type_values.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_values.method_name = &__pyx_n_s_values; + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_112105877 = PyInt_FromLong(112105877L); if (unlikely(!__pyx_int_112105877)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_136983863 = PyInt_FromLong(136983863L); if (unlikely(!__pyx_int_136983863)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* AssertionsEnabled.init */ + if (likely(__Pyx_init_assertions_enabled() == 0)); else + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_collections_abc_Sequence = Py_None; Py_INCREF(Py_None); + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + #if CYTHON_USE_TYPE_SPECS + __pyx_array_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_array_spec, NULL); if (unlikely(!__pyx_array_type)) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_array_type->tp_as_buffer = &__pyx_tp_as_buffer_array; + if (!__pyx_array_type->tp_as_buffer->bf_releasebuffer && __pyx_array_type->tp_base->tp_as_buffer && __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_array_type->tp_as_buffer->bf_releasebuffer = __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_array_spec, __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #else + __pyx_array_type = &__pyx_type___pyx_array; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_array_type->tp_print = 0; + #endif + if (__Pyx_SetVtable(__pyx_array_type, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_MemviewEnum_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_MemviewEnum_spec, NULL); if (unlikely(!__pyx_MemviewEnum_type)) __PYX_ERR(1, 302, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_MemviewEnum_spec, __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #else + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_MemviewEnum_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_MemviewEnum_type->tp_dictoffset && __pyx_MemviewEnum_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_MemviewEnum_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + __pyx_vtable_memoryview._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryview__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_memoryview_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryview_spec, NULL); if (unlikely(!__pyx_memoryview_type)) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryview_type->tp_as_buffer = &__pyx_tp_as_buffer_memoryview; + if (!__pyx_memoryview_type->tp_as_buffer->bf_releasebuffer && __pyx_memoryview_type->tp_base->tp_as_buffer && __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_memoryview_type->tp_as_buffer->bf_releasebuffer = __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryview_spec, __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #else + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryview_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryview_type->tp_dictoffset && __pyx_memoryview_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryview_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryview_type, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_vtable__memoryviewslice.__pyx_base._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryviewslice__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_memoryview_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 952, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_memoryviewslice_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryviewslice_spec, __pyx_t_1); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_memoryviewslice_type)) __PYX_ERR(1, 952, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryviewslice_spec, __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #else + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryviewslice_type->tp_base = __pyx_memoryview_type; + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryviewslice_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryviewslice_type->tp_dictoffset && __pyx_memoryviewslice_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryviewslice_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryviewslice_type, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_clipping(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_clipping}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "clipping", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initclipping(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initclipping(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_clipping(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_clipping(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_clipping(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + static PyThread_type_lock __pyx_t_8[8]; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'clipping' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("clipping", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "clipping" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_clipping(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_clipping) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "clipping")) { + if (unlikely((PyDict_SetItemString(modules, "clipping", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_version_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_tuple__16, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_abc); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L7_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":104 + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + * except: # <<<<<<<<<<<<<< + * + * __pyx_collections_abc_Sequence = None + */ + /*except:*/ { + __Pyx_AddTraceback("View.MemoryView", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(1, 104, __pyx_L4_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + + /* "View.MemoryView":106 + * except: + * + * __pyx_collections_abc_Sequence = None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF(Py_None); + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + __pyx_L4_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L7_try_end:; + } + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":242 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":243 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L16_try_end; + __pyx_L11_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":244 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L12_exception_handled; + } + __pyx_L12_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L16_try_end:; + } + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":323 + * + * + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":324 + * + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_8[0] = PyThread_allocate_lock(); + __pyx_t_8[1] = PyThread_allocate_lock(); + __pyx_t_8[2] = PyThread_allocate_lock(); + __pyx_t_8[3] = PyThread_allocate_lock(); + __pyx_t_8[4] = PyThread_allocate_lock(); + __pyx_t_8[5] = PyThread_allocate_lock(); + __pyx_t_8[6] = PyThread_allocate_lock(); + __pyx_t_8[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_8, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":983 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":984 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L22_try_end; + __pyx_L17_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":985 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L18_exception_handled; + } + __pyx_L18_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L22_try_end:; + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_collections_abc_Sequence); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 989, __pyx_L23_error) + if (__pyx_t_6) { + + /* "View.MemoryView":993 + * + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence.register(array) + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, ((PyObject *)__pyx_memoryviewslice_type)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":994 + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) # <<<<<<<<<<<<<< + * except: + * pass # ignore failure, it's a minor issue + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_array_type)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L28_try_end; + __pyx_L23_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":995 + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) + * except: # <<<<<<<<<<<<<< + * pass # ignore failure, it's a minor issue + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L24_exception_handled; + } + __pyx_L24_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L28_try_end:; + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_7 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_7) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "clipping.pyx":2 + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * + */ + __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "clipping.pyx":16 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_8clipping_5__pyx_fuse_0clipping, 0, __pyx_n_s_pyx_fuse_0clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_8clipping_7__pyx_fuse_1clipping, 0, __pyx_n_s_pyx_fuse_1clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_8clipping_9__pyx_fuse_2clipping, 0, __pyx_n_s_pyx_fuse_2clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_8clipping_11__pyx_fuse_3clipping, 0, __pyx_n_s_pyx_fuse_3clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_8clipping_13__pyx_fuse_4clipping, 0, __pyx_n_s_pyx_fuse_4clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_5__pyx_mdef_8clipping_15__pyx_fuse_5clipping, 0, __pyx_n_s_pyx_fuse_5clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_8clipping_5__pyx_fuse_0clipping, 0, __pyx_n_s_pyx_fuse_0clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int8_t, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_8clipping_7__pyx_fuse_1clipping, 0, __pyx_n_s_pyx_fuse_1clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int16_t, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_8clipping_9__pyx_fuse_2clipping, 0, __pyx_n_s_pyx_fuse_2clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int32_t, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_8clipping_11__pyx_fuse_3clipping, 0, __pyx_n_s_pyx_fuse_3clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int64_t, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_8clipping_13__pyx_fuse_4clipping, 0, __pyx_n_s_pyx_fuse_4clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_5__pyx_mdef_8clipping_15__pyx_fuse_5clipping, 0, __pyx_n_s_pyx_fuse_5clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_8clipping_1clipping, 0, __pyx_n_s_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults), 1)) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping, __pyx_t_4) < 0) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "clipping.pyx":44 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim=2] _clipping( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[num_t, ndim=2] clip_np, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_8clipping_19__pyx_fuse_0_clipping, 0, __pyx_n_s_pyx_fuse_0_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_4) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_8clipping_21__pyx_fuse_1_clipping, 0, __pyx_n_s_pyx_fuse_1_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_4) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_8clipping_23__pyx_fuse_2_clipping, 0, __pyx_n_s_pyx_fuse_2_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_4) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_8clipping_25__pyx_fuse_3_clipping, 0, __pyx_n_s_pyx_fuse_3_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_4) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_8clipping_27__pyx_fuse_4_clipping, 0, __pyx_n_s_pyx_fuse_4_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_4) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_5__pyx_mdef_8clipping_29__pyx_fuse_5_clipping, 0, __pyx_n_s_pyx_fuse_5_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_4) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_8clipping_19__pyx_fuse_0_clipping, 0, __pyx_n_s_pyx_fuse_0_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int8_t, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_8clipping_21__pyx_fuse_1_clipping, 0, __pyx_n_s_pyx_fuse_1_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int16_t, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_8clipping_23__pyx_fuse_2_clipping, 0, __pyx_n_s_pyx_fuse_2_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int32_t, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_8clipping_25__pyx_fuse_3_clipping, 0, __pyx_n_s_pyx_fuse_3_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int64_t, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_8clipping_27__pyx_fuse_4_clipping, 0, __pyx_n_s_pyx_fuse_4_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_5__pyx_mdef_8clipping_29__pyx_fuse_5_clipping, 0, __pyx_n_s_pyx_fuse_5_clipping, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_8clipping_3_clipping, 0, __pyx_n_s_clipping_2, NULL, __pyx_n_s_clipping, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults1), 1)) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_clipping_2, __pyx_t_7) < 0) __PYX_ERR(0, 44, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "clipping.pyx":1 + * import cython # <<<<<<<<<<<<<< + * import numpy as np + * cimport numpy as np + */ + __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init clipping", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init clipping"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* CIntToDigits */ +static const char DIGIT_PAIRS_10[2*10*10+1] = { + "00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" +}; +static const char DIGIT_PAIRS_8[2*8*8+1] = { + "0001020304050607" + "1011121314151617" + "2021222324252627" + "3031323334353637" + "4041424344454647" + "5051525354555657" + "6061626364656667" + "7071727374757677" +}; +static const char DIGITS_HEX[2*16+1] = { + "0123456789abcdef" + "0123456789ABCDEF" +}; + +/* BuildPyUnicode */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char) { + PyObject *uval; + Py_ssize_t uoffset = ulength - clength; +#if CYTHON_USE_UNICODE_INTERNALS + Py_ssize_t i; +#if CYTHON_PEP393_ENABLED + void *udata; + uval = PyUnicode_New(ulength, 127); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_DATA(uval); +#else + Py_UNICODE *udata; + uval = PyUnicode_FromUnicode(NULL, ulength); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_AS_UNICODE(uval); +#endif + if (uoffset > 0) { + i = 0; + if (prepend_sign) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-'); + i++; + } + for (; i < uoffset; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char); + } + } + for (i=0; i < clength; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]); + } +#else + { + PyObject *sign = NULL, *padding = NULL; + uval = NULL; + if (uoffset > 0) { + prepend_sign = !!prepend_sign; + if (uoffset > prepend_sign) { + padding = PyUnicode_FromOrdinal(padding_char); + if (likely(padding) && uoffset > prepend_sign + 1) { + PyObject *tmp; + PyObject *repeat = PyInt_FromSsize_t(uoffset - prepend_sign); + if (unlikely(!repeat)) goto done_or_error; + tmp = PyNumber_Multiply(padding, repeat); + Py_DECREF(repeat); + Py_DECREF(padding); + padding = tmp; + } + if (unlikely(!padding)) goto done_or_error; + } + if (prepend_sign) { + sign = PyUnicode_FromOrdinal('-'); + if (unlikely(!sign)) goto done_or_error; + } + } + uval = PyUnicode_DecodeASCII(chars, clength, NULL); + if (likely(uval) && padding) { + PyObject *tmp = PyNumber_Add(padding, uval); + Py_DECREF(uval); + uval = tmp; + } + if (likely(uval) && sign) { + PyObject *tmp = PyNumber_Add(sign, uval); + Py_DECREF(uval); + uval = tmp; + } +done_or_error: + Py_XDECREF(padding); + Py_XDECREF(sign); + } +#endif + return uval; +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(int)*3+2]; + char *dpos, *end = digits + sizeof(int)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + int remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (int) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (int) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (int) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(Py_ssize_t)*3+2]; + char *dpos, *end = digits + sizeof(Py_ssize_t)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + Py_ssize_t remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const Py_ssize_t neg_one = (Py_ssize_t) -1, const_zero = (Py_ssize_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (Py_ssize_t) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (Py_ssize_t) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (Py_ssize_t) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* JoinPyUnicode */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char) { +#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *result_uval; + int result_ukind, kind_shift; + Py_ssize_t i, char_pos; + void *result_udata; + CYTHON_MAYBE_UNUSED_VAR(max_char); +#if CYTHON_PEP393_ENABLED + result_uval = PyUnicode_New(result_ulength, max_char); + if (unlikely(!result_uval)) return NULL; + result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND; + kind_shift = (result_ukind == PyUnicode_4BYTE_KIND) ? 2 : result_ukind - 1; + result_udata = PyUnicode_DATA(result_uval); +#else + result_uval = PyUnicode_FromUnicode(NULL, result_ulength); + if (unlikely(!result_uval)) return NULL; + result_ukind = sizeof(Py_UNICODE); + kind_shift = (result_ukind == 4) ? 2 : result_ukind - 1; + result_udata = PyUnicode_AS_UNICODE(result_uval); +#endif + assert(kind_shift == 2 || kind_shift == 1 || kind_shift == 0); + char_pos = 0; + for (i=0; i < value_count; i++) { + int ukind; + Py_ssize_t ulength; + void *udata; + PyObject *uval = PyTuple_GET_ITEM(value_tuple, i); + if (unlikely(__Pyx_PyUnicode_READY(uval))) + goto bad; + ulength = __Pyx_PyUnicode_GET_LENGTH(uval); + if (unlikely(!ulength)) + continue; + if (unlikely((PY_SSIZE_T_MAX >> kind_shift) - ulength < char_pos)) + goto overflow; + ukind = __Pyx_PyUnicode_KIND(uval); + udata = __Pyx_PyUnicode_DATA(uval); + if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) { + memcpy((char *)result_udata + (char_pos << kind_shift), udata, (size_t) (ulength << kind_shift)); + } else { + #if PY_VERSION_HEX >= 0x030d0000 + if (unlikely(PyUnicode_CopyCharacters(result_uval, char_pos, uval, 0, ulength) < 0)) goto bad; + #elif CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters) + _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength); + #else + Py_ssize_t j; + for (j=0; j < ulength; j++) { + Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j); + __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar); + } + #endif + } + char_pos += ulength; + } + return result_uval; +overflow: + PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string"); +bad: + Py_DECREF(result_uval); + return NULL; +#else + CYTHON_UNUSED_VAR(max_char); + CYTHON_UNUSED_VAR(result_ulength); + CYTHON_UNUSED_VAR(value_count); + return PyUnicode_Join(__pyx_empty_unicode, value_tuple); +#endif +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kw, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { + Py_ssize_t kwsize; +#if CYTHON_ASSUME_SAFE_MACROS + kwsize = PyTuple_GET_SIZE(kw); +#else + kwsize = PyTuple_Size(kw); + if (kwsize < 0) return 0; +#endif + if (unlikely(kwsize == 0)) + return 1; + if (!kw_allowed) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, 0); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + goto invalid_keyword; + } +#if PY_VERSION_HEX < 0x03090000 + for (pos = 0; pos < kwsize; pos++) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, pos); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } +#endif + return 1; + } + while (PyDict_Next(kw, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if (!kw_allowed && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* DivInt[Py_ssize_t] */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__3; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; itp_as_sequence && type->tp_as_sequence->sq_repeat)) { + return type->tp_as_sequence->sq_repeat(seq, mul); + } else +#endif + { + return __Pyx_PySequence_Multiply_Generic(seq, mul); + } +} + +/* SetItemInt */ +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { + int r; + if (unlikely(!j)) return -1; + r = PyObject_SetItem(o, j, v); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, + CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_ass_subscript) { + int r; + PyObject *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return -1; + r = mm->mp_ass_subscript(o, key, v); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_ass_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return -1; + PyErr_Clear(); + } + } + return sm->sq_ass_item(o, i, v); + } + } +#else + if (is_list || !PyMapping_Check(o)) + { + return PySequence_SetItem(o, i, v); + } +#endif + return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); +} + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* DivInt[long] */ +static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__2); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} +#endif + +/* DictGetItem */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* UnicodeAsUCS4 */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ +static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + __Pyx_TypeName c_type_name = __Pyx_PyType_GetName(Py_TYPE(c)); + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but " __Pyx_FMT_TYPENAME " found", + c_type_name); + __Pyx_DECREF_TypeName(c_type_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* memoryview_get_from_buffer */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj) { + Py_ssize_t result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_itemsize); + if (!attr) { + goto bad; + } + result = PyLong_AsSsize_t(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* memoryview_get_from_buffer */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj) { + int result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_ndim); + if (!attr) { + goto bad; + } + result = PyLong_AsLong(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* IterFinish */ +static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* PyObjectCallNoArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* UnpackItemEndCheck */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* UnpackTupleError */ +static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ +#if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* UnpackUnboundCMethod */ +static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { + PyObject *result; + PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); + if (unlikely(!selfless_args)) return NULL; + result = PyObject_Call(method, selfless_args, kwargs); + Py_DECREF(selfless_args); + return result; +} +static PyMethodDef __Pyx_UnboundCMethod_Def = { + "CythonUnboundCMethod", + __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), + METH_VARARGS | METH_KEYWORDS, + NULL +}; +static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { + PyObject *method; + method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); + if (unlikely(!method)) + return -1; + target->method = method; +#if CYTHON_COMPILING_IN_CPYTHON + #if PY_MAJOR_VERSION >= 3 + if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) + #else + if (likely(!__Pyx_CyOrPyCFunction_Check(method))) + #endif + { + PyMethodDescrObject *descr = (PyMethodDescrObject*) method; + target->func = descr->d_method->ml_meth; + target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); + } else +#endif +#if CYTHON_COMPILING_IN_PYPY +#else + if (PyCFunction_Check(method)) +#endif + { + PyObject *self; + int self_found; +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + self = PyObject_GetAttrString(method, "__self__"); + if (!self) { + PyErr_Clear(); + } +#else + self = PyCFunction_GET_SELF(method); +#endif + self_found = (self && self != Py_None); +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + Py_XDECREF(self); +#endif + if (self_found) { + PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); + if (unlikely(!unbound_method)) return -1; + Py_DECREF(method); + target->method = unbound_method; + } + } + return 0; +} + +/* CallUnboundCMethod0 */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) { + PyObject *args, *result = NULL; + if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_ASSUME_SAFE_MACROS + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); +#else + args = PyTuple_Pack(1, self); + if (unlikely(!args)) goto bad; +#endif + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + Py_DECREF(args); +bad: + return result; +} + +/* py_dict_values */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) { + if (PY_MAJOR_VERSION >= 3) + return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_values, d); + else + return PyDict_Values(d); +} + +/* CallUnboundCMethod1 */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) { + if (likely(cfunc->func)) { + int flag = cfunc->flag; + if (flag == METH_O) { + return (*(cfunc->func))(self, arg); + } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + #endif + } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) { + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + } + } + return __Pyx__CallUnboundCMethod1(cfunc, self, arg); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(2, self, arg); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* CallUnboundCMethod2 */ +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) { + if (likely(cfunc->func)) { + PyObject *args[2] = {arg1, arg2}; + if (cfunc->flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + #if PY_VERSION_HEX >= 0x030700A0 + if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS)) + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(3); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 1, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 2, arg2); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(3, self, arg1, arg2); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* dict_getitem_default */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { + PyObject* value; +#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (unlikely(PyErr_Occurred())) + return NULL; + value = default_value; + } + Py_INCREF(value); + if ((1)); +#else + if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { + value = PyDict_GetItem(d, key); + if (unlikely(!value)) { + value = default_value; + } + Py_INCREF(value); + } +#endif + else { + if (default_value == Py_None) + value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key); + else + value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value); + } + return value; +} + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ + #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ + static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* SetVTable */ + static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ + static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* FusedFunction */ + static PyObject * +__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code) +{ + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_FusedFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + __pyx_FusedFunctionObject *fusedfunc = (__pyx_FusedFunctionObject *) op; + fusedfunc->__signatures__ = NULL; + fusedfunc->self = NULL; + PyObject_GC_Track(op); + } + return op; +} +static void +__pyx_FusedFunction_dealloc(__pyx_FusedFunctionObject *self) +{ + PyObject_GC_UnTrack(self); + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + __Pyx__CyFunction_dealloc((__pyx_CyFunctionObject *) self); +} +static int +__pyx_FusedFunction_traverse(__pyx_FusedFunctionObject *self, + visitproc visit, + void *arg) +{ + Py_VISIT(self->self); + Py_VISIT(self->__signatures__); + return __Pyx_CyFunction_traverse((__pyx_CyFunctionObject *) self, visit, arg); +} +static int +__pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self) +{ + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + return __Pyx_CyFunction_clear((__pyx_CyFunctionObject *) self); +} +static PyObject * +__pyx_FusedFunction_descr_get(PyObject *self, PyObject *obj, PyObject *type) +{ + __pyx_FusedFunctionObject *func, *meth; + func = (__pyx_FusedFunctionObject *) self; + if (func->self || func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(self); + return self; + } + if (obj == Py_None) + obj = NULL; + if (func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD) + obj = type; + if (obj == NULL) { + Py_INCREF(self); + return self; + } + meth = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_New( + ((PyCFunctionObject *) func)->m_ml, + ((__pyx_CyFunctionObject *) func)->flags, + ((__pyx_CyFunctionObject *) func)->func_qualname, + ((__pyx_CyFunctionObject *) func)->func_closure, + ((PyCFunctionObject *) func)->m_module, + ((__pyx_CyFunctionObject *) func)->func_globals, + ((__pyx_CyFunctionObject *) func)->func_code); + if (unlikely(!meth)) + return NULL; + if (func->func.defaults) { + PyObject **pydefaults; + int i; + if (unlikely(!__Pyx_CyFunction_InitDefaults( + (PyObject*)meth, + func->func.defaults_size, + func->func.defaults_pyobjects))) { + Py_XDECREF((PyObject*)meth); + return NULL; + } + memcpy(meth->func.defaults, func->func.defaults, func->func.defaults_size); + pydefaults = __Pyx_CyFunction_Defaults(PyObject *, meth); + for (i = 0; i < meth->func.defaults_pyobjects; i++) + Py_XINCREF(pydefaults[i]); + } + __Pyx_CyFunction_SetClassObj(meth, __Pyx_CyFunction_GetClassObj(func)); + Py_XINCREF(func->__signatures__); + meth->__signatures__ = func->__signatures__; + Py_XINCREF(func->func.defaults_tuple); + meth->func.defaults_tuple = func->func.defaults_tuple; + Py_XINCREF(obj); + meth->self = obj; + return (PyObject *) meth; +} +static PyObject * +_obj_to_string(PyObject *obj) +{ + if (PyUnicode_CheckExact(obj)) + return __Pyx_NewRef(obj); +#if PY_MAJOR_VERSION == 2 + else if (PyString_Check(obj)) + return PyUnicode_FromEncodedObject(obj, NULL, "strict"); +#endif + else if (PyType_Check(obj)) + return PyObject_GetAttr(obj, __pyx_n_s_name_2); + else + return PyObject_Unicode(obj); +} +static PyObject * +__pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx) +{ + PyObject *signature = NULL; + PyObject *unbound_result_func; + PyObject *result_func = NULL; + if (unlikely(self->__signatures__ == NULL)) { + PyErr_SetString(PyExc_TypeError, "Function is not fused"); + return NULL; + } + if (PyTuple_Check(idx)) { + Py_ssize_t n = PyTuple_GET_SIZE(idx); + PyObject *list = PyList_New(n); + int i; + if (unlikely(!list)) + return NULL; + for (i = 0; i < n; i++) { + PyObject *string; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(idx, i); +#else + PyObject *item = PySequence_ITEM(idx, i); if (unlikely(!item)) goto __pyx_err; +#endif + string = _obj_to_string(item); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(item); +#endif + if (unlikely(!string)) goto __pyx_err; + PyList_SET_ITEM(list, i, string); + } + signature = PyUnicode_Join(__pyx_kp_u__12, list); +__pyx_err:; + Py_DECREF(list); + } else { + signature = _obj_to_string(idx); + } + if (unlikely(!signature)) + return NULL; + unbound_result_func = PyObject_GetItem(self->__signatures__, signature); + if (likely(unbound_result_func)) { + if (self->self) { + __pyx_FusedFunctionObject *unbound = (__pyx_FusedFunctionObject *) unbound_result_func; + __Pyx_CyFunction_SetClassObj(unbound, __Pyx_CyFunction_GetClassObj(self)); + result_func = __pyx_FusedFunction_descr_get(unbound_result_func, + self->self, self->self); + } else { + result_func = unbound_result_func; + Py_INCREF(result_func); + } + } + Py_DECREF(signature); + Py_XDECREF(unbound_result_func); + return result_func; +} +static PyObject * +__pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; + int static_specialized = (cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD && + !((__pyx_FusedFunctionObject *) func)->__signatures__); + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !static_specialized) { + return __Pyx_CyFunction_CallAsMethod(func, args, kw); + } else { + return __Pyx_CyFunction_Call(func, args, kw); + } +} +static PyObject * +__pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_FusedFunctionObject *binding_func = (__pyx_FusedFunctionObject *) func; + Py_ssize_t argc = PyTuple_GET_SIZE(args); + PyObject *new_args = NULL; + __pyx_FusedFunctionObject *new_func = NULL; + PyObject *result = NULL; + int is_staticmethod = binding_func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD; + if (binding_func->self) { + PyObject *self; + Py_ssize_t i; + new_args = PyTuple_New(argc + 1); + if (unlikely(!new_args)) + return NULL; + self = binding_func->self; + Py_INCREF(self); + PyTuple_SET_ITEM(new_args, 0, self); + self = NULL; + for (i = 0; i < argc; i++) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(args, i); + Py_INCREF(item); +#else + PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad; +#endif + PyTuple_SET_ITEM(new_args, i + 1, item); + } + args = new_args; + } + if (binding_func->__signatures__) { + PyObject *tup; + if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) { + tup = PyTuple_Pack(3, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod( + func, binding_func->__signatures__, tup, NULL); + } else { + tup = PyTuple_Pack(4, binding_func->__signatures__, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL); + } + Py_DECREF(tup); + if (unlikely(!new_func)) + goto bad; + __Pyx_CyFunction_SetClassObj(new_func, __Pyx_CyFunction_GetClassObj(binding_func)); + func = (PyObject *) new_func; + } + result = __pyx_FusedFunction_callfunction(func, args, kw); +bad: + Py_XDECREF(new_args); + Py_XDECREF((PyObject *) new_func); + return result; +} +static PyMemberDef __pyx_FusedFunction_members[] = { + {(char *) "__signatures__", + T_OBJECT, + offsetof(__pyx_FusedFunctionObject, __signatures__), + READONLY, + 0}, + {(char *) "__self__", T_OBJECT_EX, offsetof(__pyx_FusedFunctionObject, self), READONLY, 0}, + {0, 0, 0, 0, 0}, +}; +static PyGetSetDef __pyx_FusedFunction_getsets[] = { + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_FusedFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__pyx_FusedFunction_dealloc}, + {Py_tp_call, (void *)__pyx_FusedFunction_call}, + {Py_tp_traverse, (void *)__pyx_FusedFunction_traverse}, + {Py_tp_clear, (void *)__pyx_FusedFunction_clear}, + {Py_tp_members, (void *)__pyx_FusedFunction_members}, + {Py_tp_getset, (void *)__pyx_FusedFunction_getsets}, + {Py_tp_descr_get, (void *)__pyx_FusedFunction_descr_get}, + {Py_mp_subscript, (void *)__pyx_FusedFunction_getitem}, + {0, 0}, +}; +static PyType_Spec __pyx_FusedFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_FusedFunctionType_slots +}; +#else +static PyMappingMethods __pyx_FusedFunction_mapping_methods = { + 0, + (binaryfunc) __pyx_FusedFunction_getitem, + 0, +}; +static PyTypeObject __pyx_FusedFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + (destructor) __pyx_FusedFunction_dealloc, + 0, + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + 0, + 0, + 0, + &__pyx_FusedFunction_mapping_methods, + 0, + (ternaryfunc) __pyx_FusedFunction_call, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __pyx_FusedFunction_traverse, + (inquiry) __pyx_FusedFunction_clear, + 0, + 0, + 0, + 0, + 0, + __pyx_FusedFunction_members, + __pyx_FusedFunction_getsets, + &__pyx_CyFunctionType_type, + 0, + __pyx_FusedFunction_descr_get, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_FusedFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + PyObject *bases = PyTuple_Pack(1, __pyx_CyFunctionType); + if (unlikely(!bases)) { + return -1; + } + __pyx_FusedFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_FusedFunctionType_spec, bases); + Py_DECREF(bases); +#else + CYTHON_UNUSED_VAR(module); + __pyx_FusedFunctionType_type.tp_base = __pyx_CyFunctionType; + __pyx_FusedFunctionType = __Pyx_FetchCommonType(&__pyx_FusedFunctionType_type); +#endif + if (unlikely(__pyx_FusedFunctionType == NULL)) { + return -1; + } + return 0; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (unlikely(buf->strides[dim] != sizeof(void *))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (unlikely(buf->strides[dim] != buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (unlikely(stride < buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (unlikely(buf->suboffsets)) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, int ndim, int spec) +{ + CYTHON_UNUSED_VAR(ndim); + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (unlikely(buf->ndim != ndim)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; + } + if (unlikely((unsigned) buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->len > 0) { + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; + } + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) + goto fail; + } + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int8_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int8_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* PyUCS4InUnicode */ + #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if PY_VERSION_HEX < 0x03090000 +#define __Pyx_PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(op) +#define __Pyx_PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(op) +#else +#define __Pyx_PyUnicode_AS_UNICODE(op) (((PyASCIIObject *)(op))->wstr) +#define __Pyx_PyUnicode_GET_SIZE(op) ((PyCompactUnicodeObject *)(op))->wstr_length +#endif +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 +static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE high_val, low_val; + Py_UNICODE* pos; + high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1))); + low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1))); + for (pos=buffer; pos < buffer+length-1; pos++) { + if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1; + } + return 0; +} +#endif +static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE uchar; + Py_UNICODE* pos; + uchar = (Py_UNICODE) character; + for (pos=buffer; pos < buffer+length; pos++) { + if (unlikely(uchar == pos[0])) return 1; + } + return 0; +} +#endif +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { +#if CYTHON_PEP393_ENABLED + const int kind = PyUnicode_KIND(unicode); + #ifdef PyUnicode_WCHAR_KIND + if (likely(kind != PyUnicode_WCHAR_KIND)) + #endif + { + Py_ssize_t i; + const void* udata = PyUnicode_DATA(unicode); + const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); + for (i=0; i < length; i++) { + if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1; + } + return 0; + } +#elif PY_VERSION_HEX >= 0x03090000 + #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. +#elif !defined(PyUnicode_AS_UNICODE) + #error Cannot use "UChar in Unicode" in Python < 3.9 without Py_UNICODE support. +#endif +#if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 + if ((sizeof(Py_UNICODE) == 2) && unlikely(character > 65535)) { + return __Pyx_PyUnicodeBufferContainsUCS4_SP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } else +#endif + { + return __Pyx_PyUnicodeBufferContainsUCS4_BMP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } +#endif +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (unlikely(from_mvs->suboffsets[i] >= 0)) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (unlikely(memviewslice->memview || memviewslice->data)) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#if PY_VERSION_HEX >= 0x030A0000 || defined(HAVE_STDARG_PROTOTYPES) + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + return; + } + old_acquisition_count = __pyx_add_acquisition_count(memview); + if (unlikely(old_acquisition_count <= 0)) { + if (likely(old_acquisition_count == 0)) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count+1, lineno); + } + } +} +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + memslice->memview = NULL; + return; + } + old_acquisition_count = __pyx_sub_acquisition_count(memview); + memslice->data = NULL; + if (likely(old_acquisition_count > 1)) { + memslice->memview = NULL; + } else if (likely(old_acquisition_count == 1)) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count-1, lineno); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* ImportNumPyArray */ + static PyObject* __Pyx__ImportNumPyArray(void) { + PyObject *numpy_module, *ndarray_object = NULL; + numpy_module = __Pyx_Import(__pyx_n_s_numpy, NULL, 0); + if (likely(numpy_module)) { + ndarray_object = PyObject_GetAttrString(numpy_module, "ndarray"); + Py_DECREF(numpy_module); + } + if (unlikely(!ndarray_object)) { + PyErr_Clear(); + } + if (unlikely(!ndarray_object || !PyObject_TypeCheck(ndarray_object, &PyType_Type))) { + Py_XDECREF(ndarray_object); + Py_INCREF(Py_None); + ndarray_object = Py_None; + } + return ndarray_object; +} +static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void) { + if (unlikely(!__pyx_numpy_ndarray)) { + __pyx_numpy_ndarray = __Pyx__ImportNumPyArray(); + } + Py_INCREF(__pyx_numpy_ndarray); + return __pyx_numpy_ndarray; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const char neg_one = (char) -1, const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(char) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 2 * PyLong_SHIFT)) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 3 * PyLong_SHIFT)) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 4 * PyLong_SHIFT)) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(char) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(char) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(char) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (char) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (char) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (char) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (char) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(char) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(char) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((char) 1) << (sizeof(char) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name_2); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__42); + } + return name; +} +#endif + +/* CheckBinaryVersion */ + static unsigned long __Pyx_get_runtime_version(void) { +#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/clipping/clipping.py b/gators/clipping/clipping.py index 1f6aba0e..8130eae4 100644 --- a/gators/clipping/clipping.py +++ b/gators/clipping/clipping.py @@ -1,15 +1,16 @@ # License: Apache-2.0 -from typing import Dict, List, Union +from typing import Dict, List -import databricks.koalas as ks import numpy as np -import pandas as pd from clipping import clipping +from clipping import _clipping from ..transformers.transformer import Transformer from ..util import util +from gators import DataFrame, Series + class Clipping(Transformer): """Trim values using the limits given by the user. @@ -26,39 +27,46 @@ class Clipping(Transformer): * the first element is the lower limit * the second element is the upper limit - dtype : type, default to np.float64. + dtype : type, default np.float64. Numerical datatype of the output data. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.clipping import Clipping - >>> X = pd.DataFrame( + >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} + >>> obj = Clipping(clip_dict=clip_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], + ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], + ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> obj.fit_transform(X) - A B C - 0 0.5 0.4 1.0 - 1 0.5 0.5 -0.0 - 2 0.5 -0.2 -0.0 - 3 0.4 0.1 1.0 - 4 0.5 0.1 0.4 - * fit & transform with `koalas` + * and `pandas` dataframes: - >>> import databricks.koalas as ks - >>> from gators.clipping import Clipping - >>> X = ks.DataFrame( + >>> import pandas as pd + >>> X = pd.DataFrame( ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) + + The result is a transformed dataframe belonging to the same dataframe library. + >>> obj.fit_transform(X) A B C 0 0.5 0.4 1.0 @@ -67,76 +75,49 @@ class Clipping(Transformer): 3 0.4 0.1 1.0 4 0.5 0.1 0.4 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.clipping import Clipping - >>> X = pd.DataFrame( - ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], - ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], - ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0.5, 0.4, 1. ], - [ 0.5, 0.5, -0. ], - [ 0.5, -0.2, -0. ], - [ 0.4, 0.1, 1. ], - [ 0.5, 0.1, 0.4]]) - - * fit with `koalas` & transform with `NumPy` + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. - >>> import databricks.koalas as ks - >>> from gators.clipping import Clipping - >>> X = ks.DataFrame( - ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], - ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], - ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) - >>> clip_dict = {'A':[-0.5, 0.5], 'B':[-0.5, 0.5], 'C':[-0., 1.]} - >>> obj = Clipping(clip_dict=clip_dict) - >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[ 0.5, 0.4, 1. ], [ 0.5, 0.5, -0. ], [ 0.5, -0.2, -0. ], [ 0.4, 0.1, 1. ], [ 0.5, 0.1, 0.4]]) - """ - def __init__(self, clip_dict: Dict[str, List[float]], dtype: type = np.float64): + def __init__(self, clip_dict: Dict[str, List[float]], inplace: bool = True): if not isinstance(clip_dict, dict): raise TypeError("`clip_dict` should be a dictionary.") if len(clip_dict) == 0: raise ValueError("Length of `clip_dict` should be not zero.") + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") self.clip_dict = clip_dict - self.dtype = dtype + self.inplace = inplace self.clip_np = np.array(list(clip_dict.values())) self.columns = list(clip_dict.keys()) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "Clipping": - """Fit the transformer on the pandas/koalas dataframe X. + def fit(self, X: DataFrame, y: Series = None) -> "Clipping": + """Fit the transformer on the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - 'Clipping': Instance of itself. + self : 'Clipping' + Instance of itself. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) + self.base_columns = list(X.columns) self.idx_columns = util.get_idx_columns(X, self.clip_dict.keys()) - self.clip_np = self.clip_np.astype(self.dtype) + self.column_names = self.get_column_names(self.inplace, self.columns, "clip") return self def transform(self, X): @@ -144,35 +125,39 @@ def transform(self, X): Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - - def clipping(x: ks.Series[self.dtype]) -> ks.Series[self.dtype]: - c = x.name - if c not in self.columns: - return x - return x.clip(self.clip_dict[c][0], self.clip_dict[c][1]) + for col, name in zip(self.columns, self.column_names): + X[name] = X[col].clip(self.clip_dict[col][0], self.clip_dict[col][1]) - return X.apply(clipping) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- - X (np.ndarray): Input ndarray. + X :np.ndarray: + Input array. Returns ------- - np.ndarray: Imputed ndarray. + X : np.ndarray + Transformed array. """ self.check_array(X) - return clipping(X, self.idx_columns, self.clip_np) + if self.inplace: + X[:, self.idx_columns] = _clipping( + X[:, self.idx_columns].astype(float), self.clip_np + ) + return X + else: + X_clip = _clipping(X[:, self.idx_columns].astype(float), self.clip_np) + return np.concatenate((X, X_clip), axis=1) diff --git a/gators/clipping/clipping.pyx b/gators/clipping/clipping.pyx index ed9bd79e..87ad7ee7 100644 --- a/gators/clipping/clipping.pyx +++ b/gators/clipping/clipping.pyx @@ -25,6 +25,33 @@ cpdef np.ndarray[num_t, ndim=2] clipping( cdef int n_cols = idx_columns.shape[0] cdef num_t val + with nogil: + for j in range(n_cols): + for i in range(n_rows): + val = X[i, j] + if val < clip_np[j, 0]: + X[i, j] = clip_np[j, 0] + continue + if val > clip_np[j, 1]: + X[i, j] = clip_np[j, 1] + continue + return X + + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[num_t, ndim=2] _clipping( + np.ndarray[num_t, ndim=2] X, + np.ndarray[num_t, ndim=2] clip_np, +): + cdef int i + cdef int j + cdef int k + cdef int n_rows = X.shape[0] + cdef int n_cols = X.shape[1] + cdef num_t val + with nogil: for j in range(n_cols): for i in range(n_rows): diff --git a/gators/clipping/quantile_clipping.py b/gators/clipping/quantile_clipping.py new file mode 100644 index 00000000..409c79c4 --- /dev/null +++ b/gators/clipping/quantile_clipping.py @@ -0,0 +1,174 @@ +# License: Apache-2.0 +from typing import Dict, List + +import numpy as np + +from clipping import _clipping + +from ..transformers.transformer import Transformer +from ..util import util + +from gators import DataFrame, Series + + +class QuantileClipping(Transformer): + """Trim values using the quantile values provided by the user. + + The column values will be contained between [*min_quantile*, *max_quantile*], + + Parameters + ---------- + min_quantile : float + Lower bound quantile. + + max_quantile : float + Upper bound quantile. + Examples + --------- + Imports and initialization: + + >>> from gators.clipping import QuantileClipping + >>> obj = QuantileClipping(columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], + ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], + ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( + ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], + ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], + ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame( + ... {'A': [1.8, 2.2, 1.0, 0.4, 0.8], + ... 'B': [0.4, 1.9, -0.2, 0.1, 0.1], + ... 'C': [1.0, -1.0, -0.1, 1.5, 0.4]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B C + 0 0.5 0.4 1.0 + 1 0.5 0.5 -0.0 + 2 0.5 -0.2 -0.0 + 3 0.4 0.1 1.0 + 4 0.5 0.1 0.4 + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> obj.transform_numpy(X.to_numpy()) + array([[ 0.5, 0.4, 1. ], + [ 0.5, 0.5, -0. ], + [ 0.5, -0.2, -0. ], + [ 0.4, 0.1, 1. ], + [ 0.5, 0.1, 0.4]]) + """ + + def __init__( + self, + columns: List[str], + min_quantile: float, + max_quantile: float, + inplace: bool = True, + ): + if not isinstance(columns, list): + raise TypeError("`columns` should be a list.") + if not isinstance(min_quantile, float): + raise TypeError("`min_quantile` should be a float between [0, 1].") + if not isinstance(max_quantile, float): + raise TypeError("`max_quantile` should be a float between [0, 1].") + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") + self.columns = columns + self.min_quantile = min_quantile + self.max_quantile = max_quantile + self.inplace = inplace + self.column_names = self.get_column_names( + self.inplace, self.columns, "quantile_clip" + ) + + def fit(self, X: DataFrame, y: Series = None) -> "QuantileClipping": + """Fit the transformer on the dataframe X. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : 'QuantileClipping' + Instance of itself. + """ + self.check_dataframe(X) + self.base_columns = list(X.columns) + self.idx_columns = util.get_idx_columns(X, self.columns) + + self.clip_dict = { + c: util.get_function(X).to_numpy( + X[c].quantile(q=[self.min_quantile, self.max_quantile]) + ) + for c in self.columns + } + self.clip_np = np.array(list(self.clip_dict.values())) + + return self + + def transform(self, X): + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + for col, name in zip(self.columns, self.column_names): + X[name] = X[col].clip(self.clip_dict[col][0], self.clip_dict[col][1]) + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X :np.ndarray: + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + if self.inplace: + X[:, self.idx_columns] = _clipping( + X[:, self.idx_columns].astype(float), self.clip_np + ) + return X + else: + X_clip = _clipping(X[:, self.idx_columns].astype(float), self.clip_np) + return np.concatenate((X, X_clip), axis=1) diff --git a/gators/clipping/tests/test_clipping.py b/gators/clipping/tests/test_clipping.py deleted file mode 100644 index c1fa5a0a..00000000 --- a/gators/clipping/tests/test_clipping.py +++ /dev/null @@ -1,237 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.clipping.clipping import Clipping - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - np.random.seed(0) - X = pd.DataFrame(np.random.randn(5, 3), columns=list("ABC")) - clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5], "C": [-100.0, 1.0]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame( - { - "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], - "B": [ - 0.400157208, - 0.5, - -0.1513572082976979, - 0.144043571160878, - 0.12167501649282841, - ], - "C": [ - 0.9787379841057392, - -0.977277879876411, - -0.10321885179355784, - 1.0, - 0.4438632327, - ], - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - np.random.seed(0) - X = pd.DataFrame(5 * np.random.randn(5, 3), columns=list("ABC")).astype(np.int16) - clip_dict = {"A": [-5, 2], "B": [-1, 3], "C": [-2, 5]} - obj = Clipping(clip_dict=clip_dict, dtype=np.int16).fit(X) - X_expected = pd.DataFrame( - {"A": [2, 2, 2, 2, 2], "B": [2, 3, 0, 0, 0], "C": [4, -2, 0, 5, 2]} - ).astype(np.int16) - return obj, X, X_expected - - -@pytest.fixture -def data_partial(): - np.random.seed(0) - X = pd.DataFrame(np.random.randn(5, 3), columns=list("ABC")) - clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame( - { - "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], - "B": [ - 0.400157208, - 0.5, - -0.1513572082976979, - 0.144043571160878, - 0.12167501649282841, - ], - "C": [ - 0.9787379841057392, - -0.977277879876411, - -0.10321885179355784, - 1.454274, - 0.4438632327, - ], - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - np.random.seed(0) - X = ks.DataFrame(np.random.randn(5, 3), columns=list("ABC")) - clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5], "C": [-100.0, 1.0]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame( - { - "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], - "B": [ - 0.400157208, - 0.5, - -0.1513572082976979, - 0.144043571160878, - 0.12167501649282841, - ], - "C": [ - 0.9787379841057392, - -0.977277879876411, - -0.10321885179355784, - 1.0, - 0.4438632327, - ], - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - np.random.seed(0) - X = ks.DataFrame(5 * np.random.randn(5, 3), columns=list("ABC")).astype(np.int16) - clip_dict = {"A": [-5, 2], "B": [-1, 3], "C": [-2, 5]} - obj = Clipping(clip_dict=clip_dict, dtype=np.int16).fit(X) - X_expected = pd.DataFrame( - {"A": [2, 2, 2, 2, 2], "B": [2, 3, 0, 0, 0], "C": [4, -2, 0, 5, 2]} - ).astype(np.int16) - return obj, X, X_expected - - -@pytest.fixture -def data_partial_ks(): - np.random.seed(0) - X = ks.DataFrame(np.random.randn(5, 3), columns=list("ABC")) - clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5]} - obj = Clipping(clip_dict=clip_dict).fit(X) - X_expected = pd.DataFrame( - { - "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], - "B": [ - 0.400157208, - 0.5, - -0.1513572082976979, - 0.144043571160878, - 0.12167501649282841, - ], - "C": [ - 0.9787379841057392, - -0.977277879876411, - -0.10321885179355784, - 1.454274, - 0.4438632327, - ], - } - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -def test_partial_pd(data_partial): - obj, X, X_expected = data_partial - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_partial_ks(data_partial_ks): - obj, X, X_expected = data_partial_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_partial_pd_np(data_partial): - obj, X, X_expected = data_partial - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -@pytest.mark.koalas -def test_partial_ks_np(data_partial_ks): - obj, X, X_expected = data_partial_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected.to_numpy()) - - -def test_init(data): - with pytest.raises(TypeError): - _ = Clipping(clip_dict=0) - with pytest.raises(ValueError): - _ = Clipping(clip_dict={}) diff --git a/gators/clipping/tests/test_clipping_dd.py b/gators/clipping/tests/test_clipping_dd.py new file mode 100644 index 00000000..af0fec06 --- /dev/null +++ b/gators/clipping/tests/test_clipping_dd.py @@ -0,0 +1,82 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.clipping.clipping import Clipping + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": {0: 1.76, 1: 2.24, 2: 0.95, 3: 0.41, 4: 0.76}, + "B": {0: 0.4, 1: 1.87, 2: -0.15, 3: 0.14, 4: 0.12}, + "C": {0: 0.98, 1: -0.98, 2: -0.1, 3: 1.45, 4: 0.44}, + } + ), + npartitions=1, + ) + clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5], "C": [-100.0, 1.0]} + obj = Clipping(clip_dict=clip_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": {0: 0.5, 1: 0.5, 2: 0.5, 3: 0.41, 4: 0.5}, + "B": {0: 0.4, 1: 0.5, 2: -0.15, 3: 0.14, 4: 0.12}, + "C": {0: 0.98, 1: -0.98, 2: -0.1, 3: 1.0, 4: 0.44}, + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_partial(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": {0: 1.76, 1: 2.24, 2: 0.95, 3: 0.41, 4: 0.76}, + "B": {0: 0.4, 1: 1.87, 2: -0.15, 3: 0.14, 4: 0.12}, + "C": {0: 0.98, 1: -0.98, 2: -0.1, 3: 1.45, 4: 0.44}, + } + ), + npartitions=1, + ) + clip_dict = {"A": [-0.5, 0.5]} + obj = Clipping(clip_dict=clip_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": {0: 0.5, 1: 0.5, 2: 0.5, 3: 0.41, 4: 0.5}, + "B": {0: 0.4, 1: 1.87, 2: -0.15, 3: 0.14, 4: 0.12}, + "C": {0: 0.98, 1: -0.98, 2: -0.1, 3: 1.45, 4: 0.44}, + } + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +# def test_partial_dd(data_partial): +# obj, X, X_expected = data_partial +# X_new = obj.transform(X).compute() +# assert_frame_equal(X_new, X_expected) + + +# def test_partial_dd_np(data_partial): +# obj, X, X_expected = data_partial +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new) +# assert np.allclose(X_new, X_expected.to_numpy()) diff --git a/gators/clipping/tests/test_clipping_ks.py b/gators/clipping/tests/test_clipping_ks.py new file mode 100644 index 00000000..323ab3c3 --- /dev/null +++ b/gators/clipping/tests/test_clipping_ks.py @@ -0,0 +1,96 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.clipping.clipping import Clipping + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + np.random.seed(0) + X = ps.DataFrame(np.random.randn(5, 3), columns=list("ABC")) + clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5], "C": [-100.0, 1.0]} + obj = Clipping(clip_dict=clip_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], + "B": [ + 0.400157208, + 0.5, + -0.1513572082976979, + 0.144043571160878, + 0.12167501649282841, + ], + "C": [ + 0.9787379841057392, + -0.977277879876411, + -0.10321885179355784, + 1.0, + 0.4438632327, + ], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_partial_ks(): + np.random.seed(0) + X = ps.DataFrame(np.random.randn(5, 3), columns=list("ABC")) + clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5]} + obj = Clipping(clip_dict=clip_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], + "B": [ + 0.400157208, + 0.5, + -0.1513572082976979, + 0.144043571160878, + 0.12167501649282841, + ], + "C": [ + 0.9787379841057392, + -0.977277879876411, + -0.10321885179355784, + 1.454274, + 0.4438632327, + ], + } + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +@pytest.mark.pyspark +def test_partial_ks(data_partial_ks): + obj, X, X_expected = data_partial_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_partial_ks_np(data_partial_ks): + obj, X, X_expected = data_partial_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) diff --git a/gators/clipping/tests/test_clipping_pd.py b/gators/clipping/tests/test_clipping_pd.py new file mode 100644 index 00000000..2204effd --- /dev/null +++ b/gators/clipping/tests/test_clipping_pd.py @@ -0,0 +1,139 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.clipping.clipping import Clipping + + +@pytest.fixture +def data(): + np.random.seed(0) + X = pd.DataFrame(np.random.randn(5, 3), columns=list("ABC")) + clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5], "C": [-100.0, 1.0]} + obj = Clipping(clip_dict=clip_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], + "B": [ + 0.400157208, + 0.5, + -0.1513572082976979, + 0.144043571160878, + 0.12167501649282841, + ], + "C": [ + 0.9787379841057392, + -0.977277879876411, + -0.10321885179355784, + 1.0, + 0.4438632327, + ], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + np.random.seed(0) + X = pd.DataFrame(np.random.randn(5, 3), columns=list("ABC")) + clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5], "C": [-100.0, 1.0]} + obj = Clipping(clip_dict=clip_dict, inplace=False).fit(X) + X_expected = pd.DataFrame( + { + "A__clip": [0.5, 0.5, 0.5, 0.4105985019, 0.5], + "B__clip": [ + 0.400157208, + 0.5, + -0.1513572082976979, + 0.144043571160878, + 0.12167501649282841, + ], + "C__clip": [ + 0.9787379841057392, + -0.977277879876411, + -0.10321885179355784, + 1.0, + 0.4438632327, + ], + } + ) + return obj, X, pd.concat([X, X_expected], axis=1) + + +@pytest.fixture +def data_partial(): + np.random.seed(0) + X = pd.DataFrame(np.random.randn(5, 3), columns=list("ABC")) + clip_dict = {"A": [-0.5, 0.5], "B": [-0.5, 0.5]} + obj = Clipping(clip_dict=clip_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.5, 0.5, 0.5, 0.4105985019, 0.5], + "B": [ + 0.400157208, + 0.5, + -0.1513572082976979, + 0.144043571160878, + 0.12167501649282841, + ], + "C": [ + 0.9787379841057392, + -0.977277879876411, + -0.10321885179355784, + 1.454274, + 0.4438632327, + ], + } + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +def test_partial_pd(data_partial): + obj, X, X_expected = data_partial + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_partial_pd_np(data_partial): + obj, X, X_expected = data_partial + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +def test_init(): + with pytest.raises(TypeError): + _ = Clipping(clip_dict=0) + with pytest.raises(ValueError): + _ = Clipping(clip_dict={}) + with pytest.raises(TypeError): + _ = Clipping(clip_dict={"A": [0, 1]}, inplace="yes") diff --git a/gators/clipping/tests/test_quantile_clipping_dd.py b/gators/clipping/tests/test_quantile_clipping_dd.py new file mode 100644 index 00000000..48bb92f6 --- /dev/null +++ b/gators/clipping/tests/test_quantile_clipping_dd.py @@ -0,0 +1,156 @@ +# # License: Apache-2.0 +# import dask.dataframe as dd +# import numpy as np +# import pandas as pd +# import pytest +# from pandas.testing import assert_frame_equal + +# from gators.clipping.quantile_clipping import QuantileClipping + + +# @pytest.fixture +# def data(): +# X = dd.from_pandas( +# pd.DataFrame( +# { +# "A": [1.8, 2.2, 1.0, 0.4, 0.8], +# "B": [0.4, 1.9, -0.2, 0.1, 0.1], +# "C": [1.0, -1.0, -0.1, 1.5, 0.4], +# } +# ), +# npartitions=1, +# ) +# obj = QuantileClipping( +# columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8 +# ).fit(X) +# X_expected = pd.DataFrame( +# { +# "A": { +# 0: 1.8, +# 1: 1.88, +# 2: 1.0, +# 3: 0.72, +# 4: 0.8, +# }, +# "B": { +# 0: 0.4, +# 1: 0.7, +# 2: 0.04, +# 3: 0.1, +# 4: 0.1, +# }, +# "C": { +# 0: 1.0, +# 1: -0.28, +# 2: -0.1, +# 3: 1.1, +# 4: 0.4, +# }, +# } +# ) +# return obj, X, X_expected + + +# @pytest.fixture +# def data_not_inplace(): +# X = dd.from_pandas( +# pd.DataFrame( +# { +# "A": [1.8, 2.2, 1.0, 0.4, 0.8], +# "B": [0.4, 1.9, -0.2, 0.1, 0.1], +# "C": [1.0, -1.0, -0.1, 1.5, 0.4], +# } +# ), +# npartitions=1, +# ) +# obj = QuantileClipping( +# columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8, inplace=False +# ).fit(X) +# X_expected = pd.DataFrame( +# { +# "A__quantile_clip": { +# 0: 1.8, +# 1: 1.816, +# 2: 1.0, +# 3: 0.784, +# 4: 0.8, +# }, +# "B__quantile_clip": { +# 0: 0.4, +# 1: 0.7, +# 2: 0.04, +# 3: 0.1, +# 4: 0.1, +# }, +# "C__quantile_clip": { +# 0: 1.0, +# 1: -0.136, +# 2: -0.1, +# 3: 1.02, +# 4: 0.4, +# }, +# } +# ) +# return obj, X, pd.concat([X.compute(), X_expected], axis=1) + + +# @pytest.fixture +# def data_partial(): +# X = dd.from_pandas( +# pd.DataFrame( +# { +# "A": [1.8, 2.2, 1.0, 0.4, 0.8], +# "B": [0.4, 0.7, 0.04, 0.1, 0.1], +# "C": [1.0, -1.0, -0.1, 1.5, 0.4], +# } +# ), +# npartitions=1, +# ) +# obj = QuantileClipping(min_quantile=0.2, max_quantile=0.8, columns=["A"]).fit(X) +# X_expected = pd.DataFrame( +# { +# "A": [1.8, 1.88, 1.0, 0.72, 0.8], +# "B": [0.4, 0.7, 0.04, 0.1, 0.1], +# "C": [1.0, -1.0, -0.1, 1.5, 0.4], +# } +# ) +# return obj, X, X_expected + + +# def test_dd(data): +# obj, X, X_expected = data +# X_new = obj.transform(X).compute() +# assert_frame_equal(X_new, X_expected) + + +# def test_dd_np(data): +# obj, X, X_expected = data +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new) +# assert np.allclose(X_new.to_numpy(), X_expected.to_numpy()) + + +# def test_not_inplace_dd(data_not_inplace): +# obj, X, X_expected = data_not_inplace +# X_new = obj.transform(X).compute() +# assert_frame_equal(X_new, X_expected) + + +# def test_not_inplace_dd_np(data_not_inplace): +# obj, X, X_expected = data_not_inplace +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new) +# assert np.allclose(X_new.to_numpy(), X_expected.to_numpy()) + + +# def test_partial_dd(data_partial): +# obj, X, X_expected = data_partial +# X_new = obj.transform(X).compute() +# assert_frame_equal(X_new, X_expected) + + +# def test_partial_dd_np(data_partial): +# obj, X, X_expected = data_partial +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new) +# assert np.allclose(X_new.to_numpy(), X_expected.to_numpy()) diff --git a/gators/clipping/tests/test_quantile_clipping_ks.py b/gators/clipping/tests/test_quantile_clipping_ks.py new file mode 100644 index 00000000..88646c9c --- /dev/null +++ b/gators/clipping/tests/test_quantile_clipping_ks.py @@ -0,0 +1,119 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.clipping import QuantileClipping + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data(): + X = ps.DataFrame( + { + "A": [1.8, 2.2, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + obj = QuantileClipping( + columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8 + ).fit(X) + X_expected = pd.DataFrame( + { + "A": [1.8, 1.8, 1.0, 0.4, 0.8], + "B": [0.4, 0.4, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.0, 0.4], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + X = ps.DataFrame( + { + "A": [1.8, 2.2, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + obj = QuantileClipping( + columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8, inplace=False + ).fit(X) + X_expected = pd.DataFrame( + { + "A__quantile_clip": [1.8, 1.8, 1.0, 0.4, 0.8], + "B__quantile_clip": [0.4, 0.4, -0.2, 0.1, 0.1], + "C__quantile_clip": [1.0, -1.0, -0.1, 1.0, 0.4], + } + ) + return obj, X, pd.concat([X.to_pandas(), X_expected], axis=1) + + +@pytest.fixture +def data_partial(): + X = ps.DataFrame( + { + "A": [1.8, 2.2, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + obj = QuantileClipping(min_quantile=0.2, max_quantile=0.8, columns=["A"]).fit(X) + X_expected = pd.DataFrame( + { + "A": [1.8, 1.8, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +@pytest.mark.pyspark +def test_not_inplace_ks(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_not_inplace_ks_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +@pytest.mark.pyspark +def test_partial_ks(data_partial): + obj, X, X_expected = data_partial + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_partial_ks_np(data_partial): + obj, X, X_expected = data_partial + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) diff --git a/gators/clipping/tests/test_quantile_clipping_pd.py b/gators/clipping/tests/test_quantile_clipping_pd.py new file mode 100644 index 00000000..1a95ecd4 --- /dev/null +++ b/gators/clipping/tests/test_quantile_clipping_pd.py @@ -0,0 +1,123 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.clipping import QuantileClipping + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [1.8, 2.2, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + obj = QuantileClipping( + columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8 + ).fit(X) + X_expected = pd.DataFrame( + { + "A": [1.8, 1.88, 1.0, 0.72, 0.8], + "B": [0.4, 0.7, 0.04, 0.1, 0.1], + "C": [1.0, -0.28, -0.1, 1.1, 0.4], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": [1.8, 2.2, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + obj = QuantileClipping( + columns=["A", "B", "C"], min_quantile=0.2, max_quantile=0.8, inplace=False + ).fit(X) + X_expected = pd.DataFrame( + { + "A__quantile_clip": [1.8, 1.88, 1.0, 0.72, 0.8], + "B__quantile_clip": [0.4, 0.7, 0.04, 0.1, 0.1], + "C__quantile_clip": [1.0, -0.28, -0.1, 1.1, 0.4], + } + ) + return obj, X, pd.concat([X, X_expected], axis=1) + + +@pytest.fixture +def data_partial(): + X = pd.DataFrame( + { + "A": [1.8, 2.2, 1.0, 0.4, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + obj = QuantileClipping(min_quantile=0.2, max_quantile=0.8, columns=["A"]).fit(X) + X_expected = pd.DataFrame( + { + "A": [1.8, 1.88, 1.0, 0.72, 0.8], + "B": [0.4, 1.9, -0.2, 0.1, 0.1], + "C": [1.0, -1.0, -0.1, 1.5, 0.4], + } + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +def test_partial_pd(data_partial): + obj, X, X_expected = data_partial + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_partial_pd_np(data_partial): + obj, X, X_expected = data_partial + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected.to_numpy()) + + +def test_init(): + with pytest.raises(TypeError): + _ = QuantileClipping(columns=0, min_quantile=0.2, max_quantile=0.8) + with pytest.raises(TypeError): + _ = QuantileClipping(columns=["A"], min_quantile="a", max_quantile=0.8) + with pytest.raises(TypeError): + _ = QuantileClipping(columns=["A"], min_quantile=0.2, max_quantile="a") + with pytest.raises(TypeError): + _ = QuantileClipping( + columns=["A"], min_quantile=0.2, max_quantile=0.8, inplace="yes" + ) diff --git a/gators/converter/__init__.py b/gators/converter/__init__.py index e507e483..4915d807 100644 --- a/gators/converter/__init__.py +++ b/gators/converter/__init__.py @@ -1,9 +1,7 @@ -from .convert_column_datatype import ConvertColumnDatatype -from .koalas_to_pandas import KoalasToPandas from .to_numpy import ToNumpy +from .to_pandas import ToPandas __all__ = [ "ToNumpy", - "KoalasToPandas", - "ConvertColumnDatatype", + "ToPandas", ] diff --git a/gators/converter/__pycache__/__init__.cpython-38.pyc b/gators/converter/__pycache__/__init__.cpython-38.pyc index 460e2bab..8a27ab82 100644 Binary files a/gators/converter/__pycache__/__init__.cpython-38.pyc and b/gators/converter/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/converter/__pycache__/convert_column_datatype.cpython-38.pyc b/gators/converter/__pycache__/convert_column_datatype.cpython-38.pyc index c94e7260..a067fba8 100644 Binary files a/gators/converter/__pycache__/convert_column_datatype.cpython-38.pyc and b/gators/converter/__pycache__/convert_column_datatype.cpython-38.pyc differ diff --git a/gators/converter/__pycache__/to_numpy.cpython-38.pyc b/gators/converter/__pycache__/to_numpy.cpython-38.pyc index 8e25b88a..525025dd 100644 Binary files a/gators/converter/__pycache__/to_numpy.cpython-38.pyc and b/gators/converter/__pycache__/to_numpy.cpython-38.pyc differ diff --git a/gators/converter/convert_column_datatype.py b/gators/converter/convert_column_datatype.py deleted file mode 100644 index 69e79749..00000000 --- a/gators/converter/convert_column_datatype.py +++ /dev/null @@ -1,154 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..transformers import Transformer - -LIST_NUMPY_NUM_DTYPES = [ - bool, - int, - "np.int8", - "np.int16", - "np.int32", - "np.int64", - "np.uint8", - "np.uint16", - "np.uint32", - "np.uint64", - float, - "np.float16", - "np.float32", - "np.float64", -] - - -class ConvertColumnDatatype(Transformer): - """Set the datatype of the selected columns to a given datatype. - - Parameters - ---------- - columns : List[str] - List of columns. - datatype: type - Datatype to use. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.converter import ConvertColumnDatatype - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> obj.fit_transform(X) - A B - 0 1.0 1 - 1 2.0 1 - 2 3.0 1 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.converter import ConvertColumnDatatype - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> obj.fit_transform(X) - A B - 0 1.0 1 - 1 2.0 1 - 2 3.0 1 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.converter import ConvertColumnDatatype - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [2., 1.], - [3., 1.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.converter import ConvertColumnDatatype - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [2., 1.], - [3., 1.]]) - - """ - - def __init__(self, columns: List[str], datatype: type): - if not isinstance(columns, list): - raise TypeError("`columns` should be a list.") - if not columns: - raise ValueError("`columns` should not be empty.") - if type(datatype) != type and not str(datatype).startswith("datetime"): - raise TypeError("`datatype` should be a type.") - self.columns = columns - self.datatype = datatype - - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], y=None - ) -> "ConvertColumnDatatype": - """Fit the transformer on the dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - SetDatatype: Instance of itself. - """ - self.check_dataframe(X) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame], y=None - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - X[self.columns] = X[self.columns].astype(self.datatype) - return X - - def transform_numpy(self, X: np.ndarray, y=None) -> np.ndarray: - """Transform the array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - if self.datatype in LIST_NUMPY_NUM_DTYPES: - return X.astype(self.datatype) - return X.astype(object) diff --git a/gators/converter/koalas_to_pandas.py b/gators/converter/koalas_to_pandas.py deleted file mode 100644 index e9770b0e..00000000 --- a/gators/converter/koalas_to_pandas.py +++ /dev/null @@ -1,66 +0,0 @@ -from typing import Tuple, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..transformers.transformer_xy import TransformerXY - - -class KoalasToPandas(TransformerXY): - """Convert koalas dataframe and series to a pandas dataframe and series. - - Examples - --------- - * transform with pandas - - >>> import databricks.koalas as ks - >>> from gators.converter import KoalasToPandas - >>> X = ks.DataFrame({ - ... 'q': {0: 0.0, 1: 3.0, 2: 6.0}, - ... 'w': {0: 1.0, 1: 4.0, 2: 7.0}, - ... 'e': {0: 2.0, 1: 5.0, 2: 8.0}}) - >>> y = ks.Series([0, 0, 1], name='TARGET') - >>> obj = KoalasToPandas() - >>> X, y = obj.transform(X, y) - >>> X - q w e - 0 0.0 1.0 2.0 - 1 3.0 4.0 5.0 - 2 6.0 7.0 8.0 - >>> y - 0 0 - 1 0 - 2 1 - Name: TARGET, dtype: int64 - """ - - def __init__(self): - TransformerXY.__init__(self) - - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[np.ndarray, np.ndarray]: - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : [pd.Series, ks.Series]: - Target values. - - Returns - ------- - X : pd.DataFrame - Dataframe. - y : np.ndarray - Target values. - """ - if not isinstance(X, ks.DataFrame): - raise TypeError("`X` should be a koalas dataframe") - self.check_dataframe(X) - self.check_y(X, y) - return X.to_pandas(), y.to_pandas() diff --git a/gators/converter/tests/test_convert_column_datatype.py b/gators/converter/tests/test_convert_column_datatype.py deleted file mode 100644 index f16c51a4..00000000 --- a/gators/converter/tests/test_convert_column_datatype.py +++ /dev/null @@ -1,169 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.converter.convert_column_datatype import ConvertColumnDatatype - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": [True, False, True, False], - "B": [True, True, True, False], - "C": [True, True, True, True], - "D": [1, 2, 3, 4], - } - ) - X_expected = pd.DataFrame( - { - "A": [1.0, 0.0, 1.0, 0.0], - "B": [1.0, 1.0, 1.0, 0.0], - "C": [1.0, 1.0, 1.0, 1.0], - "D": [1, 2, 3, 4], - } - ) - obj = ConvertColumnDatatype(columns=["A", "B", "C"], datatype=float).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj(): - X = pd.DataFrame( - { - "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], - "B": [True, False], - "C": [True, True], - "D": [1, 2], - } - ) - X_expected = pd.DataFrame( - { - "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], - "B": [True, False], - "C": [True, True], - "D": [1, 2], - } - ) - X_expected["A"] = X_expected["A"].astype("datetime64[ns]") - obj = ConvertColumnDatatype(columns=["A"], datatype="datetime64[ns]").fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": [True, False, True, False], - "B": [True, True, True, False], - "C": [True, True, True, True], - "D": [1, 2, 3, 4], - } - ) - X_expected = pd.DataFrame( - { - "A": [1.0, 0.0, 1.0, 0.0], - "B": [1.0, 1.0, 1.0, 0.0], - "C": [1.0, 1.0, 1.0, 1.0], - "D": [1, 2, 3, 4], - } - ) - obj = ConvertColumnDatatype(columns=["A", "B", "C"], datatype=float).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj_ks(): - X = ks.DataFrame( - { - "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], - "B": [True, False], - "C": [True, True], - "D": [1, 2], - } - ) - X_expected = pd.DataFrame( - { - "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], - "B": [True, False], - "C": [True, True], - "D": [1, 2], - } - ) - X_expected["A"] = X_expected["A"].astype("datetime64[ns]") - obj = ConvertColumnDatatype(columns=["A"], datatype="datetime64[ns]").fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame( - X_numpy_new, columns=X_expected.columns, dtype=X_numpy_new.dtype - ) - X_expected = pd.DataFrame(X_expected, columns=X_expected.columns, dtype=float) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - assert X_numpy_new.tolist() == X_expected.to_numpy().tolist() - - -def test_obj(data_obj): - obj, X, X_expected = data_obj - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_obj_ks(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_obj_pd_np(data_obj): - obj, X, X_expected = data_obj - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - assert X_numpy_new.tolist() == X.to_numpy().tolist() - - -@pytest.mark.koalas -def test_obj_ks_np(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - assert X_numpy_new.tolist() == X.to_numpy().tolist() - - -def test_input(): - with pytest.raises(TypeError): - _ = ConvertColumnDatatype(columns=0, datatype=float) - with pytest.raises(ValueError): - _ = ConvertColumnDatatype(columns=[], datatype=float) - with pytest.raises(TypeError): - _ = ConvertColumnDatatype(columns=["A"], datatype=0) - with pytest.raises(TypeError): - _ = ConvertColumnDatatype(columns=["A"], datatype="x") diff --git a/gators/converter/tests/test_koalas_to_pandas.py b/gators/converter/tests/test_koalas_to_pandas.py deleted file mode 100644 index 0b513434..00000000 --- a/gators/converter/tests/test_koalas_to_pandas.py +++ /dev/null @@ -1,34 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal, assert_series_equal - -from gators.converter.koalas_to_pandas import KoalasToPandas - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "q": {0: 0.0, 1: 3.0, 2: 6.0}, - "w": {0: 1.0, 1: 4.0, 2: 7.0}, - "e": {0: 2.0, 1: 5.0, 2: 8.0}, - } - ) - y = ks.Series([0, 0, 1], name="TARGET") - return X, y, X.to_pandas(), y.to_pandas() - - -@pytest.mark.koalas -def test_ks(data_ks): - X_ks, y_ks, X_expected, y_expected = data_ks - X_new, y_new = KoalasToPandas().transform(X_ks, y_ks) - assert_frame_equal(X_new, X_expected) - assert_series_equal(y_new, y_expected) - - -def test_input(): - with pytest.raises(TypeError): - _ = KoalasToPandas().transform(pd.DataFrame(), pd.DataFrame()) diff --git a/gators/converter/tests/test_to_numpy.py b/gators/converter/tests/test_to_numpy.py deleted file mode 100644 index 4c682d79..00000000 --- a/gators/converter/tests/test_to_numpy.py +++ /dev/null @@ -1,49 +0,0 @@ -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest - -from gators.converter.to_numpy import ToNumpy - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "q": {0: 0.0, 1: 3.0, 2: 6.0}, - "w": {0: 1.0, 1: 4.0, 2: 7.0}, - "e": {0: 2.0, 1: 5.0, 2: 8.0}, - } - ) - y = pd.Series([0, 0, 1], name="TARGET") - return X, y, X.to_numpy(), y.to_numpy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "q": {0: 0.0, 1: 3.0, 2: 6.0}, - "w": {0: 1.0, 1: 4.0, 2: 7.0}, - "e": {0: 2.0, 1: 5.0, 2: 8.0}, - } - ) - y = ks.Series([0, 0, 1], name="TARGET") - return X, y, X.to_numpy(), y.to_numpy() - - -def test_pd(data): - X, y, X_expected, y_expected = data - X_new, y_new = ToNumpy().transform(X, y) - assert np.allclose(X_new, X_expected) - assert np.allclose(y_new, y_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - X, y, X_expected, y_expected = data_ks - X_new, y_new = ToNumpy().transform(X, y) - assert np.allclose(X_new, X_expected) - assert np.allclose(y_new, y_expected) diff --git a/gators/converter/tests/test_to_numpy_dd.py b/gators/converter/tests/test_to_numpy_dd.py new file mode 100644 index 00000000..953d0d61 --- /dev/null +++ b/gators/converter/tests/test_to_numpy_dd.py @@ -0,0 +1,30 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest + +from gators.converter.to_numpy import ToNumpy + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "q": [0.0, 3.0, 6.0], + "w": [1.0, 4.0, 7.0], + "e": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + y = dd.from_pandas(pd.Series([0, 0, 1], name="TARGET"), npartitions=1) + return X, y, X.compute().to_numpy(), y.compute().to_numpy() + + +def test_pd(data): + X, y, X_expected, y_expected = data + X_new, y_new = ToNumpy().transform(X, y) + assert np.allclose(X_new, X_expected) + assert np.allclose(y_new, y_expected) diff --git a/gators/converter/tests/test_to_numpy_ks.py b/gators/converter/tests/test_to_numpy_ks.py new file mode 100644 index 00000000..d4293a9e --- /dev/null +++ b/gators/converter/tests/test_to_numpy_ks.py @@ -0,0 +1,30 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest + +from gators.converter.to_numpy import ToNumpy + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "q": [0.0, 3.0, 6.0], + "w": [1.0, 4.0, 7.0], + "e": [2.0, 5.0, 8.0], + } + ) + y = ps.Series([0, 0, 1], name="TARGET") + return X, y, X.to_numpy(), y.to_numpy() + + +@pytest.mark.pyspark +def test_ks(data_ks): + X, y, X_expected, y_expected = data_ks + X_new, y_new = ToNumpy().transform(X, y) + assert np.allclose(X_new, X_expected) + assert np.allclose(y_new, y_expected) diff --git a/gators/converter/tests/test_to_numpy_pd.py b/gators/converter/tests/test_to_numpy_pd.py new file mode 100644 index 00000000..71a2b750 --- /dev/null +++ b/gators/converter/tests/test_to_numpy_pd.py @@ -0,0 +1,26 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest + +from gators.converter.to_numpy import ToNumpy + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "q": [0.0, 3.0, 6.0], + "w": [1.0, 4.0, 7.0], + "e": [2.0, 5.0, 8.0], + } + ) + y = pd.Series([0, 0, 1], name="TARGET") + return X, y, X.to_numpy(), y.to_numpy() + + +def test_pd(data): + X, y, X_expected, y_expected = data + X_new, y_new = ToNumpy().transform(X, y) + assert np.allclose(X_new, X_expected) + assert np.allclose(y_new, y_expected) diff --git a/gators/converter/tests/test_to_pandas_dd.py b/gators/converter/tests/test_to_pandas_dd.py new file mode 100644 index 00000000..adc10c1a --- /dev/null +++ b/gators/converter/tests/test_to_pandas_dd.py @@ -0,0 +1,30 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.converter.to_pandas import ToPandas + + +@pytest.fixture +def data_dd(): + X = dd.from_pandas( + pd.DataFrame( + { + "q": [0.0, 3.0, 6.0], + "w": [1.0, 4.0, 7.0], + "e": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + y = dd.from_pandas(pd.Series([0, 0, 1], name="TARGET"), npartitions=1) + return X, y, X.compute(), y.compute() + + +def test_dd(data_dd): + X, y, X_expected, y_expected = data_dd + X_new, y_new = ToPandas().transform(X, y) + assert_frame_equal(X_new, X_expected) + assert_series_equal(y_new, y_expected) diff --git a/gators/converter/tests/test_to_pandas_ks.py b/gators/converter/tests/test_to_pandas_ks.py new file mode 100644 index 00000000..f2943e3d --- /dev/null +++ b/gators/converter/tests/test_to_pandas_ks.py @@ -0,0 +1,30 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.converter.to_pandas import ToPandas + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "q": [0.0, 3.0, 6.0], + "w": [1.0, 4.0, 7.0], + "e": [2.0, 5.0, 8.0], + } + ) + y = ps.Series([0, 0, 1], name="TARGET") + return X, y, X.to_pandas(), y.to_pandas() + + +@pytest.mark.pyspark +def test_ks(data_ks): + X_ks, y_ks, X_expected, y_expected = data_ks + X_new, y_new = ToPandas().transform(X_ks, y_ks) + assert_frame_equal(X_new, X_expected) + assert_series_equal(y_new, y_expected) diff --git a/gators/converter/tests/test_to_pandas_pd.py b/gators/converter/tests/test_to_pandas_pd.py new file mode 100644 index 00000000..8e46e735 --- /dev/null +++ b/gators/converter/tests/test_to_pandas_pd.py @@ -0,0 +1,26 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.converter.to_pandas import ToPandas + + +@pytest.fixture +def data_dd(): + X = pd.DataFrame( + { + "q": [0.0, 3.0, 6.0], + "w": [1.0, 4.0, 7.0], + "e": [2.0, 5.0, 8.0], + } + ) + y = pd.Series([0, 0, 1], name="TARGET") + return X, y, X, y + + +def test_dd(data_dd): + X, y, X_expected, y_expected = data_dd + X_new, y_new = ToPandas().transform(X, y) + assert_frame_equal(X_new, X_expected) + assert_series_equal(y_new, y_expected) diff --git a/gators/converter/to_numpy.py b/gators/converter/to_numpy.py index 7c284f30..d0e34dbc 100644 --- a/gators/converter/to_numpy.py +++ b/gators/converter/to_numpy.py @@ -1,10 +1,11 @@ -from typing import Tuple, Union +from typing import Tuple -import databricks.koalas as ks import numpy as np -import pandas as pd from ..transformers.transformer_xy import TransformerXY +from ..util import util + +from gators import DataFrame, Series class ToNumpy(TransformerXY): @@ -12,34 +13,43 @@ class ToNumpy(TransformerXY): Examples --------- - * transform with pandas + Imports and initialization: - >>> import pandas as pd >>> from gators.converter import ToNumpy + >>> obj = ToNumpy() + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0.0, 3.0, 6.0], + ... 'B': [1.0, 4.0, 7.0], + ... 'C': [2.0, 5.0, 8.0]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([0, 0, 1], name='TARGET'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': [0.0, 3.0, 6.0], + ... 'B': [1.0, 4.0, 7.0], + ... 'C': [2.0, 5.0, 8.0]}) + >>> y = ps.Series([0, 0, 1], name='TARGET') + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({ - ... 'q': [0.0, 3.0, 6.0], - ... 'w': [1.0, 4.0, 7.0], - ... 'e': [2.0, 5.0, 8.0]}) + ... 'A': [0.0, 3.0, 6.0], + ... 'B': [1.0, 4.0, 7.0], + ... 'C': [2.0, 5.0, 8.0]}) >>> y = pd.Series([0, 0, 1], name='TARGET') - >>> obj = ToNumpy() - >>> X, y = obj.transform(X, y) - >>> X - array([[0., 1., 2.], - [3., 4., 5.], - [6., 7., 8.]]) - >>> y - array([0, 0, 1]) - * transform with `koalas` + The result is a 2D NumPy array for `X` and a 1D NumPy array for `y`. - >>> import databricks.koalas as ks - >>> from gators.converter.to_numpy import ToNumpy - >>> X = ks.DataFrame({ - ... 'q': [0.0, 3.0, 6.0], - ... 'w': [1.0, 4.0, 7.0], - ... 'e': [2.0, 5.0, 8.0]}) - >>> y = ks.Series([0, 0, 1], name='TARGET') - >>> obj = ToNumpy() >>> X, y = obj.transform(X, y) >>> X array([[0., 1., 2.], @@ -47,7 +57,6 @@ class ToNumpy(TransformerXY): [6., 7., 8.]]) >>> y array([0, 0, 1]) - """ def __init__(self): @@ -55,25 +64,25 @@ def __init__(self): def transform( self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], + X: DataFrame, + y: Series, ) -> Tuple[np.ndarray, np.ndarray]: """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Dataframe. - y : [pd.Series, ks.Series]: + y : [pd.Series, ps.Series]: Target values. Returns ------- X : np.ndarray - Array. + Array. y : np.ndarray Target values. """ self.check_dataframe(X) - self.check_y(X, y) - return X.to_numpy(), y.to_numpy() + self.check_target(X, y) + return util.get_function(X).to_numpy(X), util.get_function(X).to_numpy(y) diff --git a/gators/converter/to_pandas.py b/gators/converter/to_pandas.py new file mode 100644 index 00000000..a5efeb99 --- /dev/null +++ b/gators/converter/to_pandas.py @@ -0,0 +1,92 @@ +from typing import Tuple + +import numpy as np + +from ..transformers.transformer_xy import TransformerXY +from ..util import util + +from gators import DataFrame, Series + + +class ToPandas(TransformerXY): + """Convert dataframe and series to a pandas dataframe and series. + + Examples + --------- + Imports and initialization: + + >>> from gators.converter import ToPandas + >>> obj = ToPandas() + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0.0, 3.0, 6.0], + ... 'B': [1.0, 4.0, 7.0], + ... 'C': [2.0, 5.0, 8.0]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([0, 0, 1], name='TARGET'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': [0.0, 3.0, 6.0], + ... 'B': [1.0, 4.0, 7.0], + ... 'C': [2.0, 5.0, 8.0]}) + >>> y = ps.Series([0, 0, 1], name='TARGET') + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({ + ... 'A': [0.0, 3.0, 6.0], + ... 'B': [1.0, 4.0, 7.0], + ... 'C': [2.0, 5.0, 8.0]}) + >>> y = pd.Series([0, 0, 1], name='TARGET') + + The result is a Pandas dataframe and Pandas series. + + >>> X, y = obj.transform(X, y) + >>> X + A B C + 0 0.0 1.0 2.0 + 1 3.0 4.0 5.0 + 2 6.0 7.0 8.0 + >>> y + 0 0 + 1 0 + 2 1 + Name: TARGET, dtype: int64 + """ + + def __init__(self): + TransformerXY.__init__(self) + + def transform( + self, + X: DataFrame, + y: Series, + ) -> Tuple[np.ndarray, np.ndarray]: + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : [pd.Series, ps.Series]: + Target values. + + Returns + ------- + X : pd.DataFrame + Dataframe. + y : np.ndarray + Target values. + """ + self.check_dataframe(X) + self.check_target(X, y) + return util.get_function(X).to_pandas(X), util.get_function(X).to_pandas(y) diff --git a/gators/data_cleaning/__init__.py b/gators/data_cleaning/__init__.py index f0ec1eec..5bbd4453 100644 --- a/gators/data_cleaning/__init__.py +++ b/gators/data_cleaning/__init__.py @@ -1,4 +1,5 @@ from ._base_data_cleaning import _BaseDataCleaning +from .convert_column_datatype import ConvertColumnDatatype from .drop_columns import DropColumns from .drop_datatype_columns import DropDatatypeColumns from .drop_high_cardinality import DropHighCardinality @@ -6,9 +7,12 @@ from .drop_low_cardinality import DropLowCardinality from .keep_columns import KeepColumns from .replace import Replace +from .rename_columns import RenameColumns + __all__ = [ "_BaseDataCleaning", + "ConvertColumnDatatype", "DropColumns", "DropDatatypeColumns", "DropHighCardinality", @@ -16,4 +20,5 @@ "DropLowCardinality", "KeepColumns", "Replace", + "RenameColumns", ] diff --git a/gators/data_cleaning/_base_data_cleaning.py b/gators/data_cleaning/_base_data_cleaning.py index f357a6e7..1e3ca291 100644 --- a/gators/data_cleaning/_base_data_cleaning.py +++ b/gators/data_cleaning/_base_data_cleaning.py @@ -1,16 +1,15 @@ # License: Apache-2.0 -from abc import ABC -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from ..transformers.transformer import Transformer from ..util import util +from gators import DataFrame -class _BaseDataCleaning(Transformer, ABC): + +class _BaseDataCleaning(Transformer): """Base data cleaning transformer.""" def __init__(self): @@ -19,28 +18,28 @@ def __init__(self): self.columns_to_keep: List[str] = [] self.idx_columns_to_keep = np.array([]) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataset. Returns ------- - Union[pd.DataFrame, ks.DataFrame] - Dataset without datetime columns. + X : DataFrame + Transformed dataset. """ self.check_dataframe(X) + if len(self.columns): return X.drop(self.columns, axis=1) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -49,10 +48,12 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) + if self.idx_columns_to_keep.size == 0: + return np.array([]).reshape(0, X.shape[1]) return X[:, self.idx_columns_to_keep] @staticmethod @@ -63,7 +64,7 @@ def get_idx_columns_to_keep( Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns of a dataset. columns_to_drop : List[str] List of columns to drop. diff --git a/gators/data_cleaning/convert_column_datatype.py b/gators/data_cleaning/convert_column_datatype.py new file mode 100644 index 00000000..ed7afcc1 --- /dev/null +++ b/gators/data_cleaning/convert_column_datatype.py @@ -0,0 +1,145 @@ +# License: Apache-2.0 +from typing import List + +import numpy as np + +from ..transformers import Transformer + +LIST_NUMPY_NUM_DTYPES = [ + bool, + int, + "np.int8", + "np.int16", + "np.int32", + "np.int64", + "np.uint8", + "np.uint16", + "np.uint32", + "np.uint64", + float, + "np.float16", + "np.float32", + "np.float64", +] + + +from gators import DataFrame, Series + + +class ConvertColumnDatatype(Transformer): + """Set the datatype of the selected columns to a given datatype. + + Parameters + ---------- + theta_vec : List[float] + List of columns. + datatype : type + Datatype to use. + + Examples + -------- + + Imports and initialization: + + >>> from gators.data_cleaning import ConvertColumnDatatype + >>> obj = ConvertColumnDatatype(columns=['A'], datatype=float) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B + 0 1.0 1 + 1 2.0 1 + 2 3.0 1 + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> obj.transform_numpy(X.to_numpy()) + array([[1., 1.], + [2., 1.], + [3., 1.]]) + """ + + def __init__(self, columns: List[str], datatype: type): + if not isinstance(columns, (list, np.ndarray)): + raise TypeError("`columns` should be a list.") + if not columns: + raise ValueError("`columns` should not be empty.") + if type(datatype) != type and not str(datatype).startswith("datetime"): + raise TypeError("`datatype` should be a type.") + self.columns = columns + self.datatype = datatype + self.column_names = [] + + def fit(self, X: DataFrame, y: Series = None) -> "ConvertColumnDatatype": + """Fit the transformer on the dataframe X. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : ConvertColumnDatatype + Instance of itself. + """ + self.check_dataframe(X) + return self + + def transform(self, X: DataFrame, y: Series = None) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + X[self.columns] = X[self.columns].astype(self.datatype) + + return X + + def transform_numpy(self, X: np.ndarray, y: Series = None) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + if self.datatype in LIST_NUMPY_NUM_DTYPES: + return X.astype(self.datatype) + return X.astype(object) diff --git a/gators/data_cleaning/data_cleaning.c b/gators/data_cleaning/data_cleaning.c new file mode 100644 index 00000000..f3df3c72 --- /dev/null +++ b/gators/data_cleaning/data_cleaning.c @@ -0,0 +1,10292 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "data_cleaning", + "sources": [ + "gators/data_cleaning/data_cleaning.pyx" + ] + }, + "module_name": "data_cleaning" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__data_cleaning +#define __PYX_HAVE_API__data_cleaning +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/data_cleaning/data_cleaning.pyx", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "data_cleaning" */ +static PyArrayObject *__pyx_f_13data_cleaning_replace(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "data_cleaning" +extern int __pyx_module_is_main_data_cleaning; +int __pyx_module_is_main_data_cleaning = 0; + +/* Implementation of "data_cleaning" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_X[] = "X"; +static const char __pyx_k__3[] = "*"; +static const char __pyx_k__6[] = "?"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_replace[] = "replace"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_data_cleaning[] = "data_cleaning"; +static const char __pyx_k_n_elements_vec[] = "n_elements_vec"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_to_replace_np_keys[] = "to_replace_np_keys"; +static const char __pyx_k_to_replace_np_vals[] = "to_replace_np_vals"; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_gators_data_cleaning_data_cleani[] = "gators/data_cleaning/data_cleaning.pyx"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +/* #### Code section: decls ### */ +static PyObject *__pyx_pf_13data_cleaning_replace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_to_replace_np_keys, PyArrayObject *__pyx_v_to_replace_np_vals, PyArrayObject *__pyx_v_n_elements_vec); /* proto */ +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + #endif + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_n_s_X; + PyObject *__pyx_n_s__3; + PyObject *__pyx_n_s__6; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_data_cleaning; + PyObject *__pyx_kp_s_gators_data_cleaning_data_cleani; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_n_elements_vec; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_replace; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_test; + PyObject *__pyx_n_s_to_replace_np_keys; + PyObject *__pyx_n_s_to_replace_np_vals; + PyObject *__pyx_tuple_; + PyObject *__pyx_tuple__2; + PyObject *__pyx_tuple__4; + PyObject *__pyx_codeobj__5; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_n_s__3); + Py_CLEAR(clear_module_state->__pyx_n_s__6); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_data_cleaning); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_data_cleaning_data_cleani); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_n_elements_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_replace); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_n_s_to_replace_np_keys); + Py_CLEAR(clear_module_state->__pyx_n_s_to_replace_np_vals); + Py_CLEAR(clear_module_state->__pyx_tuple_); + Py_CLEAR(clear_module_state->__pyx_tuple__2); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_codeobj__5); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_n_s__3); + Py_VISIT(traverse_module_state->__pyx_n_s__6); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_data_cleaning); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_data_cleaning_data_cleani); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_n_elements_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_replace); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_n_s_to_replace_np_keys); + Py_VISIT(traverse_module_state->__pyx_n_s_to_replace_np_vals); + Py_VISIT(traverse_module_state->__pyx_tuple_); + Py_VISIT(traverse_module_state->__pyx_tuple__2); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_codeobj__5); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 +#define __pyx_n_s__6 __pyx_mstate_global->__pyx_n_s__6 +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_data_cleaning __pyx_mstate_global->__pyx_n_s_data_cleaning +#define __pyx_kp_s_gators_data_cleaning_data_cleani __pyx_mstate_global->__pyx_kp_s_gators_data_cleaning_data_cleani +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_n_elements_vec __pyx_mstate_global->__pyx_n_s_n_elements_vec +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_replace __pyx_mstate_global->__pyx_n_s_replace +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_n_s_to_replace_np_keys __pyx_mstate_global->__pyx_n_s_to_replace_np_keys +#define __pyx_n_s_to_replace_np_vals __pyx_mstate_global->__pyx_n_s_to_replace_np_vals +#define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ +#define __pyx_tuple__2 __pyx_mstate_global->__pyx_tuple__2 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_codeobj__5 __pyx_mstate_global->__pyx_codeobj__5 +/* #### Code section: module_code ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "data_cleaning.pyx":11 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] replace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_13data_cleaning_1replace(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_13data_cleaning_replace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_to_replace_np_keys, PyArrayObject *__pyx_v_to_replace_np_vals, PyArrayObject *__pyx_v_n_elements_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_n_elements_vec; + __Pyx_Buffer __pyx_pybuffer_n_elements_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_to_replace_np_keys; + __Pyx_Buffer __pyx_pybuffer_to_replace_np_keys; + __Pyx_LocalBuf_ND __pyx_pybuffernd_to_replace_np_vals; + __Pyx_Buffer __pyx_pybuffer_to_replace_np_vals; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + __pyx_t_5numpy_int64_t __pyx_t_9; + __pyx_t_5numpy_int64_t __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + __pyx_t_5numpy_int64_t __pyx_t_14; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + int __pyx_t_17; + PyObject **__pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("replace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_to_replace_np_keys.pybuffer.buf = NULL; + __pyx_pybuffer_to_replace_np_keys.refcount = 0; + __pyx_pybuffernd_to_replace_np_keys.data = NULL; + __pyx_pybuffernd_to_replace_np_keys.rcbuffer = &__pyx_pybuffer_to_replace_np_keys; + __pyx_pybuffer_to_replace_np_vals.pybuffer.buf = NULL; + __pyx_pybuffer_to_replace_np_vals.refcount = 0; + __pyx_pybuffernd_to_replace_np_vals.data = NULL; + __pyx_pybuffernd_to_replace_np_vals.rcbuffer = &__pyx_pybuffer_to_replace_np_vals; + __pyx_pybuffer_n_elements_vec.pybuffer.buf = NULL; + __pyx_pybuffer_n_elements_vec.refcount = 0; + __pyx_pybuffernd_n_elements_vec.data = NULL; + __pyx_pybuffernd_n_elements_vec.rcbuffer = &__pyx_pybuffer_n_elements_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer, (PyObject*)__pyx_v_to_replace_np_keys, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_to_replace_np_keys.diminfo[0].strides = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_to_replace_np_keys.diminfo[0].shape = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_to_replace_np_keys.diminfo[1].strides = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_to_replace_np_keys.diminfo[1].shape = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer, (PyObject*)__pyx_v_to_replace_np_vals, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_to_replace_np_vals.diminfo[0].strides = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_to_replace_np_vals.diminfo[0].shape = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_to_replace_np_vals.diminfo[1].strides = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_to_replace_np_vals.diminfo[1].shape = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_elements_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_n_elements_vec.diminfo[0].strides = __pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_n_elements_vec.diminfo[0].shape = __pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer.shape[0]; + + /* "data_cleaning.pyx":21 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 21, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "data_cleaning.pyx":22 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "data_cleaning.pyx":23 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_elements_vec[j]): + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "data_cleaning.pyx":24 + * cdef int n_cols = idx_columns.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_elements_vec[j]): + * if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "data_cleaning.pyx":25 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_elements_vec[j]): # <<<<<<<<<<<<<< + * if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: + * X[i, idx_columns[j]] = to_replace_np_vals[j, k] + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_n_elements_vec.diminfo[0].strides)); + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_k = __pyx_t_11; + + /* "data_cleaning.pyx":26 + * for j in range(n_cols): + * for k in range(n_elements_vec[j]): + * if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: # <<<<<<<<<<<<<< + * X[i, idx_columns[j]] = to_replace_np_vals[j, k] + * break + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_12 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_12 == NULL)) __pyx_t_12 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_12); + __pyx_t_8 = __pyx_v_j; + __pyx_t_13 = __pyx_v_k; + __pyx_t_15 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_to_replace_np_keys.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_to_replace_np_keys.diminfo[1].strides); + if (unlikely(__pyx_t_15 == NULL)) __pyx_t_15 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_15); + __pyx_t_16 = PyObject_RichCompare(__pyx_t_12, __pyx_t_15, Py_EQ); __Pyx_XGOTREF(__pyx_t_16); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_17 = __Pyx_PyObject_IsTrue(__pyx_t_16); if (unlikely((__pyx_t_17 < 0))) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + if (__pyx_t_17) { + + /* "data_cleaning.pyx":27 + * for k in range(n_elements_vec[j]): + * if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: + * X[i, idx_columns[j]] = to_replace_np_vals[j, k] # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_13 = __pyx_v_j; + __pyx_t_8 = __pyx_v_k; + __pyx_t_16 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_to_replace_np_vals.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_to_replace_np_vals.diminfo[1].strides); + if (unlikely(__pyx_t_16 == NULL)) __pyx_t_16 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_16); + __pyx_t_8 = __pyx_v_j; + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_18 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_18); + __Pyx_INCREF(__pyx_t_16); __Pyx_XDECREF(*__pyx_t_18); + *__pyx_t_18 = __pyx_t_16; + __Pyx_XGIVEREF(*__pyx_t_18); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "data_cleaning.pyx":28 + * if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: + * X[i, idx_columns[j]] = to_replace_np_vals[j, k] + * break # <<<<<<<<<<<<<< + * return X + */ + goto __pyx_L8_break; + + /* "data_cleaning.pyx":26 + * for j in range(n_cols): + * for k in range(n_elements_vec[j]): + * if X[i, idx_columns[j]] == to_replace_np_keys[j, k]: # <<<<<<<<<<<<<< + * X[i, idx_columns[j]] = to_replace_np_vals[j, k] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "data_cleaning.pyx":29 + * X[i, idx_columns[j]] = to_replace_np_vals[j, k] + * break + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "data_cleaning.pyx":11 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] replace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_XDECREF(__pyx_t_16); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("data_cleaning.replace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_13data_cleaning_1replace(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_13data_cleaning_1replace = {"replace", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_13data_cleaning_1replace, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_13data_cleaning_1replace(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_to_replace_np_keys = 0; + PyArrayObject *__pyx_v_to_replace_np_vals = 0; + PyArrayObject *__pyx_v_n_elements_vec = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("replace (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_to_replace_np_keys,&__pyx_n_s_to_replace_np_vals,&__pyx_n_s_n_elements_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("replace", 1, 5, 5, 1); __PYX_ERR(0, 11, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_to_replace_np_keys)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("replace", 1, 5, 5, 2); __PYX_ERR(0, 11, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_to_replace_np_vals)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("replace", 1, 5, 5, 3); __PYX_ERR(0, 11, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_n_elements_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("replace", 1, 5, 5, 4); __PYX_ERR(0, 11, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "replace") < 0)) __PYX_ERR(0, 11, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_to_replace_np_keys = ((PyArrayObject *)values[2]); + __pyx_v_to_replace_np_vals = ((PyArrayObject *)values[3]); + __pyx_v_n_elements_vec = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("replace", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 11, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("data_cleaning.replace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 12, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 13, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_to_replace_np_keys), __pyx_ptype_5numpy_ndarray, 1, "to_replace_np_keys", 0))) __PYX_ERR(0, 14, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_to_replace_np_vals), __pyx_ptype_5numpy_ndarray, 1, "to_replace_np_vals", 0))) __PYX_ERR(0, 15, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_n_elements_vec), __pyx_ptype_5numpy_ndarray, 1, "n_elements_vec", 0))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_r = __pyx_pf_13data_cleaning_replace(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_to_replace_np_keys, __pyx_v_to_replace_np_vals, __pyx_v_n_elements_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_13data_cleaning_replace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_to_replace_np_keys, PyArrayObject *__pyx_v_to_replace_np_vals, PyArrayObject *__pyx_v_n_elements_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_n_elements_vec; + __Pyx_Buffer __pyx_pybuffer_n_elements_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_to_replace_np_keys; + __Pyx_Buffer __pyx_pybuffer_to_replace_np_keys; + __Pyx_LocalBuf_ND __pyx_pybuffernd_to_replace_np_vals; + __Pyx_Buffer __pyx_pybuffer_to_replace_np_vals; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("replace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_to_replace_np_keys.pybuffer.buf = NULL; + __pyx_pybuffer_to_replace_np_keys.refcount = 0; + __pyx_pybuffernd_to_replace_np_keys.data = NULL; + __pyx_pybuffernd_to_replace_np_keys.rcbuffer = &__pyx_pybuffer_to_replace_np_keys; + __pyx_pybuffer_to_replace_np_vals.pybuffer.buf = NULL; + __pyx_pybuffer_to_replace_np_vals.refcount = 0; + __pyx_pybuffernd_to_replace_np_vals.data = NULL; + __pyx_pybuffernd_to_replace_np_vals.rcbuffer = &__pyx_pybuffer_to_replace_np_vals; + __pyx_pybuffer_n_elements_vec.pybuffer.buf = NULL; + __pyx_pybuffer_n_elements_vec.refcount = 0; + __pyx_pybuffernd_n_elements_vec.data = NULL; + __pyx_pybuffernd_n_elements_vec.rcbuffer = &__pyx_pybuffer_n_elements_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer, (PyObject*)__pyx_v_to_replace_np_keys, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_to_replace_np_keys.diminfo[0].strides = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_to_replace_np_keys.diminfo[0].shape = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_to_replace_np_keys.diminfo[1].strides = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_to_replace_np_keys.diminfo[1].shape = __pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer, (PyObject*)__pyx_v_to_replace_np_vals, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_to_replace_np_vals.diminfo[0].strides = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_to_replace_np_vals.diminfo[0].shape = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_to_replace_np_vals.diminfo[1].strides = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_to_replace_np_vals.diminfo[1].shape = __pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_elements_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 11, __pyx_L1_error) + } + __pyx_pybuffernd_n_elements_vec.diminfo[0].strides = __pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_n_elements_vec.diminfo[0].shape = __pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_13data_cleaning_replace(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_to_replace_np_keys, __pyx_v_to_replace_np_vals, __pyx_v_n_elements_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("data_cleaning.replace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_elements_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_keys.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_to_replace_np_vals.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, + {&__pyx_n_s__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_data_cleaning, __pyx_k_data_cleaning, sizeof(__pyx_k_data_cleaning), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_data_cleaning_data_cleani, __pyx_k_gators_data_cleaning_data_cleani, sizeof(__pyx_k_gators_data_cleaning_data_cleani), 0, 0, 1, 0}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_n_elements_vec, __pyx_k_n_elements_vec, sizeof(__pyx_k_n_elements_vec), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_replace, __pyx_k_replace, sizeof(__pyx_k_replace), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_to_replace_np_keys, __pyx_k_to_replace_np_keys, sizeof(__pyx_k_to_replace_np_keys), 0, 0, 1, 1}, + {&__pyx_n_s_to_replace_np_vals, __pyx_k_to_replace_np_vals, sizeof(__pyx_k_to_replace_np_vals), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 23, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "data_cleaning.pyx":11 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] replace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__4 = PyTuple_Pack(5, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_to_replace_np_keys, __pyx_n_s_to_replace_np_vals, __pyx_n_s_n_elements_vec); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_data_cleaning_data_cleani, __pyx_n_s_replace, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 2, __pyx_L1_error); + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 2, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_data_cleaning(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_data_cleaning}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "data_cleaning", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initdata_cleaning(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initdata_cleaning(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_data_cleaning(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_data_cleaning(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_data_cleaning(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'data_cleaning' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("data_cleaning", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 2, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "data_cleaning" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 2, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 2, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 2, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 2, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_data_cleaning(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 2, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 2, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 2, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 2, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + if (__pyx_module_is_main_data_cleaning) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 2, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "data_cleaning")) { + if (unlikely((PyDict_SetItemString(modules, "data_cleaning", __pyx_m) < 0))) __PYX_ERR(0, 2, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 2, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 2, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 2, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 2, __pyx_L1_error) + #endif + + /* "data_cleaning.pyx":6 + * cimport numpy as np + * + * import numpy as np # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "data_cleaning.pyx":11 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] replace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_13data_cleaning_1replace, 0, __pyx_n_s_replace, NULL, __pyx_n_s_data_cleaning, __pyx_d, ((PyObject *)__pyx_codeobj__5)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_replace, __pyx_t_2) < 0) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "data_cleaning.pyx":2 + * + * # License: Apache-2.0 # <<<<<<<<<<<<<< + * cimport cython + * cimport numpy as np + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init data_cleaning", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init data_cleaning"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* TupleAndListFromArray */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ + #if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ + static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ + #if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__3; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* PyDictVersioning */ + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_int64)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__6); + } + return name; +} +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/data_cleaning/drop_columns.py b/gators/data_cleaning/drop_columns.py index cc7d6213..e1f468f8 100644 --- a/gators/data_cleaning/drop_columns.py +++ b/gators/data_cleaning/drop_columns.py @@ -1,81 +1,68 @@ # License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import pandas as pd +import numpy as np from ..util import util from ._base_data_cleaning import _BaseDataCleaning +from gators import DataFrame, Series + class DropColumns(_BaseDataCleaning): """Drop the columns given by the user. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns to drop. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.data_cleaning import DropColumns + >>> obj = DropColumns(columns=['B']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) >>> obj.fit_transform(X) A 0 1 1 2 2 3 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropColumns >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = DropColumns(['B']) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1], [2], [3]]) - """ def __init__(self, columns): - if not isinstance(columns, list): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") - - _BaseDataCleaning.__init__(self) self.columns = columns + _BaseDataCleaning.__init__(self) - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropColumns": + def fit(self, X: DataFrame, y: Series = None) -> "DropColumns": """Fit the transformer on the dataframe X. Get the list of column names to remove and the array of @@ -83,14 +70,15 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropColumns": Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - DropColumns: Instance of itself. + self : DropColumns + Instance of itself. """ self.check_dataframe(X) self.columns_to_keep = util.exclude_columns( diff --git a/gators/data_cleaning/drop_datatype_columns.py b/gators/data_cleaning/drop_datatype_columns.py index c68bf2be..b501c48c 100644 --- a/gators/data_cleaning/drop_datatype_columns.py +++ b/gators/data_cleaning/drop_datatype_columns.py @@ -1,12 +1,9 @@ # License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import pandas as pd - from ..util import util from ._base_data_cleaning import _BaseDataCleaning +from gators import DataFrame, Series + class DropDatatypeColumns(_BaseDataCleaning): """Drop the columns belonging to a given datatype. @@ -18,54 +15,43 @@ class DropDatatypeColumns(_BaseDataCleaning): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.data_cleaning import DropDatatypeColumns + >>> obj = DropDatatypeColumns(dtype=float) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropDatatypeColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) >>> obj.fit_transform(X) A 0 1 1 2 2 3 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropDatatypeColumns >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1.], [2.], [3.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropDatatypeColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1., 1., 1.]}) - >>> obj = DropDatatypeColumns(float) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.], - [2.], - [3.]]) - """ def __init__(self, dtype: type): @@ -74,9 +60,7 @@ def __init__(self, dtype: type): _BaseDataCleaning.__init__(self) self.dtype = dtype - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], y=None - ) -> "DropDatatypeColumns": + def fit(self, X: DataFrame, y: Series = None) -> "DropDatatypeColumns": """Fit the transformer on the dataframe X. Get the list of column names to remove and the array of @@ -84,15 +68,17 @@ def fit( Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : None - None + y : Series, default None. + Target values. Returns ------- - DropDatatypeColumns: Instance of itself. + self : DropDatatypeColumns + Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.columns = util.get_datatype_columns(X, self.dtype) self.columns_to_keep = util.exclude_columns( columns=X.columns, excluded_columns=self.columns diff --git a/gators/data_cleaning/drop_high_cardinality.py b/gators/data_cleaning/drop_high_cardinality.py index 76ae0964..32d5bf86 100644 --- a/gators/data_cleaning/drop_high_cardinality.py +++ b/gators/data_cleaning/drop_high_cardinality.py @@ -1,12 +1,11 @@ # License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import pandas as pd +from typing import List from ..util import util from ._base_data_cleaning import _BaseDataCleaning +from gators import DataFrame, Series + class DropHighCardinality(_BaseDataCleaning): """Drop the categorical columns having a large cardinality. @@ -18,54 +17,43 @@ class DropHighCardinality(_BaseDataCleaning): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.data_cleaning import DropHighCardinality - >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) >>> obj = DropHighCardinality(max_categories=2) - >>> obj.fit_transform(X) - B - 0 d - 1 d - 2 e - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) >>> obj.fit_transform(X) B 0 d 1 d 2 e - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropHighCardinality >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['d'], - ['d'], - ['e']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'e']}) - >>> obj = DropHighCardinality(max_categories=2) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['d'], ['d'], ['e']], dtype=object) - """ def __init__(self, max_categories: int): @@ -74,11 +62,7 @@ def __init__(self, max_categories: int): _BaseDataCleaning.__init__(self) self.max_categories = max_categories - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "DropHighCardinality": + def fit(self, X: DataFrame, y: Series = None) -> "DropHighCardinality": """Fit the transformer on the dataframe `X`. Get the list of column names to remove and the array of @@ -86,14 +70,15 @@ def fit( Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : None - None + y : Series, default None. + Target values. Returns ------- - DropHighCardinality: Instance of itself. + self : DropHighCardinality + Instance of itself. """ self.check_dataframe(X) object_columns = util.get_datatype_columns(X, object) @@ -111,30 +96,30 @@ def fit( return self @staticmethod - def get_columns_to_drop( - X: Union[pd.DataFrame, ks.DataFrame], max_categories: int - ) -> List[str]: - """Get the column names to drop. + def get_columns_to_drop(X: DataFrame, max_categories: int) -> List[str]: + """Get the names of the columns to drop. Parameters ---------- - X_nunique : pd.DataFrame - Input dataframe. + X : pd.DataFrame + Dataframe. max_categories : int Maximum number of categories allowed. Returns ------- List[str] - List of column names to drop. + List of the column names to drop. """ object_columns = util.get_datatype_columns(X, object) if not object_columns: return [] - if isinstance(X, pd.DataFrame): - X_nunique = X[object_columns].nunique() - else: - X_nunique = X[object_columns].nunique(approx=True) + X_nunique = util.get_function(X).to_pandas( + util.get_function(X) + .melt(X[object_columns]) + .groupby("variable")["value"] + .nunique() + ) mask_columns = X_nunique > max_categories columns_to_drop = X_nunique[mask_columns].index return list(columns_to_drop.to_numpy()) diff --git a/gators/data_cleaning/drop_high_nan_ratio.py b/gators/data_cleaning/drop_high_nan_ratio.py index add9fdb4..7704da9f 100644 --- a/gators/data_cleaning/drop_high_nan_ratio.py +++ b/gators/data_cleaning/drop_high_nan_ratio.py @@ -1,12 +1,11 @@ # License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import pandas as pd +from typing import List from ..util import util from ._base_data_cleaning import _BaseDataCleaning +from gators import DataFrame, Series + class DropHighNaNRatio(_BaseDataCleaning): """Drop the columns having a large NaN values ratio. @@ -19,62 +18,48 @@ class DropHighNaNRatio(_BaseDataCleaning): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import numpy as np - >>> import pandas as pd >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = pd.DataFrame( - ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd >>> import numpy as np - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = ks.DataFrame( + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - * fit with `pandas` & transform with `NumPy` + * and `pandas` dataframes: - >>> import numpy as np >>> import pandas as pd - >>> from gators.data_cleaning import DropHighNaNRatio >>> X = pd.DataFrame( ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]], dtype=object) - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import numpy as np - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropHighNaNRatio - >>> X = ks.DataFrame( + >>> obj.fit_transform(X) + A + 0 1 + 1 2 + 2 3 + + >>> X = pd.DataFrame( ... {'A': [1, 2, 3], 'B': ['1', None, None], 'C': [1., np.nan, np.nan]}) - >>> obj = DropHighNaNRatio(max_ratio=0.5) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1], [2], [3]], dtype=object) - """ def __init__(self, max_ratio: float): @@ -83,7 +68,7 @@ def __init__(self, max_ratio: float): _BaseDataCleaning.__init__(self) self.max_ratio = max_ratio - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropHighNaNRatio": + def fit(self, X: DataFrame, y: Series = None) -> "DropHighNaNRatio": """Fit the transformer on the dataframe X. Get the list of column names to remove and the array of @@ -91,14 +76,15 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropHighNaNRatio Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : None - None + y : Series, default None. + Target values. Returns ------- - DropHighNaNRatio: Instance of itself. + self : DropHighNaNRatio + Instance of itself. """ self.check_dataframe(X) self.columns = self.get_columns_to_drop(X=X, max_ratio=self.max_ratio) @@ -111,9 +97,7 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropHighNaNRatio return self @staticmethod - def get_columns_to_drop( - X: Union[pd.DataFrame, ks.DataFrame], max_ratio: float - ) -> List[str]: + def get_columns_to_drop(X: DataFrame, max_ratio: float) -> List[str]: """Get the list of column names to drop. Parameters @@ -128,8 +112,5 @@ def get_columns_to_drop( List[str] List of column names to drop. """ - mask_columns = X.isnull().mean() > max_ratio - columns_to_drop = mask_columns[mask_columns].index - if isinstance(columns_to_drop, ks.indexes.Index): - columns_to_drop = columns_to_drop.to_pandas() - return columns_to_drop + mask_columns = util.get_function(X).to_pandas(X.isnull().mean()) > max_ratio + return list(mask_columns[mask_columns].index) diff --git a/gators/data_cleaning/drop_low_cardinality.py b/gators/data_cleaning/drop_low_cardinality.py index 0c62892e..6cb2c21f 100644 --- a/gators/data_cleaning/drop_low_cardinality.py +++ b/gators/data_cleaning/drop_low_cardinality.py @@ -1,15 +1,14 @@ # License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import pandas as pd +from typing import List from ..util import util from ._base_data_cleaning import _BaseDataCleaning +from gators import DataFrame, Series + class DropLowCardinality(_BaseDataCleaning): - """Drop the catgorical columns having a low cardinality. + """Drop the categorical columns having a low cardinality. Parameters ---------- @@ -18,55 +17,43 @@ class DropLowCardinality(_BaseDataCleaning): Examples --------- + Imports and initialization: + + >>> from gators.data_cleaning import DropLowCardinality + >>> obj = DropLowCardinality(min_categories=2) - * fit & transform with `pandas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.data_cleaning import DropLowCardinality >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) - >>> obj.fit_transform(X) - A - 0 a - 1 b - 2 c - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropLowCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) >>> obj.fit_transform(X) A 0 a 1 b 2 c - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import DropLowCardinality >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['a'], ['b'], ['c']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import DropLowCardinality - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['d', 'd', 'd']}) - >>> obj = DropLowCardinality(min_categories=2) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a'], - ['b'], - ['c']], dtype=object) - """ def __init__(self, min_categories: int): @@ -75,7 +62,7 @@ def __init__(self, min_categories: int): _BaseDataCleaning.__init__(self) self.min_categories: int = min_categories - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropLowCardinality": + def fit(self, X: DataFrame, y: Series = None) -> "DropLowCardinality": """Fit the transformer on the dataframe X. Get the list of column names to remove and the array of @@ -83,13 +70,14 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropLowCardinali Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : None - None + y : Series, default None. + Target values. Returns ------- - DropLowCardinality: Instance of itself. + self : DropLowCardinality + Instance of itself. """ self.check_dataframe(X) self.columns = self.get_columns_to_drop(X=X, min_categories=self.min_categories) @@ -103,31 +91,30 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "DropLowCardinali return self @staticmethod - def get_columns_to_drop( - X: Union[pd.DataFrame, ks.DataFrame], min_categories: float - ) -> List[str]: - """Get the list of column names to remove. + def get_columns_to_drop(X: DataFrame, min_categories: float) -> List[str]: + """Get the list of the column names to remove. Parameters ---------- X : pd.DataFrame - Input dataset. + DataFrame. min_categories : int Min categories allowed. Returns ------- List[str] - List of column names to drop. + List of the column names to drop. """ - object_columns = util.get_datatype_columns(X, "object") + object_columns = util.get_datatype_columns(X, object) if not object_columns: return [] - if isinstance(X, pd.DataFrame): - X_nunique = X[object_columns].nunique() - else: - X_nunique = X[object_columns].nunique().to_pandas() - X_nunique = X[object_columns].nunique(approx=True).to_pandas() + X_nunique = util.get_function(X).to_pandas( + util.get_function(X) + .melt(X[object_columns]) + .groupby("variable")["value"] + .nunique() + ) mask_columns = X_nunique < min_categories columns_to_drop = mask_columns[mask_columns].index - return list(columns_to_drop.to_numpy()) + return list(columns_to_drop) diff --git a/gators/data_cleaning/keep_columns.py b/gators/data_cleaning/keep_columns.py index 357b3899..74627e97 100644 --- a/gators/data_cleaning/keep_columns.py +++ b/gators/data_cleaning/keep_columns.py @@ -1,12 +1,11 @@ # License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import pandas as pd +import numpy as np from ..util import util from ._base_data_cleaning import _BaseDataCleaning +from gators import DataFrame, Series + class KeepColumns(_BaseDataCleaning): """Drop the columns which are not given by the user. @@ -19,63 +18,52 @@ class KeepColumns(_BaseDataCleaning): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.data_cleaning import KeepColumns + >>> obj = KeepColumns(columns_to_keep=['A']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) - >>> obj.fit_transform(X) - A - 0 1 - 1 2 - 2 3 - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import KeepColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) >>> obj.fit_transform(X) A 0 1 1 2 2 3 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import KeepColumns >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1], [2], [3]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import KeepColumns - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = KeepColumns(['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1], - [2], - [3]]) - """ def __init__(self, columns_to_keep): - if not isinstance(columns_to_keep, list): + if not isinstance(columns_to_keep, (list, np.ndarray)): raise TypeError("`columns_to_keep` should be a list.") _BaseDataCleaning.__init__(self) self.columns_to_keep = columns_to_keep - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "KeepColumns": + def fit(self, X: DataFrame, y: Series = None) -> "KeepColumns": """Fit the transformer on the dataframe X. Get the list of column names to remove and the array of @@ -83,16 +71,18 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "KeepColumns": Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - KeepColumns: Instance of itself. + self : KeepColumns + Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.columns = util.exclude_columns( columns=X.columns, excluded_columns=self.columns_to_keep ) diff --git a/gators/data_cleaning/rename_columns.py b/gators/data_cleaning/rename_columns.py new file mode 100644 index 00000000..35fb4e82 --- /dev/null +++ b/gators/data_cleaning/rename_columns.py @@ -0,0 +1,125 @@ +# License: Apache-2.0 +import numpy as np + +from typing import Dict + +from ..transformers.transformer import Transformer +from ..util import util + +from gators import DataFrame, Series + + +class RenameColumns(Transformer): + """Rename the columns. + + Parameters + ---------- + to_rename_dict : Dict[str, Dict[str, str]] + The dictionary keys are the columns and its values + are the new columns. + + Examples + --------- + Imports and initialization: + + >>> from gators.data_cleaning import RenameColumns + >>> to_rename_dict = {'A': 'A_f', 'B': 'B_f'} + >>> obj = RenameColumns(to_rename_dict=to_rename_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A_f B_f C + 0 a d 1 + 1 b e 2 + 2 c f 3 + + >>> X = pd.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['a', 'd', 1], + ['b', 'e', 2], + ['c', 'f', 3]], dtype=object) + """ + + def __init__(self, to_rename_dict: Dict[str, Dict[str, str]]): + if not isinstance(to_rename_dict, dict): + raise TypeError("`to_rename_dict` should be a dict.") + Transformer.__init__(self) + self.to_rename_dict = to_rename_dict + self.columns = list(to_rename_dict.keys()) + + def fit(self, X: DataFrame, y: Series = None) -> "Rename": + """Fit the transformer on the dataframe X. + + Get the list of column names to remove and the array of + indices to be kept. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : Rename + Instance of itself. + """ + self.check_dataframe(X) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + return X.rename(columns=self.to_rename_dict) + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + return X diff --git a/gators/data_cleaning/replace.py b/gators/data_cleaning/replace.py index b1b85102..6606c0a7 100644 --- a/gators/data_cleaning/replace.py +++ b/gators/data_cleaning/replace.py @@ -1,15 +1,15 @@ # License: Apache-2.0 -from typing import Dict, Union +from typing import Dict -import databricks.koalas as ks import numpy as np -import pandas as pd from data_cleaning import replace from ..transformers.transformer import Transformer from ..util import util +from gators import DataFrame, Series + class Replace(Transformer): """Replace the categorical values by the ones given by the user. @@ -18,76 +18,69 @@ class Replace(Transformer): Parameters ---------- - to_replace_dict: Dict[str, Dict[str, str]] + to_replace_dict : Dict[str, Dict[str, str]] The dictionary keys are the columns and the dictionary values are the `to_replace` dictionary. + inplace : bool, default True. + If True, impute in-place. + If False, create new imputed columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.data_cleaning import Replace - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} >>> obj = Replace(to_replace_dict=to_replace_dict) - >>> obj.fit_transform(X) - A B C - 0 X Y 1 - 1 Z e 2 - 2 c f 3 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame( + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import Replace - >>> X = ks.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) >>> obj.fit_transform(X) A B C 0 X Y 1 1 Z e 2 2 c f 3 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.data_cleaning import Replace >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) + ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'],'C': [1, 2, 3]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['X', 'Y', 1], ['Z', 'e', 2], ['c', 'f', 3]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.data_cleaning import Replace - >>> X = ks.DataFrame( - ... {'A': ['a', 'b', 'c'], 'B': ['d', 'e','f'],'C': [1, 2, 3]}) - >>> to_replace_dict = {'A': {'a': 'X', 'b': 'Z'}, 'B': {'d': 'Y'}} - >>> obj = Replace(to_replace_dict=to_replace_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['X', 'Y', 1], - ['Z', 'e', 2], - ['c', 'f', 3]], dtype=object) - - """ - def __init__(self, to_replace_dict: Dict[str, Dict[str, str]]): + def __init__( + self, to_replace_dict: Dict[str, Dict[str, str]], inplace: bool = True + ): if not isinstance(to_replace_dict, dict): raise TypeError("`to_replace_dict` should be a dict.") + if len(to_replace_dict) == 0: + raise ValueError("`to_replace_dict` should not be an empty dict.") Transformer.__init__(self) self.to_replace_dict = to_replace_dict + self.inplace = inplace self.columns = list(to_replace_dict.keys()) n_cols = len(self.columns) n_rows = max([len(v) for v in self.to_replace_dict.values()]) @@ -104,7 +97,7 @@ def __init__(self, to_replace_dict: Dict[str, Dict[str, str]]): self.to_replace_dict[col].values() )[:n_elements] - def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "Replace": + def fit(self, X: DataFrame, y: Series = None) -> "Replace": """Fit the transformer on the dataframe X. Get the list of column names to remove and the array of @@ -112,40 +105,46 @@ def fit(self, X: Union[pd.DataFrame, ks.DataFrame], y=None) -> "Replace": Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - Replace: Instance of itself. + self : Replace + Instance of itself. """ self.check_dataframe(X) - self.check_nans(X, self.columns) + self.base_columns = list(X.columns) + self.column_names = self.get_column_names(self.inplace, self.columns, "replace") self.idx_columns = util.get_idx_columns(X.columns, self.columns) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return X.replace(self.to_replace_dict) + X_replace = util.get_function(X).replace(X, self.to_replace_dict) + if self.inplace: + return X_replace + X_replace = X_replace[self.columns].rename( + columns=dict(zip(self.columns, self.column_names)) + ) + return X.join(X_replace) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -154,14 +153,23 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return replace( - X, + if self.inplace: + return replace( + X, + self.idx_columns, + self.to_replace_np_keys, + self.to_replace_np_vals, + self.n_elements_vec, + ) + X_replace = replace( + X.copy(), self.idx_columns, self.to_replace_np_keys, self.to_replace_np_vals, self.n_elements_vec, ) + return np.concatenate((X, X_replace[:, self.idx_columns]), axis=1) diff --git a/gators/data_cleaning/tests/test_convert_column_datatype_dd.py b/gators/data_cleaning/tests/test_convert_column_datatype_dd.py new file mode 100644 index 00000000..9972292a --- /dev/null +++ b/gators/data_cleaning/tests/test_convert_column_datatype_dd.py @@ -0,0 +1,86 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning import ConvertColumnDatatype + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [True, False, True, False], + "B": [True, True, True, False], + "C": [True, True, True, True], + "D": [1, 2, 3, 4], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [1.0, 0.0, 1.0, 0.0], + "B": [1.0, 1.0, 1.0, 0.0], + "C": [1.0, 1.0, 1.0, 1.0], + "D": [1, 2, 3, 4], + } + ) + obj = ConvertColumnDatatype(columns=["A", "B", "C"], datatype=float).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], + "B": [True, False], + "C": [True, True], + "D": [1, 2], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], + "B": [True, False], + "C": [True, True], + "D": [1, 2], + } + ) + X_expected["A"] = X_expected["A"].astype("datetime64[ns]") + obj = ConvertColumnDatatype(columns=["A"], datatype="datetime64[ns]").fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, dtype=X_numpy_new.dtype + ) + X_expected = pd.DataFrame(X_expected, columns=X_expected.columns, dtype=float) + assert_frame_equal(X_new, X_expected) + + +def test_obj(data_obj): + obj, X, X_expected = data_obj + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_obj_dd_np(data_obj): + obj, X, X_expected = data_obj + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + assert X_numpy_new.tolist() == X.compute().to_numpy().tolist() diff --git a/gators/data_cleaning/tests/test_convert_column_datatype_ks.py b/gators/data_cleaning/tests/test_convert_column_datatype_ks.py new file mode 100644 index 00000000..44247bc3 --- /dev/null +++ b/gators/data_cleaning/tests/test_convert_column_datatype_ks.py @@ -0,0 +1,83 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning import ConvertColumnDatatype + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [True, False, True, False], + "B": [True, True, True, False], + "C": [True, True, True, True], + "D": [1, 2, 3, 4], + } + ) + X_expected = pd.DataFrame( + { + "A": [1.0, 0.0, 1.0, 0.0], + "B": [1.0, 1.0, 1.0, 0.0], + "C": [1.0, 1.0, 1.0, 1.0], + "D": [1, 2, 3, 4], + } + ) + obj = ConvertColumnDatatype(columns=["A", "B", "C"], datatype=float).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj_ks(): + X = ps.DataFrame( + { + "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], + "B": [True, False], + "C": [True, True], + "D": [1, 2], + } + ) + X_expected = pd.DataFrame( + { + "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], + "B": [True, False], + "C": [True, True], + "D": [1, 2], + } + ) + X_expected["A"] = X_expected["A"].astype("datetime64[ns]") + obj = ConvertColumnDatatype(columns=["A"], datatype="datetime64[ns]").fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy = X.to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + assert X_numpy_new.tolist() == X_expected.to_numpy().tolist() + + +@pytest.mark.pyspark +def test_obj_ks(data_obj_ks): + obj, X, X_expected = data_obj_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_obj_ks_np(data_obj_ks): + obj, X, X_expected = data_obj_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + assert X_numpy_new.tolist() == X.to_numpy().tolist() diff --git a/gators/data_cleaning/tests/test_convert_column_datatype_pd.py b/gators/data_cleaning/tests/test_convert_column_datatype_pd.py new file mode 100644 index 00000000..705ab2a2 --- /dev/null +++ b/gators/data_cleaning/tests/test_convert_column_datatype_pd.py @@ -0,0 +1,92 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning import ConvertColumnDatatype + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [True, False, True, False], + "B": [True, True, True, False], + "C": [True, True, True, True], + "D": [1, 2, 3, 4], + } + ) + X_expected = pd.DataFrame( + { + "A": [1.0, 0.0, 1.0, 0.0], + "B": [1.0, 1.0, 1.0, 0.0], + "C": [1.0, 1.0, 1.0, 1.0], + "D": [1, 2, 3, 4], + } + ) + obj = ConvertColumnDatatype(columns=["A", "B", "C"], datatype=float).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj(): + X = pd.DataFrame( + { + "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], + "B": [True, False], + "C": [True, True], + "D": [1, 2], + } + ) + X_expected = pd.DataFrame( + { + "A": ["2020-01-01 00:00:00", "2020-04-08 06:00:00"], + "B": [True, False], + "C": [True, True], + "D": [1, 2], + } + ) + X_expected["A"] = X_expected["A"].astype("datetime64[ns]") + obj = ConvertColumnDatatype(columns=["A"], datatype="datetime64[ns]").fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy = X.to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame( + X_numpy_new, columns=X_expected.columns, dtype=X_numpy_new.dtype + ) + X_expected = pd.DataFrame(X_expected, columns=X_expected.columns, dtype=float) + assert_frame_equal(X_new, X_expected) + + +def test_obj(data_obj): + obj, X, X_expected = data_obj + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_obj_pd_np(data_obj): + obj, X, X_expected = data_obj + X_numpy = X.to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + assert X_numpy_new.tolist() == X.to_numpy().tolist() + + +def test_input(): + with pytest.raises(TypeError): + _ = ConvertColumnDatatype(columns=0, datatype=float) + with pytest.raises(ValueError): + _ = ConvertColumnDatatype(columns=[], datatype=float) + with pytest.raises(TypeError): + _ = ConvertColumnDatatype(columns=["A"], datatype=0) + with pytest.raises(TypeError): + _ = ConvertColumnDatatype(columns=["A"], datatype="x") diff --git a/gators/data_cleaning/tests/test_drop_columns.py b/gators/data_cleaning/tests/test_drop_columns.py deleted file mode 100644 index 4708c243..00000000 --- a/gators/data_cleaning/tests/test_drop_columns.py +++ /dev/null @@ -1,55 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.drop_columns import DropColumns - - -@pytest.fixture -def data(): - X = pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) - obj = DropColumns(["A"]).fit(X) - X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) - obj = DropColumns(["A"]).fit(X) - X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(data): - with pytest.raises(TypeError): - _ = DropColumns(columns="q") diff --git a/gators/data_cleaning/tests/test_drop_columns_dd.py b/gators/data_cleaning/tests/test_drop_columns_dd.py new file mode 100644 index 00000000..59abfb45 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_columns_dd.py @@ -0,0 +1,30 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_columns import DropColumns + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}), npartitions=1 + ) + obj = DropColumns(["A"]).fit(X) + X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new["C"] = X_new["C"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_columns_ks.py b/gators/data_cleaning/tests/test_drop_columns_ks.py new file mode 100644 index 00000000..643abab4 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_columns_ks.py @@ -0,0 +1,29 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_columns import DropColumns + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) + obj = DropColumns(["A"]).fit(X) + X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_columns_pd.py b/gators/data_cleaning/tests/test_drop_columns_pd.py new file mode 100644 index 00000000..22f6f7a8 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_columns_pd.py @@ -0,0 +1,44 @@ +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_columns import DropColumns + + +@pytest.fixture +def data(): + X = pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) + obj = DropColumns(["A"]).fit(X) + X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_empty_pd(data): + _, X, _ = data + obj = DropColumns(["A", "B", "C"]) + obj.transform(X).shape == (2, 0) + + +def test_empty_pd_np(data): + _, X, _ = data + obj = DropColumns(["A", "B", "C"]) + obj.transform(X).shape == (2, 0) + obj.transform_numpy(X.to_numpy()).shape = (0, 3) + + +def test_drop_columns_init(data): + with pytest.raises(TypeError): + _ = DropColumns(columns="q") diff --git a/gators/data_cleaning/tests/test_drop_datatype_columns.py b/gators/data_cleaning/tests/test_drop_datatype_columns.py deleted file mode 100644 index bceae859..00000000 --- a/gators/data_cleaning/tests/test_drop_datatype_columns.py +++ /dev/null @@ -1,55 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns - - -@pytest.fixture -def data(): - X = pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) - obj = DropDatatypeColumns(dtype=float).fit(X) - X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) - obj = DropDatatypeColumns(dtype=float).fit(X) - X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(): - with pytest.raises(TypeError): - _ = DropDatatypeColumns(dtype="a") diff --git a/gators/data_cleaning/tests/test_drop_datatype_columns_dd.py b/gators/data_cleaning/tests/test_drop_datatype_columns_dd.py new file mode 100644 index 00000000..bb5e81ab --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_datatype_columns_dd.py @@ -0,0 +1,30 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}), npartitions=1 + ) + obj = DropDatatypeColumns(dtype=float).fit(X) + X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new["C"] = X_new["C"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_datatype_columns_ks.py b/gators/data_cleaning/tests/test_drop_datatype_columns_ks.py new file mode 100644 index 00000000..c652e266 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_datatype_columns_ks.py @@ -0,0 +1,29 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) + obj = DropDatatypeColumns(dtype=float).fit(X) + X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_datatype_columns_pd.py b/gators/data_cleaning/tests/test_drop_datatype_columns_pd.py new file mode 100644 index 00000000..774ea9c7 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_datatype_columns_pd.py @@ -0,0 +1,31 @@ +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns + + +@pytest.fixture +def data(): + X = pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) + obj = DropDatatypeColumns(dtype=float).fit(X) + X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_drop_columns_init(): + with pytest.raises(TypeError): + _ = DropDatatypeColumns(dtype="a") diff --git a/gators/data_cleaning/tests/test_drop_high_cardinality.py b/gators/data_cleaning/tests/test_drop_high_cardinality.py deleted file mode 100644 index f4056914..00000000 --- a/gators/data_cleaning/tests/test_drop_high_cardinality.py +++ /dev/null @@ -1,157 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.drop_high_cardinality import DropHighCardinality - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {"A": list("qwe"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} - ) - X_expected = pd.DataFrame({"B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]}) - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {"A": list("qwe"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} - ) - X_expected = pd.DataFrame({"B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]}) - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop(): - X = pd.DataFrame( - {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} - ) - X_expected = X.copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop_ks(): - X = ks.DataFrame( - {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} - ) - X_expected = X.to_pandas().copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object(): - X = pd.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) - X_expected = X.copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object_ks(): - X = ks.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) - X_expected = X.to_pandas().copy() - obj = DropHighCardinality(max_categories=2).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_drop_pd(data_no_drop): - obj, X, X_expected = data_no_drop - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_drop_ks(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_drop_pd_np(data_no_drop): - obj, X, X_expected = data_no_drop - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_drop_ks_np(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_object_pd(data_no_object): - obj, X, X_expected = data_no_object - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_object_pd_np(data_no_object): - obj, X, X_expected = data_no_object - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks_np(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_object_columns_empty(data_no_drop): - X = pd.DataFrame({"A": [1, 2, 3]}) - X_new = DropHighCardinality(max_categories=2).fit_transform(X.copy()) - assert_frame_equal(X_new, X) - - -def test_init(): - with pytest.raises(TypeError): - _ = DropHighCardinality(max_categories="q") diff --git a/gators/data_cleaning/tests/test_drop_high_cardinality_dd.py b/gators/data_cleaning/tests/test_drop_high_cardinality_dd.py new file mode 100644 index 00000000..bb5e81ab --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_high_cardinality_dd.py @@ -0,0 +1,30 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}), npartitions=1 + ) + obj = DropDatatypeColumns(dtype=float).fit(X) + X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new["C"] = X_new["C"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_high_cardinality_ks.py b/gators/data_cleaning/tests/test_drop_high_cardinality_ks.py new file mode 100644 index 00000000..25aab284 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_high_cardinality_ks.py @@ -0,0 +1,79 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_high_cardinality import DropHighCardinality + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + {"A": list("qwe"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} + ) + X_expected = pd.DataFrame({"B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]}) + obj = DropHighCardinality(max_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_drop_ks(): + X = ps.DataFrame( + {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} + ) + X_expected = X.to_pandas().copy() + obj = DropHighCardinality(max_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_object_ks(): + X = ps.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) + X_expected = X.to_pandas().copy() + obj = DropHighCardinality(max_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_drop_ks(data_no_drop_ks): + obj, X, X_expected = data_no_drop_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_drop_ks_np(data_no_drop_ks): + obj, X, X_expected = data_no_drop_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_object_ks(data_no_object_ks): + obj, X, X_expected = data_no_object_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_object_ks_np(data_no_object_ks): + obj, X, X_expected = data_no_object_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/data_cleaning/tests/test_drop_high_cardinality_pd.py b/gators/data_cleaning/tests/test_drop_high_cardinality_pd.py new file mode 100644 index 00000000..a6bd9bc5 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_high_cardinality_pd.py @@ -0,0 +1,77 @@ +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_high_cardinality import DropHighCardinality + + +@pytest.fixture +def data_pd(): + X = pd.DataFrame( + {"A": list("qwe"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} + ) + X_expected = pd.DataFrame({"B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]}) + obj = DropHighCardinality(max_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_drop_pd(): + X = pd.DataFrame( + {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} + ) + X_expected = X.copy() + obj = DropHighCardinality(max_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_object_pd(): + X = pd.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) + X_expected = X.copy() + obj = DropHighCardinality(max_categories=2).fit(X) + return obj, X, X_expected + + +def test_pd(data_pd): + obj, X, X_expected = data_pd + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data_pd): + obj, X, X_expected = data_pd + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_drop_pd(data_no_drop_pd): + obj, X, X_expected = data_no_drop_pd + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_drop_pd_np(data_no_drop_pd): + obj, X, X_expected = data_no_drop_pd + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_object_pd(data_no_object_pd): + obj, X, X_expected = data_no_object_pd + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_object_pd_np(data_no_object_pd): + obj, X, X_expected = data_no_object_pd + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = DropHighCardinality(max_categories="q") diff --git a/gators/data_cleaning/tests/test_drop_high_nan_ratio.py b/gators/data_cleaning/tests/test_drop_high_nan_ratio.py deleted file mode 100644 index 7555e11f..00000000 --- a/gators/data_cleaning/tests/test_drop_high_nan_ratio.py +++ /dev/null @@ -1,112 +0,0 @@ -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.drop_high_nan_ratio import DropHighNaNRatio - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {"A": [np.nan, np.nan, np.nan], "B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]}, - ) - X_expected = pd.DataFrame( - {"B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]}, - ) - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -@pytest.fixture -def data_no_drop(): - X = pd.DataFrame( - {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} - ) - X_expected = X.copy() - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {"A": [np.nan, np.nan, np.nan], "B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]}, - ) - X_expected = pd.DataFrame( - {"B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]}, - ) - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -@pytest.fixture -def data_no_drop_ks(): - X = ks.DataFrame( - {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} - ) - X_expected = X.to_pandas().copy() - obj = DropHighNaNRatio(max_ratio=0.5).fit(X) - return obj, obj, X, X, X_expected - - -def test_pd(data): - obj, obj, X, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, obj, X, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, obj, X, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, obj, X, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_drop_pd(data_no_drop): - obj, obj, X, X, X_expected = data_no_drop - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_drop_ks(data_no_drop_ks): - obj, obj, X, X, X_expected = data_no_drop_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_drop_pd_np(data_no_drop): - obj, obj, X, X, X_expected = data_no_drop - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_drop_ks_np(data_no_drop_ks): - obj, obj, X, X, X_expected = data_no_drop_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = DropHighNaNRatio(max_ratio="q") diff --git a/gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py b/gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py new file mode 100644 index 00000000..bb5e81ab --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py @@ -0,0 +1,30 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_datatype_columns import DropDatatypeColumns + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}), npartitions=1 + ) + obj = DropDatatypeColumns(dtype=float).fit(X) + X_expected = pd.DataFrame({"A": [1, 2], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new["C"] = X_new["C"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py b/gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py new file mode 100644 index 00000000..f4e46a4c --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py @@ -0,0 +1,57 @@ +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_high_nan_ratio import DropHighNaNRatio + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + {"A": [np.nan, np.nan, np.nan], "B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]} + ) + X_expected = pd.DataFrame({"B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]}) + obj = DropHighNaNRatio(max_ratio=0.5).fit(X) + return obj, obj, X, X, X_expected + + +@pytest.fixture +def data_no_drop_ks(): + X = ps.DataFrame( + {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} + ) + X_expected = X.to_pandas().copy() + obj = DropHighNaNRatio(max_ratio=0.5).fit(X) + return obj, obj, X, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, obj, X, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, obj, X, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_drop_ks(data_no_drop_ks): + obj, obj, X, X, X_expected = data_no_drop_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_drop_ks_np(data_no_drop_ks): + obj, obj, X, X, X_expected = data_no_drop_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py b/gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py new file mode 100644 index 00000000..fdaee1d7 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py @@ -0,0 +1,57 @@ +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_high_nan_ratio import DropHighNaNRatio + + +@pytest.fixture +def data_pd(): + X = pd.DataFrame( + {"A": [np.nan, np.nan, np.nan], "B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]} + ) + X_expected = pd.DataFrame({"B": [np.nan, 0.0, 1.0], "C": ["a", "a", "b"]}) + obj = DropHighNaNRatio(max_ratio=0.5).fit(X) + return obj, obj, X, X, X_expected + + +@pytest.fixture +def data_no_drop_pd(): + X = pd.DataFrame( + {"A": list("qww"), "B": list("ass"), "C": list("zxx"), "D": [0, 1, 2]} + ) + X_expected = X.copy() + obj = DropHighNaNRatio(max_ratio=0.5).fit(X) + return obj, obj, X, X, X_expected + + +def test_pd(data_pd): + obj, obj, X, X, X_expected = data_pd + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data_pd): + obj, obj, X, X, X_expected = data_pd + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_drop_pd(data_no_drop_pd): + obj, obj, X, X, X_expected = data_no_drop_pd + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_drop_pd_np(data_no_drop_pd): + obj, obj, X, X, X_expected = data_no_drop_pd + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = DropHighNaNRatio(max_ratio="q") diff --git a/gators/data_cleaning/tests/test_drop_low_cardinality.py b/gators/data_cleaning/tests/test_drop_low_cardinality.py deleted file mode 100644 index 523dddc1..00000000 --- a/gators/data_cleaning/tests/test_drop_low_cardinality.py +++ /dev/null @@ -1,152 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.drop_low_cardinality import DropLowCardinality - - -@pytest.fixture -def data(): - X = pd.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccc")}) - X_expected = pd.DataFrame({"A": list("abc"), "B": list("abb")}) - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop(): - X = pd.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccd")}) - X_expected = X.copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object(): - X = pd.DataFrame( - {"A": [0.0, 1.0, 2.0], "B": [3.0, 4.0, 5.0], "C": [6.0, 7.0, 8.0]}, dtype=float - ) - X_expected = X.copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccc")}) - X_expected = pd.DataFrame({"A": list("abc"), "B": list("abb")}) - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_drop_ks(): - X = ks.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccd")}) - X_expected = X.to_pandas().copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_object_ks(): - X = ks.DataFrame( - {"A": [0.0, 1.0, 2.0], "B": [3.0, 4.0, 5.0], "C": [6.0, 7.0, 8.0]}, dtype=float - ) - X_expected = X.to_pandas().copy() - obj = DropLowCardinality(min_categories=2).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_drop_pd(data_no_drop): - obj, X, X_expected = data_no_drop - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_drop_ks(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_drop_pd_np(data_no_drop): - obj, X, X_expected = data_no_drop - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_no_drop_ks_np(data_no_drop_ks): - obj, X, X_expected = data_no_drop_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_no_object_pd(data_no_object): - obj, X, X_expected = data_no_object - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_object_pd_np(data_no_object): - obj, X, X_expected = data_no_object - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_object_ks_np(data_no_object_ks): - obj, X, X_expected = data_no_object_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_drop_high_cardinality_init(): - with pytest.raises(TypeError): - _ = DropLowCardinality(min_categories="q") - - -def test_no_obj(): - X = pd.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) - assert_frame_equal(X, DropLowCardinality(min_categories=2).fit_transform(X)) diff --git a/gators/data_cleaning/tests/test_drop_low_cardinality_dd.py b/gators/data_cleaning/tests/test_drop_low_cardinality_dd.py new file mode 100644 index 00000000..6404409f --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_low_cardinality_dd.py @@ -0,0 +1,92 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_low_cardinality import DropLowCardinality + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccc")}), + npartitions=1, + ) + X_expected = pd.DataFrame({"A": list("abc"), "B": list("abb")}) + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_drop(): + X = dd.from_pandas( + pd.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccd")}), + npartitions=1, + ) + X_expected = X.compute().copy() + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_object(): + X = dd.from_pandas( + pd.DataFrame( + {"A": [0.0, 1.0, 2.0], "B": [3.0, 4.0, 5.0], "C": [6.0, 7.0, 8.0]}, + dtype=float, + ), + npartitions=1, + ) + X_expected = X.compute().copy() + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["A", "B"]] = X_new[["A", "B"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_drop_dd(data_no_drop): + obj, X, X_expected = data_no_drop + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_no_drop_dd_np(data_no_drop): + obj, X, X_expected = data_no_drop + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_object_dd(data_no_object): + obj, X, X_expected = data_no_object + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_no_object_dd_np(data_no_object): + obj, X, X_expected = data_no_object + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_drop_high_cardinality_init(): + with pytest.raises(TypeError): + _ = DropLowCardinality(min_categories="q") + + +def test_no_obj(): + X = pd.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) + assert_frame_equal(X, DropLowCardinality(min_categories=2).fit_transform(X)) diff --git a/gators/data_cleaning/tests/test_drop_low_cardinality_ks.py b/gators/data_cleaning/tests/test_drop_low_cardinality_ks.py new file mode 100644 index 00000000..645d0368 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_low_cardinality_ks.py @@ -0,0 +1,82 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_low_cardinality import DropLowCardinality + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccc")}) + X_expected = pd.DataFrame({"A": list("abc"), "B": list("abb")}) + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_drop_ks(): + X = ps.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccd")}) + X_expected = X.to_pandas().copy() + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_object_ks(): + X = ps.DataFrame( + {"A": [0.0, 1.0, 2.0], "B": [3.0, 4.0, 5.0], "C": [6.0, 7.0, 8.0]}, dtype=float + ) + X_expected = X.to_pandas().copy() + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_drop_ks(data_no_drop_ks): + obj, X, X_expected = data_no_drop_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_drop_ks_np(data_no_drop_ks): + obj, X, X_expected = data_no_drop_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_no_object_ks(data_no_object_ks): + obj, X, X_expected = data_no_object_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_object_ks_np(data_no_object_ks): + obj, X, X_expected = data_no_object_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_drop_high_cardinality_init(): + with pytest.raises(TypeError): + _ = DropLowCardinality(min_categories="q") diff --git a/gators/data_cleaning/tests/test_drop_low_cardinality_pd.py b/gators/data_cleaning/tests/test_drop_low_cardinality_pd.py new file mode 100644 index 00000000..0e7a0fb0 --- /dev/null +++ b/gators/data_cleaning/tests/test_drop_low_cardinality_pd.py @@ -0,0 +1,80 @@ +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.drop_low_cardinality import DropLowCardinality + + +@pytest.fixture +def data(): + X = pd.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccc")}) + X_expected = pd.DataFrame({"A": list("abc"), "B": list("abb")}) + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_drop(): + X = pd.DataFrame({"A": list("abc"), "B": list("abb"), "C": list("ccd")}) + X_expected = X.copy() + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_object(): + X = pd.DataFrame( + {"A": [0.0, 1.0, 2.0], "B": [3.0, 4.0, 5.0], "C": [6.0, 7.0, 8.0]}, dtype=float + ) + X_expected = X.copy() + obj = DropLowCardinality(min_categories=2).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_drop_pd(data_no_drop): + obj, X, X_expected = data_no_drop + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_drop_pd_np(data_no_drop): + obj, X, X_expected = data_no_drop + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_object_pd(data_no_object): + obj, X, X_expected = data_no_object + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_object_pd_np(data_no_object): + obj, X, X_expected = data_no_object + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_drop_high_cardinality_init(): + with pytest.raises(TypeError): + _ = DropLowCardinality(min_categories="q") + + +def test_no_obj(): + X = pd.DataFrame({"A": [0, 1, 2], "B": [3, 4, 5], "C": [6, 7, 8]}) + assert_frame_equal(X, DropLowCardinality(min_categories=2).fit_transform(X)) diff --git a/gators/data_cleaning/tests/test_keep_columns.py b/gators/data_cleaning/tests/test_keep_columns.py deleted file mode 100644 index da1c373a..00000000 --- a/gators/data_cleaning/tests/test_keep_columns.py +++ /dev/null @@ -1,55 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.keep_columns import KeepColumns - - -@pytest.fixture -def data(): - X = pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) - obj = KeepColumns(["B", "C"]).fit(X) - X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) - obj = KeepColumns(["B", "C"]).fit(X) - X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(data): - with pytest.raises(TypeError): - _ = KeepColumns(columns_to_keep="q") diff --git a/gators/data_cleaning/tests/test_keep_columns_dd.py b/gators/data_cleaning/tests/test_keep_columns_dd.py new file mode 100644 index 00000000..2a6b5839 --- /dev/null +++ b/gators/data_cleaning/tests/test_keep_columns_dd.py @@ -0,0 +1,30 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.keep_columns import KeepColumns + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}), npartitions=1 + ) + obj = KeepColumns(["B", "C"]).fit(X) + X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new["C"] = X_new["C"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_keep_columns_ks.py b/gators/data_cleaning/tests/test_keep_columns_ks.py new file mode 100644 index 00000000..517a3d25 --- /dev/null +++ b/gators/data_cleaning/tests/test_keep_columns_ks.py @@ -0,0 +1,29 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.keep_columns import KeepColumns + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) + obj = KeepColumns(["B", "C"]).fit(X) + X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_keep_columns_pd.py b/gators/data_cleaning/tests/test_keep_columns_pd.py new file mode 100644 index 00000000..2d8e61db --- /dev/null +++ b/gators/data_cleaning/tests/test_keep_columns_pd.py @@ -0,0 +1,31 @@ +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.keep_columns import KeepColumns + + +@pytest.fixture +def data(): + X = pd.DataFrame({"A": [1, 2], "B": [1.0, 2.0], "C": ["q", "w"]}) + obj = KeepColumns(["B", "C"]).fit(X) + X_expected = pd.DataFrame({"B": [1.0, 2.0], "C": ["q", "w"]}) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_drop_columns_init(data): + with pytest.raises(TypeError): + _ = KeepColumns(columns_to_keep="q") diff --git a/gators/data_cleaning/tests/test_rename_columns_dd.py b/gators/data_cleaning/tests/test_rename_columns_dd.py new file mode 100644 index 00000000..befda3e6 --- /dev/null +++ b/gators/data_cleaning/tests/test_rename_columns_dd.py @@ -0,0 +1,43 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.rename_columns import RenameColumns + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A_f": list("abcd"), + "B_f": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + to_rename_dict = {"A": "A_f", "B": "B_f"} + obj = RenameColumns(to_rename_dict=to_rename_dict).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["A_f", "B_f"]] = X_new[["A_f", "B_f"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, _ = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + assert X_numpy_new.tolist() == X.compute().to_numpy().tolist() diff --git a/gators/data_cleaning/tests/test_rename_columns_ks.py b/gators/data_cleaning/tests/test_rename_columns_ks.py new file mode 100644 index 00000000..66a3bd13 --- /dev/null +++ b/gators/data_cleaning/tests/test_rename_columns_ks.py @@ -0,0 +1,41 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.rename_columns import RenameColumns + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A_f": list("abcd"), + "B_f": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + to_rename_dict = {"A": "A_f", "B": "B_f"} + obj = RenameColumns(to_rename_dict=to_rename_dict).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, _ = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + assert X_numpy_new.tolist() == X.to_numpy().tolist() diff --git a/gators/data_cleaning/tests/test_rename_columns_pd.py b/gators/data_cleaning/tests/test_rename_columns_pd.py new file mode 100644 index 00000000..63976ed6 --- /dev/null +++ b/gators/data_cleaning/tests/test_rename_columns_pd.py @@ -0,0 +1,44 @@ +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.rename_columns import RenameColumns + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A_f": list("abcd"), + "B_f": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + to_rename_dict = {"A": "A_f", "B": "B_f"} + obj = RenameColumns(to_rename_dict=to_rename_dict).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, _ = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + assert X_numpy_new.tolist() == X.to_numpy().tolist() + + +def test_drop_columns_init(data): + with pytest.raises(TypeError): + _ = RenameColumns(to_rename_dict="q") diff --git a/gators/data_cleaning/tests/test_replace.py b/gators/data_cleaning/tests/test_replace.py deleted file mode 100644 index 0285be21..00000000 --- a/gators/data_cleaning/tests/test_replace.py +++ /dev/null @@ -1,81 +0,0 @@ -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.data_cleaning.replace import Replace - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": list("abcd"), - "B": list("abcd"), - "C": [0, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "W", 1: "X", 2: "c", 3: "d"}, - "B": {0: "a", 1: "b", 2: "Y", 3: "Z"}, - "C": {0: 0, 1: 1, 2: 2, 3: 3}, - } - ) - to_replace_dict = {"A": {"a": "W", "b": "X"}, "B": {"c": "Y", "d": "Z"}} - obj = Replace(to_replace_dict=to_replace_dict).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": list("abcd"), - "B": list("abcd"), - "C": [0, 1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": {0: "W", 1: "X", 2: "c", 3: "d"}, - "B": {0: "a", 1: "b", 2: "Y", 3: "Z"}, - "C": {0: 0, 1: 1, 2: 2, 3: 3}, - } - ) - to_replace_dict = {"A": {"a": "W", "b": "X"}, "B": {"c": "Y", "d": "Z"}} - obj = Replace(to_replace_dict=to_replace_dict).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_columns_init(data): - with pytest.raises(TypeError): - _ = Replace(to_replace_dict="q") diff --git a/gators/data_cleaning/tests/test_replace_dd.py b/gators/data_cleaning/tests/test_replace_dd.py new file mode 100644 index 00000000..2c0fff6d --- /dev/null +++ b/gators/data_cleaning/tests/test_replace_dd.py @@ -0,0 +1,44 @@ +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.replace import Replace + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["W", "X", "c", "d"], + "B": ["a", "b", "Y", "Z"], + "C": [0, 1, 2, 3], + } + ) + to_replace_dict = {"A": {"a": "W", "b": "X"}, "B": {"c": "Y", "d": "Z"}} + obj = Replace(to_replace_dict=to_replace_dict).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["A", "B"]] = X_new[["A", "B"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_replace_ks.py b/gators/data_cleaning/tests/test_replace_ks.py new file mode 100644 index 00000000..3aa4cd0f --- /dev/null +++ b/gators/data_cleaning/tests/test_replace_ks.py @@ -0,0 +1,42 @@ +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.replace import Replace + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": ["W", "X", "c", "d"], + "B": ["a", "b", "Y", "Z"], + "C": [0, 1, 2, 3], + } + ) + to_replace_dict = {"A": {"a": "W", "b": "X"}, "B": {"c": "Y", "d": "Z"}} + obj = Replace(to_replace_dict=to_replace_dict).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/data_cleaning/tests/test_replace_pd.py b/gators/data_cleaning/tests/test_replace_pd.py new file mode 100644 index 00000000..a5fdfd45 --- /dev/null +++ b/gators/data_cleaning/tests/test_replace_pd.py @@ -0,0 +1,79 @@ +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.data_cleaning.replace import Replace + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": ["W", "X", "c", "d"], + "B": ["a", "b", "Y", "Z"], + "C": [0, 1, 2, 3], + } + ) + to_replace_dict = {"A": {"a": "W", "b": "X"}, "B": {"c": "Y", "d": "Z"}} + obj = Replace(to_replace_dict=to_replace_dict).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": list("abcd"), + "B": list("abcd"), + "C": [0, 1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A__replace": ["W", "X", "c", "d"], + "B__replace": ["a", "b", "Y", "Z"], + } + ) + to_replace_dict = {"A": {"a": "W", "b": "X"}, "B": {"c": "Y", "d": "Z"}} + obj = Replace(to_replace_dict=to_replace_dict, inplace=False).fit(X) + return obj, X, pd.concat([X, X_expected], axis=1) + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_drop_columns_init(data): + with pytest.raises(TypeError): + _ = Replace(to_replace_dict="q") + with pytest.raises(ValueError): + _ = Replace(to_replace_dict={}) diff --git a/gators/encoders/__init__.py b/gators/encoders/__init__.py index 79f0b86b..1223dc5f 100644 --- a/gators/encoders/__init__.py +++ b/gators/encoders/__init__.py @@ -1,18 +1,15 @@ from ._base_encoder import _BaseEncoder -from .multiclass_encoder import MultiClassEncoder from .ordinal_encoder import OrdinalEncoder +from .count_encoder import CountEncoder from .onehot_encoder import OneHotEncoder from .target_encoder import TargetEncoder from .woe_encoder import WOEEncoder -from .regression_encoder import RegressionEncoder - __all__ = [ "_BaseEncoder", "OrdinalEncoder", + "CountEncoder", "OneHotEncoder", "WOEEncoder", "TargetEncoder", - "MultiClassEncoder", - "RegressionEncoder", ] diff --git a/gators/encoders/__pycache__/__init__.cpython-38.pyc b/gators/encoders/__pycache__/__init__.cpython-38.pyc index 1d6c86b9..0cc6bdf5 100644 Binary files a/gators/encoders/__pycache__/__init__.cpython-38.pyc and b/gators/encoders/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/_base_encoder.cpython-38.pyc b/gators/encoders/__pycache__/_base_encoder.cpython-38.pyc index e2324d0b..aae5486e 100644 Binary files a/gators/encoders/__pycache__/_base_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/_base_encoder.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/multiclass_encoder.cpython-38.pyc b/gators/encoders/__pycache__/multiclass_encoder.cpython-38.pyc index 78038942..8bf6ddf1 100644 Binary files a/gators/encoders/__pycache__/multiclass_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/multiclass_encoder.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/onehot_encoder.cpython-38.pyc b/gators/encoders/__pycache__/onehot_encoder.cpython-38.pyc index 33e65e56..49cb8c97 100644 Binary files a/gators/encoders/__pycache__/onehot_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/onehot_encoder.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/ordinal_encoder.cpython-38.pyc b/gators/encoders/__pycache__/ordinal_encoder.cpython-38.pyc index 383c091e..73c2cf9d 100644 Binary files a/gators/encoders/__pycache__/ordinal_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/ordinal_encoder.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/regression_encoder.cpython-38.pyc b/gators/encoders/__pycache__/regression_encoder.cpython-38.pyc index 5b81da6f..c144dc3b 100644 Binary files a/gators/encoders/__pycache__/regression_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/regression_encoder.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/target_encoder.cpython-38.pyc b/gators/encoders/__pycache__/target_encoder.cpython-38.pyc index 74f3d597..5c42ae0e 100644 Binary files a/gators/encoders/__pycache__/target_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/target_encoder.cpython-38.pyc differ diff --git a/gators/encoders/__pycache__/woe_encoder.cpython-38.pyc b/gators/encoders/__pycache__/woe_encoder.cpython-38.pyc index 6e011773..fdc0a6cb 100644 Binary files a/gators/encoders/__pycache__/woe_encoder.cpython-38.pyc and b/gators/encoders/__pycache__/woe_encoder.cpython-38.pyc differ diff --git a/gators/encoders/_base_encoder.py b/gators/encoders/_base_encoder.py index 8afb5bfc..b8aaad56 100644 --- a/gators/encoders/_base_encoder.py +++ b/gators/encoders/_base_encoder.py @@ -1,17 +1,14 @@ # License: Apache-2.0 -from typing import Any, Collection, Dict, List, Tuple, Union - -import databricks.koalas as ks +from typing import List, Dict import numpy as np -import pandas as pd -from encoder import encoder -from ..transformers.transformer import ( - NUMERICS_DTYPES, - PRINT_NUMERICS_DTYPES, - Transformer, -) +from gators import DataFrame, Series +from encoder import encoder_new +from ..util import util +from ..transformers.transformer import Transformer + +from gators import DataFrame class _BaseEncoder(Transformer): @@ -19,41 +16,82 @@ class _BaseEncoder(Transformer): Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. + inplace : bool. + If True, perform the encoding inplace. """ - def __init__(self, dtype=np.float64): - if dtype not in NUMERICS_DTYPES: - raise TypeError(f"`dtype` should be a dtype from {PRINT_NUMERICS_DTYPES}.") + def __init__(self, columns: List[str], inplace: bool): + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") Transformer.__init__(self) - self.dtype = dtype - self.columns = [] + self.inplace = inplace + self.columns = columns self.idx_columns: np.ndarray = np.array([]) self.num_categories_vec = np.array([]) self.values_vec = np.array([]) self.encoded_values_vec = np.array([]) self.mapping: Dict[str, Dict[str, float]] = {} - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def fit(self, X: DataFrame, y: Series = None) -> "_BaseEncoder": + """Fit the encoder. + + Parameters + ---------- + X : DataFrame: + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + WOEEncoder: + Instance of itself. + """ + self.check_dataframe(X) + self.set_columns( + X=X, include=[bool, object, "string[pyarrow]"], suffix=self.suffix + ) + if not self.columns: + return self + self.mapping = self.generate_mapping(X[self.columns], y) + self.mapping = { + k: {k: str(round(v, 4)) for k, v in v.items()} + for k, v in self.mapping.items() + } + self.set_num_categories_vec() + self.decompose_mapping() + return self + + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return X.replace(self.mapping).astype(self.dtype) + + if self.inplace: + X = util.get_function(X).replace(X, self.mapping) + X = util.get_function(X).to_numeric(X, columns=self.columns) + X[self.columns] = X[self.columns] + return X + X_encoded = util.get_function(X).replace(X.copy(), self.mapping)[self.columns] + X_encoded = X_encoded.rename(columns=dict(zip(self.columns, self.column_names))) + X_encoded = util.get_function(X).to_numeric( + X_encoded, columns=self.column_names + ) + X = util.get_function(X).join(X, X_encoded) + + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the input array. + """Transform the array `X`. Parameters ---------- @@ -61,42 +99,53 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Input array. Returns ------- - np.ndarray: Encoded array. + X : np.ndarray + Encoded array. """ self.check_array(X) - if len(self.idx_columns) == 0: - return X.astype(self.dtype) - return encoder( - X, + if self.idx_columns.size == 0: + return X + + X_encoded = encoder_new( + X[:, self.idx_columns], self.num_categories_vec, self.values_vec, self.encoded_values_vec, - self.idx_columns, - ).astype(self.dtype) + ) + if self.inplace: + X[:, self.idx_columns] = X_encoded + return X.astype(float) + return np.concatenate((X, X_encoded), axis=1) - @staticmethod - def decompose_mapping( - mapping: List[Dict[str, Collection[Any]]], - ) -> Tuple[List[str], np.ndarray, np.ndarray]: + def set_num_categories_vec(self): + self.num_categories_vec = np.array([len(m) for m in self.mapping.values()]) + + def decompose_mapping(self): """Decompose the mapping. Parameters ---------- - mapping List[Dict[str, Collection[Any]]]: - Mapping obtained from the categorical encoder package. + mapping : Dict[str, Dict[str, float]] + The dictionary keys are the categorical columns, + the keys are the mapping itself for the assocaited column. + Returns ------- - Tuple[List[str], np.ndarray, np.ndarray] - Decomposed mapping. + columns : List[float] + List of columns. + + values_vec : np.ndarray + Values to encode. + + encoded_values_vec : np.ndarray + Values used to encode. """ - columns = list(mapping.keys()) - n_columns = len(columns) - max_categories = max([len(m) for m in mapping.values()]) - encoded_values_vec = np.zeros((n_columns, max_categories)) - values_vec = np.zeros((n_columns, max_categories), dtype=object) - for i, c in enumerate(columns): - mapping_col = mapping[c] + n_columns = len(self.columns) + max_categories = max(len(m) for m in self.mapping.values()) + self.encoded_values_vec = np.zeros((n_columns, max_categories)) + self.values_vec = np.zeros((n_columns, max_categories), dtype=object) + for i, c in enumerate(self.columns): + mapping_col = self.mapping[c] n_values = len(mapping_col) - encoded_values_vec[i, :n_values] = np.array(list(mapping_col.values())) - values_vec[i, :n_values] = np.array(list(mapping_col.keys())) - return columns, values_vec, encoded_values_vec + self.encoded_values_vec[i, :n_values] = np.array(list(mapping_col.values())) + self.values_vec[i, :n_values] = np.array(list(mapping_col.keys())) diff --git a/gators/encoders/count_encoder.py b/gators/encoders/count_encoder.py new file mode 100644 index 00000000..830a4508 --- /dev/null +++ b/gators/encoders/count_encoder.py @@ -0,0 +1,91 @@ +# License: Apache-2.0 +import warnings +from typing import Dict + +from ..util import util +from ._base_encoder import _BaseEncoder + +from gators import DataFrame, Series + + +class CountEncoder(_BaseEncoder): + """Encode the categorical columns as integer columns based on the category count. + + Parameters + ---------- + inplace : bool, default to True. + If True, replace in-place the categorical values by numerical ones. + If False, keep the categorical columns and create new encoded columns. + + Examples + --------- + + Imports and initialization: + + >>> from gators.encoders import CountEncoder + >>> obj = CountEncoder() + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B + 0 2.0 1.0 + 1 2.0 2.0 + 2 1.0 2.0 + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> obj.transform_numpy(X.to_numpy()) + array([[2., 1.], + [2., 2.], + [1., 2.]]) + """ + + def __init__(self, columns=None, inplace=True): + _BaseEncoder.__init__(self, columns=columns, inplace=inplace) + self.suffix = "count" + + def generate_mapping( + self, X: DataFrame, y: Series = None + ) -> Dict[str, Dict[str, float]]: + """Generate the mapping to perform the encoding. + + Parameters + ---------- + X : DataFrame + Input dataframe. + + Returns + ------- + Dict[str, Dict[str, float]] + Mapping. + """ + return { + c: ( + util.get_function(X) + .to_pandas(X[c].value_counts()) + .astype(float) + .to_dict() + ) + for c in X.columns + } diff --git a/gators/encoders/encoder.c b/gators/encoders/encoder.c new file mode 100644 index 00000000..1cd25ed2 --- /dev/null +++ b/gators/encoders/encoder.c @@ -0,0 +1,13590 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "encoder", + "sources": [ + "gators/encoders/encoder.pyx" + ] + }, + "module_name": "encoder" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__encoder +#define __PYX_HAVE_API__encoder +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/encoders/encoder.pyx", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* pybytes_as_double.proto */ +static double __Pyx_SlowPyString_AsDouble(PyObject *obj); +static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length); +static CYTHON_INLINE double __Pyx_PyBytes_AsDouble(PyObject *obj) { + char* as_c_string; + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + as_c_string = PyBytes_AS_STRING(obj); + size = PyBytes_GET_SIZE(obj); +#else + if (PyBytes_AsStringAndSize(obj, &as_c_string, &size) < 0) { + return (double)-1; + } +#endif + return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); +} +static CYTHON_INLINE double __Pyx_PyByteArray_AsDouble(PyObject *obj) { + char* as_c_string; + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + as_c_string = PyByteArray_AS_STRING(obj); + size = PyByteArray_GET_SIZE(obj); +#else + as_c_string = PyByteArray_AsString(obj); + if (as_c_string == NULL) { + return (double)-1; + } + size = PyByteArray_Size(obj); +#endif + return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); +} + +/* pyunicode_as_double.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS +static const char* __Pyx__PyUnicode_AsDouble_Copy(const void* data, const int kind, char* buffer, Py_ssize_t start, Py_ssize_t end) { + int last_was_punctuation; + Py_ssize_t i; + last_was_punctuation = 1; + for (i=start; i <= end; i++) { + Py_UCS4 chr = PyUnicode_READ(kind, data, i); + int is_punctuation = (chr == '_') | (chr == '.'); + *buffer = (char)chr; + buffer += (chr != '_'); + if (unlikely(chr > 127)) goto parse_failure; + if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; + last_was_punctuation = is_punctuation; + } + if (unlikely(last_was_punctuation)) goto parse_failure; + *buffer = '\0'; + return buffer; +parse_failure: + return NULL; +} +static double __Pyx__PyUnicode_AsDouble_inf_nan(const void* data, int kind, Py_ssize_t start, Py_ssize_t length) { + int matches = 1; + Py_UCS4 chr; + Py_UCS4 sign = PyUnicode_READ(kind, data, start); + int is_signed = (sign == '-') | (sign == '+'); + start += is_signed; + length -= is_signed; + switch (PyUnicode_READ(kind, data, start)) { + #ifdef Py_NAN + case 'n': + case 'N': + if (unlikely(length != 3)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+1); + matches &= (chr == 'a') | (chr == 'A'); + chr = PyUnicode_READ(kind, data, start+2); + matches &= (chr == 'n') | (chr == 'N'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_NAN : Py_NAN; + #endif + case 'i': + case 'I': + if (unlikely(length < 3)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+1); + matches &= (chr == 'n') | (chr == 'N'); + chr = PyUnicode_READ(kind, data, start+2); + matches &= (chr == 'f') | (chr == 'F'); + if (likely(length == 3 && matches)) + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + if (unlikely(length != 8)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+3); + matches &= (chr == 'i') | (chr == 'I'); + chr = PyUnicode_READ(kind, data, start+4); + matches &= (chr == 'n') | (chr == 'N'); + chr = PyUnicode_READ(kind, data, start+5); + matches &= (chr == 'i') | (chr == 'I'); + chr = PyUnicode_READ(kind, data, start+6); + matches &= (chr == 't') | (chr == 'T'); + chr = PyUnicode_READ(kind, data, start+7); + matches &= (chr == 'y') | (chr == 'Y'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default: + goto parse_failure; + } + return 0.0; +parse_failure: + return -1.0; +} +static double __Pyx_PyUnicode_AsDouble_WithSpaces(PyObject *obj) { + double value; + const char *last; + char *end; + Py_ssize_t start, length = PyUnicode_GET_LENGTH(obj); + const int kind = PyUnicode_KIND(obj); + const void* data = PyUnicode_DATA(obj); + start = 0; + while (Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, start))) + start++; + while (start < length - 1 && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, length - 1))) + length--; + length -= start; + if (unlikely(length <= 0)) goto fallback; + value = __Pyx__PyUnicode_AsDouble_inf_nan(data, kind, start, length); + if (unlikely(value == -1.0)) goto fallback; + if (value != 0.0) return value; + if (length < 40) { + char number[40]; + last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); + if (unlikely(!last)) goto fallback; + value = PyOS_string_to_double(number, &end, NULL); + } else { + char *number = (char*) PyMem_Malloc((length + 1) * sizeof(char)); + if (unlikely(!number)) goto fallback; + last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); + if (unlikely(!last)) { + PyMem_Free(number); + goto fallback; + } + value = PyOS_string_to_double(number, &end, NULL); + PyMem_Free(number); + } + if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { + return value; + } +fallback: + return __Pyx_SlowPyString_AsDouble(obj); +} +#endif +static CYTHON_INLINE double __Pyx_PyUnicode_AsDouble(PyObject *obj) { +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS + if (unlikely(__Pyx_PyUnicode_READY(obj) == -1)) + return (double)-1; + if (likely(PyUnicode_IS_ASCII(obj))) { + const char *s; + Py_ssize_t length; + s = PyUnicode_AsUTF8AndSize(obj, &length); + return __Pyx__PyBytes_AsDouble(obj, s, length); + } + return __Pyx_PyUnicode_AsDouble_WithSpaces(obj); +#else + return __Pyx_SlowPyString_AsDouble(obj); +#endif +} + +/* pynumber_float.proto */ +static CYTHON_INLINE PyObject* __Pyx__PyNumber_Float(PyObject* obj); +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : __Pyx__PyNumber_Float(x)) + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "encoder" */ +static PyArrayObject *__pyx_f_7encoder_encoder(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_encoder_new(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_onehot_encoder(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_binned_columns_encoder(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_binned_columns_encoder_inplace(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "encoder" +extern int __pyx_module_is_main_encoder; +int __pyx_module_is_main_encoder = 0; + +/* Implementation of "encoder" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_object; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_X[] = "X"; +static const char __pyx_k__4[] = "*"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__14[] = "?"; +static const char __pyx_k_axis[] = "axis"; +static const char __pyx_k_cats[] = "cats"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_empty[] = "empty"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_astype[] = "astype"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_object[] = "object"; +static const char __pyx_k_encoder[] = "encoder"; +static const char __pyx_k_float64[] = "float64"; +static const char __pyx_k_values_vec[] = "values_vec"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_concatenate[] = "concatenate"; +static const char __pyx_k_encoder_new[] = "encoder_new"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_onehot_encoder[] = "onehot_encoder"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_encoded_values_vec[] = "encoded_values_vec"; +static const char __pyx_k_num_categories_vec[] = "num_categories_vec"; +static const char __pyx_k_binned_columns_encoder[] = "binned_columns_encoder"; +static const char __pyx_k_gators_encoders_encoder_pyx[] = "gators/encoders/encoder.pyx"; +static const char __pyx_k_binned_columns_encoder_inplace[] = "binned_columns_encoder_inplace"; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +/* #### Code section: decls ### */ +static PyObject *__pyx_pf_7encoder_encoder(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_num_categories_vec, PyArrayObject *__pyx_v_values_vec, PyArrayObject *__pyx_v_encoded_values_vec, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7encoder_2encoder_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_num_categories_vec, PyArrayObject *__pyx_v_values_vec, PyArrayObject *__pyx_v_encoded_values_vec); /* proto */ +static PyObject *__pyx_pf_7encoder_4onehot_encoder(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_cats); /* proto */ +static PyObject *__pyx_pf_7encoder_6binned_columns_encoder(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7encoder_8binned_columns_encoder_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + #endif + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_n_s_X; + PyObject *__pyx_n_s__14; + PyObject *__pyx_n_s__4; + PyObject *__pyx_n_s_astype; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_axis; + PyObject *__pyx_n_s_binned_columns_encoder; + PyObject *__pyx_n_s_binned_columns_encoder_inplace; + PyObject *__pyx_n_s_cats; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_concatenate; + PyObject *__pyx_n_s_dtype; + PyObject *__pyx_n_s_empty; + PyObject *__pyx_n_s_encoded_values_vec; + PyObject *__pyx_n_s_encoder; + PyObject *__pyx_n_s_encoder_new; + PyObject *__pyx_n_s_float64; + PyObject *__pyx_kp_s_gators_encoders_encoder_pyx; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_num_categories_vec; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_object; + PyObject *__pyx_n_s_onehot_encoder; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_test; + PyObject *__pyx_n_s_values_vec; + PyObject *__pyx_int_1; + PyObject *__pyx_tuple_; + PyObject *__pyx_slice__3; + PyObject *__pyx_tuple__2; + PyObject *__pyx_tuple__5; + PyObject *__pyx_tuple__7; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__11; + PyObject *__pyx_codeobj__6; + PyObject *__pyx_codeobj__8; + PyObject *__pyx_codeobj__10; + PyObject *__pyx_codeobj__12; + PyObject *__pyx_codeobj__13; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_n_s__14); + Py_CLEAR(clear_module_state->__pyx_n_s__4); + Py_CLEAR(clear_module_state->__pyx_n_s_astype); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_binned_columns_encoder); + Py_CLEAR(clear_module_state->__pyx_n_s_binned_columns_encoder_inplace); + Py_CLEAR(clear_module_state->__pyx_n_s_cats); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_concatenate); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype); + Py_CLEAR(clear_module_state->__pyx_n_s_empty); + Py_CLEAR(clear_module_state->__pyx_n_s_encoded_values_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_encoder); + Py_CLEAR(clear_module_state->__pyx_n_s_encoder_new); + Py_CLEAR(clear_module_state->__pyx_n_s_float64); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_encoders_encoder_pyx); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_num_categories_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_object); + Py_CLEAR(clear_module_state->__pyx_n_s_onehot_encoder); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_n_s_values_vec); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_tuple_); + Py_CLEAR(clear_module_state->__pyx_slice__3); + Py_CLEAR(clear_module_state->__pyx_tuple__2); + Py_CLEAR(clear_module_state->__pyx_tuple__5); + Py_CLEAR(clear_module_state->__pyx_tuple__7); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__11); + Py_CLEAR(clear_module_state->__pyx_codeobj__6); + Py_CLEAR(clear_module_state->__pyx_codeobj__8); + Py_CLEAR(clear_module_state->__pyx_codeobj__10); + Py_CLEAR(clear_module_state->__pyx_codeobj__12); + Py_CLEAR(clear_module_state->__pyx_codeobj__13); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_n_s__14); + Py_VISIT(traverse_module_state->__pyx_n_s__4); + Py_VISIT(traverse_module_state->__pyx_n_s_astype); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_binned_columns_encoder); + Py_VISIT(traverse_module_state->__pyx_n_s_binned_columns_encoder_inplace); + Py_VISIT(traverse_module_state->__pyx_n_s_cats); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_concatenate); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype); + Py_VISIT(traverse_module_state->__pyx_n_s_empty); + Py_VISIT(traverse_module_state->__pyx_n_s_encoded_values_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_encoder); + Py_VISIT(traverse_module_state->__pyx_n_s_encoder_new); + Py_VISIT(traverse_module_state->__pyx_n_s_float64); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_encoders_encoder_pyx); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_num_categories_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_object); + Py_VISIT(traverse_module_state->__pyx_n_s_onehot_encoder); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_n_s_values_vec); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_tuple_); + Py_VISIT(traverse_module_state->__pyx_slice__3); + Py_VISIT(traverse_module_state->__pyx_tuple__2); + Py_VISIT(traverse_module_state->__pyx_tuple__5); + Py_VISIT(traverse_module_state->__pyx_tuple__7); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__11); + Py_VISIT(traverse_module_state->__pyx_codeobj__6); + Py_VISIT(traverse_module_state->__pyx_codeobj__8); + Py_VISIT(traverse_module_state->__pyx_codeobj__10); + Py_VISIT(traverse_module_state->__pyx_codeobj__12); + Py_VISIT(traverse_module_state->__pyx_codeobj__13); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_n_s__14 __pyx_mstate_global->__pyx_n_s__14 +#define __pyx_n_s__4 __pyx_mstate_global->__pyx_n_s__4 +#define __pyx_n_s_astype __pyx_mstate_global->__pyx_n_s_astype +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_axis __pyx_mstate_global->__pyx_n_s_axis +#define __pyx_n_s_binned_columns_encoder __pyx_mstate_global->__pyx_n_s_binned_columns_encoder +#define __pyx_n_s_binned_columns_encoder_inplace __pyx_mstate_global->__pyx_n_s_binned_columns_encoder_inplace +#define __pyx_n_s_cats __pyx_mstate_global->__pyx_n_s_cats +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_concatenate __pyx_mstate_global->__pyx_n_s_concatenate +#define __pyx_n_s_dtype __pyx_mstate_global->__pyx_n_s_dtype +#define __pyx_n_s_empty __pyx_mstate_global->__pyx_n_s_empty +#define __pyx_n_s_encoded_values_vec __pyx_mstate_global->__pyx_n_s_encoded_values_vec +#define __pyx_n_s_encoder __pyx_mstate_global->__pyx_n_s_encoder +#define __pyx_n_s_encoder_new __pyx_mstate_global->__pyx_n_s_encoder_new +#define __pyx_n_s_float64 __pyx_mstate_global->__pyx_n_s_float64 +#define __pyx_kp_s_gators_encoders_encoder_pyx __pyx_mstate_global->__pyx_kp_s_gators_encoders_encoder_pyx +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_num_categories_vec __pyx_mstate_global->__pyx_n_s_num_categories_vec +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_object __pyx_mstate_global->__pyx_n_s_object +#define __pyx_n_s_onehot_encoder __pyx_mstate_global->__pyx_n_s_onehot_encoder +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_n_s_values_vec __pyx_mstate_global->__pyx_n_s_values_vec +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ +#define __pyx_slice__3 __pyx_mstate_global->__pyx_slice__3 +#define __pyx_tuple__2 __pyx_mstate_global->__pyx_tuple__2 +#define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 +#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__11 __pyx_mstate_global->__pyx_tuple__11 +#define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6 +#define __pyx_codeobj__8 __pyx_mstate_global->__pyx_codeobj__8 +#define __pyx_codeobj__10 __pyx_mstate_global->__pyx_codeobj__10 +#define __pyx_codeobj__12 __pyx_mstate_global->__pyx_codeobj__12 +#define __pyx_codeobj__13 __pyx_mstate_global->__pyx_codeobj__13 +/* #### Code section: module_code ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "encoder.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + +static PyObject *__pyx_pw_7encoder_1encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_encoder(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_num_categories_vec, PyArrayObject *__pyx_v_values_vec, PyArrayObject *__pyx_v_encoded_values_vec, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + __pyx_t_5numpy_int64_t __pyx_v_i; + __pyx_t_5numpy_int64_t __pyx_v_j; + __pyx_t_5numpy_int64_t __pyx_v_k; + __pyx_t_5numpy_int64_t __pyx_v_j_max; + PyObject *__pyx_v_value = 0; + __pyx_t_5numpy_int64_t __pyx_v_n_rows; + __pyx_t_5numpy_int64_t __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_encoded_values_vec; + __Pyx_Buffer __pyx_pybuffer_encoded_values_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_num_categories_vec; + __Pyx_Buffer __pyx_pybuffer_num_categories_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_values_vec; + __Pyx_Buffer __pyx_pybuffer_values_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + __pyx_t_5numpy_int64_t __pyx_t_2; + __pyx_t_5numpy_int64_t __pyx_t_3; + __pyx_t_5numpy_int64_t __pyx_t_4; + __pyx_t_5numpy_int64_t __pyx_t_5; + __pyx_t_5numpy_int64_t __pyx_t_6; + __pyx_t_5numpy_int64_t __pyx_t_7; + __pyx_t_5numpy_int64_t __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + __pyx_t_5numpy_int64_t __pyx_t_10; + __pyx_t_5numpy_int64_t __pyx_t_11; + __pyx_t_5numpy_int64_t __pyx_t_12; + __pyx_t_5numpy_int64_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + PyObject **__pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("encoder", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_num_categories_vec.pybuffer.buf = NULL; + __pyx_pybuffer_num_categories_vec.refcount = 0; + __pyx_pybuffernd_num_categories_vec.data = NULL; + __pyx_pybuffernd_num_categories_vec.rcbuffer = &__pyx_pybuffer_num_categories_vec; + __pyx_pybuffer_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_values_vec.refcount = 0; + __pyx_pybuffernd_values_vec.data = NULL; + __pyx_pybuffernd_values_vec.rcbuffer = &__pyx_pybuffer_values_vec; + __pyx_pybuffer_encoded_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_encoded_values_vec.refcount = 0; + __pyx_pybuffernd_encoded_values_vec.data = NULL; + __pyx_pybuffernd_encoded_values_vec.rcbuffer = &__pyx_pybuffer_encoded_values_vec; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_num_categories_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_num_categories_vec.diminfo[0].strides = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_num_categories_vec.diminfo[0].shape = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_values_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_values_vec.diminfo[0].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values_vec.diminfo[0].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values_vec.diminfo[1].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values_vec.diminfo[1].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_encoded_values_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_encoded_values_vec.diminfo[0].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[0].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "encoder.pyx":20 + * cdef np.int64_t j_max + * cdef object value + * cdef np.int64_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t n_cols = idx_columns.shape[0] + * for k in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "encoder.pyx":21 + * cdef object value + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * for k in range(n_rows): + * for i in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 21, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "encoder.pyx":22 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] + * for k in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_cols): + * value = X[k, idx_columns[i]] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_k = __pyx_t_4; + + /* "encoder.pyx":23 + * cdef np.int64_t n_cols = idx_columns.shape[0] + * for k in range(n_rows): + * for i in range(n_cols): # <<<<<<<<<<<<<< + * value = X[k, idx_columns[i]] + * j_max = num_categories_vec[i] + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "encoder.pyx":24 + * for k in range(n_rows): + * for i in range(n_cols): + * value = X[k, idx_columns[i]] # <<<<<<<<<<<<<< + * j_max = num_categories_vec[i] + * for j in range(j_max): + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_10 = __pyx_v_k; + __pyx_t_11 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_9 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_9 == NULL)) __pyx_t_9 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_9); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_9); + __pyx_t_9 = 0; + + /* "encoder.pyx":25 + * for i in range(n_cols): + * value = X[k, idx_columns[i]] + * j_max = num_categories_vec[i] # <<<<<<<<<<<<<< + * for j in range(j_max): + * if value == values_vec[i, j]: + */ + __pyx_t_8 = __pyx_v_i; + __pyx_v_j_max = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_num_categories_vec.diminfo[0].strides)); + + /* "encoder.pyx":26 + * value = X[k, idx_columns[i]] + * j_max = num_categories_vec[i] + * for j in range(j_max): # <<<<<<<<<<<<<< + * if value == values_vec[i, j]: + * X[k, idx_columns[i]] = encoded_values_vec[i, j] + */ + __pyx_t_8 = __pyx_v_j_max; + __pyx_t_11 = __pyx_t_8; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_11; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "encoder.pyx":27 + * j_max = num_categories_vec[i] + * for j in range(j_max): + * if value == values_vec[i, j]: # <<<<<<<<<<<<<< + * X[k, idx_columns[i]] = encoded_values_vec[i, j] + * break + */ + __pyx_t_12 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j; + __pyx_t_9 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_values_vec.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_values_vec.diminfo[1].strides); + if (unlikely(__pyx_t_9 == NULL)) __pyx_t_9 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_9); + __pyx_t_14 = PyObject_RichCompare(__pyx_v_value, __pyx_t_9, Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 27, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely((__pyx_t_15 < 0))) __PYX_ERR(0, 27, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + if (__pyx_t_15) { + + /* "encoder.pyx":28 + * for j in range(j_max): + * if value == values_vec[i, j]: + * X[k, idx_columns[i]] = encoded_values_vec[i, j] # <<<<<<<<<<<<<< + * break + * return X + */ + __pyx_t_13 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + __pyx_t_14 = PyFloat_FromDouble((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_encoded_values_vec.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_encoded_values_vec.diminfo[1].strides))); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_12 = __pyx_v_i; + __pyx_t_13 = __pyx_v_k; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_17 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_17); + __Pyx_INCREF(__pyx_t_14); __Pyx_XDECREF(*__pyx_t_17); + *__pyx_t_17 = __pyx_t_14; + __Pyx_XGIVEREF(*__pyx_t_17); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "encoder.pyx":29 + * if value == values_vec[i, j]: + * X[k, idx_columns[i]] = encoded_values_vec[i, j] + * break # <<<<<<<<<<<<<< + * return X + * + */ + goto __pyx_L8_break; + + /* "encoder.pyx":27 + * j_max = num_categories_vec[i] + * for j in range(j_max): + * if value == values_vec[i, j]: # <<<<<<<<<<<<<< + * X[k, idx_columns[i]] = encoded_values_vec[i, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "encoder.pyx":30 + * X[k, idx_columns[i]] = encoded_values_vec[i, j] + * break + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "encoder.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_14); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7encoder_1encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_7encoder_1encoder = {"encoder", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7encoder_1encoder, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7encoder_1encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_num_categories_vec = 0; + PyArrayObject *__pyx_v_values_vec = 0; + PyArrayObject *__pyx_v_encoded_values_vec = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("encoder (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_num_categories_vec,&__pyx_n_s_values_vec,&__pyx_n_s_encoded_values_vec,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_num_categories_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder", 1, 5, 5, 1); __PYX_ERR(0, 9, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_values_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder", 1, 5, 5, 2); __PYX_ERR(0, 9, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_encoded_values_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder", 1, 5, 5, 3); __PYX_ERR(0, 9, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder", 1, 5, 5, 4); __PYX_ERR(0, 9, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "encoder") < 0)) __PYX_ERR(0, 9, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_num_categories_vec = ((PyArrayObject *)values[1]); + __pyx_v_values_vec = ((PyArrayObject *)values[2]); + __pyx_v_encoded_values_vec = ((PyArrayObject *)values[3]); + __pyx_v_idx_columns = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("encoder", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 9, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("encoder.encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 10, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_num_categories_vec), __pyx_ptype_5numpy_ndarray, 1, "num_categories_vec", 0))) __PYX_ERR(0, 11, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values_vec), __pyx_ptype_5numpy_ndarray, 1, "values_vec", 0))) __PYX_ERR(0, 12, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_encoded_values_vec), __pyx_ptype_5numpy_ndarray, 1, "encoded_values_vec", 0))) __PYX_ERR(0, 13, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 14, __pyx_L1_error) + __pyx_r = __pyx_pf_7encoder_encoder(__pyx_self, __pyx_v_X, __pyx_v_num_categories_vec, __pyx_v_values_vec, __pyx_v_encoded_values_vec, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7encoder_encoder(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_num_categories_vec, PyArrayObject *__pyx_v_values_vec, PyArrayObject *__pyx_v_encoded_values_vec, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_encoded_values_vec; + __Pyx_Buffer __pyx_pybuffer_encoded_values_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_num_categories_vec; + __Pyx_Buffer __pyx_pybuffer_num_categories_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_values_vec; + __Pyx_Buffer __pyx_pybuffer_values_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("encoder", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_num_categories_vec.pybuffer.buf = NULL; + __pyx_pybuffer_num_categories_vec.refcount = 0; + __pyx_pybuffernd_num_categories_vec.data = NULL; + __pyx_pybuffernd_num_categories_vec.rcbuffer = &__pyx_pybuffer_num_categories_vec; + __pyx_pybuffer_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_values_vec.refcount = 0; + __pyx_pybuffernd_values_vec.data = NULL; + __pyx_pybuffernd_values_vec.rcbuffer = &__pyx_pybuffer_values_vec; + __pyx_pybuffer_encoded_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_encoded_values_vec.refcount = 0; + __pyx_pybuffernd_encoded_values_vec.data = NULL; + __pyx_pybuffernd_encoded_values_vec.rcbuffer = &__pyx_pybuffer_encoded_values_vec; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_num_categories_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_num_categories_vec.diminfo[0].strides = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_num_categories_vec.diminfo[0].shape = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_values_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_values_vec.diminfo[0].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values_vec.diminfo[0].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values_vec.diminfo[1].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values_vec.diminfo[1].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_encoded_values_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_encoded_values_vec.diminfo[0].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[0].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_7encoder_encoder(__pyx_v_X, __pyx_v_num_categories_vec, __pyx_v_values_vec, __pyx_v_encoded_values_vec, __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "encoder.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder_new( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + +static PyObject *__pyx_pw_7encoder_3encoder_new(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_encoder_new(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_num_categories_vec, PyArrayObject *__pyx_v_values_vec, PyArrayObject *__pyx_v_encoded_values_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + __pyx_t_5numpy_int64_t __pyx_v_i; + __pyx_t_5numpy_int64_t __pyx_v_j; + __pyx_t_5numpy_int64_t __pyx_v_k; + __pyx_t_5numpy_int64_t __pyx_v_j_max; + PyObject *__pyx_v_value = 0; + __pyx_t_5numpy_int64_t __pyx_v_n_rows; + __pyx_t_5numpy_int64_t __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_encoded = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_encoded; + __Pyx_Buffer __pyx_pybuffer_X_encoded; + __Pyx_LocalBuf_ND __pyx_pybuffernd_encoded_values_vec; + __Pyx_Buffer __pyx_pybuffer_encoded_values_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_num_categories_vec; + __Pyx_Buffer __pyx_pybuffer_num_categories_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_values_vec; + __Pyx_Buffer __pyx_pybuffer_values_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyArrayObject *__pyx_t_9 = NULL; + __pyx_t_5numpy_int64_t __pyx_t_10; + __pyx_t_5numpy_int64_t __pyx_t_11; + __pyx_t_5numpy_int64_t __pyx_t_12; + __pyx_t_5numpy_int64_t __pyx_t_13; + __pyx_t_5numpy_int64_t __pyx_t_14; + __pyx_t_5numpy_int64_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + __pyx_t_5numpy_int64_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + int __pyx_t_21; + __pyx_t_5numpy_int64_t __pyx_t_22; + __pyx_t_5numpy_int64_t __pyx_t_23; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("encoder_new", 1); + __pyx_pybuffer_X_encoded.pybuffer.buf = NULL; + __pyx_pybuffer_X_encoded.refcount = 0; + __pyx_pybuffernd_X_encoded.data = NULL; + __pyx_pybuffernd_X_encoded.rcbuffer = &__pyx_pybuffer_X_encoded; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_num_categories_vec.pybuffer.buf = NULL; + __pyx_pybuffer_num_categories_vec.refcount = 0; + __pyx_pybuffernd_num_categories_vec.data = NULL; + __pyx_pybuffernd_num_categories_vec.rcbuffer = &__pyx_pybuffer_num_categories_vec; + __pyx_pybuffer_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_values_vec.refcount = 0; + __pyx_pybuffernd_values_vec.data = NULL; + __pyx_pybuffernd_values_vec.rcbuffer = &__pyx_pybuffer_values_vec; + __pyx_pybuffer_encoded_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_encoded_values_vec.refcount = 0; + __pyx_pybuffernd_encoded_values_vec.data = NULL; + __pyx_pybuffernd_encoded_values_vec.rcbuffer = &__pyx_pybuffer_encoded_values_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_num_categories_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_num_categories_vec.diminfo[0].strides = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_num_categories_vec.diminfo[0].shape = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_values_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_values_vec.diminfo[0].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values_vec.diminfo[0].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values_vec.diminfo[1].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values_vec.diminfo[1].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_encoded_values_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_encoded_values_vec.diminfo[0].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[0].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[1]; + + /* "encoder.pyx":45 + * cdef np.int64_t j_max + * cdef object value + * cdef np.int64_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t n_cols = len(values_vec) + * cdef np.ndarray[np.float64_t, ndim=2] X_encoded = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "encoder.pyx":46 + * cdef object value + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = len(values_vec) # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_encoded = np.empty((n_rows, n_cols)) + * for k in range(n_rows): + */ + __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_values_vec)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_n_cols = __pyx_t_2; + + /* "encoder.pyx":47 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = len(values_vec) + * cdef np.ndarray[np.float64_t, ndim=2] X_encoded = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * for k in range(n_rows): + * for i in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_rows); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_cols); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_t_9 = ((PyArrayObject *)__pyx_t_3); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_encoded.rcbuffer->pybuffer, (PyObject*)__pyx_t_9, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_encoded = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_encoded.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 47, __pyx_L1_error) + } else {__pyx_pybuffernd_X_encoded.diminfo[0].strides = __pyx_pybuffernd_X_encoded.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_encoded.diminfo[0].shape = __pyx_pybuffernd_X_encoded.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_encoded.diminfo[1].strides = __pyx_pybuffernd_X_encoded.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_encoded.diminfo[1].shape = __pyx_pybuffernd_X_encoded.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_9 = 0; + __pyx_v_X_encoded = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "encoder.pyx":48 + * cdef np.int64_t n_cols = len(values_vec) + * cdef np.ndarray[np.float64_t, ndim=2] X_encoded = np.empty((n_rows, n_cols)) + * for k in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_cols): + * value = X[k, i] + */ + __pyx_t_10 = __pyx_v_n_rows; + __pyx_t_11 = __pyx_t_10; + for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { + __pyx_v_k = __pyx_t_12; + + /* "encoder.pyx":49 + * cdef np.ndarray[np.float64_t, ndim=2] X_encoded = np.empty((n_rows, n_cols)) + * for k in range(n_rows): + * for i in range(n_cols): # <<<<<<<<<<<<<< + * value = X[k, i] + * j_max = num_categories_vec[i] + */ + __pyx_t_13 = __pyx_v_n_cols; + __pyx_t_14 = __pyx_t_13; + for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) { + __pyx_v_i = __pyx_t_15; + + /* "encoder.pyx":50 + * for k in range(n_rows): + * for i in range(n_cols): + * value = X[k, i] # <<<<<<<<<<<<<< + * j_max = num_categories_vec[i] + * for j in range(j_max): + */ + __pyx_t_16 = __pyx_v_k; + __pyx_t_17 = __pyx_v_i; + __pyx_t_3 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_3 == NULL)) __pyx_t_3 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_3); + __pyx_t_3 = 0; + + /* "encoder.pyx":51 + * for i in range(n_cols): + * value = X[k, i] + * j_max = num_categories_vec[i] # <<<<<<<<<<<<<< + * for j in range(j_max): + * if value == values_vec[i, j]: + */ + __pyx_t_17 = __pyx_v_i; + __pyx_v_j_max = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_num_categories_vec.diminfo[0].strides)); + + /* "encoder.pyx":52 + * value = X[k, i] + * j_max = num_categories_vec[i] + * for j in range(j_max): # <<<<<<<<<<<<<< + * if value == values_vec[i, j]: + * X_encoded[k, i] = encoded_values_vec[i, j] + */ + __pyx_t_17 = __pyx_v_j_max; + __pyx_t_16 = __pyx_t_17; + for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_16; __pyx_t_18+=1) { + __pyx_v_j = __pyx_t_18; + + /* "encoder.pyx":53 + * j_max = num_categories_vec[i] + * for j in range(j_max): + * if value == values_vec[i, j]: # <<<<<<<<<<<<<< + * X_encoded[k, i] = encoded_values_vec[i, j] + * break + */ + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = __pyx_v_j; + __pyx_t_3 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_values_vec.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_values_vec.diminfo[1].strides); + if (unlikely(__pyx_t_3 == NULL)) __pyx_t_3 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_value, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 53, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_21 < 0))) __PYX_ERR(0, 53, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_21) { + + /* "encoder.pyx":54 + * for j in range(j_max): + * if value == values_vec[i, j]: + * X_encoded[k, i] = encoded_values_vec[i, j] # <<<<<<<<<<<<<< + * break + * return X_encoded + */ + __pyx_t_20 = __pyx_v_i; + __pyx_t_19 = __pyx_v_j; + __pyx_t_22 = __pyx_v_k; + __pyx_t_23 = __pyx_v_i; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_encoded.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_encoded.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X_encoded.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_encoded_values_vec.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_encoded_values_vec.diminfo[1].strides)); + + /* "encoder.pyx":55 + * if value == values_vec[i, j]: + * X_encoded[k, i] = encoded_values_vec[i, j] + * break # <<<<<<<<<<<<<< + * return X_encoded + * + */ + goto __pyx_L8_break; + + /* "encoder.pyx":53 + * j_max = num_categories_vec[i] + * for j in range(j_max): + * if value == values_vec[i, j]: # <<<<<<<<<<<<<< + * X_encoded[k, i] = encoded_values_vec[i, j] + * break + */ + } + } + __pyx_L8_break:; + } + } + + /* "encoder.pyx":56 + * X_encoded[k, i] = encoded_values_vec[i, j] + * break + * return X_encoded # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_encoded); + __pyx_r = ((PyArrayObject *)__pyx_v_X_encoded); + goto __pyx_L0; + + /* "encoder.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder_new( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_encoded.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.encoder_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_encoded.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF((PyObject *)__pyx_v_X_encoded); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7encoder_3encoder_new(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_7encoder_3encoder_new = {"encoder_new", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7encoder_3encoder_new, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7encoder_3encoder_new(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_num_categories_vec = 0; + PyArrayObject *__pyx_v_values_vec = 0; + PyArrayObject *__pyx_v_encoded_values_vec = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("encoder_new (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_num_categories_vec,&__pyx_n_s_values_vec,&__pyx_n_s_encoded_values_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_num_categories_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder_new", 1, 4, 4, 1); __PYX_ERR(0, 35, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_values_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder_new", 1, 4, 4, 2); __PYX_ERR(0, 35, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_encoded_values_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("encoder_new", 1, 4, 4, 3); __PYX_ERR(0, 35, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "encoder_new") < 0)) __PYX_ERR(0, 35, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_num_categories_vec = ((PyArrayObject *)values[1]); + __pyx_v_values_vec = ((PyArrayObject *)values[2]); + __pyx_v_encoded_values_vec = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("encoder_new", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 35, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("encoder.encoder_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 36, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_num_categories_vec), __pyx_ptype_5numpy_ndarray, 1, "num_categories_vec", 0))) __PYX_ERR(0, 37, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values_vec), __pyx_ptype_5numpy_ndarray, 1, "values_vec", 0))) __PYX_ERR(0, 38, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_encoded_values_vec), __pyx_ptype_5numpy_ndarray, 1, "encoded_values_vec", 0))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_r = __pyx_pf_7encoder_2encoder_new(__pyx_self, __pyx_v_X, __pyx_v_num_categories_vec, __pyx_v_values_vec, __pyx_v_encoded_values_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7encoder_2encoder_new(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_num_categories_vec, PyArrayObject *__pyx_v_values_vec, PyArrayObject *__pyx_v_encoded_values_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_encoded_values_vec; + __Pyx_Buffer __pyx_pybuffer_encoded_values_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_num_categories_vec; + __Pyx_Buffer __pyx_pybuffer_num_categories_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_values_vec; + __Pyx_Buffer __pyx_pybuffer_values_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("encoder_new", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_num_categories_vec.pybuffer.buf = NULL; + __pyx_pybuffer_num_categories_vec.refcount = 0; + __pyx_pybuffernd_num_categories_vec.data = NULL; + __pyx_pybuffernd_num_categories_vec.rcbuffer = &__pyx_pybuffer_num_categories_vec; + __pyx_pybuffer_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_values_vec.refcount = 0; + __pyx_pybuffernd_values_vec.data = NULL; + __pyx_pybuffernd_values_vec.rcbuffer = &__pyx_pybuffer_values_vec; + __pyx_pybuffer_encoded_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_encoded_values_vec.refcount = 0; + __pyx_pybuffernd_encoded_values_vec.data = NULL; + __pyx_pybuffernd_encoded_values_vec.rcbuffer = &__pyx_pybuffer_encoded_values_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_num_categories_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_num_categories_vec.diminfo[0].strides = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_num_categories_vec.diminfo[0].shape = __pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_values_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_values_vec.diminfo[0].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values_vec.diminfo[0].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values_vec.diminfo[1].strides = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values_vec.diminfo[1].shape = __pyx_pybuffernd_values_vec.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_encoded_values_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_encoded_values_vec.diminfo[0].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[0].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].strides = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_encoded_values_vec.diminfo[1].shape = __pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_7encoder_encoder_new(__pyx_v_X, __pyx_v_num_categories_vec, __pyx_v_values_vec, __pyx_v_encoded_values_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.encoder_new", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_encoded_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_num_categories_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "encoder.pyx":61 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] onehot_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_7encoder_5onehot_encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_onehot_encoder(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_cats, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cats; + __Pyx_Buffer __pyx_pybuffer_cats; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + __pyx_t_5numpy_int64_t __pyx_t_14; + PyObject *__pyx_t_15 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("onehot_encoder", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_cats.pybuffer.buf = NULL; + __pyx_pybuffer_cats.refcount = 0; + __pyx_pybuffernd_cats.data = NULL; + __pyx_pybuffernd_cats.rcbuffer = &__pyx_pybuffer_cats; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 61, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 61, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cats.rcbuffer->pybuffer, (PyObject*)__pyx_v_cats, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 61, __pyx_L1_error) + } + __pyx_pybuffernd_cats.diminfo[0].strides = __pyx_pybuffernd_cats.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cats.diminfo[0].shape = __pyx_pybuffernd_cats.rcbuffer->pybuffer.shape[0]; + + /* "encoder.pyx":68 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 68, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "encoder.pyx":69 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 69, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "encoder.pyx":70 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":71 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + + /* "encoder.pyx":70 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error); + __pyx_t_5 = 0; + + /* "encoder.pyx":71 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_builtin_object) < 0) __PYX_ERR(0, 71, __pyx_L1_error) + + /* "encoder.pyx":70 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 70, __pyx_L1_error) + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "encoder.pyx":72 + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] + */ + __pyx_t_6 = __pyx_v_n_rows; + __pyx_t_7 = __pyx_t_6; + for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) { + __pyx_v_i = __pyx_t_8; + + /* "encoder.pyx":73 + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] + * return np.concatenate((X, X_new.astype(np.float64)), axis=1) + */ + __pyx_t_9 = __pyx_v_n_cols; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_j = __pyx_t_11; + + /* "encoder.pyx":74 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new.astype(np.float64)), axis=1) + * + */ + __pyx_t_12 = __pyx_v_j; + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_12 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_cats.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_cats.diminfo[0].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5)) __PYX_ERR(0, 74, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error); + __pyx_t_5 = 0; + __pyx_t_2 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_3, __pyx_t_4) < 0))) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + + /* "encoder.pyx":75 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] + * return np.concatenate((X, X_new.astype(np.float64)), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X_new), __pyx_n_s_astype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_15}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 75, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2)) __PYX_ERR(0, 75, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 75, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_15) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_15, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 75, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_15); + __pyx_t_15 = 0; + goto __pyx_L0; + + /* "encoder.pyx":61 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] onehot_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.onehot_encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7encoder_5onehot_encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_7encoder_5onehot_encoder = {"onehot_encoder", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7encoder_5onehot_encoder, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7encoder_5onehot_encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_cats = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("onehot_encoder (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_cats,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 61, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 61, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("onehot_encoder", 1, 3, 3, 1); __PYX_ERR(0, 61, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cats)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 61, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("onehot_encoder", 1, 3, 3, 2); __PYX_ERR(0, 61, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "onehot_encoder") < 0)) __PYX_ERR(0, 61, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_cats = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("onehot_encoder", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 61, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("encoder.onehot_encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 62, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 63, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cats), __pyx_ptype_5numpy_ndarray, 1, "cats", 0))) __PYX_ERR(0, 64, __pyx_L1_error) + __pyx_r = __pyx_pf_7encoder_4onehot_encoder(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_cats); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7encoder_4onehot_encoder(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_cats) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cats; + __Pyx_Buffer __pyx_pybuffer_cats; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("onehot_encoder", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_cats.pybuffer.buf = NULL; + __pyx_pybuffer_cats.refcount = 0; + __pyx_pybuffernd_cats.data = NULL; + __pyx_pybuffernd_cats.rcbuffer = &__pyx_pybuffer_cats; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 61, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 61, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cats.rcbuffer->pybuffer, (PyObject*)__pyx_v_cats, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 61, __pyx_L1_error) + } + __pyx_pybuffernd_cats.diminfo[0].strides = __pyx_pybuffernd_cats.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cats.diminfo[0].shape = __pyx_pybuffernd_cats.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_7encoder_onehot_encoder(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_cats, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.onehot_encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "encoder.pyx":81 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + +static PyObject *__pyx_pw_7encoder_7binned_columns_encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_binned_columns_encoder(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + __pyx_t_5numpy_int64_t __pyx_v_i; + __pyx_t_5numpy_int64_t __pyx_v_j; + __pyx_t_5numpy_int64_t __pyx_v_n_rows; + __pyx_t_5numpy_int64_t __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __pyx_t_5numpy_int64_t __pyx_t_6; + __pyx_t_5numpy_int64_t __pyx_t_7; + __pyx_t_5numpy_int64_t __pyx_t_8; + __pyx_t_5numpy_int64_t __pyx_t_9; + __pyx_t_5numpy_int64_t __pyx_t_10; + __pyx_t_5numpy_int64_t __pyx_t_11; + __pyx_t_5numpy_int64_t __pyx_t_12; + __pyx_t_5numpy_int64_t __pyx_t_13; + __pyx_t_5numpy_int64_t __pyx_t_14; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binned_columns_encoder", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 81, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 81, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "encoder.pyx":86 + * cdef np.int64_t i + * cdef np.int64_t j + * cdef np.int64_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "encoder.pyx":87 + * cdef np.int64_t j + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "encoder.pyx":88 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":89 + * cdef np.int64_t n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_2 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_rows); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_cols); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 89, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4)) __PYX_ERR(0, 89, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + + /* "encoder.pyx":88 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5)) __PYX_ERR(0, 88, __pyx_L1_error); + __pyx_t_5 = 0; + + /* "encoder.pyx":89 + * cdef np.int64_t n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_builtin_object) < 0) __PYX_ERR(0, 89, __pyx_L1_error) + + /* "encoder.pyx":88 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 88, __pyx_L1_error) + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "encoder.pyx":90 + * cdef np.ndarray X_new = np.empty( + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = float(X[i, idx_columns[j]][1:]) + */ + __pyx_t_6 = __pyx_v_n_rows; + __pyx_t_7 = __pyx_t_6; + for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) { + __pyx_v_i = __pyx_t_8; + + /* "encoder.pyx":91 + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = float(X[i, idx_columns[j]][1:]) + * return np.concatenate((X, X_new), axis=1).astype(object) + */ + __pyx_t_9 = __pyx_v_n_cols; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_j = __pyx_t_11; + + /* "encoder.pyx":92 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = float(X[i, idx_columns[j]][1:]) # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1).astype(object) + * + */ + __pyx_t_12 = __pyx_v_j; + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetSlice(__pyx_t_2, 1, 0, NULL, NULL, &__pyx_slice__3, 1, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyNumber_Float(__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyInt_From_npy_int64(__pyx_v_i); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_j); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_5 = 0; + __pyx_t_4 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_3, __pyx_t_2) < 0))) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + } + + /* "encoder.pyx":93 + * for j in range(n_cols): + * X_new[i, j] = float(X[i, idx_columns[j]][1:]) + * return np.concatenate((X, X_new), axis=1).astype(object) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 93, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 93, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 93, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_15, __pyx_n_s_astype); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = NULL; + __pyx_t_16 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_15)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_15); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_16 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_15, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_16, 1+__pyx_t_16); + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 93, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "encoder.pyx":81 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_15); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.binned_columns_encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7encoder_7binned_columns_encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_7encoder_7binned_columns_encoder = {"binned_columns_encoder", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7encoder_7binned_columns_encoder, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7encoder_7binned_columns_encoder(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("binned_columns_encoder (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 81, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 81, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("binned_columns_encoder", 1, 2, 2, 1); __PYX_ERR(0, 81, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "binned_columns_encoder") < 0)) __PYX_ERR(0, 81, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("binned_columns_encoder", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 81, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("encoder.binned_columns_encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 82, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 83, __pyx_L1_error) + __pyx_r = __pyx_pf_7encoder_6binned_columns_encoder(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7encoder_6binned_columns_encoder(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binned_columns_encoder", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 81, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 81, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_7encoder_binned_columns_encoder(__pyx_v_X, __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.binned_columns_encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "encoder.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + +static PyObject *__pyx_pw_7encoder_9binned_columns_encoder_inplace(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_7encoder_binned_columns_encoder_inplace(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + __pyx_t_5numpy_int64_t __pyx_v_i; + __pyx_t_5numpy_int64_t __pyx_v_j; + __pyx_t_5numpy_int64_t __pyx_v_n_rows; + __pyx_t_5numpy_int64_t __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + __pyx_t_5numpy_int64_t __pyx_t_2; + __pyx_t_5numpy_int64_t __pyx_t_3; + __pyx_t_5numpy_int64_t __pyx_t_4; + __pyx_t_5numpy_int64_t __pyx_t_5; + __pyx_t_5numpy_int64_t __pyx_t_6; + __pyx_t_5numpy_int64_t __pyx_t_7; + __pyx_t_5numpy_int64_t __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + __pyx_t_5numpy_int64_t __pyx_t_10; + __pyx_t_5numpy_int64_t __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject **__pyx_t_13; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binned_columns_encoder_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "encoder.pyx":103 + * cdef np.int64_t i + * cdef np.int64_t j + * cdef np.int64_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t n_cols = idx_columns.shape[0] + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 103, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "encoder.pyx":104 + * cdef np.int64_t j + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 104, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "encoder.pyx":105 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_cols = idx_columns.shape[0] + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X[i, idx_columns[j]] = float(X[i, idx_columns[j]][1:]) + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "encoder.pyx":106 + * cdef np.int64_t n_cols = idx_columns.shape[0] + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X[i, idx_columns[j]] = float(X[i, idx_columns[j]][1:]) + * return X.astype(object) + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "encoder.pyx":107 + * for i in range(n_rows): + * for j in range(n_cols): + * X[i, idx_columns[j]] = float(X[i, idx_columns[j]][1:]) # <<<<<<<<<<<<<< + * return X.astype(object) + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_10 = __pyx_v_i; + __pyx_t_11 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_9 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_9 == NULL)) __pyx_t_9 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_9); + __pyx_t_12 = __Pyx_PyObject_GetSlice(__pyx_t_9, 1, 0, NULL, NULL, &__pyx_slice__3, 1, 0, 0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_9 = __Pyx_PyNumber_Float(__pyx_t_12); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_t_8 = __pyx_v_j; + __pyx_t_11 = __pyx_v_i; + __pyx_t_10 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_13 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_13); + __Pyx_INCREF(__pyx_t_9); __Pyx_XDECREF(*__pyx_t_13); + *__pyx_t_13 = __pyx_t_9; + __Pyx_XGIVEREF(*__pyx_t_13); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + } + + /* "encoder.pyx":108 + * for j in range(n_cols): + * X[i, idx_columns[j]] = float(X[i, idx_columns[j]][1:]) + * return X.astype(object) # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_astype); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 108, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_14 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_12))) { + __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_12); + if (likely(__pyx_t_14)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); + __Pyx_INCREF(__pyx_t_14); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_12, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_14, __pyx_builtin_object}; + __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 108, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_9); + __pyx_t_9 = 0; + goto __pyx_L0; + + /* "encoder.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.binned_columns_encoder_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7encoder_9binned_columns_encoder_inplace(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_7encoder_9binned_columns_encoder_inplace = {"binned_columns_encoder_inplace", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7encoder_9binned_columns_encoder_inplace, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7encoder_9binned_columns_encoder_inplace(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("binned_columns_encoder_inplace (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("binned_columns_encoder_inplace", 1, 2, 2, 1); __PYX_ERR(0, 98, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "binned_columns_encoder_inplace") < 0)) __PYX_ERR(0, 98, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("binned_columns_encoder_inplace", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 98, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("encoder.binned_columns_encoder_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 99, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + __pyx_r = __pyx_pf_7encoder_8binned_columns_encoder_inplace(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7encoder_8binned_columns_encoder_inplace(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("binned_columns_encoder_inplace", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_7encoder_binned_columns_encoder_inplace(__pyx_v_X, __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("encoder.binned_columns_encoder_inplace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_n_s__14, __pyx_k__14, sizeof(__pyx_k__14), 0, 0, 1, 1}, + {&__pyx_n_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 1}, + {&__pyx_n_s_astype, __pyx_k_astype, sizeof(__pyx_k_astype), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_axis, __pyx_k_axis, sizeof(__pyx_k_axis), 0, 0, 1, 1}, + {&__pyx_n_s_binned_columns_encoder, __pyx_k_binned_columns_encoder, sizeof(__pyx_k_binned_columns_encoder), 0, 0, 1, 1}, + {&__pyx_n_s_binned_columns_encoder_inplace, __pyx_k_binned_columns_encoder_inplace, sizeof(__pyx_k_binned_columns_encoder_inplace), 0, 0, 1, 1}, + {&__pyx_n_s_cats, __pyx_k_cats, sizeof(__pyx_k_cats), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_concatenate, __pyx_k_concatenate, sizeof(__pyx_k_concatenate), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_n_s_encoded_values_vec, __pyx_k_encoded_values_vec, sizeof(__pyx_k_encoded_values_vec), 0, 0, 1, 1}, + {&__pyx_n_s_encoder, __pyx_k_encoder, sizeof(__pyx_k_encoder), 0, 0, 1, 1}, + {&__pyx_n_s_encoder_new, __pyx_k_encoder_new, sizeof(__pyx_k_encoder_new), 0, 0, 1, 1}, + {&__pyx_n_s_float64, __pyx_k_float64, sizeof(__pyx_k_float64), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_encoders_encoder_pyx, __pyx_k_gators_encoders_encoder_pyx, sizeof(__pyx_k_gators_encoders_encoder_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_num_categories_vec, __pyx_k_num_categories_vec, sizeof(__pyx_k_num_categories_vec), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_object, __pyx_k_object, sizeof(__pyx_k_object), 0, 0, 1, 1}, + {&__pyx_n_s_onehot_encoder, __pyx_k_onehot_encoder, sizeof(__pyx_k_onehot_encoder), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_values_vec, __pyx_k_values_vec, sizeof(__pyx_k_values_vec), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_builtin_object = __Pyx_GetBuiltinName(__pyx_n_s_object); if (!__pyx_builtin_object) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "encoder.pyx":92 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = float(X[i, idx_columns[j]][1:]) # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1).astype(object) + * + */ + __pyx_slice__3 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__3)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__3); + __Pyx_GIVEREF(__pyx_slice__3); + + /* "encoder.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + __pyx_tuple__5 = PyTuple_Pack(5, __pyx_n_s_X, __pyx_n_s_num_categories_vec, __pyx_n_s_values_vec, __pyx_n_s_encoded_values_vec, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_encoders_encoder_pyx, __pyx_n_s_encoder, 9, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 9, __pyx_L1_error) + + /* "encoder.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder_new( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + __pyx_tuple__7 = PyTuple_Pack(4, __pyx_n_s_X, __pyx_n_s_num_categories_vec, __pyx_n_s_values_vec, __pyx_n_s_encoded_values_vec); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_encoders_encoder_pyx, __pyx_n_s_encoder_new, 35, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 35, __pyx_L1_error) + + /* "encoder.pyx":61 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] onehot_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__9 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_cats); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_encoders_encoder_pyx, __pyx_n_s_onehot_encoder, 61, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 61, __pyx_L1_error) + + /* "encoder.pyx":81 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + __pyx_tuple__11 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_encoders_encoder_pyx, __pyx_n_s_binned_columns_encoder, 81, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 81, __pyx_L1_error) + + /* "encoder.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_encoders_encoder_pyx, __pyx_n_s_binned_columns_encoder_inplace, 98, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_encoder(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_encoder}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "encoder", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initencoder(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initencoder(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_encoder(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_encoder(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_encoder(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'encoder' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("encoder", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "encoder" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_encoder(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_encoder) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "encoder")) { + if (unlikely((PyDict_SetItemString(modules, "encoder", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "encoder.pyx":4 + * cimport cython + * cimport numpy as np + * import numpy as np # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7encoder_1encoder, 0, __pyx_n_s_encoder, NULL, __pyx_n_s_encoder, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_encoder, __pyx_t_2) < 0) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] encoder_new( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] num_categories_vec, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7encoder_3encoder_new, 0, __pyx_n_s_encoder_new, NULL, __pyx_n_s_encoder, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_encoder_new, __pyx_t_2) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":61 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] onehot_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7encoder_5onehot_encoder, 0, __pyx_n_s_onehot_encoder, NULL, __pyx_n_s_encoder, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_onehot_encoder, __pyx_t_2) < 0) __PYX_ERR(0, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":81 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7encoder_7binned_columns_encoder, 0, __pyx_n_s_binned_columns_encoder, NULL, __pyx_n_s_encoder, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binned_columns_encoder, __pyx_t_2) < 0) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] binned_columns_encoder_inplace( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7encoder_9binned_columns_encoder_inplace, 0, __pyx_n_s_binned_columns_encoder_inplace, NULL, __pyx_n_s_encoder, __pyx_d, ((PyObject *)__pyx_codeobj__13)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_binned_columns_encoder_inplace, __pyx_t_2) < 0) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "encoder.pyx":1 + * # License: Apache-2.0 # <<<<<<<<<<<<<< + * cimport cython + * cimport numpy as np + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init encoder", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init encoder"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* TupleAndListFromArray */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ + #if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ + static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* PyDictVersioning */ + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ + #if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ + #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* pybytes_as_double */ + static double __Pyx_SlowPyString_AsDouble(PyObject *obj) { + PyObject *float_value; +#if PY_MAJOR_VERSION >= 3 + float_value = PyFloat_FromString(obj); +#else + float_value = PyFloat_FromString(obj, 0); +#endif + if (likely(float_value)) { +#if CYTHON_ASSUME_SAFE_MACROS + double value = PyFloat_AS_DOUBLE(float_value); +#else + double value = PyFloat_AsDouble(float_value); +#endif + Py_DECREF(float_value); + return value; + } + return (double)-1; +} +static const char* __Pyx__PyBytes_AsDouble_Copy(const char* start, char* buffer, Py_ssize_t length) { + int last_was_punctuation = 1; + Py_ssize_t i; + for (i=0; i < length; i++) { + char chr = start[i]; + int is_punctuation = (chr == '_') | (chr == '.') | (chr == 'e') | (chr == 'E'); + *buffer = chr; + buffer += (chr != '_'); + if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; + last_was_punctuation = is_punctuation; + } + if (unlikely(last_was_punctuation)) goto parse_failure; + *buffer = '\0'; + return buffer; +parse_failure: + return NULL; +} +static double __Pyx__PyBytes_AsDouble_inf_nan(const char* start, Py_ssize_t length) { + int matches = 1; + char sign = start[0]; + int is_signed = (sign == '+') | (sign == '-'); + start += is_signed; + length -= is_signed; + switch (start[0]) { + #ifdef Py_NAN + case 'n': + case 'N': + if (unlikely(length != 3)) goto parse_failure; + matches &= (start[1] == 'a' || start[1] == 'A'); + matches &= (start[2] == 'n' || start[2] == 'N'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_NAN : Py_NAN; + #endif + case 'i': + case 'I': + if (unlikely(length < 3)) goto parse_failure; + matches &= (start[1] == 'n' || start[1] == 'N'); + matches &= (start[2] == 'f' || start[2] == 'F'); + if (likely(length == 3 && matches)) + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + if (unlikely(length != 8)) goto parse_failure; + matches &= (start[3] == 'i' || start[3] == 'I'); + matches &= (start[4] == 'n' || start[4] == 'N'); + matches &= (start[5] == 'i' || start[5] == 'I'); + matches &= (start[6] == 't' || start[6] == 'T'); + matches &= (start[7] == 'y' || start[7] == 'Y'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default: + goto parse_failure; + } + return 0.0; +parse_failure: + return -1.0; +} +static CYTHON_INLINE int __Pyx__PyBytes_AsDouble_IsSpace(char ch) { + return (ch == 0x20) | !((ch < 0x9) | (ch > 0xd)); +} +CYTHON_UNUSED static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length) { + double value; + Py_ssize_t i, digits; + const char *last = start + length; + char *end; + while (__Pyx__PyBytes_AsDouble_IsSpace(*start)) + start++; + while (start < last - 1 && __Pyx__PyBytes_AsDouble_IsSpace(last[-1])) + last--; + length = last - start; + if (unlikely(length <= 0)) goto fallback; + value = __Pyx__PyBytes_AsDouble_inf_nan(start, length); + if (unlikely(value == -1.0)) goto fallback; + if (value != 0.0) return value; + digits = 0; + for (i=0; i < length; digits += start[i++] != '_'); + if (likely(digits == length)) { + value = PyOS_string_to_double(start, &end, NULL); + } else if (digits < 40) { + char number[40]; + last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); + if (unlikely(!last)) goto fallback; + value = PyOS_string_to_double(number, &end, NULL); + } else { + char *number = (char*) PyMem_Malloc((digits + 1) * sizeof(char)); + if (unlikely(!number)) goto fallback; + last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); + if (unlikely(!last)) { + PyMem_Free(number); + goto fallback; + } + value = PyOS_string_to_double(number, &end, NULL); + PyMem_Free(number); + } + if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { + return value; + } +fallback: + return __Pyx_SlowPyString_AsDouble(obj); +} + +/* pynumber_float */ + static CYTHON_INLINE PyObject* __Pyx__PyNumber_Float(PyObject* obj) { + double val; + if (PyLong_CheckExact(obj)) { +#if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(obj))) { + val = (double) __Pyx_PyLong_CompactValue(obj); + goto no_error; + } +#endif + val = PyLong_AsDouble(obj); + } else if (PyUnicode_CheckExact(obj)) { + val = __Pyx_PyUnicode_AsDouble(obj); + } else if (PyBytes_CheckExact(obj)) { + val = __Pyx_PyBytes_AsDouble(obj); + } else if (PyByteArray_CheckExact(obj)) { + val = __Pyx_PyByteArray_AsDouble(obj); + } else { + return PyNumber_Float(obj); + } + if (unlikely(val == -1 && PyErr_Occurred())) { + return NULL; + } +#if CYTHON_USE_PYLONG_INTERNALS +no_error: +#endif + return PyFloat_FromDouble(val); +} + +/* SliceObject */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, int wraparound) { + __Pyx_TypeName obj_type_name; +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is unsliceable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); +bad: + return NULL; +} + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ + #if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__4; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_int64)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(npy_int64) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_int64) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(npy_int64, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(npy_int64) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) >= 2 * PyLong_SHIFT)) { + return (npy_int64) (((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(npy_int64) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) >= 3 * PyLong_SHIFT)) { + return (npy_int64) (((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(npy_int64) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) >= 4 * PyLong_SHIFT)) { + return (npy_int64) (((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_int64) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(npy_int64) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(npy_int64, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(npy_int64) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT)) { + return (npy_int64) (((npy_int64)-1)*(((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(npy_int64) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT)) { + return (npy_int64) ((((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT)) { + return (npy_int64) (((npy_int64)-1)*(((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(npy_int64) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT)) { + return (npy_int64) ((((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT)) { + return (npy_int64) (((npy_int64)-1)*(((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(npy_int64) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT)) { + return (npy_int64) ((((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(npy_int64) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(npy_int64) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + npy_int64 val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (npy_int64) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (npy_int64) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_int64) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (npy_int64) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (npy_int64) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(npy_int64) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((npy_int64) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(npy_int64) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((npy_int64) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((npy_int64) 1) << (sizeof(npy_int64) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (npy_int64) -1; + } + } else { + npy_int64 val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_int64) -1; + val = __Pyx_PyInt_As_npy_int64(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_int64"); + return (npy_int64) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_int64"); + return (npy_int64) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__14); + } + return name; +} +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/encoders/encoder.pyx b/gators/encoders/encoder.pyx index d0090f8a..7941ff5d 100644 --- a/gators/encoders/encoder.pyx +++ b/gators/encoders/encoder.pyx @@ -18,9 +18,9 @@ cpdef np.ndarray[object, ndim=2] encoder( cdef np.int64_t j_max cdef object value cdef np.int64_t n_rows = X.shape[0] - cdef np.int64_t n_object_columns = idx_columns.shape[0] + cdef np.int64_t n_cols = idx_columns.shape[0] for k in range(n_rows): - for i in range(n_object_columns): + for i in range(n_cols): value = X[k, idx_columns[i]] j_max = num_categories_vec[i] for j in range(j_max): @@ -30,6 +30,32 @@ cpdef np.ndarray[object, ndim=2] encoder( return X +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim=2] encoder_new( + np.ndarray[object, ndim=2] X, + np.ndarray[np.int64_t, ndim=1] num_categories_vec, + np.ndarray[object, ndim=2] values_vec, + np.ndarray[np.float64_t, ndim=2] encoded_values_vec): + cdef np.int64_t i + cdef np.int64_t j + cdef np.int64_t k + cdef np.int64_t j_max + cdef object value + cdef np.int64_t n_rows = X.shape[0] + cdef np.int64_t n_cols = len(values_vec) + cdef np.ndarray[np.float64_t, ndim=2] X_encoded = np.empty((n_rows, n_cols)) + for k in range(n_rows): + for i in range(n_cols): + value = X[k, i] + j_max = num_categories_vec[i] + for j in range(j_max): + if value == values_vec[i, j]: + X_encoded[k, i] = encoded_values_vec[i, j] + break + return X_encoded + + @cython.boundscheck(False) @cython.wraparound(False) cpdef np.ndarray[object, ndim=2] onehot_encoder( @@ -46,4 +72,37 @@ cpdef np.ndarray[object, ndim=2] onehot_encoder( for i in range(n_rows): for j in range(n_cols): X_new[i, j] = X[i, idx_columns[j]] == cats[j] - return np.concatenate((X, X_new.astype(np.float64)), axis=1) \ No newline at end of file + return np.concatenate((X, X_new.astype(np.float64)), axis=1) + + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim=2] binned_columns_encoder( + np.ndarray[object, ndim=2] X, + np.ndarray[np.int64_t, ndim=1] idx_columns): + cdef np.int64_t i + cdef np.int64_t j + cdef np.int64_t n_rows = X.shape[0] + cdef np.int64_t n_cols = idx_columns.shape[0] + cdef np.ndarray X_new = np.empty( + (n_rows, n_cols), dtype=object) + for i in range(n_rows): + for j in range(n_cols): + X_new[i, j] = float(X[i, idx_columns[j]][1:]) + return np.concatenate((X, X_new), axis=1).astype(object) + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim=2] binned_columns_encoder_inplace( + np.ndarray[object, ndim=2] X, + np.ndarray[np.int64_t, ndim=1] idx_columns): + cdef np.int64_t i + cdef np.int64_t j + cdef np.int64_t n_rows = X.shape[0] + cdef np.int64_t n_cols = idx_columns.shape[0] + for i in range(n_rows): + for j in range(n_cols): + X[i, idx_columns[j]] = float(X[i, idx_columns[j]][1:]) + return X.astype(object) diff --git a/gators/encoders/multiclass_encoder.py b/gators/encoders/multiclass_encoder.py deleted file mode 100644 index ae08cdb6..00000000 --- a/gators/encoders/multiclass_encoder.py +++ /dev/null @@ -1,243 +0,0 @@ -# License: Apache-2.0 -import copy -import warnings -from typing import Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..data_cleaning.drop_columns import DropColumns -from ..transformers.transformer import Transformer -from ..util import util -from ._base_encoder import _BaseEncoder - - -class MultiClassEncoder(_BaseEncoder): - """Encode the categorical columns with a binary encoder passed by the user. - *N* categorical columns are mapped into *N * (n - 1)* numerical columns - where *n* is the number of classes. - - Parameters - ---------- - encoder : Transformer - Binary Encoder. - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.encoders import MultiClassEncoder - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0, 0, 1, 2, 1, 2], name='TARGET') - >>> obj = MultiClassEncoder(WOEEncoder()) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - """ - - def __init__(self, encoder: Transformer, dtype: type = np.float64): - if not isinstance(encoder, Transformer): - raise TypeError("`encoder` should be a transformer.") - _BaseEncoder.__init__(self, dtype=dtype) - self.encoder = encoder - self.drop_columns = None - self.label_names = [] - self.encoder_dict = {} - self.columns = [] - self.idx_columns = np.ndarray([]) - self.column_names = [] - self.column_mapping = {} - self.name = type(encoder).__name__ - - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> "MultiClassEncoder": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - MultiClassEncoder - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_multiclass_target(y) - self.columns = util.get_datatype_columns(X, object) - self.check_nans(X, self.columns) - self.drop_columns = DropColumns(self.columns).fit(X) - if not self.columns: - warnings.warn( - f"""`X` does not contain object columns: - `{self.__class__.__name__}` is not needed""" - ) - return self - self.idx_columns = util.get_idx_columns( - columns=X.columns, - selected_columns=self.columns, - ) - y_name = y.name - if isinstance(X, pd.DataFrame): - y_one_hot = pd.get_dummies(y, prefix=y_name) - else: - y_one_hot = ks.get_dummies(y, prefix=y_name) - y_one_hot = y_one_hot.drop(y_one_hot.columns[0], axis=1) - self.label_names = y_one_hot.columns - for label_name in self.label_names: - self.encoder_dict[label_name] = copy.copy(self.encoder) - self.encoder_dict[label_name].fit(X[self.columns], y_one_hot[label_name]) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if not self.columns: - self.idx_columns = np.array([]) - return X - for i, label_name in enumerate(self.label_names): - dummy = self.encoder_dict[label_name].transform(X[self.columns].copy())[ - self.encoder_dict[label_name].columns - ] - column_names = [f"{col}__{label_name}_{self.name}" for col in dummy.columns] - dummy.columns = column_names - self.column_names.extend(column_names) - for name, col in zip(column_names, self.columns): - self.column_mapping[name] = col - X = X.join(dummy, how="inner").sort_index() - return self.drop_columns.transform(X).astype(self.dtype) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - if not self.columns: - return X - X_encoded_list = [] - for i, label_name in enumerate(self.label_names): - dummy = self.encoder_dict[label_name].transform_numpy( - X[:, self.idx_columns].copy() - ) - X_encoded_list.append(dummy) - X_new = np.concatenate( - [self.drop_columns.transform_numpy(X)] + X_encoded_list, axis=1 - ) - return X_new.astype(self.dtype) diff --git a/gators/encoders/onehot_encoder.py b/gators/encoders/onehot_encoder.py index 61fc244c..9a526922 100644 --- a/gators/encoders/onehot_encoder.py +++ b/gators/encoders/onehot_encoder.py @@ -1,16 +1,15 @@ # License: Apache-2.0 import warnings -from typing import Union -import databricks.koalas as ks import numpy as np -import pandas as pd from encoder import onehot_encoder from ..util import util -from . import OrdinalEncoder from ._base_encoder import _BaseEncoder +from .ordinal_encoder import OrdinalEncoder + +from gators import DataFrame, Series class OneHotEncoder(_BaseEncoder): @@ -18,175 +17,148 @@ class OneHotEncoder(_BaseEncoder): Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. + drop_first : bool, default to True. + Whether to one-hot encode all the categories or all except one. + + inplace : bool, default to True. + If True, replace in-place the categorical values by numerical ones. + If False, keep the categorical columns and create new encoded columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.encoders import OneHotEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) >>> obj = OneHotEncoder() - >>> obj.fit_transform(X) - A__b A__a B__d B__c - 0 0.0 1.0 0.0 1.0 - 1 0.0 1.0 1.0 0.0 - 2 1.0 0.0 1.0 0.0 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.encoders import OneHotEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> obj.fit_transform(X) - A__b A__a B__d B__c - 0 0.0 1.0 0.0 1.0 - 1 0.0 1.0 1.0 0.0 - 2 1.0 0.0 1.0 0.0 + * `dask` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.encoders import OneHotEncoder >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0., 1., 0., 1.], - [0., 1., 1., 0.], - [1., 0., 1., 0.]]) - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A__a A__b B__c B__d + 0 1.0 0.0 1.0 0.0 + 1 1.0 0.0 0.0 1.0 + 2 0.0 1.0 0.0 1.0 + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. - >>> import databricks.koalas as ks - >>> from gators.encoders import OneHotEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OneHotEncoder() - >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[0., 1., 0., 1.], - [0., 1., 1., 0.], - [1., 0., 1., 0.]]) + array([[1., 0., 1., 0.], + [1., 0., 0., 1.], + [0., 1., 0., 1.]]) """ - def __init__(self, dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) - self.ordinal_encoder = OrdinalEncoder(dtype=dtype, add_other_columns=False) + def __init__(self, drop_first=False, inplace=True): + _BaseEncoder.__init__(self, columns=None, inplace=inplace) + self.drop_first = drop_first + self.ordinal_encoder = OrdinalEncoder( + columns=None, + ) self.idx_numerical_columns = np.array([]) - self.onehot_columns = [] + self.column_names = [] self.numerical_columns = [] - self.column_mapping = {} - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "OneHotEncoder": + def fit(self, X: DataFrame, y: Series = None) -> "OneHotEncoder": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- OneHotEncoder: Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.columns = util.get_datatype_columns(X, object) + columns = list(X.columns) if not self.columns: - warnings.warn( - f"""`X` does not contain object columns: - `{self.__class__.__name__}` is not needed""" - ) return self - self.check_nans(X, self.columns) - self.numerical_columns = util.exclude_columns(X.columns, self.columns) - _ = self.ordinal_encoder.fit(X) - self.onehot_columns = [] - for key, val in self.ordinal_encoder.mapping.items(): - self.onehot_columns.extend( - [f"{key}__{self.dtype(c)}" for c in sorted(val.values(), key=int)] + self.column_names = list( + util.get_function(X).get_dummies( + X[self.columns], + self.columns, + prefix_sep="__", + drop_first=self.drop_first, ) - for key, val in self.ordinal_encoder.mapping.items(): - for k, v in val.items(): - self.column_mapping[f"{key}__{self.dtype(v)}"] = f"{key}__{k}" - self.all_columns = self.numerical_columns + self.onehot_columns - self.idx_numerical_columns = util.get_idx_columns( - X.columns, self.numerical_columns - ) - self.idx_columns = np.arange( - len(self.numerical_columns), - len(self.numerical_columns) + len(self.onehot_columns), - dtype=int, - ) - self.idx_columns = np.arange( - len(self.numerical_columns), len(self.onehot_columns), dtype=int ) - self.n_categories_vec = np.empty(len(self.ordinal_encoder.columns), int) - for i, c in enumerate(self.columns): - self.n_categories_vec[i] = len(self.ordinal_encoder.mapping[c]) - - self.columns_flatten = np.array( - [ - col - for col, mapping in self.ordinal_encoder.mapping.items() - for v in range(len(mapping)) - ] - ) - self.idx_columns = util.get_idx_columns(X, self.columns_flatten) + self.column_names = sorted(self.column_names) + object_columns = ["__".join(col.split("__")[:-1]) for col in self.column_names] + self.idx_columns = util.get_idx_columns(X, object_columns) self.idx_columns_to_keep = [ i - for i in range(X.shape[1] + self.idx_columns.shape[0]) - if i not in util.get_idx_columns(X, self.columns) + for i, col in enumerate(columns + self.column_names) + if col not in self.columns ] - self.cats = np.array( - [ - v - for col, mapping in self.ordinal_encoder.mapping.items() - for v in dict(sorted(mapping.items(), key=lambda item: item[1])).keys() - ] - ).astype(object) + + self.cats = np.array([col.split("__")[-1] for col in self.column_names]).astype( + object + ) return self - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) if not self.columns: return X - dummy = X[self.columns].copy() - X_new = self.ordinal_encoder.transform(X) - X[self.columns] = dummy - if isinstance(X, pd.DataFrame): - X_new = pd.get_dummies(X_new, prefix_sep="__", columns=self.columns) - else: - X_new = ks.get_dummies(X_new, prefix_sep="__", columns=self.columns) - X_new = X_new.reindex(columns=self.all_columns, fill_value=0.0) - return X_new.rename(columns=self.column_mapping).astype(self.dtype) + + new_series_list = [] + for name in self.column_names: + dummy_names = name.split("__") + col = "__".join(dummy_names[:-1]) + cat = dummy_names[-1] + dummy = (X[col] == cat).astype(float) + new_series_list.append(dummy.rename(name)) + + if self.inplace: + return util.get_function(X).concat( + [ + X.drop(self.columns, axis=1), + util.get_function(X).concat(new_series_list, axis=1), + ], + axis=1, + ) + return util.get_function(X).concat( + [X, util.get_function(X).concat(new_series_list, axis=1)], axis=1 + ) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the input array. + """Transform the array `X`. Parameters ---------- @@ -195,11 +167,15 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: Encoded array. + X : np.ndarray + Encoded array. """ self.check_array(X) - if len(self.idx_columns) == 0: + if self.idx_columns.size == 0: return X - return onehot_encoder(X, self.idx_columns, self.cats)[ + X_encoded = onehot_encoder(X.copy(), self.idx_columns, self.cats)[ :, self.idx_columns_to_keep - ].astype(self.dtype) + ] + if self.inplace: + return X_encoded.astype(float) + return np.concatenate((X, X_encoded[:, -len(self.column_names) :]), axis=1) diff --git a/gators/encoders/ordinal_encoder.py b/gators/encoders/ordinal_encoder.py index 0155e987..59a4e4f1 100644 --- a/gators/encoders/ordinal_encoder.py +++ b/gators/encoders/ordinal_encoder.py @@ -1,159 +1,106 @@ # License: Apache-2.0 import warnings -from typing import Dict, List, Union +from typing import Dict -import databricks.koalas as ks import numpy as np -import pandas as pd from ..util import util from ._base_encoder import _BaseEncoder +from gators import DataFrame, Series + class OrdinalEncoder(_BaseEncoder): """Encode the categorical columns as integer columns. Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. - add_other_columns: bool, default to True. - If True, add the columns 'OTHERS' and 'MISSING' - to the mapping even if the categories are not - present in the data. + inplace : bool, default to True. + If True, replace in-place the categorical values by numerical ones. + If False, keep the categorical columns and create new encoded columns. + Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.encoders import OrdinalEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) >>> obj = OrdinalEncoder() - >>> obj.fit_transform(X) - A B - 0 1.0 1.0 - 1 1.0 0.0 - 2 0.0 0.0 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.encoders import OrdinalEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> obj.fit_transform(X) - A B - 0 1.0 1.0 - 1 1.0 0.0 - 2 0.0 0.0 + * `dask` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.encoders import OrdinalEncoder >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [1., 0.], - [0., 0.]]) - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.encoders import OrdinalEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> obj = OrdinalEncoder() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1., 1.], - [1., 0.], - [0., 0.]]) - """ - - def __init__(self, dtype: type = np.float64, add_other_columns: bool = True): - _BaseEncoder.__init__(self, dtype=dtype) - if not isinstance(add_other_columns, bool): - raise TypeError("`add_other_columns` shouldbe a bool.") - self.add_other_columns = add_other_columns + >>> obj.fit_transform(X) + A B + 0 1.0 0.0 + 1 1.0 1.0 + 2 0.0 1.0 - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "OrdinalEncoder": - """Fit the transformer on the dataframe `X`. + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + >>> obj.transform_numpy(X.to_numpy()) + array([[1., 0.], + [1., 1.], + [0., 1.]]) + """ - Returns - ------- - OrdinalEncoder: Instance of itself. - """ - self.check_dataframe(X) - self.columns = util.get_datatype_columns(X, object) - self.check_nans(X, self.columns) - if not self.columns: - warnings.warn( - f"""`X` does not contain object columns: - `{self.__class__.__name__}` is not needed""" - ) - return self - self.mapping = self.generate_mapping(X, self.columns, self.add_other_columns) - self.num_categories_vec = np.array([len(m) for m in self.mapping.values()]) - columns, self.values_vec, self.encoded_values_vec = self.decompose_mapping( - mapping=self.mapping, - ) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=columns - ) - return self + def __init__(self, columns=None, inplace=True): + _BaseEncoder.__init__(self, columns=None, inplace=inplace) + self.suffix = "ordinal" - @staticmethod def generate_mapping( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - add_other_columns: bool, + self, X: DataFrame, y: Series = None ) -> Dict[str, Dict[str, float]]: """Generate the mapping to perform the encoding. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - self.columns : List[str] - List of columns. - add_other_columns: bool - If True, add the columns 'OTHERS' and 'MISSING' - to the mapping even if the categories are not - present in the data. Returns ------- Dict[str, Dict[str, float]] Mapping. """ - mapping = {} - for c in columns: - categories = X[c].value_counts().to_dict() - n_categories = len(categories) - category_names = list(categories.keys()) - category_names = sorted(category_names) - category_mapping = dict( - zip(category_names, np.arange(n_categories - 1, -1, -1).astype(str)) + values = np.arange(len(X), dtype=float) + print( + [ + util.get_function(X).to_pandas(X[c].value_counts()).keys() + for c in X.columns + ] + ) + return { + c: ( + dict( + zip( + util.get_function(X) + .to_pandas(X[c].value_counts()) + .sort_values(ascending=False) + .index.to_list(), + values, + ) + ) ) - if add_other_columns and "MISSING" not in category_mapping: - category_mapping["MISSING"] = str(len(category_mapping)) - if add_other_columns and "OTHERS" not in category_mapping: - category_mapping["OTHERS"] = str(len(category_mapping)) - mapping[c] = category_mapping - - return mapping + for c in X.columns + } diff --git a/gators/encoders/regression_encoder.py b/gators/encoders/regression_encoder.py deleted file mode 100644 index bb38b894..00000000 --- a/gators/encoders/regression_encoder.py +++ /dev/null @@ -1,207 +0,0 @@ -# License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from ..transformers import Transformer -from ._base_encoder import _BaseEncoder -from .multiclass_encoder import MultiClassEncoder - - -class RegressionEncoder(_BaseEncoder): - """Encode the categorical columns with a binary encoder given by the user. - - The encoding is composed in 2 steps: - - * bin the target values using the discretizer passed as argument. - * apply the `MultiClassEncoder` on the discretized target values. - - Parameters - ---------- - encoder : Transformer. - Encoder. - discretizer: Transformer. - Discretizer. - dtype : type, default to np.float64. - Numerical datatype of the output data. - - Examples - -------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> obj.fit_transform(X, y) - D A__TARGET_1_WOEEncoder B__TARGET_1_WOEEncoder C__TARGET_1_WOEEncoder A__TARGET_2_WOEEncoder B__TARGET_2_WOEEncoder C__TARGET_2_WOEEncoder - 0 1.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 1 2.0 0.0 0.000000 -0.405465 0.000000 0.000000 -0.405465 - 2 3.0 0.0 0.693147 -0.405465 0.000000 0.693147 -0.405465 - 3 4.0 0.0 0.693147 -0.405465 1.386294 0.693147 -0.405465 - 4 5.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - 5 6.0 0.0 0.693147 0.693147 1.386294 0.693147 0.693147 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = pd.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.binning import QuantileDiscretizer - >>> from gators.encoders import WOEEncoder - >>> from gators.encoders import RegressionEncoder - >>> X = ks.DataFrame({ - ... 'A': ['Q', 'Q', 'Q', 'W', 'W', 'W'], - ... 'B': ['Q', 'Q', 'W', 'W', 'W', 'W'], - ... 'C': ['Q', 'Q', 'Q', 'Q', 'W', 'W'], - ... 'D': [1, 2, 3, 4, 5, 6]}) - >>> y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name='TARGET') - >>> obj = RegressionEncoder( - ... encoder=WOEEncoder(), - ... discretizer=QuantileDiscretizer(n_bins=3, inplace=True)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 1. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 2. , 0. , 0. , -0.40546511, 0. , - 0. , -0.40546511], - [ 3. , 0. , 0.69314718, -0.40546511, 0. , - 0.69314718, -0.40546511], - [ 4. , 0. , 0.69314718, -0.40546511, 1.38629436, - 0.69314718, -0.40546511], - [ 5. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718], - [ 6. , 0. , 0.69314718, 0.69314718, 1.38629436, - 0.69314718, 0.69314718]]) - """ - - def __init__( - self, encoder: Transformer, discretizer: Transformer, dtype: type = np.float64 - ): - _BaseEncoder.__init__(self, dtype=dtype) - if not isinstance(discretizer, Transformer): - raise TypeError("`discretizer` should inherit from _BaseDiscretizer.") - if not isinstance(encoder, Transformer): - raise TypeError("`encoder` should be a transformer.") - - self.discretizer = discretizer - self.multiclass_encoder = MultiClassEncoder(encoder=encoder, dtype=dtype) - - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> "RegressionEncoder": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - RegressionEncoder - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_regression_target(y) - y_binned = self.discretizer.fit_transform(y.to_frame()) - self.multiclass_encoder.fit(X, y_binned[y.name].astype(float).astype(int)) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - return self.multiclass_encoder.transform(X) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - return self.multiclass_encoder.transform_numpy(X) diff --git a/gators/encoders/target_encoder.py b/gators/encoders/target_encoder.py index 4903d8bf..26ecfb2e 100644 --- a/gators/encoders/target_encoder.py +++ b/gators/encoders/target_encoder.py @@ -1,169 +1,97 @@ # License: Apache-2. import warnings -from typing import Dict, List, Union +from typing import Dict -import databricks.koalas as ks import numpy as np -import pandas as pd from ..util import util from ._base_encoder import _BaseEncoder - -def clean_mapping( - mapping: Dict[str, Dict[str, List[float]]] -) -> Dict[str, Dict[str, List[float]]]: - mapping = { - col: {k: v for k, v in mapping[col].items() if v == v} for col in mapping.keys() - } - for m in mapping.values(): - if "OTHERS" not in m: - m["OTHERS"] = 0.0 - if "MISSING" not in m: - m["MISSING"] = 0.0 - return mapping +from gators import DataFrame, Series class TargetEncoder(_BaseEncoder): - """Encode the categorical variable using the target encoding technique. + """Encode the categorical variables using the target encoding technique. Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. + inplace : bool, default to True. + If True, replace in-place the categorical values by numerical ones. + If False, keep the categorical columns and create new encoded columns. + Examples -------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.encoders import TargetEncoder + >>> obj = TargetEncoder() + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([1, 1, 0], name='TARGET'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) + >>> y = ps.Series([1, 1, 0], name='TARGET') + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> obj.fit_transform(X, y) - A B - 0 1.0 1.0 - 1 1.0 0.5 - 2 0.0 0.5 - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.encoders import TargetEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() >>> obj.fit_transform(X, y) A B 0 1.0 1.0 1 1.0 0.5 2 0.0 0.5 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.encoders import TargetEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. ], - [1. , 0.5], - [0. , 0.5]]) - - * fit with `koalas` & transform with `NumPy` + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. - >>> import databricks.koalas as ks - >>> from gators.encoders import TargetEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = TargetEncoder() - >>> _ = obj.fit(X, y) >>> obj.transform_numpy(X.to_numpy()) array([[1. , 1. ], [1. , 0.5], [0. , 0.5]]) """ - def __init__(self, dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) - - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> "TargetEncoder": - """Fit the encoder. + def __init__(self, columns=None, inplace=True): + _BaseEncoder.__init__(self, columns=None, inplace=inplace) + self.suffix = "target" - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]: - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - TargetEncoder: - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_binary_target(y) - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - f"""`X` does not contain object columns: - `{self.__class__.__name__}` is not needed""" - ) - return self - self.check_nans(X, self.columns) - self.mapping = self.generate_mapping(X[self.columns], y) - self.num_categories_vec = np.array([len(m) for m in self.mapping.values()]) - columns, self.values_vec, self.encoded_values_vec = self.decompose_mapping( - mapping=self.mapping - ) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=columns - ) - return self - - @staticmethod - def generate_mapping( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Dict[str, Dict[str, float]]: + def generate_mapping(self, X: DataFrame, y: Series) -> Dict[str, Dict[str, float]]: """Generate the mapping to perform the encoding. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series]: - Labels. + y : Series: + Target values. Returns ------- Dict[str, Dict[str, float]] Mapping. """ - y_name = y.name - if isinstance(X, pd.DataFrame): - - def f(x) -> ks.Series[np.float64]: - return pd.DataFrame(x).join(y).groupby(x.name).mean()[y_name] - - mapping = X.apply(f).to_dict() - return clean_mapping(mapping) - - mapping_list = [] - for name in X.columns: - dummy = ( - ks.DataFrame(X[name]).join(y).groupby(name).mean()[y_name].to_pandas() - ) - dummy.name = name - mapping_list.append(dummy) - - mapping = pd.concat(mapping_list, axis=1).to_dict() - return clean_mapping(mapping) + columns = X.columns + means = ( + util.get_function(X) + .melt(util.get_function(X).join(X, y.to_frame()), id_vars=y.name) + .groupby(["variable", "value"]) + .mean()[y.name] + ) + means = util.get_function(X).to_pandas(means) + return {c: means[c].to_dict() for c in columns} diff --git a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-36-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-36-pytest-6.2.5.pyc index f36a774a..4ec93ba9 100644 Binary files a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-36-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-36-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-37-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-37-pytest-6.2.5.pyc index 8565c542..f482c2a5 100644 Binary files a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-37-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-37-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-38-pytest-6.2.5.pyc index ed5b6277..f6eda1b9 100644 Binary files a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-39-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-39-pytest-6.2.5.pyc index d36b180d..2d96853a 100644 Binary files a/gators/encoders/tests/__pycache__/test_base_encoder.cpython-39-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_base_encoder.cpython-39-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_muticlass_encoder_dd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_muticlass_encoder_dd.cpython-38-pytest-6.2.5.pyc index de8185f5..b6a75bb0 100644 Binary files a/gators/encoders/tests/__pycache__/test_muticlass_encoder_dd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_muticlass_encoder_dd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_muticlass_encoder_ks.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_muticlass_encoder_ks.cpython-38-pytest-6.2.5.pyc index 00292b33..eeb81da4 100644 Binary files a/gators/encoders/tests/__pycache__/test_muticlass_encoder_ks.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_muticlass_encoder_ks.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_muticlass_encoder_pd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_muticlass_encoder_pd.cpython-38-pytest-6.2.5.pyc index 6b3e806c..eb3cea70 100644 Binary files a/gators/encoders/tests/__pycache__/test_muticlass_encoder_pd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_muticlass_encoder_pd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_onehot_encoder_dd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_onehot_encoder_dd.cpython-38-pytest-6.2.5.pyc index a7a865cf..532759be 100644 Binary files a/gators/encoders/tests/__pycache__/test_onehot_encoder_dd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_onehot_encoder_dd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_onehot_encoder_ks.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_onehot_encoder_ks.cpython-38-pytest-6.2.5.pyc index 33c6fc19..e15b4389 100644 Binary files a/gators/encoders/tests/__pycache__/test_onehot_encoder_ks.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_onehot_encoder_ks.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_onehot_encoder_pd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_onehot_encoder_pd.cpython-38-pytest-6.2.5.pyc index 7d85eb0b..2018a665 100644 Binary files a/gators/encoders/tests/__pycache__/test_onehot_encoder_pd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_onehot_encoder_pd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_ordinal_encoder_dd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_ordinal_encoder_dd.cpython-38-pytest-6.2.5.pyc index 515139b4..22798f24 100644 Binary files a/gators/encoders/tests/__pycache__/test_ordinal_encoder_dd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_ordinal_encoder_dd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_ordinal_encoder_ks.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_ordinal_encoder_ks.cpython-38-pytest-6.2.5.pyc index e35f8d83..0515c925 100644 Binary files a/gators/encoders/tests/__pycache__/test_ordinal_encoder_ks.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_ordinal_encoder_ks.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_ordinal_encoder_pd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_ordinal_encoder_pd.cpython-38-pytest-6.2.5.pyc index 2cf72181..143bbe29 100644 Binary files a/gators/encoders/tests/__pycache__/test_ordinal_encoder_pd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_ordinal_encoder_pd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_target_encoder_dd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_target_encoder_dd.cpython-38-pytest-6.2.5.pyc index 5321aa51..acb19b1f 100644 Binary files a/gators/encoders/tests/__pycache__/test_target_encoder_dd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_target_encoder_dd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_target_encoder_ks.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_target_encoder_ks.cpython-38-pytest-6.2.5.pyc index f8ae1c6e..14461bbf 100644 Binary files a/gators/encoders/tests/__pycache__/test_target_encoder_ks.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_target_encoder_ks.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_target_encoder_pd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_target_encoder_pd.cpython-38-pytest-6.2.5.pyc index b3a31eec..f165bc6d 100644 Binary files a/gators/encoders/tests/__pycache__/test_target_encoder_pd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_target_encoder_pd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_woe_encoder_dd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_woe_encoder_dd.cpython-38-pytest-6.2.5.pyc index 4376a28d..b0595d02 100644 Binary files a/gators/encoders/tests/__pycache__/test_woe_encoder_dd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_woe_encoder_dd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_woe_encoder_ks.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_woe_encoder_ks.cpython-38-pytest-6.2.5.pyc index 3941ebbe..a574718c 100644 Binary files a/gators/encoders/tests/__pycache__/test_woe_encoder_ks.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_woe_encoder_ks.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/__pycache__/test_woe_encoder_pd.cpython-38-pytest-6.2.5.pyc b/gators/encoders/tests/__pycache__/test_woe_encoder_pd.cpython-38-pytest-6.2.5.pyc index 1d531a9d..9506cc4e 100644 Binary files a/gators/encoders/tests/__pycache__/test_woe_encoder_pd.cpython-38-pytest-6.2.5.pyc and b/gators/encoders/tests/__pycache__/test_woe_encoder_pd.cpython-38-pytest-6.2.5.pyc differ diff --git a/gators/encoders/tests/test_count_encoder_pd.py b/gators/encoders/tests/test_count_encoder_pd.py new file mode 100644 index 00000000..583fa26d --- /dev/null +++ b/gators/encoders/tests/test_count_encoder_pd.py @@ -0,0 +1,114 @@ +# License: Apache-2 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders import CountEncoder + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [2.0, 2.0, 1.0], + "B": [1.0, 2.0, 2.0], + "C": [2.0, 1.0, 2.0], + "D": [1.0, 2.0, 3.0], + } + ) + obj = CountEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = pd.DataFrame( + np.zeros((3, 3)), + columns=list("ABC"), + ) + obj = CountEncoder().fit(X) + return obj, X, X.copy() + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + "A__count": [2.0, 2.0, 1.0], + "B__count": [1.0, 2.0, 2.0], + "C__count": [2.0, 1.0, 2.0], + } + ) + X_expected_numpy = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + "A__count": [2.0, 2.0, 1.0], + "B__count": [1.0, 2.0, 2.0], + "C__count": [2.0, 1.0, 2.0], + } + ).astype(object) + obj = CountEncoder(inplace=False).fit(X) + return obj, X, X_expected, X_expected_numpy + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(float)) + + +def test_no_cat_pd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected, _ = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, _, X_expected_numpy = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected_numpy.columns) + assert_frame_equal(X_new, X_expected_numpy) diff --git a/gators/encoders/tests/test_muticlass_encoder.py b/gators/encoders/tests/test_muticlass_encoder.py deleted file mode 100644 index c701452e..00000000 --- a/gators/encoders/tests/test_muticlass_encoder.py +++ /dev/null @@ -1,373 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.encoders import MultiClassEncoder, WOEEncoder - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0, 0, 1, 2, 1, 2], name="TARGET") - obj = MultiClassEncoder(WOEEncoder()).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0, 0, 1, 2, 1, 2], name="TARGET") - obj = MultiClassEncoder(WOEEncoder(), dtype=np.float32).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((3, 6)), - columns=list("qweasd"), - ) - y = pd.Series([1, 2, 0], name="TARGET") - obj = MultiClassEncoder(WOEEncoder()).fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0, 0, 1, 2, 1, 2], name="TARGET") - obj = MultiClassEncoder(WOEEncoder()).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0, 0, 1, 2, 1, 2], name="TARGET") - obj = MultiClassEncoder(WOEEncoder(), dtype=np.float32).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((3, 6)), - columns=list("qweasd"), - ) - y = ks.Series([1, 2, 0], name="TARGET") - obj = MultiClassEncoder(WOEEncoder()).fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_without_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_without_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = MultiClassEncoder(encoder="q") - with pytest.raises(TypeError): - _ = MultiClassEncoder(encoder="q") diff --git a/gators/encoders/tests/test_onehot_encoder.py b/gators/encoders/tests/test_onehot_encoder.py deleted file mode 100644 index 2e570bf2..00000000 --- a/gators/encoders/tests/test_onehot_encoder.py +++ /dev/null @@ -1,222 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.encoders.onehot_encoder import OneHotEncoder - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0}, - "A__W": {0: 0.0, 1: 0.0, 2: 1.0}, - "A__Q": {0: 1.0, 1: 1.0, 2: 0.0}, - "B__W": {0: 0.0, 1: 1.0, 2: 1.0}, - "B__Q": {0: 1.0, 1: 0.0, 2: 0.0}, - "C__W": {0: 1.0, 1: 0.0, 2: 1.0}, - "C__Q": {0: 0.0, 1: 1.0, 2: 0.0}, - } - ) - obj = OneHotEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "D": {0: 1, 1: 2, 2: 3}, - "A__W": {0: 0, 1: 0, 2: 1}, - "A__Q": {0: 1, 1: 1, 2: 0}, - "B__W": {0: 0, 1: 1, 2: 1}, - "B__Q": {0: 1, 1: 0, 2: 0}, - "C__W": {0: 1, 1: 0, 2: 1}, - "C__Q": {0: 0, 1: 1, 2: 0}, - } - ).astype(np.int16) - obj = OneHotEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.arange(12).reshape(3, 4), - columns=list("ABCD"), - dtype=float, - ) - obj = OneHotEncoder().fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0}, - "A__W": {0: 0.0, 1: 0.0, 2: 1.0}, - "A__Q": {0: 1.0, 1: 1.0, 2: 0.0}, - "B__W": {0: 0.0, 1: 1.0, 2: 1.0}, - "B__Q": {0: 1.0, 1: 0.0, 2: 0.0}, - "C__W": {0: 1.0, 1: 0.0, 2: 1.0}, - "C__Q": {0: 0.0, 1: 1.0, 2: 0.0}, - } - ) - obj = OneHotEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "D": {0: 1, 1: 2, 2: 3}, - "A__W": {0: 0, 1: 0, 2: 1}, - "A__Q": {0: 1, 1: 1, 2: 0}, - "B__W": {0: 0, 1: 1, 2: 1}, - "B__Q": {0: 1, 1: 0, 2: 0}, - "C__W": {0: 1, 1: 0, 2: 1}, - "C__Q": {0: 0, 1: 1, 2: 0}, - } - ).astype(np.int16) - obj = OneHotEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.arange(12).reshape(3, 4), - columns=list("ABCD"), - dtype=float, - ) - obj = OneHotEncoder().fit(X) - return obj, X, X.copy().to_pandas() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_without_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_without_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_onehot_encoder_dd.py b/gators/encoders/tests/test_onehot_encoder_dd.py new file mode 100644 index 00000000..4f3e8020 --- /dev/null +++ b/gators/encoders/tests/test_onehot_encoder_dd.py @@ -0,0 +1,78 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.onehot_encoder import OneHotEncoder + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ), + npartitions=2, + ) + X_expected = pd.DataFrame( + { + "D": [1.0, 2.0, 3.0], + "A__Q": [1.0, 1.0, 0.0], + "A__W": [0.0, 0.0, 1.0], + "B__Q": [1.0, 0.0, 0.0], + "B__W": [0.0, 1.0, 1.0], + "C__Q": [0.0, 1.0, 0.0], + "C__W": [1.0, 0.0, 1.0], + } + ) + obj = OneHotEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = X = dd.from_pandas( + pd.DataFrame( + np.arange(12).reshape(3, 4), + columns=list("ABCD"), + dtype=float, + ), + npartitions=2, + ) + obj = OneHotEncoder().fit(X) + return obj, X, X.compute().copy() + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_without_cat_dd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_without_cat_dd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_onehot_encoder_ks.py b/gators/encoders/tests/test_onehot_encoder_ks.py new file mode 100644 index 00000000..a37ca47f --- /dev/null +++ b/gators/encoders/tests/test_onehot_encoder_ks.py @@ -0,0 +1,76 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.onehot_encoder import OneHotEncoder + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "D": [1.0, 2.0, 3.0], + "A__Q": [1.0, 1.0, 0.0], + "A__W": [0.0, 0.0, 1.0], + "B__Q": [1.0, 0.0, 0.0], + "B__W": [0.0, 1.0, 1.0], + "C__Q": [0.0, 1.0, 0.0], + "C__W": [1.0, 0.0, 1.0], + } + ) + obj = OneHotEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat_ks(): + X = ps.DataFrame( + np.arange(12).reshape(3, 4), + columns=list("ABCD"), + dtype=float, + ) + obj = OneHotEncoder().fit(X) + return obj, X, X.copy().to_pandas() + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_without_cat_ks(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_without_cat_ks_np(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_onehot_encoder_pd.py b/gators/encoders/tests/test_onehot_encoder_pd.py new file mode 100644 index 00000000..e1ef22de --- /dev/null +++ b/gators/encoders/tests/test_onehot_encoder_pd.py @@ -0,0 +1,110 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.onehot_encoder import OneHotEncoder + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "D": [1.0, 2.0, 3.0], + "A__Q": [1.0, 1.0, 0.0], + "A__W": [0.0, 0.0, 1.0], + "B__Q": [1.0, 0.0, 0.0], + "B__W": [0.0, 1.0, 1.0], + "C__Q": [0.0, 1.0, 0.0], + "C__W": [1.0, 0.0, 1.0], + } + ) + obj = OneHotEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = pd.DataFrame( + np.arange(12).reshape(3, 4), + columns=list("ABCD"), + dtype=float, + ) + obj = OneHotEncoder().fit(X) + return obj, X, X.copy() + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + "A__Q": [1.0, 1.0, 0.0], + "A__W": [0.0, 0.0, 1.0], + "B__Q": [1.0, 0.0, 0.0], + "B__W": [0.0, 1.0, 1.0], + "C__Q": [0.0, 1.0, 0.0], + "C__W": [1.0, 0.0, 1.0], + } + ) + obj = OneHotEncoder(inplace=False).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_without_cat_pd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_without_cat_pd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/encoders/tests/test_ordinal_encoder.py b/gators/encoders/tests/test_ordinal_encoder.py deleted file mode 100644 index f67500f3..00000000 --- a/gators/encoders/tests/test_ordinal_encoder.py +++ /dev/null @@ -1,212 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.encoders import OrdinalEncoder - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 1.0, 2.0], [0.0, 0.0, 0.0, 3.0]], - columns=list("ABCD"), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 1.0, 2.0], [0.0, 0.0, 0.0, 3.0]], - columns=list("ABCD"), - ).astype(np.int16) - obj = OrdinalEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((3, 3)), - columns=list("ABC"), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 1.0, 2.0], [0.0, 0.0, 0.0, 3.0]], - columns=list("ABCD"), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - [[1.0, 1.0, 0.0, 1.0], [1.0, 0.0, 1.0, 2.0], [0.0, 0.0, 0.0, 3.0]], - columns=list("ABCD"), - ).astype(np.int16) - obj = OrdinalEncoder(dtype=np.int16).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((3, 3)), - columns=list("ABC"), - ) - obj = OrdinalEncoder().fit(X) - return obj, X, X.copy().to_pandas() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.fixture -def test_check_nans(): - X = pd.DataFrame( - { - "A": [None, "Q", "W"], - "B": ["Q", "W", "W"], - "C": ["W", "Q", "W"], - "D": [1, 2, 3], - } - ) - - with pytest.raises(ValueError): - _ = OrdinalEncoder().fit(X) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalEncoder(add_other_columns="yes") diff --git a/gators/encoders/tests/test_ordinal_encoder_dd.py b/gators/encoders/tests/test_ordinal_encoder_dd.py new file mode 100644 index 00000000..98a6ede7 --- /dev/null +++ b/gators/encoders/tests/test_ordinal_encoder_dd.py @@ -0,0 +1,76 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders import OrdinalEncoder + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ), + npartitions=2, + ) + + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 1.0], + "B": [1.0, 0.0, 0.0], + "C": [0.0, 1.0, 0.0], + "D": [1.0, 2.0, 3.0], + } + ) + obj = OrdinalEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = dd.from_pandas( + pd.DataFrame( + np.zeros((3, 3)), + columns=list("ABC"), + ), + npartitions=2, + ) + obj = OrdinalEncoder().fit(X) + return obj, X, X.compute().copy() + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute().astype(float) + print(obj.mapping) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_dd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_dd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_ordinal_encoder_ks.py b/gators/encoders/tests/test_ordinal_encoder_ks.py new file mode 100644 index 00000000..f3ee2448 --- /dev/null +++ b/gators/encoders/tests/test_ordinal_encoder_ks.py @@ -0,0 +1,72 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders import OrdinalEncoder + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 1.0], + "B": [1.0, 0.0, 0.0], + "C": [0.0, 1.0, 0.0], + "D": [1.0, 2.0, 3.0], + } + ) + obj = OrdinalEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat_ks(): + X = ps.DataFrame( + np.zeros((3, 3)), + columns=list("ABC"), + ) + obj = OrdinalEncoder().fit(X) + return obj, X, X.copy().to_pandas() + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_no_cat_ks(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_cat_ks_np(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_ordinal_encoder_pd.py b/gators/encoders/tests/test_ordinal_encoder_pd.py new file mode 100644 index 00000000..c5ad6d6a --- /dev/null +++ b/gators/encoders/tests/test_ordinal_encoder_pd.py @@ -0,0 +1,122 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders import OrdinalEncoder + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 1.0], + "B": [1.0, 0.0, 0.0], + "C": [0.0, 1.0, 0.0], + "D": [1.0, 2.0, 3.0], + } + ) + obj = OrdinalEncoder().fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = pd.DataFrame( + np.zeros((3, 3)), + columns=list("ABC"), + ) + obj = OrdinalEncoder().fit(X) + return obj, X, X.copy() + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + } + ) + X_expected = pd.DataFrame( + { + "A": ["Q", "Q", "W"], + "B": ["Q", "W", "W"], + "C": ["W", "Q", "W"], + "D": [1.0, 2.0, 3.0], + "A__ordinal": [0.0, 0.0, 1.0], + "B__ordinal": [1.0, 0.0, 0.0], + "C__ordinal": [0.0, 1.0, 0.0], + } + ) + obj = OrdinalEncoder(inplace=False).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + print(obj.mapping) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = OrdinalEncoder(add_missing_categories="yes") diff --git a/gators/encoders/tests/test_regression_encoder.py b/gators/encoders/tests/test_regression_encoder.py deleted file mode 100644 index 23ce74cc..00000000 --- a/gators/encoders/tests/test_regression_encoder.py +++ /dev/null @@ -1,397 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning import QuantileDiscretizer -from gators.encoders import RegressionEncoder, WOEEncoder - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - n_bins = 3 - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name="TARGET") - obj = RegressionEncoder( - WOEEncoder(), discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - n_bins = 3 - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name="TARGET") - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True), - dtype=np.float32, - ).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - n_bins = 3 - X = pd.DataFrame( - np.zeros((3, 6)), - columns=list("qweasd"), - ) - y = pd.Series([1.0, 2.0, 0.0], name="TARGET") - obj = RegressionEncoder( - WOEEncoder(), discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - n_bins = 3 - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name="TARGET") - obj = RegressionEncoder( - WOEEncoder(), discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - n_bins = 3 - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0.11, -0.1, 5.55, 233.9, 4.66, 255.1], name="TARGET") - obj = RegressionEncoder( - WOEEncoder(), - discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True), - dtype=np.float32, - ).fit(X, y) - X_expected = pd.DataFrame( - { - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - "A__TARGET_1_WOEEncoder": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}, - "B__TARGET_1_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_1_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "A__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 1.3862943611198906, - 4: 1.3862943611198906, - 5: 1.3862943611198906, - }, - "B__TARGET_2_WOEEncoder": { - 0: 0.0, - 1: 0.0, - 2: 0.6931471805599453, - 3: 0.6931471805599453, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - "C__TARGET_2_WOEEncoder": { - 0: -0.40546510810816444, - 1: -0.40546510810816444, - 2: -0.40546510810816444, - 3: -0.40546510810816444, - 4: 0.6931471805599453, - 5: 0.6931471805599453, - }, - } - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - n_bins = 3 - X = ks.DataFrame( - np.zeros((3, 6)), - columns=list("qweasd"), - ) - y = ks.Series([1.0, 2.0, 0.0], name="TARGET") - obj = RegressionEncoder( - WOEEncoder(), discretizer=QuantileDiscretizer(n_bins=n_bins, inplace=True) - ).fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_without_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_without_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_without_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - discretizer = QuantileDiscretizer(n_bins=2) - with pytest.raises(TypeError): - _ = RegressionEncoder(encoder="q", discretizer=discretizer) - with pytest.raises(TypeError): - _ = RegressionEncoder(encoder=WOEEncoder(), discretizer="q") diff --git a/gators/encoders/tests/test_target_encoder.py b/gators/encoders/tests/test_target_encoder.py deleted file mode 100644 index 00daa63b..00000000 --- a/gators/encoders/tests/test_target_encoder.py +++ /dev/null @@ -1,242 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.encoders.target_encoder import TargetEncoder - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666, - }, - "B": {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - "C": {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - } - ) - obj = TargetEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666, - }, - "B": {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - "C": {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - } - ).astype(np.float32) - obj = TargetEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((6, 3)), - columns=list("ABC"), - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") - obj = TargetEncoder().fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666, - }, - "B": {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - "C": {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - } - ) - obj = TargetEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": { - 0: 0.0, - 1: 0.0, - 2: 0.0, - 3: 0.6666666666666666, - 4: 0.6666666666666666, - 5: 0.6666666666666666, - }, - "B": {0: 0.0, 1: 0.0, 2: 0.5, 3: 0.5, 4: 0.5, 5: 0.5}, - "C": {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.5, 5: 0.5}, - "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, - } - ).astype(np.float32) - obj = TargetEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((6, 3)), - columns=list("ABC"), - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name="TARGET") - obj = TargetEncoder().fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_target_encoder_dd.py b/gators/encoders/tests/test_target_encoder_dd.py new file mode 100644 index 00000000..f7d48ae8 --- /dev/null +++ b/gators/encoders/tests/test_target_encoder_dd.py @@ -0,0 +1,83 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.target_encoder import TargetEncoder + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ), + npartitions=2, + ) + y = dd.from_pandas(pd.Series([0, 0, 0, 1, 1, 0], name="TARGET"), npartitions=1) + X_expected = pd.DataFrame( + { + "A": [ + 0.0, + 0.0, + 0.0, + 0.6667, + 0.6667, + 0.6667, + ], + "B": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5], + "C": [0.25, 0.25, 0.25, 0.25, 0.5, 0.5], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + obj = TargetEncoder().fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = dd.from_pandas( + pd.DataFrame( + np.zeros((6, 3)), + columns=list("ABC"), + ), + npartitions=2, + ) + y = dd.from_pandas(pd.Series([0, 0, 0, 1, 1, 0], name="TARGET"), npartitions=1) + obj = TargetEncoder().fit(X, y) + return obj, X, X.compute().copy() + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_dd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_dd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_target_encoder_ks.py b/gators/encoders/tests/test_target_encoder_ks.py new file mode 100644 index 00000000..d0d174e4 --- /dev/null +++ b/gators/encoders/tests/test_target_encoder_ks.py @@ -0,0 +1,81 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.target_encoder import TargetEncoder + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = ps.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A": [ + 0.0, + 0.0, + 0.0, + 0.6667, + 0.6667, + 0.6667, + ], + "B": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5], + "C": [0.25, 0.25, 0.25, 0.25, 0.5, 0.5], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + obj = TargetEncoder().fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat_ks(): + X = ps.DataFrame( + np.zeros((6, 3)), + columns=list("ABC"), + ) + y = ps.Series([0, 0, 0, 1, 1, 0], name="TARGET") + obj = TargetEncoder().fit(X, y) + return obj, X, X.to_pandas().copy() + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_no_cat_ks(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_cat_ks_np(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_target_encoder_pd.py b/gators/encoders/tests/test_target_encoder_pd.py new file mode 100644 index 00000000..a0968402 --- /dev/null +++ b/gators/encoders/tests/test_target_encoder_pd.py @@ -0,0 +1,117 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.target_encoder import TargetEncoder + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A": [ + 0.0, + 0.0, + 0.0, + 0.6667, + 0.6667, + 0.6667, + ], + "B": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5], + "C": [0.25, 0.25, 0.25, 0.25, 0.5, 0.5], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + obj = TargetEncoder().fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = pd.DataFrame( + np.zeros((6, 3)), + columns=list("ABC"), + ) + y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") + obj = TargetEncoder().fit(X, y) + return obj, X, X.copy() + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A__target": [ + 0.0, + 0.0, + 0.0, + 0.6667, + 0.6667, + 0.6667, + ], + "B__target": [0.0, 0.0, 0.5, 0.5, 0.5, 0.5], + "C__target": [0.25, 0.25, 0.25, 0.25, 0.5, 0.5], + } + ) + X_expected = pd.concat([X, X_expected], axis=1) + obj = TargetEncoder(inplace=False).fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/encoders/tests/test_woe_encoder.py b/gators/encoders/tests/test_woe_encoder.py deleted file mode 100644 index 956e6cc2..00000000 --- a/gators/encoders/tests/test_woe_encoder.py +++ /dev/null @@ -1,242 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.encoders.woe_encoder import WOEEncoder - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - "B": [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - "C": [ - -0.40546511, - -0.40546511, - -0.40546511, - -0.40546511, - 0.69314718, - 0.69314718, - ], - "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], - } - ) - obj = WOEEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - "B": [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - "C": [ - -0.40546511, - -0.40546511, - -0.40546511, - -0.40546511, - 0.69314718, - 0.69314718, - ], - "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], - } - ).astype(np.float32) - obj = WOEEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat(): - X = pd.DataFrame( - np.zeros((6, 3)), - columns=list("ABC"), - ) - y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") - obj = WOEEncoder().fit(X, y) - return obj, X, X.copy() - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - "B": [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - "C": [ - -0.40546511, - -0.40546511, - -0.40546511, - -0.40546511, - 0.69314718, - 0.69314718, - ], - "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], - } - ) - obj = WOEEncoder().fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame( - { - "A": ["Q", "Q", "Q", "W", "W", "W"], - "B": ["Q", "Q", "W", "W", "W", "W"], - "C": ["Q", "Q", "Q", "Q", "W", "W"], - "D": [1, 2, 3, 4, 5, 6], - } - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name="TARGET") - X_expected = pd.DataFrame( - { - "A": [0.0, 0.0, 0.0, 1.38629436, 1.38629436, 1.38629436], - "B": [0.0, 0.0, 0.69314718, 0.69314718, 0.69314718, 0.69314718], - "C": [ - -0.40546511, - -0.40546511, - -0.40546511, - -0.40546511, - 0.69314718, - 0.69314718, - ], - "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], - } - ).astype(np.float32) - obj = WOEEncoder(dtype=np.float32).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_no_cat_ks(): - X = ks.DataFrame( - np.zeros((6, 3)), - columns=list("ABC"), - ) - y = ks.Series([0, 0, 0, 1, 1, 0], name="TARGET") - obj = WOEEncoder().fit(X, y) - return obj, X, X.to_pandas().copy() - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -def test_no_cat_pd(data_no_cat): - obj, X, X_expected = data_no_cat - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_no_cat_pd_np(data_no_cat): - obj, X, X_expected = data_no_cat - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_no_cat_ks_np(data_no_cat_ks): - obj, X, X_expected = data_no_cat_ks - X_numpy = X.to_numpy() - X_numpy_new = obj.transform_numpy(X_numpy) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected) diff --git a/gators/encoders/tests/test_woe_encoder_dd.py b/gators/encoders/tests/test_woe_encoder_dd.py new file mode 100644 index 00000000..941f6a11 --- /dev/null +++ b/gators/encoders/tests/test_woe_encoder_dd.py @@ -0,0 +1,158 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.woe_encoder import WOEEncoder + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ), + npartitions=2, + ) + y = dd.from_pandas(pd.Series([0, 0, 0, 1, 1, 0], name="TARGET"), npartitions=2) + X_expected = pd.DataFrame( + { + "A": { + 0: -1.4351, + 1: -1.4351, + 2: -1.4351, + 3: 1.0217, + 4: 1.0217, + 5: 1.0217, + }, + "B": { + 0: -1.0986, + 1: -1.0986, + 2: 0.5108, + 3: 0.5108, + 4: 0.5108, + 5: 0.5108, + }, + "C": { + 0: -0.3365, + 1: -0.3365, + 2: -0.3365, + 3: -0.3365, + 4: 0.5108, + 5: 0.5108, + }, + "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, + } + ) + obj = WOEEncoder(regularization=0.5).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ), + npartitions=2, + ) + y = dd.from_pandas(pd.Series([0, 0, 0, 1, 1, 0], name="TARGET"), npartitions=2) + X_expected = pd.DataFrame( + { + "A__woe": { + 0: -1.4351, + 1: -1.4351, + 2: -1.4351, + 3: 1.0217, + 4: 1.0217, + 5: 1.0217, + }, + "B__woe": { + 0: -1.0986, + 1: -1.0986, + 2: 0.5108, + 3: 0.5108, + 4: 0.5108, + 5: 0.5108, + }, + "C__woe": { + 0: -0.3365, + 1: -0.3365, + 2: -0.3365, + 3: -0.3365, + 4: 0.5108, + 5: 0.5108, + }, + } + ) + X_expected = pd.concat([X.compute(), X_expected], axis=1) + obj = WOEEncoder(regularization=0.5, inplace=False).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = dd.from_pandas( + pd.DataFrame(np.zeros((6, 3)), columns=list("ABC")), npartitions=2 + ) + y = dd.from_pandas(pd.Series([0, 0, 0, 1, 1, 0], name="TARGET"), npartitions=1) + obj = WOEEncoder().fit(X, y) + return obj, X, X.compute().copy() + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_dd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X).compute().astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_dd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy = X.compute().to_numpy() + X_numpy_new = obj.transform_numpy(X_numpy) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_dd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X).compute() + X_new[["A", "B", "C"]] = X_new[["A", "B", "C"]].astype(object) + X_expected[["A", "B", "C"]] = X_expected[["A", "B", "C"]].astype(object) + X_new[["A__woe", "B__woe", "C__woe"]] = X_new[ + ["A__woe", "B__woe", "C__woe"] + ].astype(float) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_dd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/encoders/tests/test_woe_encoder_ks.py b/gators/encoders/tests/test_woe_encoder_ks.py new file mode 100644 index 00000000..373bae5f --- /dev/null +++ b/gators/encoders/tests/test_woe_encoder_ks.py @@ -0,0 +1,154 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.woe_encoder import WOEEncoder + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = ps.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A": { + 0: -1.4351, + 1: -1.4351, + 2: -1.4351, + 3: 1.0217, + 4: 1.0217, + 5: 1.0217, + }, + "B": { + 0: -1.0986, + 1: -1.0986, + 2: 0.5108, + 3: 0.5108, + 4: 0.5108, + 5: 0.5108, + }, + "C": { + 0: -0.3365, + 1: -0.3365, + 2: -0.3365, + 3: -0.3365, + 4: 0.5108, + 5: 0.5108, + }, + "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, + } + ) + obj = WOEEncoder(regularization=0.5).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat_ks(): + X = ps.DataFrame( + np.zeros((6, 3)), + columns=list("ABC"), + ) + y = ps.Series([0, 0, 0, 1, 1, 0], name="TARGET") + obj = WOEEncoder().fit(X, y) + return obj, X, X.to_pandas().copy() + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_no_cat_ks(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_no_cat_ks_np(data_no_cat_ks): + obj, X, X_expected = data_no_cat_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.fixture +def data_not_inplace(): + X = ps.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = ps.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A__woe": { + 0: -1.4351, + 1: -1.4351, + 2: -1.4351, + 3: 1.0217, + 4: 1.0217, + 5: 1.0217, + }, + "B__woe": { + 0: -1.0986, + 1: -1.0986, + 2: 0.5108, + 3: 0.5108, + 4: 0.5108, + 5: 0.5108, + }, + "C__woe": { + 0: -0.3365, + 1: -0.3365, + 2: -0.3365, + 3: -0.3365, + 4: 0.5108, + 5: 0.5108, + }, + } + ) + X_expected = pd.concat([X.to_pandas(), X_expected], axis=1) + obj = WOEEncoder(regularization=0.5, inplace=False).fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/encoders/tests/test_woe_encoder_pd.py b/gators/encoders/tests/test_woe_encoder_pd.py new file mode 100644 index 00000000..c91e0408 --- /dev/null +++ b/gators/encoders/tests/test_woe_encoder_pd.py @@ -0,0 +1,151 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.encoders.woe_encoder import WOEEncoder + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A": { + 0: -1.4351, + 1: -1.4351, + 2: -1.4351, + 3: 1.0217, + 4: 1.0217, + 5: 1.0217, + }, + "B": { + 0: -1.0986, + 1: -1.0986, + 2: 0.5108, + 3: 0.5108, + 4: 0.5108, + 5: 0.5108, + }, + "C": { + 0: -0.3365, + 1: -0.3365, + 2: -0.3365, + 3: -0.3365, + 4: 0.5108, + 5: 0.5108, + }, + "D": {0: 1.0, 1: 2.0, 2: 3.0, 3: 4.0, 4: 5.0, 5: 6.0}, + } + ) + obj = WOEEncoder(regularization=0.5).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame( + { + "A": ["Q", "Q", "Q", "W", "W", "W"], + "B": ["Q", "Q", "W", "W", "W", "W"], + "C": ["Q", "Q", "Q", "Q", "W", "W"], + "D": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + } + ) + y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") + X_expected = pd.DataFrame( + { + "A__woe": { + 0: -1.4351, + 1: -1.4351, + 2: -1.4351, + 3: 1.0217, + 4: 1.0217, + 5: 1.0217, + }, + "B__woe": { + 0: -1.0986, + 1: -1.0986, + 2: 0.5108, + 3: 0.5108, + 4: 0.5108, + 5: 0.5108, + }, + "C__woe": { + 0: -0.3365, + 1: -0.3365, + 2: -0.3365, + 3: -0.3365, + 4: 0.5108, + 5: 0.5108, + }, + } + ) + X_expected = pd.concat([X, X_expected], axis=1) + obj = WOEEncoder(regularization=0.5, inplace=False).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_no_cat(): + X = pd.DataFrame(np.zeros((6, 3)), columns=list("ABC")) + y = pd.Series([0, 0, 0, 1, 1, 0], name="TARGET") + obj = WOEEncoder().fit(X, y) + return obj, X, X.copy() + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd(data_no_cat): + obj, X, X_expected = data_no_cat + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_cat_pd_np(data_no_cat): + obj, X, X_expected = data_no_cat + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_data_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = WOEEncoder(inplace="yes") + with pytest.raises(TypeError): + _ = WOEEncoder(regularization="a") + with pytest.raises(ValueError): + _ = WOEEncoder(regularization=-1) diff --git a/gators/encoders/woe_encoder.py b/gators/encoders/woe_encoder.py index 7a0a8562..745d74df 100644 --- a/gators/encoders/woe_encoder.py +++ b/gators/encoders/woe_encoder.py @@ -1,174 +1,103 @@ # License: Apache-2.0 -import warnings -from typing import Dict, List, Union +from typing import List, Dict -import databricks.koalas as ks -import numpy as np -import pandas as pd -from ..util import util from ._base_encoder import _BaseEncoder +from ..util.iv import compute_iv - -def clean_mapping( - mapping: Dict[str, Dict[str, List[float]]] -) -> Dict[str, Dict[str, List[float]]]: - mapping = { - col: {k: v for k, v in mapping[col].items() if v == v} for col in mapping.keys() - } - for m in mapping.values(): - if "OTHERS" not in m: - m["OTHERS"] = 0.0 - if "MISSING" not in m: - m["MISSING"] = 0.0 - return mapping +from gators import DataFrame, Series class WOEEncoder(_BaseEncoder): - """Encode all categorical variable using the weight of evidence technique. + """Encode all categorical variables using the weight of evidence technique. Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. + regularization : float, default 0.5. + Insure that the weights of evidence are finite. + + inplace : bool, default to True. + If True, replace in-place the categorical values by numerical ones. + If False, keep the categorical columns and create new encoded columns. + Examples -------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.encoders import WOEEncoder - >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = pd.Series([1, 1, 0], name='TARGET') >>> obj = WOEEncoder() - >>> obj.fit_transform(X, y) - A B - 0 0.0 0.000000 - 1 0.0 -0.693147 - 2 0.0 -0.693147 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> obj.fit_transform(X, y) - A B - 0 0.0 0.000000 - 1 0.0 -0.693147 - 2 0.0 -0.693147 + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([1, 1, 0], name='TARGET'), npartitions=1) - * fit with `pandas` & transform with `NumPy` + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) + >>> y = ps.Series([1, 1, 0], name='TARGET') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.encoders import WOEEncoder >>> X = pd.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) >>> y = pd.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0. , 0. ], - [ 0. , -0.69314718], - [ 0. , -0.69314718]]) - - * fit with `koalas` & transform with `NumPy` - >>> import databricks.koalas as ks - >>> from gators.encoders import WOEEncoder - >>> X = ks.DataFrame({'A': ['a', 'a', 'b'], 'B': ['c', 'd', 'd']}) - >>> y = ks.Series([1, 1, 0], name='TARGET') - >>> obj = WOEEncoder() - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0. , 0. ], - [ 0. , -0.69314718], - [ 0. , -0.69314718]]) - """ + The result is a transformed dataframe belonging to the same dataframe library. - def __init__(self, dtype: type = np.float64): - _BaseEncoder.__init__(self, dtype=dtype) + >>> obj.fit_transform(X, y) + A B + 0 1.203973 0.693147 + 1 1.203973 -0.405465 + 2 -1.504077 -0.405465 - def fit( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> "WOEEncoder": - """Fit the encoder. + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]: - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + >>> obj.transform_numpy(X.to_numpy()) + array([[ 1.2039728 , 0.69314718], + [ 1.2039728 , -0.40546511], + [-1.5040774 , -0.40546511]]) + """ - Returns - ------- - WOEEncoder: - Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_binary_target(y) - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - f"""`X` does not contain object columns: - `{self.__class__.__name__}` is not needed""" - ) - return self - self.check_binary_target(y) - self.check_nans(X, self.columns) - self.mapping = self.generate_mapping(X[self.columns], y) - self.num_categories_vec = np.array([len(m) for m in self.mapping.values()]) - columns, self.values_vec, self.encoded_values_vec = self.decompose_mapping( - mapping=self.mapping - ) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=columns - ) - return self - - @staticmethod - def generate_mapping( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Dict[str, Dict[str, float]]: + def __init__( + self, + columns: List[str] = None, + regularization: float = 0.5, + inplace: bool = True, + ): + if not isinstance(regularization, (int, float)): + raise TypeError("""`regularization` should be a float.""") + if regularization < 0: + raise ValueError("""`regularization` should be a positive float.""") + self.regularization = regularization + _BaseEncoder.__init__(self, columns=columns, inplace=inplace) + self.suffix = "woe" + + def generate_mapping(self, X: DataFrame, y: Series) -> Dict[str, Dict[str, float]]: """Generate the mapping to perform the encoding. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series]: - Labels. + y : Series: + Target values. Returns ------- Dict[str, Dict[str, float]] Mapping. """ - mapping_list = [] - y_name = y.name - X = X.join(y) - for col in X.columns: - if isinstance(X, pd.DataFrame): - tab = X.groupby([col, y_name])[y_name].count().unstack().fillna(0) - else: - tab = ( - X.groupby([col, y_name])[y_name] - .count() - .unstack() - .to_pandas() - .fillna(0) - ) - tab /= tab.sum() - tab.columns = [int(c) for c in tab.columns] - with np.errstate(divide="ignore"): - woe = pd.Series(np.log(tab[1] / tab[0])) - woe[(woe == np.inf) | (woe == -np.inf)] = 0.0 - mapping_list.append(pd.Series(woe, name=col)) - mapping = pd.concat(mapping_list, axis=1).to_dict() - X = X.drop(y_name, axis=1) - return clean_mapping(mapping) + _, stats = compute_iv(X, y, regularization=self.regularization) + stats_woe = stats[["woe"]] + grouped_stats = stats_woe.groupby(level=0) + return {name: group.xs(name)["woe"].to_dict() for name, group in grouped_stats} diff --git a/gators/feature_generation/__init__.py b/gators/feature_generation/__init__.py index bafc718a..c3278b11 100644 --- a/gators/feature_generation/__init__.py +++ b/gators/feature_generation/__init__.py @@ -4,8 +4,12 @@ from .is_equal import IsEqual from .is_null import IsNull from .one_hot import OneHot -from .plane_rotation import PlaneRotation +from .plan_rotation import PlanRotation +from .is_larger_than import IsLargerThan +from .is_smaller_than import IsSmallerThan +from .negation_bool import NegationBool from .polynomial_features import PolynomialFeatures +from .polynomial_object_features import PolynomialObjectFeatures __all__ = [ "_BaseFeatureGeneration", @@ -14,5 +18,10 @@ "OneHot", "ElementaryArithmetics", "ClusterStatistics", - "PlaneRotation" "PolynomialFeatures", + "PlanRotation", + "PolynomialFeatures", + "IsLargerThan", + "IsSmallerThan", + "NegationBool", + "PolynomialObjectFeatures", ] diff --git a/gators/feature_generation/_base_feature_generation.py b/gators/feature_generation/_base_feature_generation.py index d806a051..4fe852b5 100644 --- a/gators/feature_generation/_base_feature_generation.py +++ b/gators/feature_generation/_base_feature_generation.py @@ -1,12 +1,9 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from ..transformers.transformer import Transformer -from ..util import util class _BaseFeatureGeneration(Transformer): @@ -14,27 +11,20 @@ class _BaseFeatureGeneration(Transformer): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - column_names : List[str], default to None. + column_names : List[str], default None. List of generated columns. patterns : List[str] List of patterns. - column_mapping: Dict[str, List[str]] - Mapping between generated features and base features. - """ def __init__( self, columns: List[str], column_names: List[str], - column_mapping: List[str], - dtype: type = None, ): Transformer.__init__(self) self.column_names = column_names self.columns = columns - self.column_mapping = column_mapping self.idx_columns: np.ndarray = np.array([]) - self.dtype = dtype diff --git a/gators/feature_generation/cluster_statistics.py b/gators/feature_generation/cluster_statistics.py index 2afec8f1..7c029382 100644 --- a/gators/feature_generation/cluster_statistics.py +++ b/gators/feature_generation/cluster_statistics.py @@ -1,14 +1,15 @@ # License: Apache-2.0 -from typing import Dict, List, Union +from typing import Dict, List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen import cluster_statistics +from ..util import util from ._base_feature_generation import _BaseFeatureGeneration +from gators import DataFrame, Series + class ClusterStatistics(_BaseFeatureGeneration): """Create new columns based on statistics done at the row level. @@ -19,64 +20,49 @@ class ClusterStatistics(_BaseFeatureGeneration): Parameters ---------- - clusters_dict :Dict[str, List[str]] + clusters_dict : Dict[str, List[str]] Dictionary of clusters of features. - column_names : List[str], default to None. + column_names : List[str], default None. List of new column names - dtype : type, default to np.float64. - Numerical datatype of the output data. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation import ClusterStatistics - >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) - >>> obj.fit_transform(X) - A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std - 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 - 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 - 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 + >>> obj = ClusterStatistics(clusters_dict=clusters_dict) - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': [9., 9., 7.], 'B': [3., 4., 5.], 'C': [6., 7., 8.]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( + ... {'A': [9., 9., 7.], 'B': [3., 4., 5.], 'C': [6., 7., 8.]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame( + ... {'A': [9., 9., 7.], 'B': [3., 4., 5.], 'C': [6., 7., 8.]}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ClusterStatistics - >>> X = ks.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) >>> obj.fit_transform(X) A B C cluster_1__mean cluster_1__std cluster_2__mean cluster_2__std 0 9.0 3.0 6.0 6.0 4.242641 7.5 2.121320 1 9.0 4.0 7.0 6.5 3.535534 8.0 1.414214 2 7.0 5.0 8.0 6.0 1.414214 7.5 0.707107 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import ClusterStatistics - >>> X = pd.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[9. , 3. , 6. , 6. , 4.24264069, - 7.5 , 2.12132034], - [9. , 4. , 7. , 6.5 , 3.53553391, - 8. , 1.41421356], - [7. , 5. , 8. , 6. , 1.41421356, - 7.5 , 0.70710678]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ClusterStatistics - >>> X = ks.DataFrame({'A': [9, 9, 7], 'B': [3, 4, 5], 'C': [6, 7, 8]}) - >>> clusters_dict = {'cluster_1': ['A', 'B'], 'cluster_2': ['A', 'C']} - >>> obj = ClusterStatistics(clusters_dict=clusters_dict) + >>> X = pd.DataFrame({'A': [9., 9., 7.], 'B': [3., 4., 5.], 'C': [6., 7., 8.]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[9. , 3. , 6. , 6. , 4.24264069, @@ -91,7 +77,6 @@ def __init__( self, clusters_dict: Dict[str, List[str]], column_names: List[str] = None, - dtype: type = np.float64, ): if not isinstance(clusters_dict, dict): raise TypeError("`clusters_dict` should be a dict.") @@ -108,46 +93,35 @@ def __init__( """`clusters_dict` values should be lists with a length larger than 1.""" ) - if column_names is not None and not isinstance(column_names, list): + if column_names is not None and not isinstance( + column_names, (list, np.ndarray) + ): raise TypeError("`column_names` should be None or a list.") if not column_names: column_names = self.get_column_names(clusters_dict) - column_mapping = { - **{f"{key}__mean": val for (key, val) in clusters_dict.items()}, - **{f"{key}__std": val for (key, val) in clusters_dict.items()}, - } - else: - column_mapping = dict(zip(column_names, clusters_dict.values())) columns = list(set([c for s in list(clusters_dict.values()) for c in s])) if column_names and 2 * len(clusters_dict) != len(column_names): raise ValueError( """Length of `column_names` should be two times the length of `clusters_dict`.""" ) - self.check_datatype(dtype, [np.float32, np.float64]) _BaseFeatureGeneration.__init__( self, columns=columns, column_names=column_names, - column_mapping=column_mapping, - dtype=dtype, ) self.clusters_dict = clusters_dict self.n_clusters = len(self.clusters_dict) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "ClusterStatistics": + def fit(self, X: DataFrame, y: Series = None) -> "ClusterStatistics": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- @@ -155,35 +129,37 @@ def fit( Instance of itself. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.idx_columns = self.get_idx_columns(X, self.clusters_dict) + self.base_columns = list(X.columns) + self.idx_subarray = util.get_idx_columns(X, self.columns) + self.idx_columns = self.get_idx_columns(X[self.columns], self.clusters_dict) return self def transform( self, - X: Union[pd.DataFrame, ks.DataFrame], - ) -> Union[pd.DataFrame, ks.DataFrame]: + X: DataFrame, + ) -> DataFrame: """Transform the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Dataframe with statistics cluster features. """ + self.check_dataframe(X) + util.get_function(X).set_option("compute.ops_on_diff_frames", True) for i, cols in enumerate(self.clusters_dict.values()): - X = X.join(X[cols].mean(axis=1).rename(self.column_names[2 * i])) - X = X.join(X[cols].std(axis=1).rename(self.column_names[2 * i + 1])) - if isinstance(X, ks.DataFrame): - return X.astype(self.dtype).sort_index() - return X.astype(self.dtype) + X[self.column_names[2 * i]] = X[cols].mean(axis=1) + X[self.column_names[2 * i + 1]] = X[cols].std(axis=1) + util.get_function(X).set_option("compute.ops_on_diff_frames", False) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -192,21 +168,24 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return cluster_statistics(X.astype(self.dtype), self.idx_columns, self.dtype) + X_new = cluster_statistics( + X[:, self.idx_subarray].astype(np.float64), self.idx_columns + ) + return np.concatenate((X, X_new), axis=1) @staticmethod def get_idx_columns( - X: Union[pd.DataFrame, ks.DataFrame], clusters_dict: Dict[str, List[str]] + X: DataFrame, clusters_dict: Dict[str, List[str]] ) -> np.ndarray: """Get the column indices of the clusters. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input data. clusters_dict : Dict[str, List[str]] Clusters. @@ -232,7 +211,7 @@ def get_column_names(clusters_dict: Dict[str, List[str]]) -> List[str]: Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns diff --git a/gators/feature_generation/elementary_arithmethics.py b/gators/feature_generation/elementary_arithmethics.py index 807d77c0..5716a879 100644 --- a/gators/feature_generation/elementary_arithmethics.py +++ b/gators/feature_generation/elementary_arithmethics.py @@ -1,12 +1,11 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen import elementary_arithmetics from gators.feature_generation._base_feature_generation import _BaseFeatureGeneration +from gators import DataFrame, Series EPSILON = 1e-10 @@ -31,99 +30,56 @@ class ElementaryArithmetics(_BaseFeatureGeneration): * '*' for multiplication * '/' for division - column_names : List[str], default to None. + column_names : List[str], default None. List of new column names. - coef : float, default to 1. + coef : float, default 1. Coefficient value for the addition. X[new] = X[column_a] + coef * X[column_b] - dtype : type, default to np.float64. + dtype : type, default np.float64. Numerical datatype of the output data. Examples --------- - * fit & transform with `pandas` - - - addition - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='+', coef=0.1) - >>> obj.fit_transform(X) - A B A__+__B - 0 1.0 1.0 1.1 - 1 1.0 2.0 1.2 - 2 1.0 3.0 1.3 - - - division - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> obj.fit_transform(X) - A B A__/__B - 0 1.0 1.0 1.000000 - 1 1.0 2.0 0.500000 - 2 1.0 3.0 0.333333 - - - multiplication & setting new column name - - >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1., 2., 3.], 'B': [1., 4., 9.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], - ... operator='*', column_names=['mult']) - >>> obj.fit_transform(X) - A B mult - 0 1.0 1.0 1.0 - 1 2.0 4.0 8.0 - 2 3.0 9.0 27.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) + Imports and initialization: + + >>> from gators.feature_generation import ClusterStatistics >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> obj.fit_transform(X) - A B A__/__B - 0 1.0 1.0 1.000000 - 1 1.0 2.0 0.500000 - 2 1.0 3.0 0.333333 + ... columns_a=['A'], columns_b=['B'], operator='+', coef=0.1) + + The `fit`, `transform`, and `fit_transform` methods accept: - * fit with `pandas` & transform with `NumPy` + * `dask` dataframes: + >>> import dask.dataframe as dd >>> import pandas as pd - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = pd.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. , 1. ], - [1. , 2. , 0.5 ], - [1. , 3. , 0.33333333]]) + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}), npartitions=1) - * fit with `koalas` & transform with `NumPy` + * `koalas` dataframes: - >>> import databricks.koalas as ks - >>> from gators.feature_generation import ElementaryArithmetics - >>> X = ks.DataFrame({'A': [1., 1., 1.], 'B': [1., 2., 3.]}) - >>> obj = ElementaryArithmetics( - ... columns_a=['A'], columns_b=['B'], operator='/') + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A+0.1xB + 0 1.0 1.0 1.1 + 1 1.0 2.0 1.2 + 2 1.0 3.0 1.3 + + >>> X = pd.DataFrame({'A': [1, 1., 1.], 'B': [1., 2., 3.]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 1. , 1. ], - [1. , 2. , 0.5 ], - [1. , 3. , 0.33333333]]) - + array([[1. , 1. , 1.1], + [1. , 2. , 1.2], + [1. , 3. , 1.3]]) """ def __init__( @@ -133,75 +89,56 @@ def __init__( operator: str, column_names: List[str] = None, coef: float = 1.0, - dtype: type = np.float64, ): - if not isinstance(columns_a, list): + if not isinstance(columns_a, (list, np.ndarray)): raise TypeError("`columns_a` should be a list.") - if not isinstance(columns_b, list): + if not isinstance(columns_b, (list, np.ndarray)): raise TypeError("`columns_b` should be a list.") if len(columns_a) == 0: raise ValueError("`columns_a` should not be empty.") if not isinstance(operator, str): raise TypeError("`operator` should be a str.") - if not isinstance(coef, float): - raise TypeError("`coef` should be a float.") - if column_names and not isinstance(column_names, list): + if not isinstance(coef, (int, float)): + raise TypeError("`coef` should be an int or a float.") + if column_names and not isinstance(column_names, (list, np.ndarray)): raise TypeError("`column_names` should be a list.") if len(columns_a) != len(columns_b): raise ValueError("Length of `columns_a` and `columns_a` should match.") if operator not in ["+", "*", "/"]: raise ValueError('`operator` should be "+", "*", or "/".') if not column_names: - str_operator = operator - if coef < 0: - str_operator = "-" + str_operator = self.get_str_operator(operator, coef) column_names = [ - f"{c_a}__{str_operator}__{c_b}" - for c_a, c_b in zip(columns_a, columns_b) + f"{c_a}{str_operator}{c_b}" for c_a, c_b in zip(columns_a, columns_b) ] - column_mapping = { - f"{c_a}__{str_operator}__{c_b}": [c_a, c_b] - for c_a, c_b in zip(columns_a, columns_b) - } - else: - column_mapping = { - c: [c_a, c_b] for c, c_a, c_b in zip(column_names, columns_a, columns_b) - } if len(column_names) != len(columns_a): raise ValueError( """Length of `columns_a`, `columns_b`, and `column_names` should match.""" ) - self.check_datatype(dtype, [np.float32, np.float64]) columns = list(set(columns_a + columns_b)) _BaseFeatureGeneration.__init__( self, columns=columns, column_names=column_names, - column_mapping=column_mapping, - dtype=dtype, ) - self.columns = list(set(columns_a + columns_b)) self.columns_a = columns_a self.columns_b = columns_b - self.idx_columns_a: np.ndarray = np.array([]) - self.idx_columns_b: np.ndarray = np.array([]) + self.idx_columns_a = np.array([]) + self.idx_columns_b = np.array([]) + self.idx_subarray = np.array([]) self.operator = operator self.coef = coef - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "ElementaryArithmetics": + def fit(self, X: DataFrame, y: Series = None) -> "ElementaryArithmetics": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- @@ -209,32 +146,38 @@ def fit( Instance of itself. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) + self.columns = [ + c for c in X.columns if c in list(set(self.columns_a + self.columns_b)) + ] + self.base_columns = list(X.columns) + + self.idx_subarray = self.get_idx_columns( + columns=X.columns, + selected_columns=self.columns, + ) self.idx_columns_a = self.get_idx_columns( - columns=X.columns, selected_columns=self.columns_a + columns=self.columns, selected_columns=self.columns_a ) self.idx_columns_b = self.get_idx_columns( - columns=X.columns, selected_columns=self.columns_b + columns=self.columns, selected_columns=self.columns_b ) + return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) for c_a, c_b, c in zip(self.columns_a, self.columns_b, self.column_names): if self.operator == "+": X[c] = X[c_a] + self.coef * X[c_b] @@ -243,11 +186,11 @@ def transform( else: X[c] = X[c_a] / (X[c_b] + EPSILON) X[c] = X[c] - X = X.astype(self.dtype) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -256,19 +199,19 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return elementary_arithmetics( - X.astype(self.dtype), + X_new = elementary_arithmetics( + X[:, self.idx_subarray].astype(np.float64), self.idx_columns_a, self.idx_columns_b, self.operator, self.coef, EPSILON, - self.dtype, ) + return np.concatenate((X, X_new), axis=1) @staticmethod def get_idx_columns(columns: List[str], selected_columns: List[str]) -> np.ndarray: @@ -276,9 +219,9 @@ def get_idx_columns(columns: List[str], selected_columns: List[str]) -> np.ndarr Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - selected_columns : List[str] + selected_theta_vec : List[float] List of columns. Returns: @@ -292,3 +235,14 @@ def get_idx_columns(columns: List[str], selected_columns: List[str]) -> np.ndarr idx.append(i) break return np.array(idx) + + @staticmethod + def get_str_operator(operator, coef): + coef = coef if int(coef) != coef else int(coef) + if operator != "+": + return f"{operator}" + if coef == 1: + return f"{operator}" + if coef < 0: + return f"{coef}x" + return f"{operator}{coef}x" diff --git a/gators/feature_generation/feature_gen.c b/gators/feature_generation/feature_gen.c new file mode 100644 index 00000000..13b2eacf --- /dev/null +++ b/gators/feature_generation/feature_gen.c @@ -0,0 +1,55600 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "feature_gen", + "sources": [ + "gators/feature_generation/feature_gen.pyx" + ] + }, + "module_name": "feature_gen" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__feature_gen +#define __PYX_HAVE_API__feature_gen +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#include +#include "pythread.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/feature_generation/feature_gen.pyx", + "", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS +#define __pyx_atomic_int_type int +#define __pyx_nonatomic_int_type int +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__)) + #include +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ + (defined(_MSC_VER) && _MSC_VER >= 1700))) + #include +#endif +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type atomic_int + #define __pyx_atomic_incr_aligned(value) atomic_fetch_add_explicit(value, 1, memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) atomic_fetch_sub_explicit(value, 1, memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C atomics" + #endif +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ +\ + (defined(_MSC_VER) && _MSC_VER >= 1700)) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type std::atomic_int + #define __pyx_atomic_incr_aligned(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) std::atomic_fetch_sub_explicit(value, 1, std::memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C++ atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C++ atomics" + #endif +#elif CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 &&\ + (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2)))) + #define __pyx_atomic_incr_aligned(value) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type long + #undef __pyx_nonatomic_int_type + #define __pyx_nonatomic_int_type long + #pragma intrinsic (_InterlockedExchangeAdd) + #define __pyx_atomic_incr_aligned(value) _InterlockedExchangeAdd(value, 1) + #define __pyx_atomic_decr_aligned(value) _InterlockedExchangeAdd(value, -1) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview)) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview)) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_defaults; +typedef struct __pyx_defaults __pyx_defaults; +struct __pyx_defaults1; +typedef struct __pyx_defaults1 __pyx_defaults1; +struct __pyx_defaults2; +typedef struct __pyx_defaults2 __pyx_defaults2; +struct __pyx_defaults3; +typedef struct __pyx_defaults3 __pyx_defaults3; +struct __pyx_defaults4; +typedef struct __pyx_defaults4 __pyx_defaults4; +struct __pyx_defaults5; +typedef struct __pyx_defaults5 __pyx_defaults5; +struct __pyx_defaults { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults1 { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults2 { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults3 { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults4 { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults5 { + PyObject *__pyx_arg__fused_sigindex; +}; + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":302 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int_type acquisition_count; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); + PyObject *(*_get_base)(struct __pyx_memoryview_obj *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* BuildPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char); + +/* JoinPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* PyObjectFormatSimple.proto */ +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#elif PY_MAJOR_VERSION < 3 + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") :\ + PyObject_Format(s, f)) +#elif CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_repr(s) :\ + likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_repr(s) :\ + PyObject_Format(s, f)) +#else + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#endif + +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* DivInt[Py_ssize_t].proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define __Pyx_UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* AssertionsEnabled.proto */ +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (1) +#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) + static int __pyx_assertions_enabled_flag; + #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) + static int __Pyx_init_assertions_enabled(void) { + PyObject *builtins, *debug, *debug_str; + int flag; + builtins = PyEval_GetBuiltins(); + if (!builtins) goto bad; + debug_str = PyUnicode_FromStringAndSize("__debug__", 9); + if (!debug_str) goto bad; + debug = PyObject_GetItem(builtins, debug_str); + Py_DECREF(debug_str); + if (!debug) goto bad; + flag = PyObject_IsTrue(debug); + Py_DECREF(debug); + if (flag == -1) goto bad; + __pyx_assertions_enabled_flag = flag; + return 0; + bad: + __pyx_assertions_enabled_flag = 1; + return -1; + } +#else + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (!Py_OptimizeFlag) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* PySequenceMultiply.proto */ +#define __Pyx_PySequence_Multiply_Left(mul, seq) __Pyx_PySequence_Multiply(seq, mul) +static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul); + +/* SetItemInt.proto */ +#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, + int is_list, int wraparound, int boundscheck); + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* DivInt[long].proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 +#define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) +#else +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); +#endif + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_itemsize(o) PyMemoryView_GET_BUFFER(o)->itemsize +#else + // can't get format like this unfortunately. It's unicode via getattr +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj); +#endif + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_ndim(o) PyMemoryView_GET_BUFFER(o)->ndim +#else + // can't get format like this unfortunately. It's unicode via getattr +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj); +#endif + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* py_dict_values.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d); + +/* UnpackUnboundCMethod.proto */ +typedef struct { + PyObject *type; + PyObject **method_name; + PyCFunction func; + PyObject *method; + int flag; +} __Pyx_CachedCFunction; + +/* CallUnboundCMethod0.proto */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CallUnboundCMethod0(cfunc, self)\ + (likely((cfunc)->func) ?\ + (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) :\ + (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\ + (PY_VERSION_HEX >= 0x030700A0 ?\ + (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\ + (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\ + (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\ + ((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, __pyx_empty_tuple) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)) +#else +#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self) +#endif + +/* dict_getitem_default.proto */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); + +/* CallUnboundCMethod1.proto */ +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#else +#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg) +#endif + +/* CallUnboundCMethod2.proto */ +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2); +#else +#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2) __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* PyObject_Str.proto */ +#define __Pyx_PyObject_Str(obj)\ + (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* FusedFunction.proto */ +typedef struct { + __pyx_CyFunctionObject func; + PyObject *__signatures__; + PyObject *self; +} __pyx_FusedFunctionObject; +static PyObject *__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code); +static int __pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self); +static int __pyx_FusedFunction_init(PyObject *module); +#define __Pyx_FusedFunction_USED + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *, int writable_flag); + +/* PyUCS4InUnicode.proto */ +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (&memview->acquisition_count) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XCLEAR_MEMVIEW(slice, have_gil) __Pyx_XCLEAR_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* ImportNumPyArray.proto */ +static PyObject *__pyx_numpy_ndarray = NULL; +static PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "libc.math" */ + +/* Module declarations from "feature_gen" */ +static PyObject *__pyx_collections_abc_Sequence = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static PyArrayObject *__pyx_f_11feature_gen_one_hot(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_is_null_object(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_is_equal_object(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_polynomial_object(PyArrayObject *, PyArrayObject *, int, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_is_null(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_is_null(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_is_null(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_is_null(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_is_null(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_is_equal(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_is_equal(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_is_equal(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_is_equal(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_is_equal(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_cluster_statistics(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_cluster_statistics(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyObject *, float, float, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyObject *, float, float, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyObject *, float, float, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyObject *, float, float, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyObject *, float, float, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_plan_rotation(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_plan_rotation(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_plan_rotation(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_plan_rotation(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_plan_rotation(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_polynomial(PyArrayObject *, PyArrayObject *, int, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_polynomial(PyArrayObject *, PyArrayObject *, int, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_polynomial(PyArrayObject *, PyArrayObject *, int, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_polynomial(PyArrayObject *, PyArrayObject *, int, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_polynomial(PyArrayObject *, PyArrayObject *, int, int __pyx_skip_dispatch); /*proto*/ +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static int assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, PyObject *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, PyObject *); /*proto*/ +static int __pyx_memoryview_err_no_memory(void); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t = { "int16_t", NULL, sizeof(__pyx_t_5numpy_int16_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int16_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int16_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int32_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t = { "float32_t", NULL, sizeof(__pyx_t_5numpy_float32_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "feature_gen" +extern int __pyx_module_is_main_feature_gen; +int __pyx_module_is_main_feature_gen = 0; + +/* Implementation of "feature_gen" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_object; +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin___import__; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_AssertionError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = ": "; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_X[] = "X"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_s[] = "s"; +static const char __pyx_k__2[] = "."; +static const char __pyx_k__3[] = "*"; +static const char __pyx_k__6[] = "'"; +static const char __pyx_k__7[] = ")"; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__11[] = "()"; +static const char __pyx_k__12[] = "|"; +static const char __pyx_k__15[] = "+"; +static const char __pyx_k__16[] = ""; +static const char __pyx_k__71[] = "?"; +static const char __pyx_k_abc[] = "abc"; +static const char __pyx_k_and[] = " and "; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_got[] = " (got "; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_axis[] = "axis"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_cats[] = "cats"; +static const char __pyx_k_coef[] = "coef"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_kind[] = "kind"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_ones[] = "ones"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_count[] = "count"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_empty[] = "empty"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_index[] = "index"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_split[] = "split"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_strip[] = "strip"; +static const char __pyx_k_zeros[] = "zeros"; +static const char __pyx_k_degree[] = "degree"; +static const char __pyx_k_enable[] = "enable"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_kwargs[] = "kwargs"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_object[] = "object"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_values[] = "values"; +static const char __pyx_k_EPSILON[] = "EPSILON"; +static const char __pyx_k_cos_vec[] = "cos_vec"; +static const char __pyx_k_disable[] = "disable"; +static const char __pyx_k_float64[] = "float64"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_int16_t[] = "int16_t"; +static const char __pyx_k_int32_t[] = "int32_t"; +static const char __pyx_k_int64_t[] = "int64_t"; +static const char __pyx_k_is_null[] = "is_null"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_one_hot[] = "one_hot"; +static const char __pyx_k_sin_vec[] = "sin_vec"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_Sequence[] = "Sequence"; +static const char __pyx_k_defaults[] = "defaults"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_is_equal[] = "is_equal"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_operator[] = "operator"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_register[] = "register"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_float32_t[] = "float32_t"; +static const char __pyx_k_float64_t[] = "float64_t"; +static const char __pyx_k_isenabled[] = "isenabled"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_polynomial[] = "polynomial"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_signatures[] = "signatures"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_collections[] = "collections"; +static const char __pyx_k_concatenate[] = "concatenate"; +static const char __pyx_k_feature_gen[] = "feature_gen"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = ""; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_class_getitem[] = "__class_getitem__"; +static const char __pyx_k_idx_columns_a[] = "idx_columns_a"; +static const char __pyx_k_idx_columns_b[] = "idx_columns_b"; +static const char __pyx_k_idx_columns_x[] = "idx_columns_x"; +static const char __pyx_k_idx_columns_y[] = "idx_columns_y"; +static const char __pyx_k_plan_rotation[] = "plan_rotation"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_AssertionError[] = "AssertionError"; +static const char __pyx_k_fused_sigindex[] = "_fused_sigindex"; +static const char __pyx_k_is_null_object[] = "is_null_object"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_collections_abc[] = "collections.abc"; +static const char __pyx_k_combinations_np[] = "combinations_np"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_is_equal_object[] = "is_equal_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_polynomial_object[] = "polynomial_object"; +static const char __pyx_k_pyx_fuse_0is_null[] = "__pyx_fuse_0is_null"; +static const char __pyx_k_pyx_fuse_1is_null[] = "__pyx_fuse_1is_null"; +static const char __pyx_k_pyx_fuse_2is_null[] = "__pyx_fuse_2is_null"; +static const char __pyx_k_pyx_fuse_3is_null[] = "__pyx_fuse_3is_null"; +static const char __pyx_k_pyx_fuse_4is_null[] = "__pyx_fuse_4is_null"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_cluster_statistics[] = "cluster_statistics"; +static const char __pyx_k_pyx_fuse_0is_equal[] = "__pyx_fuse_0is_equal"; +static const char __pyx_k_pyx_fuse_1is_equal[] = "__pyx_fuse_1is_equal"; +static const char __pyx_k_pyx_fuse_2is_equal[] = "__pyx_fuse_2is_equal"; +static const char __pyx_k_pyx_fuse_3is_equal[] = "__pyx_fuse_3is_equal"; +static const char __pyx_k_pyx_fuse_4is_equal[] = "__pyx_fuse_4is_equal"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_pyx_fuse_0polynomial[] = "__pyx_fuse_0polynomial"; +static const char __pyx_k_pyx_fuse_1polynomial[] = "__pyx_fuse_1polynomial"; +static const char __pyx_k_pyx_fuse_2polynomial[] = "__pyx_fuse_2polynomial"; +static const char __pyx_k_pyx_fuse_3polynomial[] = "__pyx_fuse_3polynomial"; +static const char __pyx_k_pyx_fuse_4polynomial[] = "__pyx_fuse_4polynomial"; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_Invalid_shape_in_axis[] = "Invalid shape in axis "; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_Cannot_index_with_type[] = "Cannot index with type '"; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_elementary_arithmetics[] = "elementary_arithmetics"; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_pyx_fuse_0plan_rotation[] = "__pyx_fuse_0plan_rotation"; +static const char __pyx_k_pyx_fuse_1plan_rotation[] = "__pyx_fuse_1plan_rotation"; +static const char __pyx_k_pyx_fuse_2plan_rotation[] = "__pyx_fuse_2plan_rotation"; +static const char __pyx_k_pyx_fuse_3plan_rotation[] = "__pyx_fuse_3plan_rotation"; +static const char __pyx_k_pyx_fuse_4plan_rotation[] = "__pyx_fuse_4plan_rotation"; +static const char __pyx_k_Dimension_d_is_not_direct[] = "Dimension %d is not direct"; +static const char __pyx_k_Index_out_of_bounds_axis_d[] = "Index out of bounds (axis %d)"; +static const char __pyx_k_No_matching_signature_found[] = "No matching signature found"; +static const char __pyx_k_Step_may_not_be_zero_axis_d[] = "Step may not be zero (axis %d)"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_pyx_fuse_0cluster_statistics[] = "__pyx_fuse_0cluster_statistics"; +static const char __pyx_k_pyx_fuse_1cluster_statistics[] = "__pyx_fuse_1cluster_statistics"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_pyx_fuse_0elementary_arithmeti[] = "__pyx_fuse_0elementary_arithmetics"; +static const char __pyx_k_pyx_fuse_1elementary_arithmeti[] = "__pyx_fuse_1elementary_arithmetics"; +static const char __pyx_k_pyx_fuse_2elementary_arithmeti[] = "__pyx_fuse_2elementary_arithmetics"; +static const char __pyx_k_pyx_fuse_3elementary_arithmeti[] = "__pyx_fuse_3elementary_arithmetics"; +static const char __pyx_k_pyx_fuse_4elementary_arithmeti[] = "__pyx_fuse_4elementary_arithmetics"; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_All_dimensions_preceding_dimensi[] = "All dimensions preceding dimension %d must be indexed and not sliced"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Cannot_transpose_memoryview_with[] = "Cannot transpose memoryview with indirect dimensions"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Expected_at_least_d_argument_s_g[] = "Expected at least %d argument%s, got %d"; +static const char __pyx_k_Function_call_with_ambiguous_arg[] = "Function call with ambiguous argument types"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got "; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis "; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_gators_feature_generation_featur[] = "gators/feature_generation/feature_gen.pyx"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension "; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +/* #### Code section: decls ### */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_11feature_gen_one_hot(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_cats); /* proto */ +static PyObject *__pyx_pf_11feature_gen_2is_null(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_11feature_gen_20__pyx_fuse_0is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_22__pyx_fuse_1is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_24__pyx_fuse_2is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_26__pyx_fuse_3is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_28__pyx_fuse_4is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_4is_null_object(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_6is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_11feature_gen_32__pyx_fuse_0is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b); /* proto */ +static PyObject *__pyx_pf_11feature_gen_34__pyx_fuse_1is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b); /* proto */ +static PyObject *__pyx_pf_11feature_gen_36__pyx_fuse_2is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b); /* proto */ +static PyObject *__pyx_pf_11feature_gen_38__pyx_fuse_3is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b); /* proto */ +static PyObject *__pyx_pf_11feature_gen_40__pyx_fuse_4is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b); /* proto */ +static PyObject *__pyx_pf_11feature_gen_8is_equal_object(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b); /* proto */ +static PyObject *__pyx_pf_11feature_gen_10cluster_statistics(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_11feature_gen_44__pyx_fuse_0cluster_statistics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_46__pyx_fuse_1cluster_statistics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_11feature_gen_12elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_11feature_gen_50__pyx_fuse_0elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON); /* proto */ +static PyObject *__pyx_pf_11feature_gen_52__pyx_fuse_1elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON); /* proto */ +static PyObject *__pyx_pf_11feature_gen_54__pyx_fuse_2elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON); /* proto */ +static PyObject *__pyx_pf_11feature_gen_56__pyx_fuse_3elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON); /* proto */ +static PyObject *__pyx_pf_11feature_gen_58__pyx_fuse_4elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON); /* proto */ +static PyObject *__pyx_pf_11feature_gen_14plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_11feature_gen_62__pyx_fuse_0plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec); /* proto */ +static PyObject *__pyx_pf_11feature_gen_64__pyx_fuse_1plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec); /* proto */ +static PyObject *__pyx_pf_11feature_gen_66__pyx_fuse_2plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec); /* proto */ +static PyObject *__pyx_pf_11feature_gen_68__pyx_fuse_3plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec); /* proto */ +static PyObject *__pyx_pf_11feature_gen_70__pyx_fuse_4plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec); /* proto */ +static PyObject *__pyx_pf_11feature_gen_16polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_11feature_gen_74__pyx_fuse_0polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree); /* proto */ +static PyObject *__pyx_pf_11feature_gen_76__pyx_fuse_1polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree); /* proto */ +static PyObject *__pyx_pf_11feature_gen_78__pyx_fuse_2polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree); /* proto */ +static PyObject *__pyx_pf_11feature_gen_80__pyx_fuse_3polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree); /* proto */ +static PyObject *__pyx_pf_11feature_gen_82__pyx_fuse_4polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree); /* proto */ +static PyObject *__pyx_pf_11feature_gen_18polynomial_object(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, 0, 0, 0, 0}; +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_values = {0, 0, 0, 0, 0}; +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type___pyx_array; + PyObject *__pyx_type___pyx_MemviewEnum; + PyObject *__pyx_type___pyx_memoryview; + PyObject *__pyx_type___pyx_memoryviewslice; + #endif + PyTypeObject *__pyx_array_type; + PyTypeObject *__pyx_MemviewEnum_type; + PyTypeObject *__pyx_memoryview_type; + PyTypeObject *__pyx_memoryviewslice_type; + PyObject *__pyx_kp_u_; + PyObject *__pyx_n_s_ASCII; + PyObject *__pyx_kp_s_All_dimensions_preceding_dimensi; + PyObject *__pyx_n_s_AssertionError; + PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; + PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; + PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; + PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; + PyObject *__pyx_kp_u_Cannot_index_with_type; + PyObject *__pyx_kp_s_Cannot_transpose_memoryview_with; + PyObject *__pyx_kp_s_Dimension_d_is_not_direct; + PyObject *__pyx_n_s_EPSILON; + PyObject *__pyx_n_s_Ellipsis; + PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; + PyObject *__pyx_kp_s_Expected_at_least_d_argument_s_g; + PyObject *__pyx_kp_s_Function_call_with_ambiguous_arg; + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + PyObject *__pyx_n_s_IndexError; + PyObject *__pyx_kp_s_Index_out_of_bounds_axis_d; + PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; + PyObject *__pyx_kp_u_Invalid_mode_expected_c_or_fortr; + PyObject *__pyx_kp_u_Invalid_shape_in_axis; + PyObject *__pyx_n_s_MemoryError; + PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; + PyObject *__pyx_kp_s_MemoryView_of_r_object; + PyObject *__pyx_kp_s_No_matching_signature_found; + PyObject *__pyx_n_b_O; + PyObject *__pyx_kp_u_Out_of_bounds_on_buffer_access_a; + PyObject *__pyx_n_s_PickleError; + PyObject *__pyx_n_s_Sequence; + PyObject *__pyx_kp_s_Step_may_not_be_zero_axis_d; + PyObject *__pyx_n_s_TypeError; + PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; + PyObject *__pyx_n_s_ValueError; + PyObject *__pyx_n_s_View_MemoryView; + PyObject *__pyx_n_s_X; + PyObject *__pyx_kp_s__11; + PyObject *__pyx_kp_s__12; + PyObject *__pyx_kp_u__12; + PyObject *__pyx_kp_u__15; + PyObject *__pyx_kp_u__16; + PyObject *__pyx_kp_u__2; + PyObject *__pyx_n_s__3; + PyObject *__pyx_kp_u__3; + PyObject *__pyx_kp_u__6; + PyObject *__pyx_kp_u__7; + PyObject *__pyx_n_s__71; + PyObject *__pyx_n_s_abc; + PyObject *__pyx_n_s_allocate_buffer; + PyObject *__pyx_kp_u_and; + PyObject *__pyx_n_s_args; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_axis; + PyObject *__pyx_n_s_base; + PyObject *__pyx_n_s_c; + PyObject *__pyx_n_u_c; + PyObject *__pyx_n_s_cats; + PyObject *__pyx_n_s_class; + PyObject *__pyx_n_s_class_getitem; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_cluster_statistics; + PyObject *__pyx_n_s_coef; + PyObject *__pyx_n_s_collections; + PyObject *__pyx_kp_s_collections_abc; + PyObject *__pyx_n_s_combinations_np; + PyObject *__pyx_n_s_concatenate; + PyObject *__pyx_kp_s_contiguous_and_direct; + PyObject *__pyx_kp_s_contiguous_and_indirect; + PyObject *__pyx_n_s_cos_vec; + PyObject *__pyx_n_s_count; + PyObject *__pyx_n_s_defaults; + PyObject *__pyx_n_s_degree; + PyObject *__pyx_n_s_dict; + PyObject *__pyx_kp_u_disable; + PyObject *__pyx_n_s_dtype; + PyObject *__pyx_n_s_dtype_is_object; + PyObject *__pyx_n_s_elementary_arithmetics; + PyObject *__pyx_n_s_empty; + PyObject *__pyx_kp_u_enable; + PyObject *__pyx_n_s_encode; + PyObject *__pyx_n_s_enumerate; + PyObject *__pyx_n_s_error; + PyObject *__pyx_n_s_feature_gen; + PyObject *__pyx_n_s_flags; + PyObject *__pyx_n_s_float32_t; + PyObject *__pyx_n_s_float64; + PyObject *__pyx_n_s_float64_t; + PyObject *__pyx_n_s_format; + PyObject *__pyx_n_s_fortran; + PyObject *__pyx_n_u_fortran; + PyObject *__pyx_n_s_fused_sigindex; + PyObject *__pyx_kp_s_gators_feature_generation_featur; + PyObject *__pyx_kp_u_gc; + PyObject *__pyx_n_s_get; + PyObject *__pyx_n_s_getstate; + PyObject *__pyx_kp_u_got; + PyObject *__pyx_kp_u_got_differing_extents_in_dimensi; + PyObject *__pyx_n_s_id; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_idx_columns_a; + PyObject *__pyx_n_s_idx_columns_b; + PyObject *__pyx_n_s_idx_columns_x; + PyObject *__pyx_n_s_idx_columns_y; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_index; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_int16_t; + PyObject *__pyx_n_s_int32_t; + PyObject *__pyx_n_s_int64_t; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_n_s_is_equal; + PyObject *__pyx_n_s_is_equal_object; + PyObject *__pyx_n_s_is_null; + PyObject *__pyx_n_s_is_null_object; + PyObject *__pyx_kp_u_isenabled; + PyObject *__pyx_n_s_itemsize; + PyObject *__pyx_kp_s_itemsize_0_for_cython_array; + PyObject *__pyx_n_s_kind; + PyObject *__pyx_n_s_kwargs; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_memview; + PyObject *__pyx_n_s_mode; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_name_2; + PyObject *__pyx_n_s_ndim; + PyObject *__pyx_n_s_new; + PyObject *__pyx_kp_s_no_default___reduce___due_to_non; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_obj; + PyObject *__pyx_n_s_object; + PyObject *__pyx_n_s_one_hot; + PyObject *__pyx_n_s_ones; + PyObject *__pyx_n_s_operator; + PyObject *__pyx_n_s_pack; + PyObject *__pyx_n_s_pickle; + PyObject *__pyx_n_s_plan_rotation; + PyObject *__pyx_n_s_polynomial; + PyObject *__pyx_n_s_polynomial_object; + PyObject *__pyx_n_s_pyx_PickleError; + PyObject *__pyx_n_s_pyx_checksum; + PyObject *__pyx_n_s_pyx_fuse_0cluster_statistics; + PyObject *__pyx_n_s_pyx_fuse_0elementary_arithmeti; + PyObject *__pyx_n_s_pyx_fuse_0is_equal; + PyObject *__pyx_n_s_pyx_fuse_0is_null; + PyObject *__pyx_n_s_pyx_fuse_0plan_rotation; + PyObject *__pyx_n_s_pyx_fuse_0polynomial; + PyObject *__pyx_n_s_pyx_fuse_1cluster_statistics; + PyObject *__pyx_n_s_pyx_fuse_1elementary_arithmeti; + PyObject *__pyx_n_s_pyx_fuse_1is_equal; + PyObject *__pyx_n_s_pyx_fuse_1is_null; + PyObject *__pyx_n_s_pyx_fuse_1plan_rotation; + PyObject *__pyx_n_s_pyx_fuse_1polynomial; + PyObject *__pyx_n_s_pyx_fuse_2elementary_arithmeti; + PyObject *__pyx_n_s_pyx_fuse_2is_equal; + PyObject *__pyx_n_s_pyx_fuse_2is_null; + PyObject *__pyx_n_s_pyx_fuse_2plan_rotation; + PyObject *__pyx_n_s_pyx_fuse_2polynomial; + PyObject *__pyx_n_s_pyx_fuse_3elementary_arithmeti; + PyObject *__pyx_n_s_pyx_fuse_3is_equal; + PyObject *__pyx_n_s_pyx_fuse_3is_null; + PyObject *__pyx_n_s_pyx_fuse_3plan_rotation; + PyObject *__pyx_n_s_pyx_fuse_3polynomial; + PyObject *__pyx_n_s_pyx_fuse_4elementary_arithmeti; + PyObject *__pyx_n_s_pyx_fuse_4is_equal; + PyObject *__pyx_n_s_pyx_fuse_4is_null; + PyObject *__pyx_n_s_pyx_fuse_4plan_rotation; + PyObject *__pyx_n_s_pyx_fuse_4polynomial; + PyObject *__pyx_n_s_pyx_result; + PyObject *__pyx_n_s_pyx_state; + PyObject *__pyx_n_s_pyx_type; + PyObject *__pyx_n_s_pyx_unpickle_Enum; + PyObject *__pyx_n_s_pyx_vtable; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_reduce; + PyObject *__pyx_n_s_reduce_cython; + PyObject *__pyx_n_s_reduce_ex; + PyObject *__pyx_n_s_register; + PyObject *__pyx_n_s_s; + PyObject *__pyx_n_s_setstate; + PyObject *__pyx_n_s_setstate_cython; + PyObject *__pyx_n_s_shape; + PyObject *__pyx_n_s_signatures; + PyObject *__pyx_n_s_sin_vec; + PyObject *__pyx_n_s_size; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_split; + PyObject *__pyx_n_s_start; + PyObject *__pyx_n_s_step; + PyObject *__pyx_n_s_stop; + PyObject *__pyx_kp_s_strided_and_direct; + PyObject *__pyx_kp_s_strided_and_direct_or_indirect; + PyObject *__pyx_kp_s_strided_and_indirect; + PyObject *__pyx_kp_s_stringsource; + PyObject *__pyx_n_s_strip; + PyObject *__pyx_n_s_struct; + PyObject *__pyx_n_s_sys; + PyObject *__pyx_n_s_test; + PyObject *__pyx_kp_s_unable_to_allocate_array_data; + PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; + PyObject *__pyx_n_s_unpack; + PyObject *__pyx_n_s_update; + PyObject *__pyx_n_s_values; + PyObject *__pyx_n_s_version_info; + PyObject *__pyx_n_s_zeros; + PyObject *__pyx_int_0; + PyObject *__pyx_int_1; + PyObject *__pyx_int_2; + PyObject *__pyx_int_3; + PyObject *__pyx_int_5; + PyObject *__pyx_int_6; + PyObject *__pyx_int_112105877; + PyObject *__pyx_int_136983863; + PyObject *__pyx_int_184977713; + PyObject *__pyx_int_neg_1; + PyObject *__pyx_slice__5; + PyObject *__pyx_tuple__4; + PyObject *__pyx_tuple__8; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__10; + PyObject *__pyx_tuple__13; + PyObject *__pyx_tuple__14; + PyObject *__pyx_tuple__17; + PyObject *__pyx_tuple__18; + PyObject *__pyx_tuple__19; + PyObject *__pyx_tuple__20; + PyObject *__pyx_tuple__21; + PyObject *__pyx_tuple__22; + PyObject *__pyx_tuple__23; + PyObject *__pyx_tuple__24; + PyObject *__pyx_tuple__25; + PyObject *__pyx_tuple__26; + PyObject *__pyx_tuple__28; + PyObject *__pyx_tuple__30; + PyObject *__pyx_tuple__38; + PyObject *__pyx_tuple__49; + PyObject *__pyx_tuple__56; + PyObject *__pyx_tuple__63; + PyObject *__pyx_codeobj__27; + PyObject *__pyx_codeobj__29; + PyObject *__pyx_codeobj__31; + PyObject *__pyx_codeobj__32; + PyObject *__pyx_codeobj__33; + PyObject *__pyx_codeobj__34; + PyObject *__pyx_codeobj__35; + PyObject *__pyx_codeobj__36; + PyObject *__pyx_codeobj__37; + PyObject *__pyx_codeobj__39; + PyObject *__pyx_codeobj__40; + PyObject *__pyx_codeobj__41; + PyObject *__pyx_codeobj__42; + PyObject *__pyx_codeobj__43; + PyObject *__pyx_codeobj__44; + PyObject *__pyx_codeobj__45; + PyObject *__pyx_codeobj__46; + PyObject *__pyx_codeobj__47; + PyObject *__pyx_codeobj__48; + PyObject *__pyx_codeobj__50; + PyObject *__pyx_codeobj__51; + PyObject *__pyx_codeobj__52; + PyObject *__pyx_codeobj__53; + PyObject *__pyx_codeobj__54; + PyObject *__pyx_codeobj__55; + PyObject *__pyx_codeobj__57; + PyObject *__pyx_codeobj__58; + PyObject *__pyx_codeobj__59; + PyObject *__pyx_codeobj__60; + PyObject *__pyx_codeobj__61; + PyObject *__pyx_codeobj__62; + PyObject *__pyx_codeobj__64; + PyObject *__pyx_codeobj__65; + PyObject *__pyx_codeobj__66; + PyObject *__pyx_codeobj__67; + PyObject *__pyx_codeobj__68; + PyObject *__pyx_codeobj__69; + PyObject *__pyx_codeobj__70; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_array_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_array); + Py_CLEAR(clear_module_state->__pyx_MemviewEnum_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_MemviewEnum); + Py_CLEAR(clear_module_state->__pyx_memoryview_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryview); + Py_CLEAR(clear_module_state->__pyx_memoryviewslice_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryviewslice); + Py_CLEAR(clear_module_state->__pyx_kp_u_); + Py_CLEAR(clear_module_state->__pyx_n_s_ASCII); + Py_CLEAR(clear_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_CLEAR(clear_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_CLEAR(clear_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_CLEAR(clear_module_state->__pyx_n_s_EPSILON); + Py_CLEAR(clear_module_state->__pyx_n_s_Ellipsis); + Py_CLEAR(clear_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_CLEAR(clear_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_n_s_IndexError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_CLEAR(clear_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_CLEAR(clear_module_state->__pyx_kp_s_No_matching_signature_found); + Py_CLEAR(clear_module_state->__pyx_n_b_O); + Py_CLEAR(clear_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_Sequence); + Py_CLEAR(clear_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); + Py_CLEAR(clear_module_state->__pyx_n_s_View_MemoryView); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_kp_s__11); + Py_CLEAR(clear_module_state->__pyx_kp_s__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__15); + Py_CLEAR(clear_module_state->__pyx_kp_u__16); + Py_CLEAR(clear_module_state->__pyx_kp_u__2); + Py_CLEAR(clear_module_state->__pyx_n_s__3); + Py_CLEAR(clear_module_state->__pyx_kp_u__3); + Py_CLEAR(clear_module_state->__pyx_kp_u__6); + Py_CLEAR(clear_module_state->__pyx_kp_u__7); + Py_CLEAR(clear_module_state->__pyx_n_s__71); + Py_CLEAR(clear_module_state->__pyx_n_s_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_allocate_buffer); + Py_CLEAR(clear_module_state->__pyx_kp_u_and); + Py_CLEAR(clear_module_state->__pyx_n_s_args); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_base); + Py_CLEAR(clear_module_state->__pyx_n_s_c); + Py_CLEAR(clear_module_state->__pyx_n_u_c); + Py_CLEAR(clear_module_state->__pyx_n_s_cats); + Py_CLEAR(clear_module_state->__pyx_n_s_class); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_cluster_statistics); + Py_CLEAR(clear_module_state->__pyx_n_s_coef); + Py_CLEAR(clear_module_state->__pyx_n_s_collections); + Py_CLEAR(clear_module_state->__pyx_kp_s_collections_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_combinations_np); + Py_CLEAR(clear_module_state->__pyx_n_s_concatenate); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_CLEAR(clear_module_state->__pyx_n_s_cos_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_count); + Py_CLEAR(clear_module_state->__pyx_n_s_defaults); + Py_CLEAR(clear_module_state->__pyx_n_s_degree); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype_is_object); + Py_CLEAR(clear_module_state->__pyx_n_s_elementary_arithmetics); + Py_CLEAR(clear_module_state->__pyx_n_s_empty); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_encode); + Py_CLEAR(clear_module_state->__pyx_n_s_enumerate); + Py_CLEAR(clear_module_state->__pyx_n_s_error); + Py_CLEAR(clear_module_state->__pyx_n_s_feature_gen); + Py_CLEAR(clear_module_state->__pyx_n_s_flags); + Py_CLEAR(clear_module_state->__pyx_n_s_float32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_float64); + Py_CLEAR(clear_module_state->__pyx_n_s_float64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_format); + Py_CLEAR(clear_module_state->__pyx_n_s_fortran); + Py_CLEAR(clear_module_state->__pyx_n_u_fortran); + Py_CLEAR(clear_module_state->__pyx_n_s_fused_sigindex); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_feature_generation_featur); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_kp_u_got); + Py_CLEAR(clear_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_id); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns_a); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns_b); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns_x); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns_y); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_index); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_int16_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_int64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_is_equal); + Py_CLEAR(clear_module_state->__pyx_n_s_is_equal_object); + Py_CLEAR(clear_module_state->__pyx_n_s_is_null); + Py_CLEAR(clear_module_state->__pyx_n_s_is_null_object); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_itemsize); + Py_CLEAR(clear_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_CLEAR(clear_module_state->__pyx_n_s_kind); + Py_CLEAR(clear_module_state->__pyx_n_s_kwargs); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_memview); + Py_CLEAR(clear_module_state->__pyx_n_s_mode); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_name_2); + Py_CLEAR(clear_module_state->__pyx_n_s_ndim); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_object); + Py_CLEAR(clear_module_state->__pyx_n_s_one_hot); + Py_CLEAR(clear_module_state->__pyx_n_s_ones); + Py_CLEAR(clear_module_state->__pyx_n_s_operator); + Py_CLEAR(clear_module_state->__pyx_n_s_pack); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_plan_rotation); + Py_CLEAR(clear_module_state->__pyx_n_s_polynomial); + Py_CLEAR(clear_module_state->__pyx_n_s_polynomial_object); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0cluster_statistics); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0elementary_arithmeti); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0is_equal); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0is_null); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0plan_rotation); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0polynomial); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1cluster_statistics); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1elementary_arithmeti); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1is_equal); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1is_null); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1plan_rotation); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1polynomial); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2elementary_arithmeti); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2is_equal); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2is_null); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2plan_rotation); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_2polynomial); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3elementary_arithmeti); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3is_equal); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3is_null); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3plan_rotation); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_3polynomial); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4elementary_arithmeti); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4is_equal); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4is_null); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4plan_rotation); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_4polynomial); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_register); + Py_CLEAR(clear_module_state->__pyx_n_s_s); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_shape); + Py_CLEAR(clear_module_state->__pyx_n_s_signatures); + Py_CLEAR(clear_module_state->__pyx_n_s_sin_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_size); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_split); + Py_CLEAR(clear_module_state->__pyx_n_s_start); + Py_CLEAR(clear_module_state->__pyx_n_s_step); + Py_CLEAR(clear_module_state->__pyx_n_s_stop); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_strip); + Py_CLEAR(clear_module_state->__pyx_n_s_struct); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_CLEAR(clear_module_state->__pyx_n_s_unpack); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_values); + Py_CLEAR(clear_module_state->__pyx_n_s_version_info); + Py_CLEAR(clear_module_state->__pyx_n_s_zeros); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_2); + Py_CLEAR(clear_module_state->__pyx_int_3); + Py_CLEAR(clear_module_state->__pyx_int_5); + Py_CLEAR(clear_module_state->__pyx_int_6); + Py_CLEAR(clear_module_state->__pyx_int_112105877); + Py_CLEAR(clear_module_state->__pyx_int_136983863); + Py_CLEAR(clear_module_state->__pyx_int_184977713); + Py_CLEAR(clear_module_state->__pyx_int_neg_1); + Py_CLEAR(clear_module_state->__pyx_slice__5); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_tuple__8); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__10); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__17); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__19); + Py_CLEAR(clear_module_state->__pyx_tuple__20); + Py_CLEAR(clear_module_state->__pyx_tuple__21); + Py_CLEAR(clear_module_state->__pyx_tuple__22); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__24); + Py_CLEAR(clear_module_state->__pyx_tuple__25); + Py_CLEAR(clear_module_state->__pyx_tuple__26); + Py_CLEAR(clear_module_state->__pyx_tuple__28); + Py_CLEAR(clear_module_state->__pyx_tuple__30); + Py_CLEAR(clear_module_state->__pyx_tuple__38); + Py_CLEAR(clear_module_state->__pyx_tuple__49); + Py_CLEAR(clear_module_state->__pyx_tuple__56); + Py_CLEAR(clear_module_state->__pyx_tuple__63); + Py_CLEAR(clear_module_state->__pyx_codeobj__27); + Py_CLEAR(clear_module_state->__pyx_codeobj__29); + Py_CLEAR(clear_module_state->__pyx_codeobj__31); + Py_CLEAR(clear_module_state->__pyx_codeobj__32); + Py_CLEAR(clear_module_state->__pyx_codeobj__33); + Py_CLEAR(clear_module_state->__pyx_codeobj__34); + Py_CLEAR(clear_module_state->__pyx_codeobj__35); + Py_CLEAR(clear_module_state->__pyx_codeobj__36); + Py_CLEAR(clear_module_state->__pyx_codeobj__37); + Py_CLEAR(clear_module_state->__pyx_codeobj__39); + Py_CLEAR(clear_module_state->__pyx_codeobj__40); + Py_CLEAR(clear_module_state->__pyx_codeobj__41); + Py_CLEAR(clear_module_state->__pyx_codeobj__42); + Py_CLEAR(clear_module_state->__pyx_codeobj__43); + Py_CLEAR(clear_module_state->__pyx_codeobj__44); + Py_CLEAR(clear_module_state->__pyx_codeobj__45); + Py_CLEAR(clear_module_state->__pyx_codeobj__46); + Py_CLEAR(clear_module_state->__pyx_codeobj__47); + Py_CLEAR(clear_module_state->__pyx_codeobj__48); + Py_CLEAR(clear_module_state->__pyx_codeobj__50); + Py_CLEAR(clear_module_state->__pyx_codeobj__51); + Py_CLEAR(clear_module_state->__pyx_codeobj__52); + Py_CLEAR(clear_module_state->__pyx_codeobj__53); + Py_CLEAR(clear_module_state->__pyx_codeobj__54); + Py_CLEAR(clear_module_state->__pyx_codeobj__55); + Py_CLEAR(clear_module_state->__pyx_codeobj__57); + Py_CLEAR(clear_module_state->__pyx_codeobj__58); + Py_CLEAR(clear_module_state->__pyx_codeobj__59); + Py_CLEAR(clear_module_state->__pyx_codeobj__60); + Py_CLEAR(clear_module_state->__pyx_codeobj__61); + Py_CLEAR(clear_module_state->__pyx_codeobj__62); + Py_CLEAR(clear_module_state->__pyx_codeobj__64); + Py_CLEAR(clear_module_state->__pyx_codeobj__65); + Py_CLEAR(clear_module_state->__pyx_codeobj__66); + Py_CLEAR(clear_module_state->__pyx_codeobj__67); + Py_CLEAR(clear_module_state->__pyx_codeobj__68); + Py_CLEAR(clear_module_state->__pyx_codeobj__69); + Py_CLEAR(clear_module_state->__pyx_codeobj__70); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_array_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_array); + Py_VISIT(traverse_module_state->__pyx_MemviewEnum_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_MemviewEnum); + Py_VISIT(traverse_module_state->__pyx_memoryview_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryview); + Py_VISIT(traverse_module_state->__pyx_memoryviewslice_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryviewslice); + Py_VISIT(traverse_module_state->__pyx_kp_u_); + Py_VISIT(traverse_module_state->__pyx_n_s_ASCII); + Py_VISIT(traverse_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_VISIT(traverse_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_VISIT(traverse_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_VISIT(traverse_module_state->__pyx_n_s_EPSILON); + Py_VISIT(traverse_module_state->__pyx_n_s_Ellipsis); + Py_VISIT(traverse_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_VISIT(traverse_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_n_s_IndexError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_VISIT(traverse_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_VISIT(traverse_module_state->__pyx_kp_s_No_matching_signature_found); + Py_VISIT(traverse_module_state->__pyx_n_b_O); + Py_VISIT(traverse_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_Sequence); + Py_VISIT(traverse_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); + Py_VISIT(traverse_module_state->__pyx_n_s_View_MemoryView); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_kp_s__11); + Py_VISIT(traverse_module_state->__pyx_kp_s__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__15); + Py_VISIT(traverse_module_state->__pyx_kp_u__16); + Py_VISIT(traverse_module_state->__pyx_kp_u__2); + Py_VISIT(traverse_module_state->__pyx_n_s__3); + Py_VISIT(traverse_module_state->__pyx_kp_u__3); + Py_VISIT(traverse_module_state->__pyx_kp_u__6); + Py_VISIT(traverse_module_state->__pyx_kp_u__7); + Py_VISIT(traverse_module_state->__pyx_n_s__71); + Py_VISIT(traverse_module_state->__pyx_n_s_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_allocate_buffer); + Py_VISIT(traverse_module_state->__pyx_kp_u_and); + Py_VISIT(traverse_module_state->__pyx_n_s_args); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_base); + Py_VISIT(traverse_module_state->__pyx_n_s_c); + Py_VISIT(traverse_module_state->__pyx_n_u_c); + Py_VISIT(traverse_module_state->__pyx_n_s_cats); + Py_VISIT(traverse_module_state->__pyx_n_s_class); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_cluster_statistics); + Py_VISIT(traverse_module_state->__pyx_n_s_coef); + Py_VISIT(traverse_module_state->__pyx_n_s_collections); + Py_VISIT(traverse_module_state->__pyx_kp_s_collections_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_combinations_np); + Py_VISIT(traverse_module_state->__pyx_n_s_concatenate); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_VISIT(traverse_module_state->__pyx_n_s_cos_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_count); + Py_VISIT(traverse_module_state->__pyx_n_s_defaults); + Py_VISIT(traverse_module_state->__pyx_n_s_degree); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype_is_object); + Py_VISIT(traverse_module_state->__pyx_n_s_elementary_arithmetics); + Py_VISIT(traverse_module_state->__pyx_n_s_empty); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_encode); + Py_VISIT(traverse_module_state->__pyx_n_s_enumerate); + Py_VISIT(traverse_module_state->__pyx_n_s_error); + Py_VISIT(traverse_module_state->__pyx_n_s_feature_gen); + Py_VISIT(traverse_module_state->__pyx_n_s_flags); + Py_VISIT(traverse_module_state->__pyx_n_s_float32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_float64); + Py_VISIT(traverse_module_state->__pyx_n_s_float64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_format); + Py_VISIT(traverse_module_state->__pyx_n_s_fortran); + Py_VISIT(traverse_module_state->__pyx_n_u_fortran); + Py_VISIT(traverse_module_state->__pyx_n_s_fused_sigindex); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_feature_generation_featur); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_kp_u_got); + Py_VISIT(traverse_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_id); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns_a); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns_b); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns_x); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns_y); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_index); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_int16_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_int64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_is_equal); + Py_VISIT(traverse_module_state->__pyx_n_s_is_equal_object); + Py_VISIT(traverse_module_state->__pyx_n_s_is_null); + Py_VISIT(traverse_module_state->__pyx_n_s_is_null_object); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_itemsize); + Py_VISIT(traverse_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_VISIT(traverse_module_state->__pyx_n_s_kind); + Py_VISIT(traverse_module_state->__pyx_n_s_kwargs); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_memview); + Py_VISIT(traverse_module_state->__pyx_n_s_mode); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_name_2); + Py_VISIT(traverse_module_state->__pyx_n_s_ndim); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_object); + Py_VISIT(traverse_module_state->__pyx_n_s_one_hot); + Py_VISIT(traverse_module_state->__pyx_n_s_ones); + Py_VISIT(traverse_module_state->__pyx_n_s_operator); + Py_VISIT(traverse_module_state->__pyx_n_s_pack); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_plan_rotation); + Py_VISIT(traverse_module_state->__pyx_n_s_polynomial); + Py_VISIT(traverse_module_state->__pyx_n_s_polynomial_object); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0cluster_statistics); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0elementary_arithmeti); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0is_equal); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0is_null); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0plan_rotation); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0polynomial); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1cluster_statistics); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1elementary_arithmeti); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1is_equal); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1is_null); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1plan_rotation); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1polynomial); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2elementary_arithmeti); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2is_equal); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2is_null); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2plan_rotation); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_2polynomial); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3elementary_arithmeti); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3is_equal); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3is_null); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3plan_rotation); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_3polynomial); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4elementary_arithmeti); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4is_equal); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4is_null); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4plan_rotation); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_4polynomial); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_register); + Py_VISIT(traverse_module_state->__pyx_n_s_s); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_shape); + Py_VISIT(traverse_module_state->__pyx_n_s_signatures); + Py_VISIT(traverse_module_state->__pyx_n_s_sin_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_size); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_split); + Py_VISIT(traverse_module_state->__pyx_n_s_start); + Py_VISIT(traverse_module_state->__pyx_n_s_step); + Py_VISIT(traverse_module_state->__pyx_n_s_stop); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_strip); + Py_VISIT(traverse_module_state->__pyx_n_s_struct); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_VISIT(traverse_module_state->__pyx_n_s_unpack); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_values); + Py_VISIT(traverse_module_state->__pyx_n_s_version_info); + Py_VISIT(traverse_module_state->__pyx_n_s_zeros); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_2); + Py_VISIT(traverse_module_state->__pyx_int_3); + Py_VISIT(traverse_module_state->__pyx_int_5); + Py_VISIT(traverse_module_state->__pyx_int_6); + Py_VISIT(traverse_module_state->__pyx_int_112105877); + Py_VISIT(traverse_module_state->__pyx_int_136983863); + Py_VISIT(traverse_module_state->__pyx_int_184977713); + Py_VISIT(traverse_module_state->__pyx_int_neg_1); + Py_VISIT(traverse_module_state->__pyx_slice__5); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_tuple__8); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__10); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__17); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__19); + Py_VISIT(traverse_module_state->__pyx_tuple__20); + Py_VISIT(traverse_module_state->__pyx_tuple__21); + Py_VISIT(traverse_module_state->__pyx_tuple__22); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__24); + Py_VISIT(traverse_module_state->__pyx_tuple__25); + Py_VISIT(traverse_module_state->__pyx_tuple__26); + Py_VISIT(traverse_module_state->__pyx_tuple__28); + Py_VISIT(traverse_module_state->__pyx_tuple__30); + Py_VISIT(traverse_module_state->__pyx_tuple__38); + Py_VISIT(traverse_module_state->__pyx_tuple__49); + Py_VISIT(traverse_module_state->__pyx_tuple__56); + Py_VISIT(traverse_module_state->__pyx_tuple__63); + Py_VISIT(traverse_module_state->__pyx_codeobj__27); + Py_VISIT(traverse_module_state->__pyx_codeobj__29); + Py_VISIT(traverse_module_state->__pyx_codeobj__31); + Py_VISIT(traverse_module_state->__pyx_codeobj__32); + Py_VISIT(traverse_module_state->__pyx_codeobj__33); + Py_VISIT(traverse_module_state->__pyx_codeobj__34); + Py_VISIT(traverse_module_state->__pyx_codeobj__35); + Py_VISIT(traverse_module_state->__pyx_codeobj__36); + Py_VISIT(traverse_module_state->__pyx_codeobj__37); + Py_VISIT(traverse_module_state->__pyx_codeobj__39); + Py_VISIT(traverse_module_state->__pyx_codeobj__40); + Py_VISIT(traverse_module_state->__pyx_codeobj__41); + Py_VISIT(traverse_module_state->__pyx_codeobj__42); + Py_VISIT(traverse_module_state->__pyx_codeobj__43); + Py_VISIT(traverse_module_state->__pyx_codeobj__44); + Py_VISIT(traverse_module_state->__pyx_codeobj__45); + Py_VISIT(traverse_module_state->__pyx_codeobj__46); + Py_VISIT(traverse_module_state->__pyx_codeobj__47); + Py_VISIT(traverse_module_state->__pyx_codeobj__48); + Py_VISIT(traverse_module_state->__pyx_codeobj__50); + Py_VISIT(traverse_module_state->__pyx_codeobj__51); + Py_VISIT(traverse_module_state->__pyx_codeobj__52); + Py_VISIT(traverse_module_state->__pyx_codeobj__53); + Py_VISIT(traverse_module_state->__pyx_codeobj__54); + Py_VISIT(traverse_module_state->__pyx_codeobj__55); + Py_VISIT(traverse_module_state->__pyx_codeobj__57); + Py_VISIT(traverse_module_state->__pyx_codeobj__58); + Py_VISIT(traverse_module_state->__pyx_codeobj__59); + Py_VISIT(traverse_module_state->__pyx_codeobj__60); + Py_VISIT(traverse_module_state->__pyx_codeobj__61); + Py_VISIT(traverse_module_state->__pyx_codeobj__62); + Py_VISIT(traverse_module_state->__pyx_codeobj__64); + Py_VISIT(traverse_module_state->__pyx_codeobj__65); + Py_VISIT(traverse_module_state->__pyx_codeobj__66); + Py_VISIT(traverse_module_state->__pyx_codeobj__67); + Py_VISIT(traverse_module_state->__pyx_codeobj__68); + Py_VISIT(traverse_module_state->__pyx_codeobj__69); + Py_VISIT(traverse_module_state->__pyx_codeobj__70); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#define __pyx_type___pyx_array __pyx_mstate_global->__pyx_type___pyx_array +#define __pyx_type___pyx_MemviewEnum __pyx_mstate_global->__pyx_type___pyx_MemviewEnum +#define __pyx_type___pyx_memoryview __pyx_mstate_global->__pyx_type___pyx_memoryview +#define __pyx_type___pyx_memoryviewslice __pyx_mstate_global->__pyx_type___pyx_memoryviewslice +#endif +#define __pyx_array_type __pyx_mstate_global->__pyx_array_type +#define __pyx_MemviewEnum_type __pyx_mstate_global->__pyx_MemviewEnum_type +#define __pyx_memoryview_type __pyx_mstate_global->__pyx_memoryview_type +#define __pyx_memoryviewslice_type __pyx_mstate_global->__pyx_memoryviewslice_type +#define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ +#define __pyx_n_s_ASCII __pyx_mstate_global->__pyx_n_s_ASCII +#define __pyx_kp_s_All_dimensions_preceding_dimensi __pyx_mstate_global->__pyx_kp_s_All_dimensions_preceding_dimensi +#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError +#define __pyx_kp_s_Buffer_view_does_not_expose_stri __pyx_mstate_global->__pyx_kp_s_Buffer_view_does_not_expose_stri +#define __pyx_kp_s_Can_only_create_a_buffer_that_is __pyx_mstate_global->__pyx_kp_s_Can_only_create_a_buffer_that_is +#define __pyx_kp_s_Cannot_assign_to_read_only_memor __pyx_mstate_global->__pyx_kp_s_Cannot_assign_to_read_only_memor +#define __pyx_kp_s_Cannot_create_writable_memory_vi __pyx_mstate_global->__pyx_kp_s_Cannot_create_writable_memory_vi +#define __pyx_kp_u_Cannot_index_with_type __pyx_mstate_global->__pyx_kp_u_Cannot_index_with_type +#define __pyx_kp_s_Cannot_transpose_memoryview_with __pyx_mstate_global->__pyx_kp_s_Cannot_transpose_memoryview_with +#define __pyx_kp_s_Dimension_d_is_not_direct __pyx_mstate_global->__pyx_kp_s_Dimension_d_is_not_direct +#define __pyx_n_s_EPSILON __pyx_mstate_global->__pyx_n_s_EPSILON +#define __pyx_n_s_Ellipsis __pyx_mstate_global->__pyx_n_s_Ellipsis +#define __pyx_kp_s_Empty_shape_tuple_for_cython_arr __pyx_mstate_global->__pyx_kp_s_Empty_shape_tuple_for_cython_arr +#define __pyx_kp_s_Expected_at_least_d_argument_s_g __pyx_mstate_global->__pyx_kp_s_Expected_at_least_d_argument_s_g +#define __pyx_kp_s_Function_call_with_ambiguous_arg __pyx_mstate_global->__pyx_kp_s_Function_call_with_ambiguous_arg +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_n_s_IndexError __pyx_mstate_global->__pyx_n_s_IndexError +#define __pyx_kp_s_Index_out_of_bounds_axis_d __pyx_mstate_global->__pyx_kp_s_Index_out_of_bounds_axis_d +#define __pyx_kp_s_Indirect_dimensions_not_supporte __pyx_mstate_global->__pyx_kp_s_Indirect_dimensions_not_supporte +#define __pyx_kp_u_Invalid_mode_expected_c_or_fortr __pyx_mstate_global->__pyx_kp_u_Invalid_mode_expected_c_or_fortr +#define __pyx_kp_u_Invalid_shape_in_axis __pyx_mstate_global->__pyx_kp_u_Invalid_shape_in_axis +#define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError +#define __pyx_kp_s_MemoryView_of_r_at_0x_x __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_at_0x_x +#define __pyx_kp_s_MemoryView_of_r_object __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_object +#define __pyx_kp_s_No_matching_signature_found __pyx_mstate_global->__pyx_kp_s_No_matching_signature_found +#define __pyx_n_b_O __pyx_mstate_global->__pyx_n_b_O +#define __pyx_kp_u_Out_of_bounds_on_buffer_access_a __pyx_mstate_global->__pyx_kp_u_Out_of_bounds_on_buffer_access_a +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_Sequence __pyx_mstate_global->__pyx_n_s_Sequence +#define __pyx_kp_s_Step_may_not_be_zero_axis_d __pyx_mstate_global->__pyx_kp_s_Step_may_not_be_zero_axis_d +#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError +#define __pyx_kp_s_Unable_to_convert_item_to_object __pyx_mstate_global->__pyx_kp_s_Unable_to_convert_item_to_object +#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError +#define __pyx_n_s_View_MemoryView __pyx_mstate_global->__pyx_n_s_View_MemoryView +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_kp_s__11 __pyx_mstate_global->__pyx_kp_s__11 +#define __pyx_kp_s__12 __pyx_mstate_global->__pyx_kp_s__12 +#define __pyx_kp_u__12 __pyx_mstate_global->__pyx_kp_u__12 +#define __pyx_kp_u__15 __pyx_mstate_global->__pyx_kp_u__15 +#define __pyx_kp_u__16 __pyx_mstate_global->__pyx_kp_u__16 +#define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 +#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 +#define __pyx_kp_u__3 __pyx_mstate_global->__pyx_kp_u__3 +#define __pyx_kp_u__6 __pyx_mstate_global->__pyx_kp_u__6 +#define __pyx_kp_u__7 __pyx_mstate_global->__pyx_kp_u__7 +#define __pyx_n_s__71 __pyx_mstate_global->__pyx_n_s__71 +#define __pyx_n_s_abc __pyx_mstate_global->__pyx_n_s_abc +#define __pyx_n_s_allocate_buffer __pyx_mstate_global->__pyx_n_s_allocate_buffer +#define __pyx_kp_u_and __pyx_mstate_global->__pyx_kp_u_and +#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_axis __pyx_mstate_global->__pyx_n_s_axis +#define __pyx_n_s_base __pyx_mstate_global->__pyx_n_s_base +#define __pyx_n_s_c __pyx_mstate_global->__pyx_n_s_c +#define __pyx_n_u_c __pyx_mstate_global->__pyx_n_u_c +#define __pyx_n_s_cats __pyx_mstate_global->__pyx_n_s_cats +#define __pyx_n_s_class __pyx_mstate_global->__pyx_n_s_class +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_cluster_statistics __pyx_mstate_global->__pyx_n_s_cluster_statistics +#define __pyx_n_s_coef __pyx_mstate_global->__pyx_n_s_coef +#define __pyx_n_s_collections __pyx_mstate_global->__pyx_n_s_collections +#define __pyx_kp_s_collections_abc __pyx_mstate_global->__pyx_kp_s_collections_abc +#define __pyx_n_s_combinations_np __pyx_mstate_global->__pyx_n_s_combinations_np +#define __pyx_n_s_concatenate __pyx_mstate_global->__pyx_n_s_concatenate +#define __pyx_kp_s_contiguous_and_direct __pyx_mstate_global->__pyx_kp_s_contiguous_and_direct +#define __pyx_kp_s_contiguous_and_indirect __pyx_mstate_global->__pyx_kp_s_contiguous_and_indirect +#define __pyx_n_s_cos_vec __pyx_mstate_global->__pyx_n_s_cos_vec +#define __pyx_n_s_count __pyx_mstate_global->__pyx_n_s_count +#define __pyx_n_s_defaults __pyx_mstate_global->__pyx_n_s_defaults +#define __pyx_n_s_degree __pyx_mstate_global->__pyx_n_s_degree +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_dtype __pyx_mstate_global->__pyx_n_s_dtype +#define __pyx_n_s_dtype_is_object __pyx_mstate_global->__pyx_n_s_dtype_is_object +#define __pyx_n_s_elementary_arithmetics __pyx_mstate_global->__pyx_n_s_elementary_arithmetics +#define __pyx_n_s_empty __pyx_mstate_global->__pyx_n_s_empty +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode +#define __pyx_n_s_enumerate __pyx_mstate_global->__pyx_n_s_enumerate +#define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error +#define __pyx_n_s_feature_gen __pyx_mstate_global->__pyx_n_s_feature_gen +#define __pyx_n_s_flags __pyx_mstate_global->__pyx_n_s_flags +#define __pyx_n_s_float32_t __pyx_mstate_global->__pyx_n_s_float32_t +#define __pyx_n_s_float64 __pyx_mstate_global->__pyx_n_s_float64 +#define __pyx_n_s_float64_t __pyx_mstate_global->__pyx_n_s_float64_t +#define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format +#define __pyx_n_s_fortran __pyx_mstate_global->__pyx_n_s_fortran +#define __pyx_n_u_fortran __pyx_mstate_global->__pyx_n_u_fortran +#define __pyx_n_s_fused_sigindex __pyx_mstate_global->__pyx_n_s_fused_sigindex +#define __pyx_kp_s_gators_feature_generation_featur __pyx_mstate_global->__pyx_kp_s_gators_feature_generation_featur +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_kp_u_got __pyx_mstate_global->__pyx_kp_u_got +#define __pyx_kp_u_got_differing_extents_in_dimensi __pyx_mstate_global->__pyx_kp_u_got_differing_extents_in_dimensi +#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_idx_columns_a __pyx_mstate_global->__pyx_n_s_idx_columns_a +#define __pyx_n_s_idx_columns_b __pyx_mstate_global->__pyx_n_s_idx_columns_b +#define __pyx_n_s_idx_columns_x __pyx_mstate_global->__pyx_n_s_idx_columns_x +#define __pyx_n_s_idx_columns_y __pyx_mstate_global->__pyx_n_s_idx_columns_y +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_index __pyx_mstate_global->__pyx_n_s_index +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_int16_t __pyx_mstate_global->__pyx_n_s_int16_t +#define __pyx_n_s_int32_t __pyx_mstate_global->__pyx_n_s_int32_t +#define __pyx_n_s_int64_t __pyx_mstate_global->__pyx_n_s_int64_t +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_is_equal __pyx_mstate_global->__pyx_n_s_is_equal +#define __pyx_n_s_is_equal_object __pyx_mstate_global->__pyx_n_s_is_equal_object +#define __pyx_n_s_is_null __pyx_mstate_global->__pyx_n_s_is_null +#define __pyx_n_s_is_null_object __pyx_mstate_global->__pyx_n_s_is_null_object +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_itemsize __pyx_mstate_global->__pyx_n_s_itemsize +#define __pyx_kp_s_itemsize_0_for_cython_array __pyx_mstate_global->__pyx_kp_s_itemsize_0_for_cython_array +#define __pyx_n_s_kind __pyx_mstate_global->__pyx_n_s_kind +#define __pyx_n_s_kwargs __pyx_mstate_global->__pyx_n_s_kwargs +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_memview __pyx_mstate_global->__pyx_n_s_memview +#define __pyx_n_s_mode __pyx_mstate_global->__pyx_n_s_mode +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2 +#define __pyx_n_s_ndim __pyx_mstate_global->__pyx_n_s_ndim +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj +#define __pyx_n_s_object __pyx_mstate_global->__pyx_n_s_object +#define __pyx_n_s_one_hot __pyx_mstate_global->__pyx_n_s_one_hot +#define __pyx_n_s_ones __pyx_mstate_global->__pyx_n_s_ones +#define __pyx_n_s_operator __pyx_mstate_global->__pyx_n_s_operator +#define __pyx_n_s_pack __pyx_mstate_global->__pyx_n_s_pack +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_plan_rotation __pyx_mstate_global->__pyx_n_s_plan_rotation +#define __pyx_n_s_polynomial __pyx_mstate_global->__pyx_n_s_polynomial +#define __pyx_n_s_polynomial_object __pyx_mstate_global->__pyx_n_s_polynomial_object +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_fuse_0cluster_statistics __pyx_mstate_global->__pyx_n_s_pyx_fuse_0cluster_statistics +#define __pyx_n_s_pyx_fuse_0elementary_arithmeti __pyx_mstate_global->__pyx_n_s_pyx_fuse_0elementary_arithmeti +#define __pyx_n_s_pyx_fuse_0is_equal __pyx_mstate_global->__pyx_n_s_pyx_fuse_0is_equal +#define __pyx_n_s_pyx_fuse_0is_null __pyx_mstate_global->__pyx_n_s_pyx_fuse_0is_null +#define __pyx_n_s_pyx_fuse_0plan_rotation __pyx_mstate_global->__pyx_n_s_pyx_fuse_0plan_rotation +#define __pyx_n_s_pyx_fuse_0polynomial __pyx_mstate_global->__pyx_n_s_pyx_fuse_0polynomial +#define __pyx_n_s_pyx_fuse_1cluster_statistics __pyx_mstate_global->__pyx_n_s_pyx_fuse_1cluster_statistics +#define __pyx_n_s_pyx_fuse_1elementary_arithmeti __pyx_mstate_global->__pyx_n_s_pyx_fuse_1elementary_arithmeti +#define __pyx_n_s_pyx_fuse_1is_equal __pyx_mstate_global->__pyx_n_s_pyx_fuse_1is_equal +#define __pyx_n_s_pyx_fuse_1is_null __pyx_mstate_global->__pyx_n_s_pyx_fuse_1is_null +#define __pyx_n_s_pyx_fuse_1plan_rotation __pyx_mstate_global->__pyx_n_s_pyx_fuse_1plan_rotation +#define __pyx_n_s_pyx_fuse_1polynomial __pyx_mstate_global->__pyx_n_s_pyx_fuse_1polynomial +#define __pyx_n_s_pyx_fuse_2elementary_arithmeti __pyx_mstate_global->__pyx_n_s_pyx_fuse_2elementary_arithmeti +#define __pyx_n_s_pyx_fuse_2is_equal __pyx_mstate_global->__pyx_n_s_pyx_fuse_2is_equal +#define __pyx_n_s_pyx_fuse_2is_null __pyx_mstate_global->__pyx_n_s_pyx_fuse_2is_null +#define __pyx_n_s_pyx_fuse_2plan_rotation __pyx_mstate_global->__pyx_n_s_pyx_fuse_2plan_rotation +#define __pyx_n_s_pyx_fuse_2polynomial __pyx_mstate_global->__pyx_n_s_pyx_fuse_2polynomial +#define __pyx_n_s_pyx_fuse_3elementary_arithmeti __pyx_mstate_global->__pyx_n_s_pyx_fuse_3elementary_arithmeti +#define __pyx_n_s_pyx_fuse_3is_equal __pyx_mstate_global->__pyx_n_s_pyx_fuse_3is_equal +#define __pyx_n_s_pyx_fuse_3is_null __pyx_mstate_global->__pyx_n_s_pyx_fuse_3is_null +#define __pyx_n_s_pyx_fuse_3plan_rotation __pyx_mstate_global->__pyx_n_s_pyx_fuse_3plan_rotation +#define __pyx_n_s_pyx_fuse_3polynomial __pyx_mstate_global->__pyx_n_s_pyx_fuse_3polynomial +#define __pyx_n_s_pyx_fuse_4elementary_arithmeti __pyx_mstate_global->__pyx_n_s_pyx_fuse_4elementary_arithmeti +#define __pyx_n_s_pyx_fuse_4is_equal __pyx_mstate_global->__pyx_n_s_pyx_fuse_4is_equal +#define __pyx_n_s_pyx_fuse_4is_null __pyx_mstate_global->__pyx_n_s_pyx_fuse_4is_null +#define __pyx_n_s_pyx_fuse_4plan_rotation __pyx_mstate_global->__pyx_n_s_pyx_fuse_4plan_rotation +#define __pyx_n_s_pyx_fuse_4polynomial __pyx_mstate_global->__pyx_n_s_pyx_fuse_4polynomial +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_Enum __pyx_mstate_global->__pyx_n_s_pyx_unpickle_Enum +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_register __pyx_mstate_global->__pyx_n_s_register +#define __pyx_n_s_s __pyx_mstate_global->__pyx_n_s_s +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_shape __pyx_mstate_global->__pyx_n_s_shape +#define __pyx_n_s_signatures __pyx_mstate_global->__pyx_n_s_signatures +#define __pyx_n_s_sin_vec __pyx_mstate_global->__pyx_n_s_sin_vec +#define __pyx_n_s_size __pyx_mstate_global->__pyx_n_s_size +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split +#define __pyx_n_s_start __pyx_mstate_global->__pyx_n_s_start +#define __pyx_n_s_step __pyx_mstate_global->__pyx_n_s_step +#define __pyx_n_s_stop __pyx_mstate_global->__pyx_n_s_stop +#define __pyx_kp_s_strided_and_direct __pyx_mstate_global->__pyx_kp_s_strided_and_direct +#define __pyx_kp_s_strided_and_direct_or_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_direct_or_indirect +#define __pyx_kp_s_strided_and_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_indirect +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_strip __pyx_mstate_global->__pyx_n_s_strip +#define __pyx_n_s_struct __pyx_mstate_global->__pyx_n_s_struct +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_kp_s_unable_to_allocate_array_data __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_array_data +#define __pyx_kp_s_unable_to_allocate_shape_and_str __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_shape_and_str +#define __pyx_n_s_unpack __pyx_mstate_global->__pyx_n_s_unpack +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values +#define __pyx_n_s_version_info __pyx_mstate_global->__pyx_n_s_version_info +#define __pyx_n_s_zeros __pyx_mstate_global->__pyx_n_s_zeros +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 +#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 +#define __pyx_int_5 __pyx_mstate_global->__pyx_int_5 +#define __pyx_int_6 __pyx_mstate_global->__pyx_int_6 +#define __pyx_int_112105877 __pyx_mstate_global->__pyx_int_112105877 +#define __pyx_int_136983863 __pyx_mstate_global->__pyx_int_136983863 +#define __pyx_int_184977713 __pyx_mstate_global->__pyx_int_184977713 +#define __pyx_int_neg_1 __pyx_mstate_global->__pyx_int_neg_1 +#define __pyx_slice__5 __pyx_mstate_global->__pyx_slice__5 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 +#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 +#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 +#define __pyx_tuple__22 __pyx_mstate_global->__pyx_tuple__22 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24 +#define __pyx_tuple__25 __pyx_mstate_global->__pyx_tuple__25 +#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26 +#define __pyx_tuple__28 __pyx_mstate_global->__pyx_tuple__28 +#define __pyx_tuple__30 __pyx_mstate_global->__pyx_tuple__30 +#define __pyx_tuple__38 __pyx_mstate_global->__pyx_tuple__38 +#define __pyx_tuple__49 __pyx_mstate_global->__pyx_tuple__49 +#define __pyx_tuple__56 __pyx_mstate_global->__pyx_tuple__56 +#define __pyx_tuple__63 __pyx_mstate_global->__pyx_tuple__63 +#define __pyx_codeobj__27 __pyx_mstate_global->__pyx_codeobj__27 +#define __pyx_codeobj__29 __pyx_mstate_global->__pyx_codeobj__29 +#define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 +#define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 +#define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 +#define __pyx_codeobj__34 __pyx_mstate_global->__pyx_codeobj__34 +#define __pyx_codeobj__35 __pyx_mstate_global->__pyx_codeobj__35 +#define __pyx_codeobj__36 __pyx_mstate_global->__pyx_codeobj__36 +#define __pyx_codeobj__37 __pyx_mstate_global->__pyx_codeobj__37 +#define __pyx_codeobj__39 __pyx_mstate_global->__pyx_codeobj__39 +#define __pyx_codeobj__40 __pyx_mstate_global->__pyx_codeobj__40 +#define __pyx_codeobj__41 __pyx_mstate_global->__pyx_codeobj__41 +#define __pyx_codeobj__42 __pyx_mstate_global->__pyx_codeobj__42 +#define __pyx_codeobj__43 __pyx_mstate_global->__pyx_codeobj__43 +#define __pyx_codeobj__44 __pyx_mstate_global->__pyx_codeobj__44 +#define __pyx_codeobj__45 __pyx_mstate_global->__pyx_codeobj__45 +#define __pyx_codeobj__46 __pyx_mstate_global->__pyx_codeobj__46 +#define __pyx_codeobj__47 __pyx_mstate_global->__pyx_codeobj__47 +#define __pyx_codeobj__48 __pyx_mstate_global->__pyx_codeobj__48 +#define __pyx_codeobj__50 __pyx_mstate_global->__pyx_codeobj__50 +#define __pyx_codeobj__51 __pyx_mstate_global->__pyx_codeobj__51 +#define __pyx_codeobj__52 __pyx_mstate_global->__pyx_codeobj__52 +#define __pyx_codeobj__53 __pyx_mstate_global->__pyx_codeobj__53 +#define __pyx_codeobj__54 __pyx_mstate_global->__pyx_codeobj__54 +#define __pyx_codeobj__55 __pyx_mstate_global->__pyx_codeobj__55 +#define __pyx_codeobj__57 __pyx_mstate_global->__pyx_codeobj__57 +#define __pyx_codeobj__58 __pyx_mstate_global->__pyx_codeobj__58 +#define __pyx_codeobj__59 __pyx_mstate_global->__pyx_codeobj__59 +#define __pyx_codeobj__60 __pyx_mstate_global->__pyx_codeobj__60 +#define __pyx_codeobj__61 __pyx_mstate_global->__pyx_codeobj__61 +#define __pyx_codeobj__62 __pyx_mstate_global->__pyx_codeobj__62 +#define __pyx_codeobj__64 __pyx_mstate_global->__pyx_codeobj__64 +#define __pyx_codeobj__65 __pyx_mstate_global->__pyx_codeobj__65 +#define __pyx_codeobj__66 __pyx_mstate_global->__pyx_codeobj__66 +#define __pyx_codeobj__67 __pyx_mstate_global->__pyx_codeobj__67 +#define __pyx_codeobj__68 __pyx_mstate_global->__pyx_codeobj__68 +#define __pyx_codeobj__69 __pyx_mstate_global->__pyx_codeobj__69 +#define __pyx_codeobj__70 __pyx_mstate_global->__pyx_codeobj__70 +/* #### Code section: module_code ### */ + +/* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)__pyx_n_s_c)); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_itemsize)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_format)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mode); + if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_allocate_buffer); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 131, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 132, __pyx_L3_error) + } else { + + /* "View.MemoryView":132 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, __pyx_nargs); __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 131, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 131, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_dim; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + char *__pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_UCS4 __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":137 + * cdef Py_ssize_t dim + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 137, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 137, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":138 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + __pyx_t_2 = (!(__pyx_v_self->ndim != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":141 + * + * if not self.ndim: + * raise ValueError, "Empty shape tuple for cython.array" # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Empty_shape_tuple_for_cython_arr, 0, 0); + __PYX_ERR(1, 141, __pyx_L1_error) + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + } + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + __pyx_t_2 = (__pyx_v_itemsize <= 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":144 + * + * if itemsize <= 0: + * raise ValueError, "itemsize <= 0 for cython.array" # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_itemsize_0_for_cython_array, 0, 0); + __PYX_ERR(1, 144, __pyx_L1_error) + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + } + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_3 = (!__pyx_t_2); + if (__pyx_t_3) { + + /* "View.MemoryView":147 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_n_s_ASCII}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":148 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_format))) __PYX_ERR(1, 148, __pyx_L1_error) + __pyx_t_4 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":149 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 149, __pyx_L1_error) + } + __pyx_t_8 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) __PYX_ERR(1, 149, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_8; + + /* "View.MemoryView":152 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":153 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + __pyx_t_3 = (!(__pyx_v_self->_shape != 0)); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":156 + * + * if not self._shape: + * raise MemoryError, "unable to allocate shape and strides." # <<<<<<<<<<<<<< + * + * + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_shape_and_str, 0, 0); + __PYX_ERR(1, 156, __pyx_L1_error) + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + } + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + __pyx_t_7 = 0; + __pyx_t_4 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_4); + __pyx_t_1 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #endif + if (__pyx_t_1 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_9; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + __pyx_t_3 = (__pyx_v_dim <= 0); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":161 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_5 = PyTuple_New(5); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = 0; + __pyx_t_10 = 127; + __Pyx_INCREF(__pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_9 += 22; + __Pyx_GIVEREF(__pyx_kp_u_Invalid_shape_in_axis); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_6 = __Pyx_PyUnicode_From_int(__pyx_v_idx, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u_); + __pyx_t_9 += 2; + __Pyx_GIVEREF(__pyx_kp_u_); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u_); + __pyx_t_6 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u__2); + __pyx_t_9 += 1; + __Pyx_GIVEREF(__pyx_kp_u__2); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_kp_u__2); + __pyx_t_6 = __Pyx_PyUnicode_Join(__pyx_t_5, 5, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 161, __pyx_L1_error) + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":162 + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 165, __pyx_L1_error) + if (__pyx_t_3) { + + /* "View.MemoryView":166 + * cdef char order + * if mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * elif mode == 'fortran': + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":167 + * if mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * elif mode == 'fortran': + * order = b'F' + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 168, __pyx_L1_error) + if (likely(__pyx_t_3)) { + + /* "View.MemoryView":169 + * self.mode = u'c' + * elif mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * else: + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":170 + * elif mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":172 + * self.mode = u'fortran' + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_FormatSimple(__pyx_v_mode, __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 172, __pyx_L1_error) + } + __pyx_L11:; + + /* "View.MemoryView":174 + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) # <<<<<<<<<<<<<< + * + * self.free_data = allocate_buffer + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":176 + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":177 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * + * if allocate_buffer: + */ + __pyx_t_6 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 177, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_3; + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + if (__pyx_v_allocate_buffer) { + + /* "View.MemoryView":180 + * + * if allocate_buffer: + * _allocate_buffer(self) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_t_7 = __pyx_array_allocate_buffer(__pyx_v_self); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(1, 180, __pyx_L1_error) + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + } + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + char *__pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_ssize_t *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":184 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_t_1 = ((__pyx_v_flags & ((PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS) | PyBUF_ANY_CONTIGUOUS)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 186, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":187 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L4; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 188, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L4:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + __pyx_t_1 = (!((__pyx_v_flags & __pyx_v_bufmode) != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Can_only_create_a_buffer_that_is, 0, 0); + __PYX_ERR(1, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + } + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * + */ + __pyx_t_2 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_2; + + /* "View.MemoryView":193 + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_3; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":196 + * + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_4 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_4; + + /* "View.MemoryView":197 + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * else: + */ + __pyx_t_5 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":198 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * else: + * info.ndim = 1 + */ + __pyx_t_5 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_5; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + goto __pyx_L6; + } + + /* "View.MemoryView":200 + * info.strides = self._strides + * else: + * info.ndim = 1 # <<<<<<<<<<<<<< + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL + */ + /*else*/ { + __pyx_v_info->ndim = 1; + + /* "View.MemoryView":201 + * else: + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL # <<<<<<<<<<<<<< + * info.strides = NULL + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + __pyx_t_5 = (&__pyx_v_self->len); + } else { + __pyx_t_5 = NULL; + } + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":202 + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL # <<<<<<<<<<<<<< + * + * info.suboffsets = NULL + */ + __pyx_v_info->strides = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":204 + * info.strides = NULL + * + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":205 + * + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + */ + __pyx_t_3 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_3; + + /* "View.MemoryView":206 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":207 + * info.itemsize = self.itemsize + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_self->format; + } else { + __pyx_t_2 = NULL; + } + __pyx_v_info->format = __pyx_t_2; + + /* "View.MemoryView":208 + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + __pyx_t_1 = (__pyx_v_self->callback_free_data != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + if (__pyx_v_self->free_data) { + } else { + __pyx_t_1 = __pyx_v_self->free_data; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->data != NULL); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":215 + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) # <<<<<<<<<<<<<< + * free(self.data) + * PyObject_Free(self._shape) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + } + + /* "View.MemoryView":216 + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + } + __pyx_L3:; + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ +} + +/* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":221 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_memview", 1); + + /* "View.MemoryView":225 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":226 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + + /* "View.MemoryView":229 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getattr__", 1); + + /* "View.MemoryView":232 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":235 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 1); + + /* "View.MemoryView":238 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0))) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_i; + PyObject **__pyx_v_p; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":254 + * cdef PyObject **p + * + * self.free_data = True # <<<<<<<<<<<<<< + * self.data = malloc(self.len) + * if not self.data: + */ + __pyx_v_self->free_data = 1; + + /* "View.MemoryView":255 + * + * self.free_data = True + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError, "unable to allocate array data." + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + __pyx_t_1 = (!(__pyx_v_self->data != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":257 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError, "unable to allocate array data." # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_array_data, 0, 0); + __PYX_ERR(1, 257, __pyx_L1_error) + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":260 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":261 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len // self.itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_self->itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_self->itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_self->itemsize); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":262 + * p = self.data + * for i in range(self.len // self.itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * return 0 + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":263 + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * return 0 + * + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + } + + /* "View.MemoryView":264 + * p[i] = Py_None + * Py_INCREF(Py_None) + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_c_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + PyObject *__pyx_v_mode = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("array_cwrapper", 1); + + /* "View.MemoryView":270 + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. # <<<<<<<<<<<<<< + * + * if buf is NULL: + */ + __pyx_t_2 = ((__pyx_v_c_mode[0]) == 'f'); + if (__pyx_t_2) { + __Pyx_INCREF(__pyx_n_s_fortran); + __pyx_t_1 = __pyx_n_s_fortran; + } else { + __Pyx_INCREF(__pyx_n_s_c); + __pyx_t_1 = __pyx_n_s_c; + } + __pyx_v_mode = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + __pyx_t_2 = (__pyx_v_buf == NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":273 + * + * if buf is NULL: + * result = array.__new__(array, shape, itemsize, format, mode) # <<<<<<<<<<<<<< + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + */ + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_shape)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_mode)) __PYX_ERR(1, 273, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_4, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":275 + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + /*else*/ { + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_mode)) __PYX_ERR(1, 275, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 275, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_1, __pyx_t_4)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":276 + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":278 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_mode); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 304, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 304, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 304, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "View.MemoryView":305 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":307 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 349, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_dtype_is_object); + if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 349, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, __pyx_nargs); __PYX_ERR(1, 349, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_intptr_t __pyx_t_4; + size_t __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 1); + + /* "View.MemoryView":350 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":351 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_obj != Py_None); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":353 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_3 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 353, __pyx_L1_error) + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = (((PyObject *)__pyx_v_self->view.obj) == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":356 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + __pyx_t_1 = (!__PYX_CYTHON_ATOMICS_ENABLED()); + if (__pyx_t_1) { + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = (__pyx_memoryview_thread_locks_used < 8); + if (__pyx_t_1) { + + /* "View.MemoryView":361 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":362 + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":364 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":366 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(1, 366, __pyx_L1_error) + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + } + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":369 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = ((__pyx_v_self->view.format[0]) == 'O'); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_self->view.format[1]) == '\x00'); + __pyx_t_1 = __pyx_t_2; + __pyx_L12_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":371 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L11:; + + /* "View.MemoryView":373 + * self.dtype_is_object = dtype_is_object + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 # <<<<<<<<<<<<<< + * self.typeinfo = NULL + * + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_4 = ((Py_intptr_t)((void *)(&__pyx_v_self->acquisition_count))); + __pyx_t_5 = (sizeof(__pyx_atomic_int_type)); + if (unlikely(__pyx_t_5 == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 373, __pyx_L1_error) + } + __pyx_t_1 = ((__pyx_t_4 % __pyx_t_5) == 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 373, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 373, __pyx_L1_error) + #endif + + /* "View.MemoryView":374 + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyThread_type_lock __pyx_t_5; + PyThread_type_lock __pyx_t_6; + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":378 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + __pyx_t_1 = (((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":381 + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< + * Py_DECREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; + + /* "View.MemoryView":382 + * + * (<__pyx_buffer *> &self.view).obj = NULL + * Py_DECREF(Py_None) # <<<<<<<<<<<<<< + * + * cdef int i + */ + Py_DECREF(Py_None); + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + } + __pyx_L3:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_1 = (__pyx_v_self->lock != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":387 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_2 = __pyx_memoryview_thread_locks_used; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock); + if (__pyx_t_1) { + + /* "View.MemoryView":389 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_1 = (__pyx_v_i != __pyx_memoryview_thread_locks_used); + if (__pyx_t_1) { + + /* "View.MemoryView":392 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_5 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":391 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_5; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_6; + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":393 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":395 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ +} + +/* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_item_pointer", 1); + + /* "View.MemoryView":399 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 401, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 401, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":402 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":404 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + if (__pyx_t_1) { + + /* "View.MemoryView":409 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":411 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 411, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 411, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_indices = __pyx_t_4; + __pyx_t_4 = 0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 414, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":415 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":417 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_5 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(1, 417, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_5; + + /* "View.MemoryView":418 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + if (unlikely(__pyx_v_self->view.readonly)) { + + /* "View.MemoryView":422 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_Cannot_assign_to_read_only_memor, 0, 0); + __PYX_ERR(1, 422, __pyx_L1_error) + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + } + + /* "View.MemoryView":424 + * raise TypeError, "Cannot assign to read-only memoryview" + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_1 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 424, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 424, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 426, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":427 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 428, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":429 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_1 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_1, __pyx_v_obj); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":431 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 431, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_3), __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":433 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":439 + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 439, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":440 + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 440, __pyx_L6_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + + /* "View.MemoryView":441 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __pyx_L6_except_error:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":443 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + __Pyx_memviewslice __pyx_v_msrc; + __Pyx_memviewslice __pyx_v_mdst; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 1); + + /* "View.MemoryView":448 + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_v_msrc = (__pyx_t_1[0]); + + /* "View.MemoryView":449 + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] # <<<<<<<<<<<<<< + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_v_mdst = (__pyx_t_1[0]); + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = __pyx_memoryview_copy_contents(__pyx_v_msrc, __pyx_v_mdst, __pyx_t_3, __pyx_t_4, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 451, __pyx_L1_error) + + /* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + char const *__pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 1); + + /* "View.MemoryView":455 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":460 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 460, __pyx_L1_error) + __pyx_v_dst_slice = __pyx_t_1; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_2 = (((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))); + if (__pyx_t_2) { + + /* "View.MemoryView":463 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_2 = (__pyx_v_tmp == NULL); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":465 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(1, 465, __pyx_L1_error) + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":466 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":468 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":470 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":472 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":474 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 474, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_2 = (__pyx_v_self->view.suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":479 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_4 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 479, __pyx_L6_error) + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":480 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":483 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_indexed", 1); + + /* "View.MemoryView":486 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 486, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":487 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 487, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":492 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 492, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":495 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":497 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError, "Unable to convert item to object" + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_9 = __Pyx_ssize_strlen(__pyx_v_self->view.format); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(1, 501, __pyx_L5_except_error) + __pyx_t_10 = (__pyx_t_9 == 1); + if (__pyx_t_10) { + + /* "View.MemoryView":502 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 502, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":503 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":498 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError, "Unable to convert item to object" + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_6); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "View.MemoryView":499 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError, "Unable to convert item to object" # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Unable_to_convert_item_to_object, 0, 0); + __PYX_ERR(1, 499, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + char *__pyx_t_9; + char *__pyx_t_10; + char *__pyx_t_11; + char *__pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":508 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + if (__pyx_t_2) { + + /* "View.MemoryView":514 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 514, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":516 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_v_value}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 516, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 518, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_8 = __pyx_v_bytesvalue; + __pyx_t_10 = PyBytes_AS_STRING(__pyx_t_8); + __pyx_t_11 = (__pyx_t_10 + PyBytes_GET_SIZE(__pyx_t_8)); + for (__pyx_t_12 = __pyx_t_10; __pyx_t_12 < __pyx_t_11; __pyx_t_12++) { + __pyx_t_9 = __pyx_t_12; + __pyx_v_c = (__pyx_t_9[0]); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_7; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + char *__pyx_t_4; + void *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":524 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError, "Cannot create writable memory view from read-only memoryview" # <<<<<<<<<<<<<< + * + * if flags & PyBUF_ND: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Cannot_create_writable_memory_vi, 0, 0); + __PYX_ERR(1, 524, __pyx_L1_error) + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + } + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":527 + * + * if flags & PyBUF_ND: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_3 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_3; + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":529 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":532 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_3 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_3; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":534 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":537 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_3 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_3; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":539 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":542 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":544 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":546 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_5 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_5; + + /* "View.MemoryView":547 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_6 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":548 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_7 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_7; + + /* "View.MemoryView":549 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_7 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_7; + + /* "View.MemoryView":550 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":551 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":556 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 556, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 556, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":557 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(1, 557, __pyx_L1_error) + + /* "View.MemoryView":558 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":562 + * @property + * def base(self): + * return self._get_base() # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->_get_base(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 562, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.base.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":565 + * + * cdef _get_base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_7genexpr__pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":569 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_7genexpr__pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_7genexpr__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } /* exit inner scope */ + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr1__pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + __pyx_t_1 = (__pyx_v_self->view.strides == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":575 + * if self.view.strides == NULL: + * + * raise ValueError, "Buffer view does not expose strides" # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Buffer_view_does_not_expose_stri, 0, 0); + __PYX_ERR(1, 575, __pyx_L1_error) + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + } + + /* "View.MemoryView":577 + * raise ValueError, "Buffer view does not expose strides" + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr1__pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr1__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr2__pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = (__pyx_v_self->view.suboffsets == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PySequence_Multiply(__pyx_tuple__4, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":584 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.suboffsets; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr2__pyx_v_suboffset = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr2__pyx_v_suboffset); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":588 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 588, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":592 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 592, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":596 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":601 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":603 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_t_5 = PyInt_FromSsize_t((__pyx_t_2[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 603, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":604 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_5 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 604, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_5); + __pyx_t_5 = 0; + } + + /* "View.MemoryView":606 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":608 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = (__pyx_v_self->view.ndim >= 1); + if (__pyx_t_1) { + + /* "View.MemoryView":612 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":614 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":618 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 1); + + /* "View.MemoryView":621 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_c_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_c_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_c_contig", 1); + + /* "View.MemoryView":627 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 627, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":628 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_f_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_f_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_f_contig", 1); + + /* "View.MemoryView":633 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 633, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":634 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy", 1); + + /* "View.MemoryView":638 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":640 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":641 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 641, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":646 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 646, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy_fortran", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy_fortran", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy_fortran", 1); + + /* "View.MemoryView":650 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":652 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":653 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 653, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":658 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 1); + + /* "View.MemoryView":663 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":664 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":665 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":669 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_idx; + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_UCS4 __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_unellipsify", 1); + + /* "View.MemoryView":677 + * """ + * cdef Py_ssize_t idx + * tup = index if isinstance(index, tuple) else (index,) # <<<<<<<<<<<<<< + * + * result = [slice(None)] * ndim + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_index); + if (__pyx_t_2) { + __Pyx_INCREF(((PyObject*)__pyx_v_index)); + __pyx_t_1 = __pyx_v_index; + } else { + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index)) __PYX_ERR(1, 677, __pyx_L1_error); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_v_tup = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_1 = PyList_New(1 * ((__pyx_v_ndim<0) ? 0:__pyx_v_ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_ndim; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error); + } + } + __pyx_v_result = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":680 + * + * result = [slice(None)] * ndim + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * idx = 0 + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":681 + * result = [slice(None)] * ndim + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * idx = 0 + * for item in tup: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":682 + * have_slices = False + * seen_ellipsis = False + * idx = 0 # <<<<<<<<<<<<<< + * for item in tup: + * if item is Ellipsis: + */ + __pyx_v_idx = 0; + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 683, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_1); + __pyx_t_4 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #endif + if (__pyx_t_4 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 683, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + __pyx_t_2 = (!__pyx_v_seen_ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":686 + * if item is Ellipsis: + * if not seen_ellipsis: + * idx += ndim - len(tup) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * have_slices = True + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 686, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(__pyx_v_tup); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 686, __pyx_L1_error) + __pyx_v_idx = (__pyx_v_idx + (__pyx_v_ndim - __pyx_t_5)); + + /* "View.MemoryView":687 + * if not seen_ellipsis: + * idx += ndim - len(tup) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + } + + /* "View.MemoryView":688 + * idx += ndim - len(tup) + * seen_ellipsis = True + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if isinstance(item, slice): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + if (__pyx_t_2) { + + /* "View.MemoryView":691 + * else: + * if isinstance(item, slice): + * have_slices = True # <<<<<<<<<<<<<< + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + goto __pyx_L7; + } + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + __pyx_t_2 = (!(PyIndex_Check(__pyx_v_item) != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":693 + * have_slices = True + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" # <<<<<<<<<<<<<< + * result[idx] = item + * idx += 1 + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_6 = 127; + __Pyx_INCREF(__pyx_kp_u_Cannot_index_with_type); + __pyx_t_5 += 24; + __Pyx_GIVEREF(__pyx_kp_u_Cannot_index_with_type); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Cannot_index_with_type); + __pyx_t_7 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_item)), __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6; + __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_kp_u__6); + __pyx_t_5 += 1; + __Pyx_GIVEREF(__pyx_kp_u__6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__6); + __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_t_7, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(1, 693, __pyx_L1_error) + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + } + __pyx_L7:; + + /* "View.MemoryView":694 + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item # <<<<<<<<<<<<<< + * idx += 1 + * + */ + if (unlikely((__Pyx_SetItemInt(__pyx_v_result, __pyx_v_idx, __pyx_v_item, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1) < 0))) __PYX_ERR(1, 694, __pyx_L1_error) + } + __pyx_L5:; + + /* "View.MemoryView":695 + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + * idx += 1 # <<<<<<<<<<<<<< + * + * nslices = ndim - idx + */ + __pyx_v_idx = (__pyx_v_idx + 1); + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":697 + * idx += 1 + * + * nslices = ndim - idx # <<<<<<<<<<<<<< + * return have_slices or nslices, tuple(result) + * + */ + __pyx_v_nslices = (__pyx_v_ndim - __pyx_v_idx); + + /* "View.MemoryView":698 + * + * nslices = ndim - idx + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_7 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + __pyx_L9_bool_binop_done:; + __pyx_t_7 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 698, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_7 = 0; + __pyx_r = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static int assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + int __pyx_r; + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":701 + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + __pyx_t_4 = (__pyx_v_suboffset >= 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":703 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" # <<<<<<<<<<<<<< + * return 0 # return type just used as an error flag + * + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Indirect_dimensions_not_supporte, 0, 0); + __PYX_ERR(1, 703, __pyx_L1_error) + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + } + } + + /* "View.MemoryView":704 + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + Py_ssize_t __pyx_v_cindex; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + struct __pyx_memoryview_obj *__pyx_t_3; + char *__pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + PyObject *(*__pyx_t_7)(PyObject *); + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memview_slice", 1); + + /* "View.MemoryView":712 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":719 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":723 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_1 = (__pyx_v_memview->view.ndim > 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 723, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 723, __pyx_L1_error) + #endif + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":726 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 726, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":727 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":729 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":730 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":736 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_3 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_3; + + /* "View.MemoryView":737 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_4; + + /* "View.MemoryView":742 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step, cindex + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":743 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step, cindex + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + __pyx_t_5 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_2 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_2); + __pyx_t_6 = 0; + __pyx_t_7 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 747, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_7)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_7(__pyx_t_2); + if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 747, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_dim = __pyx_t_5; + __pyx_t_5 = (__pyx_t_5 + 1); + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + __pyx_t_1 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":749 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * cindex = index # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 749, __pyx_L1_error) + __pyx_v_cindex = __pyx_t_9; + + /* "View.MemoryView":750 + * if PyIndex_Check(index): + * cindex = index + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_cindex, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 750, __pyx_L1_error) + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + goto __pyx_L6; + } + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_1 = (__pyx_v_index == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":757 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":758 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":759 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":760 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":762 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 762, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 762, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_9; + + /* "View.MemoryView":763 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 763, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 763, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 763, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_9; + + /* "View.MemoryView":764 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 764, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 764, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 764, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_9; + + /* "View.MemoryView":766 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":767 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 767, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":768 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":770 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 770, __pyx_L1_error) + + /* "View.MemoryView":776 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":780 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 780, __pyx_L1_error) } + + /* "View.MemoryView":781 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 781, __pyx_L1_error) } + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 779, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":785 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 784, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = (!__pyx_v_is_slice); + if (__pyx_t_1) { + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = (__pyx_v_start < 0); + if (__pyx_t_1) { + + /* "View.MemoryView":816 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":818 + * start += shape + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 818, __pyx_L1_error) + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_have_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":822 + * + * if have_step: + * negative_step = step < 0 # <<<<<<<<<<<<<< + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + */ + __pyx_v_negative_step = (__pyx_v_step < 0); + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + __pyx_t_2 = (__pyx_v_step == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":824 + * negative_step = step < 0 + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * negative_step = False + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 824, __pyx_L1_error) + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":826 + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + * negative_step = False # <<<<<<<<<<<<<< + * step = 1 + * + */ + /*else*/ { + __pyx_v_negative_step = 0; + + /* "View.MemoryView":827 + * else: + * negative_step = False + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + } + __pyx_L6:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":832 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":834 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = (__pyx_v_start >= __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + if (__pyx_v_negative_step) { + + /* "View.MemoryView":837 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":839 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L11:; + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L9:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L8; + } + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":842 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":844 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L12:; + } + __pyx_L8:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":850 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = (__pyx_v_stop > __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":852 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L14:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L13; + } + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":855 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L16; + } + + /* "View.MemoryView":857 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L16:; + } + __pyx_L13:; + + /* "View.MemoryView":861 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":864 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = (__pyx_v_new_shape < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":867 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":870 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":871 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":872 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = ((__pyx_v_suboffset_dim[0]) < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":878 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L19:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = (!__pyx_v_is_slice); + if (__pyx_t_2) { + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = (__pyx_v_new_ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":883 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L22; + } + + /* "View.MemoryView":885 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":886 + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 885, __pyx_L1_error) + } + __pyx_L22:; + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L21; + } + + /* "View.MemoryView":888 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L21:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":890 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_UCS4 __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("pybuffer_index", 1); + + /* "View.MemoryView":898 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":899 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + __pyx_t_2 = (__pyx_v_view->ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":903 + * + * if view.ndim == 0: + * shape = view.len // itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":904 + * if view.ndim == 0: + * shape = view.len // itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":906 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":907 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = (__pyx_v_view->suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":909 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":914 + * index += view.shape[dim] + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_5 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__7); + __pyx_t_5 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 914, __pyx_L1_error) + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index >= __pyx_v_shape); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":917 + * + * if index >= shape: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_3 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u__7); + __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_5, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 917, __pyx_L1_error) + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":919 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":923 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":930 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":932 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":933 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":937 + * + * cdef int i, j + * for i in range(ndim // 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":938 + * cdef int i, j + * for i in range(ndim // 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":939 + * for i in range(ndim // 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":940 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":943 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_t_9 = __pyx_memoryview_err(PyExc_ValueError, __pyx_kp_s_Cannot_transpose_memoryview_with); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L1_error) + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":945 + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + + /* "View.MemoryView":964 + * + * def __dealloc__(self): + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XCLEAR_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_object_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":968 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 968, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":970 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 970, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_dtype_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":974 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 974, __pyx_L1_error) + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":976 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":979 + * + * cdef _get_base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_fromslice", 1); + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_memviewslice.memview) == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":1008 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1013 + * + * + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = ((PyObject *)__pyx_tp_new__memoryviewslice(((PyTypeObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1015 + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1016 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview)._get_base() + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1018 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview)._get_base() # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->__pyx_vtab)->_get_base(((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1018, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1019 + * + * result.from_object = ( memviewslice.memview)._get_base() + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1021 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1022 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1023 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1024 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1025 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1028 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1030 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1032 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1033 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1036 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1037 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = (__pyx_v_suboffset >= 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1039 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1040 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1042 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1043 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1043, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1044 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1046 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1047 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1049 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_slice_from_memview", 1); + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1056 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1056, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1057 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1059 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1060 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1067 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1068 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1069 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1071 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1072 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1074 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1075 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1076 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1077 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + __pyx_t_6 = (__pyx_v_suboffsets != 0); + if (__pyx_t_6) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ +} + +/* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy", 1); + + /* "View.MemoryView":1083 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1084 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1084, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *(*__pyx_t_2)(char *); + int (*__pyx_t_3)(char *, PyObject *); + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 1); + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1095 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_2 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_2; + + /* "View.MemoryView":1096 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_3; + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1098 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1099 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1101 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1103 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":1110 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: + * return -arg if arg < 0 else arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + __pyx_t_2 = (__pyx_v_arg < 0); + if (__pyx_t_2) { + __pyx_t_1 = (-__pyx_v_arg); + } else { + __pyx_t_1 = __pyx_v_arg; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1118 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1119 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1121 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1123 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1124 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1126 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1128 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1129 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = (abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)); + if (__pyx_t_2) { + + /* "View.MemoryView":1132 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1134 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + + /* "View.MemoryView":1144 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1146 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = (__pyx_v_src_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_dst_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1151 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_1 = __pyx_t_2; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1152 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1154 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1155 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1156 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1157 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1159 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1160 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1164 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1165 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1170 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + + /* "View.MemoryView":1176 + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for shape in src.shape[:ndim]: + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1178 + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * + * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< + * size *= shape + * + */ + __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); + for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_shape = (__pyx_t_2[0]); + + /* "View.MemoryView":1179 + * + * for shape in src.shape[:ndim]: + * size *= shape # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * __pyx_v_shape); + } + + /* "View.MemoryView":1181 + * size *= shape + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = (__pyx_v_order == 'F'); + if (__pyx_t_1) { + + /* "View.MemoryView":1194 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1195 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1196 + * for idx in range(ndim): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1198 + * stride *= shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1199 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1200 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1202 + * stride *= shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1216 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1217 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1219 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err_no_memory() + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + __pyx_t_2 = (!(__pyx_v_result != 0)); + if (__pyx_t_2) { + + /* "View.MemoryView":1221 + * result = malloc(size) + * if not result: + * _err_no_memory() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_no_memory(); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1221, __pyx_L1_error) + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + } + + /* "View.MemoryView":1224 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1225 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1226 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1227 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1228 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1230 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) # <<<<<<<<<<<<<< + * + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = ((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = __pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_UCS4 __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = PyTuple_New(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = 0; + __pyx_t_3 = 127; + __Pyx_INCREF(__pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_2 += 35; + __Pyx_GIVEREF(__pyx_kp_u_got_differing_extents_in_dimensi); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_i, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_got); + __pyx_t_2 += 6; + __Pyx_GIVEREF(__pyx_kp_u_got); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_got); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent1, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_and); + __pyx_t_2 += 5; + __Pyx_GIVEREF(__pyx_kp_u_and); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_kp_u_and); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent2, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_2 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_kp_u__7); + __pyx_t_4 = __Pyx_PyUnicode_Join(__pyx_t_1, 7, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, PyObject *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1253 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: + * raise error, msg % dim # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_v_msg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_t_2, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1253, __pyx_L1_error) + + /* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, PyObject *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1257 + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: + * raise error, msg # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_no_memory') + */ + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_v_msg, 0, 0); + __PYX_ERR(1, 1257, __pyx_L1_error) + + /* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + +static int __pyx_memoryview_err_no_memory(void) { + int __pyx_r; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1261 + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: + * raise MemoryError # <<<<<<<<<<<<<< + * + * + */ + PyErr_NoMemory(); __PYX_ERR(1, 1261, __pyx_L1_error) + + /* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err_no_memory", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1273 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1274 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1276 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1277 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1278 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = (__pyx_v_src_ndim < __pyx_v_dst_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1282 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = (__pyx_v_dst_ndim < __pyx_v_src_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1284 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1286 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + __pyx_t_2 = (__pyx_t_3 > __pyx_t_4); + if (__pyx_t_2) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1288 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1291 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1292 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1294 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1294, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = ((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1297 + * + * if src.suboffsets[i] >= 0: + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Dimension_d_is_not_direct, __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1297, __pyx_L1_error) + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = __pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = (!__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim)); + if (__pyx_t_2) { + + /* "View.MemoryView":1302 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1304 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1304, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1305 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (!__pyx_v_broadcasting); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1311 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1313 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + if (__pyx_v_direct_copy) { + + /* "View.MemoryView":1317 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1318 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1319 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1320 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1321 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + if (__pyx_t_2) { + + /* "View.MemoryView":1326 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1326, __pyx_L1_error) + + /* "View.MemoryView":1327 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1327, __pyx_L1_error) + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1329 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1330 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1331 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1333 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1334 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1341 + * int ndim_other) noexcept nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1343 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1344 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1345 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1346 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1348 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1349 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1350 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1351 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + if (__pyx_v_dtype_is_object) { + + /* "View.MemoryView":1362 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + } + + /* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1368 + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + + /* function exit code */ + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1374 + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * + * for i in range(shape[0]): + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1376 + * cdef Py_ssize_t stride = strides[0] + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = (__pyx_v_ndim == 1); + if (__pyx_t_4) { + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + if (__pyx_v_inc) { + + /* "View.MemoryView":1379 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1381 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1383 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += stride + */ + /*else*/ { + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1385 + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + * + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + + /* function exit code */ +} + +/* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1394 + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1395 + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) # <<<<<<<<<<<<<< + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1396 + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1404 + * size_t itemsize, void *item) noexcept nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1405 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1408 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1409 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1410 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1412 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1413 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) # <<<<<<<<<<<<<< + * data += stride + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1414 + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__8, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "feature_gen.pyx":20 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] one_hot( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_11feature_gen_1one_hot(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_one_hot(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_cats, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cats; + __Pyx_Buffer __pyx_pybuffer_cats; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyArrayObject *__pyx_t_6 = NULL; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + __pyx_t_5numpy_int64_t __pyx_t_15; + PyObject **__pyx_t_16; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("one_hot", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_cats.pybuffer.buf = NULL; + __pyx_pybuffer_cats.refcount = 0; + __pyx_pybuffernd_cats.data = NULL; + __pyx_pybuffernd_cats.rcbuffer = &__pyx_pybuffer_cats; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 20, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 20, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cats.rcbuffer->pybuffer, (PyObject*)__pyx_v_cats, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 20, __pyx_L1_error) + } + __pyx_pybuffernd_cats.diminfo[0].strides = __pyx_pybuffernd_cats.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cats.diminfo[0].shape = __pyx_pybuffernd_cats.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":27 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 27, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":28 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( + * (n_rows, n_cols), dtype=object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":29 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen.pyx":30 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( + * (n_rows, n_cols), dtype=object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + + /* "feature_gen.pyx":29 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5)) __PYX_ERR(0, 29, __pyx_L1_error); + __pyx_t_5 = 0; + + /* "feature_gen.pyx":30 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( + * (n_rows, n_cols), dtype=object) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_builtin_object) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + + /* "feature_gen.pyx":29 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_t_6 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 29, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_6 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":31 + * cdef np.ndarray[object, ndim = 2] X_new = np.empty( + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_8 = __pyx_t_7; + for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { + __pyx_v_i = __pyx_t_9; + + /* "feature_gen.pyx":32 + * (n_rows, n_cols), dtype=object) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_10 = __pyx_v_n_cols; + __pyx_t_11 = __pyx_t_10; + for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { + __pyx_v_j = __pyx_t_12; + + /* "feature_gen.pyx":33 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_13 = __pyx_v_j; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_13 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_cats.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_cats.diminfo[0].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 33, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_16 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_16); + __Pyx_INCREF(__pyx_t_4); __Pyx_XDECREF(*__pyx_t_16); + *__pyx_t_16 = __pyx_t_4; + __Pyx_XGIVEREF(*__pyx_t_16); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + + /* "feature_gen.pyx":34 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] == cats[j] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 34, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 34, __pyx_L1_error); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 34, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 34, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":20 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] one_hot( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.one_hot", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_1one_hot(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_1one_hot = {"one_hot", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_11feature_gen_1one_hot, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_1one_hot(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_cats = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("one_hot (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_cats,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("one_hot", 1, 3, 3, 1); __PYX_ERR(0, 20, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cats)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("one_hot", 1, 3, 3, 2); __PYX_ERR(0, 20, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "one_hot") < 0)) __PYX_ERR(0, 20, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_cats = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("one_hot", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 20, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.one_hot", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 21, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 22, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cats), __pyx_ptype_5numpy_ndarray, 1, "cats", 0))) __PYX_ERR(0, 23, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_one_hot(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_cats); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_one_hot(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_cats) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cats; + __Pyx_Buffer __pyx_pybuffer_cats; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("one_hot", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_cats.pybuffer.buf = NULL; + __pyx_pybuffer_cats.refcount = 0; + __pyx_pybuffernd_cats.data = NULL; + __pyx_pybuffernd_cats.rcbuffer = &__pyx_pybuffer_cats; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 20, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 20, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cats.rcbuffer->pybuffer, (PyObject*)__pyx_v_cats, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 20, __pyx_L1_error) + } + __pyx_pybuffernd_cats.diminfo[0].strides = __pyx_pybuffernd_cats.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cats.diminfo[0].shape = __pyx_pybuffernd_cats.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_11feature_gen_one_hot(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_cats, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.one_hot", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cats.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_3is_null = {"is_null", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_3is_null, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 39, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 39, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_11feature_gen_2is_null(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_2is_null(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_null", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 39, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_2); + __Pyx_GIVEREF(__pyx_int_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_2)) __PYX_ERR(0, 39, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 39, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 39, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 39, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 39, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 39, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 39, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 39, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 39, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_21__pyx_fuse_0is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_is_null(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0is_null", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":45 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":46 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":47 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 47, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":49 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":50 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":51 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) != (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":52 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 52, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_21__pyx_fuse_0is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_11feature_gen_21__pyx_fuse_0is_null = {"__pyx_fuse_0is_null", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_21__pyx_fuse_0is_null, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_21__pyx_fuse_0is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0is_null (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0is_null", 1, 2, 2, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0is_null") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0is_null", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 40, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_20__pyx_fuse_0is_null(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_20__pyx_fuse_0is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0is_null", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_11feature_gen_is_null(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_23__pyx_fuse_1is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_is_null(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1is_null", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":45 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":46 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":47 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 47, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":49 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":50 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":51 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) != (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":52 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 52, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_23__pyx_fuse_1is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_11feature_gen_23__pyx_fuse_1is_null = {"__pyx_fuse_1is_null", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_23__pyx_fuse_1is_null, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_23__pyx_fuse_1is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1is_null (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1is_null", 1, 2, 2, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1is_null") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1is_null", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 40, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_22__pyx_fuse_1is_null(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_22__pyx_fuse_1is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1is_null", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_11feature_gen_is_null(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_25__pyx_fuse_2is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_is_null(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2is_null", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":45 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":46 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":47 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 47, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":49 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":50 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":51 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) != (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":52 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 52, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_25__pyx_fuse_2is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_11feature_gen_25__pyx_fuse_2is_null = {"__pyx_fuse_2is_null", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_25__pyx_fuse_2is_null, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_25__pyx_fuse_2is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2is_null (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2is_null", 1, 2, 2, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2is_null") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2is_null", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 40, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_24__pyx_fuse_2is_null(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_24__pyx_fuse_2is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2is_null", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_11feature_gen_is_null(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_27__pyx_fuse_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_is_null(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3is_null", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":45 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":46 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":47 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 47, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":49 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":50 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":51 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) != (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":52 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 52, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_27__pyx_fuse_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_11feature_gen_27__pyx_fuse_3is_null = {"__pyx_fuse_3is_null", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_27__pyx_fuse_3is_null, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_27__pyx_fuse_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3is_null (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3is_null", 1, 2, 2, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3is_null") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3is_null", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 40, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_26__pyx_fuse_3is_null(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_26__pyx_fuse_3is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3is_null", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_11feature_gen_is_null(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_29__pyx_fuse_4is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_3is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_is_null(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4is_null", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":45 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":46 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":47 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 47, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":49 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":50 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":51 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) != (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":48 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":52 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns[j]] != X[i, idx_columns[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 52, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 52, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_29__pyx_fuse_4is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_11feature_gen_29__pyx_fuse_4is_null = {"__pyx_fuse_4is_null", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_29__pyx_fuse_4is_null, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_29__pyx_fuse_4is_null(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4is_null (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4is_null", 1, 2, 2, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4is_null") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4is_null", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 40, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_28__pyx_fuse_4is_null(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_28__pyx_fuse_4is_null(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4is_null", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 39, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_11feature_gen_is_null(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4is_null", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":58 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_null_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_11feature_gen_5is_null_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_is_null_object(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + int __pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_null_object", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 58, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 58, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":64 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":65 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros( + * (n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 65, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":66 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros( # <<<<<<<<<<<<<< + * (n_rows, n_cols)) + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "feature_gen.pyx":67 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros( + * (n_rows, n_cols)) # <<<<<<<<<<<<<< + * + * for i in range(n_rows): + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 67, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 67, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "feature_gen.pyx":66 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros( # <<<<<<<<<<<<<< + * (n_rows, n_cols)) + * + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 66, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 66, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":69 + * (n_rows, n_cols)) + * + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":70 + * + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): + * X_new[i, j] = 1. + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":71 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_14 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_14 = __pyx_t_18; + __pyx_L8_bool_binop_done:; + if (__pyx_t_14) { + + /* "feature_gen.pyx":72 + * for j in range(n_cols): + * if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): + * X_new[i, j] = 1. # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X_new.diminfo[1].strides) = 1.; + + /* "feature_gen.pyx":71 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * return np.concatenate((X, X_new), axis=1) + */ + } + } + } + + /* "feature_gen.pyx":73 + * if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): + * X_new[i, j] = 1. + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 73, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 73, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6)) __PYX_ERR(0, 73, __pyx_L1_error); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":58 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_null_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_5is_null_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_5is_null_object = {"is_null_object", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_11feature_gen_5is_null_object, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_5is_null_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_null_object (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_null_object", 1, 2, 2, 1); __PYX_ERR(0, 58, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "is_null_object") < 0)) __PYX_ERR(0, 58, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("is_null_object", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 58, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.is_null_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 59, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 60, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_4is_null_object(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_4is_null_object(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_null_object", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 58, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 58, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_11feature_gen_is_null_object(__pyx_v_X, __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_null_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_7is_equal = {"is_equal", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_7is_equal, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults1 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 78, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 78, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_11feature_gen_6is_equal(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_6is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_equal", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 78, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 78, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 78, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 78, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 78, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 78, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 78, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 78, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 78, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 78, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_33__pyx_fuse_0is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_is_equal(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0is_equal", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":85 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":86 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":87 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 87, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":89 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":90 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":91 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) == (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":92 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 92, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_33__pyx_fuse_0is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_11feature_gen_33__pyx_fuse_0is_equal = {"__pyx_fuse_0is_equal", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_33__pyx_fuse_0is_equal, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_33__pyx_fuse_0is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0is_equal (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0is_equal", 1, 3, 3, 1); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0is_equal", 1, 3, 3, 2); __PYX_ERR(0, 78, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0is_equal") < 0)) __PYX_ERR(0, 78, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0is_equal", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 78, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 80, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_32__pyx_fuse_0is_equal(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_32__pyx_fuse_0is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0is_equal", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_11feature_gen_is_equal(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_35__pyx_fuse_1is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_is_equal(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1is_equal", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":85 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":86 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":87 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 87, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":89 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":90 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":91 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) == (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":92 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 92, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_35__pyx_fuse_1is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_11feature_gen_35__pyx_fuse_1is_equal = {"__pyx_fuse_1is_equal", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_35__pyx_fuse_1is_equal, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_35__pyx_fuse_1is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1is_equal (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1is_equal", 1, 3, 3, 1); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1is_equal", 1, 3, 3, 2); __PYX_ERR(0, 78, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1is_equal") < 0)) __PYX_ERR(0, 78, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1is_equal", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 78, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 80, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_34__pyx_fuse_1is_equal(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_34__pyx_fuse_1is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1is_equal", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_11feature_gen_is_equal(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_37__pyx_fuse_2is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_is_equal(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2is_equal", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":85 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":86 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":87 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 87, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":89 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":90 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":91 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) == (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":92 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 92, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_37__pyx_fuse_2is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_11feature_gen_37__pyx_fuse_2is_equal = {"__pyx_fuse_2is_equal", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_37__pyx_fuse_2is_equal, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_37__pyx_fuse_2is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2is_equal (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2is_equal", 1, 3, 3, 1); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2is_equal", 1, 3, 3, 2); __PYX_ERR(0, 78, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2is_equal") < 0)) __PYX_ERR(0, 78, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2is_equal", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 78, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 80, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_36__pyx_fuse_2is_equal(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_36__pyx_fuse_2is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2is_equal", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_11feature_gen_is_equal(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_39__pyx_fuse_3is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_is_equal(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3is_equal", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":85 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":86 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":87 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 87, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":89 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":90 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":91 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) == (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":92 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 92, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_39__pyx_fuse_3is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_11feature_gen_39__pyx_fuse_3is_equal = {"__pyx_fuse_3is_equal", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_39__pyx_fuse_3is_equal, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_39__pyx_fuse_3is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3is_equal (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3is_equal", 1, 3, 3, 1); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3is_equal", 1, 3, 3, 2); __PYX_ERR(0, 78, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3is_equal") < 0)) __PYX_ERR(0, 78, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3is_equal", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 78, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 80, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_38__pyx_fuse_3is_equal(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_38__pyx_fuse_3is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3is_equal", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_11feature_gen_is_equal(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_41__pyx_fuse_4is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_7is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_is_equal(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4is_equal", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":85 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":86 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":87 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_X), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_6, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 87, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":89 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":90 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":91 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides)) == (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":88 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":92 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 92, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_41__pyx_fuse_4is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_11feature_gen_41__pyx_fuse_4is_equal = {"__pyx_fuse_4is_equal", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_41__pyx_fuse_4is_equal, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_41__pyx_fuse_4is_equal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4is_equal (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4is_equal", 1, 3, 3, 1); __PYX_ERR(0, 78, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4is_equal", 1, 3, 3, 2); __PYX_ERR(0, 78, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4is_equal") < 0)) __PYX_ERR(0, 78, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4is_equal", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 78, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 79, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 80, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_40__pyx_fuse_4is_equal(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_40__pyx_fuse_4is_equal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4is_equal", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 78, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_11feature_gen_is_equal(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4is_equal", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_equal_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + +static PyObject *__pyx_pw_11feature_gen_9is_equal_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_is_equal_object(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_equal_object", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":105 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 105, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":106 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 106, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":107 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 107, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 107, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":108 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":109 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":110 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + } + } + + /* "feature_gen.pyx":111 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 111, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 111, __pyx_L1_error); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_6)) __PYX_ERR(0, 111, __pyx_L1_error); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 111, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 111, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_equal_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_9is_equal_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_9is_equal_object = {"is_equal_object", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_11feature_gen_9is_equal_object, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_9is_equal_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_equal_object (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_equal_object", 1, 3, 3, 1); __PYX_ERR(0, 98, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("is_equal_object", 1, 3, 3, 2); __PYX_ERR(0, 98, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "is_equal_object") < 0)) __PYX_ERR(0, 98, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("is_equal_object", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 98, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.is_equal_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 99, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 100, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_8is_equal_object(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_8is_equal_object(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_equal_object", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_11feature_gen_is_equal_object(__pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.is_equal_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":117 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] cluster_statistics( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] idx_columns, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_11cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_11cluster_statistics = {"cluster_statistics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_11cluster_statistics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_11cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults2 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults2, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 117, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 117, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 117, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 117, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 117, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_11feature_gen_10cluster_statistics(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_10cluster_statistics(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + CYTHON_UNUSED int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cluster_statistics", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 117, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_2); + __Pyx_GIVEREF(__pyx_int_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_2)) __PYX_ERR(0, 117, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 117, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L19_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L22_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L33_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L32_next_and; + } + __pyx_L33_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_L32_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 117, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L39_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L38_next_and; + } + __pyx_L39_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L37_bool_binop_done; + } + __pyx_L38_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L37_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 117, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L29_try_end; + __pyx_L22_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 117, __pyx_L24_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L23_exception_handled; + } + goto __pyx_L24_except_error; + __pyx_L24_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L27_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L23_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L29_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 117, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L49; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L49:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 117, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L53; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 117, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 117, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L53:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L68_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L68_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L52_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L52_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L70_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 117, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_45__pyx_fuse_0cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_11cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_cluster_statistics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __pyx_t_5numpy_float32_t __pyx_v_mean; + __pyx_t_5numpy_float32_t __pyx_v_std; + __pyx_t_5numpy_float32_t __pyx_v_denumerator; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + __pyx_t_5numpy_int64_t __pyx_t_24; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0cluster_statistics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_idx_columns.diminfo[1].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_idx_columns.diminfo[1].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":123 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_elements = idx_columns.shape[1] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":124 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = idx_columns.shape[1] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":125 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_elements = idx_columns.shape[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) + * cdef num_float_t mean + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[1]); + + /* "feature_gen.pyx":126 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_elements = idx_columns.shape[1] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef num_float_t mean + * cdef num_float_t std + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 126, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":129 + * cdef num_float_t mean + * cdef num_float_t std + * cdef num_float_t denumerator = (n_elements - 1) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_denumerator = (__pyx_v_n_elements - 1); + + /* "feature_gen.pyx":130 + * cdef num_float_t std + * cdef num_float_t denumerator = (n_elements - 1) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":131 + * cdef num_float_t denumerator = (n_elements - 1) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * mean = 0 + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":132 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * mean = 0 + * std = 0 + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":133 + * for i in range(n_rows): + * for j in range(n_cols): + * mean = 0 # <<<<<<<<<<<<<< + * std = 0 + * for k in range(n_elements): + */ + __pyx_v_mean = 0.0; + + /* "feature_gen.pyx":134 + * for j in range(n_cols): + * mean = 0 + * std = 0 # <<<<<<<<<<<<<< + * for k in range(n_elements): + * mean = mean + X[i, idx_columns[j, k]] + */ + __pyx_v_std = 0.0; + + /* "feature_gen.pyx":135 + * mean = 0 + * std = 0 + * for k in range(n_elements): # <<<<<<<<<<<<<< + * mean = mean + X[i, idx_columns[j, k]] + * mean /= n_elements + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":136 + * std = 0 + * for k in range(n_elements): + * mean = mean + X[i, idx_columns[j, k]] # <<<<<<<<<<<<<< + * mean /= n_elements + * for k in range(n_elements): + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_idx_columns.diminfo[1].strides)); + __pyx_v_mean = (__pyx_v_mean + (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides))); + } + + /* "feature_gen.pyx":137 + * for k in range(n_elements): + * mean = mean + X[i, idx_columns[j, k]] + * mean /= n_elements # <<<<<<<<<<<<<< + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ + */ + __pyx_v_mean = (__pyx_v_mean / __pyx_v_n_elements); + + /* "feature_gen.pyx":138 + * mean = mean + X[i, idx_columns[j, k]] + * mean /= n_elements + * for k in range(n_elements): # <<<<<<<<<<<<<< + * std += (X[i, idx_columns[j, k]] - mean) * \ + * (X[i, idx_columns[j, k]] - mean) + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":139 + * mean /= n_elements + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ # <<<<<<<<<<<<<< + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[1].strides)); + + /* "feature_gen.pyx":140 + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ + * (X[i, idx_columns[j, k]] - mean) # <<<<<<<<<<<<<< + * X_new[i, 2 * j] = mean + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator + */ + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_k; + __pyx_t_23 = __pyx_v_i; + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_idx_columns.diminfo[1].strides)); + + /* "feature_gen.pyx":139 + * mean /= n_elements + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ # <<<<<<<<<<<<<< + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean + */ + __pyx_v_std = (__pyx_v_std + (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) - __pyx_v_mean) * ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_23, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_24, __pyx_pybuffernd_X.diminfo[1].strides)) - __pyx_v_mean))); + } + + /* "feature_gen.pyx":141 + * std += (X[i, idx_columns[j, k]] - mean) * \ + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean # <<<<<<<<<<<<<< + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator + * return X_new + */ + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_v_mean; + + /* "feature_gen.pyx":142 + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = (sqrt(__pyx_v_std) / ((double)__pyx_v_denumerator)); + } + } + } + + /* "feature_gen.pyx":130 + * cdef num_float_t std + * cdef num_float_t denumerator = (n_elements - 1) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":143 + * X_new[i, 2 * j] = mean + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":117 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] cluster_statistics( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.cluster_statistics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_45__pyx_fuse_0cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_11feature_gen_45__pyx_fuse_0cluster_statistics = {"__pyx_fuse_0cluster_statistics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_45__pyx_fuse_0cluster_statistics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_45__pyx_fuse_0cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0cluster_statistics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0cluster_statistics", 1, 2, 2, 1); __PYX_ERR(0, 117, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0cluster_statistics") < 0)) __PYX_ERR(0, 117, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0cluster_statistics", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 117, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0cluster_statistics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 118, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_44__pyx_fuse_0cluster_statistics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_44__pyx_fuse_0cluster_statistics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0cluster_statistics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_idx_columns.diminfo[1].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_idx_columns.diminfo[1].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_11feature_gen_cluster_statistics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0cluster_statistics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_47__pyx_fuse_1cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_11cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_cluster_statistics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __pyx_t_5numpy_float64_t __pyx_v_mean; + __pyx_t_5numpy_float64_t __pyx_v_std; + __pyx_t_5numpy_float64_t __pyx_v_denumerator; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + __pyx_t_5numpy_int64_t __pyx_t_24; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1cluster_statistics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_idx_columns.diminfo[1].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_idx_columns.diminfo[1].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":123 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_elements = idx_columns.shape[1] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":124 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = idx_columns.shape[1] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":125 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_elements = idx_columns.shape[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) + * cdef num_float_t mean + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[1]); + + /* "feature_gen.pyx":126 + * cdef int n_cols = idx_columns.shape[0] + * cdef int n_elements = idx_columns.shape[1] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef num_float_t mean + * cdef num_float_t std + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 126, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":129 + * cdef num_float_t mean + * cdef num_float_t std + * cdef num_float_t denumerator = (n_elements - 1) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_denumerator = (__pyx_v_n_elements - 1); + + /* "feature_gen.pyx":130 + * cdef num_float_t std + * cdef num_float_t denumerator = (n_elements - 1) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":131 + * cdef num_float_t denumerator = (n_elements - 1) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * mean = 0 + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":132 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * mean = 0 + * std = 0 + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":133 + * for i in range(n_rows): + * for j in range(n_cols): + * mean = 0 # <<<<<<<<<<<<<< + * std = 0 + * for k in range(n_elements): + */ + __pyx_v_mean = 0.0; + + /* "feature_gen.pyx":134 + * for j in range(n_cols): + * mean = 0 + * std = 0 # <<<<<<<<<<<<<< + * for k in range(n_elements): + * mean = mean + X[i, idx_columns[j, k]] + */ + __pyx_v_std = 0.0; + + /* "feature_gen.pyx":135 + * mean = 0 + * std = 0 + * for k in range(n_elements): # <<<<<<<<<<<<<< + * mean = mean + X[i, idx_columns[j, k]] + * mean /= n_elements + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":136 + * std = 0 + * for k in range(n_elements): + * mean = mean + X[i, idx_columns[j, k]] # <<<<<<<<<<<<<< + * mean /= n_elements + * for k in range(n_elements): + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_idx_columns.diminfo[1].strides)); + __pyx_v_mean = (__pyx_v_mean + (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides))); + } + + /* "feature_gen.pyx":137 + * for k in range(n_elements): + * mean = mean + X[i, idx_columns[j, k]] + * mean /= n_elements # <<<<<<<<<<<<<< + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ + */ + __pyx_v_mean = (__pyx_v_mean / __pyx_v_n_elements); + + /* "feature_gen.pyx":138 + * mean = mean + X[i, idx_columns[j, k]] + * mean /= n_elements + * for k in range(n_elements): # <<<<<<<<<<<<<< + * std += (X[i, idx_columns[j, k]] - mean) * \ + * (X[i, idx_columns[j, k]] - mean) + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":139 + * mean /= n_elements + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ # <<<<<<<<<<<<<< + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[1].strides)); + + /* "feature_gen.pyx":140 + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ + * (X[i, idx_columns[j, k]] - mean) # <<<<<<<<<<<<<< + * X_new[i, 2 * j] = mean + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator + */ + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_k; + __pyx_t_23 = __pyx_v_i; + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_idx_columns.diminfo[1].strides)); + + /* "feature_gen.pyx":139 + * mean /= n_elements + * for k in range(n_elements): + * std += (X[i, idx_columns[j, k]] - mean) * \ # <<<<<<<<<<<<<< + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean + */ + __pyx_v_std = (__pyx_v_std + (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) - __pyx_v_mean) * ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_23, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_24, __pyx_pybuffernd_X.diminfo[1].strides)) - __pyx_v_mean))); + } + + /* "feature_gen.pyx":141 + * std += (X[i, idx_columns[j, k]] - mean) * \ + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean # <<<<<<<<<<<<<< + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator + * return X_new + */ + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_v_mean; + + /* "feature_gen.pyx":142 + * (X[i, idx_columns[j, k]] - mean) + * X_new[i, 2 * j] = mean + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((__pyx_t_5numpy_float64_t)sqrt(__pyx_v_std)) / __pyx_v_denumerator); + } + } + } + + /* "feature_gen.pyx":130 + * cdef num_float_t std + * cdef num_float_t denumerator = (n_elements - 1) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":143 + * X_new[i, 2 * j] = mean + * X_new[i, 2 * j + 1] = sqrt(std) / denumerator + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":117 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] cluster_statistics( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.cluster_statistics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_47__pyx_fuse_1cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_11feature_gen_47__pyx_fuse_1cluster_statistics = {"__pyx_fuse_1cluster_statistics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_47__pyx_fuse_1cluster_statistics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_47__pyx_fuse_1cluster_statistics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1cluster_statistics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 117, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1cluster_statistics", 1, 2, 2, 1); __PYX_ERR(0, 117, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1cluster_statistics") < 0)) __PYX_ERR(0, 117, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1cluster_statistics", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 117, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1cluster_statistics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 118, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_46__pyx_fuse_1cluster_statistics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_46__pyx_fuse_1cluster_statistics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1cluster_statistics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 117, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_idx_columns.diminfo[1].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_idx_columns.diminfo[1].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_11feature_gen_cluster_statistics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1cluster_statistics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_13elementary_arithmetics = {"elementary_arithmetics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_13elementary_arithmetics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults3 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults3, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 149, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 149, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_11feature_gen_12elementary_arithmetics(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_12elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("elementary_arithmetics", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 149, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_6); + __Pyx_GIVEREF(__pyx_int_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_6)) __PYX_ERR(0, 149, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 149, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 149, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 149, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 149, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 149, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 149, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 149, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 149, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_51__pyx_fuse_0elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0elementary_arithmetics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":159 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":160 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":161 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * if operator == '+': + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 161, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__15, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 162, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":164 + * if operator == '+': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":165 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":166 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * elif operator == '*': + * with nogil: + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) + (__pyx_v_coef * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)))); + } + } + } + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L6; + } + __pyx_L6:; + } + } + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__3, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 167, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":169 + * elif operator == '*': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":170 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":171 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * else: + * with nogil: + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L13; + } + __pyx_L13:; + } + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*else*/ { + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":174 + * else: + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":175 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":176 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((float)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))) / ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) + __pyx_v_EPSILON)); + } + } + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L20; + } + __pyx_L20:; + } + } + } + __pyx_L3:; + + /* "feature_gen.pyx":177 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_51__pyx_fuse_0elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_11feature_gen_51__pyx_fuse_0elementary_arithmetics = {"__pyx_fuse_0elementary_arithmetics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_51__pyx_fuse_0elementary_arithmetics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_51__pyx_fuse_0elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + PyObject *__pyx_v_operator = 0; + float __pyx_v_coef; + float __pyx_v_EPSILON; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[6] = {0,0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0elementary_arithmetics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,&__pyx_n_s_operator,&__pyx_n_s_coef,&__pyx_n_s_EPSILON,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0elementary_arithmetics", 1, 6, 6, 1); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0elementary_arithmetics", 1, 6, 6, 2); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operator)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0elementary_arithmetics", 1, 6, 6, 3); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_coef)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0elementary_arithmetics", 1, 6, 6, 4); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_EPSILON)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[5]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0elementary_arithmetics", 1, 6, 6, 5); __PYX_ERR(0, 149, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0elementary_arithmetics") < 0)) __PYX_ERR(0, 149, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 6)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + __pyx_v_operator = values[3]; + __pyx_v_coef = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_coef == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) + __pyx_v_EPSILON = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_EPSILON == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0elementary_arithmetics", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 149, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 151, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_50__pyx_fuse_0elementary_arithmetics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_50__pyx_fuse_0elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0elementary_arithmetics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_11feature_gen_elementary_arithmetics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_53__pyx_fuse_1elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1elementary_arithmetics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":159 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":160 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":161 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * if operator == '+': + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 161, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__15, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 162, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":164 + * if operator == '+': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":165 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":166 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * elif operator == '*': + * with nogil: + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) + (__pyx_v_coef * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)))); + } + } + } + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L6; + } + __pyx_L6:; + } + } + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__3, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 167, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":169 + * elif operator == '*': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":170 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":171 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * else: + * with nogil: + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L13; + } + __pyx_L13:; + } + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*else*/ { + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":174 + * else: + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":175 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":176 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((float)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))) / ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) + __pyx_v_EPSILON)); + } + } + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L20; + } + __pyx_L20:; + } + } + } + __pyx_L3:; + + /* "feature_gen.pyx":177 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_53__pyx_fuse_1elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_11feature_gen_53__pyx_fuse_1elementary_arithmetics = {"__pyx_fuse_1elementary_arithmetics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_53__pyx_fuse_1elementary_arithmetics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_53__pyx_fuse_1elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + PyObject *__pyx_v_operator = 0; + float __pyx_v_coef; + float __pyx_v_EPSILON; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[6] = {0,0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1elementary_arithmetics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,&__pyx_n_s_operator,&__pyx_n_s_coef,&__pyx_n_s_EPSILON,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1elementary_arithmetics", 1, 6, 6, 1); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1elementary_arithmetics", 1, 6, 6, 2); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operator)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1elementary_arithmetics", 1, 6, 6, 3); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_coef)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1elementary_arithmetics", 1, 6, 6, 4); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_EPSILON)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[5]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1elementary_arithmetics", 1, 6, 6, 5); __PYX_ERR(0, 149, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1elementary_arithmetics") < 0)) __PYX_ERR(0, 149, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 6)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + __pyx_v_operator = values[3]; + __pyx_v_coef = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_coef == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) + __pyx_v_EPSILON = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_EPSILON == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1elementary_arithmetics", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 149, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 151, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_52__pyx_fuse_1elementary_arithmetics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_52__pyx_fuse_1elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1elementary_arithmetics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_11feature_gen_elementary_arithmetics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_55__pyx_fuse_2elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2elementary_arithmetics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":159 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":160 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":161 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * if operator == '+': + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 161, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__15, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 162, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":164 + * if operator == '+': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":165 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":166 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * elif operator == '*': + * with nogil: + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) + (__pyx_v_coef * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)))); + } + } + } + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L6; + } + __pyx_L6:; + } + } + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__3, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 167, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":169 + * elif operator == '*': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":170 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":171 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * else: + * with nogil: + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L13; + } + __pyx_L13:; + } + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*else*/ { + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":174 + * else: + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":175 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":176 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((float)(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))) / ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) + __pyx_v_EPSILON)); + } + } + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L20; + } + __pyx_L20:; + } + } + } + __pyx_L3:; + + /* "feature_gen.pyx":177 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_55__pyx_fuse_2elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_11feature_gen_55__pyx_fuse_2elementary_arithmetics = {"__pyx_fuse_2elementary_arithmetics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_55__pyx_fuse_2elementary_arithmetics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_55__pyx_fuse_2elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + PyObject *__pyx_v_operator = 0; + float __pyx_v_coef; + float __pyx_v_EPSILON; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[6] = {0,0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2elementary_arithmetics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,&__pyx_n_s_operator,&__pyx_n_s_coef,&__pyx_n_s_EPSILON,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2elementary_arithmetics", 1, 6, 6, 1); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2elementary_arithmetics", 1, 6, 6, 2); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operator)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2elementary_arithmetics", 1, 6, 6, 3); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_coef)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2elementary_arithmetics", 1, 6, 6, 4); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_EPSILON)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[5]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2elementary_arithmetics", 1, 6, 6, 5); __PYX_ERR(0, 149, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2elementary_arithmetics") < 0)) __PYX_ERR(0, 149, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 6)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + __pyx_v_operator = values[3]; + __pyx_v_coef = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_coef == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) + __pyx_v_EPSILON = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_EPSILON == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2elementary_arithmetics", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 149, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 151, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_54__pyx_fuse_2elementary_arithmetics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_54__pyx_fuse_2elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2elementary_arithmetics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_11feature_gen_elementary_arithmetics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_57__pyx_fuse_3elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3elementary_arithmetics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":159 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":160 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":161 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * if operator == '+': + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 161, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__15, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 162, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":164 + * if operator == '+': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":165 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":166 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * elif operator == '*': + * with nogil: + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) + (__pyx_v_coef * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)))); + } + } + } + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L6; + } + __pyx_L6:; + } + } + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__3, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 167, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":169 + * elif operator == '*': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":170 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":171 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * else: + * with nogil: + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L13; + } + __pyx_L13:; + } + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*else*/ { + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":174 + * else: + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":175 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":176 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) / ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) + __pyx_v_EPSILON)); + } + } + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L20; + } + __pyx_L20:; + } + } + } + __pyx_L3:; + + /* "feature_gen.pyx":177 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_57__pyx_fuse_3elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_11feature_gen_57__pyx_fuse_3elementary_arithmetics = {"__pyx_fuse_3elementary_arithmetics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_57__pyx_fuse_3elementary_arithmetics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_57__pyx_fuse_3elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + PyObject *__pyx_v_operator = 0; + float __pyx_v_coef; + float __pyx_v_EPSILON; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[6] = {0,0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3elementary_arithmetics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,&__pyx_n_s_operator,&__pyx_n_s_coef,&__pyx_n_s_EPSILON,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3elementary_arithmetics", 1, 6, 6, 1); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3elementary_arithmetics", 1, 6, 6, 2); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operator)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3elementary_arithmetics", 1, 6, 6, 3); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_coef)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3elementary_arithmetics", 1, 6, 6, 4); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_EPSILON)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[5]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3elementary_arithmetics", 1, 6, 6, 5); __PYX_ERR(0, 149, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3elementary_arithmetics") < 0)) __PYX_ERR(0, 149, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 6)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + __pyx_v_operator = values[3]; + __pyx_v_coef = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_coef == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) + __pyx_v_EPSILON = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_EPSILON == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3elementary_arithmetics", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 149, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 151, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_56__pyx_fuse_3elementary_arithmetics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_56__pyx_fuse_3elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3elementary_arithmetics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_11feature_gen_elementary_arithmetics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_59__pyx_fuse_4elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_13elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_elementary_arithmetics(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + __pyx_t_5numpy_int64_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4elementary_arithmetics", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":159 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":160 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":161 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * if operator == '+': + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 161, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__15, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 162, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":164 + * if operator == '+': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":165 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":166 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * elif operator == '*': + * with nogil: + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) + (__pyx_v_coef * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)))); + } + } + } + + /* "feature_gen.pyx":163 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L6; + } + __pyx_L6:; + } + } + + /* "feature_gen.pyx":162 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) + * if operator == '+': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_9 = (__Pyx_PyUnicode_Equals(__pyx_v_operator, __pyx_kp_u__3, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 167, __pyx_L1_error) + if (__pyx_t_9) { + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":169 + * elif operator == '*': + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":170 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":171 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] # <<<<<<<<<<<<<< + * else: + * with nogil: + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_21 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides))); + } + } + } + + /* "feature_gen.pyx":168 + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L13; + } + __pyx_L13:; + } + } + + /* "feature_gen.pyx":167 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] + * elif operator == '*': # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + goto __pyx_L3; + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*else*/ { + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":174 + * else: + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_7; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen.pyx":175 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen.pyx":176 + * for i in range(n_rows): + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_j; + __pyx_t_19 = __pyx_v_i; + __pyx_t_20 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_21 = __pyx_v_i; + __pyx_t_22 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[1].strides) = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides)) / ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_X.diminfo[1].strides)) + __pyx_v_EPSILON)); + } + } + } + + /* "feature_gen.pyx":173 + * X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] + * else: + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L20; + } + __pyx_L20:; + } + } + } + __pyx_L3:; + + /* "feature_gen.pyx":177 + * for j in range(n_cols): + * X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_59__pyx_fuse_4elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_11feature_gen_59__pyx_fuse_4elementary_arithmetics = {"__pyx_fuse_4elementary_arithmetics", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_59__pyx_fuse_4elementary_arithmetics, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_59__pyx_fuse_4elementary_arithmetics(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + PyObject *__pyx_v_operator = 0; + float __pyx_v_coef; + float __pyx_v_EPSILON; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[6] = {0,0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4elementary_arithmetics (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,&__pyx_n_s_operator,&__pyx_n_s_coef,&__pyx_n_s_EPSILON,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4elementary_arithmetics", 1, 6, 6, 1); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4elementary_arithmetics", 1, 6, 6, 2); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operator)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4elementary_arithmetics", 1, 6, 6, 3); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_coef)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4elementary_arithmetics", 1, 6, 6, 4); __PYX_ERR(0, 149, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_EPSILON)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[5]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4elementary_arithmetics", 1, 6, 6, 5); __PYX_ERR(0, 149, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4elementary_arithmetics") < 0)) __PYX_ERR(0, 149, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 6)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + __pyx_v_operator = values[3]; + __pyx_v_coef = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_coef == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) + __pyx_v_EPSILON = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_EPSILON == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4elementary_arithmetics", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 149, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 151, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_58__pyx_fuse_4elementary_arithmetics(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_58__pyx_fuse_4elementary_arithmetics(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, PyObject *__pyx_v_operator, float __pyx_v_coef, float __pyx_v_EPSILON) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4elementary_arithmetics", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 149, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_11feature_gen_elementary_arithmetics(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, __pyx_v_operator, __pyx_v_coef, __pyx_v_EPSILON, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4elementary_arithmetics", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_15plan_rotation = {"plan_rotation", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_15plan_rotation, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults4 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 182, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_11feature_gen_14plan_rotation(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_14plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("plan_rotation", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 182, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_5); + __Pyx_GIVEREF(__pyx_int_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_5)) __PYX_ERR(0, 182, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 182, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 182, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 182, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 182, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 182, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 182, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 182, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 182, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_63__pyx_fuse_0plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_plan_rotation(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + __pyx_t_5numpy_int64_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0plan_rotation", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":192 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":193 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_x)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":194 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_cos_vec)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[0]); + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "feature_gen.pyx":196 + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long(((2 * __pyx_v_n_cols) * __pyx_v_n_elements)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 195, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":198 + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_elements): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":199 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":200 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_elements): # <<<<<<<<<<<<<< + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":201 + * for j in range(n_cols): + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] # <<<<<<<<<<<<<< + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_k; + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_24 = __pyx_v_k; + __pyx_t_25 = __pyx_v_i; + __pyx_t_26 = ((2 * __pyx_v_k) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_cos_vec.diminfo[0].strides))) - ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_sin_vec.diminfo[0].strides)))); + + /* "feature_gen.pyx":202 + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_24 = __pyx_v_j; + __pyx_t_21 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_17 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_k; + __pyx_t_26 = __pyx_v_i; + __pyx_t_25 = (((2 * __pyx_v_k) + 1) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_sin_vec.diminfo[0].strides))) + ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_cos_vec.diminfo[0].strides)))); + } + } + } + } + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":203 + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_63__pyx_fuse_0plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_11feature_gen_63__pyx_fuse_0plan_rotation = {"__pyx_fuse_0plan_rotation", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_63__pyx_fuse_0plan_rotation, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_63__pyx_fuse_0plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_x = 0; + PyArrayObject *__pyx_v_idx_columns_y = 0; + PyArrayObject *__pyx_v_cos_vec = 0; + PyArrayObject *__pyx_v_sin_vec = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0plan_rotation (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_x,&__pyx_n_s_idx_columns_y,&__pyx_n_s_cos_vec,&__pyx_n_s_sin_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_x)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0plan_rotation", 1, 5, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_y)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0plan_rotation", 1, 5, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cos_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0plan_rotation", 1, 5, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sin_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0plan_rotation", 1, 5, 5, 4); __PYX_ERR(0, 182, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0plan_rotation") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_x = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_y = ((PyArrayObject *)values[2]); + __pyx_v_cos_vec = ((PyArrayObject *)values[3]); + __pyx_v_sin_vec = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0plan_rotation", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 182, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 183, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_x), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_x", 0))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_y), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_y", 0))) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cos_vec), __pyx_ptype_5numpy_ndarray, 1, "cos_vec", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sin_vec), __pyx_ptype_5numpy_ndarray, 1, "sin_vec", 0))) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_62__pyx_fuse_0plan_rotation(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_62__pyx_fuse_0plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0plan_rotation", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_11feature_gen_plan_rotation(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_65__pyx_fuse_1plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_plan_rotation(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + __pyx_t_5numpy_int64_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1plan_rotation", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":192 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":193 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_x)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":194 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_cos_vec)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[0]); + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "feature_gen.pyx":196 + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long(((2 * __pyx_v_n_cols) * __pyx_v_n_elements)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 195, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":198 + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_elements): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":199 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":200 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_elements): # <<<<<<<<<<<<<< + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":201 + * for j in range(n_cols): + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] # <<<<<<<<<<<<<< + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_k; + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_24 = __pyx_v_k; + __pyx_t_25 = __pyx_v_i; + __pyx_t_26 = ((2 * __pyx_v_k) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_cos_vec.diminfo[0].strides))) - ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_sin_vec.diminfo[0].strides)))); + + /* "feature_gen.pyx":202 + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_24 = __pyx_v_j; + __pyx_t_21 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_17 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_k; + __pyx_t_26 = __pyx_v_i; + __pyx_t_25 = (((2 * __pyx_v_k) + 1) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_sin_vec.diminfo[0].strides))) + ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_cos_vec.diminfo[0].strides)))); + } + } + } + } + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":203 + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_65__pyx_fuse_1plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_11feature_gen_65__pyx_fuse_1plan_rotation = {"__pyx_fuse_1plan_rotation", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_65__pyx_fuse_1plan_rotation, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_65__pyx_fuse_1plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_x = 0; + PyArrayObject *__pyx_v_idx_columns_y = 0; + PyArrayObject *__pyx_v_cos_vec = 0; + PyArrayObject *__pyx_v_sin_vec = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1plan_rotation (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_x,&__pyx_n_s_idx_columns_y,&__pyx_n_s_cos_vec,&__pyx_n_s_sin_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_x)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1plan_rotation", 1, 5, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_y)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1plan_rotation", 1, 5, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cos_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1plan_rotation", 1, 5, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sin_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1plan_rotation", 1, 5, 5, 4); __PYX_ERR(0, 182, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1plan_rotation") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_x = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_y = ((PyArrayObject *)values[2]); + __pyx_v_cos_vec = ((PyArrayObject *)values[3]); + __pyx_v_sin_vec = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1plan_rotation", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 182, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 183, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_x), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_x", 0))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_y), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_y", 0))) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cos_vec), __pyx_ptype_5numpy_ndarray, 1, "cos_vec", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sin_vec), __pyx_ptype_5numpy_ndarray, 1, "sin_vec", 0))) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_64__pyx_fuse_1plan_rotation(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_64__pyx_fuse_1plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1plan_rotation", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_11feature_gen_plan_rotation(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_67__pyx_fuse_2plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_plan_rotation(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + __pyx_t_5numpy_int64_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2plan_rotation", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":192 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":193 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_x)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":194 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_cos_vec)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[0]); + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "feature_gen.pyx":196 + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long(((2 * __pyx_v_n_cols) * __pyx_v_n_elements)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 195, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":198 + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_elements): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":199 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":200 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_elements): # <<<<<<<<<<<<<< + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":201 + * for j in range(n_cols): + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] # <<<<<<<<<<<<<< + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_k; + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_24 = __pyx_v_k; + __pyx_t_25 = __pyx_v_i; + __pyx_t_26 = ((2 * __pyx_v_k) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_cos_vec.diminfo[0].strides))) - ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_sin_vec.diminfo[0].strides)))); + + /* "feature_gen.pyx":202 + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_24 = __pyx_v_j; + __pyx_t_21 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_17 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_k; + __pyx_t_26 = __pyx_v_i; + __pyx_t_25 = (((2 * __pyx_v_k) + 1) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_sin_vec.diminfo[0].strides))) + ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_cos_vec.diminfo[0].strides)))); + } + } + } + } + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":203 + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_67__pyx_fuse_2plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_11feature_gen_67__pyx_fuse_2plan_rotation = {"__pyx_fuse_2plan_rotation", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_67__pyx_fuse_2plan_rotation, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_67__pyx_fuse_2plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_x = 0; + PyArrayObject *__pyx_v_idx_columns_y = 0; + PyArrayObject *__pyx_v_cos_vec = 0; + PyArrayObject *__pyx_v_sin_vec = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2plan_rotation (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_x,&__pyx_n_s_idx_columns_y,&__pyx_n_s_cos_vec,&__pyx_n_s_sin_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_x)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2plan_rotation", 1, 5, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_y)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2plan_rotation", 1, 5, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cos_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2plan_rotation", 1, 5, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sin_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2plan_rotation", 1, 5, 5, 4); __PYX_ERR(0, 182, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2plan_rotation") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_x = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_y = ((PyArrayObject *)values[2]); + __pyx_v_cos_vec = ((PyArrayObject *)values[3]); + __pyx_v_sin_vec = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2plan_rotation", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 182, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 183, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_x), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_x", 0))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_y), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_y", 0))) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cos_vec), __pyx_ptype_5numpy_ndarray, 1, "cos_vec", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sin_vec), __pyx_ptype_5numpy_ndarray, 1, "sin_vec", 0))) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_66__pyx_fuse_2plan_rotation(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_66__pyx_fuse_2plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2plan_rotation", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_11feature_gen_plan_rotation(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_69__pyx_fuse_3plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_plan_rotation(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + __pyx_t_5numpy_int64_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3plan_rotation", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":192 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":193 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_x)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":194 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_cos_vec)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[0]); + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "feature_gen.pyx":196 + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long(((2 * __pyx_v_n_cols) * __pyx_v_n_elements)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 195, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":198 + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_elements): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":199 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":200 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_elements): # <<<<<<<<<<<<<< + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":201 + * for j in range(n_cols): + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] # <<<<<<<<<<<<<< + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_k; + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_24 = __pyx_v_k; + __pyx_t_25 = __pyx_v_i; + __pyx_t_26 = ((2 * __pyx_v_k) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_cos_vec.diminfo[0].strides))) - ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_sin_vec.diminfo[0].strides)))); + + /* "feature_gen.pyx":202 + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_24 = __pyx_v_j; + __pyx_t_21 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_17 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_k; + __pyx_t_26 = __pyx_v_i; + __pyx_t_25 = (((2 * __pyx_v_k) + 1) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_sin_vec.diminfo[0].strides))) + ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_cos_vec.diminfo[0].strides)))); + } + } + } + } + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":203 + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_69__pyx_fuse_3plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_11feature_gen_69__pyx_fuse_3plan_rotation = {"__pyx_fuse_3plan_rotation", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_69__pyx_fuse_3plan_rotation, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_69__pyx_fuse_3plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_x = 0; + PyArrayObject *__pyx_v_idx_columns_y = 0; + PyArrayObject *__pyx_v_cos_vec = 0; + PyArrayObject *__pyx_v_sin_vec = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3plan_rotation (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_x,&__pyx_n_s_idx_columns_y,&__pyx_n_s_cos_vec,&__pyx_n_s_sin_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_x)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3plan_rotation", 1, 5, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_y)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3plan_rotation", 1, 5, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cos_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3plan_rotation", 1, 5, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sin_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3plan_rotation", 1, 5, 5, 4); __PYX_ERR(0, 182, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3plan_rotation") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_x = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_y = ((PyArrayObject *)values[2]); + __pyx_v_cos_vec = ((PyArrayObject *)values[3]); + __pyx_v_sin_vec = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3plan_rotation", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 182, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 183, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_x), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_x", 0))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_y), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_y", 0))) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cos_vec), __pyx_ptype_5numpy_ndarray, 1, "cos_vec", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sin_vec), __pyx_ptype_5numpy_ndarray, 1, "sin_vec", 0))) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_68__pyx_fuse_3plan_rotation(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_68__pyx_fuse_3plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3plan_rotation", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_11feature_gen_plan_rotation(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_71__pyx_fuse_4plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_15plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_plan_rotation(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_n_elements; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + __pyx_t_5numpy_int64_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4plan_rotation", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen.pyx":192 + * cdef int j + * cdef int k + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":193 + * cdef int k + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] # <<<<<<<<<<<<<< + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_x)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":194 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_cos_vec)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error) + __pyx_v_n_elements = (__pyx_t_1[0]); + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "feature_gen.pyx":196 + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long(((2 * __pyx_v_n_cols) * __pyx_v_n_elements)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 196, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "feature_gen.pyx":195 + * cdef int n_cols = idx_columns_x.shape[0] + * cdef int n_elements = cos_vec.shape[0] + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( # <<<<<<<<<<<<<< + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 195, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":198 + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_elements): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":199 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":200 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_elements): # <<<<<<<<<<<<<< + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + */ + __pyx_t_14 = __pyx_v_n_elements; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":201 + * for j in range(n_cols): + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] # <<<<<<<<<<<<<< + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_20 = __pyx_v_k; + __pyx_t_21 = __pyx_v_j; + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_24 = __pyx_v_k; + __pyx_t_25 = __pyx_v_i; + __pyx_t_26 = ((2 * __pyx_v_k) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_cos_vec.diminfo[0].strides))) - ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_sin_vec.diminfo[0].strides)))); + + /* "feature_gen.pyx":202 + * for k in range(n_elements): + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_24 = __pyx_v_j; + __pyx_t_21 = __pyx_v_i; + __pyx_t_23 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_idx_columns_x.diminfo[0].strides)); + __pyx_t_22 = __pyx_v_k; + __pyx_t_20 = __pyx_v_j; + __pyx_t_17 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_idx_columns_y.diminfo[0].strides)); + __pyx_t_18 = __pyx_v_k; + __pyx_t_26 = __pyx_v_i; + __pyx_t_25 = (((2 * __pyx_v_k) + 1) + ((2 * __pyx_v_j) * __pyx_v_n_elements)); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_X_new.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_sin_vec.diminfo[0].strides))) + ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides)) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_cos_vec.diminfo[0].strides)))); + } + } + } + } + + /* "feature_gen.pyx":197 + * cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( + * (n_rows, 2 * n_cols * n_elements), np.float64) + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":203 + * X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] + * X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_71__pyx_fuse_4plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_11feature_gen_71__pyx_fuse_4plan_rotation = {"__pyx_fuse_4plan_rotation", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_71__pyx_fuse_4plan_rotation, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_71__pyx_fuse_4plan_rotation(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_x = 0; + PyArrayObject *__pyx_v_idx_columns_y = 0; + PyArrayObject *__pyx_v_cos_vec = 0; + PyArrayObject *__pyx_v_sin_vec = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4plan_rotation (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_x,&__pyx_n_s_idx_columns_y,&__pyx_n_s_cos_vec,&__pyx_n_s_sin_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_x)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4plan_rotation", 1, 5, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_y)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4plan_rotation", 1, 5, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cos_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4plan_rotation", 1, 5, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sin_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[4]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4plan_rotation", 1, 5, 5, 4); __PYX_ERR(0, 182, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4plan_rotation") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 5)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_x = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_y = ((PyArrayObject *)values[2]); + __pyx_v_cos_vec = ((PyArrayObject *)values[3]); + __pyx_v_sin_vec = ((PyArrayObject *)values[4]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4plan_rotation", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 182, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 183, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_x), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_x", 0))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_y), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_y", 0))) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cos_vec), __pyx_ptype_5numpy_ndarray, 1, "cos_vec", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sin_vec), __pyx_ptype_5numpy_ndarray, 1, "sin_vec", 0))) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_70__pyx_fuse_4plan_rotation(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_70__pyx_fuse_4plan_rotation(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_x, PyArrayObject *__pyx_v_idx_columns_y, PyArrayObject *__pyx_v_cos_vec, PyArrayObject *__pyx_v_sin_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cos_vec; + __Pyx_Buffer __pyx_pybuffer_cos_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_x; + __Pyx_Buffer __pyx_pybuffer_idx_columns_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_y; + __Pyx_Buffer __pyx_pybuffer_idx_columns_y; + __Pyx_LocalBuf_ND __pyx_pybuffernd_sin_vec; + __Pyx_Buffer __pyx_pybuffer_sin_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4plan_rotation", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_x.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_x.refcount = 0; + __pyx_pybuffernd_idx_columns_x.data = NULL; + __pyx_pybuffernd_idx_columns_x.rcbuffer = &__pyx_pybuffer_idx_columns_x; + __pyx_pybuffer_idx_columns_y.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_y.refcount = 0; + __pyx_pybuffernd_idx_columns_y.data = NULL; + __pyx_pybuffernd_idx_columns_y.rcbuffer = &__pyx_pybuffer_idx_columns_y; + __pyx_pybuffer_cos_vec.pybuffer.buf = NULL; + __pyx_pybuffer_cos_vec.refcount = 0; + __pyx_pybuffernd_cos_vec.data = NULL; + __pyx_pybuffernd_cos_vec.rcbuffer = &__pyx_pybuffer_cos_vec; + __pyx_pybuffer_sin_vec.pybuffer.buf = NULL; + __pyx_pybuffer_sin_vec.refcount = 0; + __pyx_pybuffernd_sin_vec.data = NULL; + __pyx_pybuffernd_sin_vec.rcbuffer = &__pyx_pybuffer_sin_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_x, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_x.diminfo[0].strides = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_x.diminfo[0].shape = __pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_y.diminfo[0].strides = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_y.diminfo[0].shape = __pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_cos_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_cos_vec.diminfo[0].strides = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cos_vec.diminfo[0].shape = __pyx_pybuffernd_cos_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_sin_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 182, __pyx_L1_error) + } + __pyx_pybuffernd_sin_vec.diminfo[0].strides = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sin_vec.diminfo[0].shape = __pyx_pybuffernd_sin_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_11feature_gen_plan_rotation(((PyArrayObject *)__pyx_v_X), __pyx_v_idx_columns_x, __pyx_v_idx_columns_y, __pyx_v_cos_vec, __pyx_v_sin_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4plan_rotation", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cos_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_x.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_y.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sin_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_17polynomial = {"polynomial", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_17polynomial, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults5 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 208, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 208, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_11feature_gen_16polynomial(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_16polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + int __pyx_v___pyx_fused_dtype_int16__t_is_signed; + int __pyx_v___pyx_fused_dtype_int32__t_is_signed; + int __pyx_v___pyx_fused_dtype_int64__t_is_signed; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("polynomial", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 208, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + __pyx_v___pyx_fused_dtype_int16__t_is_signed = (!(((__pyx_t_5numpy_int16_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int32__t_is_signed = (!(((__pyx_t_5numpy_int32_t)-1L) > 0)); + __pyx_v___pyx_fused_dtype_int64__t_is_signed = (!(((__pyx_t_5numpy_int64_t)-1L) > 0)); + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 208, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 208, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int16_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int16__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L20_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int32__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L20_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_int64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_4 = (!(__pyx_v___pyx_fused_dtype_int64__t_is_signed ^ __pyx_v_dtype_signed)); + __pyx_t_2 = __pyx_t_4; + __pyx_L24_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L28_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L28_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L34_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L45_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int16_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L44_next_and; + } + __pyx_L45_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int16_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L43_bool_binop_done; + } + __pyx_L44_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L43_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int16_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L51_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L50_next_and; + } + __pyx_L51_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L49_bool_binop_done; + } + __pyx_L50_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L49_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L57_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_int64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L56_next_and; + } + __pyx_L57_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_int64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L55_bool_binop_done; + } + __pyx_L56_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L55_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_int64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L63_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L62_next_and; + } + __pyx_L63_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L61_bool_binop_done; + } + __pyx_L62_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L61_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L69_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L68_next_and; + } + __pyx_L69_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L67_bool_binop_done; + } + __pyx_L68_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L36_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L67_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L36_except_error) + goto __pyx_L39_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L41_try_end; + __pyx_L34_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 208, __pyx_L36_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L35_exception_handled; + } + goto __pyx_L36_except_error; + __pyx_L36_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L39_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L35_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L41_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 208, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L79; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L79:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 208, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L83; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 208, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 208, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 208, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L83:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L98_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L98_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L82_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L82_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L100_for_end; + __pyx_L100_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 208, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("feature_gen.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_75__pyx_fuse_0polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_11feature_gen_polynomial(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5numpy_int64_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0polynomial", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":213 + * int degree, + * ): + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 213, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":214 + * ): + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_combinations_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":215 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 215, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 215, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":216 + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int k = 0 + */ + __pyx_v_i = 0; + + /* "feature_gen.pyx":217 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int k = 0 + * with nogil: + */ + __pyx_v_j = 0; + + /* "feature_gen.pyx":218 + * cdef int i = 0 + * cdef int j = 0 + * cdef int k = 0 # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_k = 0; + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":220 + * cdef int k = 0 + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(degree): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":221 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(degree): + * if combinations_np[j, k] >= 0: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":222 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(degree): # <<<<<<<<<<<<<< + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + */ + __pyx_t_14 = __pyx_v_degree; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)) >= 0); + if (__pyx_t_19) { + + /* "feature_gen.pyx":224 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X_new.diminfo[1].strides) *= (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + } + } + } + } + } + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":225 + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_75__pyx_fuse_0polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_11feature_gen_75__pyx_fuse_0polynomial = {"__pyx_fuse_0polynomial", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_75__pyx_fuse_0polynomial, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_75__pyx_fuse_0polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_combinations_np = 0; + int __pyx_v_degree; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0polynomial (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_combinations_np,&__pyx_n_s_degree,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_combinations_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0polynomial", 1, 3, 3, 1); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_degree)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0polynomial", 1, 3, 3, 2); __PYX_ERR(0, 208, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0polynomial") < 0)) __PYX_ERR(0, 208, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_combinations_np = ((PyArrayObject *)values[1]); + __pyx_v_degree = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_degree == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 211, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0polynomial", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 208, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 209, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_combinations_np), __pyx_ptype_5numpy_ndarray, 1, "combinations_np", 0))) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_74__pyx_fuse_0polynomial(__pyx_self, __pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_74__pyx_fuse_0polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0polynomial", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_11feature_gen_polynomial(((PyArrayObject *)__pyx_v_X), __pyx_v_combinations_np, __pyx_v_degree, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_0polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_77__pyx_fuse_1polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_11feature_gen_polynomial(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5numpy_int64_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1polynomial", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":213 + * int degree, + * ): + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 213, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":214 + * ): + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_combinations_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":215 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 215, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 215, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":216 + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int k = 0 + */ + __pyx_v_i = 0; + + /* "feature_gen.pyx":217 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int k = 0 + * with nogil: + */ + __pyx_v_j = 0; + + /* "feature_gen.pyx":218 + * cdef int i = 0 + * cdef int j = 0 + * cdef int k = 0 # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_k = 0; + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":220 + * cdef int k = 0 + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(degree): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":221 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(degree): + * if combinations_np[j, k] >= 0: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":222 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(degree): # <<<<<<<<<<<<<< + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + */ + __pyx_t_14 = __pyx_v_degree; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)) >= 0); + if (__pyx_t_19) { + + /* "feature_gen.pyx":224 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X_new.diminfo[1].strides) *= (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + } + } + } + } + } + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":225 + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_77__pyx_fuse_1polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_11feature_gen_77__pyx_fuse_1polynomial = {"__pyx_fuse_1polynomial", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_77__pyx_fuse_1polynomial, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_77__pyx_fuse_1polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_combinations_np = 0; + int __pyx_v_degree; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1polynomial (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_combinations_np,&__pyx_n_s_degree,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_combinations_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1polynomial", 1, 3, 3, 1); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_degree)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1polynomial", 1, 3, 3, 2); __PYX_ERR(0, 208, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1polynomial") < 0)) __PYX_ERR(0, 208, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_combinations_np = ((PyArrayObject *)values[1]); + __pyx_v_degree = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_degree == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 211, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1polynomial", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 208, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 209, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_combinations_np), __pyx_ptype_5numpy_ndarray, 1, "combinations_np", 0))) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_76__pyx_fuse_1polynomial(__pyx_self, __pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_76__pyx_fuse_1polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1polynomial", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_11feature_gen_polynomial(((PyArrayObject *)__pyx_v_X), __pyx_v_combinations_np, __pyx_v_degree, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_1polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_79__pyx_fuse_2polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_2__pyx_f_11feature_gen_polynomial(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5numpy_int64_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2polynomial", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":213 + * int degree, + * ): + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 213, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":214 + * ): + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_combinations_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":215 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 215, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 215, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":216 + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int k = 0 + */ + __pyx_v_i = 0; + + /* "feature_gen.pyx":217 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int k = 0 + * with nogil: + */ + __pyx_v_j = 0; + + /* "feature_gen.pyx":218 + * cdef int i = 0 + * cdef int j = 0 + * cdef int k = 0 # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_k = 0; + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":220 + * cdef int k = 0 + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(degree): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":221 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(degree): + * if combinations_np[j, k] >= 0: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":222 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(degree): # <<<<<<<<<<<<<< + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + */ + __pyx_t_14 = __pyx_v_degree; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)) >= 0); + if (__pyx_t_19) { + + /* "feature_gen.pyx":224 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X_new.diminfo[1].strides) *= (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + } + } + } + } + } + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":225 + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_79__pyx_fuse_2polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_2__pyx_mdef_11feature_gen_79__pyx_fuse_2polynomial = {"__pyx_fuse_2polynomial", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_79__pyx_fuse_2polynomial, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_79__pyx_fuse_2polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_combinations_np = 0; + int __pyx_v_degree; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_2polynomial (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_combinations_np,&__pyx_n_s_degree,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_combinations_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2polynomial", 1, 3, 3, 1); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_degree)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2polynomial", 1, 3, 3, 2); __PYX_ERR(0, 208, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_2polynomial") < 0)) __PYX_ERR(0, 208, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_combinations_np = ((PyArrayObject *)values[1]); + __pyx_v_degree = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_degree == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 211, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_2polynomial", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 208, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 209, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_combinations_np), __pyx_ptype_5numpy_ndarray, 1, "combinations_np", 0))) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_78__pyx_fuse_2polynomial(__pyx_self, __pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_78__pyx_fuse_2polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_2polynomial", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_2__pyx_f_11feature_gen_polynomial(((PyArrayObject *)__pyx_v_X), __pyx_v_combinations_np, __pyx_v_degree, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_2polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_81__pyx_fuse_3polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_3__pyx_f_11feature_gen_polynomial(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5numpy_int64_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3polynomial", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":213 + * int degree, + * ): + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 213, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":214 + * ): + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_combinations_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":215 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 215, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 215, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":216 + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int k = 0 + */ + __pyx_v_i = 0; + + /* "feature_gen.pyx":217 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int k = 0 + * with nogil: + */ + __pyx_v_j = 0; + + /* "feature_gen.pyx":218 + * cdef int i = 0 + * cdef int j = 0 + * cdef int k = 0 # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_k = 0; + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":220 + * cdef int k = 0 + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(degree): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":221 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(degree): + * if combinations_np[j, k] >= 0: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":222 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(degree): # <<<<<<<<<<<<<< + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + */ + __pyx_t_14 = __pyx_v_degree; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)) >= 0); + if (__pyx_t_19) { + + /* "feature_gen.pyx":224 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X_new.diminfo[1].strides) *= (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + } + } + } + } + } + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":225 + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_81__pyx_fuse_3polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_3__pyx_mdef_11feature_gen_81__pyx_fuse_3polynomial = {"__pyx_fuse_3polynomial", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_81__pyx_fuse_3polynomial, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_81__pyx_fuse_3polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_combinations_np = 0; + int __pyx_v_degree; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_3polynomial (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_combinations_np,&__pyx_n_s_degree,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_combinations_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3polynomial", 1, 3, 3, 1); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_degree)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3polynomial", 1, 3, 3, 2); __PYX_ERR(0, 208, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_3polynomial") < 0)) __PYX_ERR(0, 208, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_combinations_np = ((PyArrayObject *)values[1]); + __pyx_v_degree = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_degree == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 211, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_3polynomial", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 208, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 209, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_combinations_np), __pyx_ptype_5numpy_ndarray, 1, "combinations_np", 0))) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_80__pyx_fuse_3polynomial(__pyx_self, __pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_80__pyx_fuse_3polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_3polynomial", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_3__pyx_f_11feature_gen_polynomial(((PyArrayObject *)__pyx_v_X), __pyx_v_combinations_np, __pyx_v_degree, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_3polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_11feature_gen_83__pyx_fuse_4polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_11feature_gen_17polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_4__pyx_f_11feature_gen_polynomial(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5numpy_int64_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4polynomial", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":213 + * int degree, + * ): + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 213, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":214 + * ): + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_combinations_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":215 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 215, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 215, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":216 + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int k = 0 + */ + __pyx_v_i = 0; + + /* "feature_gen.pyx":217 + * cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int k = 0 + * with nogil: + */ + __pyx_v_j = 0; + + /* "feature_gen.pyx":218 + * cdef int i = 0 + * cdef int j = 0 + * cdef int k = 0 # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_v_k = 0; + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "feature_gen.pyx":220 + * cdef int k = 0 + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(degree): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":221 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(degree): + * if combinations_np[j, k] >= 0: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":222 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(degree): # <<<<<<<<<<<<<< + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + */ + __pyx_t_14 = __pyx_v_degree; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)) >= 0); + if (__pyx_t_19) { + + /* "feature_gen.pyx":224 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_X_new.diminfo[1].strides) *= (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "feature_gen.pyx":223 + * for j in range(n_cols): + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new + */ + } + } + } + } + } + + /* "feature_gen.pyx":219 + * cdef int j = 0 + * cdef int k = 0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "feature_gen.pyx":225 + * if combinations_np[j, k] >= 0: + * X_new[i, j] *= X[i, combinations_np[j, k]] + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_83__pyx_fuse_4polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_4__pyx_mdef_11feature_gen_83__pyx_fuse_4polynomial = {"__pyx_fuse_4polynomial", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11feature_gen_83__pyx_fuse_4polynomial, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_83__pyx_fuse_4polynomial(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_combinations_np = 0; + int __pyx_v_degree; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_4polynomial (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_combinations_np,&__pyx_n_s_degree,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_combinations_np)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4polynomial", 1, 3, 3, 1); __PYX_ERR(0, 208, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_degree)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4polynomial", 1, 3, 3, 2); __PYX_ERR(0, 208, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_4polynomial") < 0)) __PYX_ERR(0, 208, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_combinations_np = ((PyArrayObject *)values[1]); + __pyx_v_degree = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_degree == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 211, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_4polynomial", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 208, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 209, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_combinations_np), __pyx_ptype_5numpy_ndarray, 1, "combinations_np", 0))) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_82__pyx_fuse_4polynomial(__pyx_self, __pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_82__pyx_fuse_4polynomial(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_4polynomial", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 208, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_4__pyx_f_11feature_gen_polynomial(((PyArrayObject *)__pyx_v_X), __pyx_v_combinations_np, __pyx_v_degree, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.__pyx_fuse_4polynomial", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen.pyx":230 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] polynomial_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + +static PyObject *__pyx_pw_11feature_gen_19polynomial_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_11feature_gen_polynomial_object(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + PyObject *__pyx_v_val = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5numpy_int64_t __pyx_t_21; + PyObject **__pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("polynomial_object", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 230, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 230, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen.pyx":235 + * int degree, + * ): + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.zeros((n_rows, n_cols), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen.pyx":236 + * ): + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[object, ndim = 2] X_new = np.zeros((n_rows, n_cols), object) + * cdef int i = 0 + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_combinations_np)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 236, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen.pyx":237 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.zeros((n_rows, n_cols), object) # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 237, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 237, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 237, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen.pyx":238 + * cdef int n_cols = combinations_np.shape[0] + * cdef np.ndarray[object, ndim = 2] X_new = np.zeros((n_rows, n_cols), object) + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int k = 0 + */ + __pyx_v_i = 0; + + /* "feature_gen.pyx":239 + * cdef np.ndarray[object, ndim = 2] X_new = np.zeros((n_rows, n_cols), object) + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int k = 0 + * cdef object val + */ + __pyx_v_j = 0; + + /* "feature_gen.pyx":240 + * cdef int i = 0 + * cdef int j = 0 + * cdef int k = 0 # <<<<<<<<<<<<<< + * cdef object val + * for i in range(n_rows): + */ + __pyx_v_k = 0; + + /* "feature_gen.pyx":242 + * cdef int k = 0 + * cdef object val + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * val = '' + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen.pyx":243 + * cdef object val + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * val = '' + * for k in range(degree): + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen.pyx":244 + * for i in range(n_rows): + * for j in range(n_cols): + * val = '' # <<<<<<<<<<<<<< + * for k in range(degree): + * if combinations_np[j, k] >= 0: + */ + __Pyx_INCREF(__pyx_kp_u__16); + __Pyx_XDECREF_SET(__pyx_v_val, __pyx_kp_u__16); + + /* "feature_gen.pyx":245 + * for j in range(n_cols): + * val = '' + * for k in range(degree): # <<<<<<<<<<<<<< + * if combinations_np[j, k] >= 0: + * if X[i, combinations_np[j, k]] == None: + */ + __pyx_t_14 = __pyx_v_degree; + __pyx_t_15 = __pyx_t_14; + for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { + __pyx_v_k = __pyx_t_16; + + /* "feature_gen.pyx":246 + * val = '' + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * if X[i, combinations_np[j, k]] == None: + * continue + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_19 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)) >= 0); + if (__pyx_t_19) { + + /* "feature_gen.pyx":247 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * if X[i, combinations_np[j, k]] == None: # <<<<<<<<<<<<<< + * continue + * val += str(X[i, combinations_np[j, k]]) + */ + __pyx_t_18 = __pyx_v_j; + __pyx_t_17 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 247, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_19 < 0))) __PYX_ERR(0, 247, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_19) { + + /* "feature_gen.pyx":248 + * if combinations_np[j, k] >= 0: + * if X[i, combinations_np[j, k]] == None: + * continue # <<<<<<<<<<<<<< + * val += str(X[i, combinations_np[j, k]]) + * X_new[i, j] = val + */ + goto __pyx_L7_continue; + + /* "feature_gen.pyx":247 + * for k in range(degree): + * if combinations_np[j, k] >= 0: + * if X[i, combinations_np[j, k]] == None: # <<<<<<<<<<<<<< + * continue + * val += str(X[i, combinations_np[j, k]]) + */ + } + + /* "feature_gen.pyx":249 + * if X[i, combinations_np[j, k]] == None: + * continue + * val += str(X[i, combinations_np[j, k]]) # <<<<<<<<<<<<<< + * X_new[i, j] = val + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_k; + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_combinations_np.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_combinations_np.diminfo[1].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_2 = __Pyx_PyObject_Str(__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_val, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_4); + __pyx_t_4 = 0; + + /* "feature_gen.pyx":246 + * val = '' + * for k in range(degree): + * if combinations_np[j, k] >= 0: # <<<<<<<<<<<<<< + * if X[i, combinations_np[j, k]] == None: + * continue + */ + } + __pyx_L7_continue:; + } + + /* "feature_gen.pyx":250 + * continue + * val += str(X[i, combinations_np[j, k]]) + * X_new[i, j] = val # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_18 = __pyx_v_i; + __pyx_t_17 = __pyx_v_j; + __pyx_t_22 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X_new.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_22); + __Pyx_INCREF(__pyx_v_val); __Pyx_XDECREF(*__pyx_t_22); + *__pyx_t_22 = __pyx_v_val; + __Pyx_XGIVEREF(*__pyx_t_22); + } + } + + /* "feature_gen.pyx":251 + * val += str(X[i, combinations_np[j, k]]) + * X_new[i, j] = val + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 251, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 251, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4)) __PYX_ERR(0, 251, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 251, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 251, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen.pyx":230 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] polynomial_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_11feature_gen_19polynomial_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_11feature_gen_19polynomial_object = {"polynomial_object", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_11feature_gen_19polynomial_object, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_11feature_gen_19polynomial_object(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_combinations_np = 0; + int __pyx_v_degree; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("polynomial_object (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_combinations_np,&__pyx_n_s_degree,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 230, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_combinations_np)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 230, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("polynomial_object", 1, 3, 3, 1); __PYX_ERR(0, 230, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_degree)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 230, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("polynomial_object", 1, 3, 3, 2); __PYX_ERR(0, 230, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "polynomial_object") < 0)) __PYX_ERR(0, 230, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_combinations_np = ((PyArrayObject *)values[1]); + __pyx_v_degree = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_degree == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 233, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("polynomial_object", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 230, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen.polynomial_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 231, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_combinations_np), __pyx_ptype_5numpy_ndarray, 1, "combinations_np", 0))) __PYX_ERR(0, 232, __pyx_L1_error) + __pyx_r = __pyx_pf_11feature_gen_18polynomial_object(__pyx_self, __pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_11feature_gen_18polynomial_object(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_combinations_np, int __pyx_v_degree) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_combinations_np; + __Pyx_Buffer __pyx_pybuffer_combinations_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("polynomial_object", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_combinations_np.pybuffer.buf = NULL; + __pyx_pybuffer_combinations_np.refcount = 0; + __pyx_pybuffernd_combinations_np.data = NULL; + __pyx_pybuffernd_combinations_np.rcbuffer = &__pyx_pybuffer_combinations_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 230, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_combinations_np, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 230, __pyx_L1_error) + } + __pyx_pybuffernd_combinations_np.diminfo[0].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_combinations_np.diminfo[0].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_combinations_np.diminfo[1].strides = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_combinations_np.diminfo[1].shape = __pyx_pybuffernd_combinations_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_11feature_gen_polynomial_object(__pyx_v_X, __pyx_v_combinations_np, __pyx_v_degree, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 230, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen.polynomial_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_combinations_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_array) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_array___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_array_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_array}, + {Py_sq_length, (void *)__pyx_array___len__}, + {Py_sq_item, (void *)__pyx_sq_item_array}, + {Py_mp_length, (void *)__pyx_array___len__}, + {Py_mp_subscript, (void *)__pyx_array___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_array}, + {Py_tp_getattro, (void *)__pyx_tp_getattro_array}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_array_getbuffer}, + #endif + {Py_tp_methods, (void *)__pyx_methods_array}, + {Py_tp_getset, (void *)__pyx_getsets_array}, + {Py_tp_new, (void *)__pyx_tp_new_array}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_array_spec = { + "feature_gen.array", + sizeof(struct __pyx_array_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_array_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "feature_gen.""array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_Enum) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_specialmethod___pyx_MemviewEnum___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_MemviewEnum___repr__(self); +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_MemviewEnum___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_MemviewEnum_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_Enum}, + {Py_tp_repr, (void *)__pyx_MemviewEnum___repr__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_Enum}, + {Py_tp_clear, (void *)__pyx_tp_clear_Enum}, + {Py_tp_methods, (void *)__pyx_methods_Enum}, + {Py_tp_init, (void *)__pyx_MemviewEnum___init__}, + {Py_tp_new, (void *)__pyx_tp_new_Enum}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_MemviewEnum_spec = { + "feature_gen.Enum", + sizeof(struct __pyx_MemviewEnum_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_MemviewEnum_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "feature_gen.""Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_memoryview) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryview___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyObject *__pyx_specialmethod___pyx_memoryview___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_memoryview___repr__(self); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_memoryview___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"is_c_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_c_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"is_f_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_f_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy_fortran", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy_fortran, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_memoryview_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_memoryview}, + {Py_tp_repr, (void *)__pyx_memoryview___repr__}, + {Py_sq_length, (void *)__pyx_memoryview___len__}, + {Py_sq_item, (void *)__pyx_sq_item_memoryview}, + {Py_mp_length, (void *)__pyx_memoryview___len__}, + {Py_mp_subscript, (void *)__pyx_memoryview___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_memoryview}, + {Py_tp_str, (void *)__pyx_memoryview___str__}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_memoryview_getbuffer}, + #endif + {Py_tp_traverse, (void *)__pyx_tp_traverse_memoryview}, + {Py_tp_clear, (void *)__pyx_tp_clear_memoryview}, + {Py_tp_methods, (void *)__pyx_methods_memoryview}, + {Py_tp_getset, (void *)__pyx_getsets_memoryview}, + {Py_tp_new, (void *)__pyx_tp_new_memoryview}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryview_spec = { + "feature_gen.memoryview", + sizeof(struct __pyx_memoryview_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_memoryview_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "feature_gen.""memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc__memoryviewslice) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryviewslice___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XCLEAR_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_memoryviewslice_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc__memoryviewslice}, + {Py_tp_doc, (void *)PyDoc_STR("Internal class for passing memoryview slices to Python")}, + {Py_tp_traverse, (void *)__pyx_tp_traverse__memoryviewslice}, + {Py_tp_clear, (void *)__pyx_tp_clear__memoryviewslice}, + {Py_tp_methods, (void *)__pyx_methods__memoryviewslice}, + {Py_tp_new, (void *)__pyx_tp_new__memoryviewslice}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryviewslice_spec = { + "feature_gen._memoryviewslice", + sizeof(struct __pyx_memoryviewslice_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_memoryviewslice_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "feature_gen.""_memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + PyDoc_STR("Internal class for passing memoryview slices to Python"), /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_k_All_dimensions_preceding_dimensi, sizeof(__pyx_k_All_dimensions_preceding_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_u_Cannot_index_with_type, __pyx_k_Cannot_index_with_type, sizeof(__pyx_k_Cannot_index_with_type), 0, 1, 0, 0}, + {&__pyx_kp_s_Cannot_transpose_memoryview_with, __pyx_k_Cannot_transpose_memoryview_with, sizeof(__pyx_k_Cannot_transpose_memoryview_with), 0, 0, 1, 0}, + {&__pyx_kp_s_Dimension_d_is_not_direct, __pyx_k_Dimension_d_is_not_direct, sizeof(__pyx_k_Dimension_d_is_not_direct), 0, 0, 1, 0}, + {&__pyx_n_s_EPSILON, __pyx_k_EPSILON, sizeof(__pyx_k_EPSILON), 0, 0, 1, 1}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_k_Expected_at_least_d_argument_s_g, sizeof(__pyx_k_Expected_at_least_d_argument_s_g), 0, 0, 1, 0}, + {&__pyx_kp_s_Function_call_with_ambiguous_arg, __pyx_k_Function_call_with_ambiguous_arg, sizeof(__pyx_k_Function_call_with_ambiguous_arg), 0, 0, 1, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_k_Index_out_of_bounds_axis_d, sizeof(__pyx_k_Index_out_of_bounds_axis_d), 0, 0, 1, 0}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 1, 0, 0}, + {&__pyx_kp_u_Invalid_shape_in_axis, __pyx_k_Invalid_shape_in_axis, sizeof(__pyx_k_Invalid_shape_in_axis), 0, 1, 0, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_kp_s_No_matching_signature_found, __pyx_k_No_matching_signature_found, sizeof(__pyx_k_No_matching_signature_found), 0, 0, 1, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_u_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 1, 0, 0}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_Sequence, __pyx_k_Sequence, sizeof(__pyx_k_Sequence), 0, 0, 1, 1}, + {&__pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_k_Step_may_not_be_zero_axis_d, sizeof(__pyx_k_Step_may_not_be_zero_axis_d), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0}, + {&__pyx_kp_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 0}, + {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, + {&__pyx_kp_u__15, __pyx_k__15, sizeof(__pyx_k__15), 0, 1, 0, 0}, + {&__pyx_kp_u__16, __pyx_k__16, sizeof(__pyx_k__16), 0, 1, 0, 0}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, + {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, + {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_n_s__71, __pyx_k__71, sizeof(__pyx_k__71), 0, 0, 1, 1}, + {&__pyx_n_s_abc, __pyx_k_abc, sizeof(__pyx_k_abc), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_kp_u_and, __pyx_k_and, sizeof(__pyx_k_and), 0, 1, 0, 0}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_axis, __pyx_k_axis, sizeof(__pyx_k_axis), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_cats, __pyx_k_cats, sizeof(__pyx_k_cats), 0, 0, 1, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_cluster_statistics, __pyx_k_cluster_statistics, sizeof(__pyx_k_cluster_statistics), 0, 0, 1, 1}, + {&__pyx_n_s_coef, __pyx_k_coef, sizeof(__pyx_k_coef), 0, 0, 1, 1}, + {&__pyx_n_s_collections, __pyx_k_collections, sizeof(__pyx_k_collections), 0, 0, 1, 1}, + {&__pyx_kp_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 0}, + {&__pyx_n_s_combinations_np, __pyx_k_combinations_np, sizeof(__pyx_k_combinations_np), 0, 0, 1, 1}, + {&__pyx_n_s_concatenate, __pyx_k_concatenate, sizeof(__pyx_k_concatenate), 0, 0, 1, 1}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_cos_vec, __pyx_k_cos_vec, sizeof(__pyx_k_cos_vec), 0, 0, 1, 1}, + {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, + {&__pyx_n_s_defaults, __pyx_k_defaults, sizeof(__pyx_k_defaults), 0, 0, 1, 1}, + {&__pyx_n_s_degree, __pyx_k_degree, sizeof(__pyx_k_degree), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_n_s_elementary_arithmetics, __pyx_k_elementary_arithmetics, sizeof(__pyx_k_elementary_arithmetics), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_feature_gen, __pyx_k_feature_gen, sizeof(__pyx_k_feature_gen), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32_t, __pyx_k_float32_t, sizeof(__pyx_k_float32_t), 0, 0, 1, 1}, + {&__pyx_n_s_float64, __pyx_k_float64, sizeof(__pyx_k_float64), 0, 0, 1, 1}, + {&__pyx_n_s_float64_t, __pyx_k_float64_t, sizeof(__pyx_k_float64_t), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_fused_sigindex, __pyx_k_fused_sigindex, sizeof(__pyx_k_fused_sigindex), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_feature_generation_featur, __pyx_k_gators_feature_generation_featur, sizeof(__pyx_k_gators_feature_generation_featur), 0, 0, 1, 0}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_u_got, __pyx_k_got, sizeof(__pyx_k_got), 0, 1, 0, 0}, + {&__pyx_kp_u_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 1, 0, 0}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns_a, __pyx_k_idx_columns_a, sizeof(__pyx_k_idx_columns_a), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns_b, __pyx_k_idx_columns_b, sizeof(__pyx_k_idx_columns_b), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns_x, __pyx_k_idx_columns_x, sizeof(__pyx_k_idx_columns_x), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns_y, __pyx_k_idx_columns_y, sizeof(__pyx_k_idx_columns_y), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_int16_t, __pyx_k_int16_t, sizeof(__pyx_k_int16_t), 0, 0, 1, 1}, + {&__pyx_n_s_int32_t, __pyx_k_int32_t, sizeof(__pyx_k_int32_t), 0, 0, 1, 1}, + {&__pyx_n_s_int64_t, __pyx_k_int64_t, sizeof(__pyx_k_int64_t), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_is_equal, __pyx_k_is_equal, sizeof(__pyx_k_is_equal), 0, 0, 1, 1}, + {&__pyx_n_s_is_equal_object, __pyx_k_is_equal_object, sizeof(__pyx_k_is_equal_object), 0, 0, 1, 1}, + {&__pyx_n_s_is_null, __pyx_k_is_null, sizeof(__pyx_k_is_null), 0, 0, 1, 1}, + {&__pyx_n_s_is_null_object, __pyx_k_is_null_object, sizeof(__pyx_k_is_null_object), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_kind, __pyx_k_kind, sizeof(__pyx_k_kind), 0, 0, 1, 1}, + {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_object, __pyx_k_object, sizeof(__pyx_k_object), 0, 0, 1, 1}, + {&__pyx_n_s_one_hot, __pyx_k_one_hot, sizeof(__pyx_k_one_hot), 0, 0, 1, 1}, + {&__pyx_n_s_ones, __pyx_k_ones, sizeof(__pyx_k_ones), 0, 0, 1, 1}, + {&__pyx_n_s_operator, __pyx_k_operator, sizeof(__pyx_k_operator), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_plan_rotation, __pyx_k_plan_rotation, sizeof(__pyx_k_plan_rotation), 0, 0, 1, 1}, + {&__pyx_n_s_polynomial, __pyx_k_polynomial, sizeof(__pyx_k_polynomial), 0, 0, 1, 1}, + {&__pyx_n_s_polynomial_object, __pyx_k_polynomial_object, sizeof(__pyx_k_polynomial_object), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0cluster_statistics, __pyx_k_pyx_fuse_0cluster_statistics, sizeof(__pyx_k_pyx_fuse_0cluster_statistics), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0elementary_arithmeti, __pyx_k_pyx_fuse_0elementary_arithmeti, sizeof(__pyx_k_pyx_fuse_0elementary_arithmeti), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0is_equal, __pyx_k_pyx_fuse_0is_equal, sizeof(__pyx_k_pyx_fuse_0is_equal), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0is_null, __pyx_k_pyx_fuse_0is_null, sizeof(__pyx_k_pyx_fuse_0is_null), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0plan_rotation, __pyx_k_pyx_fuse_0plan_rotation, sizeof(__pyx_k_pyx_fuse_0plan_rotation), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0polynomial, __pyx_k_pyx_fuse_0polynomial, sizeof(__pyx_k_pyx_fuse_0polynomial), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1cluster_statistics, __pyx_k_pyx_fuse_1cluster_statistics, sizeof(__pyx_k_pyx_fuse_1cluster_statistics), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1elementary_arithmeti, __pyx_k_pyx_fuse_1elementary_arithmeti, sizeof(__pyx_k_pyx_fuse_1elementary_arithmeti), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1is_equal, __pyx_k_pyx_fuse_1is_equal, sizeof(__pyx_k_pyx_fuse_1is_equal), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1is_null, __pyx_k_pyx_fuse_1is_null, sizeof(__pyx_k_pyx_fuse_1is_null), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1plan_rotation, __pyx_k_pyx_fuse_1plan_rotation, sizeof(__pyx_k_pyx_fuse_1plan_rotation), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1polynomial, __pyx_k_pyx_fuse_1polynomial, sizeof(__pyx_k_pyx_fuse_1polynomial), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2elementary_arithmeti, __pyx_k_pyx_fuse_2elementary_arithmeti, sizeof(__pyx_k_pyx_fuse_2elementary_arithmeti), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2is_equal, __pyx_k_pyx_fuse_2is_equal, sizeof(__pyx_k_pyx_fuse_2is_equal), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2is_null, __pyx_k_pyx_fuse_2is_null, sizeof(__pyx_k_pyx_fuse_2is_null), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2plan_rotation, __pyx_k_pyx_fuse_2plan_rotation, sizeof(__pyx_k_pyx_fuse_2plan_rotation), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_2polynomial, __pyx_k_pyx_fuse_2polynomial, sizeof(__pyx_k_pyx_fuse_2polynomial), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3elementary_arithmeti, __pyx_k_pyx_fuse_3elementary_arithmeti, sizeof(__pyx_k_pyx_fuse_3elementary_arithmeti), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3is_equal, __pyx_k_pyx_fuse_3is_equal, sizeof(__pyx_k_pyx_fuse_3is_equal), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3is_null, __pyx_k_pyx_fuse_3is_null, sizeof(__pyx_k_pyx_fuse_3is_null), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3plan_rotation, __pyx_k_pyx_fuse_3plan_rotation, sizeof(__pyx_k_pyx_fuse_3plan_rotation), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_3polynomial, __pyx_k_pyx_fuse_3polynomial, sizeof(__pyx_k_pyx_fuse_3polynomial), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4elementary_arithmeti, __pyx_k_pyx_fuse_4elementary_arithmeti, sizeof(__pyx_k_pyx_fuse_4elementary_arithmeti), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4is_equal, __pyx_k_pyx_fuse_4is_equal, sizeof(__pyx_k_pyx_fuse_4is_equal), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4is_null, __pyx_k_pyx_fuse_4is_null, sizeof(__pyx_k_pyx_fuse_4is_null), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4plan_rotation, __pyx_k_pyx_fuse_4plan_rotation, sizeof(__pyx_k_pyx_fuse_4plan_rotation), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_4polynomial, __pyx_k_pyx_fuse_4polynomial, sizeof(__pyx_k_pyx_fuse_4polynomial), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1}, + {&__pyx_n_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_signatures, __pyx_k_signatures, sizeof(__pyx_k_signatures), 0, 0, 1, 1}, + {&__pyx_n_s_sin_vec, __pyx_k_sin_vec, sizeof(__pyx_k_sin_vec), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_object = __Pyx_GetBuiltinName(__pyx_n_s_object); if (!__pyx_builtin_object) __PYX_ERR(0, 30, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 31, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_builtin___import__ = __Pyx_GetBuiltinName(__pyx_n_s_import); if (!__pyx_builtin___import__) __PYX_ERR(1, 100, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 156, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 159, __pyx_L1_error) + __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(1, 373, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 408, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 618, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 914, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__4 = PyTuple_New(1); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_tuple__4, 0, __pyx_int_neg_1)) __PYX_ERR(1, 582, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_slice__5 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_tuple__8 = PyTuple_Pack(3, __pyx_int_136983863, __pyx_int_112105877, __pyx_int_184977713); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_No_matching_signature_found); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_Function_call_with_ambiguous_arg); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_n_s_sys); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + __pyx_tuple__18 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_3); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_collections_abc); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_n_s_collections); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__26 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "feature_gen.pyx":20 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] one_hot( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__28 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_cats); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_one_hot, 20, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 20, __pyx_L1_error) + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__30 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0is_null, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0is_null, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_1is_null, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_2is_null, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_3is_null, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_4is_null, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 39, __pyx_L1_error) + + /* "feature_gen.pyx":58 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_null_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_is_null_object, 58, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 58, __pyx_L1_error) + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_tuple__38 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns_a, __pyx_n_s_idx_columns_b); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0is_equal, 78, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0is_equal, 78, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_1is_equal, 78, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_2is_equal, 78, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_3is_equal, 78, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_4is_equal, 78, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(0, 78, __pyx_L1_error) + + /* "feature_gen.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_equal_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_is_equal_object, 98, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(0, 98, __pyx_L1_error) + + /* "feature_gen.pyx":117 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] cluster_statistics( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] idx_columns, + */ + __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0cluster_statistics, 117, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0cluster_statistics, 117, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_1cluster_statistics, 117, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(0, 117, __pyx_L1_error) + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_tuple__49 = PyTuple_Pack(6, __pyx_n_s_X, __pyx_n_s_idx_columns_a, __pyx_n_s_idx_columns_b, __pyx_n_s_operator, __pyx_n_s_coef, __pyx_n_s_EPSILON); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__49); + __Pyx_GIVEREF(__pyx_tuple__49); + __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0elementary_arithmeti, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0elementary_arithmeti, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_1elementary_arithmeti, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_codeobj__53 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_2elementary_arithmeti, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__53)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_3elementary_arithmeti, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_4elementary_arithmeti, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(0, 149, __pyx_L1_error) + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + __pyx_tuple__56 = PyTuple_Pack(5, __pyx_n_s_X, __pyx_n_s_idx_columns_x, __pyx_n_s_idx_columns_y, __pyx_n_s_cos_vec, __pyx_n_s_sin_vec); if (unlikely(!__pyx_tuple__56)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__56); + __Pyx_GIVEREF(__pyx_tuple__56); + __pyx_codeobj__57 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0plan_rotation, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__57)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_codeobj__58 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0plan_rotation, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__58)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_1plan_rotation, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_codeobj__60 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_2plan_rotation, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__60)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_codeobj__61 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_3plan_rotation, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__61)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_codeobj__62 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_4plan_rotation, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__62)) __PYX_ERR(0, 182, __pyx_L1_error) + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + __pyx_tuple__63 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_combinations_np, __pyx_n_s_degree); if (unlikely(!__pyx_tuple__63)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__63); + __Pyx_GIVEREF(__pyx_tuple__63); + __pyx_codeobj__64 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0polynomial, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__64)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_0polynomial, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_codeobj__66 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_1polynomial, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__66)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_codeobj__67 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_2polynomial, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__67)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_codeobj__68 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_3polynomial, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__68)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_codeobj__69 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_pyx_fuse_4polynomial, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__69)) __PYX_ERR(0, 208, __pyx_L1_error) + + /* "feature_gen.pyx":230 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] polynomial_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + __pyx_codeobj__70 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_featur, __pyx_n_s_polynomial_object, 230, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__70)) __PYX_ERR(0, 230, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get; + __pyx_umethod_PyDict_Type_values.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_values.method_name = &__pyx_n_s_values; + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_6 = PyInt_FromLong(6); if (unlikely(!__pyx_int_6)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_112105877 = PyInt_FromLong(112105877L); if (unlikely(!__pyx_int_112105877)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_136983863 = PyInt_FromLong(136983863L); if (unlikely(!__pyx_int_136983863)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* AssertionsEnabled.init */ + if (likely(__Pyx_init_assertions_enabled() == 0)); else + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_collections_abc_Sequence = Py_None; Py_INCREF(Py_None); + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + #if CYTHON_USE_TYPE_SPECS + __pyx_array_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_array_spec, NULL); if (unlikely(!__pyx_array_type)) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_array_type->tp_as_buffer = &__pyx_tp_as_buffer_array; + if (!__pyx_array_type->tp_as_buffer->bf_releasebuffer && __pyx_array_type->tp_base->tp_as_buffer && __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_array_type->tp_as_buffer->bf_releasebuffer = __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_array_spec, __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #else + __pyx_array_type = &__pyx_type___pyx_array; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_array_type->tp_print = 0; + #endif + if (__Pyx_SetVtable(__pyx_array_type, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_MemviewEnum_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_MemviewEnum_spec, NULL); if (unlikely(!__pyx_MemviewEnum_type)) __PYX_ERR(1, 302, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_MemviewEnum_spec, __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #else + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_MemviewEnum_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_MemviewEnum_type->tp_dictoffset && __pyx_MemviewEnum_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_MemviewEnum_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + __pyx_vtable_memoryview._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryview__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_memoryview_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryview_spec, NULL); if (unlikely(!__pyx_memoryview_type)) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryview_type->tp_as_buffer = &__pyx_tp_as_buffer_memoryview; + if (!__pyx_memoryview_type->tp_as_buffer->bf_releasebuffer && __pyx_memoryview_type->tp_base->tp_as_buffer && __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_memoryview_type->tp_as_buffer->bf_releasebuffer = __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryview_spec, __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #else + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryview_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryview_type->tp_dictoffset && __pyx_memoryview_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryview_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryview_type, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_vtable__memoryviewslice.__pyx_base._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryviewslice__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_memoryview_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 952, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_memoryviewslice_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryviewslice_spec, __pyx_t_1); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_memoryviewslice_type)) __PYX_ERR(1, 952, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryviewslice_spec, __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #else + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryviewslice_type->tp_base = __pyx_memoryview_type; + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryviewslice_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryviewslice_type->tp_dictoffset && __pyx_memoryviewslice_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryviewslice_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryviewslice_type, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_feature_gen(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_feature_gen}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "feature_gen", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initfeature_gen(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initfeature_gen(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_feature_gen(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_feature_gen(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_feature_gen(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + static PyThread_type_lock __pyx_t_8[8]; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'feature_gen' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("feature_gen", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "feature_gen" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_feature_gen(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_feature_gen) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "feature_gen")) { + if (unlikely((PyDict_SetItemString(modules, "feature_gen", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_version_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_tuple__18, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_abc); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L7_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":104 + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + * except: # <<<<<<<<<<<<<< + * + * __pyx_collections_abc_Sequence = None + */ + /*except:*/ { + __Pyx_AddTraceback("View.MemoryView", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(1, 104, __pyx_L4_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + + /* "View.MemoryView":106 + * except: + * + * __pyx_collections_abc_Sequence = None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF(Py_None); + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + __pyx_L4_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L7_try_end:; + } + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":242 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":243 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L16_try_end; + __pyx_L11_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":244 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L12_exception_handled; + } + __pyx_L12_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L16_try_end:; + } + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":323 + * + * + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":324 + * + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_8[0] = PyThread_allocate_lock(); + __pyx_t_8[1] = PyThread_allocate_lock(); + __pyx_t_8[2] = PyThread_allocate_lock(); + __pyx_t_8[3] = PyThread_allocate_lock(); + __pyx_t_8[4] = PyThread_allocate_lock(); + __pyx_t_8[5] = PyThread_allocate_lock(); + __pyx_t_8[6] = PyThread_allocate_lock(); + __pyx_t_8[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_8, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":983 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":984 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L22_try_end; + __pyx_L17_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":985 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L18_exception_handled; + } + __pyx_L18_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L22_try_end:; + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_collections_abc_Sequence); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 989, __pyx_L23_error) + if (__pyx_t_6) { + + /* "View.MemoryView":993 + * + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence.register(array) + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, ((PyObject *)__pyx_memoryviewslice_type)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":994 + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) # <<<<<<<<<<<<<< + * except: + * pass # ignore failure, it's a minor issue + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_array_type)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L28_try_end; + __pyx_L23_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":995 + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) + * except: # <<<<<<<<<<<<<< + * pass # ignore failure, it's a minor issue + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L24_exception_handled; + } + __pyx_L24_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L28_try_end:; + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_7 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_7) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":2 + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * + * cimport numpy as np + */ + __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":20 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] one_hot( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_11feature_gen_1one_hot, 0, __pyx_n_s_one_hot, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_one_hot, __pyx_t_7) < 0) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_null( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_21__pyx_fuse_0is_null, 0, __pyx_n_s_pyx_fuse_0is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null, __pyx_t_7) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_23__pyx_fuse_1is_null, 0, __pyx_n_s_pyx_fuse_1is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null, __pyx_t_7) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_25__pyx_fuse_2is_null, 0, __pyx_n_s_pyx_fuse_2is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null, __pyx_t_7) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_27__pyx_fuse_3is_null, 0, __pyx_n_s_pyx_fuse_3is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null, __pyx_t_7) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_29__pyx_fuse_4is_null, 0, __pyx_n_s_pyx_fuse_4is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null, __pyx_t_7) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_21__pyx_fuse_0is_null, 0, __pyx_n_s_pyx_fuse_0is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int16_t, __pyx_t_4) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_23__pyx_fuse_1is_null, 0, __pyx_n_s_pyx_fuse_1is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int32_t, __pyx_t_4) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_25__pyx_fuse_2is_null, 0, __pyx_n_s_pyx_fuse_2is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int64_t, __pyx_t_4) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_27__pyx_fuse_3is_null, 0, __pyx_n_s_pyx_fuse_3is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_29__pyx_fuse_4is_null, 0, __pyx_n_s_pyx_fuse_4is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_11feature_gen_3is_null, 0, __pyx_n_s_is_null, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults), 1)) __PYX_ERR(0, 39, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null, __pyx_t_4) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "feature_gen.pyx":58 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_null_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_11feature_gen_5is_null_object, 0, __pyx_n_s_is_null_object, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_null_object, __pyx_t_4) < 0) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "feature_gen.pyx":78 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] is_equal( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_33__pyx_fuse_0is_equal, 0, __pyx_n_s_pyx_fuse_0is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal, __pyx_t_4) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_35__pyx_fuse_1is_equal, 0, __pyx_n_s_pyx_fuse_1is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal, __pyx_t_4) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_37__pyx_fuse_2is_equal, 0, __pyx_n_s_pyx_fuse_2is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal, __pyx_t_4) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_39__pyx_fuse_3is_equal, 0, __pyx_n_s_pyx_fuse_3is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal, __pyx_t_4) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_41__pyx_fuse_4is_equal, 0, __pyx_n_s_pyx_fuse_4is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal, __pyx_t_4) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_33__pyx_fuse_0is_equal, 0, __pyx_n_s_pyx_fuse_0is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int16_t, __pyx_t_7) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_35__pyx_fuse_1is_equal, 0, __pyx_n_s_pyx_fuse_1is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int32_t, __pyx_t_7) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_37__pyx_fuse_2is_equal, 0, __pyx_n_s_pyx_fuse_2is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int64_t, __pyx_t_7) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_39__pyx_fuse_3is_equal, 0, __pyx_n_s_pyx_fuse_3is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_41__pyx_fuse_4is_equal, 0, __pyx_n_s_pyx_fuse_4is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_11feature_gen_7is_equal, 0, __pyx_n_s_is_equal, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults1), 1)) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal, __pyx_t_7) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] is_equal_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_11feature_gen_9is_equal_object, 0, __pyx_n_s_is_equal_object, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__45)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_equal_object, __pyx_t_7) < 0) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":117 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] cluster_statistics( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] idx_columns, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_45__pyx_fuse_0cluster_statistics, 0, __pyx_n_s_pyx_fuse_0cluster_statistics, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__47)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cluster_statistics, __pyx_t_7) < 0) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_47__pyx_fuse_1cluster_statistics, 0, __pyx_n_s_pyx_fuse_1cluster_statistics, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cluster_statistics, __pyx_t_7) < 0) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_45__pyx_fuse_0cluster_statistics, 0, __pyx_n_s_pyx_fuse_0cluster_statistics, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_47__pyx_fuse_1cluster_statistics, 0, __pyx_n_s_pyx_fuse_1cluster_statistics, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_11feature_gen_11cluster_statistics, 0, __pyx_n_s_cluster_statistics, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults2), 1)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults2, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cluster_statistics, __pyx_t_4) < 0) __PYX_ERR(0, 117, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "feature_gen.pyx":149 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_51__pyx_fuse_0elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_0elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__51)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_elementary_arithmetics, __pyx_t_4) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_53__pyx_fuse_1elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_1elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_elementary_arithmetics, __pyx_t_4) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_55__pyx_fuse_2elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_2elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__53)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_elementary_arithmetics, __pyx_t_4) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_57__pyx_fuse_3elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_3elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_elementary_arithmetics, __pyx_t_4) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_59__pyx_fuse_4elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_4elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__55)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_elementary_arithmetics, __pyx_t_4) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_51__pyx_fuse_0elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_0elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int16_t, __pyx_t_7) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_53__pyx_fuse_1elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_1elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int32_t, __pyx_t_7) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_55__pyx_fuse_2elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_2elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int64_t, __pyx_t_7) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_57__pyx_fuse_3elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_3elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_59__pyx_fuse_4elementary_arithmetics, 0, __pyx_n_s_pyx_fuse_4elementary_arithmeti, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_11feature_gen_13elementary_arithmetics, 0, __pyx_n_s_elementary_arithmetics, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults3), 1)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults3, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_elementary_arithmetics, __pyx_t_7) < 0) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":182 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] plan_rotation( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_x, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_63__pyx_fuse_0plan_rotation, 0, __pyx_n_s_pyx_fuse_0plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__58)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_plan_rotation, __pyx_t_7) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_65__pyx_fuse_1plan_rotation, 0, __pyx_n_s_pyx_fuse_1plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__59)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_plan_rotation, __pyx_t_7) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_67__pyx_fuse_2plan_rotation, 0, __pyx_n_s_pyx_fuse_2plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__60)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_plan_rotation, __pyx_t_7) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_69__pyx_fuse_3plan_rotation, 0, __pyx_n_s_pyx_fuse_3plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__61)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_plan_rotation, __pyx_t_7) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_71__pyx_fuse_4plan_rotation, 0, __pyx_n_s_pyx_fuse_4plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__62)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_plan_rotation, __pyx_t_7) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_63__pyx_fuse_0plan_rotation, 0, __pyx_n_s_pyx_fuse_0plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int16_t, __pyx_t_4) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_65__pyx_fuse_1plan_rotation, 0, __pyx_n_s_pyx_fuse_1plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int32_t, __pyx_t_4) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_67__pyx_fuse_2plan_rotation, 0, __pyx_n_s_pyx_fuse_2plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_int64_t, __pyx_t_4) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_69__pyx_fuse_3plan_rotation, 0, __pyx_n_s_pyx_fuse_3plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_71__pyx_fuse_4plan_rotation, 0, __pyx_n_s_pyx_fuse_4plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_11feature_gen_15plan_rotation, 0, __pyx_n_s_plan_rotation, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults4), 1)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_plan_rotation, __pyx_t_4) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "feature_gen.pyx":208 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_t, ndim = 2] polynomial( # <<<<<<<<<<<<<< + * np.ndarray[num_t, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_75__pyx_fuse_0polynomial, 0, __pyx_n_s_pyx_fuse_0polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__65)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial, __pyx_t_4) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_77__pyx_fuse_1polynomial, 0, __pyx_n_s_pyx_fuse_1polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__66)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial, __pyx_t_4) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_79__pyx_fuse_2polynomial, 0, __pyx_n_s_pyx_fuse_2polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__67)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial, __pyx_t_4) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_81__pyx_fuse_3polynomial, 0, __pyx_n_s_pyx_fuse_3polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__68)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial, __pyx_t_4) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_83__pyx_fuse_4polynomial, 0, __pyx_n_s_pyx_fuse_4polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__69)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial, __pyx_t_4) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_11feature_gen_75__pyx_fuse_0polynomial, 0, __pyx_n_s_pyx_fuse_0polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int16_t, __pyx_t_7) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_11feature_gen_77__pyx_fuse_1polynomial, 0, __pyx_n_s_pyx_fuse_1polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int32_t, __pyx_t_7) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_2__pyx_mdef_11feature_gen_79__pyx_fuse_2polynomial, 0, __pyx_n_s_pyx_fuse_2polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_int64_t, __pyx_t_7) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_3__pyx_mdef_11feature_gen_81__pyx_fuse_3polynomial, 0, __pyx_n_s_pyx_fuse_3polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_4__pyx_mdef_11feature_gen_83__pyx_fuse_4polynomial, 0, __pyx_n_s_pyx_fuse_4polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_11feature_gen_17polynomial, 0, __pyx_n_s_polynomial, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults5), 1)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial, __pyx_t_7) < 0) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":230 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] polynomial_object( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=2] combinations_np, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_11feature_gen_19polynomial_object, 0, __pyx_n_s_polynomial_object, NULL, __pyx_n_s_feature_gen, __pyx_d, ((PyObject *)__pyx_codeobj__70)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 230, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_polynomial_object, __pyx_t_7) < 0) __PYX_ERR(0, 230, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "feature_gen.pyx":1 + * import cython # <<<<<<<<<<<<<< + * import numpy as np + * + */ + __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init feature_gen", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init feature_gen"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* CIntToDigits */ +static const char DIGIT_PAIRS_10[2*10*10+1] = { + "00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" +}; +static const char DIGIT_PAIRS_8[2*8*8+1] = { + "0001020304050607" + "1011121314151617" + "2021222324252627" + "3031323334353637" + "4041424344454647" + "5051525354555657" + "6061626364656667" + "7071727374757677" +}; +static const char DIGITS_HEX[2*16+1] = { + "0123456789abcdef" + "0123456789ABCDEF" +}; + +/* BuildPyUnicode */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char) { + PyObject *uval; + Py_ssize_t uoffset = ulength - clength; +#if CYTHON_USE_UNICODE_INTERNALS + Py_ssize_t i; +#if CYTHON_PEP393_ENABLED + void *udata; + uval = PyUnicode_New(ulength, 127); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_DATA(uval); +#else + Py_UNICODE *udata; + uval = PyUnicode_FromUnicode(NULL, ulength); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_AS_UNICODE(uval); +#endif + if (uoffset > 0) { + i = 0; + if (prepend_sign) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-'); + i++; + } + for (; i < uoffset; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char); + } + } + for (i=0; i < clength; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]); + } +#else + { + PyObject *sign = NULL, *padding = NULL; + uval = NULL; + if (uoffset > 0) { + prepend_sign = !!prepend_sign; + if (uoffset > prepend_sign) { + padding = PyUnicode_FromOrdinal(padding_char); + if (likely(padding) && uoffset > prepend_sign + 1) { + PyObject *tmp; + PyObject *repeat = PyInt_FromSsize_t(uoffset - prepend_sign); + if (unlikely(!repeat)) goto done_or_error; + tmp = PyNumber_Multiply(padding, repeat); + Py_DECREF(repeat); + Py_DECREF(padding); + padding = tmp; + } + if (unlikely(!padding)) goto done_or_error; + } + if (prepend_sign) { + sign = PyUnicode_FromOrdinal('-'); + if (unlikely(!sign)) goto done_or_error; + } + } + uval = PyUnicode_DecodeASCII(chars, clength, NULL); + if (likely(uval) && padding) { + PyObject *tmp = PyNumber_Add(padding, uval); + Py_DECREF(uval); + uval = tmp; + } + if (likely(uval) && sign) { + PyObject *tmp = PyNumber_Add(sign, uval); + Py_DECREF(uval); + uval = tmp; + } +done_or_error: + Py_XDECREF(padding); + Py_XDECREF(sign); + } +#endif + return uval; +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(int)*3+2]; + char *dpos, *end = digits + sizeof(int)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + int remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (int) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (int) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (int) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(Py_ssize_t)*3+2]; + char *dpos, *end = digits + sizeof(Py_ssize_t)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + Py_ssize_t remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const Py_ssize_t neg_one = (Py_ssize_t) -1, const_zero = (Py_ssize_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (Py_ssize_t) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (Py_ssize_t) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (Py_ssize_t) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* JoinPyUnicode */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char) { +#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *result_uval; + int result_ukind, kind_shift; + Py_ssize_t i, char_pos; + void *result_udata; + CYTHON_MAYBE_UNUSED_VAR(max_char); +#if CYTHON_PEP393_ENABLED + result_uval = PyUnicode_New(result_ulength, max_char); + if (unlikely(!result_uval)) return NULL; + result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND; + kind_shift = (result_ukind == PyUnicode_4BYTE_KIND) ? 2 : result_ukind - 1; + result_udata = PyUnicode_DATA(result_uval); +#else + result_uval = PyUnicode_FromUnicode(NULL, result_ulength); + if (unlikely(!result_uval)) return NULL; + result_ukind = sizeof(Py_UNICODE); + kind_shift = (result_ukind == 4) ? 2 : result_ukind - 1; + result_udata = PyUnicode_AS_UNICODE(result_uval); +#endif + assert(kind_shift == 2 || kind_shift == 1 || kind_shift == 0); + char_pos = 0; + for (i=0; i < value_count; i++) { + int ukind; + Py_ssize_t ulength; + void *udata; + PyObject *uval = PyTuple_GET_ITEM(value_tuple, i); + if (unlikely(__Pyx_PyUnicode_READY(uval))) + goto bad; + ulength = __Pyx_PyUnicode_GET_LENGTH(uval); + if (unlikely(!ulength)) + continue; + if (unlikely((PY_SSIZE_T_MAX >> kind_shift) - ulength < char_pos)) + goto overflow; + ukind = __Pyx_PyUnicode_KIND(uval); + udata = __Pyx_PyUnicode_DATA(uval); + if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) { + memcpy((char *)result_udata + (char_pos << kind_shift), udata, (size_t) (ulength << kind_shift)); + } else { + #if PY_VERSION_HEX >= 0x030d0000 + if (unlikely(PyUnicode_CopyCharacters(result_uval, char_pos, uval, 0, ulength) < 0)) goto bad; + #elif CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters) + _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength); + #else + Py_ssize_t j; + for (j=0; j < ulength; j++) { + Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j); + __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar); + } + #endif + } + char_pos += ulength; + } + return result_uval; +overflow: + PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string"); +bad: + Py_DECREF(result_uval); + return NULL; +#else + CYTHON_UNUSED_VAR(max_char); + CYTHON_UNUSED_VAR(result_ulength); + CYTHON_UNUSED_VAR(value_count); + return PyUnicode_Join(__pyx_empty_unicode, value_tuple); +#endif +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kw, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { + Py_ssize_t kwsize; +#if CYTHON_ASSUME_SAFE_MACROS + kwsize = PyTuple_GET_SIZE(kw); +#else + kwsize = PyTuple_Size(kw); + if (kwsize < 0) return 0; +#endif + if (unlikely(kwsize == 0)) + return 1; + if (!kw_allowed) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, 0); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + goto invalid_keyword; + } +#if PY_VERSION_HEX < 0x03090000 + for (pos = 0; pos < kwsize; pos++) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, pos); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } +#endif + return 1; + } + while (PyDict_Next(kw, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if (!kw_allowed && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* DivInt[Py_ssize_t] */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__3; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; itp_as_sequence && type->tp_as_sequence->sq_repeat)) { + return type->tp_as_sequence->sq_repeat(seq, mul); + } else +#endif + { + return __Pyx_PySequence_Multiply_Generic(seq, mul); + } +} + +/* SetItemInt */ +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { + int r; + if (unlikely(!j)) return -1; + r = PyObject_SetItem(o, j, v); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, + CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_ass_subscript) { + int r; + PyObject *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return -1; + r = mm->mp_ass_subscript(o, key, v); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_ass_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return -1; + PyErr_Clear(); + } + } + return sm->sq_ass_item(o, i, v); + } + } +#else + if (is_list || !PyMapping_Check(o)) + { + return PySequence_SetItem(o, i, v); + } +#endif + return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); +} + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* DivInt[long] */ +static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__2); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* DictGetItem */ + #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* UnicodeAsUCS4 */ + static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ + static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + __Pyx_TypeName c_type_name = __Pyx_PyType_GetName(Py_TYPE(c)); + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but " __Pyx_FMT_TYPENAME " found", + c_type_name); + __Pyx_DECREF_TypeName(c_type_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* memoryview_get_from_buffer */ + #if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj) { + Py_ssize_t result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_itemsize); + if (!attr) { + goto bad; + } + result = PyLong_AsSsize_t(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* memoryview_get_from_buffer */ + #if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj) { + int result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_ndim); + if (!attr) { + goto bad; + } + result = PyLong_AsLong(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* IterFinish */ + static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* PyObjectCallNoArg */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ + static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ + static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* UnpackItemEndCheck */ + static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* UnpackTupleError */ + static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ + static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ + #if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* UnpackUnboundCMethod */ + static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { + PyObject *result; + PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); + if (unlikely(!selfless_args)) return NULL; + result = PyObject_Call(method, selfless_args, kwargs); + Py_DECREF(selfless_args); + return result; +} +static PyMethodDef __Pyx_UnboundCMethod_Def = { + "CythonUnboundCMethod", + __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), + METH_VARARGS | METH_KEYWORDS, + NULL +}; +static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { + PyObject *method; + method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); + if (unlikely(!method)) + return -1; + target->method = method; +#if CYTHON_COMPILING_IN_CPYTHON + #if PY_MAJOR_VERSION >= 3 + if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) + #else + if (likely(!__Pyx_CyOrPyCFunction_Check(method))) + #endif + { + PyMethodDescrObject *descr = (PyMethodDescrObject*) method; + target->func = descr->d_method->ml_meth; + target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); + } else +#endif +#if CYTHON_COMPILING_IN_PYPY +#else + if (PyCFunction_Check(method)) +#endif + { + PyObject *self; + int self_found; +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + self = PyObject_GetAttrString(method, "__self__"); + if (!self) { + PyErr_Clear(); + } +#else + self = PyCFunction_GET_SELF(method); +#endif + self_found = (self && self != Py_None); +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + Py_XDECREF(self); +#endif + if (self_found) { + PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); + if (unlikely(!unbound_method)) return -1; + Py_DECREF(method); + target->method = unbound_method; + } + } + return 0; +} + +/* CallUnboundCMethod0 */ + static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) { + PyObject *args, *result = NULL; + if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_ASSUME_SAFE_MACROS + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); +#else + args = PyTuple_Pack(1, self); + if (unlikely(!args)) goto bad; +#endif + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + Py_DECREF(args); +bad: + return result; +} + +/* py_dict_values */ + static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) { + if (PY_MAJOR_VERSION >= 3) + return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_values, d); + else + return PyDict_Values(d); +} + +/* CallUnboundCMethod1 */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) { + if (likely(cfunc->func)) { + int flag = cfunc->flag; + if (flag == METH_O) { + return (*(cfunc->func))(self, arg); + } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + #endif + } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) { + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + } + } + return __Pyx__CallUnboundCMethod1(cfunc, self, arg); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(2, self, arg); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* CallUnboundCMethod2 */ + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) { + if (likely(cfunc->func)) { + PyObject *args[2] = {arg1, arg2}; + if (cfunc->flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + #if PY_VERSION_HEX >= 0x030700A0 + if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS)) + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(3); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 1, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 2, arg2); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(3, self, arg1, arg2); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* dict_getitem_default */ + static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { + PyObject* value; +#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (unlikely(PyErr_Occurred())) + return NULL; + value = default_value; + } + Py_INCREF(value); + if ((1)); +#else + if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { + value = PyDict_GetItem(d, key); + if (unlikely(!value)) { + value = default_value; + } + Py_INCREF(value); + } +#endif + else { + if (default_value == Py_None) + value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key); + else + value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value); + } + return value; +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ + #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ + static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* SetVTable */ + static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ + static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* FusedFunction */ + static PyObject * +__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code) +{ + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_FusedFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + __pyx_FusedFunctionObject *fusedfunc = (__pyx_FusedFunctionObject *) op; + fusedfunc->__signatures__ = NULL; + fusedfunc->self = NULL; + PyObject_GC_Track(op); + } + return op; +} +static void +__pyx_FusedFunction_dealloc(__pyx_FusedFunctionObject *self) +{ + PyObject_GC_UnTrack(self); + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + __Pyx__CyFunction_dealloc((__pyx_CyFunctionObject *) self); +} +static int +__pyx_FusedFunction_traverse(__pyx_FusedFunctionObject *self, + visitproc visit, + void *arg) +{ + Py_VISIT(self->self); + Py_VISIT(self->__signatures__); + return __Pyx_CyFunction_traverse((__pyx_CyFunctionObject *) self, visit, arg); +} +static int +__pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self) +{ + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + return __Pyx_CyFunction_clear((__pyx_CyFunctionObject *) self); +} +static PyObject * +__pyx_FusedFunction_descr_get(PyObject *self, PyObject *obj, PyObject *type) +{ + __pyx_FusedFunctionObject *func, *meth; + func = (__pyx_FusedFunctionObject *) self; + if (func->self || func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(self); + return self; + } + if (obj == Py_None) + obj = NULL; + if (func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD) + obj = type; + if (obj == NULL) { + Py_INCREF(self); + return self; + } + meth = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_New( + ((PyCFunctionObject *) func)->m_ml, + ((__pyx_CyFunctionObject *) func)->flags, + ((__pyx_CyFunctionObject *) func)->func_qualname, + ((__pyx_CyFunctionObject *) func)->func_closure, + ((PyCFunctionObject *) func)->m_module, + ((__pyx_CyFunctionObject *) func)->func_globals, + ((__pyx_CyFunctionObject *) func)->func_code); + if (unlikely(!meth)) + return NULL; + if (func->func.defaults) { + PyObject **pydefaults; + int i; + if (unlikely(!__Pyx_CyFunction_InitDefaults( + (PyObject*)meth, + func->func.defaults_size, + func->func.defaults_pyobjects))) { + Py_XDECREF((PyObject*)meth); + return NULL; + } + memcpy(meth->func.defaults, func->func.defaults, func->func.defaults_size); + pydefaults = __Pyx_CyFunction_Defaults(PyObject *, meth); + for (i = 0; i < meth->func.defaults_pyobjects; i++) + Py_XINCREF(pydefaults[i]); + } + __Pyx_CyFunction_SetClassObj(meth, __Pyx_CyFunction_GetClassObj(func)); + Py_XINCREF(func->__signatures__); + meth->__signatures__ = func->__signatures__; + Py_XINCREF(func->func.defaults_tuple); + meth->func.defaults_tuple = func->func.defaults_tuple; + Py_XINCREF(obj); + meth->self = obj; + return (PyObject *) meth; +} +static PyObject * +_obj_to_string(PyObject *obj) +{ + if (PyUnicode_CheckExact(obj)) + return __Pyx_NewRef(obj); +#if PY_MAJOR_VERSION == 2 + else if (PyString_Check(obj)) + return PyUnicode_FromEncodedObject(obj, NULL, "strict"); +#endif + else if (PyType_Check(obj)) + return PyObject_GetAttr(obj, __pyx_n_s_name_2); + else + return PyObject_Unicode(obj); +} +static PyObject * +__pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx) +{ + PyObject *signature = NULL; + PyObject *unbound_result_func; + PyObject *result_func = NULL; + if (unlikely(self->__signatures__ == NULL)) { + PyErr_SetString(PyExc_TypeError, "Function is not fused"); + return NULL; + } + if (PyTuple_Check(idx)) { + Py_ssize_t n = PyTuple_GET_SIZE(idx); + PyObject *list = PyList_New(n); + int i; + if (unlikely(!list)) + return NULL; + for (i = 0; i < n; i++) { + PyObject *string; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(idx, i); +#else + PyObject *item = PySequence_ITEM(idx, i); if (unlikely(!item)) goto __pyx_err; +#endif + string = _obj_to_string(item); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(item); +#endif + if (unlikely(!string)) goto __pyx_err; + PyList_SET_ITEM(list, i, string); + } + signature = PyUnicode_Join(__pyx_kp_u__12, list); +__pyx_err:; + Py_DECREF(list); + } else { + signature = _obj_to_string(idx); + } + if (unlikely(!signature)) + return NULL; + unbound_result_func = PyObject_GetItem(self->__signatures__, signature); + if (likely(unbound_result_func)) { + if (self->self) { + __pyx_FusedFunctionObject *unbound = (__pyx_FusedFunctionObject *) unbound_result_func; + __Pyx_CyFunction_SetClassObj(unbound, __Pyx_CyFunction_GetClassObj(self)); + result_func = __pyx_FusedFunction_descr_get(unbound_result_func, + self->self, self->self); + } else { + result_func = unbound_result_func; + Py_INCREF(result_func); + } + } + Py_DECREF(signature); + Py_XDECREF(unbound_result_func); + return result_func; +} +static PyObject * +__pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; + int static_specialized = (cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD && + !((__pyx_FusedFunctionObject *) func)->__signatures__); + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !static_specialized) { + return __Pyx_CyFunction_CallAsMethod(func, args, kw); + } else { + return __Pyx_CyFunction_Call(func, args, kw); + } +} +static PyObject * +__pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_FusedFunctionObject *binding_func = (__pyx_FusedFunctionObject *) func; + Py_ssize_t argc = PyTuple_GET_SIZE(args); + PyObject *new_args = NULL; + __pyx_FusedFunctionObject *new_func = NULL; + PyObject *result = NULL; + int is_staticmethod = binding_func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD; + if (binding_func->self) { + PyObject *self; + Py_ssize_t i; + new_args = PyTuple_New(argc + 1); + if (unlikely(!new_args)) + return NULL; + self = binding_func->self; + Py_INCREF(self); + PyTuple_SET_ITEM(new_args, 0, self); + self = NULL; + for (i = 0; i < argc; i++) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(args, i); + Py_INCREF(item); +#else + PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad; +#endif + PyTuple_SET_ITEM(new_args, i + 1, item); + } + args = new_args; + } + if (binding_func->__signatures__) { + PyObject *tup; + if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) { + tup = PyTuple_Pack(3, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod( + func, binding_func->__signatures__, tup, NULL); + } else { + tup = PyTuple_Pack(4, binding_func->__signatures__, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL); + } + Py_DECREF(tup); + if (unlikely(!new_func)) + goto bad; + __Pyx_CyFunction_SetClassObj(new_func, __Pyx_CyFunction_GetClassObj(binding_func)); + func = (PyObject *) new_func; + } + result = __pyx_FusedFunction_callfunction(func, args, kw); +bad: + Py_XDECREF(new_args); + Py_XDECREF((PyObject *) new_func); + return result; +} +static PyMemberDef __pyx_FusedFunction_members[] = { + {(char *) "__signatures__", + T_OBJECT, + offsetof(__pyx_FusedFunctionObject, __signatures__), + READONLY, + 0}, + {(char *) "__self__", T_OBJECT_EX, offsetof(__pyx_FusedFunctionObject, self), READONLY, 0}, + {0, 0, 0, 0, 0}, +}; +static PyGetSetDef __pyx_FusedFunction_getsets[] = { + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_FusedFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__pyx_FusedFunction_dealloc}, + {Py_tp_call, (void *)__pyx_FusedFunction_call}, + {Py_tp_traverse, (void *)__pyx_FusedFunction_traverse}, + {Py_tp_clear, (void *)__pyx_FusedFunction_clear}, + {Py_tp_members, (void *)__pyx_FusedFunction_members}, + {Py_tp_getset, (void *)__pyx_FusedFunction_getsets}, + {Py_tp_descr_get, (void *)__pyx_FusedFunction_descr_get}, + {Py_mp_subscript, (void *)__pyx_FusedFunction_getitem}, + {0, 0}, +}; +static PyType_Spec __pyx_FusedFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_FusedFunctionType_slots +}; +#else +static PyMappingMethods __pyx_FusedFunction_mapping_methods = { + 0, + (binaryfunc) __pyx_FusedFunction_getitem, + 0, +}; +static PyTypeObject __pyx_FusedFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + (destructor) __pyx_FusedFunction_dealloc, + 0, + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + 0, + 0, + 0, + &__pyx_FusedFunction_mapping_methods, + 0, + (ternaryfunc) __pyx_FusedFunction_call, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __pyx_FusedFunction_traverse, + (inquiry) __pyx_FusedFunction_clear, + 0, + 0, + 0, + 0, + 0, + __pyx_FusedFunction_members, + __pyx_FusedFunction_getsets, + &__pyx_CyFunctionType_type, + 0, + __pyx_FusedFunction_descr_get, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_FusedFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + PyObject *bases = PyTuple_Pack(1, __pyx_CyFunctionType); + if (unlikely(!bases)) { + return -1; + } + __pyx_FusedFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_FusedFunctionType_spec, bases); + Py_DECREF(bases); +#else + CYTHON_UNUSED_VAR(module); + __pyx_FusedFunctionType_type.tp_base = __pyx_CyFunctionType; + __pyx_FusedFunctionType = __Pyx_FetchCommonType(&__pyx_FusedFunctionType_type); +#endif + if (unlikely(__pyx_FusedFunctionType == NULL)) { + return -1; + } + return 0; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (unlikely(buf->strides[dim] != sizeof(void *))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (unlikely(buf->strides[dim] != buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (unlikely(stride < buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (unlikely(buf->suboffsets)) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, int ndim, int spec) +{ + CYTHON_UNUSED_VAR(ndim); + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (unlikely(buf->ndim != ndim)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; + } + if (unlikely((unsigned) buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->len > 0) { + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; + } + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) + goto fail; + } + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int16_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int16_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* PyUCS4InUnicode */ + #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if PY_VERSION_HEX < 0x03090000 +#define __Pyx_PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(op) +#define __Pyx_PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(op) +#else +#define __Pyx_PyUnicode_AS_UNICODE(op) (((PyASCIIObject *)(op))->wstr) +#define __Pyx_PyUnicode_GET_SIZE(op) ((PyCompactUnicodeObject *)(op))->wstr_length +#endif +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 +static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE high_val, low_val; + Py_UNICODE* pos; + high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1))); + low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1))); + for (pos=buffer; pos < buffer+length-1; pos++) { + if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1; + } + return 0; +} +#endif +static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE uchar; + Py_UNICODE* pos; + uchar = (Py_UNICODE) character; + for (pos=buffer; pos < buffer+length; pos++) { + if (unlikely(uchar == pos[0])) return 1; + } + return 0; +} +#endif +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { +#if CYTHON_PEP393_ENABLED + const int kind = PyUnicode_KIND(unicode); + #ifdef PyUnicode_WCHAR_KIND + if (likely(kind != PyUnicode_WCHAR_KIND)) + #endif + { + Py_ssize_t i; + const void* udata = PyUnicode_DATA(unicode); + const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); + for (i=0; i < length; i++) { + if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1; + } + return 0; + } +#elif PY_VERSION_HEX >= 0x03090000 + #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. +#elif !defined(PyUnicode_AS_UNICODE) + #error Cannot use "UChar in Unicode" in Python < 3.9 without Py_UNICODE support. +#endif +#if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 + if ((sizeof(Py_UNICODE) == 2) && unlikely(character > 65535)) { + return __Pyx_PyUnicodeBufferContainsUCS4_SP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } else +#endif + { + return __Pyx_PyUnicodeBufferContainsUCS4_BMP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } +#endif +} + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (unlikely(from_mvs->suboffsets[i] >= 0)) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (unlikely(memviewslice->memview || memviewslice->data)) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#if PY_VERSION_HEX >= 0x030A0000 || defined(HAVE_STDARG_PROTOTYPES) + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + return; + } + old_acquisition_count = __pyx_add_acquisition_count(memview); + if (unlikely(old_acquisition_count <= 0)) { + if (likely(old_acquisition_count == 0)) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count+1, lineno); + } + } +} +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + memslice->memview = NULL; + return; + } + old_acquisition_count = __pyx_sub_acquisition_count(memview); + memslice->data = NULL; + if (likely(old_acquisition_count > 1)) { + memslice->memview = NULL; + } else if (likely(old_acquisition_count == 1)) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count-1, lineno); + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* ImportNumPyArray */ + static PyObject* __Pyx__ImportNumPyArray(void) { + PyObject *numpy_module, *ndarray_object = NULL; + numpy_module = __Pyx_Import(__pyx_n_s_numpy, NULL, 0); + if (likely(numpy_module)) { + ndarray_object = PyObject_GetAttrString(numpy_module, "ndarray"); + Py_DECREF(numpy_module); + } + if (unlikely(!ndarray_object)) { + PyErr_Clear(); + } + if (unlikely(!ndarray_object || !PyObject_TypeCheck(ndarray_object, &PyType_Type))) { + Py_XDECREF(ndarray_object); + Py_INCREF(Py_None); + ndarray_object = Py_None; + } + return ndarray_object; +} +static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void) { + if (unlikely(!__pyx_numpy_ndarray)) { + __pyx_numpy_ndarray = __Pyx__ImportNumPyArray(); + } + Py_INCREF(__pyx_numpy_ndarray); + return __pyx_numpy_ndarray; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const char neg_one = (char) -1, const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(char) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 2 * PyLong_SHIFT)) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 3 * PyLong_SHIFT)) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 4 * PyLong_SHIFT)) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(char) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(char) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(char) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (char) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (char) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (char) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (char) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(char) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(char) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((char) 1) << (sizeof(char) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name_2); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__71); + } + return name; +} +#endif + +/* CheckBinaryVersion */ + static unsigned long __Pyx_get_runtime_version(void) { +#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/feature_generation/feature_gen.pyx b/gators/feature_generation/feature_gen.pyx index a51b8173..7d9282be 100644 --- a/gators/feature_generation/feature_gen.pyx +++ b/gators/feature_generation/feature_gen.pyx @@ -39,13 +39,12 @@ cpdef np.ndarray[object, ndim = 2] one_hot( cpdef np.ndarray[num_t, ndim = 2] is_null( np.ndarray[num_t, ndim=2] X, np.ndarray[np.int64_t, ndim=1] idx_columns, - object dtype ): cdef int i cdef int j cdef int n_rows = X.shape[0] cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), dtype) + cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) with nogil: for i in range(n_rows): for j in range(n_cols): @@ -69,7 +68,7 @@ cpdef np.ndarray[object, ndim = 2] is_null_object( for i in range(n_rows): for j in range(n_cols): - if (X[i, idx_columns[j]] is None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): + if (X[i, idx_columns[j]] == None) or (X[i, idx_columns[j]] != X[i, idx_columns[j]]): X_new[i, j] = 1. return np.concatenate((X, X_new), axis=1) @@ -85,8 +84,7 @@ cpdef np.ndarray[num_t, ndim = 2] is_equal( cdef int j cdef int n_rows = X.shape[0] cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[num_t, ndim = 2] X_new = np.empty( - (n_rows, n_cols), dtype=X.dtype) + cdef np.ndarray[num_t, ndim = 2] X_new = np.empty((n_rows, n_cols), X.dtype) with nogil: for i in range(n_rows): for j in range(n_cols): @@ -106,28 +104,26 @@ cpdef np.ndarray[object, ndim = 2] is_equal_object( cdef int j cdef int n_rows = X.shape[0] cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty( - (n_rows, n_cols)) + cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) for i in range(n_rows): for j in range(n_cols): X_new[i, j] = X[i, idx_columns_a[j]] == X[i, idx_columns_b[j]] return np.concatenate((X, X_new), axis=1) + @cython.cdivision(True) @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] cluster_statistics( +cpdef np.ndarray[np.float64_t, ndim = 2] cluster_statistics( np.ndarray[num_float_t, ndim=2] X, np.ndarray[np.int64_t, ndim=2] idx_columns, - object dtype ): cdef int i cdef int j cdef int n_rows = X.shape[0] cdef int n_cols = idx_columns.shape[0] cdef int n_elements = idx_columns.shape[1] - cdef np.ndarray[num_float_t, ndim = 2] X_new = np.zeros( - (n_rows, 2 * n_cols), dtype=dtype) + cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) cdef num_float_t mean cdef num_float_t std cdef num_float_t denumerator = (n_elements - 1) @@ -144,57 +140,25 @@ cpdef np.ndarray[num_float_t, ndim = 2] cluster_statistics( (X[i, idx_columns[j, k]] - mean) X_new[i, 2 * j] = mean X_new[i, 2 * j + 1] = sqrt(std) / denumerator - return np.concatenate((X, X_new), axis=1) - - + return X_new @cython.cdivision(True) @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] cluster_statistics_object( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=2] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef int n_elements = idx_columns.shape[1] - cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.zeros((n_rows, 2 * n_cols)) - cdef double mean - cdef double std - for i in range(n_rows): - for j in range(n_cols): - mean = 0. - std = 0. - for k in range(n_elements): - mean += X[i, idx_columns[j, k]] - mean /= n_elements - for k in range(n_elements): - std += (X[i, idx_columns[j, k]] - mean) * \ - (X[i, idx_columns[j, k]] - mean) - X_new[i, 2 * j] = mean - X_new[i, 2 * j + 1] = sqrt(std) / (n_elements - 1) - return np.concatenate((X, X_new), axis=1) - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] elementary_arithmetics( - np.ndarray[num_float_t, ndim=2] X, +cpdef np.ndarray[np.float64_t, ndim = 2] elementary_arithmetics( + np.ndarray[num_t, ndim=2] X, np.ndarray[np.int64_t, ndim=1] idx_columns_a, np.ndarray[np.int64_t, ndim=1] idx_columns_b, object operator, float coef, float EPSILON, - object dtype ): cdef int i cdef int j cdef int n_rows = X.shape[0] cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[num_float_t, ndim = 2] X_new = np.empty((n_rows, n_cols), dtype) + cdef np.ndarray[np.float64_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) if operator == '+': with nogil: for i in range(n_rows): @@ -210,40 +174,7 @@ cpdef np.ndarray[num_float_t, ndim = 2] elementary_arithmetics( for i in range(n_rows): for j in range(n_cols): X_new[i, j] = X[i, idx_columns_a[j]] / (X[i, idx_columns_b[j]] + EPSILON) - return np.concatenate((X, X_new), axis=1) - - -@cython.cdivision(True) -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] elementary_arithmetics_object( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns_a, - np.ndarray[np.int64_t, ndim=1] idx_columns_b, - object operator, - float coef, - float EPSILON, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns_a.shape[0] - cdef np.ndarray[np.float_t, ndim = 2] X_new = np.empty((n_rows, n_cols)) - if operator == '+': - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] + coef * X[i, idx_columns_b[j]] - elif operator == '*': - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] * X[i, idx_columns_b[j]] - else: - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = X[i, idx_columns_a[j]] / \ - (X[i, idx_columns_b[j]] + EPSILON) - return np.concatenate((X, X_new), axis=1) - + return X_new @cython.boundscheck(False) @@ -269,7 +200,7 @@ cpdef np.ndarray[num_t, ndim = 2] plan_rotation( for k in range(n_elements): X_new[i, 2*k + 2*j*n_elements] = X[i, idx_columns_x[j]] * cos_vec[k] - X[i, idx_columns_y[j]] * sin_vec[k] X_new[i, 2*k+1+ 2*j*n_elements] = X[i, idx_columns_x[j]] * sin_vec[k] + X[i, idx_columns_y[j]] * cos_vec[k] - return np.concatenate((X, X_new), axis=1) + return X_new @cython.boundscheck(False) @@ -278,11 +209,10 @@ cpdef np.ndarray[num_t, ndim = 2] polynomial( np.ndarray[num_t, ndim=2] X, np.ndarray[np.int64_t, ndim=2] combinations_np, int degree, - object dtype ): cdef int n_rows = X.shape[0] cdef int n_cols = combinations_np.shape[0] - cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols), dtype) + cdef np.ndarray[num_t, ndim = 2] X_new = np.ones((n_rows, n_cols)) cdef int i = 0 cdef int j = 0 cdef int k = 0 @@ -292,7 +222,30 @@ cpdef np.ndarray[num_t, ndim = 2] polynomial( for k in range(degree): if combinations_np[j, k] >= 0: X_new[i, j] *= X[i, combinations_np[j, k]] - return np.concatenate((X, X_new), axis=1) - + return X_new +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim = 2] polynomial_object( + np.ndarray[object, ndim=2] X, + np.ndarray[np.int64_t, ndim=2] combinations_np, + int degree, +): + cdef int n_rows = X.shape[0] + cdef int n_cols = combinations_np.shape[0] + cdef np.ndarray[object, ndim = 2] X_new = np.zeros((n_rows, n_cols), object) + cdef int i = 0 + cdef int j = 0 + cdef int k = 0 + cdef object val + for i in range(n_rows): + for j in range(n_cols): + val = '' + for k in range(degree): + if combinations_np[j, k] >= 0: + if X[i, combinations_np[j, k]] == None: + continue + val += str(X[i, combinations_np[j, k]]) + X_new[i, j] = val + return np.concatenate((X, X_new), axis=1) \ No newline at end of file diff --git a/gators/feature_generation/is_equal.py b/gators/feature_generation/is_equal.py index d803855f..498d7b7c 100644 --- a/gators/feature_generation/is_equal.py +++ b/gators/feature_generation/is_equal.py @@ -1,15 +1,15 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen import is_equal, is_equal_object from ..util import util from ._base_feature_generation import _BaseFeatureGeneration +from gators import DataFrame, Series + class IsEqual(_BaseFeatureGeneration): """Create new columns based on value matching. @@ -23,68 +23,57 @@ class IsEqual(_BaseFeatureGeneration): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation import IsEqual - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> obj.fit_transform(X) - A B A__is__B - 0 1 1 1 - 1 2 1 0 - 2 3 1 0 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsEqual - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> obj.fit_transform(X) - A B A__is__B - 0 1 1 1 - 1 2 1 0 - 2 3 1 0 + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}), npartitions=1) + + * `koalas` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation import IsEqual >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1, 1, 1], - [2, 1, 0], - [3, 1, 0]]) - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsEqual - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) - >>> obj = IsEqual(columns_a=['A'],columns_b=['B']) + >>> obj.fit_transform(X) + A B A__is__B + 0 1 1 1.0 + 1 2 1 0.0 + 2 3 1 0.0 + + >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1, 1, 1], [2, 1, 0], [3, 1, 0]]) - """ def __init__( self, columns_a: List[str], columns_b: List[str], column_names: List[str] = None ): - if not isinstance(columns_a, list): + if not isinstance(columns_a, (list, np.ndarray)): raise TypeError("`columns_a` should be a list.") - if not isinstance(columns_b, list): + if not isinstance(columns_b, (list, np.ndarray)): raise TypeError("`columns_b` should be a list.") if column_names is not None and not isinstance(column_names, list): raise TypeError("`columns_a` should be a list.") if len(columns_a) != len(columns_b): raise ValueError("Length of `columns_a` and `columns_b` should match.") - if len(columns_a) == 0: + if not columns_a: raise ValueError("`columns_a` and `columns_b` should not be empty.") if not column_names: column_names = [ @@ -95,36 +84,26 @@ def __init__( """Length of `columns_a`, `columns_b` and `column_names` should match.""" ) - column_mapping = { - name: [c_a, c_b] - for name, c_a, c_b in zip(column_names, columns_a, columns_b) - } columns = list(set(columns_a + columns_b)) _BaseFeatureGeneration.__init__( self, columns=columns, column_names=column_names, - column_mapping=column_mapping, - dtype=None, ) self.columns_a = columns_a self.columns_b = columns_b self.idx_columns_a: List[int] = [] self.idx_columns_b: List[int] = [] - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ): + def fit(self, X: DataFrame, y: Series = None): """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- @@ -132,6 +111,7 @@ def fit( Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.idx_columns_a = util.get_idx_columns( columns=X.columns, selected_columns=self.columns_a ) @@ -140,43 +120,27 @@ def fit( ) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for a, b, name in zip(self.columns_a, self.columns_b, self.column_names): - x_dtype = X[a].dtype - x_dtype = ( - x_dtype if (x_dtype != object) and (x_dtype != bool) else np.float64 - ) - X.loc[:, name] = (X[a] == X[b]).astype(x_dtype) - return X - for a, b, name in zip(self.columns_a, self.columns_b, self.column_names): - x_dtype = X[a].dtype - x_dtype = ( - x_dtype if (x_dtype != object) and (x_dtype != bool) else np.float64 - ) - X = X.assign(dummy=(X[a] == X[b]).astype(x_dtype)).rename( - columns={"dummy": name} - ) + X[name] = (X[a] == X[b]).astype(float) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -185,7 +149,7 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) diff --git a/gators/feature_generation/is_larger_than.py b/gators/feature_generation/is_larger_than.py new file mode 100644 index 00000000..6ddc44f4 --- /dev/null +++ b/gators/feature_generation/is_larger_than.py @@ -0,0 +1,169 @@ +# License: Apache-2.0 +from typing import Dict, List + +import numpy as np + +from feature_gen import one_hot + +from ..util import util +from ._base_feature_generation import _BaseFeatureGeneration + +from gators import DataFrame, Series + + +class IsLargerThan(_BaseFeatureGeneration): + """Create new columns based on the following definition: X[binarized_col] = X[col] >= bound. + + Parameters + ---------- + bounds_dict : Dict[str: List[float]]. + keys: columns, values: list of bounds. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation import OneHot + >>> bounds_dict = {'A': ['b', 'c'], 'B': ['z']} + >>> obj = OneHot(bounds_dict=bounds_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__onehot__b A__onehot__c B__onehot__z + 0 a z False False True + 1 b a True False False + 2 c a False True False + + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['a', 'z', False, False, True], + ['b', 'a', True, False, False], + ['c', 'a', False, True, False]], dtype=object) + + """ + + def __init__( + self, bounds_dict: Dict[str, List[float]], column_names: List[str] = None + ): + if not isinstance(bounds_dict, dict): + raise TypeError("`bounds_dict` should be a dict.") + if column_names is not None and not isinstance( + column_names, (list, np.ndarray) + ): + raise TypeError("`column_names` should be None or a list.") + self.bounds_dict = bounds_dict + columns = list(set(bounds_dict.keys())) + if not column_names: + column_names = [ + f"{col}__{bound}_inf" + for col, bounds in bounds_dict.items() + for bound in bounds + ] + columns = [col for col, bounds in bounds_dict.items() for _ in bounds] + n_bounds = sum(len(bound) for bound in bounds_dict.values()) + if column_names and n_bounds != len(column_names): + raise ValueError( + "Length of `clusters_dict` and `column_names` should match." + ) + + _BaseFeatureGeneration.__init__( + self, + columns=columns, + column_names=column_names, + ) + self.mapping = dict( + zip( + column_names, + [ + [col, bound] + for col, bounds in bounds_dict.items() + for bound in bounds + ], + ) + ) + + def fit(self, X: DataFrame, y: Series = None): + """ + Fit the dataframe X. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y (np.ndarray, optional): labels. Defaults to None. + + Returns + ------- + self : OneHot + Instance of itself. + """ + self.check_dataframe(X) + self.base_columns = list(X.columns) + self.bounds = np.array( + [bound for bounds in self.bounds_dict.values() for bound in bounds] + ) + cols_flatten = np.array( + [col for col, bounds in self.bounds_dict.items() for _ in bounds] + ) + self.idx_columns = util.get_idx_columns(X, cols_flatten) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + new_series_list = [] + for name, col, bound in zip(self.column_names, self.columns, self.bounds): + dummy = X[col] >= bound + new_series_list.append(dummy.rename(name)) + + return util.get_function(X).concat( + [X, util.get_function(X).concat(new_series_list, axis=1)], + axis=1, + ) + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + # return one_hot(X, self.idx_columns, self.bounds) diff --git a/gators/feature_generation/is_null.py b/gators/feature_generation/is_null.py index 35561707..114d36fb 100644 --- a/gators/feature_generation/is_null.py +++ b/gators/feature_generation/is_null.py @@ -1,115 +1,98 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen import is_null, is_null_object from ..util import util from ._base_feature_generation import _BaseFeatureGeneration +from gators import DataFrame, Series + class IsNull(_BaseFeatureGeneration): """Create new columns based on missing values. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - dtype : type, default to np.float64 + dtype : type, default np.float64 Numpy dtype of the output columns. Examples --------- + Imports and initialization: + + >>> from gators.feature_generation import IsNull + >>> obj = IsNull(columns=['A', 'B']) + + The `fit`, `transform`, and `fit_transform` methods accept: - * fit & transform with `pandas` + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation import IsNull >>> X = pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) - >>> obj.fit_transform(X) - A B A__is_null B__is_null - 0 None NaN 1.0 1.0 - 1 a 1.0 0.0 0.0 - 2 b 1.0 0.0 0.0 - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsNull - >>> X = ks.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) >>> obj.fit_transform(X) A B A__is_null B__is_null 0 None NaN 1.0 1.0 1 a 1.0 0.0 0.0 2 b 1.0 0.0 0.0 - * fit with `pandas` & transform with `NumPy` - >>> import pandas as pd - >>> from gators.feature_generation import IsNull >>> X = pd.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[None, nan, 1.0, 1.0], ['a', 1.0, 0.0, 0.0], ['b', 1.0, 0.0, 0.0]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import IsNull - >>> X = ks.DataFrame({'A': [None, 'a', 'b'], 'B': [np.nan, 1, 1]}) - >>> obj = IsNull(columns=['A', 'B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[None, nan, 1.0, 1.0], - ['a', 1.0, 0.0, 0.0], - ['b', 1.0, 0.0, 0.0]], dtype=object) - """ def __init__( self, columns: List[str], column_names: List[str] = None, - dtype: type = np.float64, ): - if not isinstance(columns, list): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") - if column_names is not None and not isinstance(column_names, list): + if column_names is not None and not isinstance( + column_names, (list, np.ndarray) + ): raise TypeError("`column_names` should be a list.") if not column_names: column_names = [f"{c}__is_null" for c in columns] if len(column_names) != len(columns): raise ValueError("Length of `columns` and `column_names` should match.") - column_mapping = dict(zip(column_names, columns)) _BaseFeatureGeneration.__init__( self, columns=columns, column_names=column_names, - column_mapping=column_mapping, - dtype=dtype, ) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ): + def fit(self, X: DataFrame, y: Series = None): """ Fit the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. y (np.ndarray, optional): labels. Defaults to None. @@ -119,38 +102,36 @@ def fit( Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.idx_columns = util.get_idx_columns( columns=X.columns, selected_columns=self.columns ) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - X[self.column_names] = X[self.columns].isnull().astype(self.dtype) - return X + X_list = [] for col, name in zip(self.columns, self.column_names): - X = X.assign(dummy=X[col].isnull().astype(self.dtype)).rename( - columns={"dummy": name} - ) - return X + x = X[col].isnull().astype(np.float64) + x.name = name + X_list.append(x) + X_new = util.get_function(X).concat(X_list, axis=1) + return util.get_function(X).concat([X, X_new], axis=1) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -159,10 +140,10 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) if X.dtype == object: return is_null_object(X, self.idx_columns) - return is_null(X, self.idx_columns, self.dtype) + return is_null(X, self.idx_columns) diff --git a/gators/feature_generation/is_smaller_than.py b/gators/feature_generation/is_smaller_than.py new file mode 100644 index 00000000..341073cf --- /dev/null +++ b/gators/feature_generation/is_smaller_than.py @@ -0,0 +1,126 @@ +# License: Apache-2.0 +from typing import Dict, List + +import numpy as np + +from ..util import util + +from .is_larger_than import IsLargerThan + +from gators import DataFrame + + +class IsSmallerThan(IsLargerThan): + """Create new columns based on the following definition: X[binarized_col] = X[col] >= bound. + + Parameters + ---------- + bounds_dict : Dict[str: List[float]]. + keys: columns, values: list of bounds. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation import OneHot + >>> bounds_dict = {'A': ['b', 'c'], 'B': ['z']} + >>> obj = OneHot(bounds_dict=bounds_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__onehot__b A__onehot__c B__onehot__z + 0 a z False False True + 1 b a True False False + 2 c a False True False + + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['a', 'z', False, False, True], + ['b', 'a', True, False, False], + ['c', 'a', False, True, False]], dtype=object) + + """ + + def __init__( + self, bounds_dict: Dict[str, List[float]], column_names: List[str] = None + ): + IsLargerThan.__init__(self, bounds_dict=bounds_dict, column_names=column_names) + if not column_names: + self.column_names = [ + f"{col}__-inf_{bound}" + for col, bounds in bounds_dict.items() + for bound in bounds + ] + else: + self.column_names = column_names + self.columns = [col for col, bounds in bounds_dict.items() for _ in bounds] + self.mapping = dict( + zip( + self.column_names, + [ + [col, bound] + for col, bounds in bounds_dict.items() + for bound in bounds + ], + ) + ) + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + new_series_list = [] + for name, col, bound in zip(self.column_names, self.columns, self.bounds): + dummy = X[col] < bound + new_series_list.append(dummy.rename(name)) + + return util.get_function(X).concat( + [X, util.get_function(X).concat(new_series_list, axis=1)], + axis=1, + ) + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + # return one_hot(X, self.idx_columns, self.bounds) diff --git a/gators/feature_generation/negation_bool.py b/gators/feature_generation/negation_bool.py new file mode 100644 index 00000000..f0c49de7 --- /dev/null +++ b/gators/feature_generation/negation_bool.py @@ -0,0 +1,129 @@ +# License: Apache-2.0 +from typing import Dict, List + +import numpy as np + +from feature_gen import one_hot + +from ..util import util +from ._base_feature_generation import _BaseFeatureGeneration + +from gators import DataFrame, Series + + +class NegationBool(_BaseFeatureGeneration): + """Create new columns based on the negation operator. + + Parameters + ---------- + bounds_dict : Dict[str: List[float]]. + keys: columns, values: list of bounds. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation import OneHot + >>> bounds_dict = {'A': ['b', 'c'], 'B': ['z']} + >>> obj = OneHot(bounds_dict=bounds_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__onehot__b A__onehot__c B__onehot__z + 0 a z False False True + 1 b a True False False + 2 c a False True False + + >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['a', 'z', False, False, True], + ['b', 'a', True, False, False], + ['c', 'a', False, True, False]], dtype=object) + + """ + + def __init__(self, columns: List[str], column_names: List[str] = None): + if not column_names: + column_names = [f"{col}__NOT" for col in columns] + if len(columns) != len(column_names): + raise ValueError("Length of `columns` and `column_names` should match.") + + _BaseFeatureGeneration.__init__( + self, + columns=columns, + column_names=column_names, + ) + + def fit(self, X: DataFrame, y: Series = None): + """ + Fit the dataframe X. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y (np.ndarray, optional): labels. Defaults to None. + + Returns + ------- + self : OneHot + Instance of itself. + """ + self.check_dataframe(X) + self.idx_columns = util.get_idx_columns(X, self.columns) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + X_dummy = ~(X[self.columns].astype(bool)).rename( + columns=dict(zip(self.columns, self.column_names)) + ) + return util.get_function(X).concat([X, X_dummy], axis=1) + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + # return one_hot(X, self.idx_columns, self.bounds) diff --git a/gators/feature_generation/one_hot.py b/gators/feature_generation/one_hot.py index 949d5a24..938f78cd 100644 --- a/gators/feature_generation/one_hot.py +++ b/gators/feature_generation/one_hot.py @@ -1,15 +1,15 @@ # License: Apache-2.0 -from typing import Dict, List, Union +from typing import Dict, List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen import one_hot from ..util import util from ._base_feature_generation import _BaseFeatureGeneration +from gators import DataFrame, Series + class OneHot(_BaseFeatureGeneration): """Create new columns based on the one-hot technique. @@ -21,48 +21,39 @@ class OneHot(_BaseFeatureGeneration): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation import OneHot + >>> categories_dict = {'A': ['b', 'c'], 'B': ['z']} + >>> obj = OneHot(categories_dict=categories_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) - >>> obj.fit_transform(X) - A B A__onehot__b A__onehot__c B__onehot__z - 0 a z False False True - 1 b a True False False - 2 c a False True False - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation import OneHot - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) >>> obj.fit_transform(X) A B A__onehot__b A__onehot__c B__onehot__z 0 a z False False True 1 b a True False False 2 c a False True False - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import OneHot >>> X = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 'z', False, False, True], - ['b', 'a', True, False, False], - ['c', 'a', False, True, False]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import OneHot - >>> X = ks.DataFrame({'A': ['a', 'b', 'c'], 'B': ['z', 'a', 'a']}) - >>> obj = OneHot(categories_dict={'A': ['b', 'c'], 'B': ['z']}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['a', 'z', False, False, True], @@ -76,7 +67,9 @@ def __init__( ): if not isinstance(categories_dict, dict): raise TypeError("`categories_dict` should be a dict.") - if column_names is not None and not isinstance(column_names, list): + if column_names is not None and not isinstance( + column_names, (list, np.ndarray) + ): raise TypeError("`column_names` should be None or a list.") self.categories_dict = categories_dict columns = list(set(categories_dict.keys())) @@ -86,17 +79,8 @@ def __init__( for col, cats in categories_dict.items() for cat in cats ] - column_mapping = { - f"{col}__onehot__{cat}": col - for col, cats in categories_dict.items() - for cat in cats - } - else: - column_mapping = { - name: col for name, col in zip(column_names, categories_dict.keys()) - } columns = [col for col, cats in categories_dict.items() for cat in cats] - n_cats = sum([len(cat) for cat in categories_dict.values()]) + n_cats = sum(len(cat) for cat in categories_dict.values()) if column_names and n_cats != len(column_names): raise ValueError( "Length of `clusters_dict` and `column_names` should match." @@ -106,30 +90,31 @@ def __init__( self, columns=columns, column_names=column_names, - column_mapping=column_mapping, - dtype=None, ) - self.mapping = dict(zip(self.column_names, self.columns)) + self.mapping = dict( + zip( + column_names, + [[col, cat] for col, cats in categories_dict.items() for cat in cats], + ) + ) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ): + def fit(self, X: DataFrame, y: Series = None): """ Fit the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. y (np.ndarray, optional): labels. Defaults to None. Returns ------- - OneHot: Instance of itself. + self : OneHot + Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.cats = np.array( [cat for cats in self.categories_dict.values() for cat in cats] ).astype(object) @@ -139,33 +124,38 @@ def fit( self.idx_columns = util.get_idx_columns(X, cols_flatten) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for name, col, cat in zip(self.column_names, self.columns, self.cats): - X.loc[:, name] = X[col] == cat - return X + # util.get_function(X).set_option("compute.ops_on_diff_frames", True) + # for name, col, cat in zip(self.column_names, self.columns, self.cats): + # X[name] = X[col] == cat + # util.get_function(X).set_option("compute.ops_on_diff_frames", False) + # return X + new_series_list = [] for name, col, cat in zip(self.column_names, self.columns, self.cats): - X = X.assign(dummy=(X[col] == cat)).rename(columns={"dummy": name}) - return X + dummy = X[col] == cat + new_series_list.append(dummy.rename(name)) + + return util.get_function(X).concat( + [X, util.get_function(X).concat(new_series_list, axis=1).astype(float)], + axis=1, + ) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -174,7 +164,7 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) diff --git a/gators/feature_generation/plan_rotation.py b/gators/feature_generation/plan_rotation.py new file mode 100644 index 00000000..51059f74 --- /dev/null +++ b/gators/feature_generation/plan_rotation.py @@ -0,0 +1,182 @@ +# License: Apache-2.0 +from math import cos +from math import pi as PI +from math import sin +from typing import List + +import numpy as np + +from feature_gen import plan_rotation +from gators.transformers import Transformer +from gators.util import util + +from ._base_feature_generation import _BaseFeatureGeneration + +from gators import DataFrame, Series + + +class PlanRotation(Transformer): + """Create new columns based on the plan rotation mapping. + + The data should be composed of numerical columns only. + Use `gators.encoders` to replace the categorical columns by + numerical ones before using `PlanRotation`. + + Parameters + ---------- + columns : List[List[str]] + List of pair-wise columns. + theta_vec : List[float] + List of rotation angles. + dtype : type, default np.float64 + Numpy dtype of the output data. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation import PlanRotation + >>> obj = PlanRotation( + ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0, 60.0]) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( + ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame( + ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + X Y Z ... XZ_y_45.0deg XZ_x_60.0deg XZ_y_60.0deg + 0 200.0 140.0 100.0 ... 212.132034 13.397460 223.205081 + 1 210.0 160.0 125.0 ... 236.880772 -3.253175 244.365335 + + >>> X = pd.DataFrame( + ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([[200. , 140. , 100. , 42.42640687, + 240.4163056 , -21.24355653, 243.20508076, 70.71067812, + 212.13203436, 13.39745962, 223.20508076], + [210. , 160. , 125. , 35.35533906, + 261.62950904, -33.56406461, 261.86533479, 60.1040764 , + 236.8807717 , -3.25317547, 244.36533479]]) + """ + + def __init__(self, columns: List[List[str]], theta_vec: List[float]): + if not isinstance(columns, (list, np.ndarray)): + raise TypeError("`columns` should be a list.") + if not isinstance(theta_vec, (list, np.ndarray)): + raise TypeError("`theta_vec` should be a list.") + if not columns: + raise ValueError("`columns` should not be empty.") + if not any(isinstance(cols, list) for cols in columns): + raise TypeError("`columns` should be a list of lists.") + if not all(isinstance(theta, (float, int)) for theta in theta_vec): + raise TypeError("`theta_vec` should be a list of ints or floats.") + + column_names = [ + [f"{x}{y}_x_{t}deg", f"{x}{y}_y_{t}deg"] + for (x, y) in columns + for t in theta_vec + ] + column_names = [c for cols in column_names for c in cols] + _BaseFeatureGeneration.__init__( + self, + columns=columns, + column_names=column_names, + ) + self.theta_vec = theta_vec + self.theta_vec_np = np.array(self.theta_vec) + self.cos_theta_vec = np.cos(self.theta_vec_np * np.pi / 180) + self.sin_theta_vec = np.sin(self.theta_vec_np * np.pi / 180) + + def fit(self, X: DataFrame, y: Series = None) -> "PlanRotation": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + PlanRotation + Instance of itself. + """ + self.check_dataframe(X) + self.base_columns = list(X.columns) + flatten_columns = [c for cols in self.columns for c in cols] + self.idx_columns_x = util.get_idx_columns( + X[flatten_columns], flatten_columns[::2] + ) + self.idx_columns_y = util.get_idx_columns( + X[flatten_columns], flatten_columns[1::2] + ) + self.idx_subarray = util.get_idx_columns(X.columns, flatten_columns) + self.flatten_columns = flatten_columns + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + for x, y in zip(self.flatten_columns[::2], self.flatten_columns[1::2]): + for theta in self.theta_vec_np: + cos_theta = cos(theta * PI / 180) + sin_theta = sin(theta * PI / 180) + X[f"{x}{y}_x_{theta}deg"] = X[x] * cos_theta - X[y] * sin_theta + X[f"{x}{y}_y_{theta}deg"] = X[x] * sin_theta + X[y] * cos_theta + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + X_new = plan_rotation( + X[:, self.idx_subarray].astype(np.float64), + self.idx_columns_x, + self.idx_columns_y, + self.cos_theta_vec, + self.sin_theta_vec, + ) + return np.concatenate((X, X_new), axis=1) diff --git a/gators/feature_generation/plane_rotation.py b/gators/feature_generation/plane_rotation.py deleted file mode 100644 index b610e08e..00000000 --- a/gators/feature_generation/plane_rotation.py +++ /dev/null @@ -1,202 +0,0 @@ -# License: Apache-2.0 -from math import cos -from math import pi as PI -from math import sin -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from feature_gen import plan_rotation -from gators.transformers import Transformer -from gators.util import util - -from ._base_feature_generation import _BaseFeatureGeneration - - -class PlaneRotation(Transformer): - """Create new columns based on the plane rotation mapping. - - The data should be composed of numerical columns only. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `PlaneRotation`. - - Parameters - ---------- - columns : List[List[str]] - List of pair-wise columns. - theta_vec: List[float] - List of rotation angles. - dtype : type, default to np.float64 - Numpy dtype of the output data. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.feature_generation import PlaneRotation - >>> X = pd.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0, 60.0]) - >>> obj.fit_transform(X) - X Y Z ... XZ_y_45.0deg XZ_x_60.0deg XZ_y_60.0deg - 0 200.0 140.0 100.0 ... 212.132034 13.397460 223.205081 - 1 210.0 160.0 125.0 ... 236.880772 -3.253175 244.365335 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PlaneRotation - >>> X = ks.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']] , theta_vec=[45.0]) - >>> obj.fit_transform(X) - X Y Z XY_x_45.0deg XY_y_45.0deg XZ_x_45.0deg XZ_y_45.0deg - 0 200.0 140.0 125.0 42.426407 240.416306 53.033009 229.809704 - 1 210.0 160.0 175.0 35.355339 261.629509 24.748737 272.236111 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation import PlaneRotation - >>> X = pd.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45.0]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[200. , 140. , 125. , 42.42640687, - 240.4163056 , 53.03300859, 229.80970389], - [210. , 160. , 175. , 35.35533906, - 261.62950904, 24.74873734, 272.23611076]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PlaneRotation - >>> X = ks.DataFrame( - ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [125.0, 175.0]}) - >>> obj = PlaneRotation( - ... columns=[['X', 'Y'], ['X', 'Z']], theta_vec=[45.0]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[200. , 140. , 125. , 42.42640687, - 240.4163056 , 53.03300859, 229.80970389], - [210. , 160. , 175. , 35.35533906, - 261.62950904, 24.74873734, 272.23611076]]) - """ - - def __init__( - self, columns: List[List[str]], theta_vec: List[float], dtype: type = np.float64 - ): - if not isinstance(columns, list): - raise TypeError("`columns` should be a list.") - if not isinstance(theta_vec, list): - raise TypeError("`theta_vec` should be a list.") - if not columns: - raise ValueError("`columns` should not be empty.") - if not any(isinstance(cols, list) for cols in columns): - raise TypeError("`columns` should be a list of lists.") - if not all(isinstance(theta, (float, int)) for theta in theta_vec): - raise TypeError("`theta_vec` should be a list of ints or floats.") - self.check_datatype(dtype, [np.float32, np.float64]) - - column_names = [ - [f"{x}{y}_x_{t}deg", f"{x}{y}_y_{t}deg"] - for (x, y) in columns - for t in theta_vec - ] - column_names = [c for cols in column_names for c in cols] - column_mapping = { - **{f"{x}{y}_x_{t}deg": [x, y] for (x, y) in columns for t in theta_vec}, - **{f"{x}{y}_y_{t}deg": [x, y] for (x, y) in columns for t in theta_vec}, - } - columns = [c for cols in columns for c in cols] - _BaseFeatureGeneration.__init__( - self, - columns=columns, - column_names=column_names, - column_mapping=column_mapping, - dtype=dtype, - ) - self.theta_vec = np.array(theta_vec) - self.cos_theta_vec = np.cos(self.theta_vec * np.pi / 180) - self.sin_theta_vec = np.sin(self.theta_vec * np.pi / 180) - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "PlaneRotation": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - PlaneRotation - Instance of itself. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.idx_columns_x = util.get_idx_columns(X, self.columns[::2]) - self.idx_columns_y = util.get_idx_columns(X, self.columns[1::2]) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for x, y in zip(self.columns[::2], self.columns[1::2]): - for theta in self.theta_vec: - cos_theta = cos(theta * PI / 180) - sin_theta = sin(theta * PI / 180) - X.loc[:, f"{x}{y}_x_{theta}deg"] = X[x] * cos_theta - X[y] * sin_theta - X.loc[:, f"{x}{y}_y_{theta}deg"] = X[x] * sin_theta + X[y] * cos_theta - X[self.column_names] = X[self.column_names].astype(self.dtype) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return plan_rotation( - X.astype(self.dtype), - self.idx_columns_x, - self.idx_columns_y, - self.cos_theta_vec, - self.sin_theta_vec, - ) diff --git a/gators/feature_generation/polynomial_features.py b/gators/feature_generation/polynomial_features.py index 6794d227..94cb96d0 100644 --- a/gators/feature_generation/polynomial_features.py +++ b/gators/feature_generation/polynomial_features.py @@ -1,9 +1,7 @@ from itertools import chain, combinations, combinations_with_replacement -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen import polynomial from gators.transformers import Transformer @@ -11,17 +9,15 @@ from ..util import util from ._base_feature_generation import _BaseFeatureGeneration +from gators import DataFrame, Series + class PolynomialFeatures(Transformer): """Create new columns based on columns multiplication. - The data should be composed of numerical columns only. - Use `gators.encoders` to replace the categorical columns by - numerical ones before using `PolynomialFeatures`. - Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. degree : int, default = 2 The degree of polynomial. The default of degree of 2 @@ -29,65 +25,53 @@ class PolynomialFeatures(Transformer): interaction_only : bool, default = False Allows to keep only interaction terms. If true, only A * B will be produced from features A and B. - dtype : type, default to np.float64 + dtype : type, default np.float64 Numpy dtype of the output data. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation import PolynomialFeatures - >>> X = pd.DataFrame( - ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) >>> obj = PolynomialFeatures(columns=['A', 'B']) - >>> obj.fit_transform(X) - A B C A__x__A A__x__B B__x__B - 0 0.0 1.0 2.0 0.0 0.0 1.0 - 1 3.0 4.0 5.0 9.0 12.0 16.0 - 2 6.0 7.0 8.0 36.0 42.0 49.0 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PolynomialFeatures - >>> X = ks.DataFrame( + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'X': [200.0, 210.0], 'Y': [140.0, 160.0], 'Z': [100.0, 125.0]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures( - ... columns=['A', 'B', 'C'], degree=3, interaction_only=True) - >>> obj.fit_transform(X) - A B C A__x__B A__x__C B__x__C A__x__B__x__C - 0 0.0 1.0 2.0 0.0 0.0 2.0 0.0 - 1 3.0 4.0 5.0 12.0 15.0 20.0 60.0 - 2 6.0 7.0 8.0 42.0 48.0 56.0 336.0 - * fit with `pandas` & transform with `NumPy` + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation import PolynomialFeatures >>> X = pd.DataFrame( ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures( - ... columns=['A', 'B', 'C'], degree=2, interaction_only=True) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[ 0., 1., 2., 0., 0., 2.], - [ 3., 4., 5., 12., 15., 20.], - [ 6., 7., 8., 42., 48., 56.]]) - >>> import databricks.koalas as ks - >>> from gators.feature_generation import PolynomialFeatures - >>> X = ks.DataFrame( + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B C A__x__A A__x__B B__x__B + 0 0.0 1.0 2.0 0.0 0.0 1.0 + 1 3.0 4.0 5.0 9.0 12.0 16.0 + 2 6.0 7.0 8.0 36.0 42.0 49.0 + + >>> X = pd.DataFrame( ... {'A': [0.0, 3.0, 6.0], 'B': [1.0, 4.0, 7.0], 'C': [2.0, 5.0, 8.0]}) - >>> obj = PolynomialFeatures( - ... columns=['A', 'B', 'C'], degree=2, interaction_only=True) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[ 0., 1., 2., 0., 0., 2.], - [ 3., 4., 5., 12., 15., 20.], - [ 6., 7., 8., 42., 48., 56.]]) - + array([[ 0., 1., 2., 0., 0., 1.], + [ 3., 4., 5., 9., 12., 16.], + [ 6., 7., 8., 36., 42., 49.]]) """ def __init__( @@ -95,24 +79,19 @@ def __init__( columns: List[str], degree=2, interaction_only=False, - dtype: type = np.float64, ): - if not isinstance(columns, list): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") - if not isinstance(degree, int): - raise TypeError("`degree` should be an int.") - if degree < 2: - raise ValueError("`degree` should be at least 2.") + if (not isinstance(degree, int)) or (degree < 1): + raise TypeError("`degree` should be a positive int.") if not isinstance(interaction_only, bool): raise TypeError("`interaction_only` should be a bool.") if interaction_only == True and len(columns) == 1: - raise ValueError( - "Cannot create interaction only terms from single feature." - ) - self.check_datatype(dtype, [np.float32, np.float64]) - + raise ValueError("Cannot create interaction only terms from one column.") + self.interaction_only = interaction_only + self.columns = columns self.degree = degree self.method = ( combinations if interaction_only else combinations_with_replacement @@ -121,94 +100,73 @@ def __init__( map( list, chain.from_iterable( - self.method(columns, self.degree) - for self.degree in range(self.degree + 1) + self.method(columns, e) for e in range(2, self.degree + 1) ), ) ) - self.combinations = [c for c in self.combinations if len(c) >= 2] column_names = [ "__x__".join(map(str, combination)) for combination in self.combinations ] - column_mapping = dict(zip(column_names, map(list, self.combinations))) _BaseFeatureGeneration.__init__( self, columns=columns, column_names=column_names, - column_mapping=column_mapping, - dtype=dtype, ) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "PolynomialFeatures": + def fit(self, X: DataFrame, y: Series = None) -> "PolynomialFeatures": """ Fit the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. y (np.ndarray, optional): labels. Defaults to None. Returns ------- - PolynomialFeatures: Instance of itself. + self : PolynomialFeatures + Instance of itself. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.dtype = X[self.columns].dtypes.unique()[0] - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=self.columns - ) - self.n_rows = X[self.columns].shape[0] - self.n_cols = X[self.columns].shape[1] - self.combinations_np = list( - map( - list, - chain.from_iterable( - self.method(self.idx_columns, self.degree) - for self.degree in range(self.degree + 1) - ), - ) - ) - self.combinations_np = [c for c in self.combinations_np if len(c) >= 2] - for combo in self.combinations_np: - combo.extend([-1 for _ in range(self.degree - len(combo))]) + self.base_columns = list(X.columns) + self.X_dtypes = X.dtypes + if self.degree == 1: + return self + self.idx_subarray = util.get_idx_columns(X.columns, self.columns) + self.combinations_np = [ + list(util.get_idx_columns(self.columns, cols)) for cols in self.combinations + ] + for combi in self.combinations_np: + combi.extend([-1 for _ in range(self.degree - len(combi))]) self.combinations_np = np.array(self.combinations_np) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for combi, name in zip(self.combinations, self.column_names): - X[name] = X[combi].prod(axis=1) - X[self.column_names] = X[self.column_names].astype(self.dtype) + if self.degree == 1: return X + self.check_dataframe(X) for combi, name in zip(self.combinations, self.column_names): - dummy = X[combi[0]] * X["__x__".join(combi[1:])] - X = X.assign(dummy=dummy).rename(columns={"dummy": name}) - X[self.column_names] = X[self.column_names].astype(self.dtype) + X[name] = X[combi[0]] + for c in combi[1:]: + X[name] *= X[c] + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -217,8 +175,15 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return polynomial(X, self.combinations_np, self.degree, self.dtype) + if self.degree == 1: + return X + X_new = polynomial( + X[:, self.idx_subarray].astype(np.float64), + self.combinations_np, + self.degree, + ) + return np.concatenate((X, X_new), axis=1) diff --git a/gators/feature_generation/polynomial_object_features.py b/gators/feature_generation/polynomial_object_features.py new file mode 100644 index 00000000..f902d575 --- /dev/null +++ b/gators/feature_generation/polynomial_object_features.py @@ -0,0 +1,181 @@ +from itertools import chain, combinations +from typing import List + +import numpy as np + +from feature_gen import polynomial_object +from gators.transformers import Transformer + +from ..util import util +from ._base_feature_generation import _BaseFeatureGeneration + +from gators import DataFrame, Series + + +class PolynomialObjectFeatures(Transformer): + """Create new columns based on object columns addition. + + + Parameters + ---------- + theta_vec : List[float] + List of columns. + degree : int, default = 2 + The degree of polynomial. The default of degree of 2 + will produce A * A, B * B, and A * B from features A and B. + + Examples + --------- + + Imports and initialization: + + >>> from gators.feature_generation import PolynomialObjectFeatures + >>> obj = PolynomialObjectFeatures(columns=['A', 'B', 'C'], degree=3) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B C A__x__B A__x__C B__x__C A__x__B__x__C + 0 None z c z c zc zc + 1 b a d ba bd ad bad + 2 c a d ca cd ad cad + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame({'A': [None, 'b', 'c'], 'B': ['z', 'a', 'a'], 'C': ['c', 'd', 'd']}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([[None, 'z', 'c', 'z', 'c', 'zc', 'zc'], + ['b', 'a', 'd', 'ba', 'bd', 'ad', 'bad'], + ['c', 'a', 'd', 'ca', 'cd', 'ad', 'cad']], dtype=object) + """ + + def __init__( + self, + columns: List[str], + degree=2, + ): + self.degree = degree + if not isinstance(columns, (list, np.ndarray)): + raise TypeError("`columns` should be a list.") + if not columns: + raise ValueError("`columns` should not be empty.") + if not isinstance(degree, int): + raise TypeError("`degree` should be an int.") + if degree < 1: + raise ValueError("`degree` should be at least 2.") + self.combinations = list( + map( + list, + chain.from_iterable( + combinations(columns, r=r) for r in range(2, self.degree + 1) + ), + ) + ) + column_names = [ + "__x__".join(map(str, combination)) for combination in self.combinations + ] + _BaseFeatureGeneration.__init__( + self, + columns=columns, + column_names=column_names, + ) + + def fit(self, X: DataFrame, y: Series = None) -> "PolynomialObjectFeatures": + """ + Fit the dataframe X. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y (np.ndarray, optional): labels. Defaults to None. + + Returns + ------- + self : PolynomialObjectFeatures + Instance of itself. + """ + self.check_dataframe(X) + if self.degree == 1: + return self + self.base_columns = list(X.columns) + self.combinations = list( + map( + list, + chain.from_iterable( + combinations(self.columns, r=r) for r in range(2, self.degree + 1) + ), + ) + ) + self.combinations_np = [ + list(util.get_idx_columns(self.base_columns, cols)) + for cols in self.combinations + ] + + for combi in self.combinations_np: + combi.extend([-1 for _ in range(self.degree - len(combi))]) + self.combinations_np = np.array(self.combinations_np) + return self + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + if self.degree == 1: + return X + for combi, name in zip(self.combinations, self.column_names): + X[name] = X[combi[0]].fillna("") + X[name] += X["__x__".join(combi[1:])].fillna("") + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + if self.degree == 1: + return X + return polynomial_object(X, self.combinations_np, self.degree) diff --git a/gators/feature_generation/tests/test_cluster_statistics.py b/gators/feature_generation/tests/test_cluster_statistics.py deleted file mode 100644 index d404b07b..00000000 --- a/gators/feature_generation/tests/test_cluster_statistics.py +++ /dev/null @@ -1,485 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.cluster_statistics import ClusterStatistics - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.arange(9, dtype=float).reshape(3, 3), columns=list("ABC")) - clusters_dict = { - "cluster_name_a": list("AB"), - "cluster_name_b": list("AC"), - "cluster_name_c": list("BC"), - } - obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) - X_expected = pd.DataFrame( - [ - [ - 0.0, - 1.0, - 2.0, - 0.5, - 0.7071067811865476, - 1.0, - 1.4142135623730951, - 1.5, - 0.7071067811865476, - ], - [ - 3.0, - 4.0, - 5.0, - 3.5, - 0.7071067811865476, - 4.0, - 1.4142135623730951, - 4.5, - 0.7071067811865476, - ], - [ - 6.0, - 7.0, - 8.0, - 6.5, - 0.7071067811865476, - 7.0, - 1.4142135623730951, - 7.5, - 0.7071067811865476, - ], - ], - columns=[ - "A", - "B", - "C", - "cluster_name_a__mean", - "cluster_name_a__std", - "cluster_name_b__mean", - "cluster_name_b__std", - "cluster_name_c__mean", - "cluster_name_c__std", - ], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame(np.arange(9, dtype=np.int16).reshape(3, 3), columns=list("ABC")) - - clusters_dict = { - "cluster_name_a": list("AB"), - "cluster_name_b": list("AC"), - "cluster_name_c": list("BC"), - } - obj = ClusterStatistics(clusters_dict=clusters_dict, dtype=np.float32).fit(X) - X_expected = pd.DataFrame( - [ - [ - 0.0, - 1.0, - 2.0, - 0.5, - 0.7071067811865476, - 1.0, - 1.4142135623730951, - 1.5, - 0.7071067811865476, - ], - [ - 3.0, - 4.0, - 5.0, - 3.5, - 0.7071067811865476, - 4.0, - 1.4142135623730951, - 4.5, - 0.7071067811865476, - ], - [ - 6.0, - 7.0, - 8.0, - 6.5, - 0.7071067811865476, - 7.0, - 1.4142135623730951, - 7.5, - 0.7071067811865476, - ], - ], - columns=[ - "A", - "B", - "C", - "cluster_name_a__mean", - "cluster_name_a__std", - "cluster_name_b__mean", - "cluster_name_b__std", - "cluster_name_c__mean", - "cluster_name_c__std", - ], - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame(np.arange(9, dtype=float).reshape(3, 3), columns=list("ABC")) - - clusters_dict = { - "cluster_name_a": list("AB"), - "cluster_name_b": list("AC"), - "cluster_name_c": list("BC"), - } - obj = ClusterStatistics( - clusters_dict=clusters_dict, - column_names=["a_mean", "a_std", "bb_mean", "bb_std", "ccc_mean", "ccc_std"], - ).fit(X) - X_expected = pd.DataFrame( - [ - [ - 0.0, - 1.0, - 2.0, - 0.5, - 0.7071067811865476, - 1.0, - 1.4142135623730951, - 1.5, - 0.7071067811865476, - ], - [ - 3.0, - 4.0, - 5.0, - 3.5, - 0.7071067811865476, - 4.0, - 1.4142135623730951, - 4.5, - 0.7071067811865476, - ], - [ - 6.0, - 7.0, - 8.0, - 6.5, - 0.7071067811865476, - 7.0, - 1.4142135623730951, - 7.5, - 0.7071067811865476, - ], - ], - columns=[ - "A", - "B", - "C", - "a_mean", - "a_std", - "bb_mean", - "bb_std", - "ccc_mean", - "ccc_std", - ], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.arange(9, dtype=float).reshape(3, 3), columns=list("ABC")) - clusters_dict = { - "cluster_name_a": list("AB"), - "cluster_name_b": list("AC"), - "cluster_name_c": list("BC"), - } - obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) - X_expected = pd.DataFrame( - [ - [ - 0.0, - 1.0, - 2.0, - 0.5, - 0.7071067811865476, - 1.0, - 1.4142135623730951, - 1.5, - 0.7071067811865476, - ], - [ - 3.0, - 4.0, - 5.0, - 3.5, - 0.7071067811865476, - 4.0, - 1.4142135623730951, - 4.5, - 0.7071067811865476, - ], - [ - 6.0, - 7.0, - 8.0, - 6.5, - 0.7071067811865476, - 7.0, - 1.4142135623730951, - 7.5, - 0.7071067811865476, - ], - ], - columns=[ - "A", - "B", - "C", - "cluster_name_a__mean", - "cluster_name_a__std", - "cluster_name_b__mean", - "cluster_name_b__std", - "cluster_name_c__mean", - "cluster_name_c__std", - ], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame(np.arange(9, dtype=np.int16).reshape(3, 3), columns=list("ABC")) - clusters_dict = { - "cluster_name_a": list("AB"), - "cluster_name_b": list("AC"), - "cluster_name_c": list("BC"), - } - obj = ClusterStatistics(clusters_dict=clusters_dict, dtype=np.float32).fit(X) - X_expected = pd.DataFrame( - [ - [ - 0.0, - 1.0, - 2.0, - 0.5, - 0.7071067811865476, - 1.0, - 1.4142135623730951, - 1.5, - 0.7071067811865476, - ], - [ - 3.0, - 4.0, - 5.0, - 3.5, - 0.7071067811865476, - 4.0, - 1.4142135623730951, - 4.5, - 0.7071067811865476, - ], - [ - 6.0, - 7.0, - 8.0, - 6.5, - 0.7071067811865476, - 7.0, - 1.4142135623730951, - 7.5, - 0.7071067811865476, - ], - ], - columns=[ - "A", - "B", - "C", - "cluster_name_a__mean", - "cluster_name_a__std", - "cluster_name_b__mean", - "cluster_name_b__std", - "cluster_name_c__mean", - "cluster_name_c__std", - ], - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame(np.arange(9, dtype=float).reshape(3, 3), columns=list("ABC")) - clusters_dict = { - "cluster_name_a": list("AB"), - "cluster_name_b": list("AC"), - "cluster_name_c": list("BC"), - } - obj = ClusterStatistics( - clusters_dict=clusters_dict, - column_names=["a_mean", "a_std", "bb_mean", "bb_std", "ccc_mean", "ccc_std"], - ).fit(X) - X_expected = pd.DataFrame( - [ - [ - 0.0, - 1.0, - 2.0, - 0.5, - 0.7071067811865476, - 1.0, - 1.4142135623730951, - 1.5, - 0.7071067811865476, - ], - [ - 3.0, - 4.0, - 5.0, - 3.5, - 0.7071067811865476, - 4.0, - 1.4142135623730951, - 4.5, - 0.7071067811865476, - ], - [ - 6.0, - 7.0, - 8.0, - 6.5, - 0.7071067811865476, - 7.0, - 1.4142135623730951, - 7.5, - 0.7071067811865476, - ], - ], - columns=[ - "A", - "B", - "C", - "a_mean", - "a_std", - "bb_mean", - "bb_std", - "ccc_mean", - "ccc_std", - ], - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_names_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_names_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = ClusterStatistics(clusters_dict=0) - with pytest.raises(ValueError): - _ = ClusterStatistics(clusters_dict={"a": []}) - with pytest.raises(TypeError): - _ = ClusterStatistics(clusters_dict={"a": "x"}) - with pytest.raises(TypeError): - _ = ClusterStatistics(clusters_dict={"a": ["x", "y"]}, column_names=0) - with pytest.raises(ValueError): - _ = ClusterStatistics(clusters_dict={"a": ["x", "y"]}, column_names=["aa"]) - with pytest.raises(ValueError): - _ = ClusterStatistics(clusters_dict={"a": ["x", "y"], "b": ["x", "y", "z"]}) - with pytest.raises(ValueError): - _ = ClusterStatistics(clusters_dict={"a": ["x"], "b": ["y"]}) diff --git a/gators/feature_generation/tests/test_cluster_statistics_dd.py b/gators/feature_generation/tests/test_cluster_statistics_dd.py new file mode 100644 index 00000000..bb314e88 --- /dev/null +++ b/gators/feature_generation/tests/test_cluster_statistics_dd.py @@ -0,0 +1,177 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.cluster_statistics import ClusterStatistics + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + {"A": [0.0, 3.0, 6.0], "B": [1.0, 4.0, 7.0], "C": [2.0, 5.0, 8.0]} + ), + npartitions=1, + ) + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "cluster_name_a__mean": [0.5, 3.5, 6.5], + "cluster_name_a__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + "cluster_name_b__mean": [1.0, 4.0, 7.0], + "cluster_name_b__std": [ + 1.4142135623730951, + 1.4142135623730951, + 1.4142135623730951, + ], + "cluster_name_c__mean": [1.5, 4.5, 7.5], + "cluster_name_c__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_object(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ), + npartitions=1, + ) + + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "cluster_name_a__mean": [0.5, 3.5, 6.5], + "cluster_name_a__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + "cluster_name_b__mean": [1.0, 4.0, 7.0], + "cluster_name_b__std": [ + 1.4142135623730951, + 1.4142135623730951, + 1.4142135623730951, + ], + "cluster_name_c__mean": [1.5, 4.5, 7.5], + "cluster_name_c__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + } + ) + + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = dd.from_pandas( + pd.DataFrame( + {"A": [0.0, 3.0, 6.0], "B": [1.0, 4.0, 7.0], "C": [2.0, 5.0, 8.0]} + ), + npartitions=1, + ) + + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics( + clusters_dict=clusters_dict, + column_names=["a_mean", "a_std", "bb_mean", "bb_std", "ccc_mean", "ccc_std"], + ).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "a_mean": [0.5, 3.5, 6.5], + "a_std": [0.7071067811865476, 0.7071067811865476, 0.7071067811865476], + "bb_mean": [1.0, 4.0, 7.0], + "bb_std": [1.4142135623730951, 1.4142135623730951, 1.4142135623730951], + "ccc_mean": [1.5, 4.5, 7.5], + "ccc_std": [0.7071067811865476, 0.7071067811865476, 0.7071067811865476], + } + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_object_dd(data_object): + obj, X, X_expected = data_object + X_new = obj.transform(X).compute() + X_new["D"] = X_new["D"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_object_dd_np(data_object): + obj, X, X_expected = data_object + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_dd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_names_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_cluster_statistics_ks.py b/gators/feature_generation/tests/test_cluster_statistics_ks.py new file mode 100644 index 00000000..537d9b2b --- /dev/null +++ b/gators/feature_generation/tests/test_cluster_statistics_ks.py @@ -0,0 +1,169 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.cluster_statistics import ClusterStatistics + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame({"A": [0.0, 3.0, 6.0], "B": [1.0, 4.0, 7.0], "C": [2.0, 5.0, 8.0]}) + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "cluster_name_a__mean": [0.5, 3.5, 6.5], + "cluster_name_a__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + "cluster_name_b__mean": [1.0, 4.0, 7.0], + "cluster_name_b__std": [ + 1.4142135623730951, + 1.4142135623730951, + 1.4142135623730951, + ], + "cluster_name_c__mean": [1.5, 4.5, 7.5], + "cluster_name_c__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_object_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ) + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "cluster_name_a__mean": [0.5, 3.5, 6.5], + "cluster_name_a__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + "cluster_name_b__mean": [1.0, 4.0, 7.0], + "cluster_name_b__std": [ + 1.4142135623730951, + 1.4142135623730951, + 1.4142135623730951, + ], + "cluster_name_c__mean": [1.5, 4.5, 7.5], + "cluster_name_c__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + } + ) + + return obj, X, X_expected + + +@pytest.fixture +def data_names_ks(): + X = ps.DataFrame({"A": [0.0, 3.0, 6.0], "B": [1.0, 4.0, 7.0], "C": [2.0, 5.0, 8.0]}) + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics( + clusters_dict=clusters_dict, + column_names=["a_mean", "a_std", "bb_mean", "bb_std", "ccc_mean", "ccc_std"], + ).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "a_mean": [0.5, 3.5, 6.5], + "a_std": [0.7071067811865476, 0.7071067811865476, 0.7071067811865476], + "bb_mean": [1.0, 4.0, 7.0], + "bb_std": [1.4142135623730951, 1.4142135623730951, 1.4142135623730951], + "ccc_mean": [1.5, 4.5, 7.5], + "ccc_std": [0.7071067811865476, 0.7071067811865476, 0.7071067811865476], + } + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_object_ks(data_object_ks): + obj, X, X_expected = data_object_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_object_ks_np(data_object_ks): + obj, X, X_expected = data_object_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_names_ks(data_names_ks): + obj, X, X_expected = data_names_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_names_np(data_names_ks): + obj, X, X_expected = data_names_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_cluster_statistics_pd.py b/gators/feature_generation/tests/test_cluster_statistics_pd.py new file mode 100644 index 00000000..06e5e627 --- /dev/null +++ b/gators/feature_generation/tests/test_cluster_statistics_pd.py @@ -0,0 +1,178 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.cluster_statistics import ClusterStatistics + + +@pytest.fixture +def data(): + X = pd.DataFrame({"A": [0.0, 3.0, 6.0], "B": [1.0, 4.0, 7.0], "C": [2.0, 5.0, 8.0]}) + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "cluster_name_a__mean": [0.5, 3.5, 6.5], + "cluster_name_a__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + "cluster_name_b__mean": [1.0, 4.0, 7.0], + "cluster_name_b__std": [ + 1.4142135623730951, + 1.4142135623730951, + 1.4142135623730951, + ], + "cluster_name_c__mean": [1.5, 4.5, 7.5], + "cluster_name_c__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_object(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ) + + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics(clusters_dict=clusters_dict).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "cluster_name_a__mean": [0.5, 3.5, 6.5], + "cluster_name_a__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + "cluster_name_b__mean": [1.0, 4.0, 7.0], + "cluster_name_b__std": [ + 1.4142135623730951, + 1.4142135623730951, + 1.4142135623730951, + ], + "cluster_name_c__mean": [1.5, 4.5, 7.5], + "cluster_name_c__std": [ + 0.7071067811865476, + 0.7071067811865476, + 0.7071067811865476, + ], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = pd.DataFrame({"A": [0.0, 3.0, 6.0], "B": [1.0, 4.0, 7.0], "C": [2.0, 5.0, 8.0]}) + + clusters_dict = { + "cluster_name_a": list("AB"), + "cluster_name_b": list("AC"), + "cluster_name_c": list("BC"), + } + obj = ClusterStatistics( + clusters_dict=clusters_dict, + column_names=["a_mean", "a_std", "bb_mean", "bb_std", "ccc_mean", "ccc_std"], + ).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "a_mean": [0.5, 3.5, 6.5], + "a_std": [0.7071067811865476, 0.7071067811865476, 0.7071067811865476], + "bb_mean": [1.0, 4.0, 7.0], + "bb_std": [1.4142135623730951, 1.4142135623730951, 1.4142135623730951], + "ccc_mean": [1.5, 4.5, 7.5], + "ccc_std": [0.7071067811865476, 0.7071067811865476, 0.7071067811865476], + } + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_object_pd(data_object): + obj, X, X_expected = data_object + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_object_pd_np(data_object): + obj, X, X_expected = data_object + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_names_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = ClusterStatistics(clusters_dict=0) + with pytest.raises(ValueError): + _ = ClusterStatistics(clusters_dict={"a": []}) + with pytest.raises(TypeError): + _ = ClusterStatistics(clusters_dict={"a": "x"}) + with pytest.raises(TypeError): + _ = ClusterStatistics(clusters_dict={"a": ["x", "y"]}, column_names=0) + with pytest.raises(ValueError): + _ = ClusterStatistics(clusters_dict={"a": ["x", "y"]}, column_names=["aa"]) + with pytest.raises(ValueError): + _ = ClusterStatistics(clusters_dict={"a": ["x", "y"], "b": ["x", "y", "z"]}) + with pytest.raises(ValueError): + _ = ClusterStatistics(clusters_dict={"a": ["x"], "b": ["y"]}) diff --git a/gators/feature_generation/tests/test_elementary_arithmetics.py b/gators/feature_generation/tests/test_elementary_arithmetics.py deleted file mode 100644 index ed6a4750..00000000 --- a/gators/feature_generation/tests/test_elementary_arithmetics.py +++ /dev/null @@ -1,411 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.elementary_arithmethics import ElementaryArithmetics - - -@pytest.fixture -def data_add(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, -2.0, -4.0], - [3.0, 4.0, 5.0, -5.0, -7.0], - [6.0, 7.0, 8.0, -8.0, -10.0], - ] - ), - columns=["A", "B", "C", "A__-__B", "A__-__C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), columns_b=list("BC"), coef=-2.0, operator="+" - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_add(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, -2.0, -4.0], - [3.0, 4.0, 5.0, -5.0, -7.0], - [6.0, 7.0, 8.0, -8.0, -10.0], - ] - ), - columns=["A", "B", "C", "A__-__B", "A__-__C"], - ).astype(np.float32) - obj = ElementaryArithmetics( - columns_a=list("AA"), - columns_b=list("BC"), - coef=-2.0, - operator="+", - dtype=np.float32, - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_name_add(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, -2.0, -4.0], - [3.0, 4.0, 5.0, -5.0, -7.0], - [6.0, 7.0, 8.0, -8.0, -10.0], - ] - ), - columns=["A", "B", "C", "A+B", "A+C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), - columns_b=list("BC"), - coef=-2.0, - operator="+", - column_names=["A+B", "A+C"], - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_mult(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0], - [3.0, 4.0, 5.0, 12.0, 15.0], - [6.0, 7.0, 8.0, 42.0, 48.0], - ] - ), - columns=["A", "B", "C", "A__*__B", "A__*__C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), columns_b=list("BC"), operator="*" - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_div(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0], - [3.0, 4.0, 5.0, 0.75, 0.59999988], - [6.0, 7.0, 8.0, 0.85714286, 0.7499999], - ] - ), - columns=["A", "B", "C", "A__/__B", "A__/__C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), columns_b=list("BC"), operator="/" - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_add_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, -2.0, -4.0], - [3.0, 4.0, 5.0, -5.0, -7.0], - [6.0, 7.0, 8.0, -8.0, -10.0], - ] - ), - columns=["A", "B", "C", "A__-__B", "A__-__C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), columns_b=list("BC"), coef=-2.0, operator="+" - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_add_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, -2.0, -4.0], - [3.0, 4.0, 5.0, -5.0, -7.0], - [6.0, 7.0, 8.0, -8.0, -10.0], - ] - ), - columns=["A", "B", "C", "A__-__B", "A__-__C"], - ).astype(np.float32) - obj = ElementaryArithmetics( - columns_a=list("AA"), - columns_b=list("BC"), - coef=-2.0, - operator="+", - dtype=np.float32, - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_name_add_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, -2.0, -4.0], - [3.0, 4.0, 5.0, -5.0, -7.0], - [6.0, 7.0, 8.0, -8.0, -10.0], - ] - ), - columns=["A", "B", "C", "A+B", "A+C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), - columns_b=list("BC"), - coef=-2.0, - operator="+", - column_names=["A+B", "A+C"], - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_mult_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0], - [3.0, 4.0, 5.0, 12.0, 15.0], - [6.0, 7.0, 8.0, 42.0, 48.0], - ] - ), - columns=["A", "B", "C", "A__*__B", "A__*__C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), columns_b=list("BC"), operator="*" - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_div_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0], - [3.0, 4.0, 5.0, 0.75, 0.59999988], - [6.0, 7.0, 8.0, 0.85714286, 0.7499999], - ] - ), - columns=["A", "B", "C", "A__/__B", "A__/__C"], - ) - obj = ElementaryArithmetics( - columns_a=list("AA"), columns_b=list("BC"), operator="/" - ).fit(X) - return obj, X, X_expected - - -def test_add_pd(data_add): - obj, X, X_expected = data_add - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_add_ks(data_add_ks): - obj, X, X_expected = data_add_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_add_pd_np(data_add): - obj, X, X_expected = data_add - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_add_ks_np(data_add_ks): - obj, X, X_expected = data_add_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_float32_add_pd(data_float32_add): - obj, X, X_expected = data_float32_add - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_add_ks_ks(data_float32_add_ks): - obj, X, X_expected = data_float32_add_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_add_pd_np(data_float32_add): - obj, X, X_expected = data_float32_add - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_add_ks_np_ks(data_float32_add_ks): - obj, X, X_expected = data_float32_add_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_mult_pd(data_mult): - obj, X, X_expected = data_mult - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_mult_ks(data_mult_ks): - obj, X, X_expected = data_mult_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_mult_pd_np(data_mult): - obj, X, X_expected = data_mult - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_mult_ks_np(data_mult_ks): - obj, X, X_expected = data_mult_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_div_pd(data_div): - obj, X, X_expected = data_div - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_div_ks(data_div_ks): - obj, X, X_expected = data_div_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_div_pd_np(data_div): - obj, X, X_expected = data_div - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_div_ks_np(data_div_ks): - obj, X, X_expected = data_div_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_name_add_pd(data_name_add): - obj, X, X_expected = data_name_add - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_name_add_ks_ks(data_name_add_ks): - obj, X, X_expected = data_name_add_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_name_add_pd_np(data_name_add): - obj, X, X_expected = data_name_add - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_name_add_ks_np_ks(data_name_add_ks): - obj, X, X_expected = data_name_add_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a="A", columns_b=["A"], operator="+", column_names=["2A"] - ) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=["A"], columns_b="A", operator="+", column_names=["2A"] - ) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=["A"], columns_b=["A"], operator=0, column_names=["2A"] - ) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=["A"], columns_b=["A"], operator="z", column_names=["2A"] - ) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=["A", "B"], columns_b=["A"], operator="+", column_names=["2A"] - ) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=[], columns_b=["A"], operator="+", column_names=["2A"] - ) - with pytest.raises(ValueError): - _ = ElementaryArithmetics( - columns_a=["A"], columns_b=["A"], operator="+", column_names=["2A", "2A"] - ) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=["A"], columns_b=["A"], operator="+", coef="x" - ) - with pytest.raises(TypeError): - _ = ElementaryArithmetics( - columns_a=["A"], columns_b=["A"], operator="+", column_names="x" - ) diff --git a/gators/feature_generation/tests/test_elementary_arithmetics_dd.py b/gators/feature_generation/tests/test_elementary_arithmetics_dd.py new file mode 100644 index 00000000..e4734f2c --- /dev/null +++ b/gators/feature_generation/tests/test_elementary_arithmetics_dd.py @@ -0,0 +1,223 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.elementary_arithmethics import ElementaryArithmetics + + +@pytest.fixture +def data_add(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A-2xB": [-2.0, -5.0, -8.0], + "A-2xC": [-4.0, -7.0, -10.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), coef=-2.0, operator="+" + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_object_add(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "A-2xB": [-2.0, -5.0, -8.0], + "A-2xC": [-4.0, -7.0, -10.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), + columns_b=list("BC"), + coef=-2.0, + operator="+", + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_name_add(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "Aplus2B": [2.0, 11.0, 20.0], + "Aplus2C": [4.0, 13.0, 22.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), + columns_b=list("BC"), + coef=2.0, + operator="+", + column_names=["Aplus2B", "Aplus2C"], + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_mult(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A*B": [0.0, 12.0, 42.0], + "A*C": [0.0, 15.0, 48.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), operator="*" + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_div(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A/B": [0.0, 0.75, 0.85714286], + "A/C": [0.0, 0.59999988, 0.7499999], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), operator="/" + ).fit(X) + return obj, X, X_expected + + +def test_add_dd(data_add): + obj, X, X_expected = data_add + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_add_dd_np(data_add): + obj, X, X_expected = data_add + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_object_add_dd(data_object_add): + obj, X, X_expected = data_object_add + X_new = obj.transform(X).compute() + X_new["D"] = X_new["D"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_object_add_dd_np(data_object_add): + obj, X, X_expected = data_object_add + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_mult_dd(data_mult): + obj, X, X_expected = data_mult + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_mult_dd_np(data_mult): + obj, X, X_expected = data_mult + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_div_dd(data_div): + obj, X, X_expected = data_div + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_div_dd_np(data_div): + obj, X, X_expected = data_div + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_name_add_dd(data_name_add): + obj, X, X_expected = data_name_add + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_name_add_dd_np(data_name_add): + obj, X, X_expected = data_name_add + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_elementary_arithmetics_ks.py b/gators/feature_generation/tests/test_elementary_arithmetics_ks.py new file mode 100644 index 00000000..1bc37047 --- /dev/null +++ b/gators/feature_generation/tests/test_elementary_arithmetics_ks.py @@ -0,0 +1,216 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.elementary_arithmethics import ElementaryArithmetics + + +@pytest.fixture +def data_add_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A-2xB": [-2.0, -5.0, -8.0], + "A-2xC": [-4.0, -7.0, -10.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), coef=-2.0, operator="+" + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_object_add_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "A-2xB": [-2.0, -5.0, -8.0], + "A-2xC": [-4.0, -7.0, -10.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), + columns_b=list("BC"), + coef=-2.0, + operator="+", + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_name_add_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "Aplus2B": [2.0, 11.0, 20.0], + "Aplus2C": [4.0, 13.0, 22.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), + columns_b=list("BC"), + coef=2.0, + operator="+", + column_names=["Aplus2B", "Aplus2C"], + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_mult_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A*B": [0.0, 12.0, 42.0], + "A*C": [0.0, 15.0, 48.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), operator="*" + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_div_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A/B": [0.0, 0.75, 0.85714286], + "A/C": [0.0, 0.59999988, 0.7499999], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), operator="/" + ).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_add_ks(data_add_ks): + obj, X, X_expected = data_add_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_add_ks_np(data_add_ks): + obj, X, X_expected = data_add_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_object_add_ks_ks(data_object_add_ks): + obj, X, X_expected = data_object_add_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_object_add_ks_np_ks(data_object_add_ks): + obj, X, X_expected = data_object_add_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_mult_ks(data_mult_ks): + obj, X, X_expected = data_mult_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_mult_ks_np(data_mult_ks): + obj, X, X_expected = data_mult_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_div_ks(data_div_ks): + obj, X, X_expected = data_div_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_div_ks_np(data_div_ks): + obj, X, X_expected = data_div_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_name_add_ks_ks(data_name_add_ks): + obj, X, X_expected = data_name_add_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_name_add_ks_np_ks(data_name_add_ks): + obj, X, X_expected = data_name_add_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_elementary_arithmetics_pd.py b/gators/feature_generation/tests/test_elementary_arithmetics_pd.py new file mode 100644 index 00000000..90776369 --- /dev/null +++ b/gators/feature_generation/tests/test_elementary_arithmetics_pd.py @@ -0,0 +1,250 @@ +# License: Apache-2.0 +import pytest +import pandas as pd +from pandas.testing import assert_frame_equal + +from gators.feature_generation.elementary_arithmethics import ElementaryArithmetics + + +@pytest.fixture +def data_add(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A-2xB": [-2.0, -5.0, -8.0], + "A-2xC": [-4.0, -7.0, -10.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), coef=-2.0, operator="+" + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_object_add(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "A-2xB": [-2.0, -5.0, -8.0], + "A-2xC": [-4.0, -7.0, -10.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), + columns_b=list("BC"), + coef=-2.0, + operator="+", + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_name_add(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "Aplus2B": [2.0, 11.0, 20.0], + "Aplus2C": [4.0, 13.0, 22.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), + columns_b=list("BC"), + coef=2.0, + operator="+", + column_names=["Aplus2B", "Aplus2C"], + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_mult(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A*B": [0.0, 12.0, 42.0], + "A*C": [0.0, 15.0, 48.0], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), operator="*" + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_div(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "A/B": [0.0, 0.75, 0.85714286], + "A/C": [0.0, 0.59999988, 0.7499999], + } + ) + obj = ElementaryArithmetics( + columns_a=list("AA"), columns_b=list("BC"), operator="/" + ).fit(X) + return obj, X, X_expected + + +def test_add_pd(data_add): + obj, X, X_expected = data_add + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_add_pd_np(data_add): + obj, X, X_expected = data_add + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_object_add_pd(data_object_add): + obj, X, X_expected = data_object_add + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_object_add_pd_np(data_object_add): + obj, X, X_expected = data_object_add + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_mult_pd(data_mult): + obj, X, X_expected = data_mult + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_mult_pd_np(data_mult): + obj, X, X_expected = data_mult + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_div_pd(data_div): + obj, X, X_expected = data_div + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_div_pd_np(data_div): + obj, X, X_expected = data_div + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_name_add_pd(data_name_add): + obj, X, X_expected = data_name_add + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_name_add_pd_np(data_name_add): + obj, X, X_expected = data_name_add + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_operator_str(): + assert ElementaryArithmetics.get_str_operator("+", coef=1) == "+" + assert ElementaryArithmetics.get_str_operator("*", coef=2) == "*" + assert ElementaryArithmetics.get_str_operator("+", coef=2.0) == "+2x" + + +def test_init(): + with pytest.raises(TypeError): + _ = ElementaryArithmetics( + columns_a="A", columns_b=["A"], operator="+", column_names=["2A"] + ) + with pytest.raises(TypeError): + _ = ElementaryArithmetics( + columns_a=["A"], columns_b="A", operator="+", column_names=["2A"] + ) + with pytest.raises(TypeError): + _ = ElementaryArithmetics( + columns_a=["A"], columns_b=["A"], operator=0, column_names=["2A"] + ) + with pytest.raises(ValueError): + _ = ElementaryArithmetics( + columns_a=["A"], columns_b=["A"], operator="z", column_names=["2A"] + ) + with pytest.raises(ValueError): + _ = ElementaryArithmetics( + columns_a=["A", "B"], columns_b=["A"], operator="+", column_names=["2A"] + ) + with pytest.raises(ValueError): + _ = ElementaryArithmetics( + columns_a=[], columns_b=["A"], operator="+", column_names=["2A"] + ) + with pytest.raises(ValueError): + _ = ElementaryArithmetics( + columns_a=["A"], columns_b=["A"], operator="+", column_names=["2A", "2A"] + ) + with pytest.raises(TypeError): + _ = ElementaryArithmetics( + columns_a=["A"], columns_b=["A"], operator="+", coef="x" + ) + with pytest.raises(TypeError): + _ = ElementaryArithmetics( + columns_a=["A"], columns_b=["A"], operator="+", column_names="x" + ) diff --git a/gators/feature_generation/tests/test_is_equal.py b/gators/feature_generation/tests/test_is_equal.py deleted file mode 100644 index 2cbeab9c..00000000 --- a/gators/feature_generation/tests/test_is_equal.py +++ /dev/null @@ -1,310 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.is_equal import IsEqual - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} - ) - - X_expected = pd.DataFrame( - { - "A": [99.0, 1.0, 2.0], - "B": [99.0, 4.0, 5.0], - "C": [99.0, 7.0, 8.0], - "A__is__B": [1.0, 0.0, 0.0], - "A__is__C": [1.0, 0.0, 0.0], - } - ) - obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16(): - X = pd.DataFrame( - {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} - ).astype(np.int16) - - X_expected = pd.DataFrame( - { - "A": [99.0, 1.0, 2.0], - "B": [99.0, 4.0, 5.0], - "C": [99.0, 7.0, 8.0], - "A__is__B": [1.0, 0.0, 0.0], - "A__is__C": [1.0, 0.0, 0.0], - } - ).astype(np.int16) - obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj(): - X = pd.DataFrame( - { - "A": ["a", "b", "c"], - "B": ["a", "f", "e"], - "C": ["a", "p", "d"], - "D": [1, 2, 3], - } - ) - - X_expected = pd.DataFrame( - { - "A": ["a", "b", "c"], - "B": ["a", "f", "e"], - "C": ["a", "p", "d"], - "D": [1, 2, 3], - "A__is__B": [1.0, 0.0, 0.0], - "A__is__C": [1.0, 0.0, 0.0], - } - ) - obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame( - {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} - ) - - X_expected = pd.DataFrame( - { - "A": [99.0, 1.0, 2.0], - "B": [99.0, 4.0, 5.0], - "C": [99.0, 7.0, 8.0], - "A==B": [1.0, 0.0, 0.0], - "A==C": [1.0, 0.0, 0.0], - } - ) - obj = IsEqual( - columns_a=list("AA"), columns_b=list("BC"), column_names=["A==B", "A==C"] - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} - ) - X_expected = pd.DataFrame( - { - "A": [99.0, 1.0, 2.0], - "B": [99.0, 4.0, 5.0], - "C": [99.0, 7.0, 8.0], - "A__is__B": [1.0, 0.0, 0.0], - "A__is__C": [1.0, 0.0, 0.0], - } - ) - obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_ks(): - X = ks.DataFrame( - {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} - ).astype(np.int16) - X_expected = pd.DataFrame( - { - "A": [99.0, 1.0, 2.0], - "B": [99.0, 4.0, 5.0], - "C": [99.0, 7.0, 8.0], - "A__is__B": [1.0, 0.0, 0.0], - "A__is__C": [1.0, 0.0, 0.0], - } - ).astype(np.int16) - obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj_ks(): - X = ks.DataFrame( - { - "A": ["a", "b", "c"], - "B": ["a", "f", "e"], - "C": ["a", "p", "d"], - "D": [1, 2, 3], - } - ) - X_expected = pd.DataFrame( - { - "A": ["a", "b", "c"], - "B": ["a", "f", "e"], - "C": ["a", "p", "d"], - "D": [1, 2, 3], - "A__is__B": [1.0, 0.0, 0.0], - "A__is__C": [1.0, 0.0, 0.0], - } - ) - obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame( - {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} - ) - - X_expected = pd.DataFrame( - { - "A": [99.0, 1.0, 2.0], - "B": [99.0, 4.0, 5.0], - "C": [99.0, 7.0, 8.0], - "A==B": [1.0, 0.0, 0.0], - "A==C": [1.0, 0.0, 0.0], - } - ) - obj = IsEqual( - columns_a=list("AA"), columns_b=list("BC"), column_names=["A==B", "A==C"] - ).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -def test_int16_pd(data_int16): - obj, X, X_expected = data_int16 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_pd_np(data_int16): - obj, X, X_expected = data_int16 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_ks_np(data_int16_ks): - obj, X, X_expected = data_int16_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_obj(data_obj): - obj, X, X_expected = data_obj - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_obj_ks(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_obj_np(data_obj): - obj, X, X_expected = data_obj - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_obj_ks_np(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_names_pd_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) - assert_frame_equal(X_new, X_expected) - - -def test_input(): - with pytest.raises(TypeError): - _ = IsEqual(columns_a=0, columns_b=["B"]) - with pytest.raises(TypeError): - _ = IsEqual(columns_a=["A"], columns_b=0) - with pytest.raises(TypeError): - _ = IsEqual(columns_a=["A"], columns_b=["B"], column_names=0) - with pytest.raises(ValueError): - _ = IsEqual(columns_a=["A"], columns_b=["B", "C"]) - with pytest.raises(ValueError): - _ = IsEqual(columns_a=["A"], columns_b=["B"], column_names=["x", "y"]) - with pytest.raises(ValueError): - _ = IsEqual(columns_a=[], columns_b=[]) diff --git a/gators/feature_generation/tests/test_is_equal_dd.py b/gators/feature_generation/tests/test_is_equal_dd.py new file mode 100644 index 00000000..5e905d7a --- /dev/null +++ b/gators/feature_generation/tests/test_is_equal_dd.py @@ -0,0 +1,122 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.is_equal import IsEqual + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [99.0, 1.0, 2.0], + "B": [99.0, 4.0, 5.0], + "C": [99.0, 7.0, 8.0], + "A__is__B": [1.0, 0.0, 0.0], + "A__is__C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["a", "b", "c"], + "B": ["a", "f", "e"], + "C": ["a", "p", "d"], + "D": [1.0, 2.0, 3.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["a", "b", "c"], + "B": ["a", "f", "e"], + "C": ["a", "p", "d"], + "D": [1.0, 2.0, 3.0], + "A__is__B": [1.0, 0.0, 0.0], + "A__is__C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = dd.from_pandas( + pd.DataFrame( + {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [99.0, 1.0, 2.0], + "B": [99.0, 4.0, 5.0], + "C": [99.0, 7.0, 8.0], + "A==B": [1.0, 0.0, 0.0], + "A==C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual( + columns_a=list("AA"), columns_b=list("BC"), column_names=["A==B", "A==C"] + ).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) + + +def test_obj(data_obj): + obj, X, X_expected = data_obj + X_new = obj.transform(X).compute() + X_new[list("ABC")] = X_new[list("ABC")].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_obj_np(data_obj): + obj, X, X_expected = data_obj + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_dd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_names_dd_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_is_equal_ks.py b/gators/feature_generation/tests/test_is_equal_ks.py new file mode 100644 index 00000000..32b7993b --- /dev/null +++ b/gators/feature_generation/tests/test_is_equal_ks.py @@ -0,0 +1,120 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.is_equal import IsEqual + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} + ) + X_expected = pd.DataFrame( + { + "A": [99.0, 1.0, 2.0], + "B": [99.0, 4.0, 5.0], + "C": [99.0, 7.0, 8.0], + "A__is__B": [1.0, 0.0, 0.0], + "A__is__C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj_ks(): + X = ps.DataFrame( + { + "A": ["a", "b", "c"], + "B": ["a", "f", "e"], + "C": ["a", "p", "d"], + "D": [1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": ["a", "b", "c"], + "B": ["a", "f", "e"], + "C": ["a", "p", "d"], + "D": [1, 2, 3], + "A__is__B": [1.0, 0.0, 0.0], + "A__is__C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names_ks(): + X = ps.DataFrame( + {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} + ) + X_expected = pd.DataFrame( + { + "A": [99.0, 1.0, 2.0], + "B": [99.0, 4.0, 5.0], + "C": [99.0, 7.0, 8.0], + "A==B": [1.0, 0.0, 0.0], + "A==C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual( + columns_a=list("AA"), columns_b=list("BC"), column_names=["A==B", "A==C"] + ).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_obj_ks(data_obj_ks): + obj, X, X_expected = data_obj_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_obj_ks_np(data_obj_ks): + obj, X, X_expected = data_obj_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_names_ks(data_names_ks): + obj, X, X_expected = data_names_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_names_ks_np(data_names_ks): + obj, X, X_expected = data_names_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_is_equal_pd.py b/gators/feature_generation/tests/test_is_equal_pd.py new file mode 100644 index 00000000..cc4e2b56 --- /dev/null +++ b/gators/feature_generation/tests/test_is_equal_pd.py @@ -0,0 +1,126 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.is_equal import IsEqual + + +@pytest.fixture +def data(): + X = pd.DataFrame( + {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} + ) + X_expected = pd.DataFrame( + { + "A": [99.0, 1.0, 2.0], + "B": [99.0, 4.0, 5.0], + "C": [99.0, 7.0, 8.0], + "A__is__B": [1.0, 0.0, 0.0], + "A__is__C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj(): + X = pd.DataFrame( + { + "A": ["a", "b", "c"], + "B": ["a", "f", "e"], + "C": ["a", "p", "d"], + "D": [1, 2, 3], + } + ) + X_expected = pd.DataFrame( + { + "A": ["a", "b", "c"], + "B": ["a", "f", "e"], + "C": ["a", "p", "d"], + "D": [1, 2, 3], + "A__is__B": [1.0, 0.0, 0.0], + "A__is__C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual(columns_a=list("AA"), columns_b=list("BC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = pd.DataFrame( + {"A": [99.0, 1.0, 2.0], "B": [99.0, 4.0, 5.0], "C": [99.0, 7.0, 8.0]} + ) + X_expected = pd.DataFrame( + { + "A": [99.0, 1.0, 2.0], + "B": [99.0, 4.0, 5.0], + "C": [99.0, 7.0, 8.0], + "A==B": [1.0, 0.0, 0.0], + "A==C": [1.0, 0.0, 0.0], + } + ) + obj = IsEqual( + columns_a=list("AA"), columns_b=list("BC"), column_names=["A==B", "A==C"] + ).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) + + +def test_obj(data_obj): + obj, X, X_expected = data_obj + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_obj_np(data_obj): + obj, X, X_expected = data_obj + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values.astype(np.float64)) + assert_frame_equal(X_new, X_expected) + + +def test_input(): + with pytest.raises(TypeError): + _ = IsEqual(columns_a=0, columns_b=["B"]) + with pytest.raises(TypeError): + _ = IsEqual(columns_a=["A"], columns_b=0) + with pytest.raises(TypeError): + _ = IsEqual(columns_a=["A"], columns_b=["B"], column_names=0) + with pytest.raises(ValueError): + _ = IsEqual(columns_a=["A"], columns_b=["B", "C"]) + with pytest.raises(ValueError): + _ = IsEqual(columns_a=["A"], columns_b=["B"], column_names=["x", "y"]) + with pytest.raises(ValueError): + _ = IsEqual(columns_a=[], columns_b=[]) diff --git a/gators/feature_generation/tests/test_is_null.py b/gators/feature_generation/tests/test_is_null.py deleted file mode 100644 index 68015a53..00000000 --- a/gators/feature_generation/tests/test_is_null.py +++ /dev/null @@ -1,305 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.is_null import IsNull - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data_num(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - X.iloc[0, :] = np.nan - - X_expected = pd.DataFrame( - [ - [np.nan, np.nan, np.nan, 1.0, 1.0, 1.0], - [3.0, 4.0, 5.0, 0.0, 0.0, 0.0], - [6.0, 7.0, 8.0, 0.0, 0.0, 0.0], - ], - columns=["A", "B", "C", "A__is_null", "B__is_null", "C__is_null"], - ) - obj = IsNull(columns=list("ABC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_num(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")).astype(np.float32) - X.iloc[0, :] = np.nan - - X_expected = pd.DataFrame( - [ - [np.nan, np.nan, np.nan, 1.0, 1.0, 1.0], - [3.0, 4.0, 5.0, 0.0, 0.0, 0.0], - [6.0, 7.0, 8.0, 0.0, 0.0, 0.0], - ], - columns=["A", "B", "C", "A__is_null", "B__is_null", "C__is_null"], - ).astype(np.float32) - obj = IsNull(columns=list("ABC"), dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - X.iloc[0, :] = np.nan - - X_expected = pd.DataFrame( - [ - [np.nan, np.nan, np.nan, 1.0, 1.0, 1.0], - [3.0, 4.0, 5.0, 0.0, 0.0, 0.0], - [6.0, 7.0, 8.0, 0.0, 0.0, 0.0], - ], - columns=["A", "B", "C", "AIsNull", "BIsNull", "CIsNull"], - ) - obj = IsNull( - columns=list("ABC"), column_names=["AIsNull", "BIsNull", "CIsNull"] - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj(): - X = pd.DataFrame( - { - "A": [None, "a", "b"], - "B": [None, "c", "d"], - "C": [None, "e", "f"], - "D": [0, 1, np.nan], - } - ) - X_expected = pd.DataFrame( - { - "A": [None, "a", "b"], - "B": [None, "c", "d"], - "C": [None, "e", "f"], - "D": [0, 1, np.nan], - "A__is_null": [1.0, 0.0, 0.0], - "B__is_null": [1.0, 0.0, 0.0], - "C__is_null": [1.0, 0.0, 0.0], - "D__is_null": [0.0, 0.0, 1.0], - } - ) - obj = IsNull(columns=list("ABCD")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_num_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - X.iloc[0, :] = np.nan - X_expected = pd.DataFrame( - [ - [np.nan, np.nan, np.nan, 1.0, 1.0, 1.0], - [3.0, 4.0, 5.0, 0.0, 0.0, 0.0], - [6.0, 7.0, 8.0, 0.0, 0.0, 0.0], - ], - columns=["A", "B", "C", "A__is_null", "B__is_null", "C__is_null"], - ) - obj = IsNull(columns=list("ABC")).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_num_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - X.iloc[0, :] = np.nan - X = X.astype(np.float32) - X_expected = pd.DataFrame( - [ - [np.nan, np.nan, np.nan, 1.0, 1.0, 1.0], - [3.0, 4.0, 5.0, 0.0, 0.0, 0.0], - [6.0, 7.0, 8.0, 0.0, 0.0, 0.0], - ], - columns=["A", "B", "C", "A__is_null", "B__is_null", "C__is_null"], - ).astype(np.float32) - obj = IsNull(columns=list("ABC"), dtype=np.float32).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC")) - X.iloc[0, :] = np.nan - X_expected = pd.DataFrame( - [ - [np.nan, np.nan, np.nan, 1.0, 1.0, 1.0], - [3.0, 4.0, 5.0, 0.0, 0.0, 0.0], - [6.0, 7.0, 8.0, 0.0, 0.0, 0.0], - ], - columns=["A", "B", "C", "AIsNull", "BIsNull", "CIsNull"], - ) - obj = IsNull( - columns=list("ABC"), column_names=["AIsNull", "BIsNull", "CIsNull"] - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_obj_ks(): - X = ks.DataFrame( - { - "A": [None, "a", "b"], - "B": [None, "c", "d"], - "C": [None, "e", "f"], - "D": [0, 1, np.nan], - } - ) - X_expected = pd.DataFrame( - { - "A": [None, "a", "b"], - "B": [None, "c", "d"], - "C": [None, "e", "f"], - "D": [0, 1, np.nan], - "A__is_null": [1.0, 0.0, 0.0], - "B__is_null": [1.0, 0.0, 0.0], - "C__is_null": [1.0, 0.0, 0.0], - "D__is_null": [0.0, 0.0, 1.0], - } - ) - obj = IsNull(columns=list("ABCD")).fit(X) - return obj, X, X_expected - - -def test_pd(data_num): - obj, X, X_expected = data_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_num_ks): - obj, X, X_expected = data_num_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data_num): - obj, X, X_expected = data_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_num_ks): - obj, X, X_expected = data_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_float32_pd(data_float32_num): - obj, X, X_expected = data_float32_num - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_num_ks): - obj, X, X_expected = data_float32_num_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32_num): - obj, X, X_expected = data_float32_num - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_num_ks): - obj, X, X_expected = data_float32_num_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_names_pd_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_obj(data_obj): - obj, X, X_expected = data_obj - X_new = obj.transform(X) - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) - ) - - -@pytest.mark.koalas -def test_obj_ks(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_new = obj.transform(X).to_pandas() - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) - ) - - -def test_obj_np(data_obj): - obj, X, X_expected = data_obj - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) - ) - - -@pytest.mark.koalas -def test_obj_ks_np(data_obj_ks): - obj, X, X_expected = data_obj_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal( - X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) - ) - - -def test_init(): - with pytest.raises(TypeError): - _ = IsNull(columns=0) - with pytest.raises(ValueError): - _ = IsNull(columns=[], column_names=["AIsNull"]) - with pytest.raises(TypeError): - _ = IsNull(columns=list("ABC"), column_names=0) - with pytest.raises(ValueError): - _ = IsNull(columns=list("ABC"), column_names=["a", "b"]) diff --git a/gators/feature_generation/tests/test_is_null_dd.py b/gators/feature_generation/tests/test_is_null_dd.py new file mode 100644 index 00000000..f1efab1a --- /dev/null +++ b/gators/feature_generation/tests/test_is_null_dd.py @@ -0,0 +1,147 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.is_null import IsNull + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + "A__is_null": [1.0, 0.0, 0.0], + "B__is_null": [1.0, 0.0, 0.0], + "C__is_null": [1.0, 0.0, 0.0], + } + ) + obj = IsNull(columns=list("ABC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + "AIsNull": [1.0, 0.0, 0.0], + "BIsNull": [1.0, 0.0, 0.0], + "CIsNull": [1.0, 0.0, 0.0], + } + ) + obj = IsNull( + columns=list("ABC"), column_names=["AIsNull", "BIsNull", "CIsNull"] + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + } + ), + npartitions=1, + ) + X_np = pd.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + } + ).to_numpy() + X_expected = pd.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + "A__is_null": [1.0, 0.0, 0.0], + "B__is_null": [1.0, 0.0, 0.0], + "C__is_null": [1.0, 0.0, 0.0], + "D__is_null": [0.0, 0.0, 1.0], + } + ) + obj = IsNull(columns=list("ABCD")).fit(X) + return obj, X, X_np, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X = X.compute() + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_dd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_names_dd_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_obj(data_obj): + obj, X, _, X_expected = data_obj + X[list("ABC")] = X[list("ABC")].astype(object) + X_new = obj.transform(X).compute() + assert_frame_equal( + X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) + ) + + +def test_obj_np(data_obj): + obj, X, X_np, X_expected = data_obj + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal( + X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) + ) diff --git a/gators/feature_generation/tests/test_is_null_ks.py b/gators/feature_generation/tests/test_is_null_ks.py new file mode 100644 index 00000000..79929dab --- /dev/null +++ b/gators/feature_generation/tests/test_is_null_ks.py @@ -0,0 +1,136 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.is_null import IsNull + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + "A__is_null": [1.0, 0.0, 0.0], + "B__is_null": [1.0, 0.0, 0.0], + "C__is_null": [1.0, 0.0, 0.0], + } + ) + obj = IsNull(columns=list("ABC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names_ks(): + X = ps.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + "AIsNull": [1.0, 0.0, 0.0], + "BIsNull": [1.0, 0.0, 0.0], + "CIsNull": [1.0, 0.0, 0.0], + } + ) + obj = IsNull( + columns=list("ABC"), column_names=["AIsNull", "BIsNull", "CIsNull"] + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj_ks(): + X = ps.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + } + ) + X_expected = pd.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + "A__is_null": [1.0, 0.0, 0.0], + "B__is_null": [1.0, 0.0, 0.0], + "C__is_null": [1.0, 0.0, 0.0], + "D__is_null": [0.0, 0.0, 1.0], + } + ) + obj = IsNull(columns=list("ABCD")).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_names_ks(data_names_ks): + obj, X, X_expected = data_names_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_names_ks_np(data_names_ks): + obj, X, X_expected = data_names_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_obj_ks(data_obj_ks): + obj, X, X_expected = data_obj_ks + X_new = obj.transform(X).to_pandas() + assert_frame_equal( + X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) + ) + + +@pytest.mark.pyspark +def test_obj_ks_np(data_obj_ks): + obj, X, X_expected = data_obj_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal( + X_new.iloc[:, 4:].astype(float), X_expected.iloc[:, 4:].astype(float) + ) diff --git a/gators/feature_generation/tests/test_is_null_pd.py b/gators/feature_generation/tests/test_is_null_pd.py new file mode 100644 index 00000000..67a2981a --- /dev/null +++ b/gators/feature_generation/tests/test_is_null_pd.py @@ -0,0 +1,132 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.is_null import IsNull + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + "A__is_null": [1.0, 0.0, 0.0], + "B__is_null": [1.0, 0.0, 0.0], + "C__is_null": [1.0, 0.0, 0.0], + } + ) + obj = IsNull(columns=list("ABC")).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + } + ) + X_expected = pd.DataFrame( + { + "A": [np.nan, 3.0, 6.0], + "B": [np.nan, 4.0, 7.0], + "C": [np.nan, 5.0, 8.0], + "AIsNull": [1.0, 0.0, 0.0], + "BIsNull": [1.0, 0.0, 0.0], + "CIsNull": [1.0, 0.0, 0.0], + } + ) + obj = IsNull( + columns=list("ABC"), column_names=["AIsNull", "BIsNull", "CIsNull"] + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_obj(): + X = pd.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + } + ) + X_expected = pd.DataFrame( + { + "A": [None, "a", "b"], + "B": [None, "c", "d"], + "C": [None, "e", "f"], + "D": [0, 1, np.nan], + "A__is_null": [1.0, 0.0, 0.0], + "B__is_null": [1.0, 0.0, 0.0], + "C__is_null": [1.0, 0.0, 0.0], + "D__is_null": [0.0, 0.0, 1.0], + } + ) + obj = IsNull(columns=list("ABCD")).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_obj(data_obj): + obj, X, X_expected = data_obj + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_obj_np(data_obj): + obj, X, X_expected = data_obj + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = IsNull(columns=0) + with pytest.raises(TypeError): + _ = IsNull(columns=list("ABC"), column_names=0) + with pytest.raises(ValueError): + _ = IsNull(columns=list("ABC"), column_names=["a", "b"]) diff --git a/gators/feature_generation/tests/test_one_hot.py b/gators/feature_generation/tests/test_one_hot.py deleted file mode 100644 index d08450f6..00000000 --- a/gators/feature_generation/tests/test_one_hot.py +++ /dev/null @@ -1,165 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.one_hot import OneHot - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) - X_expected = pd.DataFrame( - { - "A": {0: "q", 1: "q", 2: "a"}, - "B": {0: "w", 1: "w", 2: "s"}, - "C": {0: "e", 1: "r", 2: "d"}, - "A__onehot__q": {0: True, 1: True, 2: False}, - "A__onehot__a": {0: False, 1: False, 2: True}, - "B__onehot__w": {0: True, 1: True, 2: False}, - "B__onehot__s": {0: False, 1: False, 2: True}, - "C__onehot__e": {0: True, 1: False, 2: False}, - "C__onehot__d": {0: False, 1: False, 2: True}, - } - ) - categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} - obj = OneHot(categories_dict=categories_dict).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names(): - X = pd.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) - X_expected = pd.DataFrame( - { - "A": {0: "q", 1: "q", 2: "a"}, - "B": {0: "w", 1: "w", 2: "s"}, - "C": {0: "e", 1: "r", 2: "d"}, - "Aq": {0: True, 1: True, 2: False}, - "Aa": {0: False, 1: False, 2: True}, - "Bw": {0: True, 1: True, 2: False}, - "Bs": {0: False, 1: False, 2: True}, - "Ce": {0: True, 1: False, 2: False}, - "Cd": {0: False, 1: False, 2: True}, - } - ) - column_names = ["Aq", "Aa", "Bw", "Bs", "Ce", "Cd"] - categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} - obj = OneHot(categories_dict=categories_dict, column_names=column_names).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) - X_expected = pd.DataFrame( - { - "A": {0: "q", 1: "q", 2: "a"}, - "B": {0: "w", 1: "w", 2: "s"}, - "C": {0: "e", 1: "r", 2: "d"}, - "A__onehot__q": {0: True, 1: True, 2: False}, - "A__onehot__a": {0: False, 1: False, 2: True}, - "B__onehot__w": {0: True, 1: True, 2: False}, - "B__onehot__s": {0: False, 1: False, 2: True}, - "C__onehot__e": {0: True, 1: False, 2: False}, - "C__onehot__d": {0: False, 1: False, 2: True}, - } - ) - categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} - obj = OneHot(categories_dict=categories_dict).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_names_ks(): - X = ks.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) - X_expected = pd.DataFrame( - { - "A": {0: "q", 1: "q", 2: "a"}, - "B": {0: "w", 1: "w", 2: "s"}, - "C": {0: "e", 1: "r", 2: "d"}, - "Aq": {0: True, 1: True, 2: False}, - "Aa": {0: False, 1: False, 2: True}, - "Bw": {0: True, 1: True, 2: False}, - "Bs": {0: False, 1: False, 2: True}, - "Ce": {0: True, 1: False, 2: False}, - "Cd": {0: False, 1: False, 2: True}, - } - ) - column_names = ["Aq", "Aa", "Bw", "Bs", "Ce", "Cd"] - categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} - obj = OneHot(categories_dict=categories_dict, column_names=column_names).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new.iloc[:, -3:], X_expected.iloc[:, -3:]) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas().iloc[:, -3:], X_expected.iloc[:, -3:]) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_names_pd(data_names): - obj, X, X_expected = data_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_names_ks): - obj, X, X_expected = data_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_names_np(data_names): - obj, X, X_expected = data_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_names_np(data_names_ks): - obj, X, X_expected = data_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OneHot(categories_dict=0) - with pytest.raises(TypeError): - _ = OneHot(categories_dict={"a": ["x"]}, column_names=0) - with pytest.raises(ValueError): - _ = OneHot(categories_dict={"a": ["x"]}, column_names=["aa", "bb"]) diff --git a/gators/feature_generation/tests/test_one_hot_dd.py b/gators/feature_generation/tests/test_one_hot_dd.py new file mode 100644 index 00000000..cc8e5dfe --- /dev/null +++ b/gators/feature_generation/tests/test_one_hot_dd.py @@ -0,0 +1,87 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.one_hot import OneHot + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["q", "q", "a"], + "B": ["w", "w", "s"], + "C": ["e", "r", "d"], + "A__onehot__q": [1.0, 1.0, 0.0], + "A__onehot__a": [0.0, 0.0, 1.0], + "B__onehot__w": [1.0, 1.0, 0.0], + "B__onehot__s": [0.0, 0.0, 1.0], + "C__onehot__e": [1.0, 0.0, 0.0], + "C__onehot__d": [0.0, 0.0, 1.0], + } + ) + categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} + obj = OneHot(categories_dict=categories_dict).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = dd.from_pandas( + pd.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "A": ["q", "q", "a"], + "B": ["w", "w", "s"], + "C": ["e", "r", "d"], + "Aq": [1.0, 1.0, 0.0], + "Aa": [0.0, 0.0, 1.0], + "Bw": [1.0, 1.0, 0.0], + "Bs": [0.0, 0.0, 1.0], + "Ce": [1.0, 0.0, 0.0], + "Cd": [0.0, 0.0, 1.0], + } + ) + column_names = ["Aq", "Aa", "Bw", "Bs", "Ce", "Cd"] + categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} + obj = OneHot(categories_dict=categories_dict, column_names=column_names).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[list("ABC")] = X_new[list("ABC")].astype(object) + assert_frame_equal(X_new.iloc[:, -3:], X_expected.iloc[:, -3:]) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_dd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X).compute() + X_new[list("ABC")] = X_new[list("ABC")].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_names_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_one_hot_ks.py b/gators/feature_generation/tests/test_one_hot_ks.py new file mode 100644 index 00000000..3484e98a --- /dev/null +++ b/gators/feature_generation/tests/test_one_hot_ks.py @@ -0,0 +1,85 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.one_hot import OneHot + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) + X_expected = pd.DataFrame( + { + "A": ["q", "q", "a"], + "B": ["w", "w", "s"], + "C": ["e", "r", "d"], + "A__onehot__q": [1.0, 1.0, 0.0], + "A__onehot__a": [0.0, 0.0, 1.0], + "B__onehot__w": [1.0, 1.0, 0.0], + "B__onehot__s": [0.0, 0.0, 1.0], + "C__onehot__e": [1.0, 0.0, 0.0], + "C__onehot__d": [0.0, 0.0, 1.0], + } + ) + categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} + obj = OneHot(categories_dict=categories_dict).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names_ks(): + X = ps.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) + X_expected = pd.DataFrame( + { + "A": ["q", "q", "a"], + "B": ["w", "w", "s"], + "C": ["e", "r", "d"], + "Aq": [1.0, 1.0, 0.0], + "Aa": [0.0, 0.0, 1.0], + "Bw": [1.0, 1.0, 0.0], + "Bs": [0.0, 0.0, 1.0], + "Ce": [1.0, 0.0, 0.0], + "Cd": [0.0, 0.0, 1.0], + } + ) + column_names = ["Aq", "Aa", "Bw", "Bs", "Ce", "Cd"] + categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} + obj = OneHot(categories_dict=categories_dict, column_names=column_names).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas().iloc[:, -3:], X_expected.iloc[:, -3:]) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_names_ks(data_names_ks): + obj, X, X_expected = data_names_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_names_np(data_names_ks): + obj, X, X_expected = data_names_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_one_hot_pd.py b/gators/feature_generation/tests/test_one_hot_pd.py new file mode 100644 index 00000000..d3b63a50 --- /dev/null +++ b/gators/feature_generation/tests/test_one_hot_pd.py @@ -0,0 +1,87 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.one_hot import OneHot + + +@pytest.fixture +def data(): + X = pd.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) + X_expected = pd.DataFrame( + { + "A": ["q", "q", "a"], + "B": ["w", "w", "s"], + "C": ["e", "r", "d"], + "A__onehot__q": [1.0, 1.0, 0.0], + "A__onehot__a": [0.0, 0.0, 1.0], + "B__onehot__w": [1.0, 1.0, 0.0], + "B__onehot__s": [0.0, 0.0, 1.0], + "C__onehot__e": [1.0, 0.0, 0.0], + "C__onehot__d": [0.0, 0.0, 1.0], + } + ) + categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} + obj = OneHot(categories_dict=categories_dict).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_names(): + X = pd.DataFrame(np.array(list("qweqwrasd")).reshape(3, 3), columns=list("ABC")) + X_expected = pd.DataFrame( + { + "A": ["q", "q", "a"], + "B": ["w", "w", "s"], + "C": ["e", "r", "d"], + "Aq": [1.0, 1.0, 0.0], + "Aa": [0.0, 0.0, 1.0], + "Bw": [1.0, 1.0, 0.0], + "Bs": [0.0, 0.0, 1.0], + "Ce": [1.0, 0.0, 0.0], + "Cd": [0.0, 0.0, 1.0], + } + ) + column_names = ["Aq", "Aa", "Bw", "Bs", "Ce", "Cd"] + categories_dict = {"A": ["q", "a"], "B": ["w", "s"], "C": ["e", "d"]} + obj = OneHot(categories_dict=categories_dict, column_names=column_names).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd(data_names): + obj, X, X_expected = data_names + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_names_np(data_names): + obj, X, X_expected = data_names + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = OneHot(categories_dict=0) + with pytest.raises(TypeError): + _ = OneHot(categories_dict={"a": ["x"]}, column_names=0) + with pytest.raises(ValueError): + _ = OneHot(categories_dict={"a": ["x"]}, column_names=["aa", "bb"]) diff --git a/gators/feature_generation/tests/test_plane_rotation.py b/gators/feature_generation/tests/test_plane_rotation.py deleted file mode 100644 index 21a7d547..00000000 --- a/gators/feature_generation/tests/test_plane_rotation.py +++ /dev/null @@ -1,182 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.plane_rotation import PlaneRotation - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - [[200.0, 140.0, 100.0], [210.0, 160.0, 125.0]], columns=list("XYZ") - ) - X_expected = pd.DataFrame( - { - "X": {0: 200.0, 1: 210.0}, - "Y": {0: 140.0, 1: 160.0}, - "Z": {0: 100.0, 1: 125.0}, - "XY_x_45deg": {0: 42.42640687119287, 1: 35.35533905932739}, - "XY_y_45deg": {0: 240.41630560342614, 1: 261.62950903902254}, - "XY_x_60deg": {0: -21.243556529821376, 1: -33.56406460551014}, - "XY_y_60deg": {0: 243.20508075688775, 1: 261.8653347947321}, - "XZ_x_45deg": {0: 70.71067811865477, 1: 60.104076400856556}, - "XZ_y_45deg": {0: 212.13203435596424, 1: 236.8807716974934}, - "XZ_x_60deg": {0: 13.397459621556166, 1: -3.253175473054796}, - "XZ_y_60deg": {0: 223.20508075688775, 1: 244.36533479473212}, - } - ) - obj = PlaneRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame([[200, 140, 100], [210, 160, 125]], columns=list("XYZ")).astype( - np.float32 - ) - - X_expected = pd.DataFrame( - { - "X": {0: 200.0, 1: 210.0}, - "Y": {0: 140.0, 1: 160.0}, - "Z": {0: 100.0, 1: 125.0}, - "XY_x_45deg": {0: 42.42640687119287, 1: 35.35533905932739}, - "XY_y_45deg": {0: 240.41630560342614, 1: 261.62950903902254}, - "XY_x_60deg": {0: -21.243556529821376, 1: -33.56406460551014}, - "XY_y_60deg": {0: 243.20508075688775, 1: 261.8653347947321}, - "XZ_x_45deg": {0: 70.71067811865477, 1: 60.104076400856556}, - "XZ_y_45deg": {0: 212.13203435596424, 1: 236.8807716974934}, - "XZ_x_60deg": {0: 13.397459621556166, 1: -3.253175473054796}, - "XZ_y_60deg": {0: 223.20508075688775, 1: 244.36533479473212}, - } - ).astype(np.float32) - obj = PlaneRotation( - columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60], dtype=np.float32 - ).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - [[200.0, 140.0, 100.0], [210.0, 160.0, 125.0]], columns=list("XYZ") - ) - X_expected = pd.DataFrame( - { - "X": {0: 200.0, 1: 210.0}, - "Y": {0: 140.0, 1: 160.0}, - "Z": {0: 100.0, 1: 125.0}, - "XY_x_45deg": {0: 42.42640687119287, 1: 35.35533905932739}, - "XY_y_45deg": {0: 240.41630560342614, 1: 261.62950903902254}, - "XY_x_60deg": {0: -21.243556529821376, 1: -33.56406460551014}, - "XY_y_60deg": {0: 243.20508075688775, 1: 261.8653347947321}, - "XZ_x_45deg": {0: 70.71067811865477, 1: 60.104076400856556}, - "XZ_y_45deg": {0: 212.13203435596424, 1: 236.8807716974934}, - "XZ_x_60deg": {0: 13.397459621556166, 1: -3.253175473054796}, - "XZ_y_60deg": {0: 223.20508075688775, 1: 244.36533479473212}, - } - ) - obj = PlaneRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame([[200, 140, 100], [210, 160, 125]], columns=list("XYZ")).astype( - np.float32 - ) - X_expected = pd.DataFrame( - { - "X": {0: 200.0, 1: 210.0}, - "Y": {0: 140.0, 1: 160.0}, - "Z": {0: 100.0, 1: 125.0}, - "XY_x_45deg": {0: 42.42640687119287, 1: 35.35533905932739}, - "XY_y_45deg": {0: 240.41630560342614, 1: 261.62950903902254}, - "XY_x_60deg": {0: -21.243556529821376, 1: -33.56406460551014}, - "XY_y_60deg": {0: 243.20508075688775, 1: 261.8653347947321}, - "XZ_x_45deg": {0: 70.71067811865477, 1: 60.104076400856556}, - "XZ_y_45deg": {0: 212.13203435596424, 1: 236.8807716974934}, - "XZ_x_60deg": {0: 13.397459621556166, 1: -3.253175473054796}, - "XZ_y_60deg": {0: 223.20508075688775, 1: 244.36533479473212}, - } - ).astype(np.float32) - obj = PlaneRotation( - columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60], dtype=np.float32 - ).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -def test_float32_pd(data_float32): - obj, X, X_expected = data_float32 - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_float32_pd_np(data_float32): - obj, X, X_expected = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X, X_expected = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new, X_expected) - - -def test_input(): - with pytest.raises(TypeError): - _ = PlaneRotation(columns=0, theta_vec=[45, 60]) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=[["X", "Y"]], theta_vec=0) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=0) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=["X", "Y", "X", "Z"], theta_vec=[45, 60]) - with pytest.raises(ValueError): - _ = PlaneRotation(columns=[], theta_vec=[0]) - with pytest.raises(TypeError): - _ = PlaneRotation(columns=[["X", "Y"]], theta_vec=[45, "60"]) diff --git a/gators/feature_generation/tests/test_plane_rotation_dd.py b/gators/feature_generation/tests/test_plane_rotation_dd.py new file mode 100644 index 00000000..bd60f0eb --- /dev/null +++ b/gators/feature_generation/tests/test_plane_rotation_dd.py @@ -0,0 +1,93 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.plan_rotation import PlanRotation + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame({"X": [200.0, 210.0], "Y": [140.0, 160.0], "Z": [100.0, 125.0]}), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "X": [200.0, 210.0], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + "XY_x_45deg": [42.42640687119287, 35.35533905932739], + "XY_y_45deg": [240.41630560342614, 261.62950903902254], + "XY_x_60deg": [-21.243556529821376, -33.56406460551014], + "XY_y_60deg": [243.20508075688775, 261.8653347947321], + "XZ_x_45deg": [70.71067811865477, 60.104076400856556], + "XZ_y_45deg": [212.13203435596424, 236.8807716974934], + "XZ_x_60deg": [13.397459621556166, -3.253175473054796], + "XZ_y_60deg": [223.20508075688775, 244.36533479473212], + } + ) + obj = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_object(): + X = dd.from_pandas( + pd.DataFrame( + { + "X": [200.0, 210.0], + "A": ["a", "b"], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + } + ), + npartitions=1, + ) + X_expected = pd.DataFrame( + { + "X": [200.0, 210.0], + "A": ["a", "b"], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + "XY_x_45deg": [42.42640687119287, 35.35533905932739], + "XY_y_45deg": [240.41630560342614, 261.62950903902254], + "XY_x_60deg": [-21.243556529821376, -33.56406460551014], + "XY_y_60deg": [243.20508075688775, 261.8653347947321], + "XZ_x_45deg": [70.71067811865477, 60.104076400856556], + "XZ_y_45deg": [212.13203435596424, 236.8807716974934], + "XZ_x_60deg": [13.397459621556166, -3.253175473054796], + "XZ_y_60deg": [223.20508075688775, 244.36533479473212], + } + ) + obj = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected) + + +def test_object_dd(data_object): + obj, X, X_expected = data_object + X_new = obj.transform(X).compute() + X_new["A"] = X_new["A"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_object_dd_np(data_object): + obj, X, X_expected = data_object + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) diff --git a/gators/feature_generation/tests/test_plane_rotation_ks.py b/gators/feature_generation/tests/test_plane_rotation_ks.py new file mode 100644 index 00000000..e6dc269e --- /dev/null +++ b/gators/feature_generation/tests/test_plane_rotation_ks.py @@ -0,0 +1,87 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.plan_rotation import PlanRotation + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame({"X": [200.0, 210.0], "Y": [140.0, 160.0], "Z": [100.0, 125.0]}) + X_expected = pd.DataFrame( + { + "X": [200.0, 210.0], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + "XY_x_45deg": [42.42640687119287, 35.35533905932739], + "XY_y_45deg": [240.41630560342614, 261.62950903902254], + "XY_x_60deg": [-21.243556529821376, -33.56406460551014], + "XY_y_60deg": [243.20508075688775, 261.8653347947321], + "XZ_x_45deg": [70.71067811865477, 60.104076400856556], + "XZ_y_45deg": [212.13203435596424, 236.8807716974934], + "XZ_x_60deg": [13.397459621556166, -3.253175473054796], + "XZ_y_60deg": [223.20508075688775, 244.36533479473212], + } + ) + obj = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_object_ks(): + X = ps.DataFrame( + {"X": [200.0, 210.0], "A": ["a", "b"], "Y": [140.0, 160.0], "Z": [100.0, 125.0]} + ) + X_expected = pd.DataFrame( + { + "X": [200.0, 210.0], + "A": ["a", "b"], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + "XY_x_45deg": [42.42640687119287, 35.35533905932739], + "XY_y_45deg": [240.41630560342614, 261.62950903902254], + "XY_x_60deg": [-21.243556529821376, -33.56406460551014], + "XY_y_60deg": [243.20508075688775, 261.8653347947321], + "XZ_x_45deg": [70.71067811865477, 60.104076400856556], + "XZ_y_45deg": [212.13203435596424, 236.8807716974934], + "XZ_x_60deg": [13.397459621556166, -3.253175473054796], + "XZ_y_60deg": [223.20508075688775, 244.36533479473212], + } + ) + obj = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new, X_expected) + + +@pytest.mark.pyspark +def test_object_ks(data_object_ks): + obj, X, X_expected = data_object_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_object_ks_np(data_object_ks): + obj, X, X_expected = data_object_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) diff --git a/gators/feature_generation/tests/test_plane_rotation_pd.py b/gators/feature_generation/tests/test_plane_rotation_pd.py new file mode 100644 index 00000000..1f4dcfcd --- /dev/null +++ b/gators/feature_generation/tests/test_plane_rotation_pd.py @@ -0,0 +1,95 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.plan_rotation import PlanRotation + + +@pytest.fixture +def data(): + X = pd.DataFrame({"X": [200.0, 210.0], "Y": [140.0, 160.0], "Z": [100.0, 125.0]}) + X_expected = pd.DataFrame( + { + "X": [200.0, 210.0], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + "XY_x_45deg": [42.42640687119287, 35.35533905932739], + "XY_y_45deg": [240.41630560342614, 261.62950903902254], + "XY_x_60deg": [-21.243556529821376, -33.56406460551014], + "XY_y_60deg": [243.20508075688775, 261.8653347947321], + "XZ_x_45deg": [70.71067811865477, 60.104076400856556], + "XZ_y_45deg": [212.13203435596424, 236.8807716974934], + "XZ_x_60deg": [13.397459621556166, -3.253175473054796], + "XZ_y_60deg": [223.20508075688775, 244.36533479473212], + } + ) + obj = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_object(): + X = pd.DataFrame( + {"X": [200.0, 210.0], "A": ["a", "b"], "Y": [140.0, 160.0], "Z": [100.0, 125.0]} + ) + X_expected = pd.DataFrame( + { + "X": [200.0, 210.0], + "A": ["a", "b"], + "Y": [140.0, 160.0], + "Z": [100.0, 125.0], + "XY_x_45deg": [42.42640687119287, 35.35533905932739], + "XY_y_45deg": [240.41630560342614, 261.62950903902254], + "XY_x_60deg": [-21.243556529821376, -33.56406460551014], + "XY_y_60deg": [243.20508075688775, 261.8653347947321], + "XZ_x_45deg": [70.71067811865477, 60.104076400856556], + "XZ_y_45deg": [212.13203435596424, 236.8807716974934], + "XZ_x_60deg": [13.397459621556166, -3.253175473054796], + "XZ_y_60deg": [223.20508075688775, 244.36533479473212], + } + ) + obj = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=[45, 60]).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) + + +def test_object_pd(data_object): + obj, X, X_expected = data_object + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_object_pd_np(data_object): + obj, X, X_expected = data_object + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) + + +def test_input(): + with pytest.raises(TypeError): + _ = PlanRotation(columns=0, theta_vec=[45, 60]) + with pytest.raises(TypeError): + _ = PlanRotation(columns=[["X", "Y"]], theta_vec=0) + with pytest.raises(TypeError): + _ = PlanRotation(columns=[["X", "Y"], ["X", "Z"]], theta_vec=0) + with pytest.raises(TypeError): + _ = PlanRotation(columns=["X", "Y", "X", "Z"], theta_vec=[45, 60]) + with pytest.raises(ValueError): + _ = PlanRotation(columns=[], theta_vec=[0]) + with pytest.raises(TypeError): + _ = PlanRotation(columns=[["X", "Y"]], theta_vec=[45, "60"]) diff --git a/gators/feature_generation/tests/test_polynomial_features.py b/gators/feature_generation/tests/test_polynomial_features.py deleted file mode 100644 index fe84eb8f..00000000 --- a/gators/feature_generation/tests/test_polynomial_features.py +++ /dev/null @@ -1,602 +0,0 @@ -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation.polynomial_features import PolynomialFeatures - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data_inter(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], - [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], - [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], - ] - ), - columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_inter(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.int16) - obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], - [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], - [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], - ] - ), - columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], - ).astype(np.int16) - return obj, X, X_expected - - -@pytest.fixture -def data_all(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float32) - obj = PolynomialFeatures(interaction_only=False, columns=["A", "B", "C"]).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 0.0, 1.0, 2.0, 4.0], - [3.0, 4.0, 5.0, 9.0, 12.0, 15.0, 16.0, 20.0, 25.0], - [6.0, 7.0, 8.0, 36.0, 42.0, 48.0, 49.0, 56.0, 64.0], - ] - ), - columns=[ - "A", - "B", - "C", - "A__x__A", - "A__x__B", - "A__x__C", - "B__x__B", - "B__x__C", - "C__x__C", - ], - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_degree(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=False, degree=3, columns=["A", "B", "C"] - ).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [ - 0.0, - 1.0, - 2.0, - 0.0, - 0.0, - 0.0, - 1.0, - 2.0, - 4.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 2.0, - 4.0, - 8.0, - ], - [ - 3.0, - 4.0, - 5.0, - 9.0, - 12.0, - 15.0, - 16.0, - 20.0, - 25.0, - 27.0, - 36.0, - 45.0, - 48.0, - 60.0, - 75.0, - 64.0, - 80.0, - 100.0, - 125.0, - ], - [ - 6.0, - 7.0, - 8.0, - 36.0, - 42.0, - 48.0, - 49.0, - 56.0, - 64.0, - 216.0, - 252.0, - 288.0, - 294.0, - 336.0, - 384.0, - 343.0, - 392.0, - 448.0, - 512.0, - ], - ] - ), - columns=[ - "A", - "B", - "C", - "A__x__A", - "A__x__B", - "A__x__C", - "B__x__B", - "B__x__C", - "C__x__C", - "A__x__A__x__A", - "A__x__A__x__B", - "A__x__A__x__C", - "A__x__B__x__B", - "A__x__B__x__C", - "A__x__C__x__C", - "B__x__B__x__B", - "B__x__B__x__C", - "B__x__C__x__C", - "C__x__C__x__C", - ], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_inter_degree(): - X = pd.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=True, degree=3, columns=["A", "B", "C"] - ).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 2.0, 0.0], - [3.0, 4.0, 5.0, 12.0, 15.0, 20.0, 60.0], - [6.0, 7.0, 8.0, 42.0, 48.0, 56.0, 336.0], - ] - ), - columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C", "A__x__B__x__C"], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_subset(): - X = pd.DataFrame( - np.arange(12).reshape(3, 4), columns=list("ABCD"), dtype=np.float64 - ) - - obj = PolynomialFeatures( - columns=["A", "B", "C"], interaction_only=True, degree=2 - ).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 3.0, 0.0, 0.0, 2.0], - [4.0, 5.0, 6.0, 7.0, 20.0, 24.0, 30.0], - [8.0, 9.0, 10.0, 11.0, 72.0, 80.0, 90.0], - ] - ), - columns=["A", "B", "C", "D", "A__x__B", "A__x__C", "B__x__C"], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_inter_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], - [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], - [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], - ] - ), - columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_int16_inter_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.int16) - obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], - [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], - [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], - ] - ), - columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], - ).astype(np.int16) - return obj, X, X_expected - - -@pytest.fixture -def data_all_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float32) - obj = PolynomialFeatures(interaction_only=False, columns=["A", "B", "C"]).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 0.0, 1.0, 2.0, 4.0], - [3.0, 4.0, 5.0, 9.0, 12.0, 15.0, 16.0, 20.0, 25.0], - [6.0, 7.0, 8.0, 36.0, 42.0, 48.0, 49.0, 56.0, 64.0], - ] - ), - columns=[ - "A", - "B", - "C", - "A__x__A", - "A__x__B", - "A__x__C", - "B__x__B", - "B__x__C", - "C__x__C", - ], - ).astype(np.float32) - return obj, X, X_expected - - -@pytest.fixture -def data_degree_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=False, degree=3, columns=["A", "B", "C"] - ).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [ - 0.0, - 1.0, - 2.0, - 0.0, - 0.0, - 0.0, - 1.0, - 2.0, - 4.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 2.0, - 4.0, - 8.0, - ], - [ - 3.0, - 4.0, - 5.0, - 9.0, - 12.0, - 15.0, - 16.0, - 20.0, - 25.0, - 27.0, - 36.0, - 45.0, - 48.0, - 60.0, - 75.0, - 64.0, - 80.0, - 100.0, - 125.0, - ], - [ - 6.0, - 7.0, - 8.0, - 36.0, - 42.0, - 48.0, - 49.0, - 56.0, - 64.0, - 216.0, - 252.0, - 288.0, - 294.0, - 336.0, - 384.0, - 343.0, - 392.0, - 448.0, - 512.0, - ], - ] - ), - columns=[ - "A", - "B", - "C", - "A__x__A", - "A__x__B", - "A__x__C", - "B__x__B", - "B__x__C", - "C__x__C", - "A__x__A__x__A", - "A__x__A__x__B", - "A__x__A__x__C", - "A__x__B__x__B", - "A__x__B__x__C", - "A__x__C__x__C", - "B__x__B__x__B", - "B__x__B__x__C", - "B__x__C__x__C", - "C__x__C__x__C", - ], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_inter_degree_ks(): - X = ks.DataFrame(np.arange(9).reshape(3, 3), columns=list("ABC"), dtype=np.float64) - - obj = PolynomialFeatures( - interaction_only=True, degree=3, columns=["A", "B", "C"] - ).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 0.0, 0.0, 2.0, 0.0], - [3.0, 4.0, 5.0, 12.0, 15.0, 20.0, 60.0], - [6.0, 7.0, 8.0, 42.0, 48.0, 56.0, 336.0], - ] - ), - columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C", "A__x__B__x__C"], - ) - return obj, X, X_expected - - -@pytest.fixture -def data_subset_ks(): - X = ks.DataFrame( - np.arange(12).reshape(3, 4), columns=list("ABCD"), dtype=np.float64 - ) - - obj = PolynomialFeatures( - columns=["A", "B", "C"], interaction_only=True, degree=2 - ).fit(X) - X_expected = pd.DataFrame( - np.array( - [ - [0.0, 1.0, 2.0, 3.0, 0.0, 0.0, 2.0], - [4.0, 5.0, 6.0, 7.0, 20.0, 24.0, 30.0], - [8.0, 9.0, 10.0, 11.0, 72.0, 80.0, 90.0], - ] - ), - columns=["A", "B", "C", "D", "A__x__B", "A__x__C", "B__x__C"], - ) - return obj, X, X_expected - - -def test_inter_pd(data_inter): - obj, X, X_expected = data_inter - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_ks(data_inter_ks): - obj, X, X_expected = data_inter_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_inter_pd_np(data_inter): - obj, X, X_expected = data_inter - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_ks_np(data_inter_ks): - obj, X, X_expected = data_inter_ks - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -def test_int16_inter_pd(data_int16_inter): - obj, X, X_expected = data_int16_inter - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_inter_ks(data_int16_inter_ks): - obj, X, X_expected = data_int16_inter_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_int16_inter_pd_np(data_int16_inter): - obj, X, X_expected = data_int16_inter - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -@pytest.mark.koalas -def test_int16_inter_ks_np(data_int16_inter_ks): - obj, X, X_expected = data_int16_inter_ks - X_new = obj.transform_numpy(X.to_numpy()) - assert np.allclose(X_new, X_expected) - - -def test_all_pd(data_all): - obj, X, X_expected = data_all - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_all_ks(data_all_ks): - obj, X, X_expected = data_all_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_all_pd_np(data_all): - obj, X, X_expected = data_all - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_all_ks_np(data_all_ks): - obj, X, X_expected = data_all_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_degree_pd(data_degree): - obj, X, X_expected = data_degree - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_degree_ks(data_degree_ks): - obj, X, X_expected = data_degree_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_degree_pd_np(data_degree): - obj, X, X_expected = data_degree - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_degree_ks_np(data_degree_ks): - obj, X, X_expected = data_degree_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_inter_degree_pd(data_inter_degree): - obj, X, X_expected = data_inter_degree - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_degree_ks(data_inter_degree_ks): - obj, X, X_expected = data_inter_degree_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_inter_degree_pd_np(data_inter_degree): - obj, X, X_expected = data_inter_degree - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_inter_degree_ks_np(data_inter_degree_ks): - obj, X, X_expected = data_inter_degree_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_subset_pd(data_subset): - obj, X, X_expected = data_subset - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_subset_ks(data_subset_ks): - obj, X, X_expected = data_subset_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_subset_pd_np(data_subset): - obj, X, X_expected = data_subset - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_subset_ks_np(data_subset): - obj, X, X_expected = data_subset - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = PolynomialFeatures(columns="A", degree=2, interaction_only=True) - with pytest.raises(ValueError): - _ = PolynomialFeatures(columns=["A"], degree=2, interaction_only=True) - with pytest.raises(ValueError): - _ = PolynomialFeatures(columns=["A"], degree=1, interaction_only=False) - with pytest.raises(TypeError): - _ = PolynomialFeatures(columns=["A", "B"], degree=1.1, interaction_only=True) - with pytest.raises(TypeError): - _ = PolynomialFeatures(columns=["A", "B"], degree=2, interaction_only="x") - with pytest.raises(ValueError): - _ = PolynomialFeatures(columns=[], degree=2) diff --git a/gators/feature_generation/tests/test_polynomial_features_dd.py b/gators/feature_generation/tests/test_polynomial_features_dd.py new file mode 100644 index 00000000..2f7f22be --- /dev/null +++ b/gators/feature_generation/tests/test_polynomial_features_dd.py @@ -0,0 +1,92 @@ +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.polynomial_features import PolynomialFeatures + + +@pytest.fixture +def data_interaction(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ), + npartitions=1, + ) + obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) + X_expected = pd.DataFrame( + np.array( + [ + [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], + [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], + [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], + ] + ), + columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], + ) + return obj, X, X_expected + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + }, + ), + npartitions=1, + ) + + obj = PolynomialFeatures(interaction_only=False, columns=["A", "B", "C"]).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "A__x__A": [0.0, 9.0, 36.0], + "A__x__B": [0.0, 12.0, 42.0], + "A__x__C": [0.0, 15.0, 48.0], + "B__x__B": [1.0, 16.0, 49.0], + "B__x__C": [2.0, 20.0, 56.0], + "C__x__C": [4.0, 25.0, 64.0], + } + ) + return obj, X, X_expected + + +def test_interaction_dd(data_interaction): + obj, X, X_expected = data_interaction + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_interaction_dd_np(data_interaction): + obj, X, X_expected = data_interaction + X_new = obj.transform_numpy(X.compute().to_numpy()) + assert_frame_equal(pd.DataFrame(X_new), pd.DataFrame(X_expected.to_numpy())) + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new["D"] = X_new["D"].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_polynomial_features_ks.py b/gators/feature_generation/tests/test_polynomial_features_ks.py new file mode 100644 index 00000000..7494ffce --- /dev/null +++ b/gators/feature_generation/tests/test_polynomial_features_ks.py @@ -0,0 +1,90 @@ +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.polynomial_features import PolynomialFeatures + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_interaction_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) + X_expected = pd.DataFrame( + np.array( + [ + [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], + [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], + [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], + ] + ), + columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], + ) + return obj, X, X_expected + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + }, + ) + obj = PolynomialFeatures(interaction_only=False, columns=["A", "B", "C"]).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "A__x__A": [0.0, 9.0, 36.0], + "A__x__B": [0.0, 12.0, 42.0], + "A__x__C": [0.0, 15.0, 48.0], + "B__x__B": [1.0, 16.0, 49.0], + "B__x__C": [2.0, 20.0, 56.0], + "C__x__C": [4.0, 25.0, 64.0], + } + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_interaction_ks(data_interaction_ks): + obj, X, X_expected = data_interaction_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_interaction_ks_np(data_interaction_ks): + obj, X, X_expected = data_interaction_ks + X_new = obj.transform_numpy(X.to_numpy()) + assert np.allclose(X_new, X_expected) + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_polynomial_features_pd.py b/gators/feature_generation/tests/test_polynomial_features_pd.py new file mode 100644 index 00000000..2f27329e --- /dev/null +++ b/gators/feature_generation/tests/test_polynomial_features_pd.py @@ -0,0 +1,136 @@ +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.polynomial_features import PolynomialFeatures + + +@pytest.fixture +def data_interaction(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + } + ) + obj = PolynomialFeatures(interaction_only=True, columns=["A", "B", "C"]).fit(X) + X_expected = pd.DataFrame( + np.array( + [ + [0.0, 1.0, 2.0, 0.0, 0.0, 2.0], + [3.0, 4.0, 5.0, 12.0, 15.0, 20.0], + [6.0, 7.0, 8.0, 42.0, 48.0, 56.0], + ] + ), + columns=["A", "B", "C", "A__x__B", "A__x__C", "B__x__C"], + ) + return obj, X, X_expected + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + }, + ) + obj = PolynomialFeatures(interaction_only=False, columns=["A", "B", "C"]).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + "A__x__A": [0.0, 9.0, 36.0], + "A__x__B": [0.0, 12.0, 42.0], + "A__x__C": [0.0, 15.0, 48.0], + "B__x__B": [1.0, 16.0, 49.0], + "B__x__C": [2.0, 20.0, 56.0], + "C__x__C": [4.0, 25.0, 64.0], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_degree1(): + X = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + }, + ) + obj = PolynomialFeatures( + degree=1, interaction_only=False, columns=["A", "B", "C"] + ).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 3.0, 6.0], + "B": [1.0, 4.0, 7.0], + "C": [2.0, 5.0, 8.0], + "D": ["a", "b", "c"], + } + ) + return obj, X, X_expected + + +def test_interaction_pd(data_interaction): + obj, X, X_expected = data_interaction + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_interaction_pd_np(data_interaction): + obj, X, X_expected = data_interaction + X_new = obj.transform_numpy(X.to_numpy()) + assert np.allclose(X_new, X_expected) + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_pd(data_degree1): + obj, X, X_expected = data_degree1 + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data_degree1): + obj, X, X_expected = data_degree1 + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = PolynomialFeatures(columns="A", degree=2, interaction_only=True) + with pytest.raises(ValueError): + _ = PolynomialFeatures(columns=["A"], degree=2, interaction_only=True) + with pytest.raises(TypeError): + _ = PolynomialFeatures(columns=["A"], degree=-1, interaction_only=False) + with pytest.raises(TypeError): + _ = PolynomialFeatures(columns=["A", "B"], degree=1.1, interaction_only=True) + with pytest.raises(TypeError): + _ = PolynomialFeatures(columns=["A", "B"], degree=2, interaction_only="x") + with pytest.raises(ValueError): + _ = PolynomialFeatures(columns=[], degree=2) diff --git a/gators/feature_generation/tests/test_polynomial_object_features_dd.py b/gators/feature_generation/tests/test_polynomial_object_features_dd.py new file mode 100644 index 00000000..35f10866 --- /dev/null +++ b/gators/feature_generation/tests/test_polynomial_object_features_dd.py @@ -0,0 +1,50 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.polynomial_object_features import ( + PolynomialObjectFeatures, +) + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + {"A": [None, "b", "c"], "B": ["z", "a", "a"], "C": ["c", "d", "d"]} + ), + npartitions=1, + ) + X_np = pd.DataFrame( + {"A": [None, "b", "c"], "B": ["z", "a", "a"], "C": ["c", "d", "d"]} + ).to_numpy() + X_expected = pd.DataFrame( + { + "A": [None, "b", "c"], + "B": ["z", "a", "a"], + "C": ["c", "d", "d"], + "A__x__B": ["z", "ba", "ca"], + "A__x__C": ["c", "bd", "cd"], + "B__x__C": ["zc", "ad", "ad"], + "A__x__B__x__C": ["zc", "bad", "cad"], + } + ) + obj = PolynomialObjectFeatures(columns=["A", "B", "C"], degree=3).fit(X) + return obj, X, X_np, X_expected + + +def test_dd(data): + obj, X, _, X_expected = data + X_new = obj.transform(X).compute() + X_new = X_new.astype(object) + assert_frame_equal(X_new.iloc[:, -3:], X_expected.iloc[:, -3:]) + + +def test_dd_np(data): + obj, X, X_np, X_expected = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_polynomial_object_features_ks.py b/gators/feature_generation/tests/test_polynomial_object_features_ks.py new file mode 100644 index 00000000..1f474ca9 --- /dev/null +++ b/gators/feature_generation/tests/test_polynomial_object_features_ks.py @@ -0,0 +1,47 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.polynomial_object_features import ( + PolynomialObjectFeatures, +) + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + {"A": [None, "b", "c"], "B": ["z", "a", "a"], "C": ["c", "d", "d"]} + ) + X_expected = pd.DataFrame( + { + "A": [None, "b", "c"], + "B": ["z", "a", "a"], + "C": ["c", "d", "d"], + "A__x__B": ["z", "ba", "ca"], + "A__x__C": ["c", "bd", "cd"], + "B__x__C": ["zc", "ad", "ad"], + "A__x__B__x__C": ["zc", "bad", "cad"], + } + ) + obj = PolynomialObjectFeatures(columns=["A", "B", "C"], degree=3).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas().iloc[:, -3:], X_expected.iloc[:, -3:]) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation/tests/test_polynomial_object_features_pd.py b/gators/feature_generation/tests/test_polynomial_object_features_pd.py new file mode 100644 index 00000000..bb338e06 --- /dev/null +++ b/gators/feature_generation/tests/test_polynomial_object_features_pd.py @@ -0,0 +1,83 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation.polynomial_object_features import ( + PolynomialObjectFeatures, +) + + +@pytest.fixture +def data(): + X = pd.DataFrame( + {"A": [None, "b", "c"], "B": ["z", "a", "a"], "C": ["c", "d", "d"]} + ) + X_expected = pd.DataFrame( + { + "A": [None, "b", "c"], + "B": ["z", "a", "a"], + "C": ["c", "d", "d"], + "A__x__B": ["z", "ba", "ca"], + "A__x__C": ["c", "bd", "cd"], + "B__x__C": ["zc", "ad", "ad"], + "A__x__B__x__C": ["zc", "bad", "cad"], + } + ) + obj = PolynomialObjectFeatures(columns=["A", "B", "C"], degree=3).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_degree1(): + X = pd.DataFrame( + {"A": [None, "b", "c"], "B": ["z", "a", "a"], "C": ["c", "d", "d"]} + ) + X_expected = pd.DataFrame( + { + "A": [None, "b", "c"], + "B": ["z", "a", "a"], + "C": ["c", "d", "d"], + } + ) + obj = PolynomialObjectFeatures(columns=["A", "B", "C"], degree=1).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_pd(data_degree1): + obj, X, X_expected = data_degree1 + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data_degree1): + obj, X, X_expected = data_degree1 + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected.values) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = PolynomialObjectFeatures(columns="A", degree=2) + with pytest.raises(ValueError): + _ = PolynomialObjectFeatures(columns=["A"], degree=-1) + with pytest.raises(TypeError): + _ = PolynomialObjectFeatures(columns=["A", "B"], degree=1.1) + with pytest.raises(ValueError): + _ = PolynomialObjectFeatures(columns=[], degree=2) diff --git a/gators/feature_generation_dt/__pycache__/__init__.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/__init__.cpython-38.pyc index 5b4f1890..55aa8103 100644 Binary files a/gators/feature_generation_dt/__pycache__/__init__.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/_base_datetime_feature.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/_base_datetime_feature.cpython-38.pyc index ccd2cf5f..316f5fde 100644 Binary files a/gators/feature_generation_dt/__pycache__/_base_datetime_feature.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/_base_datetime_feature.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/cyclic_day_of_month.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/cyclic_day_of_month.cpython-38.pyc index 1600e6b0..1bd4ef39 100644 Binary files a/gators/feature_generation_dt/__pycache__/cyclic_day_of_month.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/cyclic_day_of_month.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/cyclic_day_of_week.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/cyclic_day_of_week.cpython-38.pyc index d351ecef..c04add45 100644 Binary files a/gators/feature_generation_dt/__pycache__/cyclic_day_of_week.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/cyclic_day_of_week.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/cyclic_hour_of_day.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/cyclic_hour_of_day.cpython-38.pyc index 8859a5b9..59f55599 100644 Binary files a/gators/feature_generation_dt/__pycache__/cyclic_hour_of_day.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/cyclic_hour_of_day.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/cyclic_minute_of_hour.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/cyclic_minute_of_hour.cpython-38.pyc index 23ad4d28..6483897f 100644 Binary files a/gators/feature_generation_dt/__pycache__/cyclic_minute_of_hour.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/cyclic_minute_of_hour.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/cyclic_month_of_year.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/cyclic_month_of_year.cpython-38.pyc index 1174880a..a87502c5 100644 Binary files a/gators/feature_generation_dt/__pycache__/cyclic_month_of_year.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/cyclic_month_of_year.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/delta_time.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/delta_time.cpython-38.pyc index 9a27820d..3e11b24c 100644 Binary files a/gators/feature_generation_dt/__pycache__/delta_time.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/delta_time.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/ordinal_day_of_month.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/ordinal_day_of_month.cpython-38.pyc index 501ae974..31aa66ad 100644 Binary files a/gators/feature_generation_dt/__pycache__/ordinal_day_of_month.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/ordinal_day_of_month.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/ordinal_day_of_week.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/ordinal_day_of_week.cpython-38.pyc index b7983843..6112919a 100644 Binary files a/gators/feature_generation_dt/__pycache__/ordinal_day_of_week.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/ordinal_day_of_week.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/ordinal_hour_of_day.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/ordinal_hour_of_day.cpython-38.pyc index 8ab69845..bb7e7bf5 100644 Binary files a/gators/feature_generation_dt/__pycache__/ordinal_hour_of_day.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/ordinal_hour_of_day.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/ordinal_minute_of_hour.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/ordinal_minute_of_hour.cpython-38.pyc index 25bfcd87..4f8bdf3f 100644 Binary files a/gators/feature_generation_dt/__pycache__/ordinal_minute_of_hour.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/ordinal_minute_of_hour.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/__pycache__/ordinal_month_of_year.cpython-38.pyc b/gators/feature_generation_dt/__pycache__/ordinal_month_of_year.cpython-38.pyc index 6ca78e51..d0535634 100644 Binary files a/gators/feature_generation_dt/__pycache__/ordinal_month_of_year.cpython-38.pyc and b/gators/feature_generation_dt/__pycache__/ordinal_month_of_year.cpython-38.pyc differ diff --git a/gators/feature_generation_dt/_base_datetime_feature.py b/gators/feature_generation_dt/_base_datetime_feature.py index 5be262a4..819590f3 100644 --- a/gators/feature_generation_dt/_base_datetime_feature.py +++ b/gators/feature_generation_dt/_base_datetime_feature.py @@ -1,62 +1,60 @@ # Licence Apache-2.0 -from typing import Dict, List, Union -import databricks.koalas as ks +from typing import List, Tuple + import numpy as np -import pandas as pd from ..transformers.transformer import Transformer from ..util import util +from gators import DataFrame, Series + class _BaseDatetimeFeature(Transformer): """Base datetime transformer class. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - column_names : List[str], default to None. + column_names : List[str], default None. List of column names. - column_mapping: Dict[str, List[str]] - Mapping between generated features and base features. - """ def __init__( self, columns: List[str], + date_format: str, column_names: List[str], - column_mapping: Dict[str, str], ): + if not isinstance(date_format, str): + raise TypeError("`date_format` should be a string.") + if sorted(list(date_format)) != ["d", "m", "y"]: + raise ValueError( + "`date_format` should be a string composed of the letters `d`, `m` and `y`." + ) Transformer.__init__(self) self.columns = columns self.column_names = column_names - self.column_mapping = column_mapping - self.idx_columns: np.ndarray = np.array([]) - self.n_columns = len(self.columns) + self.date_format = date_format - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "_BaseDatetimeFeature": + def fit(self, X: DataFrame, y: Series = None) -> "Transformer": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : pd.DataFrame + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. + y : Series, default None. Target values. Returns ------- - _BaseDatetimeFeature + self : Transformer Instance of itself. """ self.check_dataframe(X) - X_datetime_dtype = X.iloc[:100][self.columns].dtypes + X_datetime_dtype = X[self.columns].dtypes for column in self.columns: if not np.issubdtype(X_datetime_dtype[column], np.datetime64): raise TypeError( @@ -69,6 +67,10 @@ def fit( columns=X.columns, selected_columns=self.columns, ) + self.n_columns = len(self.columns) + self.idx_day_bounds, self.idx_month_bounds, self.idx_year_bounds = self.get_idx( + self.date_format + ) return self @staticmethod @@ -77,7 +79,7 @@ def get_cyclic_column_names(columns: List[str], pattern: str): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of datetime features. pattern: str Pattern. @@ -87,3 +89,38 @@ def get_cyclic_column_names(columns: List[str], pattern: str): column_names.append(f"{c}__{pattern}_cos") column_names.append(f"{c}__{pattern}_sin") return column_names + + @staticmethod + def get_idx(date_format: str) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """[summary] + + Parameters + ---------- + date_format : str + Datetime format + + Returns + ------- + idx_day_bounds : np.ndarray + Start and end indices of the day. + + idx_month : np.ndarray + Start and end indices of the month. + + idx_year_bounds : np.ndarray + Start and end indices of the year. + """ + idx_start_day = 3 * date_format.index("d") + idx_start_month = 3 * date_format.index("m") + idx_start_year = 3 * date_format.index("y") + idx_start_day = ( + idx_start_day if idx_start_year > idx_start_day else idx_start_day + 2 + ) + idx_start_month = ( + idx_start_month if idx_start_year > idx_start_month else idx_start_month + 2 + ) + + idx_day_bounds = np.array([idx_start_day, idx_start_day + 2]) + idx_month = np.array([idx_start_month, idx_start_month + 2]) + idx_year_bounds = np.array([idx_start_year, idx_start_year + 4]) + return idx_day_bounds, idx_month, idx_year_bounds diff --git a/gators/feature_generation_dt/cyclic_day_of_month.py b/gators/feature_generation_dt/cyclic_day_of_month.py index 2828dc7b..9d98a848 100644 --- a/gators/feature_generation_dt/cyclic_day_of_month.py +++ b/gators/feature_generation_dt/cyclic_day_of_month.py @@ -1,10 +1,8 @@ # Licence Apache-2.0 from math import pi -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt @@ -13,6 +11,9 @@ TWO_PI = 2 * pi +from gators import DataFrame + + class CyclicDayOfMonth(_BaseDatetimeFeature): """Create new columns based on the cyclic mapping of the day of the month. @@ -23,91 +24,77 @@ class CyclicDayOfMonth(_BaseDatetimeFeature): Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = CyclicDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month_cos A__day_of_month_sin - 0 2020-01-01 23:00:00 0 1.000000 0.000000 - 1 2020-12-15 18:00:00 1 -0.978148 0.207912 - 2 NaT 0 NaN NaN - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) >>> obj.fit_transform(X) A B A__day_of_month_cos A__day_of_month_sin 0 2020-01-01 23:00:00 0 1.000000 0.000000 - 1 2020-12-15 18:00:00 1 -0.978148 0.207912 + 1 2020-12-15 18:00:00 1 -0.954139 0.299363 2 NaT 0 NaN NaN - * fit & transform with `pandas` - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338057, - 0.2079116908177593], + [Timestamp('2020-12-15 18:00:00'), 1, -0.9541392564000488, + 0.299363122973358], [NaT, 0, nan, nan]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfMonth(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, -0.9781476007338057, - 0.2079116908177593], - [NaT, 0, nan, nan]], dtype=object) - - """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = self.get_cyclic_column_names(columns, "day_of_month") - column_mapping = { - name: col for name, col in zip(column_names, columns + columns) - } - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) + + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return self.compute_cyclic_day_of_month(X, self.columns, self.column_names) + return self.compute_cyclic_day_of_month(X) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -116,63 +103,34 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return feature_gen_dt.cyclic_day_of_month(X, self.idx_columns) - - @staticmethod - def compute_cyclic_day_of_month( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: + X_new = feature_gen_dt.cyclic_day_of_month( + X[:, self.idx_columns], self.idx_day_bounds + ) + return np.concatenate([X, X_new], axis=1) + + def compute_cyclic_day_of_month(self, X: DataFrame) -> DataFrame: """Compute the cyclic day of the month features. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. + X : DataFrame + Dataframe. of datetime columns. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Dataframe of cyclic day of the month features. """ - def f_cos(x): - day_of_month = x.dt.day - 1 - n_days_in_month = x.dt.daysinmonth - 1 - prefactors = 2 * np.pi / n_days_in_month - return np.cos(prefactors * day_of_month) - - def f_sin(x): - day_of_month = x.dt.day - 1 - n_days_in_month = x.dt.daysinmonth - 1 - prefactors = 2 * np.pi / n_days_in_month - return np.sin(prefactors * day_of_month) - - if isinstance(X, pd.DataFrame): - for i, col in enumerate(columns): - X_cos = X[[col]].apply(f_cos) - X_cos.columns = [column_names[2 * i]] - X_sin = X[[col]].apply(f_sin) - X_sin.columns = [column_names[2 * i + 1]] - X = X.join(X_cos.join(X_sin)) - return X - - for i, col in enumerate(columns): - n_days_in_month = X[col].dt.daysinmonth - 1 + for i, c in enumerate(self.columns): + day_of_month = X[c].dt.day - 1 + n_days_in_month = X[c].dt.daysinmonth prefactors = 2 * np.pi / n_days_in_month - X = X.assign( - dummy_cos=np.cos(prefactors * (X[col].dt.day - 1.0)), - dummy_sin=np.sin(prefactors * (X[col].dt.day - 1.0)), - ).rename( - columns={ - "dummy_cos": column_names[2 * i], - "dummy_sin": column_names[2 * i + 1], - } - ) + X[self.column_names[2 * i]] = np.cos(prefactors * day_of_month) + X[self.column_names[2 * i + 1]] = np.sin(prefactors * day_of_month) return X diff --git a/gators/feature_generation_dt/cyclic_day_of_week.py b/gators/feature_generation_dt/cyclic_day_of_week.py index 3c586d42..05615f1a 100644 --- a/gators/feature_generation_dt/cyclic_day_of_week.py +++ b/gators/feature_generation_dt/cyclic_day_of_week.py @@ -1,16 +1,14 @@ # Licence Apache-2.0 from math import pi -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature -PREFACTOR = 2 * pi / 6.0 +from gators import DataFrame class CyclicDayOfWeek(_BaseDatetimeFeature): @@ -18,96 +16,85 @@ class CyclicDayOfWeek(_BaseDatetimeFeature): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = CyclicDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week_cos A__day_of_week_sin - 0 2020-01-01 23:00:00 0 -0.5 0.866025 - 1 2020-12-15 18:00:00 1 0.5 0.866025 - 2 NaT 0 NaN NaN - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) >>> obj.fit_transform(X) A B A__day_of_week_cos A__day_of_week_sin - 0 2020-01-01 23:00:00 0 -0.5 0.866025 - 1 2020-12-15 18:00:00 1 0.5 0.866025 + 0 2020-01-01 23:00:00 0 -0.222521 0.974928 + 1 2020-12-15 18:00:00 1 0.623490 0.781831 2 NaT 0 NaN NaN - * fit & transform with `pandas` - >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, - 0.8660254037844388], - [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, - 0.8660254037844386], + array([[Timestamp('2020-01-01 23:00:00'), 0, -0.22252093395631434, + 0.9749279121818236], + [Timestamp('2020-12-15 18:00:00'), 1, 0.6234898018587336, + 0.7818314824680297], [NaT, 0, nan, nan]], dtype=object) - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicDayOfWeek(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, -0.4999999999999998, - 0.8660254037844388], - [Timestamp('2020-12-15 18:00:00'), 1, 0.5000000000000001, - 0.8660254037844386], - [NaT, 0, nan, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = self.get_cyclic_column_names(columns, "day_of_week") - column_mapping = { - name: col for name, col in zip(column_names, columns + columns) - } - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + self.prefactor = 2 * pi / 7.0 + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) + + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return self.compute_cyclic_day_of_week(X, self.columns, self.column_names) + return self.compute_cyclic_day_of_week(X, self.prefactor) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -116,48 +103,34 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return feature_gen_dt.cyclic_day_of_week(X, self.idx_columns, PREFACTOR) - - @staticmethod - def compute_cyclic_day_of_week( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: + X_new = feature_gen_dt.cyclic_day_of_week( + X[:, self.idx_columns], self.prefactor + ) + return np.concatenate([X, X_new], axis=1) + + def compute_cyclic_day_of_week(self, X: DataFrame, prefactor: float) -> DataFrame: """Compute the cyclic day of the week features. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. - columns: str - List of datetime columns. - column_names: str - List of datetime column names. + X : DataFrame + Dataframe. of datetime columns + + prefactor: float + Prefactor. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Dataframe of cyclic day of the week features. """ - if isinstance(X, pd.DataFrame): - dummy = X[columns].apply(lambda x: PREFACTOR * x.dt.dayofweek) - X_cyclic = dummy.agg(["cos", "sin"]) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * X[col].dt.dayofweek), - dummy_sin=np.sin(PREFACTOR * X[col].dt.dayofweek), - ).rename( - columns={ - "dummy_cos": column_names[2 * i], - "dummy_sin": column_names[2 * i + 1], - } - ) + + for i, c in enumerate(self.columns): + dayofweek = X[c].dt.dayofweek + X[self.column_names[2 * i]] = np.cos(prefactor * dayofweek) + X[self.column_names[2 * i + 1]] = np.sin(prefactor * dayofweek) return X diff --git a/gators/feature_generation_dt/cyclic_hour_of_day.py b/gators/feature_generation_dt/cyclic_hour_of_day.py index 49650330..ed072a84 100644 --- a/gators/feature_generation_dt/cyclic_hour_of_day.py +++ b/gators/feature_generation_dt/cyclic_hour_of_day.py @@ -1,16 +1,14 @@ # Licence Apache-2.0 from math import pi -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature -PREFACTOR = 2 * pi / 23.0 +from gators import DataFrame class CyclicHourOfDay(_BaseDatetimeFeature): @@ -18,98 +16,84 @@ class CyclicHourOfDay(_BaseDatetimeFeature): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = CyclicHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day_cos A__hour_of_day_sin - 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 - 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 - 2 NaT 0 NaN NaN - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day_cos A__hour_of_day_sin - 0 2020-01-01 23:00:00 0 1.000000 -2.449294e-16 - 1 2020-12-15 18:00:00 1 0.203456 -9.790841e-01 - 2 NaT 0 NaN NaN + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `pandas` & transform with `NumPy` + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, - -2.4492935982947064e-16], - [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, - -0.979084087682323], - [NaT, 0, nan, nan]], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicHourOfDay(columns=['A']) + >>> obj.fit_transform(X) + A B A__hour_of_day_cos A__hour_of_day_sin + 0 2020-01-01 23:00:00 0 9.659258e-01 -0.258819 + 1 2020-12-15 18:00:00 1 -1.836970e-16 -1.000000 + 2 NaT 0 NaN NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, - -2.4492935982947064e-16], - [Timestamp('2020-12-15 18:00:00'), 1, 0.20345601305263328, - -0.979084087682323], + array([[Timestamp('2020-01-01 23:00:00'), 0, 0.9659258262890681, + -0.2588190451025215], + [Timestamp('2020-12-15 18:00:00'), 1, -1.8369701987210297e-16, + -1.0], [NaT, 0, nan, nan]], dtype=object) - """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = self.get_cyclic_column_names(columns, "hour_of_day") - column_mapping = { - name: col for name, col in zip(column_names, columns + columns) - } - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + self.prefactor = 2 * pi / 24.0 + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) + + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return self.compute_cyclic_hour_of_day(X, self.columns, self.column_names) + return self.compute_cyclic_hour_of_day(X, self.prefactor) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -118,45 +102,33 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return feature_gen_dt.cyclic_hour_of_day(X, self.idx_columns, PREFACTOR) - - @staticmethod - def compute_cyclic_hour_of_day( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: + X_new = feature_gen_dt.cyclic_hour_of_day( + X[:, self.idx_columns], self.prefactor + ) + return np.concatenate([X, X_new], axis=1) + + def compute_cyclic_hour_of_day(self, X: DataFrame, prefactor: float) -> DataFrame: """Compute the cyclic hours of the day features. Parameters ---------- - X_datetime : Union[pd.DataFrame, ks.DataFrame] + X_datetime : DataFrame Dataframe of datetime columns. + prefactor : float + Prefactor. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Dataframe of cyclic hours of the day features. """ - if isinstance(X, pd.DataFrame): - X_cyclic = ( - X[columns].apply(lambda x: PREFACTOR * x.dt.hour).agg(["cos", "sin"]) - ) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * X[col].dt.hour), - dummy_sin=np.sin(PREFACTOR * X[col].dt.hour), - ).rename( - columns={ - "dummy_cos": column_names[2 * i], - "dummy_sin": column_names[2 * i + 1], - } - ) + + for i, c in enumerate(self.columns): + hour = X[c].dt.hour + X[self.column_names[2 * i]] = np.cos(prefactor * hour) + X[self.column_names[2 * i + 1]] = np.sin(prefactor * hour) return X diff --git a/gators/feature_generation_dt/cyclic_minute_of_hour.py b/gators/feature_generation_dt/cyclic_minute_of_hour.py index df0eddf2..c3dc4bba 100644 --- a/gators/feature_generation_dt/cyclic_minute_of_hour.py +++ b/gators/feature_generation_dt/cyclic_minute_of_hour.py @@ -1,16 +1,14 @@ # Licence Apache-2.0 from math import pi -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature -PREFACTOR = 2 * pi / 59.0 +from gators import DataFrame class CyclicMinuteOfHour(_BaseDatetimeFeature): @@ -18,99 +16,83 @@ class CyclicMinuteOfHour(_BaseDatetimeFeature): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = pd.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour_cos A__minute_of_hour_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour_cos A__minute_of_hour_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:59:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `pandas` & transform with `NumPy` + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = pd.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:59:00'), 1, 1.0, - -2.4492935982947064e-16], - [NaT, 0, nan, nan]], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMinuteOfHour(columns=['A']) + >>> obj.fit_transform(X) + A B A__minute_of_hour_cos A__minute_of_hour_sin + 0 2020-01-01 23:00:00 0 1.000000 0.000000 + 1 2020-12-15 18:59:00 1 0.994522 -0.104528 + 2 NaT 0 NaN NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:59:00'), 1, 1.0, - -2.4492935982947064e-16], + [Timestamp('2020-12-15 18:59:00'), 1, 0.9945218953682733, + -0.1045284632676543], [NaT, 0, nan, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = self.get_cyclic_column_names(columns, "minute_of_hour") - column_mapping = { - name: col for name, col in zip(column_names, columns + columns) - } - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + self.prefactor = 2 * pi / 60.0 + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) + + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return self.compute_cyclic_minute_of_hour(X, self.columns, self.column_names) + return self.compute_cyclic_minute_of_hour(X, self.prefactor) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -119,45 +101,34 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return feature_gen_dt.cyclic_minute_of_hour(X, self.idx_columns, PREFACTOR) + X_new = feature_gen_dt.cyclic_minute_of_hour( + X[:, self.idx_columns], self.prefactor + ) + return np.concatenate([X, X_new], axis=1) - @staticmethod def compute_cyclic_minute_of_hour( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: + self, X: DataFrame, prefactor: float + ) -> DataFrame: """Compute the cyclic hours of the day features. Parameters ---------- - X_datetime : Union[pd.DataFrame, ks.DataFrame] + X_datetime : DataFrame Dataframe of datetime columns. + prefactor: float + Prefactor. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Dataframe of cyclic hours of the day features. """ - if isinstance(X, pd.DataFrame): - X_cyclic = ( - X[columns].apply(lambda x: PREFACTOR * x.dt.minute).agg(["cos", "sin"]) - ) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * X[col].dt.minute), - dummy_sin=np.sin(PREFACTOR * X[col].dt.minute), - ).rename( - columns={ - "dummy_cos": column_names[2 * i], - "dummy_sin": column_names[2 * i + 1], - } - ) + for i, c in enumerate(self.columns): + minute = X[c].dt.minute + X[self.column_names[2 * i]] = np.cos(prefactor * minute) + X[self.column_names[2 * i + 1]] = np.sin(prefactor * minute) return X diff --git a/gators/feature_generation_dt/cyclic_month_of_year.py b/gators/feature_generation_dt/cyclic_month_of_year.py index 92f2bedb..2b6a9e97 100644 --- a/gators/feature_generation_dt/cyclic_month_of_year.py +++ b/gators/feature_generation_dt/cyclic_month_of_year.py @@ -1,16 +1,14 @@ # Licence Apache-2.0 from math import pi -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature -PREFACTOR = 2 * pi / 11.0 +from gators import DataFrame class CyclicMonthOfYear(_BaseDatetimeFeature): @@ -18,95 +16,82 @@ class CyclicMonthOfYear(_BaseDatetimeFeature): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = CyclicMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year_cos A__month_of_year_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year_cos A__month_of_year_sin - 0 2020-01-01 23:00:00 0 1.0 0.000000e+00 - 1 2020-12-15 18:00:00 1 1.0 -2.449294e-16 - 2 NaT 0 NaN NaN + * `dask` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, 1.0, - -2.4492935982947064e-16], - [NaT, 0, nan, nan]], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import CyclicMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = CyclicMonthOfYear(columns=['A']) + >>> obj.fit_transform(X) + A B A__month_of_year_cos A__month_of_year_sin + 0 2020-01-01 23:00:00 0 1.000000 0.0 + 1 2020-12-15 18:00:00 1 0.866025 -0.5 + 2 NaT 0 NaN NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0, 0.0], - [Timestamp('2020-12-15 18:00:00'), 1, 1.0, - -2.4492935982947064e-16], + [Timestamp('2020-12-15 18:00:00'), 1, 0.8660254037844384, + -0.5000000000000004], [NaT, 0, nan, nan]], dtype=object) - - """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = self.get_cyclic_column_names(columns, "month_of_year") - column_mapping = { - name: col for name, col in zip(column_names, columns + columns) - } - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + self.prefactor = 2 * pi / 12.0 + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) + + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - return self.compute_cyclic_month_of_year(X, self.columns, self.column_names) + return self.compute_cyclic_month_of_year(X, self.prefactor) def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -115,47 +100,32 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return feature_gen_dt.cyclic_month_of_year(X, self.idx_columns, PREFACTOR) - - @staticmethod - def compute_cyclic_month_of_year( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - column_names: List[str], - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Compute the cyclic hours of the day features. + X_new = feature_gen_dt.cyclic_month_of_year( + X[:, self.idx_columns], self.idx_month_bounds, self.prefactor + ) + return np.concatenate([X, X_new], axis=1) - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe of datetime columns. + def compute_cyclic_month_of_year(self, X: DataFrame, prefactor: float) -> DataFrame: + """Compute the cyclic hours of the day features. - column_names : List[str], default to None. - List of column names. + Parameters + ---------- + X : DataFrame + Dataframe of datetime columns. + prefactor : float. + Prefactor. - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Dataframe of cyclic hours of the day features. + Returns + ------- + X : DataFrame + Dataframe of cyclic hours of the day features. """ - if isinstance(X, pd.DataFrame): - dummy = X[columns].apply(lambda x: PREFACTOR * (x.dt.month - 1.0)) - X_cyclic = dummy.agg(["cos", "sin"]) - X_cyclic.columns = column_names - return X.join(X_cyclic) - - for i, col in enumerate(columns): - X = X.assign( - dummy_cos=np.cos(PREFACTOR * (X[col].dt.month - 1.0)), - dummy_sin=np.sin(PREFACTOR * (X[col].dt.month - 1.0)), - ).rename( - columns={ - "dummy_cos": column_names[2 * i], - "dummy_sin": column_names[2 * i + 1], - } - ) + for i, c in enumerate(self.columns): + month = X[c].dt.month - 1 + X[self.column_names[2 * i]] = np.cos(prefactor * month) + X[self.column_names[2 * i + 1]] = np.sin(prefactor * month) return X diff --git a/gators/feature_generation_dt/delta_time.py b/gators/feature_generation_dt/delta_time.py index e41d7dbe..686f517a 100644 --- a/gators/feature_generation_dt/delta_time.py +++ b/gators/feature_generation_dt/delta_time.py @@ -1,101 +1,91 @@ # Licence Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ..transformers import Transformer from ..util import util +from gators import DataFrame, Series + class DeltaTime(Transformer): """Create new columns based on the time difference in sec. between two columns. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation_dt import DeltaTime - >>> X = pd.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], - ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> obj.fit_transform(X) - A B C C__A__Deltatime[s] - 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 - 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 - 2 NaT 0 NaT NaN - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import DeltaTime - >>> X = ks.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({ + ... 'A': ['2020-01-01T23', '2020-01-02T00', None], ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> obj.fit_transform(X) - A B C C__A__Deltatime[s] - 0 2020-01-01 23:00:00 0 2020-01-02 05:00:00 21600.0 - 1 2020-01-15 18:00:00 1 2020-01-15 23:00:00 18000.0 - 2 NaT 0 NaT NaN + ... 'C': ['2020-01-15T23', '2020-01-03T05', None]}), npartitions=1) + >>> X[['A', 'C']] = X[['A', 'C']].astype('datetime64[ns]') + + * `koalas` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': ['2020-01-01T23', '2020-01-02T00', None], + ... 'B': [0, 1, 0], + ... 'C': ['2020-01-15T23', '2020-01-03T05', None]}) + >>> X[['A', 'C']] = X[['A', 'C']].astype('datetime64[ns]') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import DeltaTime >>> X = pd.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], + ... 'A': ['2020-01-01T23', '2020-01-02T00', None], ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, - Timestamp('2020-01-02 05:00:00'), 21600.0], - [Timestamp('2020-01-15 18:00:00'), 1, - Timestamp('2020-01-15 23:00:00'), 18000.0], - [NaT, 0, NaT, nan]], dtype=object) + ... 'C': ['2020-01-15T23', '2020-01-03T05', None]}) + >>> X[['A', 'C']] = X[['A', 'C']].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import DeltaTime - >>> X = ks.DataFrame({ - ... 'A': ['2020-01-01T23', '2020-01-15T18', pd.NaT], + >>> obj.fit_transform(X) + A B C C__A__Deltatime[s] + 0 2020-01-01 23:00:00 0 2020-01-15 23:00:00 1209600.0 + 1 2020-01-02 00:00:00 1 2020-01-03 05:00:00 104400.0 + 2 NaT 0 NaT NaN + + >>> X = pd.DataFrame({ + ... 'A': ['2020-01-01T23', '2020-01-02T00', None], ... 'B': [0, 1, 0], - ... 'C': ['2020-01-02T05', '2020-01-15T23', pd.NaT]}) - >>> obj = DeltaTime(columns_a=['C'], columns_b=['A']) + ... 'C': ['2020-01-15T23', '2020-01-03T05', None]}) + >>> X[['A', 'C']] = X[['A', 'C']].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[Timestamp('2020-01-01 23:00:00'), 0, - Timestamp('2020-01-02 05:00:00'), 21600.0], - [Timestamp('2020-01-15 18:00:00'), 1, - Timestamp('2020-01-15 23:00:00'), 18000.0], + Timestamp('2020-01-15 23:00:00'), 1209600.0], + [Timestamp('2020-01-02 00:00:00'), 1, + Timestamp('2020-01-03 05:00:00'), 104400.0], [NaT, 0, NaT, nan]], dtype=object) - - - """ def __init__(self, columns_a: List[str], columns_b: List[str]): Transformer.__init__(self) - if not isinstance(columns_a, list): + if not isinstance(columns_a, (list, np.ndarray)): raise TypeError("`columns_a` should be a list.") if not columns_a: raise ValueError("`columns_a` should not be empty.") - if not isinstance(columns_b, list): + if not isinstance(columns_b, (list, np.ndarray)): raise TypeError("`columns_b` should be a list.") if not columns_b: raise ValueError("`columns_b` should not be empty.") @@ -109,33 +99,26 @@ def __init__(self, columns_a: List[str], columns_b: List[str]): f"{c_a}__{c_b}__Deltatime[{self.unit}]" for c_a, c_b in zip(columns_a, columns_b) ] - self.column_mapping = { - name: [c_a, c_b] - for name, c_a, c_b in zip(self.column_names, columns_a, columns_b) - } - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "DeltaTime": + + def fit(self, X: DataFrame, y: Series = None) -> "DeltaTime": """Fit the transformer on the dataframe `X`. Parameters ---------- X : pd.DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. + y : Series, default None. Target values. Returns ------- - DeltaTime + self : DeltaTime Instance of itself. """ self.check_dataframe(X) columns = list(set(self.columns_a + self.columns_b)) - X_datetime_dtype = X.iloc[:5000][columns].dtypes + columns = [c for c in X.columns if c in columns] + X_datetime_dtype = X.dtypes for column in columns: if not np.issubdtype(X_datetime_dtype[column], np.datetime64): raise TypeError( @@ -144,46 +127,41 @@ def fit( Use `ConvertColumnDatatype` to convert the dtype. """ ) - self.idx_columns_a = util.get_idx_columns( + self.idx_columns = util.get_idx_columns( columns=X.columns, + selected_columns=columns, + ) + self.idx_columns_a = util.get_idx_columns( + columns=columns, selected_columns=self.columns_a, ) self.idx_columns_b = util.get_idx_columns( - columns=X.columns, + columns=columns, selected_columns=self.columns_b, ) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - for name, c_a, c_b in zip( - self.column_names, self.columns_a, self.columns_b - ): - X.loc[:, name] = (X[c_a] - X[c_b]).astype(self.deltatime_dtype) - return X - for name, c_a, c_b in zip(self.column_names, self.columns_a, self.columns_b): - X = X.assign(dummy=(X[c_a].astype(float) - X[c_b].astype(float))).rename( - columns={"dummy": name} - ) + X = util.get_function(X).delta_time( + X, self.column_names, self.columns_a, self.columns_b, self.deltatime_dtype + ) return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- @@ -192,8 +170,11 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: - Array with the datetime features added. + X : np.ndarray: + Transformed array. """ self.check_array(X) - return feature_gen_dt.deltatime(X, self.idx_columns_a, self.idx_columns_b) + X_new = feature_gen_dt.deltatime( + X[:, self.idx_columns], self.idx_columns_a, self.idx_columns_b + ) + return np.concatenate([X, X_new], axis=1) diff --git a/gators/feature_generation_dt/feature_gen_dt.c b/gators/feature_generation_dt/feature_gen_dt.c new file mode 100644 index 00000000..16f8c7f2 --- /dev/null +++ b/gators/feature_generation_dt/feature_gen_dt.c @@ -0,0 +1,15867 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "feature_gen_dt", + "sources": [ + "gators/feature_generation_dt/feature_gen_dt.pyx" + ] + }, + "module_name": "feature_gen_dt" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__feature_gen_dt +#define __PYX_HAVE_API__feature_gen_dt +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/feature_generation_dt/feature_gen_dt.pyx", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* pybytes_as_double.proto */ +static double __Pyx_SlowPyString_AsDouble(PyObject *obj); +static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length); +static CYTHON_INLINE double __Pyx_PyBytes_AsDouble(PyObject *obj) { + char* as_c_string; + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + as_c_string = PyBytes_AS_STRING(obj); + size = PyBytes_GET_SIZE(obj); +#else + if (PyBytes_AsStringAndSize(obj, &as_c_string, &size) < 0) { + return (double)-1; + } +#endif + return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); +} +static CYTHON_INLINE double __Pyx_PyByteArray_AsDouble(PyObject *obj) { + char* as_c_string; + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + as_c_string = PyByteArray_AS_STRING(obj); + size = PyByteArray_GET_SIZE(obj); +#else + as_c_string = PyByteArray_AsString(obj); + if (as_c_string == NULL) { + return (double)-1; + } + size = PyByteArray_Size(obj); +#endif + return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); +} + +/* pyunicode_as_double.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS +static const char* __Pyx__PyUnicode_AsDouble_Copy(const void* data, const int kind, char* buffer, Py_ssize_t start, Py_ssize_t end) { + int last_was_punctuation; + Py_ssize_t i; + last_was_punctuation = 1; + for (i=start; i <= end; i++) { + Py_UCS4 chr = PyUnicode_READ(kind, data, i); + int is_punctuation = (chr == '_') | (chr == '.'); + *buffer = (char)chr; + buffer += (chr != '_'); + if (unlikely(chr > 127)) goto parse_failure; + if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; + last_was_punctuation = is_punctuation; + } + if (unlikely(last_was_punctuation)) goto parse_failure; + *buffer = '\0'; + return buffer; +parse_failure: + return NULL; +} +static double __Pyx__PyUnicode_AsDouble_inf_nan(const void* data, int kind, Py_ssize_t start, Py_ssize_t length) { + int matches = 1; + Py_UCS4 chr; + Py_UCS4 sign = PyUnicode_READ(kind, data, start); + int is_signed = (sign == '-') | (sign == '+'); + start += is_signed; + length -= is_signed; + switch (PyUnicode_READ(kind, data, start)) { + #ifdef Py_NAN + case 'n': + case 'N': + if (unlikely(length != 3)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+1); + matches &= (chr == 'a') | (chr == 'A'); + chr = PyUnicode_READ(kind, data, start+2); + matches &= (chr == 'n') | (chr == 'N'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_NAN : Py_NAN; + #endif + case 'i': + case 'I': + if (unlikely(length < 3)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+1); + matches &= (chr == 'n') | (chr == 'N'); + chr = PyUnicode_READ(kind, data, start+2); + matches &= (chr == 'f') | (chr == 'F'); + if (likely(length == 3 && matches)) + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + if (unlikely(length != 8)) goto parse_failure; + chr = PyUnicode_READ(kind, data, start+3); + matches &= (chr == 'i') | (chr == 'I'); + chr = PyUnicode_READ(kind, data, start+4); + matches &= (chr == 'n') | (chr == 'N'); + chr = PyUnicode_READ(kind, data, start+5); + matches &= (chr == 'i') | (chr == 'I'); + chr = PyUnicode_READ(kind, data, start+6); + matches &= (chr == 't') | (chr == 'T'); + chr = PyUnicode_READ(kind, data, start+7); + matches &= (chr == 'y') | (chr == 'Y'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default: + goto parse_failure; + } + return 0.0; +parse_failure: + return -1.0; +} +static double __Pyx_PyUnicode_AsDouble_WithSpaces(PyObject *obj) { + double value; + const char *last; + char *end; + Py_ssize_t start, length = PyUnicode_GET_LENGTH(obj); + const int kind = PyUnicode_KIND(obj); + const void* data = PyUnicode_DATA(obj); + start = 0; + while (Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, start))) + start++; + while (start < length - 1 && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, length - 1))) + length--; + length -= start; + if (unlikely(length <= 0)) goto fallback; + value = __Pyx__PyUnicode_AsDouble_inf_nan(data, kind, start, length); + if (unlikely(value == -1.0)) goto fallback; + if (value != 0.0) return value; + if (length < 40) { + char number[40]; + last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); + if (unlikely(!last)) goto fallback; + value = PyOS_string_to_double(number, &end, NULL); + } else { + char *number = (char*) PyMem_Malloc((length + 1) * sizeof(char)); + if (unlikely(!number)) goto fallback; + last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); + if (unlikely(!last)) { + PyMem_Free(number); + goto fallback; + } + value = PyOS_string_to_double(number, &end, NULL); + PyMem_Free(number); + } + if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { + return value; + } +fallback: + return __Pyx_SlowPyString_AsDouble(obj); +} +#endif +static CYTHON_INLINE double __Pyx_PyUnicode_AsDouble(PyObject *obj) { +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS + if (unlikely(__Pyx_PyUnicode_READY(obj) == -1)) + return (double)-1; + if (likely(PyUnicode_IS_ASCII(obj))) { + const char *s; + Py_ssize_t length; + s = PyUnicode_AsUTF8AndSize(obj, &length); + return __Pyx__PyBytes_AsDouble(obj, s, length); + } + return __Pyx_PyUnicode_AsDouble_WithSpaces(obj); +#else + return __Pyx_SlowPyString_AsDouble(obj); +#endif +} + +/* PyObject_Str.proto */ +#define __Pyx_PyObject_Str(obj)\ + (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_RemainderObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); +#else +#define __Pyx_PyInt_RemainderObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceRemainder(op1, op2) : PyNumber_Remainder(op1, op2)) +#endif + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); +#else +#define __Pyx_PyInt_SubtractObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2)) +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* pyobject_as_double.proto */ +static double __Pyx__PyObject_AsDouble(PyObject* obj); +#if CYTHON_COMPILING_IN_PYPY +#define __Pyx_PyObject_AsDouble(obj)\ +(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) :\ + likely(PyInt_CheckExact(obj)) ?\ + PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) +#else +#define __Pyx_PyObject_AsDouble(obj)\ +((likely(PyFloat_CheckExact(obj))) ? PyFloat_AS_DOUBLE(obj) :\ + likely(PyLong_CheckExact(obj)) ?\ + PyLong_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) +#endif + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "libc.math" */ + +/* Module declarations from "feature_gen_dt" */ +static PyArrayObject *__pyx_f_14feature_gen_dt_ordinal_datetime(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_ordinal_day_of_week(PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_minute_of_hour(PyArrayObject *, double, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_hour_of_day(PyArrayObject *, double, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_day_of_week(PyArrayObject *, double, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_month_of_year(PyArrayObject *, PyArrayObject *, double, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_day_of_month(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_deltatime(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "feature_gen_dt" +extern int __pyx_module_is_main_feature_gen_dt; +int __pyx_module_is_main_feature_gen_dt = 0; + +/* Implementation of "feature_gen_dt" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_D[] = "D"; +static const char __pyx_k_X[] = "X"; +static const char __pyx_k__4[] = "*"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__18[] = "?"; +static const char __pyx_k_nan[] = "nan"; +static const char __pyx_k_M8_s[] = "__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_n_u_D); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_u_M8_s); + Py_CLEAR(clear_module_state->__pyx_n_s_PREFACTOR); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_n_s__18); + Py_CLEAR(clear_module_state->__pyx_n_s__4); + Py_CLEAR(clear_module_state->__pyx_n_s_array); + Py_CLEAR(clear_module_state->__pyx_n_s_astype); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_bounds); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_cyclic_day_of_month); + Py_CLEAR(clear_module_state->__pyx_n_s_cyclic_day_of_week); + Py_CLEAR(clear_module_state->__pyx_n_s_cyclic_hour_of_day); + Py_CLEAR(clear_module_state->__pyx_n_s_cyclic_minute_of_hour); + Py_CLEAR(clear_module_state->__pyx_n_s_cyclic_month_of_year); + Py_CLEAR(clear_module_state->__pyx_kp_u_datetime64_D); + Py_CLEAR(clear_module_state->__pyx_kp_u_datetime64_M); + Py_CLEAR(clear_module_state->__pyx_n_s_deltatime); + Py_CLEAR(clear_module_state->__pyx_n_s_empty); + Py_CLEAR(clear_module_state->__pyx_n_s_feature_gen_dt); + Py_CLEAR(clear_module_state->__pyx_n_u_float64); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_feature_generation_dt_fea); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns_a); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns_b); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_nan); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_ordinal_datetime); + Py_CLEAR(clear_module_state->__pyx_n_s_ordinal_day_of_week); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_n_s_timedelta64); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_4); + Py_CLEAR(clear_module_state->__pyx_int_7); + Py_CLEAR(clear_module_state->__pyx_tuple_); + Py_CLEAR(clear_module_state->__pyx_tuple__2); + Py_CLEAR(clear_module_state->__pyx_tuple__3); + Py_CLEAR(clear_module_state->__pyx_tuple__5); + Py_CLEAR(clear_module_state->__pyx_tuple__7); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_codeobj__6); + Py_CLEAR(clear_module_state->__pyx_codeobj__8); + Py_CLEAR(clear_module_state->__pyx_codeobj__10); + Py_CLEAR(clear_module_state->__pyx_codeobj__11); + Py_CLEAR(clear_module_state->__pyx_codeobj__12); + Py_CLEAR(clear_module_state->__pyx_codeobj__14); + Py_CLEAR(clear_module_state->__pyx_codeobj__15); + Py_CLEAR(clear_module_state->__pyx_codeobj__17); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_n_u_D); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_u_M8_s); + Py_VISIT(traverse_module_state->__pyx_n_s_PREFACTOR); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_n_s__18); + Py_VISIT(traverse_module_state->__pyx_n_s__4); + Py_VISIT(traverse_module_state->__pyx_n_s_array); + Py_VISIT(traverse_module_state->__pyx_n_s_astype); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_bounds); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_cyclic_day_of_month); + Py_VISIT(traverse_module_state->__pyx_n_s_cyclic_day_of_week); + Py_VISIT(traverse_module_state->__pyx_n_s_cyclic_hour_of_day); + Py_VISIT(traverse_module_state->__pyx_n_s_cyclic_minute_of_hour); + Py_VISIT(traverse_module_state->__pyx_n_s_cyclic_month_of_year); + Py_VISIT(traverse_module_state->__pyx_kp_u_datetime64_D); + Py_VISIT(traverse_module_state->__pyx_kp_u_datetime64_M); + Py_VISIT(traverse_module_state->__pyx_n_s_deltatime); + Py_VISIT(traverse_module_state->__pyx_n_s_empty); + Py_VISIT(traverse_module_state->__pyx_n_s_feature_gen_dt); + Py_VISIT(traverse_module_state->__pyx_n_u_float64); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_feature_generation_dt_fea); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns_a); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns_b); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_nan); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_ordinal_datetime); + Py_VISIT(traverse_module_state->__pyx_n_s_ordinal_day_of_week); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_n_s_timedelta64); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_4); + Py_VISIT(traverse_module_state->__pyx_int_7); + Py_VISIT(traverse_module_state->__pyx_tuple_); + Py_VISIT(traverse_module_state->__pyx_tuple__2); + Py_VISIT(traverse_module_state->__pyx_tuple__3); + Py_VISIT(traverse_module_state->__pyx_tuple__5); + Py_VISIT(traverse_module_state->__pyx_tuple__7); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_codeobj__6); + Py_VISIT(traverse_module_state->__pyx_codeobj__8); + Py_VISIT(traverse_module_state->__pyx_codeobj__10); + Py_VISIT(traverse_module_state->__pyx_codeobj__11); + Py_VISIT(traverse_module_state->__pyx_codeobj__12); + Py_VISIT(traverse_module_state->__pyx_codeobj__14); + Py_VISIT(traverse_module_state->__pyx_codeobj__15); + Py_VISIT(traverse_module_state->__pyx_codeobj__17); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_n_u_D __pyx_mstate_global->__pyx_n_u_D +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_u_M8_s __pyx_mstate_global->__pyx_kp_u_M8_s +#define __pyx_n_s_PREFACTOR __pyx_mstate_global->__pyx_n_s_PREFACTOR +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_n_s__18 __pyx_mstate_global->__pyx_n_s__18 +#define __pyx_n_s__4 __pyx_mstate_global->__pyx_n_s__4 +#define __pyx_n_s_array __pyx_mstate_global->__pyx_n_s_array +#define __pyx_n_s_astype __pyx_mstate_global->__pyx_n_s_astype +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_bounds __pyx_mstate_global->__pyx_n_s_bounds +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_cyclic_day_of_month __pyx_mstate_global->__pyx_n_s_cyclic_day_of_month +#define __pyx_n_s_cyclic_day_of_week __pyx_mstate_global->__pyx_n_s_cyclic_day_of_week +#define __pyx_n_s_cyclic_hour_of_day __pyx_mstate_global->__pyx_n_s_cyclic_hour_of_day +#define __pyx_n_s_cyclic_minute_of_hour __pyx_mstate_global->__pyx_n_s_cyclic_minute_of_hour +#define __pyx_n_s_cyclic_month_of_year __pyx_mstate_global->__pyx_n_s_cyclic_month_of_year +#define __pyx_kp_u_datetime64_D __pyx_mstate_global->__pyx_kp_u_datetime64_D +#define __pyx_kp_u_datetime64_M __pyx_mstate_global->__pyx_kp_u_datetime64_M +#define __pyx_n_s_deltatime __pyx_mstate_global->__pyx_n_s_deltatime +#define __pyx_n_s_empty __pyx_mstate_global->__pyx_n_s_empty +#define __pyx_n_s_feature_gen_dt __pyx_mstate_global->__pyx_n_s_feature_gen_dt +#define __pyx_n_u_float64 __pyx_mstate_global->__pyx_n_u_float64 +#define __pyx_kp_s_gators_feature_generation_dt_fea __pyx_mstate_global->__pyx_kp_s_gators_feature_generation_dt_fea +#define __pyx_n_s_idx_columns_a __pyx_mstate_global->__pyx_n_s_idx_columns_a +#define __pyx_n_s_idx_columns_b __pyx_mstate_global->__pyx_n_s_idx_columns_b +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_nan __pyx_mstate_global->__pyx_n_s_nan +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_ordinal_datetime __pyx_mstate_global->__pyx_n_s_ordinal_datetime +#define __pyx_n_s_ordinal_day_of_week __pyx_mstate_global->__pyx_n_s_ordinal_day_of_week +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_n_s_timedelta64 __pyx_mstate_global->__pyx_n_s_timedelta64 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_4 __pyx_mstate_global->__pyx_int_4 +#define __pyx_int_7 __pyx_mstate_global->__pyx_int_7 +#define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ +#define __pyx_tuple__2 __pyx_mstate_global->__pyx_tuple__2 +#define __pyx_tuple__3 __pyx_mstate_global->__pyx_tuple__3 +#define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 +#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6 +#define __pyx_codeobj__8 __pyx_mstate_global->__pyx_codeobj__8 +#define __pyx_codeobj__10 __pyx_mstate_global->__pyx_codeobj__10 +#define __pyx_codeobj__11 __pyx_mstate_global->__pyx_codeobj__11 +#define __pyx_codeobj__12 __pyx_mstate_global->__pyx_codeobj__12 +#define __pyx_codeobj__14 __pyx_mstate_global->__pyx_codeobj__14 +#define __pyx_codeobj__15 __pyx_mstate_global->__pyx_codeobj__15 +#define __pyx_codeobj__17 __pyx_mstate_global->__pyx_codeobj__17 +/* #### Code section: module_code ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "feature_gen_dt.pyx":10 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_datetime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, np.ndarray[np.int64_t, ndim=1] bounds): + * cdef int i + */ + +static PyObject *__pyx_pw_14feature_gen_dt_1ordinal_datetime(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_ordinal_datetime(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bounds, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_start_idx; + int __pyx_v_end_idx; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bounds; + __Pyx_Buffer __pyx_pybuffer_bounds; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyArrayObject *__pyx_t_9 = NULL; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + double __pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("ordinal_datetime", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bounds.pybuffer.buf = NULL; + __pyx_pybuffer_bounds.refcount = 0; + __pyx_pybuffernd_bounds.data = NULL; + __pyx_pybuffernd_bounds.rcbuffer = &__pyx_pybuffer_bounds; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 10, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer, (PyObject*)__pyx_v_bounds, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 10, __pyx_L1_error) + } + __pyx_pybuffernd_bounds.diminfo[0].strides = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bounds.diminfo[0].shape = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_dt.pyx":14 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":15 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":16 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] # <<<<<<<<<<<<<< + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_2 = 0; + __pyx_v_start_idx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bounds.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_bounds.diminfo[0].strides)); + + /* "feature_gen_dt.pyx":17 + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + */ + __pyx_t_2 = 1; + __pyx_v_end_idx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bounds.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_bounds.diminfo[0].strides)); + + /* "feature_gen_dt.pyx":18 + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4)) __PYX_ERR(0, 18, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6)) __PYX_ERR(0, 18, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 18, __pyx_L1_error) + __pyx_t_9 = ((PyArrayObject *)__pyx_t_3); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_9, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 18, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_9 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "feature_gen_dt.pyx":19 + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if X[i, j] != X[i, j]: + */ + __pyx_t_8 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_8; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen_dt.pyx":20 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if X[i, j] != X[i, j]: + * X_new[i, j] = np.nan + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen_dt.pyx":21 + * for i in range(n_rows): + * for j in range(n_cols): + * if X[i, j] != X[i, j]: # <<<<<<<<<<<<<< + * X_new[i, j] = np.nan + * else: + */ + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_3 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_3 == NULL)) __pyx_t_3 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_3); + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":22 + * for j in range(n_cols): + * if X[i, j] != X[i, j]: + * X_new[i, j] = np.nan # <<<<<<<<<<<<<< + * else: + * X_new[i, j] = float(str(X[i, j])[start_idx: end_idx]) + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_nan); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":21 + * for i in range(n_rows): + * for j in range(n_cols): + * if X[i, j] != X[i, j]: # <<<<<<<<<<<<<< + * X_new[i, j] = np.nan + * else: + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":24 + * X_new[i, j] = np.nan + * else: + * X_new[i, j] = float(str(X[i, j])[start_idx: end_idx]) # <<<<<<<<<<<<<< + * return X_new + * + */ + /*else*/ { + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_7 = __Pyx_PyObject_Str(__pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PySequence_GetSlice(__pyx_t_7, __pyx_v_start_idx, __pyx_v_end_idx); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(__pyx_t_5 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "float() argument must be a string or a number, not 'NoneType'"); + __PYX_ERR(0, 24, __pyx_L1_error) + } + __pyx_t_18 = __Pyx_PyUnicode_AsDouble(__pyx_t_5); if (unlikely(__pyx_t_18 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_18; + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":25 + * else: + * X_new[i, j] = float(str(X[i, j])[start_idx: end_idx]) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":10 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_datetime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, np.ndarray[np.int64_t, ndim=1] bounds): + * cdef int i + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.ordinal_datetime", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_1ordinal_datetime(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_1ordinal_datetime = {"ordinal_datetime", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_1ordinal_datetime, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_1ordinal_datetime(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bounds = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("ordinal_datetime (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bounds,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 10, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bounds)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 10, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("ordinal_datetime", 1, 2, 2, 1); __PYX_ERR(0, 10, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "ordinal_datetime") < 0)) __PYX_ERR(0, 10, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bounds = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("ordinal_datetime", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 10, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.ordinal_datetime", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 11, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bounds), __pyx_ptype_5numpy_ndarray, 1, "bounds", 0))) __PYX_ERR(0, 11, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_ordinal_datetime(__pyx_self, __pyx_v_X, __pyx_v_bounds); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_ordinal_datetime(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bounds) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bounds; + __Pyx_Buffer __pyx_pybuffer_bounds; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("ordinal_datetime", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bounds.pybuffer.buf = NULL; + __pyx_pybuffer_bounds.refcount = 0; + __pyx_pybuffernd_bounds.data = NULL; + __pyx_pybuffernd_bounds.rcbuffer = &__pyx_pybuffer_bounds; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 10, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer, (PyObject*)__pyx_v_bounds, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 10, __pyx_L1_error) + } + __pyx_pybuffernd_bounds.diminfo[0].strides = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bounds.diminfo[0].shape = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_ordinal_datetime(__pyx_v_X, __pyx_v_bounds, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.ordinal_datetime", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":30 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + +static PyObject *__pyx_pw_14feature_gen_dt_3ordinal_day_of_week(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_ordinal_day_of_week(PyArrayObject *__pyx_v_X, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + PyObject *__pyx_t_18 = NULL; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("ordinal_day_of_week", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 30, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_dt.pyx":35 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":36 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 36, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":37 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 37, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 37, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 37, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 37, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":38 + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_dt.pyx":39 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, j] != X[i, j]): + * X_new[i, j] = np.nan + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_dt.pyx":40 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, j] = np.nan + * else: + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":41 + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + * X_new[i, j] = np.nan # <<<<<<<<<<<<<< + * else: + * X_new[i, j] = (np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7 + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_nan); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":40 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, j] = np.nan + * else: + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":43 + * X_new[i, j] = np.nan + * else: + * X_new[i, j] = (np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7 # <<<<<<<<<<<<<< + * + * return X_new + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_18 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_18)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_18); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_18, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_astype); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_kp_u_datetime64_D}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_astype); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_n_u_float64}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_3 = __Pyx_PyInt_SubtractObjC(__pyx_t_4, __pyx_int_4, 4, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_RemainderObjC(__pyx_t_3, __pyx_int_7, 7, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":45 + * X_new[i, j] = (np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7 + * + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":30 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_18); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.ordinal_day_of_week", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_3ordinal_day_of_week(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_3ordinal_day_of_week = {"ordinal_day_of_week", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_3ordinal_day_of_week, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_3ordinal_day_of_week(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("ordinal_day_of_week (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "ordinal_day_of_week") < 0)) __PYX_ERR(0, 30, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("ordinal_day_of_week", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 30, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.ordinal_day_of_week", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 31, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_2ordinal_day_of_week(__pyx_self, __pyx_v_X); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_2ordinal_day_of_week(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("ordinal_day_of_week", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 30, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_ordinal_day_of_week(__pyx_v_X, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.ordinal_day_of_week", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":50 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_minute_of_hour( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + +static PyObject *__pyx_pw_14feature_gen_dt_5cyclic_minute_of_hour(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_minute_of_hour(PyArrayObject *__pyx_v_X, double __pyx_v_PREFACTOR, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + double __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + double __pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_minute_of_hour", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 50, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_dt.pyx":56 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":57 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 57, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":58 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef double val + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 58, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":60 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_dt.pyx":61 + * cdef double val + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_dt.pyx":62 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":63 + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = np.nan + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_nan); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":64 + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan # <<<<<<<<<<<<<< + * else: + * val = PREFACTOR * float(str(X[i, j])[14: 16]) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_nan); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":62 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":66 + * X_new[i, 2*j+1] = np.nan + * else: + * val = PREFACTOR * float(str(X[i, j])[14: 16]) # <<<<<<<<<<<<<< + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + */ + /*else*/ { + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_6 == NULL)) __pyx_t_6 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PySequence_GetSlice(__pyx_t_4, 14, 16); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(__pyx_t_6 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "float() argument must be a string or a number, not 'NoneType'"); + __PYX_ERR(0, 66, __pyx_L1_error) + } + __pyx_t_18 = __Pyx_PyUnicode_AsDouble(__pyx_t_6); if (unlikely(__pyx_t_18 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_val = (__pyx_v_PREFACTOR * __pyx_t_18); + + /* "feature_gen_dt.pyx":67 + * else: + * val = PREFACTOR * float(str(X[i, j])[14: 16]) + * X_new[i, 2*j] = cos(val) # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = sin(val) + * return X_new + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = cos(__pyx_v_val); + + /* "feature_gen_dt.pyx":68 + * val = PREFACTOR * float(str(X[i, j])[14: 16]) + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = sin(__pyx_v_val); + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":69 + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":50 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_minute_of_hour( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_minute_of_hour", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_5cyclic_minute_of_hour(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_5cyclic_minute_of_hour = {"cyclic_minute_of_hour", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_5cyclic_minute_of_hour, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_5cyclic_minute_of_hour(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + double __pyx_v_PREFACTOR; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("cyclic_minute_of_hour (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_PREFACTOR,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 50, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_PREFACTOR)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 50, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("cyclic_minute_of_hour", 1, 2, 2, 1); __PYX_ERR(0, 50, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cyclic_minute_of_hour") < 0)) __PYX_ERR(0, 50, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_PREFACTOR = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_PREFACTOR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 52, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("cyclic_minute_of_hour", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 50, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.cyclic_minute_of_hour", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 51, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_4cyclic_minute_of_hour(__pyx_self, __pyx_v_X, __pyx_v_PREFACTOR); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_4cyclic_minute_of_hour(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, double __pyx_v_PREFACTOR) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_minute_of_hour", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 50, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_cyclic_minute_of_hour(__pyx_v_X, __pyx_v_PREFACTOR, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_minute_of_hour", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":74 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_hour_of_day( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + +static PyObject *__pyx_pw_14feature_gen_dt_7cyclic_hour_of_day(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_hour_of_day(PyArrayObject *__pyx_v_X, double __pyx_v_PREFACTOR, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + double __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + double __pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_hour_of_day", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 74, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_dt.pyx":80 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 80, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":81 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":82 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef double val + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 82, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 82, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 82, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":84 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_dt.pyx":85 + * cdef double val + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_dt.pyx":86 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":87 + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = np.nan + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_nan); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":88 + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan # <<<<<<<<<<<<<< + * else: + * val = PREFACTOR * float(str(X[i, j])[11: 13]) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_nan); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":86 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":90 + * X_new[i, 2*j+1] = np.nan + * else: + * val = PREFACTOR * float(str(X[i, j])[11: 13]) # <<<<<<<<<<<<<< + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + */ + /*else*/ { + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_6 == NULL)) __pyx_t_6 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_Str(__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 90, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PySequence_GetSlice(__pyx_t_4, 11, 13); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 90, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(__pyx_t_6 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "float() argument must be a string or a number, not 'NoneType'"); + __PYX_ERR(0, 90, __pyx_L1_error) + } + __pyx_t_18 = __Pyx_PyUnicode_AsDouble(__pyx_t_6); if (unlikely(__pyx_t_18 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 90, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_val = (__pyx_v_PREFACTOR * __pyx_t_18); + + /* "feature_gen_dt.pyx":91 + * else: + * val = PREFACTOR * float(str(X[i, j])[11: 13]) + * X_new[i, 2*j] = cos(val) # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = sin(val) + * return X_new + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = cos(__pyx_v_val); + + /* "feature_gen_dt.pyx":92 + * val = PREFACTOR * float(str(X[i, j])[11: 13]) + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = sin(__pyx_v_val); + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":93 + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":74 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_hour_of_day( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_hour_of_day", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_7cyclic_hour_of_day(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_7cyclic_hour_of_day = {"cyclic_hour_of_day", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_7cyclic_hour_of_day, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_7cyclic_hour_of_day(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + double __pyx_v_PREFACTOR; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("cyclic_hour_of_day (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_PREFACTOR,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 74, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_PREFACTOR)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 74, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("cyclic_hour_of_day", 1, 2, 2, 1); __PYX_ERR(0, 74, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cyclic_hour_of_day") < 0)) __PYX_ERR(0, 74, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_PREFACTOR = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_PREFACTOR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("cyclic_hour_of_day", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 74, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.cyclic_hour_of_day", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 75, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_6cyclic_hour_of_day(__pyx_self, __pyx_v_X, __pyx_v_PREFACTOR); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_6cyclic_hour_of_day(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, double __pyx_v_PREFACTOR) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_hour_of_day", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 74, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_cyclic_hour_of_day(__pyx_v_X, __pyx_v_PREFACTOR, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_hour_of_day", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + +static PyObject *__pyx_pw_14feature_gen_dt_9cyclic_day_of_week(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_day_of_week(PyArrayObject *__pyx_v_X, double __pyx_v_PREFACTOR, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + double __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + PyObject *__pyx_t_18 = NULL; + int __pyx_t_19; + double __pyx_t_20; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_day_of_week", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_dt.pyx":104 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 104, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":105 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 105, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":106 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef double val + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 106, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 106, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 106, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":108 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_dt.pyx":109 + * cdef double val + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_dt.pyx":110 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":111 + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = np.nan + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_nan); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":112 + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan # <<<<<<<<<<<<<< + * else: + * val = PREFACTOR * float((np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7) + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_nan); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":110 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":114 + * X_new[i, 2*j+1] = np.nan + * else: + * val = PREFACTOR * float((np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7) # <<<<<<<<<<<<<< + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_18 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_18)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_18); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_18, __pyx_t_5}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_astype); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_kp_u_datetime64_D}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_astype); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_n_u_float64}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_t_3 = __Pyx_PyInt_SubtractObjC(__pyx_t_6, __pyx_int_4, 4, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyInt_RemainderObjC(__pyx_t_3, __pyx_int_7, 7, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_20 = __Pyx_PyObject_AsDouble(__pyx_t_6); if (unlikely(__pyx_t_20 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_val = (__pyx_v_PREFACTOR * __pyx_t_20); + + /* "feature_gen_dt.pyx":115 + * else: + * val = PREFACTOR * float((np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7) + * X_new[i, 2*j] = cos(val) # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = sin(val) + * return X_new + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_14 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = cos(__pyx_v_val); + + /* "feature_gen_dt.pyx":116 + * val = PREFACTOR * float((np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7) + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = sin(__pyx_v_val); + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":117 + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_18); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_day_of_week", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_9cyclic_day_of_week(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_9cyclic_day_of_week = {"cyclic_day_of_week", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_9cyclic_day_of_week, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_9cyclic_day_of_week(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + double __pyx_v_PREFACTOR; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("cyclic_day_of_week (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_PREFACTOR,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_PREFACTOR)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("cyclic_day_of_week", 1, 2, 2, 1); __PYX_ERR(0, 98, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cyclic_day_of_week") < 0)) __PYX_ERR(0, 98, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_PREFACTOR = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_PREFACTOR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 100, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("cyclic_day_of_week", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 98, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.cyclic_day_of_week", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 99, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_8cyclic_day_of_week(__pyx_self, __pyx_v_X, __pyx_v_PREFACTOR); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_8cyclic_day_of_week(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, double __pyx_v_PREFACTOR) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_day_of_week", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_cyclic_day_of_week(__pyx_v_X, __pyx_v_PREFACTOR, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_day_of_week", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":122 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_month_of_year( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + +static PyObject *__pyx_pw_14feature_gen_dt_11cyclic_month_of_year(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_month_of_year(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bounds, double __pyx_v_PREFACTOR, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_start_idx; + int __pyx_v_end_idx; + PyArrayObject *__pyx_v_X_new = 0; + double __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bounds; + __Pyx_Buffer __pyx_pybuffer_bounds; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyArrayObject *__pyx_t_9 = NULL; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + double __pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_month_of_year", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bounds.pybuffer.buf = NULL; + __pyx_pybuffer_bounds.refcount = 0; + __pyx_pybuffernd_bounds.data = NULL; + __pyx_pybuffernd_bounds.rcbuffer = &__pyx_pybuffer_bounds; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 122, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer, (PyObject*)__pyx_v_bounds, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 122, __pyx_L1_error) + } + __pyx_pybuffernd_bounds.diminfo[0].strides = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bounds.diminfo[0].shape = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_dt.pyx":129 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 129, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":130 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 130, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":131 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] # <<<<<<<<<<<<<< + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + */ + __pyx_t_2 = 0; + __pyx_v_start_idx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bounds.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_bounds.diminfo[0].strides)); + + /* "feature_gen_dt.pyx":132 + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + */ + __pyx_t_2 = 1; + __pyx_v_end_idx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bounds.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_bounds.diminfo[0].strides)); + + /* "feature_gen_dt.pyx":133 + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef double val + * for i in range(n_rows): + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4)) __PYX_ERR(0, 133, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6)) __PYX_ERR(0, 133, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_t_9 = ((PyArrayObject *)__pyx_t_3); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_9, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 133, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_9 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "feature_gen_dt.pyx":135 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef double val + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + */ + __pyx_t_8 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_8; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen_dt.pyx":136 + * cdef double val + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen_dt.pyx":137 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_3 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_3 == NULL)) __pyx_t_3 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_3); + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":138 + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = np.nan + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_nan); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":139 + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan # <<<<<<<<<<<<<< + * else: + * val = PREFACTOR * (float(str(X[i, j])[start_idx: end_idx]) -1.) + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_nan); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_7); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":137 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":141 + * X_new[i, 2*j+1] = np.nan + * else: + * val = PREFACTOR * (float(str(X[i, j])[start_idx: end_idx]) -1.) # <<<<<<<<<<<<<< + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + */ + /*else*/ { + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_7 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_7 == NULL)) __pyx_t_7 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_7); + __pyx_t_5 = __Pyx_PyObject_Str(__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PySequence_GetSlice(__pyx_t_5, __pyx_v_start_idx, __pyx_v_end_idx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_t_7 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "float() argument must be a string or a number, not 'NoneType'"); + __PYX_ERR(0, 141, __pyx_L1_error) + } + __pyx_t_18 = __Pyx_PyUnicode_AsDouble(__pyx_t_7); if (unlikely(__pyx_t_18 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_val = (__pyx_v_PREFACTOR * (__pyx_t_18 - 1.)); + + /* "feature_gen_dt.pyx":142 + * else: + * val = PREFACTOR * (float(str(X[i, j])[start_idx: end_idx]) -1.) + * X_new[i, 2*j] = cos(val) # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = sin(val) + * + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[1].strides) = cos(__pyx_v_val); + + /* "feature_gen_dt.pyx":143 + * val = PREFACTOR * (float(str(X[i, j])[start_idx: end_idx]) -1.) + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) # <<<<<<<<<<<<<< + * + * return X_new + */ + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = sin(__pyx_v_val); + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":145 + * X_new[i, 2*j+1] = sin(val) + * + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":122 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_month_of_year( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_month_of_year", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_11cyclic_month_of_year(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_11cyclic_month_of_year = {"cyclic_month_of_year", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_11cyclic_month_of_year, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_11cyclic_month_of_year(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bounds = 0; + double __pyx_v_PREFACTOR; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("cyclic_month_of_year (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bounds,&__pyx_n_s_PREFACTOR,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bounds)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("cyclic_month_of_year", 1, 3, 3, 1); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_PREFACTOR)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("cyclic_month_of_year", 1, 3, 3, 2); __PYX_ERR(0, 122, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cyclic_month_of_year") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bounds = ((PyArrayObject *)values[1]); + __pyx_v_PREFACTOR = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_PREFACTOR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L3_error) + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("cyclic_month_of_year", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 122, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.cyclic_month_of_year", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 123, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bounds), __pyx_ptype_5numpy_ndarray, 1, "bounds", 0))) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_10cyclic_month_of_year(__pyx_self, __pyx_v_X, __pyx_v_bounds, __pyx_v_PREFACTOR); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_10cyclic_month_of_year(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bounds, double __pyx_v_PREFACTOR) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bounds; + __Pyx_Buffer __pyx_pybuffer_bounds; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_month_of_year", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bounds.pybuffer.buf = NULL; + __pyx_pybuffer_bounds.refcount = 0; + __pyx_pybuffernd_bounds.data = NULL; + __pyx_pybuffernd_bounds.rcbuffer = &__pyx_pybuffer_bounds; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 122, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer, (PyObject*)__pyx_v_bounds, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 122, __pyx_L1_error) + } + __pyx_pybuffernd_bounds.diminfo[0].strides = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bounds.diminfo[0].shape = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_cyclic_month_of_year(__pyx_v_X, __pyx_v_bounds, __pyx_v_PREFACTOR, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_month_of_year", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":150 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_month( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + +static PyObject *__pyx_pw_14feature_gen_dt_13cyclic_day_of_month(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_cyclic_day_of_month(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bounds, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + int __pyx_v_start_idx; + int __pyx_v_end_idx; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_days_in_month; + double __pyx_v_val; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bounds; + __Pyx_Buffer __pyx_pybuffer_bounds; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyArrayObject *__pyx_t_9 = NULL; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + __pyx_t_5numpy_float64_t __pyx_t_17; + PyObject *__pyx_t_18 = NULL; + int __pyx_t_19; + double __pyx_t_20; + double __pyx_t_21; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_day_of_month", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bounds.pybuffer.buf = NULL; + __pyx_pybuffer_bounds.refcount = 0; + __pyx_pybuffernd_bounds.data = NULL; + __pyx_pybuffernd_bounds.rcbuffer = &__pyx_pybuffer_bounds; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer, (PyObject*)__pyx_v_bounds, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + } + __pyx_pybuffernd_bounds.diminfo[0].strides = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bounds.diminfo[0].shape = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_dt.pyx":156 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":157 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_dt.pyx":158 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] # <<<<<<<<<<<<<< + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + */ + __pyx_t_2 = 0; + __pyx_v_start_idx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bounds.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_bounds.diminfo[0].strides)); + + /* "feature_gen_dt.pyx":159 + * cdef int n_cols = X.shape[1] + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) + * cdef int days_in_month + */ + __pyx_t_2 = 1; + __pyx_v_end_idx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_bounds.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_bounds.diminfo[0].strides)); + + /* "feature_gen_dt.pyx":160 + * cdef int start_idx = bounds[0] + * cdef int end_idx = bounds[1] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) # <<<<<<<<<<<<<< + * cdef int days_in_month + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyInt_From_long((2 * __pyx_v_n_cols)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4)) __PYX_ERR(0, 160, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6)) __PYX_ERR(0, 160, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_t_9 = ((PyArrayObject *)__pyx_t_3); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_9, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 160, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_9 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "feature_gen_dt.pyx":163 + * cdef int days_in_month + * + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + */ + __pyx_t_8 = __pyx_v_n_rows; + __pyx_t_10 = __pyx_t_8; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "feature_gen_dt.pyx":164 + * + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + */ + __pyx_t_12 = __pyx_v_n_cols; + __pyx_t_13 = __pyx_t_12; + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "feature_gen_dt.pyx":165 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_3 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_3 == NULL)) __pyx_t_3 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_3); + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = __pyx_v_j; + __pyx_t_5 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_5 == NULL)) __pyx_t_5 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_5); + __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_16) { + + /* "feature_gen_dt.pyx":166 + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = np.nan + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 166, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_nan); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 166, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 166, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":167 + * if (X[i, j] != X[i, j]): + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan # <<<<<<<<<<<<<< + * else: + * days_in_month = (((np.array(X[i, j]).astype('datetime64[M]')+1).astype('datetime64[D]') - np.array(X[i, j]).astype('datetime64[M]')) // np.timedelta64(1, 'D')) + */ + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 167, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_nan); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 167, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_7); if (unlikely((__pyx_t_17 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 167, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_17; + + /* "feature_gen_dt.pyx":165 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, j] != X[i, j]): # <<<<<<<<<<<<<< + * X_new[i, 2*j] = np.nan + * X_new[i, 2*j+1] = np.nan + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":169 + * X_new[i, 2*j+1] = np.nan + * else: + * days_in_month = (((np.array(X[i, j]).astype('datetime64[M]')+1).astype('datetime64[D]') - np.array(X[i, j]).astype('datetime64[M]')) // np.timedelta64(1, 'D')) # <<<<<<<<<<<<<< + * val = 2 * pi * (float(str(X[i, j])[start_idx: end_idx]) -1.) / days_in_month + * X_new[i, 2*j] = cos(val) + */ + /*else*/ { + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_6 == NULL)) __pyx_t_6 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_6); + __pyx_t_18 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_18)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_18); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_18, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_kp_u_datetime64_M}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_t_5, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_astype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_u_datetime64_D}; + __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = __pyx_v_j; + __pyx_t_3 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_3 == NULL)) __pyx_t_3 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_3); + __pyx_t_18 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_18)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_18); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_18, __pyx_t_3}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_astype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_19 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_19 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_u_datetime64_M}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_19, 1+__pyx_t_19); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = PyNumber_Subtract(__pyx_t_7, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_timedelta64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PyNumber_FloorDivide(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_19 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_days_in_month = __pyx_t_19; + + /* "feature_gen_dt.pyx":170 + * else: + * days_in_month = (((np.array(X[i, j]).astype('datetime64[M]')+1).astype('datetime64[D]') - np.array(X[i, j]).astype('datetime64[M]')) // np.timedelta64(1, 'D')) + * val = 2 * pi * (float(str(X[i, j])[start_idx: end_idx]) -1.) / days_in_month # <<<<<<<<<<<<<< + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + */ + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + __pyx_t_7 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_7 == NULL)) __pyx_t_7 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_7); + __pyx_t_5 = __Pyx_PyObject_Str(__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 170, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PySequence_GetSlice(__pyx_t_5, __pyx_v_start_idx, __pyx_v_end_idx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 170, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_t_7 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "float() argument must be a string or a number, not 'NoneType'"); + __PYX_ERR(0, 170, __pyx_L1_error) + } + __pyx_t_20 = __Pyx_PyUnicode_AsDouble(__pyx_t_7); if (unlikely(__pyx_t_20 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 170, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_21 = ((2.0 * M_PI) * (__pyx_t_20 - 1.)); + if (unlikely(__pyx_v_days_in_month == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + __PYX_ERR(0, 170, __pyx_L1_error) + } + __pyx_v_val = (__pyx_t_21 / ((double)__pyx_v_days_in_month)); + + /* "feature_gen_dt.pyx":171 + * days_in_month = (((np.array(X[i, j]).astype('datetime64[M]')+1).astype('datetime64[D]') - np.array(X[i, j]).astype('datetime64[M]')) // np.timedelta64(1, 'D')) + * val = 2 * pi * (float(str(X[i, j])[start_idx: end_idx]) -1.) / days_in_month + * X_new[i, 2*j] = cos(val) # <<<<<<<<<<<<<< + * X_new[i, 2*j+1] = sin(val) + * return X_new + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_2 = (2 * __pyx_v_j); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[1].strides) = cos(__pyx_v_val); + + /* "feature_gen_dt.pyx":172 + * val = 2 * pi * (float(str(X[i, j])[start_idx: end_idx]) -1.) / days_in_month + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) # <<<<<<<<<<<<<< + * return X_new + * + */ + __pyx_t_2 = __pyx_v_i; + __pyx_t_15 = ((2 * __pyx_v_j) + 1); + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = sin(__pyx_v_val); + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":173 + * X_new[i, 2*j] = cos(val) + * X_new[i, 2*j+1] = sin(val) + * return X_new # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __pyx_r = ((PyArrayObject *)__pyx_v_X_new); + goto __pyx_L0; + + /* "feature_gen_dt.pyx":150 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_month( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_18); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_day_of_month", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_13cyclic_day_of_month(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_13cyclic_day_of_month = {"cyclic_day_of_month", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_13cyclic_day_of_month, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_13cyclic_day_of_month(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_bounds = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("cyclic_day_of_month (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_bounds,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 150, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_bounds)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 150, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("cyclic_day_of_month", 1, 2, 2, 1); __PYX_ERR(0, 150, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cyclic_day_of_month") < 0)) __PYX_ERR(0, 150, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_bounds = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("cyclic_day_of_month", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 150, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.cyclic_day_of_month", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 151, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bounds), __pyx_ptype_5numpy_ndarray, 1, "bounds", 0))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_12cyclic_day_of_month(__pyx_self, __pyx_v_X, __pyx_v_bounds); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_12cyclic_day_of_month(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_bounds) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bounds; + __Pyx_Buffer __pyx_pybuffer_bounds; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cyclic_day_of_month", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_bounds.pybuffer.buf = NULL; + __pyx_pybuffer_bounds.refcount = 0; + __pyx_pybuffernd_bounds.data = NULL; + __pyx_pybuffernd_bounds.rcbuffer = &__pyx_pybuffer_bounds; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer, (PyObject*)__pyx_v_bounds, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + } + __pyx_pybuffernd_bounds.diminfo[0].strides = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bounds.diminfo[0].shape = __pyx_pybuffernd_bounds.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_cyclic_day_of_month(__pyx_v_X, __pyx_v_bounds, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.cyclic_day_of_month", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bounds.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_dt.pyx":178 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] deltatime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + +static PyObject *__pyx_pw_14feature_gen_dt_15deltatime(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_14feature_gen_dt_deltatime(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __pyx_t_5numpy_int64_t __pyx_t_17; + int __pyx_t_18; + __pyx_t_5numpy_float64_t __pyx_t_19; + PyObject *__pyx_t_20 = NULL; + PyObject *__pyx_t_21 = NULL; + PyObject *__pyx_t_22 = NULL; + int __pyx_t_23; + PyObject *__pyx_t_24 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("deltatime", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 178, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 178, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 178, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_dt.pyx":185 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":186 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns_a)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 186, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen_dt.pyx":187 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 187, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 187, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":188 + * cdef int n_cols = idx_columns_a.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * if (X[i, idx_columns_a[j]] == None) or (X[i, idx_columns_a[j]] != X[i, idx_columns_a[j]]) or (X[i, idx_columns_b[j]] == None) or (X[i, idx_columns_b[j]] != X[i, idx_columns_b[j]]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_dt.pyx":189 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * if (X[i, idx_columns_a[j]] == None) or (X[i, idx_columns_a[j]] != X[i, idx_columns_a[j]]) or (X[i, idx_columns_b[j]] == None) or (X[i, idx_columns_b[j]] != X[i, idx_columns_b[j]]): + * X_new[i, j] = np.nan + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_dt.pyx":190 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, idx_columns_a[j]] == None) or (X[i, idx_columns_a[j]] != X[i, idx_columns_a[j]]) or (X[i, idx_columns_b[j]] == None) or (X[i, idx_columns_b[j]] != X[i, idx_columns_b[j]]): # <<<<<<<<<<<<<< + * X_new[i, j] = np.nan + * else: + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_14 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_14 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_6 == NULL)) __pyx_t_6 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_6); + __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_14 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_15 = __pyx_v_j; + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_6 == NULL)) __pyx_t_6 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_6); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 190, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_14 = __pyx_t_18; + __pyx_L8_bool_binop_done:; + if (__pyx_t_14) { + + /* "feature_gen_dt.pyx":191 + * for j in range(n_cols): + * if (X[i, idx_columns_a[j]] == None) or (X[i, idx_columns_a[j]] != X[i, idx_columns_a[j]]) or (X[i, idx_columns_b[j]] == None) or (X[i, idx_columns_b[j]] != X[i, idx_columns_b[j]]): + * X_new[i, j] = np.nan # <<<<<<<<<<<<<< + * else: + * X_new[i, j] = (np.array(X[i, idx_columns_a[j]]).astype(str).astype('pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_19; + + /* "feature_gen_dt.pyx":190 + * for i in range(n_rows): + * for j in range(n_cols): + * if (X[i, idx_columns_a[j]] == None) or (X[i, idx_columns_a[j]] != X[i, idx_columns_a[j]]) or (X[i, idx_columns_b[j]] == None) or (X[i, idx_columns_b[j]] != X[i, idx_columns_b[j]]): # <<<<<<<<<<<<<< + * X_new[i, j] = np.nan + * else: + */ + goto __pyx_L7; + } + + /* "feature_gen_dt.pyx":193 + * X_new[i, j] = np.nan + * else: + * X_new[i, j] = (np.array(X[i, idx_columns_a[j]]).astype(str).astype('pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_idx_columns_a.diminfo[0].strides)); + __pyx_t_20 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_20 == NULL)) __pyx_t_20 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_20); + __pyx_t_22 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_21))) { + __pyx_t_22 = PyMethod_GET_SELF(__pyx_t_21); + if (likely(__pyx_t_22)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21); + __Pyx_INCREF(__pyx_t_22); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_21, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_22, __pyx_t_20}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0; + __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0; + } + __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_astype); if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_21); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_21))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_21); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_21, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, ((PyObject *)(&PyUnicode_Type))}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0; + } + __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_astype); if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_21); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_21))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_21); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_21, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_kp_u_M8_s}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0; + } + __Pyx_GetModuleGlobalName(__pyx_t_20, __pyx_n_s_np); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_20); + __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_20, __pyx_n_s_array); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_22); + __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; + __pyx_t_16 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_17 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_idx_columns_b.diminfo[0].strides)); + __pyx_t_20 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_20 == NULL)) __pyx_t_20 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_20); + __pyx_t_24 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_22))) { + __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_22); + if (likely(__pyx_t_24)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22); + __Pyx_INCREF(__pyx_t_24); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_22, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_24, __pyx_t_20}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_22, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0; + __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; + } + __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_astype); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_22); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_22))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_22); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_22, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_3, ((PyObject *)(&PyUnicode_Type))}; + __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_22, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; + } + __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_astype); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_22); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_22))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_22); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_22, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_kp_u_M8_s}; + __pyx_t_21 = __Pyx_PyObject_FastCall(__pyx_t_22, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_21); + __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; + } + __pyx_t_22 = PyNumber_Subtract(__pyx_t_2, __pyx_t_21); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_22); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0; + __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_22, __pyx_n_s_astype); if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_21); + __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; + __pyx_t_22 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_21))) { + __pyx_t_22 = PyMethod_GET_SELF(__pyx_t_21); + if (likely(__pyx_t_22)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21); + __Pyx_INCREF(__pyx_t_22); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_21, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_22, ((PyObject *)(&PyInt_Type))}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0; + } + __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_astype); if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_21); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + __pyx_t_23 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_21))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_21); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_21, function); + __pyx_t_23 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, ((PyObject *)(&PyFloat_Type))}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_23, 1+__pyx_t_23); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0; + } + __pyx_t_19 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_19 == ((npy_float64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_16 = __pyx_v_i; + __pyx_t_15 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_19; + } + __pyx_L7:; + } + } + + /* "feature_gen_dt.pyx":194 + * else: + * X_new[i, j] = (np.array(X[i, idx_columns_a[j]]).astype(str).astype('pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.deltatime", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_14feature_gen_dt_15deltatime(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_14feature_gen_dt_15deltatime = {"deltatime", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_14feature_gen_dt_15deltatime, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_14feature_gen_dt_15deltatime(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns_a = 0; + PyArrayObject *__pyx_v_idx_columns_b = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("deltatime (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns_a,&__pyx_n_s_idx_columns_b,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 178, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_a)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 178, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("deltatime", 1, 3, 3, 1); __PYX_ERR(0, 178, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns_b)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 178, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("deltatime", 1, 3, 3, 2); __PYX_ERR(0, 178, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "deltatime") < 0)) __PYX_ERR(0, 178, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns_a = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns_b = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("deltatime", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 178, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_dt.deltatime", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 179, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_a), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_a", 0))) __PYX_ERR(0, 180, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns_b), __pyx_ptype_5numpy_ndarray, 1, "idx_columns_b", 0))) __PYX_ERR(0, 181, __pyx_L1_error) + __pyx_r = __pyx_pf_14feature_gen_dt_14deltatime(__pyx_self, __pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_14feature_gen_dt_14deltatime(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns_a, PyArrayObject *__pyx_v_idx_columns_b) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_a; + __Pyx_Buffer __pyx_pybuffer_idx_columns_a; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns_b; + __Pyx_Buffer __pyx_pybuffer_idx_columns_b; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("deltatime", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns_a.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_a.refcount = 0; + __pyx_pybuffernd_idx_columns_a.data = NULL; + __pyx_pybuffernd_idx_columns_a.rcbuffer = &__pyx_pybuffer_idx_columns_a; + __pyx_pybuffer_idx_columns_b.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns_b.refcount = 0; + __pyx_pybuffernd_idx_columns_b.data = NULL; + __pyx_pybuffernd_idx_columns_b.rcbuffer = &__pyx_pybuffer_idx_columns_b; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 178, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_a, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 178, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_a.diminfo[0].strides = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_a.diminfo[0].shape = __pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns_b, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 178, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns_b.diminfo[0].strides = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns_b.diminfo[0].shape = __pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_14feature_gen_dt_deltatime(__pyx_v_X, __pyx_v_idx_columns_a, __pyx_v_idx_columns_b, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_dt.deltatime", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_a.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns_b.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_u_D, __pyx_k_D, sizeof(__pyx_k_D), 0, 1, 0, 1}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_u_M8_s, __pyx_k_M8_s, sizeof(__pyx_k_M8_s), 0, 1, 0, 0}, + {&__pyx_n_s_PREFACTOR, __pyx_k_PREFACTOR, sizeof(__pyx_k_PREFACTOR), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_n_s__18, __pyx_k__18, sizeof(__pyx_k__18), 0, 0, 1, 1}, + {&__pyx_n_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 1}, + {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1}, + {&__pyx_n_s_astype, __pyx_k_astype, sizeof(__pyx_k_astype), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_bounds, __pyx_k_bounds, sizeof(__pyx_k_bounds), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_cyclic_day_of_month, __pyx_k_cyclic_day_of_month, sizeof(__pyx_k_cyclic_day_of_month), 0, 0, 1, 1}, + {&__pyx_n_s_cyclic_day_of_week, __pyx_k_cyclic_day_of_week, sizeof(__pyx_k_cyclic_day_of_week), 0, 0, 1, 1}, + {&__pyx_n_s_cyclic_hour_of_day, __pyx_k_cyclic_hour_of_day, sizeof(__pyx_k_cyclic_hour_of_day), 0, 0, 1, 1}, + {&__pyx_n_s_cyclic_minute_of_hour, __pyx_k_cyclic_minute_of_hour, sizeof(__pyx_k_cyclic_minute_of_hour), 0, 0, 1, 1}, + {&__pyx_n_s_cyclic_month_of_year, __pyx_k_cyclic_month_of_year, sizeof(__pyx_k_cyclic_month_of_year), 0, 0, 1, 1}, + {&__pyx_kp_u_datetime64_D, __pyx_k_datetime64_D, sizeof(__pyx_k_datetime64_D), 0, 1, 0, 0}, + {&__pyx_kp_u_datetime64_M, __pyx_k_datetime64_M, sizeof(__pyx_k_datetime64_M), 0, 1, 0, 0}, + {&__pyx_n_s_deltatime, __pyx_k_deltatime, sizeof(__pyx_k_deltatime), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_n_s_feature_gen_dt, __pyx_k_feature_gen_dt, sizeof(__pyx_k_feature_gen_dt), 0, 0, 1, 1}, + {&__pyx_n_u_float64, __pyx_k_float64, sizeof(__pyx_k_float64), 0, 1, 0, 1}, + {&__pyx_kp_s_gators_feature_generation_dt_fea, __pyx_k_gators_feature_generation_dt_fea, sizeof(__pyx_k_gators_feature_generation_dt_fea), 0, 0, 1, 0}, + {&__pyx_n_s_idx_columns_a, __pyx_k_idx_columns_a, sizeof(__pyx_k_idx_columns_a), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns_b, __pyx_k_idx_columns_b, sizeof(__pyx_k_idx_columns_b), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_nan, __pyx_k_nan, sizeof(__pyx_k_nan), 0, 0, 1, 1}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_ordinal_datetime, __pyx_k_ordinal_datetime, sizeof(__pyx_k_ordinal_datetime), 0, 0, 1, 1}, + {&__pyx_n_s_ordinal_day_of_week, __pyx_k_ordinal_day_of_week, sizeof(__pyx_k_ordinal_day_of_week), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_timedelta64, __pyx_k_timedelta64, sizeof(__pyx_k_timedelta64), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "feature_gen_dt.pyx":169 + * X_new[i, 2*j+1] = np.nan + * else: + * days_in_month = (((np.array(X[i, j]).astype('datetime64[M]')+1).astype('datetime64[D]') - np.array(X[i, j]).astype('datetime64[M]')) // np.timedelta64(1, 'D')) # <<<<<<<<<<<<<< + * val = 2 * pi * (float(str(X[i, j])[start_idx: end_idx]) -1.) / days_in_month + * X_new[i, 2*j] = cos(val) + */ + __pyx_tuple__3 = PyTuple_Pack(2, __pyx_int_1, __pyx_n_u_D); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "feature_gen_dt.pyx":10 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_datetime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, np.ndarray[np.int64_t, ndim=1] bounds): + * cdef int i + */ + __pyx_tuple__5 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_bounds); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_ordinal_datetime, 10, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 10, __pyx_L1_error) + + /* "feature_gen_dt.pyx":30 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_n_s_X); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_ordinal_day_of_week, 30, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 30, __pyx_L1_error) + + /* "feature_gen_dt.pyx":50 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_minute_of_hour( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + __pyx_tuple__9 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_PREFACTOR); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_cyclic_minute_of_hour, 50, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 50, __pyx_L1_error) + + /* "feature_gen_dt.pyx":74 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_hour_of_day( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + __pyx_codeobj__11 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_cyclic_hour_of_day, 74, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__11)) __PYX_ERR(0, 74, __pyx_L1_error) + + /* "feature_gen_dt.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_cyclic_day_of_week, 98, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 98, __pyx_L1_error) + + /* "feature_gen_dt.pyx":122 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_month_of_year( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + __pyx_tuple__13 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_bounds, __pyx_n_s_PREFACTOR); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_cyclic_month_of_year, 122, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 122, __pyx_L1_error) + + /* "feature_gen_dt.pyx":150 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_month( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_cyclic_day_of_month, 150, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(0, 150, __pyx_L1_error) + + /* "feature_gen_dt.pyx":178 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] deltatime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_tuple__16 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns_a, __pyx_n_s_idx_columns_b); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_dt_fea, __pyx_n_s_deltatime, 178, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_7 = PyInt_FromLong(7); if (unlikely(!__pyx_int_7)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_feature_gen_dt(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_feature_gen_dt}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "feature_gen_dt", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initfeature_gen_dt(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initfeature_gen_dt(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_feature_gen_dt(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_feature_gen_dt(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_feature_gen_dt(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'feature_gen_dt' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("feature_gen_dt", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "feature_gen_dt" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_feature_gen_dt(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_feature_gen_dt) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "feature_gen_dt")) { + if (unlikely((PyDict_SetItemString(modules, "feature_gen_dt", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "feature_gen_dt.pyx":2 + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * from libc.math cimport cos, isnan, pi, sin + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":10 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_datetime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, np.ndarray[np.int64_t, ndim=1] bounds): + * cdef int i + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_1ordinal_datetime, 0, __pyx_n_s_ordinal_datetime, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ordinal_datetime, __pyx_t_2) < 0) __PYX_ERR(0, 10, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":30 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] ordinal_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_3ordinal_day_of_week, 0, __pyx_n_s_ordinal_day_of_week, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ordinal_day_of_week, __pyx_t_2) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":50 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_minute_of_hour( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_5cyclic_minute_of_hour, 0, __pyx_n_s_cyclic_minute_of_hour, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cyclic_minute_of_hour, __pyx_t_2) < 0) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":74 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_hour_of_day( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_7cyclic_hour_of_day, 0, __pyx_n_s_cyclic_hour_of_day, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__11)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cyclic_hour_of_day, __pyx_t_2) < 0) __PYX_ERR(0, 74, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":98 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_week( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * double PREFACTOR, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_9cyclic_day_of_week, 0, __pyx_n_s_cyclic_day_of_week, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cyclic_day_of_week, __pyx_t_2) < 0) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":122 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_month_of_year( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_11cyclic_month_of_year, 0, __pyx_n_s_cyclic_month_of_year, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cyclic_month_of_year, __pyx_t_2) < 0) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":150 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_month( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] bounds, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_13cyclic_day_of_month, 0, __pyx_n_s_cyclic_day_of_month, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__15)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cyclic_day_of_month, __pyx_t_2) < 0) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":178 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[np.float64_t, ndim=2] deltatime( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns_a, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_14feature_gen_dt_15deltatime, 0, __pyx_n_s_deltatime, NULL, __pyx_n_s_feature_gen_dt, __pyx_d, ((PyObject *)__pyx_codeobj__17)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_deltatime, __pyx_t_2) < 0) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_dt.pyx":1 + * import cython # <<<<<<<<<<<<<< + * import numpy as np + * cimport numpy as np + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init feature_gen_dt", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init feature_gen_dt"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* PyDictVersioning */ + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ + #if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ + #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* pybytes_as_double */ + static double __Pyx_SlowPyString_AsDouble(PyObject *obj) { + PyObject *float_value; +#if PY_MAJOR_VERSION >= 3 + float_value = PyFloat_FromString(obj); +#else + float_value = PyFloat_FromString(obj, 0); +#endif + if (likely(float_value)) { +#if CYTHON_ASSUME_SAFE_MACROS + double value = PyFloat_AS_DOUBLE(float_value); +#else + double value = PyFloat_AsDouble(float_value); +#endif + Py_DECREF(float_value); + return value; + } + return (double)-1; +} +static const char* __Pyx__PyBytes_AsDouble_Copy(const char* start, char* buffer, Py_ssize_t length) { + int last_was_punctuation = 1; + Py_ssize_t i; + for (i=0; i < length; i++) { + char chr = start[i]; + int is_punctuation = (chr == '_') | (chr == '.') | (chr == 'e') | (chr == 'E'); + *buffer = chr; + buffer += (chr != '_'); + if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; + last_was_punctuation = is_punctuation; + } + if (unlikely(last_was_punctuation)) goto parse_failure; + *buffer = '\0'; + return buffer; +parse_failure: + return NULL; +} +static double __Pyx__PyBytes_AsDouble_inf_nan(const char* start, Py_ssize_t length) { + int matches = 1; + char sign = start[0]; + int is_signed = (sign == '+') | (sign == '-'); + start += is_signed; + length -= is_signed; + switch (start[0]) { + #ifdef Py_NAN + case 'n': + case 'N': + if (unlikely(length != 3)) goto parse_failure; + matches &= (start[1] == 'a' || start[1] == 'A'); + matches &= (start[2] == 'n' || start[2] == 'N'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_NAN : Py_NAN; + #endif + case 'i': + case 'I': + if (unlikely(length < 3)) goto parse_failure; + matches &= (start[1] == 'n' || start[1] == 'N'); + matches &= (start[2] == 'f' || start[2] == 'F'); + if (likely(length == 3 && matches)) + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + if (unlikely(length != 8)) goto parse_failure; + matches &= (start[3] == 'i' || start[3] == 'I'); + matches &= (start[4] == 'n' || start[4] == 'N'); + matches &= (start[5] == 'i' || start[5] == 'I'); + matches &= (start[6] == 't' || start[6] == 'T'); + matches &= (start[7] == 'y' || start[7] == 'Y'); + if (unlikely(!matches)) goto parse_failure; + return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; + case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default: + goto parse_failure; + } + return 0.0; +parse_failure: + return -1.0; +} +static CYTHON_INLINE int __Pyx__PyBytes_AsDouble_IsSpace(char ch) { + return (ch == 0x20) | !((ch < 0x9) | (ch > 0xd)); +} +CYTHON_UNUSED static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length) { + double value; + Py_ssize_t i, digits; + const char *last = start + length; + char *end; + while (__Pyx__PyBytes_AsDouble_IsSpace(*start)) + start++; + while (start < last - 1 && __Pyx__PyBytes_AsDouble_IsSpace(last[-1])) + last--; + length = last - start; + if (unlikely(length <= 0)) goto fallback; + value = __Pyx__PyBytes_AsDouble_inf_nan(start, length); + if (unlikely(value == -1.0)) goto fallback; + if (value != 0.0) return value; + digits = 0; + for (i=0; i < length; digits += start[i++] != '_'); + if (likely(digits == length)) { + value = PyOS_string_to_double(start, &end, NULL); + } else if (digits < 40) { + char number[40]; + last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); + if (unlikely(!last)) goto fallback; + value = PyOS_string_to_double(number, &end, NULL); + } else { + char *number = (char*) PyMem_Malloc((digits + 1) * sizeof(char)); + if (unlikely(!number)) goto fallback; + last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); + if (unlikely(!last)) { + PyMem_Free(number); + goto fallback; + } + value = PyOS_string_to_double(number, &end, NULL); + PyMem_Free(number); + } + if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { + return value; + } +fallback: + return __Pyx_SlowPyString_AsDouble(obj); +} + +/* TupleAndListFromArray */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ + #if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ + static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_RemainderObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_MAYBE_UNUSED_VAR(inplace); + CYTHON_UNUSED_VAR(zerodivision_check); + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + + x = a % b; + x += ((x != 0) & ((x ^ b) < 0)) * b; + return PyInt_FromLong(x); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + if (unlikely(__Pyx_PyLong_IsZero(op1))) { + return __Pyx_NewRef(op1); + } + if (likely(__Pyx_PyLong_IsCompact(op1))) { + a = __Pyx_PyLong_CompactValue(op1); + } else { + const digit* digits = __Pyx_PyLong_Digits(op1); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_remainder(op1, op2); + } + } + x = a % b; + x += ((x != 0) & ((x ^ b) < 0)) * b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla % llb; + llx += ((llx != 0) & ((llx ^ llb) < 0)) * llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + return (inplace ? PyNumber_InPlaceRemainder : PyNumber_Remainder)(op1, op2); +} +#endif + +/* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_MAYBE_UNUSED_VAR(inplace); + CYTHON_UNUSED_VAR(zerodivision_check); + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + + x = (long)((unsigned long)a - (unsigned long)b); + if (likely((x^a) >= 0 || (x^~b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_subtract(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + if (unlikely(__Pyx_PyLong_IsZero(op1))) { + return PyLong_FromLong(-intval); + } + if (likely(__Pyx_PyLong_IsCompact(op1))) { + a = __Pyx_PyLong_CompactValue(op1); + } else { + const digit* digits = __Pyx_PyLong_Digits(op1); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2); + } + } + x = a - b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla - llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; +#if CYTHON_COMPILING_IN_LIMITED_API + double a = __pyx_PyFloat_AsDouble(op1); +#else + double a = PyFloat_AS_DOUBLE(op1); +#endif + double result; + + PyFPE_START_PROTECT("subtract", return NULL) + result = ((double)a) - (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2); +} +#endif + +/* PyObjectCallOneArg */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* pyobject_as_double */ + static double __Pyx__PyObject_AsDouble(PyObject* obj) { + if (PyUnicode_CheckExact(obj)) { + return __Pyx_PyUnicode_AsDouble(obj); + } else if (PyBytes_CheckExact(obj)) { + return __Pyx_PyBytes_AsDouble(obj); + } else if (PyByteArray_CheckExact(obj)) { + return __Pyx_PyByteArray_AsDouble(obj); + } else { + PyObject* float_value; +#if !CYTHON_USE_TYPE_SLOTS + float_value = PyNumber_Float(obj); if ((0)) goto bad; + (void)__Pyx_PyObject_CallOneArg; +#else + PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; + if (likely(nb) && likely(nb->nb_float)) { + float_value = nb->nb_float(obj); + if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { + __Pyx_TypeName float_value_type_name = __Pyx_PyType_GetName(Py_TYPE(float_value)); + PyErr_Format(PyExc_TypeError, + "__float__ returned non-float (type " __Pyx_FMT_TYPENAME ")", + float_value_type_name); + __Pyx_DECREF_TypeName(float_value_type_name); + Py_DECREF(float_value); + goto bad; + } + } else { + float_value = __Pyx_PyObject_CallOneArg((PyObject*)&PyFloat_Type, obj); + } +#endif + if (likely(float_value)) { + double value = PyFloat_AS_DOUBLE(float_value); + Py_DECREF(float_value); + return value; + } + } +bad: + return (double)-1; +} + +/* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { + CYTHON_MAYBE_UNUSED_VAR(intval); + CYTHON_MAYBE_UNUSED_VAR(inplace); + CYTHON_UNUSED_VAR(zerodivision_check); + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + + x = (long)((unsigned long)a + (unsigned long)b); + if (likely((x^a) >= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + if (unlikely(__Pyx_PyLong_IsZero(op1))) { + return __Pyx_NewRef(op2); + } + if (likely(__Pyx_PyLong_IsCompact(op1))) { + a = __Pyx_PyLong_CompactValue(op1); + } else { + const digit* digits = __Pyx_PyLong_Digits(op1); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + #ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + #endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; +#if CYTHON_COMPILING_IN_LIMITED_API + double a = __pyx_PyFloat_AsDouble(op1); +#else + double a = PyFloat_AS_DOUBLE(op1); +#endif + double result; + + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ + #if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__4; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__18); + } + return name; +} +#endif + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/feature_generation_dt/feature_gen_dt.pyx b/gators/feature_generation_dt/feature_gen_dt.pyx index e44fb8d3..86dc6a4b 100644 --- a/gators/feature_generation_dt/feature_gen_dt.pyx +++ b/gators/feature_generation_dt/feature_gen_dt.pyx @@ -1,203 +1,181 @@ import cython import numpy as np - cimport numpy as np from libc.math cimport cos, isnan, pi, sin -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_minute_of_hour( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].minute)) - return np.concatenate((X, X_new), axis=1) - @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_hour_of_day( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): +cpdef np.ndarray[np.float64_t, ndim=2] ordinal_datetime( + np.ndarray[object, ndim=2] X, np.ndarray[np.int64_t, ndim=1] bounds): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].hour)) - return np.concatenate((X, X_new), axis=1) - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_day_of_week( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) + cdef int n_cols = X.shape[1] + cdef int start_idx = bounds[0] + cdef int end_idx = bounds[1] + cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) for i in range(n_rows): for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].dayofweek)) - return np.concatenate((X, X_new), axis=1) + if X[i, j] != X[i, j]: + X_new[i, j] = np.nan + else: + X_new[i, j] = float(str(X[i, j])[start_idx: end_idx]) + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_day_of_month( +cpdef np.ndarray[np.float64_t, ndim=2] ordinal_day_of_week( np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols),object) - cdef object val + cdef int n_cols = X.shape[1] + cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) for i in range(n_rows): for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].day)) - return np.concatenate((X, X_new), axis=1) - + if (X[i, j] != X[i, j]): + X_new[i, j] = np.nan + else: + X_new[i, j] = (np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7 -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] ordinal_month_of_year( - np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] - cdef np.ndarray[object, ndim=2] X_new = np.empty((n_rows, n_cols), object) - for i in range(n_rows): - for j in range(n_cols): - X_new[i, j] = str(float(X[i, idx_columns[j]].month)) - return np.concatenate((X, X_new), axis=1) + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_minute_of_hour( +cpdef np.ndarray[np.float64_t, ndim=2] cyclic_minute_of_hour( np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, double PREFACTOR, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) cdef double val for i in range(n_rows): for j in range(n_cols): - val = PREFACTOR * X[i, idx_columns[j]].minute - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) + if (X[i, j] != X[i, j]): + X_new[i, 2*j] = np.nan + X_new[i, 2*j+1] = np.nan + else: + val = PREFACTOR * float(str(X[i, j])[14: 16]) + X_new[i, 2*j] = cos(val) + X_new[i, 2*j+1] = sin(val) + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_hour_of_day( +cpdef np.ndarray[np.float64_t, ndim=2] cyclic_hour_of_day( np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, double PREFACTOR, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) cdef double val for i in range(n_rows): for j in range(n_cols): - val = PREFACTOR * X[i, idx_columns[j]].hour - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) + if (X[i, j] != X[i, j]): + X_new[i, 2*j] = np.nan + X_new[i, 2*j+1] = np.nan + else: + val = PREFACTOR * float(str(X[i, j])[11: 13]) + X_new[i, 2*j] = cos(val) + X_new[i, 2*j+1] = sin(val) + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_day_of_week( +cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_week( np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, double PREFACTOR, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) cdef double val for i in range(n_rows): for j in range(n_cols): - val = PREFACTOR * X[i, idx_columns[j]].dayofweek - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) + if (X[i, j] != X[i, j]): + X_new[i, 2*j] = np.nan + X_new[i, 2*j+1] = np.nan + else: + val = PREFACTOR * float((np.array(X[i, j]).astype('datetime64[D]').astype('float64') - 4) % 7) + X_new[i, 2*j] = cos(val) + X_new[i, 2*j+1] = sin(val) + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_month_of_year( +cpdef np.ndarray[np.float64_t, ndim=2] cyclic_month_of_year( np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, + np.ndarray[np.int64_t, ndim=1] bounds, double PREFACTOR, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] + cdef int start_idx = bounds[0] + cdef int end_idx = bounds[1] cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) cdef double val for i in range(n_rows): for j in range(n_cols): - val = PREFACTOR * (X[i, idx_columns[j]].month - 1.) - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) + if (X[i, j] != X[i, j]): + X_new[i, 2*j] = np.nan + X_new[i, 2*j+1] = np.nan + else: + val = PREFACTOR * (float(str(X[i, j])[start_idx: end_idx]) -1.) + X_new[i, 2*j] = cos(val) + X_new[i, 2*j+1] = sin(val) + + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] cyclic_day_of_month( +cpdef np.ndarray[np.float64_t, ndim=2] cyclic_day_of_month( np.ndarray[object, ndim=2] X, - np.ndarray[np.int64_t, ndim=1] idx_columns, + np.ndarray[np.int64_t, ndim=1] bounds, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] + cdef int start_idx = bounds[0] + cdef int end_idx = bounds[1] cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, 2 * n_cols)) - cdef double val + cdef int days_in_month + for i in range(n_rows): for j in range(n_cols): - val = 2 * pi *( X[i, idx_columns[j]].day - 1.) / (X[i, idx_columns[j]].daysinmonth - 1.) - X_new[i, 2*j] = cos(val) - X_new[i, 2*j+1] = sin(val) - return np.concatenate((X, X_new), axis=1) + if (X[i, j] != X[i, j]): + X_new[i, 2*j] = np.nan + X_new[i, 2*j+1] = np.nan + else: + days_in_month = (((np.array(X[i, j]).astype('datetime64[M]')+1).astype('datetime64[D]') - np.array(X[i, j]).astype('datetime64[M]')) // np.timedelta64(1, 'D')) + val = 2 * pi * (float(str(X[i, j])[start_idx: end_idx]) -1.) / days_in_month + X_new[i, 2*j] = cos(val) + X_new[i, 2*j+1] = sin(val) + return X_new @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] deltatime( +cpdef np.ndarray[np.float64_t, ndim=2] deltatime( np.ndarray[object, ndim=2] X, np.ndarray[np.int64_t, ndim=1] idx_columns_a, np.ndarray[np.int64_t, ndim=1] idx_columns_b, @@ -207,11 +185,10 @@ cpdef np.ndarray[object, ndim=2] deltatime( cdef int n_rows = X.shape[0] cdef int n_cols = idx_columns_a.shape[0] cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) - cdef object val_a - cdef object val_b for i in range(n_rows): for j in range(n_cols): - val_a = X[i, idx_columns_a[j]] - val_b = X[i, idx_columns_b[j]] - X_new[i, j] = (val_a - val_b).total_seconds() - return np.concatenate((X, X_new), axis=1) + if (X[i, idx_columns_a[j]] == None) or (X[i, idx_columns_a[j]] != X[i, idx_columns_a[j]]) or (X[i, idx_columns_b[j]] == None) or (X[i, idx_columns_b[j]] != X[i, idx_columns_b[j]]): + X_new[i, j] = np.nan + else: + X_new[i, j] = (np.array(X[i, idx_columns_a[j]]).astype(str).astype('>> import pandas as pd >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 15.0 - 2 NaT 0 nan - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_month - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 15.0 - 2 NaT 0 nan + * `dask` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], - [NaT, 0, 'nan']], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfMonth - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfMonth(columns=['A']) + >>> obj.fit_transform(X) + A B A__day_of_month + 0 2020-01-01 23:00:00 0 1.0 + 1 2020-12-15 18:00:00 1 15.0 + 2 NaT 0 NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '15.0'], - [NaT, 0, 'nan']], dtype=object) - - + array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0], + [Timestamp('2020-12-15 18:00:00'), 1, 15.0], + [NaT, 0, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = [f"{c}__day_of_month" for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.day.astype(np.float64).astype(str) - ) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign(dummy=X[col].dt.day.astype(np.float64).astype(str)).rename( - columns={"dummy": name} - ) + + for name, col in zip(self.column_names, self.columns): + X[name] = X[col].dt.day + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- @@ -119,7 +102,11 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: Dataset with the Tree features. + X : np.ndarray + Transformed array. """ self.check_array(X) - return feature_gen_dt.ordinal_day_of_month(X, self.idx_columns) + X_new = feature_gen_dt.ordinal_datetime( + X[:, self.idx_columns], self.idx_day_bounds + ) + return np.concatenate([X, X_new], axis=1) diff --git a/gators/feature_generation_dt/ordinal_day_of_week.py b/gators/feature_generation_dt/ordinal_day_of_week.py index ac1851d4..4d1047db 100644 --- a/gators/feature_generation_dt/ordinal_day_of_week.py +++ b/gators/feature_generation_dt/ordinal_day_of_week.py @@ -1,7 +1,6 @@ # Licence Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np import pandas as pd @@ -9,109 +8,93 @@ from ._base_datetime_feature import _BaseDatetimeFeature +from gators import DataFrame + class OrdinalDayOfWeek(_BaseDatetimeFeature): """Create new columns based on the day of the week. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week - 0 2020-01-01 23:00:00 0 2.0 - 1 2020-12-15 18:00:00 1 1.0 - 2 NaT 0 nan - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> obj.fit_transform(X) - A B A__day_of_week - 0 2020-01-01 23:00:00 0 2.0 - 1 2020-12-15 18:00:00 1 1.0 - 2 NaT 0 nan + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `pandas` & transform with `NumPy` + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], - [NaT, 0, 'nan']], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalDayOfWeek - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalDayOfWeek(columns=['A']) + >>> obj.fit_transform(X) + A B A__day_of_week + 0 2020-01-01 23:00:00 0 2.0 + 1 2020-12-15 18:00:00 1 1.0 + 2 NaT 0 NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '2.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '1.0'], - [NaT, 0, 'nan']], dtype=object) - + array([[Timestamp('2020-01-01 23:00:00'), 0, 2.0], + [Timestamp('2020-12-15 18:00:00'), 1, 1.0], + [NaT, 0, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = [f"{c}__day_of_week" for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.dayofweek.astype(np.float64).astype(str) - ) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign( - dummy=X[col].dt.dayofweek.astype(np.float64).astype(str) - ).rename(columns={"dummy": name}) + + for name, col in zip(self.column_names, self.columns): + X[name] = X[col].dt.dayofweek + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- @@ -120,8 +103,9 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: + X : np.ndarray: Transformed array. """ self.check_array(X) - return feature_gen_dt.ordinal_day_of_week(X, self.idx_columns) + X_new = feature_gen_dt.ordinal_day_of_week(X[:, self.idx_columns]) + return np.concatenate([X, X_new], axis=1) diff --git a/gators/feature_generation_dt/ordinal_hour_of_day.py b/gators/feature_generation_dt/ordinal_hour_of_day.py index a50b8758..46eba111 100644 --- a/gators/feature_generation_dt/ordinal_hour_of_day.py +++ b/gators/feature_generation_dt/ordinal_hour_of_day.py @@ -1,116 +1,97 @@ # Licence Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature +from gators import DataFrame + class OrdinalHourOfDay(_BaseDatetimeFeature): """Create new columns based on the hour of the day. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples - --------- - - * fit & transform with `pandas` + --------- Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = OrdinalHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day - 0 2020-01-01 23:00:00 0 23.0 - 1 2020-12-15 18:00:00 1 18.0 - 2 NaT 0 nan - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) - >>> obj.fit_transform(X) - A B A__hour_of_day - 0 2020-01-01 23:00:00 0 23.0 - 1 2020-12-15 18:00:00 1 18.0 - 2 NaT 0 nan + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `pandas` & transform with `NumPy` + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], - [NaT, 0, 'nan']], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalHourOfDay - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalHourOfDay(columns=['A']) + >>> obj.fit_transform(X) + A B A__hour_of_day + 0 2020-01-01 23:00:00 0 23.0 + 1 2020-12-15 18:00:00 1 18.0 + 2 NaT 0 NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '23.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '18.0'], - [NaT, 0, 'nan']], dtype=object) - - + array([[Timestamp('2020-01-01 23:00:00'), 0, 23.0], + [Timestamp('2020-12-15 18:00:00'), 1, 18.0], + [NaT, 0, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = [f"{c}__hour_of_day" for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.hour.astype(np.float64).astype(str) - ) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign(dummy=X[col].dt.hour.astype(np.float64).astype(str)).rename( - columns={"dummy": name} - ) + self.check_dataframe(X) + + for name, col in zip(self.column_names, self.columns): + X[name] = X[col].dt.hour + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- @@ -119,8 +100,11 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: + X : np.ndarray: Array with the datetime features added. """ self.check_array(X) - return feature_gen_dt.ordinal_hour_of_day(X, self.idx_columns) + X_new = feature_gen_dt.ordinal_datetime( + X[:, self.idx_columns], np.array([11, 13]) + ) + return np.concatenate([X, X_new], axis=1) diff --git a/gators/feature_generation_dt/ordinal_minute_of_hour.py b/gators/feature_generation_dt/ordinal_minute_of_hour.py index 78d07aad..b7abcb4d 100644 --- a/gators/feature_generation_dt/ordinal_minute_of_hour.py +++ b/gators/feature_generation_dt/ordinal_minute_of_hour.py @@ -1,120 +1,102 @@ # Licence Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature +from gators import DataFrame + class OrdinalMinuteOfHour(_BaseDatetimeFeature): """Create new columns based on the minute of the hour. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour - 0 2020-01-01 23:00:00 0 0.0 - 1 2020-12-15 18:59:00 1 59.0 - 2 NaT 0 nan - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> obj.fit_transform(X) - A B A__minute_of_hour - 0 2020-01-01 23:00:00 0 0.0 - 1 2020-12-15 18:59:00 1 59.0 - 2 NaT 0 nan + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame( + ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `pandas` & transform with `NumPy` + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], - [Timestamp('2020-12-15 18:59:00'), 1, '59.0'], - [NaT, 0, 'nan']], dtype=object) + >>> X = pd.DataFrame( + ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMinuteOfHour - >>> X = ks.DataFrame( - ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMinuteOfHour(columns=['A']) + >>> obj.fit_transform(X) + A B A__minute_of_hour + 0 2020-01-01 23:00:00 0 0.0 + 1 2020-12-15 18:59:00 1 59.0 + 2 NaT 0 NaN + + >>> X = pd.DataFrame( + ... {'A': ['2020-01-01T23:00:00', '2020-12-15T18:59:00', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '0.0'], - [Timestamp('2020-12-15 18:59:00'), 1, '59.0'], - [NaT, 0, 'nan']], dtype=object) - - + array([[Timestamp('2020-01-01 23:00:00'), 0, 0.0], + [Timestamp('2020-12-15 18:59:00'), 1, 59.0], + [NaT, 0, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = [f"{c}__minute_of_hour" for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.minute.astype(np.float64).astype(str) - ) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign(dummy=X[col].dt.minute.astype(np.float64).astype(str)).rename( - columns={"dummy": name} - ) + self.check_dataframe(X) + + for name, col in zip(self.column_names, self.columns): + X[name] = X[col].dt.minute + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- @@ -123,8 +105,11 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: + X : np.ndarray: Array with the datetime features added. """ self.check_array(X) - return feature_gen_dt.ordinal_minute_of_hour(X, self.idx_columns) + X_new = feature_gen_dt.ordinal_datetime( + X[:, self.idx_columns], np.array([14, 16]) + ) + return np.concatenate([X, X_new], axis=1) diff --git a/gators/feature_generation_dt/ordinal_month_of_year.py b/gators/feature_generation_dt/ordinal_month_of_year.py index 95efa847..dff0a3f9 100644 --- a/gators/feature_generation_dt/ordinal_month_of_year.py +++ b/gators/feature_generation_dt/ordinal_month_of_year.py @@ -1,116 +1,98 @@ # Licence Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd import feature_gen_dt from ._base_datetime_feature import _BaseDatetimeFeature +from gators import DataFrame + class OrdinalMonthOfYear(_BaseDatetimeFeature): """Create new columns based on the month of the year. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 12.0 - 2 NaT 0 nan - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> obj.fit_transform(X) - A B A__month_of_year - 0 2020-01-01 23:00:00 0 1.0 - 1 2020-12-15 18:00:00 1 12.0 - 2 NaT 0 nan + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}), npartitions=1) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `pandas` & transform with `NumPy` + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], - [NaT, 0, 'nan']], dtype=object) + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_dt import OrdinalMonthOfYear - >>> X = ks.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', pd.NaT], 'B': [0, 1, 0]}) - >>> obj = OrdinalMonthOfYear(columns=['A']) + >>> obj.fit_transform(X) + A B A__month_of_year + 0 2020-01-01 23:00:00 0 1.0 + 1 2020-12-15 18:00:00 1 12.0 + 2 NaT 0 NaN + + >>> X = pd.DataFrame({'A': ['2020-01-01T23', '2020-12-15T18', None], 'B': [0, 1, 0]}) + >>> X['A'] = X['A'].astype('datetime64[ns]') >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) - array([[Timestamp('2020-01-01 23:00:00'), 0, '1.0'], - [Timestamp('2020-12-15 18:00:00'), 1, '12.0'], - [NaT, 0, 'nan']], dtype=object) - - + array([[Timestamp('2020-01-01 23:00:00'), 0, 1.0], + [Timestamp('2020-12-15 18:00:00'), 1, 12.0], + [NaT, 0, nan]], dtype=object) """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): + def __init__(self, columns: List[str], date_format: str = "ymd"): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") if not columns: raise ValueError("`columns` should not be empty.") column_names = [f"{c}__month_of_year" for c in columns] - column_mapping = dict(zip(column_names, columns)) - _BaseDatetimeFeature.__init__(self, columns, column_names, column_mapping) + _BaseDatetimeFeature.__init__(self, columns, date_format, column_names) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ - if isinstance(X, pd.DataFrame): - X_ordinal = X[self.columns].apply( - lambda x: x.dt.month.astype(np.float64).astype(str) - ) - X_ordinal.columns = self.column_names - return X.join(X_ordinal) - - for col, name in zip(self.columns, self.column_names): - X = X.assign(dummy=X[col].dt.month.astype(np.float64).astype(str)).rename( - columns={"dummy": name} - ) + self.check_dataframe(X) + + for name, col in zip(self.column_names, self.columns): + X[name] = X[col].dt.month + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. + """Transform the array `X`. Parameters ---------- @@ -119,7 +101,11 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray: Dataset with the Tree features. + X : np.ndarray + Transformed array. """ self.check_array(X) - return feature_gen_dt.ordinal_month_of_year(X, self.idx_columns) + X_new = feature_gen_dt.ordinal_datetime( + X[:, self.idx_columns], self.idx_month_bounds + ) + return np.concatenate([X, X_new], axis=1) diff --git a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index ed78ce09..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index a4758706..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 684b0a20..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index f402e565..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_base_datetime_features_dt.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index 44ef0097..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 2af1b830..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 8347840d..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index c21b3c77..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_month.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index df156695..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index bfc72d9f..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 4e1bfac8..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index b2482e99..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_day_of_week.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index d6ba7045..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 112622c7..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index f3d257fe..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index 55e85724..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_hour_of_day.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index c5f92fc3..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 9ef50b4b..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index d2be98cb..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index be356ca9..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_minute_of_hour.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index 59979f96..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index ba041137..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index a5b98547..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index f0b91256..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_cyclic_month_of_year.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index 7ba232a2..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 10b5da36..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 721c477a..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index 5af488d9..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time_dd.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time_dd.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 6076114f..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time_dd.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time_ks.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time_ks.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index aff1a737..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time_ks.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_delta_time_pd.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_delta_time_pd.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 01e35bfd..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_delta_time_pd.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index 52653e97..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index b9833466..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 7067bbb4..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index 252b1e1f..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_month.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index e615b4e9..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 174dfa3c..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index ae82c1bd..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index 11c2d1c1..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_day_of_week.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index cdaa9aea..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 8f995b2f..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 346c63a5..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index a9ae5f07..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_hour_of_day.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index 99d96fd8..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 6642cd2a..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 3f5e3d94..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index 66c43e0d..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_minute_of_hour.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-36-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index f3fc05d4..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-37-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 17689d9f..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-38-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index d5000c34..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-39-pytest-6.2.5.pyc b/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index b9a51108..00000000 Binary files a/gators/feature_generation_dt/tests/__pycache__/test_ordinal_month_of_year.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py b/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py index 43f75bf6..b96b8ebe 100644 --- a/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py +++ b/gators/feature_generation_dt/tests/test_base_datetime_features_dt.py @@ -1,12 +1,8 @@ # Licence Apache-2.0 -import databricks.koalas as ks -import pandas as pd import pytest - +import pandas as pd from gators.feature_generation_dt.ordinal_day_of_month import OrdinalDayOfMonth -ks.set_option("compute.default_index_type", "distributed-sequence") - def test_init_pd(): X = pd.DataFrame({"A": [0], "B": [0]}) @@ -15,9 +11,10 @@ def test_init_pd(): _ = obj.fit(X) -@pytest.mark.koalas -def test_init_ks(): - X = ks.DataFrame({"A": [0], "B": [0]}) - obj = OrdinalDayOfMonth(columns=["A", "B"]) +@pytest.mark.pyspark +def test_dateformat(): + obj = OrdinalDayOfMonth(columns=["A"]) with pytest.raises(TypeError): - _ = obj.fit(X) + OrdinalDayOfMonth(columns=["A"], date_format=0) + with pytest.raises(ValueError): + OrdinalDayOfMonth(columns=["A"], date_format="abc") diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py deleted file mode 100644 index cc98d49a..00000000 --- a/gators/feature_generation_dt/tests/test_cyclic_day_of_month.py +++ /dev/null @@ -1,117 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import CyclicDayOfMonth - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2021-02-28T06", None, np.nan], - "B": ["2020-02-29T06", None, np.nan], - "C": ["2020-03-01T12", None, np.nan], - "D": ["2020-04-01T18", None, np.nan], - "E": ["2020-05-31T23", None, np.nan], - "X": ["x", "x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - X_expected = pd.DataFrame( - { - "A__day_of_month_cos": [1.0, np.nan, np.nan], - "A__day_of_month_sin": [0.0, np.nan, np.nan], - "B__day_of_month_cos": [1.0, np.nan, np.nan], - "B__day_of_month_sin": [0.0, np.nan, np.nan], - "C__day_of_month_cos": [1.0, np.nan, np.nan], - "C__day_of_month_sin": [0.0, np.nan, np.nan], - "D__day_of_month_cos": [1.0, np.nan, np.nan], - "D__day_of_month_sin": [0.0, np.nan, np.nan], - "E__day_of_month_cos": [1.0, np.nan, np.nan], - "E__day_of_month_sin": [0.0, np.nan, np.nan], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2021-02-28T06", None, np.nan], - "B": ["2020-02-29T06", None, np.nan], - "C": ["2020-03-01T12", None, np.nan], - "D": ["2020-04-01T18", None, np.nan], - "E": ["2020-05-31T23", None, np.nan], - "X": ["x", "x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "A__day_of_month_cos": [1.0, np.nan, np.nan], - "A__day_of_month_sin": [0.0, np.nan, np.nan], - "B__day_of_month_cos": [1.0, np.nan, np.nan], - "B__day_of_month_sin": [0.0, np.nan, np.nan], - "C__day_of_month_cos": [1.0, np.nan, np.nan], - "C__day_of_month_sin": [0.0, np.nan, np.nan], - "D__day_of_month_cos": [1.0, np.nan, np.nan], - "D__day_of_month_sin": [0.0, np.nan, np.nan], - "E__day_of_month_cos": [1.0, np.nan, np.nan], - "E__day_of_month_sin": [0.0, np.nan, np.nan], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicDayOfMonth(columns=0) - with pytest.raises(ValueError): - _ = CyclicDayOfMonth(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py new file mode 100644 index 00000000..088c446a --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py @@ -0,0 +1,58 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicDayOfMonth + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2021-02-28T06", None, None], + "B": ["2020-02-29T06", None, None], + "C": ["2020-03-01T12", None, None], + "X": ["x", "x", "x"], + } + ), + npartitions=1, + ) + + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + + X_expected = pd.DataFrame( + { + "A__day_of_month_cos": [0.9749279121818235, np.nan, np.nan], + "A__day_of_month_sin": [-0.22252093395631464, np.nan, np.nan], + "B__day_of_month_cos": [0.9766205557100867, np.nan, np.nan], + "B__day_of_month_sin": [-0.2149704402110244, np.nan, np.nan], + "C__day_of_month_cos": [1.0, np.nan, np.nan], + "C__day_of_month_sin": [0.0, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C"] + obj = CyclicDayOfMonth(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py new file mode 100644 index 00000000..6e0518a9 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicDayOfMonth + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2021-02-28T06", None, None], + "B": ["2020-02-29T06", None, None], + "C": ["2020-03-01T12", None, None], + "X": ["x", "x", "x"], + } + ) + columns = ["A", "B", "C"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + + X_expected = pd.DataFrame( + { + "A__day_of_month_cos": [0.9749279121818235, np.nan, np.nan], + "A__day_of_month_sin": [-0.22252093395631464, np.nan, np.nan], + "B__day_of_month_cos": [0.9766205557100867, np.nan, np.nan], + "B__day_of_month_sin": [-0.2149704402110244, np.nan, np.nan], + "C__day_of_month_cos": [1.0, np.nan, np.nan], + "C__day_of_month_sin": [0.0, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = CyclicDayOfMonth(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py new file mode 100644 index 00000000..fecd85f9 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py @@ -0,0 +1,60 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicDayOfMonth + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2021-02-28T06", None, None], + "B": ["2020-02-29T06", None, None], + "C": ["2020-03-01T12", None, None], + "X": ["x", "x", "x"], + } + ) + columns = ["A", "B", "C"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.to_numpy() + + X_expected = pd.DataFrame( + { + "A__day_of_month_cos": [0.9749279121818235, np.nan, np.nan], + "A__day_of_month_sin": [-0.22252093395631464, np.nan, np.nan], + "B__day_of_month_cos": [0.9766205557100867, np.nan, np.nan], + "B__day_of_month_sin": [-0.2149704402110244, np.nan, np.nan], + "C__day_of_month_cos": [1.0, np.nan, np.nan], + "C__day_of_month_sin": [0.0, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = CyclicDayOfMonth(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = CyclicDayOfMonth(columns=0) + with pytest.raises(ValueError): + _ = CyclicDayOfMonth(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py deleted file mode 100644 index 5840454d..00000000 --- a/gators/feature_generation_dt/tests/test_cyclic_day_of_week.py +++ /dev/null @@ -1,117 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import CyclicDayOfWeek - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-05-04T00", None, np.nan], - "B": ["2020-05-06T06", None, np.nan], - "C": ["2020-05-08T23", None, np.nan], - "D": ["2020-05-09T06", None, np.nan], - "E": ["2020-05-10T06", None, np.nan], - "X": ["x", None, np.nan], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - X_expected = pd.DataFrame( - { - "A__day_of_week_cos": [1.0, np.nan, np.nan], - "A__day_of_week_sin": [0.0, np.nan, np.nan], - "B__day_of_week_cos": [-0.4999999999999998, np.nan, np.nan], - "B__day_of_week_sin": [0.8660254037844388, np.nan, np.nan], - "C__day_of_week_cos": [-0.5000000000000004, np.nan, np.nan], - "C__day_of_week_sin": [-0.8660254037844384, np.nan, np.nan], - "D__day_of_week_cos": [0.4999999999999993, np.nan, np.nan], - "D__day_of_week_sin": [-0.866025403784439, np.nan, np.nan], - "E__day_of_week_cos": [1.0, None, np.nan], - "E__day_of_week_sin": [-2.4492935982947064e-16, None, np.nan], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-05-04T00", None, np.nan], - "B": ["2020-05-06T06", None, np.nan], - "C": ["2020-05-08T23", None, np.nan], - "D": ["2020-05-09T06", None, np.nan], - "E": ["2020-05-10T06", None, np.nan], - "X": ["x", None, np.nan], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "A__day_of_week_cos": [1.0, np.nan, np.nan], - "A__day_of_week_sin": [0.0, np.nan, np.nan], - "B__day_of_week_cos": [-0.4999999999999998, np.nan, np.nan], - "B__day_of_week_sin": [0.8660254037844388, np.nan, np.nan], - "C__day_of_week_cos": [-0.5000000000000004, np.nan, np.nan], - "C__day_of_week_sin": [-0.8660254037844384, np.nan, np.nan], - "D__day_of_week_cos": [0.4999999999999993, np.nan, np.nan], - "D__day_of_week_sin": [-0.866025403784439, np.nan, np.nan], - "E__day_of_week_cos": [1.0, None, np.nan], - "E__day_of_week_sin": [-2.4492935982947064e-16, None, np.nan], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicDayOfWeek(columns=0) - with pytest.raises(ValueError): - _ = CyclicDayOfWeek(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py new file mode 100644 index 00000000..bfe76955 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicDayOfWeek + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-04T00", None, None], + "B": ["2020-05-06T06", None, None], + "C": ["2020-05-08T23", None, None], + "D": ["2020-05-09T06", None, None], + "E": ["2020-05-10T06", None, None], + "X": ["x", None, None], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + + X_expected = pd.DataFrame( + { + "A__day_of_week_cos": [1.0, np.nan, np.nan], + "A__day_of_week_sin": [0.0, np.nan, np.nan], + "B__day_of_week_cos": [-0.22252093395631434, np.nan, np.nan], + "B__day_of_week_sin": [0.9749279121818236, np.nan, np.nan], + "C__day_of_week_cos": [-0.9009688679024191, np.nan, np.nan], + "C__day_of_week_sin": [-0.433883739117558, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C"] + obj = CyclicDayOfWeek(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py new file mode 100644 index 00000000..5c85ef44 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py @@ -0,0 +1,55 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicDayOfWeek + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-04T00", None, None], + "B": ["2020-05-06T06", None, None], + "C": ["2020-05-08T23", None, None], + "X": ["x", None, None], + } + ) + columns = ["A", "B", "C"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_week_cos": [1.0, np.nan, np.nan], + "A__day_of_week_sin": [0.0, np.nan, np.nan], + "B__day_of_week_cos": [-0.22252093395631434, np.nan, np.nan], + "B__day_of_week_sin": [0.9749279121818236, np.nan, np.nan], + "C__day_of_week_cos": [-0.9009688679024191, np.nan, np.nan], + "C__day_of_week_sin": [-0.433883739117558, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = CyclicDayOfWeek(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py b/gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py new file mode 100644 index 00000000..c1e50e6d --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicDayOfWeek + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-04T00", None, None], + "B": ["2020-05-06T06", None, None], + "C": ["2020-05-08T23", None, None], + "X": ["x", None, None], + } + ) + columns = ["A", "B", "C"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_week_cos": [1.0, np.nan, np.nan], + "A__day_of_week_sin": [0.0, np.nan, np.nan], + "B__day_of_week_cos": [-0.22252093395631434, np.nan, np.nan], + "B__day_of_week_sin": [0.9749279121818236, np.nan, np.nan], + "C__day_of_week_cos": [-0.9009688679024191, np.nan, np.nan], + "C__day_of_week_sin": [-0.433883739117558, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = CyclicDayOfWeek(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = CyclicDayOfWeek(columns=0) + with pytest.raises(ValueError): + _ = CyclicDayOfWeek(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py deleted file mode 100644 index e3299c62..00000000 --- a/gators/feature_generation_dt/tests/test_cyclic_hour_of_day.py +++ /dev/null @@ -1,117 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import CyclicHourOfDay - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-01-01T00", None, np.nan], - "B": ["2020-04-08T06", None, np.nan], - "C": ["2020-07-16T12", None, np.nan], - "D": ["2020-10-24T18", None, np.nan], - "E": ["2020-12-31T23", None, np.nan], - "X": ["x", "x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - X_expected = pd.DataFrame( - { - "A__hour_of_day_cos": [1.0, None, np.nan], - "A__hour_of_day_sin": [0.0, None, np.nan], - "B__hour_of_day_cos": [-0.06824241336467089, None, np.nan], - "B__hour_of_day_sin": [0.9976687691905392, None, np.nan], - "C__hour_of_day_cos": [-0.9906859460363308, None, np.nan], - "C__hour_of_day_sin": [-0.13616664909624643, None, np.nan], - "D__hour_of_day_cos": [0.20345601305263328, None, np.nan], - "D__hour_of_day_sin": [-0.979084087682323, None, np.nan], - "E__hour_of_day_cos": [1.0, None, np.nan], - "E__hour_of_day_sin": [-2.4492935982947064e-16, None, np.nan], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-01-01T00", None, np.nan], - "B": ["2020-04-08T06", None, np.nan], - "C": ["2020-07-16T12", None, np.nan], - "D": ["2020-10-24T18", None, np.nan], - "E": ["2020-12-31T23", None, np.nan], - "X": ["x", "x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "A__hour_of_day_cos": [1.0, None, np.nan], - "A__hour_of_day_sin": [0.0, None, np.nan], - "B__hour_of_day_cos": [-0.06824241336467089, None, np.nan], - "B__hour_of_day_sin": [0.9976687691905392, None, np.nan], - "C__hour_of_day_cos": [-0.9906859460363308, None, np.nan], - "C__hour_of_day_sin": [-0.13616664909624643, None, np.nan], - "D__hour_of_day_cos": [0.20345601305263328, None, np.nan], - "D__hour_of_day_sin": [-0.979084087682323, None, np.nan], - "E__hour_of_day_cos": [1.0, None, np.nan], - "E__hour_of_day_sin": [-2.4492935982947064e-16, None, np.nan], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicHourOfDay(columns=0) - with pytest.raises(ValueError): - _ = CyclicHourOfDay(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py new file mode 100644 index 00000000..d08cd87f --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicHourOfDay + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-01-01T00", None, None], + "B": ["2020-04-08T06", None, None], + "C": ["2020-07-16T12", None, None], + "X": ["x", "x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__hour_of_day_cos": [1.0, None, np.nan], + "A__hour_of_day_sin": [0.0, None, np.nan], + "B__hour_of_day_cos": [0.0, None, np.nan], + "B__hour_of_day_sin": [1.0, None, np.nan], + "C__hour_of_day_cos": [-1, None, np.nan], + "C__hour_of_day_sin": [0.0, None, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C"] + obj = CyclicHourOfDay(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py new file mode 100644 index 00000000..05c1b996 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py @@ -0,0 +1,55 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicHourOfDay + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-01-01T00", None, None], + "B": ["2020-04-08T06", None, None], + "C": ["2020-07-16T12", None, None], + "X": ["x", "x", "x"], + } + ) + columns = ["A", "B", "C"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__hour_of_day_cos": [1.0, None, np.nan], + "A__hour_of_day_sin": [0.0, None, np.nan], + "B__hour_of_day_cos": [0.0, None, np.nan], + "B__hour_of_day_sin": [1.0, None, np.nan], + "C__hour_of_day_cos": [-1, None, np.nan], + "C__hour_of_day_sin": [0.0, None, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = CyclicHourOfDay(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py new file mode 100644 index 00000000..c394c5c9 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicHourOfDay + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-01-01T00", None, None], + "B": ["2020-04-08T06", None, None], + "C": ["2020-07-16T12", None, None], + "X": ["x", "x", "x"], + } + ) + columns = ["A", "B", "C"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__hour_of_day_cos": [1.0, None, np.nan], + "A__hour_of_day_sin": [0.0, None, np.nan], + "B__hour_of_day_cos": [0.0, None, np.nan], + "B__hour_of_day_sin": [1.0, None, np.nan], + "C__hour_of_day_cos": [-1, None, np.nan], + "C__hour_of_day_sin": [0.0, None, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = CyclicHourOfDay(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = CyclicHourOfDay(columns=0) + with pytest.raises(ValueError): + _ = CyclicHourOfDay(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py deleted file mode 100644 index f0847e88..00000000 --- a/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour.py +++ /dev/null @@ -1,117 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import CyclicMinuteOfHour - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-05-04 00:00:00", pd.NaT], - "B": ["2020-05-06 00:10:00", pd.NaT], - "C": ["2020-05-08 00:20:00", pd.NaT], - "D": ["2020-05-09 00:40:00", pd.NaT], - "E": ["2020-05-09 00:59:00", pd.NaT], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[m]") - X_expected = pd.DataFrame( - { - "A__minute_of_hour_cos": [1.0, np.nan], - "A__minute_of_hour_sin": [0.0, np.nan], - "B__minute_of_hour_cos": [0.48455087033265026, np.nan], - "B__minute_of_hour_sin": [0.8747630845319612, np.nan], - "C__minute_of_hour_cos": [-0.5304209081197424, np.nan], - "C__minute_of_hour_sin": [0.847734427889671, np.nan], - "D__minute_of_hour_cos": [-0.43730732045885556, np.nan], - "D__minute_of_hour_sin": [-0.8993121301712191, np.nan], - "E__minute_of_hour_cos": [1.0, np.nan], - "E__minute_of_hour_sin": [-2.4492935982947064e-16, np.nan], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-05-04 00:00:00", None], - "B": ["2020-05-06 00:10:00", None], - "C": ["2020-05-08 00:20:00", None], - "D": ["2020-05-09 00:40:00", None], - "E": ["2020-05-09 00:59:00", None], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "A__minute_of_hour_cos": [1.0, np.nan], - "A__minute_of_hour_sin": [0.0, np.nan], - "B__minute_of_hour_cos": [0.48455087033265026, np.nan], - "B__minute_of_hour_sin": [0.8747630845319612, np.nan], - "C__minute_of_hour_cos": [-0.5304209081197424, np.nan], - "C__minute_of_hour_sin": [0.847734427889671, np.nan], - "D__minute_of_hour_cos": [-0.43730732045885556, np.nan], - "D__minute_of_hour_sin": [-0.8993121301712191, np.nan], - "E__minute_of_hour_cos": [1.0, np.nan], - "E__minute_of_hour_sin": [-2.4492935982947064e-16, np.nan], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicMinuteOfHour(columns=0) - with pytest.raises(ValueError): - _ = CyclicMinuteOfHour(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py new file mode 100644 index 00000000..d870928a --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicMinuteOfHour + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 00:10:00", None], + "C": ["2020-05-08 00:20:00", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__minute_of_hour_cos": [1.0, np.nan], + "A__minute_of_hour_sin": [0.0, np.nan], + "B__minute_of_hour_cos": [0.5000000000000001, np.nan], + "B__minute_of_hour_sin": [0.8660254037844386, np.nan], + "C__minute_of_hour_cos": [-0.4999999999999998, np.nan], + "C__minute_of_hour_sin": [0.8660254037844388, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C"] + obj = CyclicMinuteOfHour(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py new file mode 100644 index 00000000..bbaf3081 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py @@ -0,0 +1,55 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicMinuteOfHour + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 00:10:00", None], + "C": ["2020-05-08 00:20:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__minute_of_hour_cos": [1.0, np.nan], + "A__minute_of_hour_sin": [0.0, np.nan], + "B__minute_of_hour_cos": [0.5000000000000001, np.nan], + "B__minute_of_hour_sin": [0.8660254037844386, np.nan], + "C__minute_of_hour_cos": [-0.4999999999999998, np.nan], + "C__minute_of_hour_sin": [0.8660254037844388, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = CyclicMinuteOfHour(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py new file mode 100644 index 00000000..b608aea8 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicMinuteOfHour + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 00:10:00", None], + "C": ["2020-05-08 00:20:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__minute_of_hour_cos": [1.0, np.nan], + "A__minute_of_hour_sin": [0.0, np.nan], + "B__minute_of_hour_cos": [0.5000000000000001, np.nan], + "B__minute_of_hour_sin": [0.8660254037844386, np.nan], + "C__minute_of_hour_cos": [-0.4999999999999998, np.nan], + "C__minute_of_hour_sin": [0.8660254037844388, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = CyclicMinuteOfHour(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = CyclicMinuteOfHour(columns=0) + with pytest.raises(ValueError): + _ = CyclicMinuteOfHour(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py b/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py deleted file mode 100644 index 24ef7ad3..00000000 --- a/gators/feature_generation_dt/tests/test_cyclic_month_of_year.py +++ /dev/null @@ -1,117 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import CyclicMonthOfYear - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-01-01T00", pd.NaT, None], - "B": ["2020-04-08T06", pd.NaT, None], - "C": ["2020-07-16T12", pd.NaT, None], - "D": ["2020-10-24T18", pd.NaT, None], - "E": ["2020-12-31T23", pd.NaT, None], - "X": ["x", "x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - X_expected = pd.DataFrame( - { - "A__month_of_year_cos": [1.0, np.nan, np.nan], - "A__month_of_year_sin": [0.0, np.nan, np.nan], - "B__month_of_year_cos": [-0.142314838273285, np.nan, np.nan], - "B__month_of_year_sin": [0.9898214418809328, np.nan, np.nan], - "C__month_of_year_cos": [-0.9594929736144975, np.nan, np.nan], - "C__month_of_year_sin": [-0.28173255684142945, np.nan, np.nan], - "D__month_of_year_cos": [0.41541501300188605, np.nan, np.nan], - "D__month_of_year_sin": [-0.9096319953545186, np.nan, np.nan], - "E__month_of_year_cos": [1.0, np.nan, np.nan], - "E__month_of_year_sin": [-1.133107779529596e-16, np.nan, np.nan], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = CyclicMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-01-01T00", pd.NaT, None], - "B": ["2020-04-08T06", pd.NaT, None], - "C": ["2020-07-16T12", pd.NaT, None], - "D": ["2020-10-24T18", pd.NaT, None], - "E": ["2020-12-31T23", pd.NaT, None], - "X": ["x", "x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "A__month_of_year_cos": [1.0, np.nan, np.nan], - "A__month_of_year_sin": [0.0, np.nan, np.nan], - "B__month_of_year_cos": [-0.142314838273285, np.nan, np.nan], - "B__month_of_year_sin": [0.9898214418809328, np.nan, np.nan], - "C__month_of_year_cos": [-0.9594929736144975, np.nan, np.nan], - "C__month_of_year_sin": [-0.28173255684142945, np.nan, np.nan], - "D__month_of_year_cos": [0.41541501300188605, np.nan, np.nan], - "D__month_of_year_sin": [-0.9096319953545186, np.nan, np.nan], - "E__month_of_year_cos": [1.0, np.nan, np.nan], - "E__month_of_year_sin": [-1.133107779529596e-16, np.nan, np.nan], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = CyclicMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.fit_transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = CyclicMonthOfYear(columns=0) - with pytest.raises(ValueError): - _ = CyclicMonthOfYear(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py b/gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py new file mode 100644 index 00000000..e5fabd89 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicMonthOfYear + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-01-01T00", None, None], + "B": ["2020-04-08T06", None, None], + "C": ["2020-07-16T12", None, None], + "X": ["x", "x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__month_of_year_cos": [1.0, np.nan, np.nan], + "A__month_of_year_sin": [0.0, np.nan, np.nan], + "B__month_of_year_cos": [0.0, np.nan, np.nan], + "B__month_of_year_sin": [1.0, np.nan, np.nan], + "C__month_of_year_cos": [-1.0, np.nan, np.nan], + "C__month_of_year_sin": [-0.0, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C"] + obj = CyclicMonthOfYear(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py b/gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py new file mode 100644 index 00000000..8f94ab92 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py @@ -0,0 +1,61 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicMonthOfYear + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-01-01T00", None, None], + "B": ["2020-04-08T06", None, None], + "C": ["2020-07-16T12", None, None], + "D": ["2020-10-24T18", None, None], + "E": ["2020-12-31T23", None, None], + "X": ["x", "x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__month_of_year_cos": [1.0, np.nan, np.nan], + "A__month_of_year_sin": [0.0, np.nan, np.nan], + "B__month_of_year_cos": [0.0, np.nan, np.nan], + "B__month_of_year_sin": [1.0, np.nan, np.nan], + "C__month_of_year_cos": [-1.0, np.nan, np.nan], + "C__month_of_year_sin": [-0.0, np.nan, np.nan], + "D__month_of_year_cos": [0.0, np.nan, np.nan], + "D__month_of_year_sin": [-1, np.nan, np.nan], + "E__month_of_year_cos": [0.8660254037844384, np.nan, np.nan], + "E__month_of_year_sin": [-0.5, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = CyclicMonthOfYear(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py b/gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py new file mode 100644 index 00000000..8593c11e --- /dev/null +++ b/gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import CyclicMonthOfYear + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-01-01T00", None, None], + "B": ["2020-04-08T06", None, None], + "C": ["2020-07-16T12", None, None], + "X": ["x", "x", "x"], + } + ) + columns = ["A", "B", "C"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__month_of_year_cos": [1.0, np.nan, np.nan], + "A__month_of_year_sin": [0.0, np.nan, np.nan], + "B__month_of_year_cos": [0.0, np.nan, np.nan], + "B__month_of_year_sin": [1.0, np.nan, np.nan], + "C__month_of_year_cos": [-1.0, np.nan, np.nan], + "C__month_of_year_sin": [-0.0, np.nan, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = CyclicMonthOfYear(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.fit_transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = CyclicMonthOfYear(columns=0) + with pytest.raises(ValueError): + _ = CyclicMonthOfYear(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_delta_time.py b/gators/feature_generation_dt/tests/test_delta_time.py deleted file mode 100644 index b84c1de4..00000000 --- a/gators/feature_generation_dt/tests/test_delta_time.py +++ /dev/null @@ -1,123 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt.delta_time import DeltaTime - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": {0: "2020-05-04 00:00:00", 1: pd.NaT}, - "B": {0: "2020-05-04 06:00:00", 1: pd.NaT}, - "C": {0: "2020-05-04 12:00:00", 1: pd.NaT}, - "D": {0: "2020-05-04 18:00:00", 1: pd.NaT}, - "E": {0: "2020-05-04 23:00:00", 1: pd.NaT}, - "X": {0: "x", 1: "x"}, - } - ) - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - - X_expected = pd.DataFrame( - { - "B__A__Deltatime[s]": {0: 21600.0, 1: np.nan}, - "C__A__Deltatime[s]": {0: 43200.0, 1: np.nan}, - "D__A__Deltatime[s]": {0: 64800.0, 1: np.nan}, - "E__A__Deltatime[s]": {0: 82800.0, 1: np.nan}, - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=["A", "A", "A", "A"]).fit( - X - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": {0: "2020-05-04 00:00:00", 1: pd.NaT}, - "B": {0: "2020-05-04 06:00:00", 1: pd.NaT}, - "C": {0: "2020-05-04 12:00:00", 1: pd.NaT}, - "D": {0: "2020-05-04 18:00:00", 1: pd.NaT}, - "E": {0: "2020-05-04 23:00:00", 1: pd.NaT}, - "X": {0: "x", 1: "x"}, - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "B__A__Deltatime[s]": {0: 21600.0, 1: np.nan}, - "C__A__Deltatime[s]": {0: 43200.0, 1: np.nan}, - "D__A__Deltatime[s]": {0: 64800.0, 1: np.nan}, - "E__A__Deltatime[s]": {0: 82800.0, 1: np.nan}, - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=["A", "A", "A", "A"]).fit( - X - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = DeltaTime(columns_a=0, columns_b=["A", "A", "A", "A"]) - with pytest.raises(TypeError): - _ = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=0) - with pytest.raises(ValueError): - _ = DeltaTime(columns_a=[], columns_b=["A", "A", "A", "A"]) - with pytest.raises(ValueError): - _ = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=[]) - with pytest.raises(ValueError): - _ = DeltaTime(columns_a=["B"], columns_b=["A", "A", "A", "A"]) - - -def test_init_fit(data): - _, _, X = data - with pytest.raises(TypeError): - _ = DeltaTime( - columns_a=["B", "C", "D", "X"], columns_b=["A", "A", "A", "A"] - ).fit(X) diff --git a/gators/feature_generation_dt/tests/test_delta_time_dd.py b/gators/feature_generation_dt/tests/test_delta_time_dd.py new file mode 100644 index 00000000..d786233a --- /dev/null +++ b/gators/feature_generation_dt/tests/test_delta_time_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt.delta_time import DeltaTime + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-04 06:00:00", None], + "C": ["2020-05-04 12:00:00", None], + "D": ["2020-05-04 18:00:00", None], + "E": ["2020-05-04 23:00:00", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "B__A__Deltatime[s]": [21600.0, np.nan], + "C__A__Deltatime[s]": [43200.0, np.nan], + "D__A__Deltatime[s]": [64800.0, np.nan], + "E__A__Deltatime[s]": [82800.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + obj = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=["A", "A", "A", "A"]).fit( + X + ) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_delta_time_ks.py b/gators/feature_generation_dt/tests/test_delta_time_ks.py new file mode 100644 index 00000000..392d8dbe --- /dev/null +++ b/gators/feature_generation_dt/tests/test_delta_time_ks.py @@ -0,0 +1,57 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt.delta_time import DeltaTime + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-04 06:00:00", None], + "C": ["2020-05-04 12:00:00", None], + "D": ["2020-05-04 18:00:00", None], + "E": ["2020-05-04 23:00:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "B__A__Deltatime[s]": [21600.0, np.nan], + "C__A__Deltatime[s]": [43200.0, np.nan], + "D__A__Deltatime[s]": [64800.0, np.nan], + "E__A__Deltatime[s]": [82800.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=["A", "A", "A", "A"]).fit( + X + ) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_delta_time_pd.py b/gators/feature_generation_dt/tests/test_delta_time_pd.py new file mode 100644 index 00000000..895cb884 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_delta_time_pd.py @@ -0,0 +1,80 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt.delta_time import DeltaTime + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-04 06:00:00", None], + "C": ["2020-05-04 12:00:00", None], + "D": ["2020-05-04 18:00:00", None], + "E": ["2020-05-04 23:00:00", None], + "X": ["x", "x"], + } + ) + X_np = X.to_numpy() + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_expected = pd.DataFrame( + { + "B__A__Deltatime[s]": [21600.0, np.nan], + "C__A__Deltatime[s]": [43200.0, np.nan], + "D__A__Deltatime[s]": [64800.0, np.nan], + "E__A__Deltatime[s]": [82800.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=["A", "A", "A", "A"]).fit( + X + ) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = DeltaTime(columns_a=0, columns_b=["A", "A", "A", "A"]) + with pytest.raises(TypeError): + _ = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=0) + with pytest.raises(ValueError): + _ = DeltaTime(columns_a=[], columns_b=["A", "A", "A", "A"]) + with pytest.raises(ValueError): + _ = DeltaTime(columns_a=["B", "C", "D", "E"], columns_b=[]) + with pytest.raises(ValueError): + _ = DeltaTime(columns_a=["B"], columns_b=["A", "A", "A", "A"]) + + +def test_init_fit(): + with pytest.raises(ValueError): + _ = DeltaTime(columns_a=["B", "C", "D"], columns_b=["A", "A", "A", "A"]) + + +def test_fit(): + X = pd.DataFrame({"A": [0], "B": [0]}) + obj = DeltaTime(columns_a=["A"], columns_b=["B"]) + with pytest.raises(TypeError): + _ = obj.fit(X) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py deleted file mode 100644 index 27dd969e..00000000 --- a/gators/feature_generation_dt/tests/test_ordinal_day_of_month.py +++ /dev/null @@ -1,109 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import OrdinalDayOfMonth - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-05-01 00:00:00", np.nan], - "B": ["2020-05-08 06:00:00", np.nan], - "C": ["2020-05-16 12:00:00", np.nan], - "D": ["2020-05-24 18:00:00", None], - "E": ["2020-05-30 23:00:00", None], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - - X_expected = pd.DataFrame( - { - "A__day_of_month": ["1.0", "nan"], - "B__day_of_month": ["8.0", "nan"], - "C__day_of_month": ["16.0", "nan"], - "D__day_of_month": ["24.0", "nan"], - "E__day_of_month": ["30.0", "nan"], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-05-01 00:00:00", np.nan], - "B": ["2020-05-08 06:00:00", np.nan], - "C": ["2020-05-16 12:00:00", np.nan], - "D": ["2020-05-24 18:00:00", None], - "E": ["2020-05-30 23:00:00", None], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - - X_expected = pd.DataFrame( - { - "A__day_of_month": ["1.0", "nan"], - "B__day_of_month": ["8.0", "nan"], - "C__day_of_month": ["16.0", "nan"], - "D__day_of_month": ["24.0", "nan"], - "E__day_of_month": ["30.0", "nan"], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalDayOfMonth(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalDayOfMonth(columns=0) - with pytest.raises(ValueError): - _ = OrdinalDayOfMonth(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py new file mode 100644 index 00000000..a8fc4d4a --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalDayOfMonth + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-01 00:00:00", None], + "B": ["2020-05-08 06:00:00", None], + "C": ["2020-05-16 12:00:00", None], + "D": ["2020-05-24 18:00:00", None], + "E": ["2020-05-30 23:00:00", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_month": [1.0, np.nan], + "B__day_of_month": [8.0, np.nan], + "C__day_of_month": [16.0, np.nan], + "D__day_of_month": [24.0, np.nan], + "E__day_of_month": [30.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C", "D", "E"] + obj = OrdinalDayOfMonth(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py new file mode 100644 index 00000000..33119799 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalDayOfMonth + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-01 00:00:00", None], + "B": ["2020-05-08 06:00:00", None], + "C": ["2020-05-16 12:00:00", None], + "D": ["2020-05-24 18:00:00", None], + "E": ["2020-05-30 23:00:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_month": [1.0, np.nan], + "B__day_of_month": [8.0, np.nan], + "C__day_of_month": [16.0, np.nan], + "D__day_of_month": [24.0, np.nan], + "E__day_of_month": [30.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = OrdinalDayOfMonth(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py new file mode 100644 index 00000000..f4f4560e --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py @@ -0,0 +1,62 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalDayOfMonth + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-01 00:00:00", None], + "B": ["2020-05-08 06:00:00", None], + "C": ["2020-05-16 12:00:00", None], + "D": ["2020-05-24 18:00:00", None], + "E": ["2020-05-30 23:00:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_month": [1.0, None], + "B__day_of_month": [8.0, None], + "C__day_of_month": [16.0, None], + "D__day_of_month": [24.0, None], + "E__day_of_month": [30.0, None], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = OrdinalDayOfMonth(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = OrdinalDayOfMonth(columns=0) + with pytest.raises(ValueError): + _ = OrdinalDayOfMonth(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py deleted file mode 100644 index e53f45ed..00000000 --- a/gators/feature_generation_dt/tests/test_ordinal_day_of_week.py +++ /dev/null @@ -1,111 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal, assert_series_equal - -from gators.feature_generation_dt import OrdinalDayOfWeek - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": {0: "2020-05-04 00:00:00", 1: np.nan}, - "B": {0: "2020-05-06 06:00:00", 1: np.nan}, - "C": {0: "2020-05-08 23:00:00", 1: pd.NaT}, - "D": {0: "2020-05-09 06:00:00", 1: None}, - "E": {0: "2020-05-10 06:00:00", 1: None}, - "X": {0: "x", 1: "x"}, - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - - X_expected = pd.DataFrame( - { - "A__day_of_week": {0: "0.0", 1: "nan"}, - "B__day_of_week": {0: "2.0", 1: "nan"}, - "C__day_of_week": {0: "4.0", 1: "nan"}, - "D__day_of_week": {0: "5.0", 1: "nan"}, - "E__day_of_week": {0: "6.0", 1: "nan"}, - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": {0: "2020-05-04 00:00:00", 1: np.nan}, - "B": {0: "2020-05-06 06:00:00", 1: np.nan}, - "C": {0: "2020-05-08 23:00:00", 1: pd.NaT}, - "D": {0: "2020-05-09 06:00:00", 1: None}, - "E": {0: "2020-05-10 06:00:00", 1: None}, - "X": {0: "x", 1: "x"}, - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - - X_expected = pd.DataFrame( - { - "A__day_of_week": {0: "0.0", 1: "nan"}, - "B__day_of_week": {0: "2.0", 1: "nan"}, - "C__day_of_week": {0: "4.0", 1: "nan"}, - "D__day_of_week": {0: "5.0", 1: "nan"}, - "E__day_of_week": {0: "6.0", 1: "nan"}, - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalDayOfWeek(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_series_equal(X_new.dtypes, X_expected.dtypes) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_series_equal(X_new.dtypes, X_expected.dtypes) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalDayOfWeek(columns=0) - with pytest.raises(ValueError): - _ = OrdinalDayOfWeek(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py new file mode 100644 index 00000000..43efabbc --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py @@ -0,0 +1,60 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.feature_generation_dt import OrdinalDayOfWeek + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 06:00:00", None], + "C": ["2020-05-08 23:00:00", None], + "D": ["2020-05-09 06:00:00", None], + "E": ["2020-05-10 06:00:00", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_week": [0.0, np.nan], + "B__day_of_week": [2.0, np.nan], + "C__day_of_week": [4.0, np.nan], + "D__day_of_week": [5.0, np.nan], + "E__day_of_week": [6.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C", "D", "E"] + obj = OrdinalDayOfWeek(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_series_equal(X_new.dtypes, X_expected.dtypes) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py new file mode 100644 index 00000000..3d99f057 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.feature_generation_dt import OrdinalDayOfWeek + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 06:00:00", None], + "C": ["2020-05-08 23:00:00", None], + "D": ["2020-05-09 06:00:00", None], + "E": ["2020-05-10 06:00:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_week": [0.0, np.nan], + "B__day_of_week": [2.0, np.nan], + "C__day_of_week": [4.0, np.nan], + "D__day_of_week": [5.0, np.nan], + "E__day_of_week": [6.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = OrdinalDayOfWeek(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py b/gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py new file mode 100644 index 00000000..fdb4b5f4 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py @@ -0,0 +1,65 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.feature_generation_dt import OrdinalDayOfWeek + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 06:00:00", None], + "C": ["2020-05-08 23:00:00", None], + "D": ["2020-05-09 06:00:00", None], + "E": ["2020-05-10 06:00:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__day_of_week": [0.0, np.nan], + "B__day_of_week": [2.0, np.nan], + "C__day_of_week": [4.0, np.nan], + "D__day_of_week": [5.0, np.nan], + "E__day_of_week": [6.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = OrdinalDayOfWeek(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_series_equal(X_new.dtypes, X_expected.dtypes) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_series_equal(X_new.dtypes, X_expected.dtypes) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = OrdinalDayOfWeek(columns=0) + with pytest.raises(ValueError): + _ = OrdinalDayOfWeek(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py deleted file mode 100644 index 30472c6e..00000000 --- a/gators/feature_generation_dt/tests/test_ordinal_hour_of_day.py +++ /dev/null @@ -1,108 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import OrdinalHourOfDay - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-05-04 00:00:00", pd.NaT], - "B": ["2020-05-06 06:00:00", pd.NaT], - "C": ["2020-05-08 12:00:00", pd.NaT], - "D": ["2020-05-09 18:00:00", pd.NaT], - "E": ["2020-05-10 23:00:00", pd.NaT], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - - X_expected = pd.DataFrame( - { - "A__hour_of_day": ["0.0", "nan"], - "B__hour_of_day": ["6.0", "nan"], - "C__hour_of_day": ["12.0", "nan"], - "D__hour_of_day": ["18.0", "nan"], - "E__hour_of_day": ["23.0", "nan"], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-05-04 00:00:00", pd.NaT], - "B": ["2020-05-06 06:00:00", pd.NaT], - "C": ["2020-05-08 12:00:00", pd.NaT], - "D": ["2020-05-09 18:00:00", pd.NaT], - "E": ["2020-05-10 23:00:00", pd.NaT], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - - X_expected = pd.DataFrame( - { - "A__hour_of_day": ["0.0", "nan"], - "B__hour_of_day": ["6.0", "nan"], - "C__hour_of_day": ["12.0", "nan"], - "D__hour_of_day": ["18.0", "nan"], - "E__hour_of_day": ["23.0", "nan"], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalHourOfDay(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalHourOfDay(columns=0) - with pytest.raises(ValueError): - _ = OrdinalHourOfDay(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py new file mode 100644 index 00000000..f01fa420 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalHourOfDay + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 06:00:00", None], + "C": ["2020-05-08 12:00:00", None], + "D": ["2020-05-09 18:00:00", None], + "E": ["2020-05-10 23:00:00", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__hour_of_day": [0.0, np.nan], + "B__hour_of_day": [6.0, np.nan], + "C__hour_of_day": [12.0, np.nan], + "D__hour_of_day": [18.0, np.nan], + "E__hour_of_day": [23.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C", "D", "E"] + obj = OrdinalHourOfDay(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py new file mode 100644 index 00000000..a6161be5 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalHourOfDay + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 06:00:00", None], + "C": ["2020-05-08 12:00:00", None], + "D": ["2020-05-09 18:00:00", None], + "E": ["2020-05-10 23:00:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__hour_of_day": [0.0, np.nan], + "B__hour_of_day": [6.0, np.nan], + "C__hour_of_day": [12.0, np.nan], + "D__hour_of_day": [18.0, np.nan], + "E__hour_of_day": [23.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = OrdinalHourOfDay(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py new file mode 100644 index 00000000..71b0b1de --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py @@ -0,0 +1,62 @@ +# License: Apache-2.0 +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalHourOfDay + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 06:00:00", None], + "C": ["2020-05-08 12:00:00", None], + "D": ["2020-05-09 18:00:00", None], + "E": ["2020-05-10 23:00:00", None], + "X": ["x", "x"], + } + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__hour_of_day": [0.0, np.nan], + "B__hour_of_day": [6.0, np.nan], + "C__hour_of_day": [12.0, np.nan], + "D__hour_of_day": [18.0, np.nan], + "E__hour_of_day": [23.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + columns = ["A", "B", "C", "D", "E"] + obj = OrdinalHourOfDay(columns=columns).fit(X) + return obj, X, X_np, X_expected, X_expected_np + + +def test_pd(data): + obj, X, X_np, X_expected, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_np, X_expected, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = OrdinalHourOfDay(columns=0) + with pytest.raises(ValueError): + _ = OrdinalHourOfDay(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py deleted file mode 100644 index 3b7881fd..00000000 --- a/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour.py +++ /dev/null @@ -1,108 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import OrdinalMinuteOfHour - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-05-04-T00:00:00", pd.NaT], - "B": ["2020-05-06-T00:10:00", pd.NaT], - "C": ["2020-05-08-T00:20:00", pd.NaT], - "D": ["2020-05-09-T00:40:00", pd.NaT], - "E": ["2020-05-09-T00:59:00", pd.NaT], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[m]") - - X_expected = pd.DataFrame( - { - "A__minute_of_hour": ["0.0", "nan"], - "B__minute_of_hour": ["10.0", "nan"], - "C__minute_of_hour": ["20.0", "nan"], - "D__minute_of_hour": ["40.0", "nan"], - "E__minute_of_hour": ["59.0", "nan"], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-05-04 00:00:00", pd.NaT], - "B": ["2020-05-06 00:10:00", pd.NaT], - "C": ["2020-05-08 00:20:00", pd.NaT], - "D": ["2020-05-09 00:40:00", pd.NaT], - "E": ["2020-05-09 00:59:00", pd.NaT], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - - X_expected = pd.DataFrame( - { - "A__minute_of_hour": ["0.0", "nan"], - "B__minute_of_hour": ["10.0", "nan"], - "C__minute_of_hour": ["20.0", "nan"], - "D__minute_of_hour": ["40.0", "nan"], - "E__minute_of_hour": ["59.0", "nan"], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalMinuteOfHour(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalMinuteOfHour(columns=0) - with pytest.raises(ValueError): - _ = OrdinalMinuteOfHour(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py new file mode 100644 index 00000000..ddaf0387 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalMinuteOfHour + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 00:10:00", None], + "C": ["2020-05-08 00:20:00", None], + "D": ["2020-05-09 00:40:00", None], + "E": ["2020-05-09 00:59:00", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__minute_of_hour": [0.0, np.nan], + "B__minute_of_hour": [10.0, np.nan], + "C__minute_of_hour": [20.0, np.nan], + "D__minute_of_hour": [40.0, np.nan], + "E__minute_of_hour": [59.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C", "D", "E"] + obj = OrdinalMinuteOfHour(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py new file mode 100644 index 00000000..5fe7cbb9 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalMinuteOfHour + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 00:10:00", None], + "C": ["2020-05-08 00:20:00", None], + "D": ["2020-05-09 00:40:00", None], + "E": ["2020-05-09 00:59:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__minute_of_hour": [0.0, np.nan], + "B__minute_of_hour": [10.0, np.nan], + "C__minute_of_hour": [20.0, np.nan], + "D__minute_of_hour": [40.0, np.nan], + "E__minute_of_hour": [59.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = OrdinalMinuteOfHour(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py new file mode 100644 index 00000000..4eecf304 --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py @@ -0,0 +1,62 @@ +# License: Apache-2.0 +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalMinuteOfHour + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-05-04 00:00:00", None], + "B": ["2020-05-06 00:10:00", None], + "C": ["2020-05-08 00:20:00", None], + "D": ["2020-05-09 00:40:00", None], + "E": ["2020-05-09 00:59:00", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__minute_of_hour": [0.0, np.nan], + "B__minute_of_hour": [10.0, np.nan], + "C__minute_of_hour": [20.0, np.nan], + "D__minute_of_hour": [40.0, np.nan], + "E__minute_of_hour": [59.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = OrdinalMinuteOfHour(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = OrdinalMinuteOfHour(columns=0) + with pytest.raises(ValueError): + _ = OrdinalMinuteOfHour(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py b/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py deleted file mode 100644 index 9782532f..00000000 --- a/gators/feature_generation_dt/tests/test_ordinal_month_of_year.py +++ /dev/null @@ -1,107 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_dt import OrdinalMonthOfYear - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": ["2020-01-01T00", None], - "B": ["2020-04-08T06", None], - "C": ["2020-07-16T12", None], - "D": ["2020-10-24T18", None], - "E": ["2020-12-31T23", None], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X["A"] = X["A"].astype("datetime64[ns]") - X["B"] = X["B"].astype("datetime64[ms]") - X["C"] = X["C"].astype("datetime64[s]") - X["D"] = X["D"].astype("datetime64[m]") - X["E"] = X["E"].astype("datetime64[h]") - - X_expected = pd.DataFrame( - { - "A__month_of_year": ["1.0", "nan"], - "B__month_of_year": ["4.0", "nan"], - "C__month_of_year": ["7.0", "nan"], - "D__month_of_year": ["10.0", "nan"], - "E__month_of_year": ["12.0", "nan"], - } - ) - X_expected = pd.concat([X.copy(), X_expected], axis=1) - obj = OrdinalMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": ["2020-01-01T00", None], - "B": ["2020-04-08T06", None], - "C": ["2020-07-16T12", None], - "D": ["2020-10-24T18", None], - "E": ["2020-12-31T23", None], - "X": ["x", "x"], - } - ) - columns = ["A", "B", "C", "D", "E"] - X[columns] = X[columns].astype("datetime64[ns]") - X_expected = pd.DataFrame( - { - "A__month_of_year": ["1.0", "nan"], - "B__month_of_year": ["4.0", "nan"], - "C__month_of_year": ["7.0", "nan"], - "D__month_of_year": ["10.0", "nan"], - "E__month_of_year": ["12.0", "nan"], - } - ) - X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) - obj = OrdinalMonthOfYear(columns=columns).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - X_expected = pd.DataFrame(X_expected.values) - assert_frame_equal(X_new, X_expected) - - -def test_init(): - with pytest.raises(TypeError): - _ = OrdinalMonthOfYear(columns=0) - with pytest.raises(ValueError): - _ = OrdinalMonthOfYear(columns=[]) diff --git a/gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py b/gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py new file mode 100644 index 00000000..edfbeb0e --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalMonthOfYear + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["2020-01-01T00", None], + "B": ["2020-04-08T06", None], + "C": ["2020-07-16T12", None], + "D": ["2020-10-24T18", None], + "E": ["2020-12-31T23", None], + "X": ["x", "x"], + } + ), + npartitions=1, + ) + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.compute().to_numpy() + X_expected = pd.DataFrame( + { + "A__month_of_year": [1.0, np.nan], + "B__month_of_year": [4.0, np.nan], + "C__month_of_year": [7.0, np.nan], + "D__month_of_year": [10.0, np.nan], + "E__month_of_year": [12.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.compute().copy(), X_expected], axis=1) + columns = ["A", "B", "C", "D", "E"] + obj = OrdinalMonthOfYear(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_dd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py b/gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py new file mode 100644 index 00000000..7f00104f --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalMonthOfYear + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": ["2020-01-01T00", None], + "B": ["2020-04-08T06", None], + "C": ["2020-07-16T12", None], + "D": ["2020-10-24T18", None], + "E": ["2020-12-31T23", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X[columns] = X[columns].astype("datetime64[ns]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__month_of_year": [1.0, np.nan], + "B__month_of_year": [4.0, np.nan], + "C__month_of_year": [7.0, np.nan], + "D__month_of_year": [10.0, np.nan], + "E__month_of_year": [12.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.to_pandas().copy(), X_expected], axis=1) + obj = OrdinalMonthOfYear(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected, X_np, X_expected_np = data_ks + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py b/gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py new file mode 100644 index 00000000..d34ed6df --- /dev/null +++ b/gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py @@ -0,0 +1,66 @@ +# License: Apache-2.0 +import pandas as pd +import numpy as np +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_dt import OrdinalMonthOfYear + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": ["2020-01-01T00", None], + "B": ["2020-04-08T06", None], + "C": ["2020-07-16T12", None], + "D": ["2020-10-24T18", None], + "E": ["2020-12-31T23", None], + "X": ["x", "x"], + } + ) + columns = ["A", "B", "C", "D", "E"] + X["A"] = X["A"].astype("datetime64[ns]") + X["B"] = X["B"].astype("datetime64[ms]") + X["C"] = X["C"].astype("datetime64[s]") + X["D"] = X["D"].astype("datetime64[s]") + X["E"] = X["E"].astype("datetime64[s]") + X_np = X.to_numpy() + X_expected = pd.DataFrame( + { + "A__month_of_year": [1.0, np.nan], + "B__month_of_year": [4.0, np.nan], + "C__month_of_year": [7.0, np.nan], + "D__month_of_year": [10.0, np.nan], + "E__month_of_year": [12.0, np.nan], + } + ) + X_expected_np = np.concatenate((X_np, X_expected.to_numpy()), axis=1) + X_expected = pd.concat([X.copy(), X_expected], axis=1) + obj = OrdinalMonthOfYear(columns=columns).fit(X) + return obj, X, X_expected, X_np, X_expected_np + + +def test_pd(data): + obj, X, X_expected, X_np, X_expected_np = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected, X_np, X_expected_np = data + X_numpy_new = obj.transform_numpy(X_np) + X_new = pd.DataFrame(X_numpy_new) + X_expected = pd.DataFrame(X_expected_np) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = OrdinalMonthOfYear(columns=0) + with pytest.raises(ValueError): + _ = OrdinalMonthOfYear(columns=[]) + with pytest.raises(TypeError): + _ = OrdinalMonthOfYear(columns=["A"], date_format=0) + with pytest.raises(ValueError): + _ = OrdinalMonthOfYear(columns=["A"], date_format="ydn") diff --git a/gators/feature_generation_str/__init__.py b/gators/feature_generation_str/__init__.py index 6727190d..3d65c8e8 100644 --- a/gators/feature_generation_str/__init__.py +++ b/gators/feature_generation_str/__init__.py @@ -2,15 +2,19 @@ from .extract import Extract from .lower_case import LowerCase from .split_extract import SplitExtract -from .string_contains import StringContains -from .string_length import StringLength +from .contains import Contains +from .length import Length from .upper_case import UpperCase +from .startswith import Startswith +from .endswith import Endswith __all__ = [ "SplitExtract", "Extract", - "StringContains", - "StringLength", + "Contains", + "Length", "LowerCase", "UpperCase", + "Startswith", + "Endswith", ] diff --git a/gators/feature_generation_str/__pycache__/__init__.cpython-38.pyc b/gators/feature_generation_str/__pycache__/__init__.cpython-38.pyc index 165bb685..bc217ce6 100644 Binary files a/gators/feature_generation_str/__pycache__/__init__.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/_base_string_feature.cpython-38.pyc b/gators/feature_generation_str/__pycache__/_base_string_feature.cpython-38.pyc index d34e0009..ef31d54c 100644 Binary files a/gators/feature_generation_str/__pycache__/_base_string_feature.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/_base_string_feature.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/extract.cpython-38.pyc b/gators/feature_generation_str/__pycache__/extract.cpython-38.pyc index 7f96bf44..5cdc7d0b 100644 Binary files a/gators/feature_generation_str/__pycache__/extract.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/extract.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/lower_case.cpython-38.pyc b/gators/feature_generation_str/__pycache__/lower_case.cpython-38.pyc index dcd42a40..9ede597c 100644 Binary files a/gators/feature_generation_str/__pycache__/lower_case.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/lower_case.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/split_extract.cpython-38.pyc b/gators/feature_generation_str/__pycache__/split_extract.cpython-38.pyc index 1af6c764..4c270dbd 100644 Binary files a/gators/feature_generation_str/__pycache__/split_extract.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/split_extract.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/string_contains.cpython-38.pyc b/gators/feature_generation_str/__pycache__/string_contains.cpython-38.pyc index d3651f2f..3736d36d 100644 Binary files a/gators/feature_generation_str/__pycache__/string_contains.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/string_contains.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/string_length.cpython-38.pyc b/gators/feature_generation_str/__pycache__/string_length.cpython-38.pyc index 6b8d7b36..9548bab0 100644 Binary files a/gators/feature_generation_str/__pycache__/string_length.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/string_length.cpython-38.pyc differ diff --git a/gators/feature_generation_str/__pycache__/upper_case.cpython-38.pyc b/gators/feature_generation_str/__pycache__/upper_case.cpython-38.pyc index 275cdcc6..eb28c10b 100644 Binary files a/gators/feature_generation_str/__pycache__/upper_case.cpython-38.pyc and b/gators/feature_generation_str/__pycache__/upper_case.cpython-38.pyc differ diff --git a/gators/feature_generation_str/_base_string_feature.py b/gators/feature_generation_str/_base_string_feature.py index 6b4d0769..b1e0cbf7 100644 --- a/gators/feature_generation_str/_base_string_feature.py +++ b/gators/feature_generation_str/_base_string_feature.py @@ -1,61 +1,56 @@ # Licence Apache-2.0 -from typing import List, Union -import databricks.koalas as ks +from typing import List + import numpy as np -import pandas as pd from ..transformers.transformer import Transformer from ..util import util +from gators import DataFrame, Series + class _BaseStringFeature(Transformer): """Base string feature transformer class. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - column_names : List[str], default to None. + column_names : List[str], default None. List of column names. """ def __init__(self, columns: List[str], column_names: List[str]): - if not isinstance(columns, list): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") - if not columns: - raise ValueError("`columns` should not be empty.") - if column_names and not isinstance(column_names, list): + if column_names and not isinstance(column_names, (list, np.ndarray)): raise TypeError("`column_names` should be a list.") if column_names and len(column_names) != len(columns): raise ValueError("Length of `columns` and `column_names` should match.") Transformer.__init__(self) self.columns = columns self.column_names: List[str] = column_names - self.column_mapping = dict(zip(column_names, columns)) self.idx_columns: np.ndarray = np.array([]) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "_BaseStringFeature": + def fit(self, X: DataFrame, y: Series = None) -> "Transformer": """Fit the transformer on the dataframe `X`. Parameters ---------- X : pd.DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. + y : Series, default None. Target values. Returns ------- - _BaseStringFeature + Transformer Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) self.idx_columns = util.get_idx_columns( columns=X.columns, selected_columns=self.columns, diff --git a/gators/feature_generation_str/contains.py b/gators/feature_generation_str/contains.py new file mode 100644 index 00000000..8909db0e --- /dev/null +++ b/gators/feature_generation_str/contains.py @@ -0,0 +1,125 @@ +# License: Apache-2.0 +from typing import List + +import numpy as np +import pandas as pd + +from feature_gen_str import contains + +from ..util import util +from ._base_string_feature import _BaseStringFeature + +from gators import DataFrame, Series + + +class Contains(_BaseStringFeature): + """Create new binary columns. + + The value is 1 if the element contains the given substring and 0 otherwise. + + Parameters + ---------- + theta_vec : List[float] + List of columns. + contains_vec : List[int] + List of substrings. + column_names : List[int], default None. + List new column names. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation_str import Contains + >>> obj = Contains(columns=['A', 'A'], contains_vec=['qw', 'we']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__contains_qw A__contains_we + 0 qwe 1 1.0 1.0 + 1 qwd 2 1.0 0.0 + 2 zwe 3 0.0 1.0 + + >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['qwe', 1, 1.0, 1.0], + ['qwd', 2, 1.0, 0.0], + ['zwe', 3, 0.0, 1.0]], dtype=object) + """ + + def __init__( + self, + columns: List[str], + contains_vec: List[str], + column_names: List[str] = None, + ): + if not isinstance(columns, (list, np.ndarray)): + raise TypeError("`columns` should be a list.") + if not isinstance(contains_vec, (list, np.ndarray)): + raise TypeError("`contains_vec` should be a list.") + if len(columns) != len(contains_vec): + raise ValueError("Length of `columns` and `contains_vec` should match.") + if not column_names: + column_names = [ + f"{col}__contains_{val}" for col, val in zip(columns, contains_vec) + ] + _BaseStringFeature.__init__(self, columns, column_names) + self.contains_vec = contains_vec + self.contains_vec_np = np.array(self.contains_vec).astype(object) + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + + self.check_dataframe(X) + for col, val, name in zip(self.columns, self.contains_vec, self.column_names): + X[name] = X[col].str.contains(val, regex=False).astype(np.float64) + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + return contains(X, self.idx_columns, self.contains_vec_np) diff --git a/gators/feature_generation_str/endswith.py b/gators/feature_generation_str/endswith.py new file mode 100644 index 00000000..707e6f80 --- /dev/null +++ b/gators/feature_generation_str/endswith.py @@ -0,0 +1,122 @@ +# License: Apache-2.0 +from typing import List + +import numpy as np + +from feature_gen_str import endswith + +from ._base_string_feature import _BaseStringFeature + +from gators import DataFrame, Series + + +class Endswith(_BaseStringFeature): + """Create new binary columns. + + The value is 1 if the element endswith the given substring and 0 otherwise. + + Parameters + ---------- + columns : List[float] + List of columns. + pattern_vec : List[int] + List of pattern_vec. + column_names : List[int], default None. + List new column names. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation_str import Startswith + >>> obj = Startswith(columns=['A', 'A'], pattern_vec=['qw', 'we']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__contains_qw A__contains_we + 0 qwe 1 1.0 1.0 + 1 qwd 2 1.0 0.0 + 2 zwe 3 0.0 1.0 + + >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['qwe', 1, 1.0, 1.0], + ['qwd', 2, 1.0, 0.0], + ['zwe', 3, 0.0, 1.0]], dtype=object) + """ + + def __init__( + self, + columns: List[str], + pattern_vec: List[str], + column_names: List[str] = None, + ): + if not isinstance(columns, (list, np.ndarray)): + raise TypeError("`columns` should be a list.") + if not isinstance(pattern_vec, (list, np.ndarray)): + raise TypeError("`pattern_vec` should be a list.") + if len(columns) != len(pattern_vec): + raise ValueError("Length of `columns` and `pattern_vec` should match.") + if not column_names: + column_names = [ + f"{col}__endswith_{val}" for col, val in zip(columns, pattern_vec) + ] + _BaseStringFeature.__init__(self, columns, column_names) + self.pattern_vec = pattern_vec + self.pattern_vec_np = np.array(self.pattern_vec).astype(object) + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + + self.check_dataframe(X) + for col, val, name in zip(self.columns, self.pattern_vec, self.column_names): + X[name] = X[col].str.endswith(val).astype(np.float64) + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + return endswith(X, self.idx_columns, self.pattern_vec_np) diff --git a/gators/feature_generation_str/extract.py b/gators/feature_generation_str/extract.py index 858476a9..d7d4ffe2 100644 --- a/gators/feature_generation_str/extract.py +++ b/gators/feature_generation_str/extract.py @@ -1,23 +1,22 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen_str import extract_str from ..util import util - from ._base_string_feature import _BaseStringFeature +from gators import DataFrame, Series + class Extract(_BaseStringFeature): """Create new object columns based on substrings. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. i_min_vec : List[int] List of indices. @@ -28,55 +27,43 @@ class Extract(_BaseStringFeature): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation_str import Extract + >>> obj = Extract(columns=['A', 'A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) - >>> obj.fit_transform(X) - A B A__substring_0_to_1 A__substring_2_to_3 - 0 qwe 1 q e - 1 asd 2 a d - 2 zxc 3 z c - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import Extract - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) >>> obj.fit_transform(X) A B A__substring_0_to_1 A__substring_2_to_3 0 qwe 1 q e 1 asd 2 a d 2 zxc 3 z c - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import Extract >>> X = pd.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['qwe', 1, 'q', 'e'], ['asd', 2, 'a', 'd'], ['zxc', 3, 'z', 'c']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import Extract - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = Extract(columns=['A','A'], i_min_vec=[0, 2], i_max_vec=[1, 3]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 'q', 'e'], - ['asd', 2, 'a', 'd'], - ['zxc', 3, 'z', 'c']], dtype=object) - - """ def __init__( @@ -86,13 +73,13 @@ def __init__( i_max_vec: List[int], column_names: List[int] = None, ): - if not isinstance(columns, list): + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") - if not isinstance(i_min_vec, list): + if not isinstance(i_min_vec, (list, np.ndarray)): raise TypeError("`i_min_vec` should be a list.") if len(columns) != len(i_min_vec): raise ValueError("Length of `columns` and `i_min_vec` should match.") - if not isinstance(i_max_vec, list): + if not isinstance(i_max_vec, (list, np.ndarray)): raise TypeError("`i_max_vec` should be a list.") if len(columns) != len(i_max_vec): raise ValueError("Length of `columns` and `i_max_vec` should match.") @@ -105,44 +92,17 @@ def __init__( self.i_min_vec = np.array(i_min_vec, int) self.i_max_vec = np.array(i_max_vec, int) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "Extract": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Extract - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) @@ -150,13 +110,14 @@ def transform( for col, i_min, i_max, name in zip( self.columns, self.i_min_vec, self.i_max_vec, self.column_names ): - X.loc[:, name] = ( - X[col].str.slice(start=i_min, stop=i_max).replace({"": "MISSING"}) - ) + X[name] = X[col].str.slice( + start=i_min, stop=i_max + ) # .replace({"": "MISSING"}) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -165,7 +126,7 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) diff --git a/gators/feature_generation_str/feature_gen_str.c b/gators/feature_generation_str/feature_gen_str.c new file mode 100644 index 00000000..0d14eea2 --- /dev/null +++ b/gators/feature_generation_str/feature_gen_str.c @@ -0,0 +1,16193 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "feature_gen_str", + "sources": [ + "gators/feature_generation_str/feature_gen_str.pyx" + ] + }, + "module_name": "feature_gen_str" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__feature_gen_str +#define __PYX_HAVE_API__feature_gen_str +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/feature_generation_str/feature_gen_str.pyx", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* PyObject_Str.proto */ +#define __Pyx_PyObject_Str(obj)\ + (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "feature_gen_str" */ +static PyArrayObject *__pyx_f_15feature_gen_str_extract_str(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_split_and_extract_str(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_length(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_contains(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_upper_case(PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_lower_case(PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_isin(PyArrayObject *, PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_endswith(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_startswith(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int_t = { "int_t", NULL, sizeof(__pyx_t_5numpy_int_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float_t = { "float_t", NULL, sizeof(__pyx_t_5numpy_float_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "feature_gen_str" +extern int __pyx_module_is_main_feature_gen_str; +int __pyx_module_is_main_feature_gen_str = 0; + +/* Implementation of "feature_gen_str" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_object; +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_X[] = "X"; +static const char __pyx_k__3[] = ""; +static const char __pyx_k__4[] = "*"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__21[] = "?"; +static const char __pyx_k_nan[] = "nan"; +static const char __pyx_k_axis[] = "axis"; +static const char __pyx_k_isin[] = "isin"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_empty[] = "empty"; +static const char __pyx_k_lower[] = "lower"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_split[] = "split"; +static const char __pyx_k_upper[] = "upper"; +static const char __pyx_k_zeros[] = "zeros"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_length[] = "length"; +static const char __pyx_k_object[] = "object"; +static const char __pyx_k_contains[] = "contains"; +static const char __pyx_k_endswith[] = "endswith"; +static const char __pyx_k_i_max_vec[] = "i_max_vec"; +static const char __pyx_k_i_min_vec[] = "i_min_vec"; +static const char __pyx_k_lower_case[] = "lower_case"; +static const char __pyx_k_pattern_np[] = "pattern_np"; +static const char __pyx_k_startswith[] = "startswith"; +static const char __pyx_k_upper_case[] = "upper_case"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_concatenate[] = "concatenate"; +static const char __pyx_k_extract_str[] = "extract_str"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_contains_vec[] = "contains_vec"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_n_values_vec[] = "n_values_vec"; +static const char __pyx_k_class_getitem[] = "__class_getitem__"; +static const char __pyx_k_idx_split_vec[] = "idx_split_vec"; +static const char __pyx_k_str_split_vec[] = "str_split_vec"; +static const char __pyx_k_values_vec_np[] = "values_vec_np"; +static const char __pyx_k_feature_gen_str[] = "feature_gen_str"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_split_and_extract_str[] = "split_and_extract_str"; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_gators_feature_generation_str_fe[] = "gators/feature_generation_str/feature_gen_str.pyx"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +/* #### Code section: decls ### */ +static PyObject *__pyx_pf_15feature_gen_str_extract_str(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_i_min_vec, PyArrayObject *__pyx_v_i_max_vec); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_2split_and_extract_str(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_str_split_vec, PyArrayObject *__pyx_v_idx_split_vec); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_4length(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_6contains(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_contains_vec); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_8upper_case(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_10lower_case(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_12isin(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_values_vec_np, PyArrayObject *__pyx_v_n_values_vec); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_14endswith(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_pattern_np); /* proto */ +static PyObject *__pyx_pf_15feature_gen_str_16startswith(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_pattern_np); /* proto */ +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + #endif + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_n_s_X; + PyObject *__pyx_n_s__21; + PyObject *__pyx_kp_u__3; + PyObject *__pyx_n_s__4; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_axis; + PyObject *__pyx_n_s_class_getitem; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_concatenate; + PyObject *__pyx_n_s_contains; + PyObject *__pyx_n_s_contains_vec; + PyObject *__pyx_n_s_empty; + PyObject *__pyx_n_s_endswith; + PyObject *__pyx_n_s_extract_str; + PyObject *__pyx_n_s_feature_gen_str; + PyObject *__pyx_kp_s_gators_feature_generation_str_fe; + PyObject *__pyx_n_s_i_max_vec; + PyObject *__pyx_n_s_i_min_vec; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_idx_split_vec; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_n_s_isin; + PyObject *__pyx_n_s_length; + PyObject *__pyx_n_s_lower; + PyObject *__pyx_n_s_lower_case; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_n_values_vec; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_u_nan; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_object; + PyObject *__pyx_n_s_pattern_np; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_split; + PyObject *__pyx_n_s_split_and_extract_str; + PyObject *__pyx_n_s_startswith; + PyObject *__pyx_n_s_str_split_vec; + PyObject *__pyx_n_s_test; + PyObject *__pyx_n_s_upper; + PyObject *__pyx_n_s_upper_case; + PyObject *__pyx_n_s_values_vec_np; + PyObject *__pyx_n_s_zeros; + PyObject *__pyx_int_1; + PyObject *__pyx_tuple_; + PyObject *__pyx_tuple__2; + PyObject *__pyx_tuple__5; + PyObject *__pyx_tuple__7; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__11; + PyObject *__pyx_tuple__13; + PyObject *__pyx_tuple__16; + PyObject *__pyx_tuple__18; + PyObject *__pyx_codeobj__6; + PyObject *__pyx_codeobj__8; + PyObject *__pyx_codeobj__10; + PyObject *__pyx_codeobj__12; + PyObject *__pyx_codeobj__14; + PyObject *__pyx_codeobj__15; + PyObject *__pyx_codeobj__17; + PyObject *__pyx_codeobj__19; + PyObject *__pyx_codeobj__20; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_n_s__21); + Py_CLEAR(clear_module_state->__pyx_kp_u__3); + Py_CLEAR(clear_module_state->__pyx_n_s__4); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_concatenate); + Py_CLEAR(clear_module_state->__pyx_n_s_contains); + Py_CLEAR(clear_module_state->__pyx_n_s_contains_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_empty); + Py_CLEAR(clear_module_state->__pyx_n_s_endswith); + Py_CLEAR(clear_module_state->__pyx_n_s_extract_str); + Py_CLEAR(clear_module_state->__pyx_n_s_feature_gen_str); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_feature_generation_str_fe); + Py_CLEAR(clear_module_state->__pyx_n_s_i_max_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_i_min_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_split_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_n_s_isin); + Py_CLEAR(clear_module_state->__pyx_n_s_length); + Py_CLEAR(clear_module_state->__pyx_n_s_lower); + Py_CLEAR(clear_module_state->__pyx_n_s_lower_case); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_n_values_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_u_nan); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_object); + Py_CLEAR(clear_module_state->__pyx_n_s_pattern_np); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_split); + Py_CLEAR(clear_module_state->__pyx_n_s_split_and_extract_str); + Py_CLEAR(clear_module_state->__pyx_n_s_startswith); + Py_CLEAR(clear_module_state->__pyx_n_s_str_split_vec); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_n_s_upper); + Py_CLEAR(clear_module_state->__pyx_n_s_upper_case); + Py_CLEAR(clear_module_state->__pyx_n_s_values_vec_np); + Py_CLEAR(clear_module_state->__pyx_n_s_zeros); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_tuple_); + Py_CLEAR(clear_module_state->__pyx_tuple__2); + Py_CLEAR(clear_module_state->__pyx_tuple__5); + Py_CLEAR(clear_module_state->__pyx_tuple__7); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__11); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_codeobj__6); + Py_CLEAR(clear_module_state->__pyx_codeobj__8); + Py_CLEAR(clear_module_state->__pyx_codeobj__10); + Py_CLEAR(clear_module_state->__pyx_codeobj__12); + Py_CLEAR(clear_module_state->__pyx_codeobj__14); + Py_CLEAR(clear_module_state->__pyx_codeobj__15); + Py_CLEAR(clear_module_state->__pyx_codeobj__17); + Py_CLEAR(clear_module_state->__pyx_codeobj__19); + Py_CLEAR(clear_module_state->__pyx_codeobj__20); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_n_s__21); + Py_VISIT(traverse_module_state->__pyx_kp_u__3); + Py_VISIT(traverse_module_state->__pyx_n_s__4); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_concatenate); + Py_VISIT(traverse_module_state->__pyx_n_s_contains); + Py_VISIT(traverse_module_state->__pyx_n_s_contains_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_empty); + Py_VISIT(traverse_module_state->__pyx_n_s_endswith); + Py_VISIT(traverse_module_state->__pyx_n_s_extract_str); + Py_VISIT(traverse_module_state->__pyx_n_s_feature_gen_str); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_feature_generation_str_fe); + Py_VISIT(traverse_module_state->__pyx_n_s_i_max_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_i_min_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_split_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_n_s_isin); + Py_VISIT(traverse_module_state->__pyx_n_s_length); + Py_VISIT(traverse_module_state->__pyx_n_s_lower); + Py_VISIT(traverse_module_state->__pyx_n_s_lower_case); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_n_values_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_u_nan); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_object); + Py_VISIT(traverse_module_state->__pyx_n_s_pattern_np); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_split); + Py_VISIT(traverse_module_state->__pyx_n_s_split_and_extract_str); + Py_VISIT(traverse_module_state->__pyx_n_s_startswith); + Py_VISIT(traverse_module_state->__pyx_n_s_str_split_vec); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_n_s_upper); + Py_VISIT(traverse_module_state->__pyx_n_s_upper_case); + Py_VISIT(traverse_module_state->__pyx_n_s_values_vec_np); + Py_VISIT(traverse_module_state->__pyx_n_s_zeros); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_tuple_); + Py_VISIT(traverse_module_state->__pyx_tuple__2); + Py_VISIT(traverse_module_state->__pyx_tuple__5); + Py_VISIT(traverse_module_state->__pyx_tuple__7); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__11); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_codeobj__6); + Py_VISIT(traverse_module_state->__pyx_codeobj__8); + Py_VISIT(traverse_module_state->__pyx_codeobj__10); + Py_VISIT(traverse_module_state->__pyx_codeobj__12); + Py_VISIT(traverse_module_state->__pyx_codeobj__14); + Py_VISIT(traverse_module_state->__pyx_codeobj__15); + Py_VISIT(traverse_module_state->__pyx_codeobj__17); + Py_VISIT(traverse_module_state->__pyx_codeobj__19); + Py_VISIT(traverse_module_state->__pyx_codeobj__20); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_n_s__21 __pyx_mstate_global->__pyx_n_s__21 +#define __pyx_kp_u__3 __pyx_mstate_global->__pyx_kp_u__3 +#define __pyx_n_s__4 __pyx_mstate_global->__pyx_n_s__4 +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_axis __pyx_mstate_global->__pyx_n_s_axis +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_concatenate __pyx_mstate_global->__pyx_n_s_concatenate +#define __pyx_n_s_contains __pyx_mstate_global->__pyx_n_s_contains +#define __pyx_n_s_contains_vec __pyx_mstate_global->__pyx_n_s_contains_vec +#define __pyx_n_s_empty __pyx_mstate_global->__pyx_n_s_empty +#define __pyx_n_s_endswith __pyx_mstate_global->__pyx_n_s_endswith +#define __pyx_n_s_extract_str __pyx_mstate_global->__pyx_n_s_extract_str +#define __pyx_n_s_feature_gen_str __pyx_mstate_global->__pyx_n_s_feature_gen_str +#define __pyx_kp_s_gators_feature_generation_str_fe __pyx_mstate_global->__pyx_kp_s_gators_feature_generation_str_fe +#define __pyx_n_s_i_max_vec __pyx_mstate_global->__pyx_n_s_i_max_vec +#define __pyx_n_s_i_min_vec __pyx_mstate_global->__pyx_n_s_i_min_vec +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_idx_split_vec __pyx_mstate_global->__pyx_n_s_idx_split_vec +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_n_s_isin __pyx_mstate_global->__pyx_n_s_isin +#define __pyx_n_s_length __pyx_mstate_global->__pyx_n_s_length +#define __pyx_n_s_lower __pyx_mstate_global->__pyx_n_s_lower +#define __pyx_n_s_lower_case __pyx_mstate_global->__pyx_n_s_lower_case +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_n_values_vec __pyx_mstate_global->__pyx_n_s_n_values_vec +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_u_nan __pyx_mstate_global->__pyx_n_u_nan +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_object __pyx_mstate_global->__pyx_n_s_object +#define __pyx_n_s_pattern_np __pyx_mstate_global->__pyx_n_s_pattern_np +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split +#define __pyx_n_s_split_and_extract_str __pyx_mstate_global->__pyx_n_s_split_and_extract_str +#define __pyx_n_s_startswith __pyx_mstate_global->__pyx_n_s_startswith +#define __pyx_n_s_str_split_vec __pyx_mstate_global->__pyx_n_s_str_split_vec +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_n_s_upper __pyx_mstate_global->__pyx_n_s_upper +#define __pyx_n_s_upper_case __pyx_mstate_global->__pyx_n_s_upper_case +#define __pyx_n_s_values_vec_np __pyx_mstate_global->__pyx_n_s_values_vec_np +#define __pyx_n_s_zeros __pyx_mstate_global->__pyx_n_s_zeros +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ +#define __pyx_tuple__2 __pyx_mstate_global->__pyx_tuple__2 +#define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 +#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__11 __pyx_mstate_global->__pyx_tuple__11 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6 +#define __pyx_codeobj__8 __pyx_mstate_global->__pyx_codeobj__8 +#define __pyx_codeobj__10 __pyx_mstate_global->__pyx_codeobj__10 +#define __pyx_codeobj__12 __pyx_mstate_global->__pyx_codeobj__12 +#define __pyx_codeobj__14 __pyx_mstate_global->__pyx_codeobj__14 +#define __pyx_codeobj__15 __pyx_mstate_global->__pyx_codeobj__15 +#define __pyx_codeobj__17 __pyx_mstate_global->__pyx_codeobj__17 +#define __pyx_codeobj__19 __pyx_mstate_global->__pyx_codeobj__19 +#define __pyx_codeobj__20 __pyx_mstate_global->__pyx_codeobj__20 +/* #### Code section: module_code ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "feature_gen_str.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_1extract_str(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_extract_str(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_i_min_vec, PyArrayObject *__pyx_v_i_max_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + __pyx_t_5numpy_int64_t __pyx_v_i; + __pyx_t_5numpy_int64_t __pyx_v_k; + PyObject *__pyx_v_value = 0; + __pyx_t_5numpy_int64_t __pyx_v_n_rows; + __pyx_t_5numpy_int64_t __pyx_v_n_columns; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_i_max_vec; + __Pyx_Buffer __pyx_pybuffer_i_max_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_i_min_vec; + __Pyx_Buffer __pyx_pybuffer_i_min_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __pyx_t_5numpy_int64_t __pyx_t_8; + __pyx_t_5numpy_int64_t __pyx_t_9; + __pyx_t_5numpy_int64_t __pyx_t_10; + __pyx_t_5numpy_int64_t __pyx_t_11; + __pyx_t_5numpy_int64_t __pyx_t_12; + __pyx_t_5numpy_int64_t __pyx_t_13; + __pyx_t_5numpy_int64_t __pyx_t_14; + __pyx_t_5numpy_int64_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + Py_ssize_t __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("extract_str", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_i_min_vec.pybuffer.buf = NULL; + __pyx_pybuffer_i_min_vec.refcount = 0; + __pyx_pybuffernd_i_min_vec.data = NULL; + __pyx_pybuffernd_i_min_vec.rcbuffer = &__pyx_pybuffer_i_min_vec; + __pyx_pybuffer_i_max_vec.pybuffer.buf = NULL; + __pyx_pybuffer_i_max_vec.refcount = 0; + __pyx_pybuffernd_i_max_vec.data = NULL; + __pyx_pybuffernd_i_max_vec.rcbuffer = &__pyx_pybuffer_i_max_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_i_min_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_i_min_vec.diminfo[0].strides = __pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_i_min_vec.diminfo[0].shape = __pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_i_max_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_i_max_vec.diminfo[0].strides = __pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_i_max_vec.diminfo[0].shape = __pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_str.pyx":19 + * cdef np.int64_t k + * cdef object value + * cdef np.int64_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t n_columns = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":20 + * cdef object value + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_columns = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + * for k in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L1_error) + __pyx_v_n_columns = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":21 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_columns = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) # <<<<<<<<<<<<<< + * for k in range(n_rows): + * for i in range(n_columns): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_columns); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 21, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 21, __pyx_L1_error) + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":22 + * cdef np.int64_t n_columns = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + * for k in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_columns): + * value = X[k, idx_columns[i]] + */ + __pyx_t_8 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_8; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_k = __pyx_t_10; + + /* "feature_gen_str.pyx":23 + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + * for k in range(n_rows): + * for i in range(n_columns): # <<<<<<<<<<<<<< + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): + */ + __pyx_t_11 = __pyx_v_n_columns; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_i = __pyx_t_13; + + /* "feature_gen_str.pyx":24 + * for k in range(n_rows): + * for i in range(n_columns): + * value = X[k, idx_columns[i]] # <<<<<<<<<<<<<< + * if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): + * X_new[k, i] = '' + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_k; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":25 + * for i in range(n_columns): + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): # <<<<<<<<<<<<<< + * X_new[k, i] = '' + * continue + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_value, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_17 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_18 = PyFloat_Check(__pyx_v_value); + if (!__pyx_t_18) { + } else { + __pyx_t_17 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_14 = __pyx_v_i; + __pyx_t_19 = PyObject_Length(__pyx_v_value); if (unlikely(__pyx_t_19 == ((Py_ssize_t)-1))) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_t_18 = ((*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_i_max_vec.diminfo[0].strides)) > __pyx_t_19); + __pyx_t_17 = __pyx_t_18; + __pyx_L8_bool_binop_done:; + if (__pyx_t_17) { + + /* "feature_gen_str.pyx":26 + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): + * X_new[k, i] = '' # <<<<<<<<<<<<<< + * continue + * X_new[k, i] = X[k, idx_columns[i]][i_min_vec[i]: i_max_vec[i]] + */ + __pyx_t_2 = __Pyx_PyInt_From_npy_int64(__pyx_v_k); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_i); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_6, __pyx_kp_u__3) < 0))) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "feature_gen_str.pyx":27 + * if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): + * X_new[k, i] = '' + * continue # <<<<<<<<<<<<<< + * X_new[k, i] = X[k, idx_columns[i]][i_min_vec[i]: i_max_vec[i]] + * return np.concatenate((X, X_new), axis=1) + */ + goto __pyx_L5_continue; + + /* "feature_gen_str.pyx":25 + * for i in range(n_columns): + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): # <<<<<<<<<<<<<< + * X_new[k, i] = '' + * continue + */ + } + + /* "feature_gen_str.pyx":28 + * X_new[k, i] = '' + * continue + * X_new[k, i] = X[k, idx_columns[i]][i_min_vec[i]: i_max_vec[i]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_16 = __pyx_v_k; + __pyx_t_15 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_6 == NULL)) __pyx_t_6 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_6); + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_i; + __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_t_6, (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_i_min_vec.diminfo[0].strides)), (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_i_max_vec.diminfo[0].strides)), NULL, NULL, NULL, 1, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyInt_From_npy_int64(__pyx_v_k); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = __Pyx_PyInt_From_npy_int64(__pyx_v_i); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6)) __PYX_ERR(0, 28, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(0, 28, __pyx_L1_error); + __pyx_t_6 = 0; + __pyx_t_2 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_5, __pyx_t_4) < 0))) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_L5_continue:; + } + } + + /* "feature_gen_str.pyx":29 + * continue + * X_new[k, i] = X[k, idx_columns[i]][i_min_vec[i]: i_max_vec[i]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 29, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 29, __pyx_L1_error); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.extract_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_1extract_str(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_1extract_str = {"extract_str", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_1extract_str, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_1extract_str(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_i_min_vec = 0; + PyArrayObject *__pyx_v_i_max_vec = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("extract_str (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_i_min_vec,&__pyx_n_s_i_max_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("extract_str", 1, 4, 4, 1); __PYX_ERR(0, 9, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_i_min_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("extract_str", 1, 4, 4, 2); __PYX_ERR(0, 9, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_i_max_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("extract_str", 1, 4, 4, 3); __PYX_ERR(0, 9, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "extract_str") < 0)) __PYX_ERR(0, 9, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_i_min_vec = ((PyArrayObject *)values[2]); + __pyx_v_i_max_vec = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("extract_str", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 9, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.extract_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 10, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 11, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_i_min_vec), __pyx_ptype_5numpy_ndarray, 1, "i_min_vec", 0))) __PYX_ERR(0, 12, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_i_max_vec), __pyx_ptype_5numpy_ndarray, 1, "i_max_vec", 0))) __PYX_ERR(0, 13, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_extract_str(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_i_min_vec, __pyx_v_i_max_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_extract_str(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_i_min_vec, PyArrayObject *__pyx_v_i_max_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_i_max_vec; + __Pyx_Buffer __pyx_pybuffer_i_max_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_i_min_vec; + __Pyx_Buffer __pyx_pybuffer_i_min_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("extract_str", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_i_min_vec.pybuffer.buf = NULL; + __pyx_pybuffer_i_min_vec.refcount = 0; + __pyx_pybuffernd_i_min_vec.data = NULL; + __pyx_pybuffernd_i_min_vec.rcbuffer = &__pyx_pybuffer_i_min_vec; + __pyx_pybuffer_i_max_vec.pybuffer.buf = NULL; + __pyx_pybuffer_i_max_vec.refcount = 0; + __pyx_pybuffernd_i_max_vec.data = NULL; + __pyx_pybuffernd_i_max_vec.rcbuffer = &__pyx_pybuffer_i_max_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_i_min_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_i_min_vec.diminfo[0].strides = __pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_i_min_vec.diminfo[0].shape = __pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_i_max_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 9, __pyx_L1_error) + } + __pyx_pybuffernd_i_max_vec.diminfo[0].strides = __pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_i_max_vec.diminfo[0].shape = __pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_extract_str(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_i_min_vec, __pyx_v_i_max_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.extract_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_max_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_i_min_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":34 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] split_and_extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_3split_and_extract_str(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_split_and_extract_str(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_str_split_vec, PyArrayObject *__pyx_v_idx_split_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + __pyx_t_5numpy_int64_t __pyx_v_i; + __pyx_t_5numpy_int64_t __pyx_v_k; + PyObject *__pyx_v_value = 0; + PyObject *__pyx_v_value_split = 0; + __pyx_t_5numpy_int64_t __pyx_v_n_rows; + __pyx_t_5numpy_int64_t __pyx_v_n_columns; + PyArrayObject *__pyx_v_X_new = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_split_vec; + __Pyx_Buffer __pyx_pybuffer_idx_split_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_str_split_vec; + __Pyx_Buffer __pyx_pybuffer_str_split_vec; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __pyx_t_5numpy_int64_t __pyx_t_8; + __pyx_t_5numpy_int64_t __pyx_t_9; + __pyx_t_5numpy_int64_t __pyx_t_10; + __pyx_t_5numpy_int64_t __pyx_t_11; + __pyx_t_5numpy_int64_t __pyx_t_12; + __pyx_t_5numpy_int64_t __pyx_t_13; + __pyx_t_5numpy_int64_t __pyx_t_14; + __pyx_t_5numpy_int64_t __pyx_t_15; + __pyx_t_5numpy_int64_t __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + Py_ssize_t __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("split_and_extract_str", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_str_split_vec.pybuffer.buf = NULL; + __pyx_pybuffer_str_split_vec.refcount = 0; + __pyx_pybuffernd_str_split_vec.data = NULL; + __pyx_pybuffernd_str_split_vec.rcbuffer = &__pyx_pybuffer_str_split_vec; + __pyx_pybuffer_idx_split_vec.pybuffer.buf = NULL; + __pyx_pybuffer_idx_split_vec.refcount = 0; + __pyx_pybuffernd_idx_split_vec.data = NULL; + __pyx_pybuffernd_idx_split_vec.rcbuffer = &__pyx_pybuffer_idx_split_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_str_split_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_str_split_vec.diminfo[0].strides = __pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_str_split_vec.diminfo[0].shape = __pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_split_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_idx_split_vec.diminfo[0].strides = __pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_split_vec.diminfo[0].shape = __pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_str.pyx":44 + * cdef object value + * cdef list value_split + * cdef np.int64_t n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t n_columns = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":45 + * cdef list value_split + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_columns = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + * for k in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error) + __pyx_v_n_columns = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":46 + * cdef np.int64_t n_rows = X.shape[0] + * cdef np.int64_t n_columns = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) # <<<<<<<<<<<<<< + * for k in range(n_rows): + * for i in range(n_columns): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_npy_int64(__pyx_v_n_columns); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 46, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_6, __pyx_builtin_object}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 46, __pyx_L1_error) + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":47 + * cdef np.int64_t n_columns = idx_columns.shape[0] + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + * for k in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_columns): + * value = X[k, idx_columns[i]] + */ + __pyx_t_8 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_8; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_k = __pyx_t_10; + + /* "feature_gen_str.pyx":48 + * cdef np.ndarray X_new = np.empty((n_rows, n_columns), object) + * for k in range(n_rows): + * for i in range(n_columns): # <<<<<<<<<<<<<< + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float): + */ + __pyx_t_11 = __pyx_v_n_columns; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_i = __pyx_t_13; + + /* "feature_gen_str.pyx":49 + * for k in range(n_rows): + * for i in range(n_columns): + * value = X[k, idx_columns[i]] # <<<<<<<<<<<<<< + * if value == None or isinstance(value, float): + * X_new[k, i] = "" + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_k; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":50 + * for i in range(n_columns): + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float): # <<<<<<<<<<<<<< + * X_new[k, i] = "" + * continue + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_value, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L1_error) + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_17 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_18 = PyFloat_Check(__pyx_v_value); + __pyx_t_17 = __pyx_t_18; + __pyx_L8_bool_binop_done:; + if (__pyx_t_17) { + + /* "feature_gen_str.pyx":51 + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float): + * X_new[k, i] = "" # <<<<<<<<<<<<<< + * continue + * value_split = value.split(str_split_vec[i]) + */ + __pyx_t_2 = __Pyx_PyInt_From_npy_int64(__pyx_v_k); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 51, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_i); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 51, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 51, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 51, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4)) __PYX_ERR(0, 51, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_4 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_6, __pyx_kp_u__3) < 0))) __PYX_ERR(0, 51, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "feature_gen_str.pyx":52 + * if value == None or isinstance(value, float): + * X_new[k, i] = "" + * continue # <<<<<<<<<<<<<< + * value_split = value.split(str_split_vec[i]) + * if len(value_split) <= idx_split_vec[i]: + */ + goto __pyx_L5_continue; + + /* "feature_gen_str.pyx":50 + * for i in range(n_columns): + * value = X[k, idx_columns[i]] + * if value == None or isinstance(value, float): # <<<<<<<<<<<<<< + * X_new[k, i] = "" + * continue + */ + } + + /* "feature_gen_str.pyx":53 + * X_new[k, i] = "" + * continue + * value_split = value.split(str_split_vec[i]) # <<<<<<<<<<<<<< + * if len(value_split) <= idx_split_vec[i]: + * X_new[k, i] = "" + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_split); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 53, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_14 = __pyx_v_i; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_str_split_vec.diminfo[0].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_2}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 53, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(PyList_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_6))) __PYX_ERR(0, 53, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_value_split, ((PyObject*)__pyx_t_6)); + __pyx_t_6 = 0; + + /* "feature_gen_str.pyx":54 + * continue + * value_split = value.split(str_split_vec[i]) + * if len(value_split) <= idx_split_vec[i]: # <<<<<<<<<<<<<< + * X_new[k, i] = "" + * continue + */ + if (unlikely(__pyx_v_value_split == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 54, __pyx_L1_error) + } + __pyx_t_19 = __Pyx_PyList_GET_SIZE(__pyx_v_value_split); if (unlikely(__pyx_t_19 == ((Py_ssize_t)-1))) __PYX_ERR(0, 54, __pyx_L1_error) + __pyx_t_14 = __pyx_v_i; + __pyx_t_17 = (__pyx_t_19 <= (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_split_vec.diminfo[0].strides))); + if (__pyx_t_17) { + + /* "feature_gen_str.pyx":55 + * value_split = value.split(str_split_vec[i]) + * if len(value_split) <= idx_split_vec[i]: + * X_new[k, i] = "" # <<<<<<<<<<<<<< + * continue + * X_new[k, i] = value_split[idx_split_vec[i]] + */ + __pyx_t_6 = __Pyx_PyInt_From_npy_int64(__pyx_v_k); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_i); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_6)) __PYX_ERR(0, 55, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4)) __PYX_ERR(0, 55, __pyx_L1_error); + __pyx_t_6 = 0; + __pyx_t_4 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_2, __pyx_kp_u__3) < 0))) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":56 + * if len(value_split) <= idx_split_vec[i]: + * X_new[k, i] = "" + * continue # <<<<<<<<<<<<<< + * X_new[k, i] = value_split[idx_split_vec[i]] + * return np.concatenate((X, X_new), axis=1) + */ + goto __pyx_L5_continue; + + /* "feature_gen_str.pyx":54 + * continue + * value_split = value.split(str_split_vec[i]) + * if len(value_split) <= idx_split_vec[i]: # <<<<<<<<<<<<<< + * X_new[k, i] = "" + * continue + */ + } + + /* "feature_gen_str.pyx":57 + * X_new[k, i] = "" + * continue + * X_new[k, i] = value_split[idx_split_vec[i]] # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + if (unlikely(__pyx_v_value_split == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 57, __pyx_L1_error) + } + __pyx_t_14 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_split_vec.diminfo[0].strides)); + __pyx_t_2 = PyList_GET_ITEM(__pyx_v_value_split, __pyx_t_16); + __Pyx_INCREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_npy_int64(__pyx_v_k); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyInt_From_npy_int64(__pyx_v_i); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4)) __PYX_ERR(0, 57, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6)) __PYX_ERR(0, 57, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_X_new), __pyx_t_5, __pyx_t_2) < 0))) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_L5_continue:; + } + } + + /* "feature_gen_str.pyx":58 + * continue + * X_new[k, i] = value_split[idx_split_vec[i]] + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 58, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 58, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 58, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_4); + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":34 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] split_and_extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.split_and_extract_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_value_split); + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_3split_and_extract_str(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_3split_and_extract_str = {"split_and_extract_str", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_3split_and_extract_str, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_3split_and_extract_str(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_str_split_vec = 0; + PyArrayObject *__pyx_v_idx_split_vec = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("split_and_extract_str (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_str_split_vec,&__pyx_n_s_idx_split_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("split_and_extract_str", 1, 4, 4, 1); __PYX_ERR(0, 34, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_str_split_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("split_and_extract_str", 1, 4, 4, 2); __PYX_ERR(0, 34, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_split_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("split_and_extract_str", 1, 4, 4, 3); __PYX_ERR(0, 34, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "split_and_extract_str") < 0)) __PYX_ERR(0, 34, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_str_split_vec = ((PyArrayObject *)values[2]); + __pyx_v_idx_split_vec = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("split_and_extract_str", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 34, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.split_and_extract_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 35, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 36, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_str_split_vec), __pyx_ptype_5numpy_ndarray, 1, "str_split_vec", 0))) __PYX_ERR(0, 37, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_split_vec), __pyx_ptype_5numpy_ndarray, 1, "idx_split_vec", 0))) __PYX_ERR(0, 38, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_2split_and_extract_str(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_str_split_vec, __pyx_v_idx_split_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_2split_and_extract_str(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_str_split_vec, PyArrayObject *__pyx_v_idx_split_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_split_vec; + __Pyx_Buffer __pyx_pybuffer_idx_split_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_str_split_vec; + __Pyx_Buffer __pyx_pybuffer_str_split_vec; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("split_and_extract_str", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_str_split_vec.pybuffer.buf = NULL; + __pyx_pybuffer_str_split_vec.refcount = 0; + __pyx_pybuffernd_str_split_vec.data = NULL; + __pyx_pybuffernd_str_split_vec.rcbuffer = &__pyx_pybuffer_str_split_vec; + __pyx_pybuffer_idx_split_vec.pybuffer.buf = NULL; + __pyx_pybuffer_idx_split_vec.refcount = 0; + __pyx_pybuffernd_idx_split_vec.data = NULL; + __pyx_pybuffernd_idx_split_vec.rcbuffer = &__pyx_pybuffer_idx_split_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_str_split_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_str_split_vec.diminfo[0].strides = __pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_str_split_vec.diminfo[0].shape = __pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_split_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 34, __pyx_L1_error) + } + __pyx_pybuffernd_idx_split_vec.diminfo[0].strides = __pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_split_vec.diminfo[0].shape = __pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_split_and_extract_str(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_str_split_vec, __pyx_v_idx_split_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.split_and_extract_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_split_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_str_split_vec.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":64 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] length( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_5length(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_length(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + PyObject *__pyx_v_val = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + int __pyx_t_17; + int __pyx_t_18; + Py_ssize_t __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("length", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 64, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 64, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_str.pyx":70 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":71 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * cdef object val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":72 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef object val + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 72, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 72, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 72, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":74 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.empty((n_rows, n_cols)) + * cdef object val + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = X[i, idx_columns[j]] + */ + __pyx_t_7 = __pyx_v_n_cols; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "feature_gen_str.pyx":75 + * cdef object val + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = X[i, idx_columns[j]] + * if val == None or val == 'nan': + */ + __pyx_t_11 = __pyx_v_n_rows; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_i = __pyx_t_13; + + /* "feature_gen_str.pyx":76 + * for j in range(n_cols): + * for i in range(n_rows): + * val = X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * if val == None or val == 'nan': + * X_new[i, j] = 0 + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":77 + * for i in range(n_rows): + * val = X[i, idx_columns[j]] + * if val == None or val == 'nan': # <<<<<<<<<<<<<< + * X_new[i, j] = 0 + * continue + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 77, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!__pyx_t_18) { + } else { + __pyx_t_17 = __pyx_t_18; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_18 = (__Pyx_PyUnicode_Equals(__pyx_v_val, __pyx_n_u_nan, Py_EQ)); if (unlikely((__pyx_t_18 < 0))) __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_t_17 = __pyx_t_18; + __pyx_L8_bool_binop_done:; + if (__pyx_t_17) { + + /* "feature_gen_str.pyx":78 + * val = X[i, idx_columns[j]] + * if val == None or val == 'nan': + * X_new[i, j] = 0 # <<<<<<<<<<<<<< + * continue + * X_new[i, j] = len(str(val)) + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_16 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X_new.diminfo[1].strides) = 0.0; + + /* "feature_gen_str.pyx":79 + * if val == None or val == 'nan': + * X_new[i, j] = 0 + * continue # <<<<<<<<<<<<<< + * X_new[i, j] = len(str(val)) + * return np.concatenate((X, X_new),axis=1) + */ + goto __pyx_L5_continue; + + /* "feature_gen_str.pyx":77 + * for i in range(n_rows): + * val = X[i, idx_columns[j]] + * if val == None or val == 'nan': # <<<<<<<<<<<<<< + * X_new[i, j] = 0 + * continue + */ + } + + /* "feature_gen_str.pyx":80 + * X_new[i, j] = 0 + * continue + * X_new[i, j] = len(str(val)) # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new),axis=1) + * + */ + __pyx_t_2 = __Pyx_PyObject_Str(__pyx_v_val); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 80, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_19 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_19 == ((Py_ssize_t)-1))) __PYX_ERR(0, 80, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_16 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[1].strides) = __pyx_t_19; + __pyx_L5_continue:; + } + } + + /* "feature_gen_str.pyx":81 + * continue + * X_new[i, j] = len(str(val)) + * return np.concatenate((X, X_new),axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 81, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 81, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 81, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":64 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] length( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.length", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_5length(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_5length = {"length", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_5length, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_5length(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("length (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("length", 1, 2, 2, 1); __PYX_ERR(0, 64, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "length") < 0)) __PYX_ERR(0, 64, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("length", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 64, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.length", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 65, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 66, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_4length(__pyx_self, __pyx_v_X, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_4length(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("length", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 64, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 64, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_length(__pyx_v_X, __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.length", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":86 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] contains( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_7contains(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_contains(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_contains_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + PyObject *__pyx_v_val = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_contains_vec; + __Pyx_Buffer __pyx_pybuffer_contains_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + int __pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("contains", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_contains_vec.pybuffer.buf = NULL; + __pyx_pybuffer_contains_vec.refcount = 0; + __pyx_pybuffernd_contains_vec.data = NULL; + __pyx_pybuffernd_contains_vec.rcbuffer = &__pyx_pybuffer_contains_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 86, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 86, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_contains_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_contains_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 86, __pyx_L1_error) + } + __pyx_pybuffernd_contains_vec.diminfo[0].strides = __pyx_pybuffernd_contains_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_contains_vec.diminfo[0].shape = __pyx_pybuffernd_contains_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_str.pyx":93 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 93, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":94 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * cdef object val + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 94, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":95 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef object val + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 95, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 95, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 95, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 95, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 95, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 95, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 95, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 95, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 95, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 95, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":97 + * cdef np.ndarray[np.float_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * cdef object val + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * val = contains_vec[j] + */ + __pyx_t_7 = __pyx_v_n_cols; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "feature_gen_str.pyx":98 + * cdef object val + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * val = contains_vec[j] + * if val in X[i, idx_columns[j]]: + */ + __pyx_t_11 = __pyx_v_n_rows; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_i = __pyx_t_13; + + /* "feature_gen_str.pyx":99 + * for j in range(n_cols): + * for i in range(n_rows): + * val = contains_vec[j] # <<<<<<<<<<<<<< + * if val in X[i, idx_columns[j]]: + * X_new[i, j] = 1. + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_contains_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_contains_vec.diminfo[0].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":100 + * for i in range(n_rows): + * val = contains_vec[j] + * if val in X[i, idx_columns[j]]: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * return np.concatenate((X, X_new),axis=1) + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_2 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_2 == NULL)) __pyx_t_2 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_2); + __pyx_t_17 = (__Pyx_PySequence_ContainsTF(__pyx_v_val, __pyx_t_2, Py_EQ)); if (unlikely((__pyx_t_17 < 0))) __PYX_ERR(0, 100, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_17) { + + /* "feature_gen_str.pyx":101 + * val = contains_vec[j] + * if val in X[i, idx_columns[j]]: + * X_new[i, j] = 1. # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new),axis=1) + * + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_16 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_X_new.diminfo[1].strides) = 1.; + + /* "feature_gen_str.pyx":100 + * for i in range(n_rows): + * val = contains_vec[j] + * if val in X[i, idx_columns[j]]: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * return np.concatenate((X, X_new),axis=1) + */ + } + } + } + + /* "feature_gen_str.pyx":102 + * if val in X[i, idx_columns[j]]: + * X_new[i, j] = 1. + * return np.concatenate((X, X_new),axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 102, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 102, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 102, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 102, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 102, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 102, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 102, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 102, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 102, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 102, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":86 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] contains( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_contains_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.contains", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_contains_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_7contains(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_7contains = {"contains", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_7contains, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_7contains(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_contains_vec = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("contains (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_contains_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("contains", 1, 3, 3, 1); __PYX_ERR(0, 86, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_contains_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("contains", 1, 3, 3, 2); __PYX_ERR(0, 86, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "contains") < 0)) __PYX_ERR(0, 86, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_contains_vec = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("contains", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 86, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.contains", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 87, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 88, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_contains_vec), __pyx_ptype_5numpy_ndarray, 1, "contains_vec", 0))) __PYX_ERR(0, 89, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_6contains(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_contains_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_6contains(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_contains_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_contains_vec; + __Pyx_Buffer __pyx_pybuffer_contains_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("contains", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_contains_vec.pybuffer.buf = NULL; + __pyx_pybuffer_contains_vec.refcount = 0; + __pyx_pybuffernd_contains_vec.data = NULL; + __pyx_pybuffernd_contains_vec.rcbuffer = &__pyx_pybuffer_contains_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 86, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 86, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_contains_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_contains_vec, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 86, __pyx_L1_error) + } + __pyx_pybuffernd_contains_vec.diminfo[0].strides = __pyx_pybuffernd_contains_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_contains_vec.diminfo[0].shape = __pyx_pybuffernd_contains_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_contains(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_contains_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_contains_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.contains", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_contains_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":107 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] upper_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + +static PyObject *__pyx_pw_15feature_gen_str_9upper_case(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_upper_case(PyArrayObject *__pyx_v_X, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + int __pyx_t_12; + PyObject **__pyx_t_13; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("upper_case", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 107, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_str.pyx":112 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 112, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":113 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 113, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_str.pyx":114 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * if X[i, j] == None: + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "feature_gen_str.pyx":115 + * cdef int n_cols = X.shape[1] + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * if X[i, j] == None: + * X[i, j] = None + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "feature_gen_str.pyx":116 + * for j in range(n_cols): + * for i in range(n_rows): + * if X[i, j] == None: # <<<<<<<<<<<<<< + * X[i, j] = None + * else: + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = __pyx_v_j; + __pyx_t_8 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_8 == NULL)) __pyx_t_8 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_8); + __pyx_t_11 = PyObject_RichCompare(__pyx_t_8, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + if (__pyx_t_12) { + + /* "feature_gen_str.pyx":117 + * for i in range(n_rows): + * if X[i, j] == None: + * X[i, j] = None # <<<<<<<<<<<<<< + * else: + * X[i, j] = X[i, j].upper() + */ + __pyx_t_10 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_13 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_13); + __Pyx_INCREF(Py_None); __Pyx_XDECREF(*__pyx_t_13); + *__pyx_t_13 = Py_None; + __Pyx_XGIVEREF(*__pyx_t_13); + + /* "feature_gen_str.pyx":116 + * for j in range(n_cols): + * for i in range(n_rows): + * if X[i, j] == None: # <<<<<<<<<<<<<< + * X[i, j] = None + * else: + */ + goto __pyx_L7; + } + + /* "feature_gen_str.pyx":119 + * X[i, j] = None + * else: + * X[i, j] = X[i, j].upper() # <<<<<<<<<<<<<< + * return X + * + */ + /*else*/ { + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = __pyx_v_j; + __pyx_t_8 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_8 == NULL)) __pyx_t_8 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_8); + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_upper); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_14))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_14); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_14, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, NULL}; + __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_14, __pyx_callargs+1-__pyx_t_15, 0+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + } + __pyx_t_10 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_13 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_13); + __Pyx_INCREF(__pyx_t_11); __Pyx_XDECREF(*__pyx_t_13); + *__pyx_t_13 = __pyx_t_11; + __Pyx_XGIVEREF(*__pyx_t_13); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __pyx_L7:; + } + } + + /* "feature_gen_str.pyx":120 + * else: + * X[i, j] = X[i, j].upper() + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "feature_gen_str.pyx":107 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] upper_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_14); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.upper_case", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_9upper_case(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_9upper_case = {"upper_case", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_9upper_case, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_9upper_case(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("upper_case (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "upper_case") < 0)) __PYX_ERR(0, 107, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("upper_case", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 107, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.upper_case", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 108, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_8upper_case(__pyx_self, __pyx_v_X); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_8upper_case(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("upper_case", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 107, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_upper_case(__pyx_v_X, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.upper_case", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":125 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] lower_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + +static PyObject *__pyx_pw_15feature_gen_str_11lower_case(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_lower_case(PyArrayObject *__pyx_v_X, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + int __pyx_t_12; + PyObject **__pyx_t_13; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("lower_case", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 125, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_str.pyx":130 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * for j in range(n_cols): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 130, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":131 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "feature_gen_str.pyx":132 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for i in range(n_rows): + * if X[i, j] == None: + */ + __pyx_t_2 = __pyx_v_n_cols; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "feature_gen_str.pyx":133 + * cdef int n_cols = X.shape[1] + * for j in range(n_cols): + * for i in range(n_rows): # <<<<<<<<<<<<<< + * if X[i, j] == None: + * X[i, j] = None + */ + __pyx_t_5 = __pyx_v_n_rows; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "feature_gen_str.pyx":134 + * for j in range(n_cols): + * for i in range(n_rows): + * if X[i, j] == None: # <<<<<<<<<<<<<< + * X[i, j] = None + * else: + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = __pyx_v_j; + __pyx_t_8 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_8 == NULL)) __pyx_t_8 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_8); + __pyx_t_11 = PyObject_RichCompare(__pyx_t_8, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 134, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(0, 134, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + if (__pyx_t_12) { + + /* "feature_gen_str.pyx":135 + * for i in range(n_rows): + * if X[i, j] == None: + * X[i, j] = None # <<<<<<<<<<<<<< + * else: + * X[i, j] = X[i, j].lower() + */ + __pyx_t_10 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_13 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_13); + __Pyx_INCREF(Py_None); __Pyx_XDECREF(*__pyx_t_13); + *__pyx_t_13 = Py_None; + __Pyx_XGIVEREF(*__pyx_t_13); + + /* "feature_gen_str.pyx":134 + * for j in range(n_cols): + * for i in range(n_rows): + * if X[i, j] == None: # <<<<<<<<<<<<<< + * X[i, j] = None + * else: + */ + goto __pyx_L7; + } + + /* "feature_gen_str.pyx":137 + * X[i, j] = None + * else: + * X[i, j] = X[i, j].lower() # <<<<<<<<<<<<<< + * return X + * + */ + /*else*/ { + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = __pyx_v_j; + __pyx_t_8 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_8 == NULL)) __pyx_t_8 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_8); + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_lower); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_14))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_14); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_14, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_8, NULL}; + __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_14, __pyx_callargs+1-__pyx_t_15, 0+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + } + __pyx_t_10 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_13 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_13); + __Pyx_INCREF(__pyx_t_11); __Pyx_XDECREF(*__pyx_t_13); + *__pyx_t_13 = __pyx_t_11; + __Pyx_XGIVEREF(*__pyx_t_13); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __pyx_L7:; + } + } + + /* "feature_gen_str.pyx":138 + * else: + * X[i, j] = X[i, j].lower() + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "feature_gen_str.pyx":125 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] lower_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_14); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.lower_case", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_11lower_case(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_11lower_case = {"lower_case", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_11lower_case, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_11lower_case(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("lower_case (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "lower_case") < 0)) __PYX_ERR(0, 125, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("lower_case", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 125, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.lower_case", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_10lower_case(__pyx_self, __pyx_v_X); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_10lower_case(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("lower_case", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 125, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_lower_case(__pyx_v_X, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.lower_case", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":143 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] isin( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_13isin(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_isin(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_values_vec_np, PyArrayObject *__pyx_v_n_values_vec, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + PyObject *__pyx_v_k = NULL; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_n_values_vec; + __Pyx_Buffer __pyx_pybuffer_n_values_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_values_vec_np; + __Pyx_Buffer __pyx_pybuffer_values_vec_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + PyObject *(*__pyx_t_16)(PyObject *); + Py_ssize_t __pyx_t_17; + __pyx_t_5numpy_int64_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("isin", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_values_vec_np.pybuffer.buf = NULL; + __pyx_pybuffer_values_vec_np.refcount = 0; + __pyx_pybuffernd_values_vec_np.data = NULL; + __pyx_pybuffernd_values_vec_np.rcbuffer = &__pyx_pybuffer_values_vec_np; + __pyx_pybuffer_n_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_n_values_vec.refcount = 0; + __pyx_pybuffernd_n_values_vec.data = NULL; + __pyx_pybuffernd_n_values_vec.rcbuffer = &__pyx_pybuffer_n_values_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_values_vec_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_values_vec_np.diminfo[0].strides = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values_vec_np.diminfo[0].shape = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values_vec_np.diminfo[1].strides = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values_vec_np.diminfo[1].shape = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_values_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_n_values_vec.diminfo[0].strides = __pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_n_values_vec.diminfo[0].shape = __pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer.shape[0]; + + /* "feature_gen_str.pyx":152 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":153 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 153, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":154 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 154, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 154, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 154, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 154, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":155 + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for k in range(n_values_vec[j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_str.pyx":156 + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for k in range(n_values_vec[j]): + * if X[i, idx_columns[j]] == values_vec_np[j, k]: + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_str.pyx":157 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_values_vec[j]): # <<<<<<<<<<<<<< + * if X[i, idx_columns[j]] == values_vec_np[j, k]: + * X_new[i, j] = 1. + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_2 = __Pyx_PyInt_From_npy_int64((*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_n_values_vec.diminfo[0].strides))); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_range, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) { + __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); + __pyx_t_15 = 0; + __pyx_t_16 = NULL; + } else { + __pyx_t_15 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_16 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 157, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + for (;;) { + if (likely(!__pyx_t_16)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 157, __pyx_L1_error) + #endif + if (__pyx_t_15 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_15); __Pyx_INCREF(__pyx_t_4); __pyx_t_15++; if (unlikely((0 < 0))) __PYX_ERR(0, 157, __pyx_L1_error) + #else + __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 157, __pyx_L1_error) + #endif + if (__pyx_t_15 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_15); __Pyx_INCREF(__pyx_t_4); __pyx_t_15++; if (unlikely((0 < 0))) __PYX_ERR(0, 157, __pyx_L1_error) + #else + __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_16(__pyx_t_2); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 157, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_4); + __pyx_t_4 = 0; + + /* "feature_gen_str.pyx":158 + * for j in range(n_cols): + * for k in range(n_values_vec[j]): + * if X[i, idx_columns[j]] == values_vec_np[j, k]: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * break + */ + __pyx_t_14 = __pyx_v_j; + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6)) __PYX_ERR(0, 158, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_k); + __Pyx_GIVEREF(__pyx_v_k); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_k)) __PYX_ERR(0, 158, __pyx_L1_error); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_values_vec_np), __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_19 < 0))) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_19) { + + /* "feature_gen_str.pyx":159 + * for k in range(n_values_vec[j]): + * if X[i, idx_columns[j]] == values_vec_np[j, k]: + * X_new[i, j] = 1. # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_17 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_X_new.diminfo[1].strides) = 1.; + + /* "feature_gen_str.pyx":160 + * if X[i, idx_columns[j]] == values_vec_np[j, k]: + * X_new[i, j] = 1. + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + goto __pyx_L8_break; + + /* "feature_gen_str.pyx":158 + * for j in range(n_cols): + * for k in range(n_values_vec[j]): + * if X[i, idx_columns[j]] == values_vec_np[j, k]: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * break + */ + } + + /* "feature_gen_str.pyx":157 + * for i in range(n_rows): + * for j in range(n_cols): + * for k in range(n_values_vec[j]): # <<<<<<<<<<<<<< + * if X[i, idx_columns[j]] == values_vec_np[j, k]: + * X_new[i, j] = 1. + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L10_for_end; + __pyx_L8_break:; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L10_for_end; + __pyx_L10_for_end:; + } + } + + /* "feature_gen_str.pyx":161 + * X_new[i, j] = 1. + * break + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 161, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_4); + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":143 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] isin( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.isin", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XDECREF(__pyx_v_k); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_13isin(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_13isin = {"isin", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_13isin, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_13isin(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_values_vec_np = 0; + PyArrayObject *__pyx_v_n_values_vec = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[4] = {0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("isin (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_values_vec_np,&__pyx_n_s_n_values_vec,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("isin", 1, 4, 4, 1); __PYX_ERR(0, 143, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_values_vec_np)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("isin", 1, 4, 4, 2); __PYX_ERR(0, 143, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_n_values_vec)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("isin", 1, 4, 4, 3); __PYX_ERR(0, 143, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "isin") < 0)) __PYX_ERR(0, 143, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 4)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_values_vec_np = ((PyArrayObject *)values[2]); + __pyx_v_n_values_vec = ((PyArrayObject *)values[3]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("isin", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 143, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.isin", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 144, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 145, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values_vec_np), __pyx_ptype_5numpy_ndarray, 1, "values_vec_np", 0))) __PYX_ERR(0, 146, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_n_values_vec), __pyx_ptype_5numpy_ndarray, 1, "n_values_vec", 0))) __PYX_ERR(0, 147, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_12isin(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_values_vec_np, __pyx_v_n_values_vec); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_12isin(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_values_vec_np, PyArrayObject *__pyx_v_n_values_vec) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_n_values_vec; + __Pyx_Buffer __pyx_pybuffer_n_values_vec; + __Pyx_LocalBuf_ND __pyx_pybuffernd_values_vec_np; + __Pyx_Buffer __pyx_pybuffer_values_vec_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("isin", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_values_vec_np.pybuffer.buf = NULL; + __pyx_pybuffer_values_vec_np.refcount = 0; + __pyx_pybuffernd_values_vec_np.data = NULL; + __pyx_pybuffernd_values_vec_np.rcbuffer = &__pyx_pybuffer_values_vec_np; + __pyx_pybuffer_n_values_vec.pybuffer.buf = NULL; + __pyx_pybuffer_n_values_vec.refcount = 0; + __pyx_pybuffernd_n_values_vec.data = NULL; + __pyx_pybuffernd_n_values_vec.rcbuffer = &__pyx_pybuffer_n_values_vec; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_values_vec_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_values_vec_np.diminfo[0].strides = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values_vec_np.diminfo[0].shape = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values_vec_np.diminfo[1].strides = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values_vec_np.diminfo[1].shape = __pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_values_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 143, __pyx_L1_error) + } + __pyx_pybuffernd_n_values_vec.diminfo[0].strides = __pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_n_values_vec.diminfo[0].shape = __pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_isin(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_values_vec_np, __pyx_v_n_values_vec, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.isin", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_n_values_vec.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values_vec_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":168 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] endswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_15endswith(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_endswith(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_pattern_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + int __pyx_v_n_chars; + int __pyx_v_n; + PyObject *__pyx_v_pat = 0; + PyObject *__pyx_v_val = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_pattern_np; + __Pyx_Buffer __pyx_pybuffer_pattern_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + PyObject *(*__pyx_t_15)(PyObject *); + Py_ssize_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + int __pyx_t_20; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("endswith", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_pattern_np.pybuffer.buf = NULL; + __pyx_pybuffer_pattern_np.refcount = 0; + __pyx_pybuffernd_pattern_np.data = NULL; + __pyx_pybuffernd_pattern_np.rcbuffer = &__pyx_pybuffer_pattern_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 168, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 168, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_pattern_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 168, __pyx_L1_error) + } + __pyx_pybuffernd_pattern_np.diminfo[0].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_pattern_np.diminfo[0].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_pattern_np.diminfo[1].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_pattern_np.diminfo[1].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_str.pyx":176 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 176, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":177 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * cdef int n_chars + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":178 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int n_chars + * cdef int n + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 178, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 178, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 178, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 178, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":183 + * cdef object pat + * cdef object val + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for pat in range(pattern_np[j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_str.pyx":184 + * cdef object val + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for pat in range(pattern_np[j]): + * n_chars = len(pat) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_str.pyx":185 + * for i in range(n_rows): + * for j in range(n_cols): + * for pat in range(pattern_np[j]): # <<<<<<<<<<<<<< + * n_chars = len(pat) + * val = X[i, idx_columns[j]] + */ + __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_pattern_np), __pyx_v_j, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_range, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) { + __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); + __pyx_t_14 = 0; + __pyx_t_15 = NULL; + } else { + __pyx_t_14 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 185, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + for (;;) { + if (likely(!__pyx_t_15)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 185, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_14); __Pyx_INCREF(__pyx_t_4); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 185, __pyx_L1_error) + #else + __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 185, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_14); __Pyx_INCREF(__pyx_t_4); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 185, __pyx_L1_error) + #else + __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_15(__pyx_t_2); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 185, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_pat, __pyx_t_4); + __pyx_t_4 = 0; + + /* "feature_gen_str.pyx":186 + * for j in range(n_cols): + * for pat in range(pattern_np[j]): + * n_chars = len(pat) # <<<<<<<<<<<<<< + * val = X[i, idx_columns[j]] + * n = len(val) + */ + __pyx_t_16 = PyObject_Length(__pyx_v_pat); if (unlikely(__pyx_t_16 == ((Py_ssize_t)-1))) __PYX_ERR(0, 186, __pyx_L1_error) + __pyx_v_n_chars = __pyx_t_16; + + /* "feature_gen_str.pyx":187 + * for pat in range(pattern_np[j]): + * n_chars = len(pat) + * val = X[i, idx_columns[j]] # <<<<<<<<<<<<<< + * n = len(val) + * if val[n - n_chars: n+1] == pat: + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_4); + __pyx_t_4 = 0; + + /* "feature_gen_str.pyx":188 + * n_chars = len(pat) + * val = X[i, idx_columns[j]] + * n = len(val) # <<<<<<<<<<<<<< + * if val[n - n_chars: n+1] == pat: + * X_new[i, j] = 1. + */ + __pyx_t_16 = PyObject_Length(__pyx_v_val); if (unlikely(__pyx_t_16 == ((Py_ssize_t)-1))) __PYX_ERR(0, 188, __pyx_L1_error) + __pyx_v_n = __pyx_t_16; + + /* "feature_gen_str.pyx":189 + * val = X[i, idx_columns[j]] + * n = len(val) + * if val[n - n_chars: n+1] == pat: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * break + */ + __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_val, (__pyx_v_n - __pyx_v_n_chars), (__pyx_v_n + 1), NULL, NULL, NULL, 1, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pat, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_20 < 0))) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_20) { + + /* "feature_gen_str.pyx":190 + * n = len(val) + * if val[n - n_chars: n+1] == pat: + * X_new[i, j] = 1. # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_new.diminfo[1].strides) = 1.; + + /* "feature_gen_str.pyx":191 + * if val[n - n_chars: n+1] == pat: + * X_new[i, j] = 1. + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + * + */ + goto __pyx_L8_break; + + /* "feature_gen_str.pyx":189 + * val = X[i, idx_columns[j]] + * n = len(val) + * if val[n - n_chars: n+1] == pat: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * break + */ + } + + /* "feature_gen_str.pyx":185 + * for i in range(n_rows): + * for j in range(n_cols): + * for pat in range(pattern_np[j]): # <<<<<<<<<<<<<< + * n_chars = len(pat) + * val = X[i, idx_columns[j]] + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L10_for_end; + __pyx_L8_break:; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L10_for_end; + __pyx_L10_for_end:; + } + } + + /* "feature_gen_str.pyx":192 + * X_new[i, j] = 1. + * break + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 192, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 192, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2)) __PYX_ERR(0, 192, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 192, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 192, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":168 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] endswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.endswith", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XDECREF(__pyx_v_pat); + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_15endswith(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_15endswith = {"endswith", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_15endswith, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_15endswith(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_pattern_np = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("endswith (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_pattern_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 168, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 168, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("endswith", 1, 3, 3, 1); __PYX_ERR(0, 168, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pattern_np)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 168, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("endswith", 1, 3, 3, 2); __PYX_ERR(0, 168, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "endswith") < 0)) __PYX_ERR(0, 168, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_pattern_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("endswith", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 168, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.endswith", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 169, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 170, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_pattern_np), __pyx_ptype_5numpy_ndarray, 1, "pattern_np", 0))) __PYX_ERR(0, 171, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_14endswith(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_pattern_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_14endswith(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_pattern_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_pattern_np; + __Pyx_Buffer __pyx_pybuffer_pattern_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("endswith", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_pattern_np.pybuffer.buf = NULL; + __pyx_pybuffer_pattern_np.refcount = 0; + __pyx_pybuffernd_pattern_np.data = NULL; + __pyx_pybuffernd_pattern_np.rcbuffer = &__pyx_pybuffer_pattern_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 168, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 168, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_pattern_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 168, __pyx_L1_error) + } + __pyx_pybuffernd_pattern_np.diminfo[0].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_pattern_np.diminfo[0].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_pattern_np.diminfo[1].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_pattern_np.diminfo[1].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_endswith(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_pattern_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.endswith", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "feature_gen_str.pyx":197 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] startswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + +static PyObject *__pyx_pw_15feature_gen_str_17startswith(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_15feature_gen_str_startswith(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_pattern_np, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + PyArrayObject *__pyx_v_X_new = 0; + CYTHON_UNUSED int __pyx_v_n; + int __pyx_v_n_chars; + PyObject *__pyx_v_pat = 0; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_new; + __Pyx_Buffer __pyx_pybuffer_X_new; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_pattern_np; + __Pyx_Buffer __pyx_pybuffer_pattern_np; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + Py_ssize_t __pyx_t_14; + PyObject *(*__pyx_t_15)(PyObject *); + Py_ssize_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_5numpy_int64_t __pyx_t_19; + int __pyx_t_20; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("startswith", 1); + __pyx_pybuffer_X_new.pybuffer.buf = NULL; + __pyx_pybuffer_X_new.refcount = 0; + __pyx_pybuffernd_X_new.data = NULL; + __pyx_pybuffernd_X_new.rcbuffer = &__pyx_pybuffer_X_new; + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_pattern_np.pybuffer.buf = NULL; + __pyx_pybuffer_pattern_np.refcount = 0; + __pyx_pybuffernd_pattern_np.data = NULL; + __pyx_pybuffernd_pattern_np.rcbuffer = &__pyx_pybuffer_pattern_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_pattern_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_pattern_np.diminfo[0].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_pattern_np.diminfo[0].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_pattern_np.diminfo[1].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_pattern_np.diminfo[1].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[1]; + + /* "feature_gen_str.pyx":205 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 205, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":206 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + * cdef int n, n_chars + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[0]); + + /* "feature_gen_str.pyx":207 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = idx_columns.shape[0] + * cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) # <<<<<<<<<<<<<< + * cdef int n, n_chars + * cdef object pat + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_rows); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_cols); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3)) __PYX_ERR(0, 207, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_5); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(0, 207, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 207, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_X_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 207, __pyx_L1_error) + } else {__pyx_pybuffernd_X_new.diminfo[0].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_new.diminfo[0].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_new.diminfo[1].strides = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_new.diminfo[1].shape = __pyx_pybuffernd_X_new.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_8 = 0; + __pyx_v_X_new = ((PyArrayObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":210 + * cdef int n, n_chars + * cdef object pat + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * for pat in range(pattern_np[j]): + */ + __pyx_t_7 = __pyx_v_n_rows; + __pyx_t_9 = __pyx_t_7; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "feature_gen_str.pyx":211 + * cdef object pat + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * for pat in range(pattern_np[j]): + * n = len(pat) + */ + __pyx_t_11 = __pyx_v_n_cols; + __pyx_t_12 = __pyx_t_11; + for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "feature_gen_str.pyx":212 + * for i in range(n_rows): + * for j in range(n_cols): + * for pat in range(pattern_np[j]): # <<<<<<<<<<<<<< + * n = len(pat) + * n_chars = len(pat) + */ + __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_pattern_np), __pyx_v_j, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 212, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_range, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 212, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) { + __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); + __pyx_t_14 = 0; + __pyx_t_15 = NULL; + } else { + __pyx_t_14 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 212, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 212, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + for (;;) { + if (likely(!__pyx_t_15)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 212, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_14); __Pyx_INCREF(__pyx_t_4); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 212, __pyx_L1_error) + #else + __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 212, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 212, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_14); __Pyx_INCREF(__pyx_t_4); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 212, __pyx_L1_error) + #else + __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 212, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_15(__pyx_t_2); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 212, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_pat, __pyx_t_4); + __pyx_t_4 = 0; + + /* "feature_gen_str.pyx":213 + * for j in range(n_cols): + * for pat in range(pattern_np[j]): + * n = len(pat) # <<<<<<<<<<<<<< + * n_chars = len(pat) + * if X[i, idx_columns[j]][:n_chars] == pat: + */ + __pyx_t_16 = PyObject_Length(__pyx_v_pat); if (unlikely(__pyx_t_16 == ((Py_ssize_t)-1))) __PYX_ERR(0, 213, __pyx_L1_error) + __pyx_v_n = __pyx_t_16; + + /* "feature_gen_str.pyx":214 + * for pat in range(pattern_np[j]): + * n = len(pat) + * n_chars = len(pat) # <<<<<<<<<<<<<< + * if X[i, idx_columns[j]][:n_chars] == pat: + * X_new[i, j] = 1. + */ + __pyx_t_16 = PyObject_Length(__pyx_v_pat); if (unlikely(__pyx_t_16 == ((Py_ssize_t)-1))) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_v_n_chars = __pyx_t_16; + + /* "feature_gen_str.pyx":215 + * n = len(pat) + * n_chars = len(pat) + * if X[i, idx_columns[j]][:n_chars] == pat: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * break + */ + __pyx_t_17 = __pyx_v_j; + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_4 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_4 == NULL)) __pyx_t_4 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_4); + __pyx_t_6 = __Pyx_PyObject_GetSlice(__pyx_t_4, 0, __pyx_v_n_chars, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_6, __pyx_v_pat, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_20 < 0))) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_20) { + + /* "feature_gen_str.pyx":216 + * n_chars = len(pat) + * if X[i, idx_columns[j]][:n_chars] == pat: + * X_new[i, j] = 1. # <<<<<<<<<<<<<< + * break + * return np.concatenate((X, X_new), axis=1) + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_new.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_X_new.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_X_new.diminfo[1].strides) = 1.; + + /* "feature_gen_str.pyx":217 + * if X[i, idx_columns[j]][:n_chars] == pat: + * X_new[i, j] = 1. + * break # <<<<<<<<<<<<<< + * return np.concatenate((X, X_new), axis=1) + */ + goto __pyx_L8_break; + + /* "feature_gen_str.pyx":215 + * n = len(pat) + * n_chars = len(pat) + * if X[i, idx_columns[j]][:n_chars] == pat: # <<<<<<<<<<<<<< + * X_new[i, j] = 1. + * break + */ + } + + /* "feature_gen_str.pyx":212 + * for i in range(n_rows): + * for j in range(n_cols): + * for pat in range(pattern_np[j]): # <<<<<<<<<<<<<< + * n = len(pat) + * n_chars = len(pat) + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L10_for_end; + __pyx_L8_break:; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L10_for_end; + __pyx_L10_for_end:; + } + } + + /* "feature_gen_str.pyx":218 + * X_new[i, j] = 1. + * break + * return np.concatenate((X, X_new), axis=1) # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_concatenate); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __Pyx_GIVEREF((PyObject *)__pyx_v_X); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_X))) __PYX_ERR(0, 218, __pyx_L1_error); + __Pyx_INCREF((PyObject *)__pyx_v_X_new); + __Pyx_GIVEREF((PyObject *)__pyx_v_X_new); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_X_new))) __PYX_ERR(0, 218, __pyx_L1_error); + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_axis, __pyx_int_1) < 0) __PYX_ERR(0, 218, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 218, __pyx_L1_error) + __pyx_r = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "feature_gen_str.pyx":197 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] startswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.startswith", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_new.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_X_new); + __Pyx_XDECREF(__pyx_v_pat); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_15feature_gen_str_17startswith(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15feature_gen_str_17startswith = {"startswith", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15feature_gen_str_17startswith, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15feature_gen_str_17startswith(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + PyArrayObject *__pyx_v_pattern_np = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("startswith (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_idx_columns,&__pyx_n_s_pattern_np,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("startswith", 1, 3, 3, 1); __PYX_ERR(0, 197, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pattern_np)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("startswith", 1, 3, 3, 2); __PYX_ERR(0, 197, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "startswith") < 0)) __PYX_ERR(0, 197, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_idx_columns = ((PyArrayObject *)values[1]); + __pyx_v_pattern_np = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("startswith", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 197, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("feature_gen_str.startswith", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 198, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_pattern_np), __pyx_ptype_5numpy_ndarray, 1, "pattern_np", 0))) __PYX_ERR(0, 200, __pyx_L1_error) + __pyx_r = __pyx_pf_15feature_gen_str_16startswith(__pyx_self, __pyx_v_X, __pyx_v_idx_columns, __pyx_v_pattern_np); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15feature_gen_str_16startswith(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_idx_columns, PyArrayObject *__pyx_v_pattern_np) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_pattern_np; + __Pyx_Buffer __pyx_pybuffer_pattern_np; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("startswith", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + __pyx_pybuffer_pattern_np.pybuffer.buf = NULL; + __pyx_pybuffer_pattern_np.refcount = 0; + __pyx_pybuffernd_pattern_np.data = NULL; + __pyx_pybuffernd_pattern_np.rcbuffer = &__pyx_pybuffer_pattern_np; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer, (PyObject*)__pyx_v_pattern_np, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_pattern_np.diminfo[0].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_pattern_np.diminfo[0].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_pattern_np.diminfo[1].strides = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_pattern_np.diminfo[1].shape = __pyx_pybuffernd_pattern_np.rcbuffer->pybuffer.shape[1]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_15feature_gen_str_startswith(__pyx_v_X, __pyx_v_idx_columns, __pyx_v_pattern_np, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("feature_gen_str.startswith", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_pattern_np.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_n_s__21, __pyx_k__21, sizeof(__pyx_k__21), 0, 0, 1, 1}, + {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, + {&__pyx_n_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_axis, __pyx_k_axis, sizeof(__pyx_k_axis), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_concatenate, __pyx_k_concatenate, sizeof(__pyx_k_concatenate), 0, 0, 1, 1}, + {&__pyx_n_s_contains, __pyx_k_contains, sizeof(__pyx_k_contains), 0, 0, 1, 1}, + {&__pyx_n_s_contains_vec, __pyx_k_contains_vec, sizeof(__pyx_k_contains_vec), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_n_s_endswith, __pyx_k_endswith, sizeof(__pyx_k_endswith), 0, 0, 1, 1}, + {&__pyx_n_s_extract_str, __pyx_k_extract_str, sizeof(__pyx_k_extract_str), 0, 0, 1, 1}, + {&__pyx_n_s_feature_gen_str, __pyx_k_feature_gen_str, sizeof(__pyx_k_feature_gen_str), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_feature_generation_str_fe, __pyx_k_gators_feature_generation_str_fe, sizeof(__pyx_k_gators_feature_generation_str_fe), 0, 0, 1, 0}, + {&__pyx_n_s_i_max_vec, __pyx_k_i_max_vec, sizeof(__pyx_k_i_max_vec), 0, 0, 1, 1}, + {&__pyx_n_s_i_min_vec, __pyx_k_i_min_vec, sizeof(__pyx_k_i_min_vec), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_idx_split_vec, __pyx_k_idx_split_vec, sizeof(__pyx_k_idx_split_vec), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_n_s_isin, __pyx_k_isin, sizeof(__pyx_k_isin), 0, 0, 1, 1}, + {&__pyx_n_s_length, __pyx_k_length, sizeof(__pyx_k_length), 0, 0, 1, 1}, + {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1}, + {&__pyx_n_s_lower_case, __pyx_k_lower_case, sizeof(__pyx_k_lower_case), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_n_values_vec, __pyx_k_n_values_vec, sizeof(__pyx_k_n_values_vec), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_u_nan, __pyx_k_nan, sizeof(__pyx_k_nan), 0, 1, 0, 1}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_object, __pyx_k_object, sizeof(__pyx_k_object), 0, 0, 1, 1}, + {&__pyx_n_s_pattern_np, __pyx_k_pattern_np, sizeof(__pyx_k_pattern_np), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, + {&__pyx_n_s_split_and_extract_str, __pyx_k_split_and_extract_str, sizeof(__pyx_k_split_and_extract_str), 0, 0, 1, 1}, + {&__pyx_n_s_startswith, __pyx_k_startswith, sizeof(__pyx_k_startswith), 0, 0, 1, 1}, + {&__pyx_n_s_str_split_vec, __pyx_k_str_split_vec, sizeof(__pyx_k_str_split_vec), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1}, + {&__pyx_n_s_upper_case, __pyx_k_upper_case, sizeof(__pyx_k_upper_case), 0, 0, 1, 1}, + {&__pyx_n_s_values_vec_np, __pyx_k_values_vec_np, sizeof(__pyx_k_values_vec_np), 0, 0, 1, 1}, + {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_object = __Pyx_GetBuiltinName(__pyx_n_s_object); if (!__pyx_builtin_object) __PYX_ERR(0, 21, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "feature_gen_str.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__5 = PyTuple_Pack(4, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_i_min_vec, __pyx_n_s_i_max_vec); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_extract_str, 9, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 9, __pyx_L1_error) + + /* "feature_gen_str.pyx":34 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] split_and_extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__7 = PyTuple_Pack(4, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_str_split_vec, __pyx_n_s_idx_split_vec); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_split_and_extract_str, 34, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 34, __pyx_L1_error) + + /* "feature_gen_str.pyx":64 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] length( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + __pyx_tuple__9 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_length, 64, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 64, __pyx_L1_error) + + /* "feature_gen_str.pyx":86 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] contains( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + __pyx_tuple__11 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_contains_vec); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_contains, 86, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 86, __pyx_L1_error) + + /* "feature_gen_str.pyx":107 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] upper_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_n_s_X); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_upper_case, 107, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 107, __pyx_L1_error) + + /* "feature_gen_str.pyx":125 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] lower_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_lower_case, 125, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(0, 125, __pyx_L1_error) + + /* "feature_gen_str.pyx":143 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] isin( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__16 = PyTuple_Pack(4, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_values_vec_np, __pyx_n_s_n_values_vec); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_isin, 143, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(0, 143, __pyx_L1_error) + + /* "feature_gen_str.pyx":168 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] endswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_tuple__18 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_idx_columns, __pyx_n_s_pattern_np); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_endswith, 168, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __PYX_ERR(0, 168, __pyx_L1_error) + + /* "feature_gen_str.pyx":197 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] startswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_feature_generation_str_fe, __pyx_n_s_startswith, 197, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_feature_gen_str(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_feature_gen_str}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "feature_gen_str", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initfeature_gen_str(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initfeature_gen_str(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_feature_gen_str(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_feature_gen_str(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_feature_gen_str(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'feature_gen_str' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("feature_gen_str", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "feature_gen_str" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_feature_gen_str(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_feature_gen_str) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "feature_gen_str")) { + if (unlikely((PyDict_SetItemString(modules, "feature_gen_str", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "feature_gen_str.pyx":4 + * cimport cython + * cimport numpy as np + * import numpy as np # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":9 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_1extract_str, 0, __pyx_n_s_extract_str, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_extract_str, __pyx_t_2) < 0) __PYX_ERR(0, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":34 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] split_and_extract_str( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_3split_and_extract_str, 0, __pyx_n_s_split_and_extract_str, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_split_and_extract_str, __pyx_t_2) < 0) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":64 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] length( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_5length, 0, __pyx_n_s_length, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_length, __pyx_t_2) < 0) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":86 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] contains( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_7contains, 0, __pyx_n_s_contains, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_contains, __pyx_t_2) < 0) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":107 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] upper_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_9upper_case, 0, __pyx_n_s_upper_case, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_upper_case, __pyx_t_2) < 0) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":125 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] lower_case( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * ): + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_11lower_case, 0, __pyx_n_s_lower_case, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__15)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_lower_case, __pyx_t_2) < 0) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":143 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] isin( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_13isin, 0, __pyx_n_s_isin, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__17)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_isin, __pyx_t_2) < 0) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":168 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] endswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_15endswith, 0, __pyx_n_s_endswith, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__19)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_endswith, __pyx_t_2) < 0) __PYX_ERR(0, 168, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":197 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim=2] startswith( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[np.int64_t, ndim=1] idx_columns, + */ + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_15feature_gen_str_17startswith, 0, __pyx_n_s_startswith, NULL, __pyx_n_s_feature_gen_str, __pyx_d, ((PyObject *)__pyx_codeobj__20)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_startswith, __pyx_t_2) < 0) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "feature_gen_str.pyx":1 + * # License: Apache-2.0 # <<<<<<<<<<<<<< + * cimport cython + * cimport numpy as np + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init feature_gen_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init feature_gen_str"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* PyDictVersioning */ + #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ + #if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ + #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* SliceObject */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, int wraparound) { + __Pyx_TypeName obj_type_name; +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#else + CYTHON_UNUSED_VAR(wraparound); +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is unsliceable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); +bad: + return NULL; +} + +/* TupleAndListFromArray */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ + #if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ + static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* RaiseUnexpectedTypeError */ + static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* PyObjectCallOneArg */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* GetItemInt */ + static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* ObjectGetItem */ + #if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ + #if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__4; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(npy_int64)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(npy_int64) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_int64) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(npy_int64, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(npy_int64) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) >= 2 * PyLong_SHIFT)) { + return (npy_int64) (((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(npy_int64) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) >= 3 * PyLong_SHIFT)) { + return (npy_int64) (((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(npy_int64) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) >= 4 * PyLong_SHIFT)) { + return (npy_int64) (((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_int64) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(npy_int64) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(npy_int64, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(npy_int64) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT)) { + return (npy_int64) (((npy_int64)-1)*(((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(npy_int64) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT)) { + return (npy_int64) ((((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT)) { + return (npy_int64) (((npy_int64)-1)*(((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(npy_int64) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT)) { + return (npy_int64) ((((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT)) { + return (npy_int64) (((npy_int64)-1)*(((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(npy_int64) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT)) { + return (npy_int64) ((((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(npy_int64) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(npy_int64) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + npy_int64 val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (npy_int64) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (npy_int64) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_int64) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (npy_int64) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (npy_int64) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(npy_int64) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((npy_int64) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(npy_int64) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((npy_int64) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((npy_int64) 1) << (sizeof(npy_int64) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (npy_int64) -1; + } + } else { + npy_int64 val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_int64) -1; + val = __Pyx_PyInt_As_npy_int64(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_int64"); + return (npy_int64) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_int64"); + return (npy_int64) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__21); + } + return name; +} +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/feature_generation_str/feature_gen_str.pyx b/gators/feature_generation_str/feature_gen_str.pyx index 0ef84e48..837039be 100644 --- a/gators/feature_generation_str/feature_gen_str.pyx +++ b/gators/feature_generation_str/feature_gen_str.pyx @@ -22,8 +22,8 @@ cpdef np.ndarray[object, ndim = 2] extract_str( for k in range(n_rows): for i in range(n_columns): value = X[k, idx_columns[i]] - if value is None or isinstance(value, float) or (i_max_vec[i] > len(value)): - X_new[k, i] = 'MISSING' + if value == None or isinstance(value, float) or (i_max_vec[i] > len(value)): + X_new[k, i] = '' continue X_new[k, i] = X[k, idx_columns[i]][i_min_vec[i]: i_max_vec[i]] return np.concatenate((X, X_new), axis=1) @@ -47,12 +47,12 @@ cpdef np.ndarray[object, ndim = 2] split_and_extract_str( for k in range(n_rows): for i in range(n_columns): value = X[k, idx_columns[i]] - if value is None or isinstance(value, float): - X_new[k, i] = 'MISSING' + if value == None or isinstance(value, float): + X_new[k, i] = "" continue value_split = value.split(str_split_vec[i]) if len(value_split) <= idx_split_vec[i]: - X_new[k, i] = 'MISSING' + X_new[k, i] = "" continue X_new[k, i] = value_split[idx_split_vec[i]] return np.concatenate((X, X_new), axis=1) @@ -61,7 +61,7 @@ cpdef np.ndarray[object, ndim = 2] split_and_extract_str( @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[object, ndim=2] string_length( +cpdef np.ndarray[object, ndim=2] length( np.ndarray[object, ndim=2] X, np.ndarray[np.int_t, ndim=1] idx_columns, ): @@ -74,7 +74,7 @@ cpdef np.ndarray[object, ndim=2] string_length( for j in range(n_cols): for i in range(n_rows): val = X[i, idx_columns[j]] - if val is None or val == 'nan': + if val == None or val == 'nan': X_new[i, j] = 0 continue X_new[i, j] = len(str(val)) @@ -106,17 +106,17 @@ cpdef np.ndarray[object, ndim=2] contains( @cython.wraparound(False) cpdef np.ndarray[object, ndim=2] upper_case( np.ndarray[object, ndim=2] X, - np.ndarray[np.int_t, ndim=1] idx_columns, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] for j in range(n_cols): for i in range(n_rows): - if X[i, idx_columns[j]] is None or X[i, idx_columns[j]] == 'nan': - continue - X[i, idx_columns[j]] = X[i, idx_columns[j]].upper() + if X[i, j] == None: + X[i, j] = None + else: + X[i, j] = X[i, j].upper() return X @@ -124,17 +124,17 @@ cpdef np.ndarray[object, ndim=2] upper_case( @cython.wraparound(False) cpdef np.ndarray[object, ndim=2] lower_case( np.ndarray[object, ndim=2] X, - np.ndarray[np.int_t, ndim=1] idx_columns, ): cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_cols = idx_columns.shape[0] + cdef int n_cols = X.shape[1] for j in range(n_cols): for i in range(n_rows): - if X[i, idx_columns[j]] is None or X[i, idx_columns[j]] == 'nan': - continue - X[i, idx_columns[j]] = X[i, idx_columns[j]].lower() + if X[i, j] == None: + X[i, j] = None + else: + X[i, j] = X[i, j].lower() return X @@ -158,4 +158,61 @@ cpdef np.ndarray[object, ndim=2] isin( if X[i, idx_columns[j]] == values_vec_np[j, k]: X_new[i, j] = 1. break + return np.concatenate((X, X_new), axis=1) + + + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim=2] endswith( + np.ndarray[object, ndim=2] X, + np.ndarray[np.int64_t, ndim=1] idx_columns, + np.ndarray[object, ndim=2] pattern_np, + +): + cdef int i + cdef int j + cdef int n_rows = X.shape[0] + cdef int n_cols = idx_columns.shape[0] + cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + cdef int n_chars + cdef int n + cdef object pat + cdef object val + for i in range(n_rows): + for j in range(n_cols): + for pat in range(pattern_np[j]): + n_chars = len(pat) + val = X[i, idx_columns[j]] + n = len(val) + if val[n - n_chars: n+1] == pat: + X_new[i, j] = 1. + break + return np.concatenate((X, X_new), axis=1) + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef np.ndarray[object, ndim=2] startswith( + np.ndarray[object, ndim=2] X, + np.ndarray[np.int64_t, ndim=1] idx_columns, + np.ndarray[object, ndim=2] pattern_np, + +): + cdef int i + cdef int j + cdef int n_rows = X.shape[0] + cdef int n_cols = idx_columns.shape[0] + cdef np.ndarray[np.float64_t, ndim=2] X_new = np.zeros((n_rows, n_cols)) + cdef int n, n_chars + cdef object pat + for i in range(n_rows): + for j in range(n_cols): + for pat in range(pattern_np[j]): + n = len(pat) + n_chars = len(pat) + if X[i, idx_columns[j]][:n_chars] == pat: + X_new[i, j] = 1. + break return np.concatenate((X, X_new), axis=1) \ No newline at end of file diff --git a/gators/feature_generation_str/length.py b/gators/feature_generation_str/length.py new file mode 100644 index 00000000..c17363c2 --- /dev/null +++ b/gators/feature_generation_str/length.py @@ -0,0 +1,113 @@ +# License: Apache-2.0 +from typing import List + +import numpy as np +import pandas as pd + +from feature_gen_str import length + +from ..util import util +from ._base_string_feature import _BaseStringFeature + +pd.options.mode.chained_assignment = None + + +from gators import DataFrame, Series + + +class Length(_BaseStringFeature): + """Create new columns based on the length of its elements. + + Parameters + ---------- + theta_vec : List[float] + List of columns. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation_str import Length + >>> obj = Length(columns=['A', 'B']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__length B__length + 0 qwe 1 3.0 1.0 + 1 as 22 2.0 2.0 + 2 333 0.0 3.0 + + >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['qwe', 1, 3.0, 1.0], + ['as', 22, 2.0, 2.0], + ['', 333, 0.0, 3.0]], dtype=object) + + """ + + def __init__(self, columns: List[str], column_names: List[str] = None): + if not column_names: + column_names = [f"{col}__length" for col in columns] + _BaseStringFeature.__init__(self, columns, column_names) + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + + for name, col in zip(self.column_names, self.columns): + X[name] = ( + util.get_function(X) + .replace(X[col].fillna("").astype(str), {"nan": ""}) + .str.len() + .astype(np.float64) + ) + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + return length(X, self.idx_columns) diff --git a/gators/feature_generation_str/lower_case.py b/gators/feature_generation_str/lower_case.py index a19c631b..f64376d3 100644 --- a/gators/feature_generation_str/lower_case.py +++ b/gators/feature_generation_str/lower_case.py @@ -1,135 +1,121 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen_str import lower_case from ..util import util - from ._base_string_feature import _BaseStringFeature +from gators import DataFrame, Series + class LowerCase(_BaseStringFeature): """Convert the selected columns to lower case. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation_str import LowerCase + >>> obj = LowerCase(columns=['A', 'B']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) - >>> obj.fit_transform(X) - A B - 0 abc abc - 1 ab ab - 2 None - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import LowerCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) >>> obj.fit_transform(X) A B 0 abc abc 1 ab ab 2 None - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import LowerCase >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['abc', 'abc'], ['ab', 'ab'], ['', None]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import LowerCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = LowerCase(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['abc', 'abc'], - ['ab', 'ab'], - ['', None]], dtype=object) - - """ - def __init__(self, columns: List[str]): - if not isinstance(columns, list): - raise TypeError("`columns` should be a list.") - if not columns: - raise ValueError("`columns` should not be empty.") + def __init__(self, columns: List[str] = None, inplace: bool = True): + if not isinstance(columns, (list, np.ndarray)) and columns is not None: + raise TypeError("`columns` should be a list or None.") + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") self.columns = columns + self.inplace = inplace - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "LowerCase": + def fit(self, X: DataFrame, y: Series = None) -> "LowerCase": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : pd.DataFrame Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- - LowerCase + UpperCase Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) + if not self.columns: + self.columns = util.get_datatype_columns(X, object) + + self.column_names = self.get_column_names(self.inplace, self.columns, "lower") self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=self.columns + columns=X.columns, + selected_columns=self.columns, ) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ - - def f(x): - if x.name in self.columns: - return x.astype(str).str.lower().replace({"none": None}) - return x - - return X.apply(f) + self.check_dataframe(X) + for col, name in zip(self.columns, self.column_names): + X[name] = X[col].astype(str).str.lower() + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -138,8 +124,13 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return lower_case(X, self.idx_columns) + if self.inplace: + X[:, self.idx_columns] = lower_case(X[:, self.idx_columns]) + return X + else: + X_upper = lower_case(X[:, self.idx_columns]) + return np.concatenate((X, X_upper), axis=1) diff --git a/gators/feature_generation_str/split_extract.py b/gators/feature_generation_str/split_extract.py index ff3bb69c..4dafa675 100644 --- a/gators/feature_generation_str/split_extract.py +++ b/gators/feature_generation_str/split_extract.py @@ -1,14 +1,16 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np import pandas as pd from feature_gen_str import split_and_extract_str +from ..util import util from ._base_string_feature import _BaseStringFeature +from gators import DataFrame, Series + class SplitExtract(_BaseStringFeature): """Create new columns based on split strings. @@ -20,7 +22,7 @@ class SplitExtract(_BaseStringFeature): Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. str_split_vec : List[int] @@ -34,59 +36,44 @@ class SplitExtract(_BaseStringFeature): Examples --------- + Imports and initialization: + + >>> from gators.feature_generation_str import SplitExtract + >>> obj = SplitExtract( + ... columns=['A', 'A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) + + The `fit`, `transform`, and `fit_transform` methods accept: - * fit & transform with `pandas` + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_generation_str import SplitExtract >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) - >>> obj.fit_transform(X) - A B A__split_by_*_idx_0 A__split_by_*_idx_1 - 0 qw*e 1 qw e - 1 a*qd 2 a qd - 2 zxq* 3 zxq - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import SplitExtract - >>> X = ks.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) >>> obj.fit_transform(X) A B A__split_by_*_idx_0 A__split_by_*_idx_1 0 qw*e 1 qw e 1 a*qd 2 a qd 2 zxq* 3 zxq - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import SplitExtract >>> X = pd.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qw*e', 1, 'qw', 'e'], - ['a*qd', 2, 'a', 'qd'], - ['zxq*', 3, 'zxq', '']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import SplitExtract - >>> X = ks.DataFrame({'A': ['qw*e', 'a*qd', 'zxq*'], 'B': [1, 2, 3]}) - >>> obj = SplitExtract( - ... columns=['A','A'], str_split_vec=['*', '*'], idx_split_vec=[0, 1]) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['qw*e', 1, 'qw', 'e'], ['a*qd', 2, 'a', 'qd'], ['zxq*', 3, 'zxq', '']], dtype=object) - """ def __init__( @@ -96,13 +83,14 @@ def __init__( idx_split_vec: List[int], column_names: List[str] = None, ): - if not isinstance(columns, list): + + if not isinstance(columns, (list, np.ndarray)): raise TypeError("`columns` should be a list.") - if not isinstance(str_split_vec, list): + if not isinstance(str_split_vec, (list, np.ndarray)): raise TypeError("`str_split_vec` should be a list.") if len(columns) != len(str_split_vec): raise ValueError("Length of `columns` and `str_split_vec` should match.") - if not isinstance(idx_split_vec, list): + if not isinstance(idx_split_vec, (list, np.ndarray)): raise TypeError("`idx_split_vec` should be a list.") if len(columns) != len(idx_split_vec): raise ValueError("Length of `columns` and `idx_split_vec` should match.") @@ -111,37 +99,35 @@ def __init__( f"{col}__split_by_{split}_idx_{idx}" for col, split, idx in zip(columns, str_split_vec, idx_split_vec) ] + self.str_split_vec = str_split_vec + self.idx_split_vec = idx_split_vec + self.str_split_vec_np = np.array(str_split_vec, object) + self.idx_split_vec_np = np.array(idx_split_vec, int) _BaseStringFeature.__init__(self, columns, column_names) - self.str_split_vec = np.array(str_split_vec, object) - self.idx_split_vec = np.array(idx_split_vec, int) - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) for col, idx, str_split, name in zip( self.columns, self.idx_split_vec, self.str_split_vec, self.column_names ): - n = idx if idx > 0 else 1 - X.loc[:, name] = ( - X[col].str.split(str_split, n=n, expand=True)[idx].fillna("MISSING") - ) + X[name] = X[col].str.split(str_split).str.get(idx).fillna("") + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -150,10 +136,10 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) return split_and_extract_str( - X, self.idx_columns, self.str_split_vec, self.idx_split_vec + X, self.idx_columns, self.str_split_vec_np, self.idx_split_vec_np ) diff --git a/gators/feature_generation_str/startswith.py b/gators/feature_generation_str/startswith.py new file mode 100644 index 00000000..eb5c78fc --- /dev/null +++ b/gators/feature_generation_str/startswith.py @@ -0,0 +1,123 @@ +# License: Apache-2.0 +from typing import List + +import numpy as np + +from feature_gen_str import startswith + +from ._base_string_feature import _BaseStringFeature + +from gators import DataFrame, Series + + +class Startswith(_BaseStringFeature): + """Create new binary columns. + + The value is 1 if the element startswith the given substring and 0 otherwise. + + Parameters + ---------- + columns : List[float] + List of columns. + pattern_vec : List[int] + List of pattern_vec. + column_names : List[int], default None. + List new column names. + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_generation_str import Startswith + >>> obj = Startswith(columns=['A', 'A'], pattern_vec=['qw', 'we']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B A__contains_qw A__contains_we + 0 qwe 1 1.0 1.0 + 1 qwd 2 1.0 0.0 + 2 zwe 3 0.0 1.0 + + >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([['qwe', 1, 1.0, 1.0], + ['qwd', 2, 1.0, 0.0], + ['zwe', 3, 0.0, 1.0]], dtype=object) + """ + + def __init__( + self, + columns: List[str], + pattern_vec: List[str], + column_names: List[str] = None, + ): + if not isinstance(columns, (list, np.ndarray)): + raise TypeError("`columns` should be a list.") + if not isinstance(pattern_vec, (list, np.ndarray)): + raise TypeError("`pattern_vec` should be a list.") + if len(columns) != len(pattern_vec): + raise ValueError("Length of `columns` and `pattern_vec` should match.") + if not column_names: + column_names = [ + f"{col}__startswith_{val}" for col, val in zip(columns, pattern_vec) + ] + _BaseStringFeature.__init__(self, columns, column_names) + self.pattern_vec = pattern_vec + self.pattern_vec_np = np.array(self.pattern_vec).astype(object) + + def transform(self, X: DataFrame) -> DataFrame: + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + + self.check_dataframe(X) + for col, val, name in zip(self.columns, self.pattern_vec, self.column_names): + X[name] = X[col].str.startswith(val).astype(np.float64) + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X : np.ndarray + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + return startswith(X, self.idx_columns, self.pattern_vec_np) diff --git a/gators/feature_generation_str/string_contains.py b/gators/feature_generation_str/string_contains.py deleted file mode 100644 index 5fc407b3..00000000 --- a/gators/feature_generation_str/string_contains.py +++ /dev/null @@ -1,132 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from feature_gen_str import contains - -from ._base_string_feature import _BaseStringFeature - - -class StringContains(_BaseStringFeature): - """Create new binary columns. - - The value is 1 if the element contains the given substring and 0 otherwise. - - Parameters - ---------- - columns : List[str] - List of columns. - contains_vec : List[int] - List of substrings. - column_names : List[int], default to None. - List new column names. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringContains - >>> X = pd.DataFrame({'A': ['qwe', 'qwd', 'zwe'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> obj.fit_transform(X) - A B A__contains_qw A__contains_we - 0 qwe 1 1.0 1.0 - 1 qwd 2 1.0 0.0 - 2 zwe 3 0.0 1.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> obj.fit_transform(X) - A B A__contains_qw A__contains_we - 0 qwe 1 1.0 1.0 - 1 asd 2 0.0 0.0 - 2 zxc 3 0.0 0.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 1.0, 1.0], - ['asd', 2, 0.0, 0.0], - ['zxc', 3, 0.0, 0.0]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'asd', 'zxc'], 'B': [1, 2, 3]}) - >>> obj = StringContains(columns=['A', 'A'], contains_vec=['qw', 'we']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 1.0, 1.0], - ['asd', 2, 0.0, 0.0], - ['zxc', 3, 0.0, 0.0]], dtype=object) - - """ - - def __init__( - self, - columns: List[str], - contains_vec: List[str], - column_names: List[str] = None, - ): - if not isinstance(columns, list): - raise TypeError("`columns` should be a list.") - if not isinstance(contains_vec, list): - raise TypeError("`contains_vec` should be a list.") - if len(columns) != len(contains_vec): - raise ValueError("Length of `columns` and `contains_vec` should match.") - if not column_names: - column_names = [ - f"{col}__contains_{val}" for col, val in zip(columns, contains_vec) - ] - _BaseStringFeature.__init__(self, columns, column_names) - self.contains_vec = np.array(contains_vec, str).astype(object) - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for col, val, name in zip(self.columns, self.contains_vec, self.column_names): - X.loc[:, name] = X[col].str.contains(val, regex=False).astype(np.float64) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return contains(X, self.idx_columns, self.contains_vec) diff --git a/gators/feature_generation_str/string_length.py b/gators/feature_generation_str/string_length.py deleted file mode 100644 index 8ee4278b..00000000 --- a/gators/feature_generation_str/string_length.py +++ /dev/null @@ -1,150 +0,0 @@ -# License: Apache-2.0 -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd - -from feature_gen_str import string_length - -from ..util import util - -from ._base_string_feature import _BaseStringFeature - -pd.options.mode.chained_assignment = None - - -class StringLength(_BaseStringFeature): - """Create new columns based on the length of its elements. - - Parameters - ---------- - columns : List[str] - List of columns. - - Examples - --------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringLength - >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> obj.fit_transform(X) - A B A__length B__length - 0 qwe 1 3.0 1.0 - 1 as 22 2.0 2.0 - 2 333 0.0 3.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> obj.fit_transform(X) - A B A__length B__length - 0 qwe 1 3.0 1.0 - 1 as 22 2.0 2.0 - 2 333 0.0 3.0 - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import StringLength - >>> X = pd.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 3.0, 1.0], - ['as', 22, 2.0, 2.0], - ['', 333, 0.0, 3.0]], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import StringLength - >>> X = ks.DataFrame({'A': ['qwe', 'as', ''], 'B': [1, 22, 333]}) - >>> obj = StringLength(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['qwe', 1, 3.0, 1.0], - ['as', 22, 2.0, 2.0], - ['', 333, 0.0, 3.0]], dtype=object) - - - """ - - def __init__(self, columns: List[str], column_names: List[str] = None): - if not column_names: - column_names = [f"{col}__length" for col in columns] - _BaseStringFeature.__init__(self, columns, column_names) - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "StringLength": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - StringLength - Instance of itself. - """ - self.check_dataframe(X) - self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=self.columns - ) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for col, name in zip(self.columns, self.column_names): - X.loc[:, name] = ( - X.loc[:, col] - .fillna("") - .astype(str) - .replace({"nan": ""}) - .str.len() - .astype(np.float64) - ) - pass - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Transformed array. - """ - self.check_array(X) - return string_length(X, self.idx_columns) diff --git a/gators/feature_generation_str/tests/test_extract.py b/gators/feature_generation_str/tests/test_extract.py deleted file mode 100644 index 346f045d..00000000 --- a/gators/feature_generation_str/tests/test_extract.py +++ /dev/null @@ -1,109 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_str import Extract - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1Q", "1QQ"] - X["s"] = ["0", "W2", "W2W"] - X["d"] = ["0", "Q", ""] - obj = Extract(columns=list("asd"), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__substring_0_to_1", - "s__substring_1_to_2", - "d__substring_2_to_3", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", "0", "MISSING", "MISSING"], - [0.0, 0.0, 0.0, "1Q", "W2", "Q", "1", "2", "MISSING"], - [0.0, 0.0, 0.0, "1QQ", "W2W", "", "1", "2", "MISSING"], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1Q", "1QQ"] - X["s"] = ["0", "W2", "W2W"] - X["d"] = ["0", "Q", ""] - obj = Extract(columns=list("asd"), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__substring_0_to_1", - "s__substring_1_to_2", - "d__substring_2_to_3", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", "0", "MISSING", "MISSING"], - [0.0, 0.0, 0.0, "1Q", "W2", "Q", "1", "2", "MISSING"], - [0.0, 0.0, 0.0, "1QQ", "W2W", "", "1", "2", "MISSING"], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_drop_low_cardinality_init(data): - with pytest.raises(TypeError): - _ = Extract(columns="x", i_min_vec=[0, 1], i_max_vec=[1, 2]) - with pytest.raises(TypeError): - _ = Extract(columns=["a", "s"], i_min_vec=0, i_max_vec=[1, 2]) - with pytest.raises(TypeError): - _ = Extract(columns=["a", "s"], i_min_vec=[0, 1], i_max_vec=0) - with pytest.raises(ValueError): - _ = Extract(columns=["a", "s"], i_min_vec=[0], i_max_vec=[1, 2]) - with pytest.raises(ValueError): - _ = Extract(columns=["a", "s"], i_min_vec=[0, 1], i_max_vec=[1]) diff --git a/gators/feature_generation_str/tests/test_extract_dd.py b/gators/feature_generation_str/tests/test_extract_dd.py new file mode 100644 index 00000000..683fa392 --- /dev/null +++ b/gators/feature_generation_str/tests/test_extract_dd.py @@ -0,0 +1,67 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Extract + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ), + npartitions=1, + ) + obj = Extract(columns=list("DEF"), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__substring_0_to_1", + "E__substring_1_to_2", + "F__substring_2_to_3", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", "0", "", ""], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", "1", "2", ""], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", "1", "2", ""], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + cols = [ + "D", + "E", + "F", + "D__substring_0_to_1", + "E__substring_1_to_2", + "F__substring_2_to_3", + ] + X_new[cols] = X_new[cols].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_extract_ks.py b/gators/feature_generation_str/tests/test_extract_ks.py new file mode 100644 index 00000000..5854e09d --- /dev/null +++ b/gators/feature_generation_str/tests/test_extract_ks.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Extract + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ) + obj = Extract(columns=list("DEF"), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__substring_0_to_1", + "E__substring_1_to_2", + "F__substring_2_to_3", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", "0", "", ""], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", "1", "2", ""], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", "1", "2", ""], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_extract_pd.py b/gators/feature_generation_str/tests/test_extract_pd.py new file mode 100644 index 00000000..411124ea --- /dev/null +++ b/gators/feature_generation_str/tests/test_extract_pd.py @@ -0,0 +1,67 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Extract + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ) + obj = Extract(columns=list("DEF"), i_min_vec=[0, 1, 2], i_max_vec=[1, 2, 3]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__substring_0_to_1", + "E__substring_1_to_2", + "F__substring_2_to_3", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", "0", "", ""], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", "1", "2", ""], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", "1", "2", ""], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_drop_low_cardinality_init(data): + with pytest.raises(TypeError): + _ = Extract(columns="x", i_min_vec=[0, 1], i_max_vec=[1, 2]) + with pytest.raises(TypeError): + _ = Extract(columns=["a", "s"], i_min_vec=0, i_max_vec=[1, 2]) + with pytest.raises(TypeError): + _ = Extract(columns=["a", "s"], i_min_vec=[0, 1], i_max_vec=0) + with pytest.raises(ValueError): + _ = Extract(columns=["a", "s"], i_min_vec=[0], i_max_vec=[1, 2]) + with pytest.raises(ValueError): + _ = Extract(columns=["a", "s"], i_min_vec=[0, 1], i_max_vec=[1]) diff --git a/gators/feature_generation_str/tests/test_lower_case.py b/gators/feature_generation_str/tests/test_lower_case.py deleted file mode 100644 index 63014bbd..00000000 --- a/gators/feature_generation_str/tests/test_lower_case.py +++ /dev/null @@ -1,113 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_str import LowerCase - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["q", "qq", "QQq"] - X["s"] = ["w", "WW", "WWw"] - X["d"] = ["nan", None, ""] - - obj = LowerCase(columns=list("asd")).fit(X) - columns_expected = ["q", "w", "e", "a", "s", "d"] - X_expected = pd.DataFrame( - [ - [ - 0.0, - 0.0, - 0.0, - "q", - "w", - "nan", - ], - [ - 0.0, - 0.0, - 0.0, - "qq", - "ww", - None, - ], - [0.0, 0.0, 0.0, "qqq", "www", ""], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["q", "qq", "QQq"] - X["s"] = ["w", "WW", "WWw"] - X["d"] = ["nan", None, ""] - - obj = LowerCase(columns=list("asd")).fit(X) - columns_expected = ["q", "w", "e", "a", "s", "d"] - X_expected = pd.DataFrame( - [ - [ - 0.0, - 0.0, - 0.0, - "q", - "w", - "nan", - ], - [ - 0.0, - 0.0, - 0.0, - "qq", - "ww", - None, - ], - [0.0, 0.0, 0.0, "qqq", "www", ""], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = LowerCase(columns="x") - with pytest.raises(ValueError): - _ = LowerCase(columns=[]) diff --git a/gators/feature_generation_str/tests/test_lower_case_dd.py b/gators/feature_generation_str/tests/test_lower_case_dd.py new file mode 100644 index 00000000..6624912c --- /dev/null +++ b/gators/feature_generation_str/tests/test_lower_case_dd.py @@ -0,0 +1,52 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import LowerCase + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["", "", ""], + } + ), + npartitions=1, + ) + + obj = LowerCase(columns=list("DEF")).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "qqq"], + "E": ["w", "ww", "www"], + "F": ["", "", ""], + } + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["D", "E", "F"]] = X_new[["D", "E", "F"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_lower_case_ks.py b/gators/feature_generation_str/tests/test_lower_case_ks.py new file mode 100644 index 00000000..8ec4f430 --- /dev/null +++ b/gators/feature_generation_str/tests/test_lower_case_ks.py @@ -0,0 +1,52 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import LowerCase + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["nan", "", ""], + } + ) + + obj = LowerCase(columns=list("DEF")).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "qqq"], + "E": ["w", "ww", "www"], + "F": ["nan", "", ""], + } + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_lower_case_pd.py b/gators/feature_generation_str/tests/test_lower_case_pd.py new file mode 100644 index 00000000..142cc310 --- /dev/null +++ b/gators/feature_generation_str/tests/test_lower_case_pd.py @@ -0,0 +1,140 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import LowerCase + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["nan", "", ""], + } + ) + + obj = LowerCase(columns=list("DEF"), inplace=False).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["nan", "", ""], + "D__lower": ["q", "qq", "qqq"], + "E__lower": ["w", "ww", "www"], + "F__lower": ["nan", "", ""], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_no_columns(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["nan", "", ""], + } + ) + + obj = LowerCase(inplace=False).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["nan", "", ""], + "D__lower": ["q", "qq", "qqq"], + "E__lower": ["w", "ww", "www"], + "F__lower": ["nan", "", ""], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["nan", "", ""], + } + ) + + obj = LowerCase(columns=list("DEF"), inplace=True).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "qqq"], + "E": ["w", "ww", "www"], + "F": ["nan", "", ""], + } + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_columns_pd(data_no_columns): + obj, X, X_expected = data_no_columns + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_no_columns_pd_np(data_no_columns): + obj, X, X_expected = data_no_columns + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_pd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_pd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = LowerCase(columns="x") + with pytest.raises(TypeError): + _ = LowerCase(columns=["x"], inplace="x") diff --git a/gators/feature_generation_str/tests/test_split_extract.py b/gators/feature_generation_str/tests/test_split_extract.py deleted file mode 100644 index 52253d58..00000000 --- a/gators/feature_generation_str/tests/test_split_extract.py +++ /dev/null @@ -1,113 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_str import SplitExtract - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1*Q", "1Q*QQ"] - X["s"] = ["0", "W*2", "W2*WW"] - X["d"] = ["0", "Q*", "qwert*"] - - obj = SplitExtract(list("asd"), list("***"), [1, 1, 0]).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__split_by_*_idx_1", - "s__split_by_*_idx_1", - "d__split_by_*_idx_0", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", "MISSING", "MISSING", "0"], - [0.0, 0.0, 0.0, "1*Q", "W*2", "Q*", "Q", "2", "Q"], - [0.0, 0.0, 0.0, "1Q*QQ", "W2*WW", "qwert*", "QQ", "WW", "qwert"], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1*Q", "1Q*QQ"] - X["s"] = ["0", "W*2", "W2*WW"] - X["d"] = ["0", "Q*", "qwert*"] - - obj = SplitExtract(list("asd"), list("***"), [1, 1, 0]).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__split_by_*_idx_1", - "s__split_by_*_idx_1", - "d__split_by_*_idx_0", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", "MISSING", "MISSING", "0"], - [0.0, 0.0, 0.0, "1*Q", "W*2", "Q*", "Q", "2", "Q"], - [0.0, 0.0, 0.0, "1Q*QQ", "W2*WW", "qwert*", "QQ", "WW", "qwert"], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = SplitExtract(columns="x", str_split_vec=["+", "-"], idx_split_vec=[1, 2]) - with pytest.raises(TypeError): - _ = SplitExtract(columns=["a", "s"], str_split_vec="+", idx_split_vec=[1, 2]) - with pytest.raises(TypeError): - _ = SplitExtract(columns=["a", "s"], str_split_vec=["+", "-"], idx_split_vec=0) - with pytest.raises(ValueError): - _ = SplitExtract(columns=["a", "s"], str_split_vec=["+"], idx_split_vec=[1, 2]) - with pytest.raises(ValueError): - _ = SplitExtract( - columns=["a", "s"], str_split_vec=["+", "-"], idx_split_vec=[1] - ) diff --git a/gators/feature_generation_str/tests/test_split_extract_dd.py b/gators/feature_generation_str/tests/test_split_extract_dd.py new file mode 100644 index 00000000..67184451 --- /dev/null +++ b/gators/feature_generation_str/tests/test_split_extract_dd.py @@ -0,0 +1,67 @@ +# # License: Apache-2.0 +# import dask.dataframe as dd +# import pandas as pd +# import pytest +# from pandas.testing import assert_frame_equal + +# from gators.feature_generation_str import SplitExtract + + +# @pytest.fixture +# def data(): +# X = dd.from_pandas( +# pd.DataFrame( +# { +# "A": [0.0, 0.0, 0.0], +# "B": [0.0, 0.0, 0.0], +# "C": [0.0, 0.0, 0.0], +# "D": ["0", "1*Q", "1Q*QQ"], +# "E": ["0", "W*2", "W2*WW"], +# "F": ["0", "Q*", "qwert*"], +# } +# ), +# npartitions=1, +# ) +# obj = SplitExtract(list("DEF"), list("***"), [1, 1, 0]).fit(X) +# columns_expected = [ +# "A", +# "B", +# "C", +# "D", +# "E", +# "F", +# "D__split_by_*_idx_1", +# "E__split_by_*_idx_1", +# "F__split_by_*_idx_0", +# ] +# X_expected = pd.DataFrame( +# [ +# [0.0, 0.0, 0.0, "0", "0", "0", "", "", "0"], +# [0.0, 0.0, 0.0, "1*Q", "W*2", "Q*", "Q", "2", "Q"], +# [0.0, 0.0, 0.0, "1Q*QQ", "W2*WW", "qwert*", "QQ", "WW", "qwert"], +# ], +# columns=columns_expected, +# ) +# return obj, X, X_expected + + +# def test_dd(data): +# obj, X, X_expected = data +# X_new = obj.transform(X).compute() +# cols = [ +# "D", +# "E", +# "F", +# "D__split_by_*_idx_1", +# "E__split_by_*_idx_1", +# "F__split_by_*_idx_0", +# ] +# X_new[cols] = X_new[cols].astype(object) +# assert_frame_equal(X_new, X_expected) + + +# def test_dd_np(data): +# obj, X, X_expected = data +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) +# assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_split_extract_ks.py b/gators/feature_generation_str/tests/test_split_extract_ks.py new file mode 100644 index 00000000..4928a98b --- /dev/null +++ b/gators/feature_generation_str/tests/test_split_extract_ks.py @@ -0,0 +1,60 @@ +# # License: Apache-2.0 +# import pyspark.pandas as ps +# import numpy as np +# import pandas as pd +# import pytest +# from pandas.testing import assert_frame_equal + +# from gators.feature_generation_str import SplitExtract + +# ps.set_option("compute.default_index_type", "distributed-sequence") + + +# @pytest.fixture +# def data_ks(): +# X = ps.DataFrame( +# { +# "A": [0.0, 0.0, 0.0], +# "B": [0.0, 0.0, 0.0], +# "C": [0.0, 0.0, 0.0], +# "D": ["0", "1*Q", "1Q*QQ"], +# "E": ["0", "W*2", "W2*WW"], +# "F": ["0", "Q*", "qwert*"], +# } +# ) +# obj = SplitExtract(list("DEF"), list("***"), [1, 1, 0]).fit(X) +# columns_expected = [ +# "A", +# "B", +# "C", +# "D", +# "E", +# "F", +# "D__split_by_*_idx_1", +# "E__split_by_*_idx_1", +# "F__split_by_*_idx_0", +# ] +# X_expected = pd.DataFrame( +# [ +# [0.0, 0.0, 0.0, "0", "0", "0", "", "", "0"], +# [0.0, 0.0, 0.0, "1*Q", "W*2", "Q*", "Q", "2", "Q"], +# [0.0, 0.0, 0.0, "1Q*QQ", "W2*WW", "qwert*", "QQ", "WW", "qwert"], +# ], +# columns=columns_expected, +# ) +# return obj, X, X_expected + + +# @pytest.mark.pyspark +# def test_ks(data_ks): +# obj, X, X_expected = data_ks +# X_new = obj.transform(X) +# assert_frame_equal(X_new.to_pandas(), X_expected) + + +# @pytest.mark.pyspark +# def test_ks_np(data_ks): +# obj, X, X_expected = data_ks +# X_numpy_new = obj.transform_numpy(X.to_numpy()) +# X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) +# assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_split_extract_pd.py b/gators/feature_generation_str/tests/test_split_extract_pd.py new file mode 100644 index 00000000..c2720f40 --- /dev/null +++ b/gators/feature_generation_str/tests/test_split_extract_pd.py @@ -0,0 +1,70 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import SplitExtract + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1*Q", "1Q*QQ"], + "E": ["0", "W*2", "W2*WW"], + "F": ["0", "Q*", "qwert*"], + } + ) + obj = SplitExtract(list("DEF"), list("***"), [1, 1, 0]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__split_by_*_idx_1", + "E__split_by_*_idx_1", + "F__split_by_*_idx_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", "", "", "0"], + [0.0, 0.0, 0.0, "1*Q", "W*2", "Q*", "Q", "2", "Q"], + [0.0, 0.0, 0.0, "1Q*QQ", "W2*WW", "qwert*", "QQ", "WW", "qwert"], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = SplitExtract(columns="x", str_split_vec=["+", "-"], idx_split_vec=[1, 2]) + with pytest.raises(TypeError): + _ = SplitExtract(columns=["a", "s"], str_split_vec="+", idx_split_vec=[1, 2]) + with pytest.raises(TypeError): + _ = SplitExtract(columns=["a", "s"], str_split_vec=["+", "-"], idx_split_vec=0) + with pytest.raises(ValueError): + _ = SplitExtract(columns=["a", "s"], str_split_vec=["+"], idx_split_vec=[1, 2]) + with pytest.raises(ValueError): + _ = SplitExtract( + columns=["a", "s"], str_split_vec=["+", "-"], idx_split_vec=[1] + ) diff --git a/gators/feature_generation_str/tests/test_string_contains.py b/gators/feature_generation_str/tests/test_string_contains.py deleted file mode 100644 index df06f035..00000000 --- a/gators/feature_generation_str/tests/test_string_contains.py +++ /dev/null @@ -1,217 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_str import StringContains - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1Q", "1QQ"] - X["s"] = ["0", "W2", "W2W"] - X["d"] = ["0", "Q", ""] - - obj = StringContains(columns=list("asd"), contains_vec=["1", "2", "0"]).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__contains_1", - "s__contains_2", - "d__contains_0", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1Q", "1QQ"] - X["s"] = ["0", "W2", "W2W"] - X["d"] = ["0", "Q", ""] - - obj = StringContains(columns=list("asd"), contains_vec=["1", "2", "0"]).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__contains_1", - "s__contains_2", - "d__contains_0", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_with_names(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1Q", "1QQ"] - X["s"] = ["0", "W2", "W2W"] - X["d"] = ["0", "Q", ""] - - obj = StringContains( - columns=list("asd"), - contains_vec=["1", "2", "0"], - column_names=["a_with_1", "s_with_2", "d_with_0"], - ).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a_with_1", - "s_with_2", - "d_with_0", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_with_names_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["0", "1Q", "1QQ"] - X["s"] = ["0", "W2", "W2W"] - X["d"] = ["0", "Q", ""] - - obj = StringContains( - columns=list("asd"), - contains_vec=["1", "2", "0"], - column_names=["a_with_1", "s_with_2", "d_with_0"], - ).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a_with_1", - "s_with_2", - "d_with_0", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], - [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_names_pd(data_with_names): - obj, X, X_expected = data_with_names - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_names_ks(data_with_names_ks): - obj, X, X_expected = data_with_names_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_names_pd_np(data_with_names): - obj, X, X_expected = data_with_names - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_names_ks_np(data_with_names_ks): - obj, X, X_expected = data_with_names_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = StringContains( - columns="x", contains_vec=["z", "x"], column_names=["aa", "ss"] - ) - with pytest.raises(TypeError): - _ = StringContains( - columns=["a", "s"], contains_vec="x", column_names=["aa", "ss"] - ) - with pytest.raises(TypeError): - _ = StringContains( - columns=["a", "s"], contains_vec=["z", "x"], column_names="x" - ) - with pytest.raises(ValueError): - _ = StringContains( - columns=["a", "s"], contains_vec=["z"], column_names=["aa", "ss"] - ) - with pytest.raises(ValueError): - _ = StringContains( - columns=["a", "s"], contains_vec=["z", "x"], column_names=["aa"] - ) diff --git a/gators/feature_generation_str/tests/test_string_contains_dd.py b/gators/feature_generation_str/tests/test_string_contains_dd.py new file mode 100644 index 00000000..086fe5c5 --- /dev/null +++ b/gators/feature_generation_str/tests/test_string_contains_dd.py @@ -0,0 +1,115 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Contains + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ), + npartitions=1, + ) + obj = Contains(columns=list("DEF"), contains_vec=["1", "2", "0"]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__contains_1", + "E__contains_2", + "F__contains_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +@pytest.fixture +def data_with_names(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ), + npartitions=1, + ) + obj = Contains( + columns=list("DEF"), + contains_vec=["1", "2", "0"], + column_names=["D_with_1", "E_with_2", "F_with_0"], + ).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D_with_1", + "E_with_2", + "F_with_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["D", "E", "F"]] = X_new[["D", "E", "F"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_names_dd(data_with_names): + obj, X, X_expected = data_with_names + X_new = obj.transform(X).compute() + X_new[["D", "E", "F"]] = X_new[["D", "E", "F"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_names_dd_np(data_with_names): + obj, X, X_expected = data_with_names + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_string_contains_ks.py b/gators/feature_generation_str/tests/test_string_contains_ks.py new file mode 100644 index 00000000..d5aa4248 --- /dev/null +++ b/gators/feature_generation_str/tests/test_string_contains_ks.py @@ -0,0 +1,113 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Contains + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ) + obj = Contains(columns=list("DEF"), contains_vec=["1", "2", "0"]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__contains_1", + "E__contains_2", + "F__contains_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +@pytest.fixture +def data_with_names_ks(): + X = ps.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ) + obj = Contains( + columns=list("DEF"), + contains_vec=["1", "2", "0"], + column_names=["D_with_1", "E_with_2", "F_with_0"], + ).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D_with_1", + "E_with_2", + "F_with_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +@pytest.mark.pyspark +def test_names_ks(data_with_names_ks): + obj, X, X_expected = data_with_names_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_names_ks_np(data_with_names_ks): + obj, X, X_expected = data_with_names_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_string_contains_pd.py b/gators/feature_generation_str/tests/test_string_contains_pd.py new file mode 100644 index 00000000..1b351e97 --- /dev/null +++ b/gators/feature_generation_str/tests/test_string_contains_pd.py @@ -0,0 +1,120 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Contains + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ) + obj = Contains(columns=list("DEF"), contains_vec=["1", "2", "0"]).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__contains_1", + "E__contains_2", + "F__contains_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +@pytest.fixture +def data_with_names(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["0", "1Q", "1QQ"], + "E": ["0", "W2", "W2W"], + "F": ["0", "Q", ""], + } + ) + + obj = Contains( + columns=list("DEF"), + contains_vec=["1", "2", "0"], + column_names=["D_with_1", "E_with_2", "F_with_0"], + ).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D_with_1", + "E_with_2", + "F_with_0", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "0", "0", "0", 0.0, 0.0, 1.0], + [0.0, 0.0, 0.0, "1Q", "W2", "Q", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "1QQ", "W2W", "", 1.0, 1.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_names_pd(data_with_names): + obj, X, X_expected = data_with_names + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_names_pd_np(data_with_names): + obj, X, X_expected = data_with_names + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = Contains(columns="x", contains_vec=["z", "x"], column_names=["aa", "ss"]) + with pytest.raises(TypeError): + _ = Contains(columns=["a", "s"], contains_vec="x", column_names=["aa", "ss"]) + with pytest.raises(TypeError): + _ = Contains(columns=["a", "s"], contains_vec=["z", "x"], column_names="x") + with pytest.raises(ValueError): + _ = Contains(columns=["a", "s"], contains_vec=["z"], column_names=["aa", "ss"]) + with pytest.raises(ValueError): + _ = Contains(columns=["a", "s"], contains_vec=["z", "x"], column_names=["aa"]) diff --git a/gators/feature_generation_str/tests/test_string_length.py b/gators/feature_generation_str/tests/test_string_length.py deleted file mode 100644 index 68f9017c..00000000 --- a/gators/feature_generation_str/tests/test_string_length.py +++ /dev/null @@ -1,105 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_str import StringLength - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["Q", "QQ", "QQQ"] - X["s"] = ["W", "WW", "WWW"] - X["d"] = ["nan", None, ""] - - obj = StringLength(columns=list("asd")).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__length", - "s__length", - "d__length", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "Q", "W", "nan", 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, "QQ", "WW", None, 2.0, 2.0, 0.0], - [0.0, 0.0, 0.0, "QQQ", "WWW", "", 3.0, 3.0, 0.0], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["Q", "QQ", "QQQ"] - X["s"] = ["W", "WW", "WWW"] - X["d"] = ["nan", None, ""] - - obj = StringLength(columns=list("asd")).fit(X) - columns_expected = [ - "q", - "w", - "e", - "a", - "s", - "d", - "a__length", - "s__length", - "d__length", - ] - X_expected = pd.DataFrame( - [ - [0.0, 0.0, 0.0, "Q", "W", "nan", 1.0, 1.0, 0.0], - [0.0, 0.0, 0.0, "QQ", "WW", None, 2.0, 2.0, 0.0], - [0.0, 0.0, 0.0, "QQQ", "WWW", "", 3.0, 3.0, 0.0], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = StringLength(columns="x") - with pytest.raises(ValueError): - _ = StringLength(columns=[]) diff --git a/gators/feature_generation_str/tests/test_string_length_dd.py b/gators/feature_generation_str/tests/test_string_length_dd.py new file mode 100644 index 00000000..dab4eae5 --- /dev/null +++ b/gators/feature_generation_str/tests/test_string_length_dd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Length + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["Q", "QQ", "QQQ"], + "E": ["W", "WW", "WWW"], + "F": ["nan", "", ""], + } + ), + npartitions=1, + ) + obj = Length(columns=list("DEF")).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__length", + "E__length", + "F__length", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "Q", "W", "nan", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "QQ", "WW", "", 2.0, 2.0, 0.0], + [0.0, 0.0, 0.0, "QQQ", "WWW", "", 3.0, 3.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["D", "E", "F"]] = X_new[["D", "E", "F"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_string_length_ks.py b/gators/feature_generation_str/tests/test_string_length_ks.py new file mode 100644 index 00000000..a8e05678 --- /dev/null +++ b/gators/feature_generation_str/tests/test_string_length_ks.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Length + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["Q", "QQ", "QQQ"], + "E": ["W", "WW", "WWW"], + "F": ["nan", "", ""], + } + ) + obj = Length(columns=list("DEF")).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__length", + "E__length", + "F__length", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "Q", "W", "nan", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "QQ", "WW", "", 2.0, 2.0, 0.0], + [0.0, 0.0, 0.0, "QQQ", "WWW", "", 3.0, 3.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_string_length_pd.py b/gators/feature_generation_str/tests/test_string_length_pd.py new file mode 100644 index 00000000..0ab366ac --- /dev/null +++ b/gators/feature_generation_str/tests/test_string_length_pd.py @@ -0,0 +1,59 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import Length + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["Q", "QQ", "QQQ"], + "E": ["W", "WW", "WWW"], + "F": ["nan", "", ""], + } + ) + obj = Length(columns=list("DEF")).fit(X) + columns_expected = [ + "A", + "B", + "C", + "D", + "E", + "F", + "D__length", + "E__length", + "F__length", + ] + X_expected = pd.DataFrame( + [ + [0.0, 0.0, 0.0, "Q", "W", "nan", 1.0, 1.0, 0.0], + [0.0, 0.0, 0.0, "QQ", "WW", "", 2.0, 2.0, 0.0], + [0.0, 0.0, 0.0, "QQQ", "WWW", "", 3.0, 3.0, 0.0], + ], + columns=columns_expected, + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = Length(columns="x") diff --git a/gators/feature_generation_str/tests/test_upper_case.py b/gators/feature_generation_str/tests/test_upper_case.py deleted file mode 100644 index 100b6e43..00000000 --- a/gators/feature_generation_str/tests/test_upper_case.py +++ /dev/null @@ -1,113 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_generation_str import UpperCase - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["q", "qq", "QQq"] - X["s"] = ["w", "WW", "WWw"] - X["d"] = ["nan", None, ""] - - obj = UpperCase(columns=list("asd")).fit(X) - columns_expected = ["q", "w", "e", "a", "s", "d"] - X_expected = pd.DataFrame( - [ - [ - 0.0, - 0.0, - 0.0, - "Q", - "W", - "nan", - ], - [ - 0.0, - 0.0, - 0.0, - "QQ", - "WW", - None, - ], - [0.0, 0.0, 0.0, "QQQ", "WWW", ""], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.zeros((3, 3)), columns=list("qwe")) - X["a"] = ["q", "qq", "QQq"] - X["s"] = ["w", "WW", "WWw"] - X["d"] = ["nan", None, ""] - - obj = UpperCase(columns=list("asd")).fit(X) - columns_expected = ["q", "w", "e", "a", "s", "d"] - X_expected = pd.DataFrame( - [ - [ - 0.0, - 0.0, - 0.0, - "Q", - "W", - "nan", - ], - [ - 0.0, - 0.0, - 0.0, - "QQ", - "WW", - None, - ], - [0.0, 0.0, 0.0, "QQQ", "WWW", ""], - ], - columns=columns_expected, - ) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = UpperCase(columns="x") - with pytest.raises(ValueError): - _ = UpperCase(columns=[]) diff --git a/gators/feature_generation_str/tests/test_upper_case_dd.py b/gators/feature_generation_str/tests/test_upper_case_dd.py new file mode 100644 index 00000000..67e781fd --- /dev/null +++ b/gators/feature_generation_str/tests/test_upper_case_dd.py @@ -0,0 +1,52 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import UpperCase + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + } + ), + npartitions=1, + ) + + obj = UpperCase(columns=list("DEF")).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["Q", "QQ", "QQQ"], + "E": ["W", "WW", "WWW"], + "F": ["ABC", "", ""], + } + ) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + X_new[["D", "E", "F"]] = X_new[["D", "E", "F"]].astype(object) + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_upper_case_ks.py b/gators/feature_generation_str/tests/test_upper_case_ks.py new file mode 100644 index 00000000..e1966a8a --- /dev/null +++ b/gators/feature_generation_str/tests/test_upper_case_ks.py @@ -0,0 +1,52 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import UpperCase + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + } + ) + + obj = UpperCase(columns=list("DEF")).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["Q", "QQ", "QQQ"], + "E": ["W", "WW", "WWW"], + "F": ["ABC", "", ""], + } + ) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_generation_str/tests/test_upper_case_pd.py b/gators/feature_generation_str/tests/test_upper_case_pd.py new file mode 100644 index 00000000..794e9425 --- /dev/null +++ b/gators/feature_generation_str/tests/test_upper_case_pd.py @@ -0,0 +1,139 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_generation_str import UpperCase + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + } + ) + + obj = UpperCase(columns=list("DEF"), inplace=False).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + "D__upper": ["Q", "QQ", "QQQ"], + "E__upper": ["W", "WW", "WWW"], + "F__upper": ["ABC", "", ""], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_no_columns(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + } + ) + + obj = UpperCase(inplace=False).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + "D__upper": ["Q", "QQ", "QQQ"], + "E__upper": ["W", "WW", "WWW"], + "F__upper": ["ABC", "", ""], + } + ) + return obj, X, X_expected + + +@pytest.fixture +def data_inplace(): + X = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["q", "qq", "QQq"], + "E": ["w", "WW", "WWw"], + "F": ["abc", "", ""], + } + ) + + obj = UpperCase(columns=list("DEF")).fit(X) + X_expected = pd.DataFrame( + { + "A": [0.0, 0.0, 0.0], + "B": [0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0], + "D": ["Q", "QQ", "QQQ"], + "E": ["W", "WW", "WWW"], + "F": ["ABC", "", ""], + } + ) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_no_columns_pd(data_no_columns): + obj, X, X_expected = data_no_columns + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_no_columns_np(data_no_columns): + obj, X, X_expected = data_no_columns + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_inplace_pd(data_inplace): + obj, X, X_expected = data_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_inplace_pd_np(data_inplace): + obj, X, X_expected = data_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_init(): + with pytest.raises(TypeError): + _ = UpperCase(columns="x") + with pytest.raises(TypeError): + _ = UpperCase(columns=["x"], inplace="x") diff --git a/gators/feature_generation_str/upper_case.py b/gators/feature_generation_str/upper_case.py index 594b67b6..81f4f8c2 100644 --- a/gators/feature_generation_str/upper_case.py +++ b/gators/feature_generation_str/upper_case.py @@ -1,137 +1,123 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd from feature_gen_str import upper_case from ..util import util - from ._base_string_feature import _BaseStringFeature +from gators import DataFrame, Series + class UpperCase(_BaseStringFeature): """Convert the selected columns to upper case. Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_generation_str import UpperCase + >>> obj = UpperCase(columns=['A', 'B']) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas( + ... pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) - >>> obj.fit_transform(X) - A B - 0 ABC ABC - 1 AB AB - 2 None - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import UpperCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) >>> obj.fit_transform(X) A B 0 ABC ABC 1 AB AB 2 None - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_generation_str import UpperCase >>> X = pd.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([['ABC', 'ABC'], ['AB', 'AB'], ['', None]], dtype=object) - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_generation_str import UpperCase - >>> X = ks.DataFrame({'A': ['abC', 'Ab', ''], 'B': ['ABc', 'aB', None]}) - >>> obj = UpperCase(columns=['A','B']) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['ABC', 'ABC'], - ['AB', 'AB'], - ['', None]], dtype=object) - - """ - def __init__(self, columns: List[str], column_names: List[str] = None): - if not isinstance(columns, list): - raise TypeError("`columns` should be a list.") - if not columns: - raise ValueError("`columns` should not be empty.") + def __init__(self, columns: List[str] = None, inplace: bool = True): + if not isinstance(columns, (list, np.ndarray)) and columns is not None: + raise TypeError("`columns` should be a list or None.") + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") self.columns = columns + self.inplace = inplace - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "StringLength": + def fit(self, X: DataFrame, y: Series = None) -> "UpperCase": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : pd.DataFrame Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- - StringLength + UpperCase Instance of itself. """ self.check_dataframe(X) + self.base_columns = list(X.columns) + if not self.columns: + self.columns = util.get_datatype_columns(X, object) + self.column_names = self.get_column_names(self.inplace, self.columns, "upper") self.idx_columns = util.get_idx_columns( - columns=X.columns, selected_columns=self.columns + columns=X.columns, + selected_columns=self.columns, ) return self - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - def f(x): # -> ks.Series[str]: - if x.name in self.columns: - return x.astype(str).str.upper().replace({"NAN": "nan", "NONE": None}) - return x + for col, name in zip(self.columns, self.column_names): + X[name] = X[col].astype(str).str.upper() - # X[self.columns] = X[self.columns] - return X.apply(f) + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -140,8 +126,13 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) - return upper_case(X, self.idx_columns) + if self.inplace: + X[:, self.idx_columns] = upper_case(X[:, self.idx_columns]) + return X + else: + X_upper = upper_case(X[:, self.idx_columns].copy()) + return np.concatenate((X, X_upper), axis=1) diff --git a/gators/feature_selection/__init__.py b/gators/feature_selection/__init__.py index 0b34d324..d44763bb 100644 --- a/gators/feature_selection/__init__.py +++ b/gators/feature_selection/__init__.py @@ -1,8 +1,8 @@ from ._base_feature_selection import _BaseFeatureSelection from .correlation_filter import CorrelationFilter +from .supervized_correlation_filter import SupervizedCorrelationFilter +from .supervized_correlation_filter_new import SupervizedCorrelationFilterNew from .information_value import InformationValue -from .multiclass_information_value import MultiClassInformationValue -from .regression_information_value import RegressionInformationValue from .select_from_model import SelectFromModel from .select_from_models import SelectFromModels from .variance_filter import VarianceFilter @@ -13,7 +13,7 @@ "SelectFromModels", "VarianceFilter", "CorrelationFilter", + "SupervizedCorrelationFilter", + "SupervizedCorrelationFilterNew", "InformationValue", - "MultiClassInformationValue", - "RegressionInformationValue", ] diff --git a/gators/feature_selection/__pycache__/__init__.cpython-38.pyc b/gators/feature_selection/__pycache__/__init__.cpython-38.pyc index 4bcecb5a..92b7c7df 100644 Binary files a/gators/feature_selection/__pycache__/__init__.cpython-38.pyc and b/gators/feature_selection/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/_base_feature_selection.cpython-38.pyc b/gators/feature_selection/__pycache__/_base_feature_selection.cpython-38.pyc index e5aee02a..d141190e 100644 Binary files a/gators/feature_selection/__pycache__/_base_feature_selection.cpython-38.pyc and b/gators/feature_selection/__pycache__/_base_feature_selection.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/correlation_filter.cpython-38.pyc b/gators/feature_selection/__pycache__/correlation_filter.cpython-38.pyc index 336a09f3..a9d6ab99 100644 Binary files a/gators/feature_selection/__pycache__/correlation_filter.cpython-38.pyc and b/gators/feature_selection/__pycache__/correlation_filter.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/information_value.cpython-38.pyc b/gators/feature_selection/__pycache__/information_value.cpython-38.pyc index 95058349..a334ed2b 100644 Binary files a/gators/feature_selection/__pycache__/information_value.cpython-38.pyc and b/gators/feature_selection/__pycache__/information_value.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/multiclass_information_value.cpython-38.pyc b/gators/feature_selection/__pycache__/multiclass_information_value.cpython-38.pyc index cc68d646..2cfa5c9f 100644 Binary files a/gators/feature_selection/__pycache__/multiclass_information_value.cpython-38.pyc and b/gators/feature_selection/__pycache__/multiclass_information_value.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/regression_information_value.cpython-38.pyc b/gators/feature_selection/__pycache__/regression_information_value.cpython-38.pyc index c74948e5..ed2cf013 100644 Binary files a/gators/feature_selection/__pycache__/regression_information_value.cpython-38.pyc and b/gators/feature_selection/__pycache__/regression_information_value.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/select_from_model.cpython-38.pyc b/gators/feature_selection/__pycache__/select_from_model.cpython-38.pyc index 769925ce..39618042 100644 Binary files a/gators/feature_selection/__pycache__/select_from_model.cpython-38.pyc and b/gators/feature_selection/__pycache__/select_from_model.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/select_from_models.cpython-38.pyc b/gators/feature_selection/__pycache__/select_from_models.cpython-38.pyc index 75cd3555..a2557a6f 100644 Binary files a/gators/feature_selection/__pycache__/select_from_models.cpython-38.pyc and b/gators/feature_selection/__pycache__/select_from_models.cpython-38.pyc differ diff --git a/gators/feature_selection/__pycache__/variance_filter.cpython-38.pyc b/gators/feature_selection/__pycache__/variance_filter.cpython-38.pyc index 906052b4..da591424 100644 Binary files a/gators/feature_selection/__pycache__/variance_filter.cpython-38.pyc and b/gators/feature_selection/__pycache__/variance_filter.cpython-38.pyc differ diff --git a/gators/feature_selection/_base_feature_selection.py b/gators/feature_selection/_base_feature_selection.py index e3020daa..cc14b859 100644 --- a/gators/feature_selection/_base_feature_selection.py +++ b/gators/feature_selection/_base_feature_selection.py @@ -1,27 +1,17 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np import pandas as pd from ..transformers.transformer import Transformer from ..util import util +from gators import DataFrame, Series -class _BaseFeatureSelection(Transformer): - """Base feature selection transformer class. - - Parameters - ---------- - columns: List[str] - List of columns to drop. - selected_columns : List[str] - List of selected columns. - feature_importances_ : pd.Series - Feature importance. - """ +class _BaseFeatureSelection(Transformer): + """Base feature selection transformer class.""" def __init__(self): self.feature_importances_ = pd.Series([], dtype=np.float64) @@ -29,33 +19,32 @@ def __init__(self): self.idx_selected_columns: List[str] = [] self.columns_to_drop: List[str] = [] - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame, y: Series = None) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. y : np.ndarray - Labels. + Target values. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if len(self.columns_to_drop): - return X.drop(self.columns_to_drop, axis=1) - else: - return X + columns_to_drop = [ + c for c in self.columns_to_drop if c in X.columns + ] # needed for dask + if len(columns_to_drop): + return X.drop(columns_to_drop, axis=1) + + return X def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -64,7 +53,7 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) diff --git a/gators/feature_selection/correlation_filter.py b/gators/feature_selection/correlation_filter.py index c073c14d..5e3d0a37 100644 --- a/gators/feature_selection/correlation_filter.py +++ b/gators/feature_selection/correlation_filter.py @@ -1,13 +1,14 @@ # License: Apache-2.0 -from typing import Union -import databricks.koalas as ks + import numpy as np import pandas as pd from ..util import util from ._base_feature_selection import _BaseFeatureSelection +from gators import DataFrame, Series + class CorrelationFilter(_BaseFeatureSelection): """Remove highly correlated columns. @@ -19,59 +20,43 @@ class CorrelationFilter(_BaseFeatureSelection): Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd >>> from gators.feature_selection import CorrelationFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) >>> obj = CorrelationFilter(max_corr=0.9) - >>> obj.fit_transform(X) - B C - 0 1.0 0.00 - 1 2.0 0.00 - 2 3.0 0.15 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_selection import CorrelationFilter - >>> X = ks.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) >>> obj.fit_transform(X) B C 0 1.0 0.00 1 2.0 0.00 2 3.0 0.15 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import CorrelationFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1. , 0. ], [2. , 0. ], [3. , 0.15]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import CorrelationFilter - >>> X = ks.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = CorrelationFilter(max_corr=0.9) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1. , 0. ], - [2. , 0. ], - [3. , 0.15]]) - """ def __init__(self, max_corr: float): @@ -80,31 +65,26 @@ def __init__(self, max_corr: float): _BaseFeatureSelection.__init__(self) self.max_corr = max_corr - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "CorrelationFilter": + def fit(self, X: DataFrame, y: Series = None) -> "CorrelationFilter": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- - CorrelationFilter: Instance of itself. + self : "CorrelationFilter" + Instance of itself. """ self.check_dataframe(X) columns = X.columns - corr = X.corr().abs() - if not isinstance(X, pd.DataFrame): - corr = corr.to_pandas() + corr = util.get_function(X).to_pandas(X.corr()).abs() stacked_corr = ( - corr.where(np.tril(np.ones(corr.shape), k=-1).astype(np.bool)) + corr.where(np.tril(np.ones(corr.shape), k=-1).astype(bool)) .stack() .sort_values(ascending=False) ) diff --git a/gators/feature_selection/information_value.py b/gators/feature_selection/information_value.py index e2019dfe..9485367c 100644 --- a/gators/feature_selection/information_value.py +++ b/gators/feature_selection/information_value.py @@ -1,14 +1,12 @@ # License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks import numpy as np import pandas as pd -from ..binning._base_discretizer import _BaseDiscretizer from ..util import util from ._base_feature_selection import _BaseFeatureSelection +from gators import DataFrame, Series + class InformationValue(_BaseFeatureSelection): """Feature selection based on the information value. @@ -19,148 +17,121 @@ class InformationValue(_BaseFeatureSelection): ---------- k : int Number of features to keep. - discretizer : _BaseDiscretizer - Discretizer transformer. - - See Also - -------- - gators.feature_selection.MultiClassInformationValue - Information value for muti-class classification problems. - gators.feature_selection.RegressionInformationValue - Information value for regression problems. + regularization : float, default 0.5. + Insure that the weights of evidence are finite. + max_iv : int, default 10. + Drop columns with an information larger than `max_iv`. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer >>> from gators.feature_selection import InformationValue - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a + >>> from gators.binning import Binning + >>> obj = InformationValue(k=3) - * fit with `pandas` & transform with `NumPy` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... "A": ['a', 'b', 'a', 'b', 'c', 'b'], + ... "B": ['true', 'true', 'false', 'true', 'false', 'false'], + ... "D": ['a', 'b', 'c', 'd', 'e', 'f'], + ... "F": ['e', 'f', 'g', 'e', 'f', 'g']}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([1, 1, 1, 0, 0, 0], name='TARGET'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... "A": ['a', 'b', 'a', 'b', 'c', 'b'], + ... "B": ['true', 'true', 'false', 'true', 'false', 'false'], + ... "D": ['a', 'b', 'c', 'd', 'e', 'f'], + ... "F": ['e', 'f', 'g', 'e', 'f', 'g']}) + >>> y = ps.Series([1, 1, 1, 0, 0, 0], name='TARGET') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() + ... "A": ['a', 'b', 'a', 'b', 'c', 'b'], + ... "B": ['true', 'true', 'false', 'true', 'false', 'false'], + ... "D": ['a', 'b', 'c', 'd', 'e', 'f'], + ... "F": ['e', 'f', 'g', 'e', 'f', 'g']}) >>> y = pd.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - * fit with `koalas` & transform with `NumPy` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([1, 1, 1, 0, 0, 0], name='TARGET') - >>> obj = InformationValue(k=3, discretizer=Discretizer(n_bins=4)) + >>> obj.fit_transform(X, y) + A B F + 0 a true e + 1 b true f + 2 a false g + 3 b true e + 4 c false f + 5 b false g + + >>> X = pd.DataFrame({ + ... "A": ['a', 'b', 'a', 'b', 'c', 'b'], + ... "B": ['true', 'true', 'false', 'true', 'false', 'false'], + ... "D": ['a', 'b', 'c', 'd', 'e', 'f'], + ... "F": ['e', 'f', 'g', 'e', 'f', 'g']}) >>> _ = obj.fit(X, y) >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) + array([['a', 'true', 'e'], + ['b', 'true', 'f'], + ['a', 'false', 'g'], + ['b', 'true', 'e'], + ['c', 'false', 'f'], + ['b', 'false', 'g']], dtype=object) """ - def __init__(self, k: int, discretizer: _BaseDiscretizer): + def __init__( + self, + k: int, + regularization: float = 0.1, + max_iv: float = 10.0, + ): if not isinstance(k, int): raise TypeError("`k` should be an int.") - if not isinstance(discretizer, _BaseDiscretizer): - raise TypeError("`discretizer` should derive from _BaseDiscretizer.") + if not isinstance(regularization, (int, float)) or regularization < 0: + raise TypeError("`k` should be a positive float.") + if not isinstance(max_iv, (int, float)) or max_iv < 0: + raise TypeError("`max_iv` should be a positive float.") _BaseFeatureSelection.__init__(self) self.k = k - self.discretizer = discretizer + self.regularization = regularization + self.max_iv = max_iv - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "InformationValue": + def fit(self, X: DataFrame, y: Series) -> "InformationValue": """Fit the transformer on the dataframe `X`. Parameters ---------- - X: Union[pd.DataFrame, ks.DataFrame] + X: DataFrame Input dataframe. - y: Union[pd.Series, ks.Series], default to None. - Labels. + y: Series + Target values. Returns ------- - InformationValue: Instance of itself. + "InformationValue" + Instance of itself. """ self.check_dataframe(X) - self.check_y(X, y) - self.check_binary_target(y) - columns = X.columns - self.feature_importances_ = self.compute_information_value( - X, y, self.discretizer + self.check_target(X, y) + X, self.feature_importances_ = self.compute_information_value( + X, y, self.regularization ) + mask = self.feature_importances_ < self.max_iv + self.feature_importances_ = self.feature_importances_[mask] self.feature_importances_.sort_values(ascending=False, inplace=True) self.selected_columns = list(self.feature_importances_.index[: self.k]) - self.columns_to_drop = [c for c in columns if c not in self.selected_columns] + self.columns_to_drop = [c for c in X.columns if c not in self.selected_columns] self.idx_selected_columns = util.get_idx_columns( X.columns, self.selected_columns ) @@ -168,54 +139,36 @@ def fit( @staticmethod def compute_information_value( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - discretizer: _BaseDiscretizer, + X: DataFrame, y: Series, regularization: float ) -> pd.Series: """Compute information value. Parameters ---------- - X: Union[pd.DataFrame, ks.DataFrame] + X: DataFrame Input dataframe. y: np.ndarray Target values. - discretizer: _BaseDiscretizer - Discretizer. Returns ------- pd.Series Information value. """ - discretizer.inplace = False - object_columns = util.get_datatype_columns(X, object) - numerical_columns = util.get_numerical_columns(X) - binned_columns = [f"{c}__bin" for c in numerical_columns] - iv_columns = object_columns.copy() + binned_columns.copy() - X = discretizer.fit_transform(X) - iv = pd.Series(0, index=iv_columns) - X = X.join(y) y_name = y.name - for col in iv_columns: - if isinstance(X, pd.DataFrame): - tab = X.groupby([col, y_name])[y_name].count().unstack().fillna(0) - else: - tab = ( - X[[col, y_name]] - .groupby([col, y_name])[y_name] - .count() - .to_pandas() - .unstack() - .fillna(0) - ) - tab /= tab.sum() - tab = tab.to_numpy() - with np.errstate(divide="ignore"): - woe = pd.Series(np.log(tab[:, 1] / tab[:, 0])) - woe[(woe == np.inf) | (woe == -np.inf)] = 0.0 - iv.loc[col] = np.sum(woe * (tab[:, 1] - tab[:, 0])) - - X = X.drop(binned_columns + [y_name], axis=1) - iv.index = [c.split("__bin")[0] for c in iv.index] - return iv.sort_values(ascending=False).fillna(0) + counts = ( + util.get_function(X) + .melt(util.get_function(X).join(X, y.to_frame()), id_vars=y_name) + .groupby(["variable", "value"]) + .agg(["sum", "count"])[y_name] + ) + counts = util.get_function(X).to_pandas(counts) + counts.columns = ["1", "count"] + counts["0"] = (counts["count"] - counts["1"] + regularization) / counts["count"] + counts["1"] = (counts["1"] + regularization) / counts["count"] + iv = ( + ((counts["1"] - counts["0"]) * np.log(counts["1"] / counts["0"])) + .groupby(level=[0]) + .sum() + ) + return X, iv.sort_values(ascending=False).fillna(0) diff --git a/gators/feature_selection/multiclass_information_value.py b/gators/feature_selection/multiclass_information_value.py deleted file mode 100644 index 432ec76e..00000000 --- a/gators/feature_selection/multiclass_information_value.py +++ /dev/null @@ -1,204 +0,0 @@ -# License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import pandas as pd - -from ..binning._base_discretizer import _BaseDiscretizer -from ..util import util -from ._base_feature_selection import _BaseFeatureSelection -from .information_value import InformationValue - - -class MultiClassInformationValue(_BaseFeatureSelection): - """Feature selection based on the information value. - - `MultiClassInformationValue` accepts only for muti-class variable targets. - - Parameters - ---------- - k : int - Number of features to keep. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - See Also - -------- - gators.feature_selection.InformationValue - Information value for binary classification problems. - gators.feature_selection.RegressionInformationValue - Information value for regression problems. - - Examples - -------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import MultiClassInformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = pd.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([1, 1, 2, 2, 0, 0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = MultiClassInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - """ - - def __init__(self, k: int, discretizer: _BaseDiscretizer): - if not isinstance(k, int): - raise TypeError("`k` should be an int.") - if not isinstance(discretizer, _BaseDiscretizer): - raise TypeError("`discretizer` should inherite from _BaseDiscretizer.") - _BaseFeatureSelection.__init__(self) - self.k = k - self.discretizer = discretizer - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "MultiClassInformationValue": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - InformationValue: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_multiclass_target(y) - columns = X.columns - self.feature_importances_ = self.compute_information_value( - X, y, self.discretizer - ) - self.feature_importances_.sort_values(ascending=False, inplace=True) - self.selected_columns = list(self.feature_importances_.index[: self.k]) - self.columns_to_drop = [c for c in columns if c not in self.selected_columns] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns - ) - return self - - @staticmethod - def compute_information_value( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - discretizer: _BaseDiscretizer, - ) -> pd.Series: - """Compute information value. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - Returns - ------- - pd.Series - Information value. - """ - discretizer.inplace = False - if isinstance(X, pd.DataFrame): - y_onehot = pd.get_dummies(y, prefix=y.name) - else: - y_onehot = ks.get_dummies(y, prefix=y.name) - y_onehot = y_onehot.drop(y_onehot.columns[0], axis=1) - information_values = pd.DataFrame(index=X.columns, columns=y_onehot.columns[1:]) - iv = InformationValue(discretizer=discretizer, k=X.shape[1]) - object_columns = util.get_datatype_columns(X, object) - columns = object_columns + discretizer.output_columns - for col in y_onehot.columns[1:]: - _ = iv.fit(X[columns], y_onehot.loc[:, col]) - information_values.loc[:, col] = iv.feature_importances_ - return information_values.fillna(0).max(1).sort_values(ascending=False) diff --git a/gators/feature_selection/regression_information_value.py b/gators/feature_selection/regression_information_value.py deleted file mode 100644 index 81e8073a..00000000 --- a/gators/feature_selection/regression_information_value.py +++ /dev/null @@ -1,201 +0,0 @@ -# License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import pandas as pd - -from ..binning._base_discretizer import _BaseDiscretizer -from ..util import util -from ._base_feature_selection import _BaseFeatureSelection -from .multiclass_information_value import MultiClassInformationValue - - -class RegressionInformationValue(_BaseFeatureSelection): - """Regression Information Value Transformer. - - `RegressionInformationValue` accepts only continuous variable targets. - - Parameters - ---------- - k : int - Number of features to keep. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - See Also - -------- - gators.feature_selection.InformationValue - Information value for binary classification problems. - gators.feature_selection.MultiClassInformationValue - Information value for multi-class classification problems. - - Examples - -------- - * fit & transform with `pandas` - - >>> import pandas as pd - >>> from gators.feature_selection import RegressionInformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> from gators.binning import Discretizer - >>> from gators.feature_selection import InformationValue - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> obj.fit_transform(X, y) - A B C - 0 87.25 1 a - 1 5.25 1 b - 2 70.25 0 b - 3 5.25 1 b - 4 0.25 0 a - 5 7.25 0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import RegressionInformationValue - >>> from gators.binning import Discretizer - >>> X = pd.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> X_expected = X[['A', 'B', 'C']].copy() - >>> y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import InformationValue - >>> from gators.binning import Discretizer - >>> X = ks.DataFrame({ - ... 'A': [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - ... 'B': [1, 1, 0, 1, 0, 0], - ... 'C': ['a', 'b', 'b', 'b', 'a', 'a'], - ... 'D': [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - ... 'F': [1, 2, 3, 1, 2, 4]}) - >>> y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name='TARGET') - >>> discretizer = Discretizer(n_bins=4) - >>> obj = RegressionInformationValue(k=3, discretizer=discretizer) - >>> _ = obj.fit(X, y) - >>> obj.transform_numpy(X.to_numpy()) - array([[87.25, 1, 'a'], - [5.25, 1, 'b'], - [70.25, 0, 'b'], - [5.25, 1, 'b'], - [0.25, 0, 'a'], - [7.25, 0, 'a']], dtype=object) - - - """ - - def __init__(self, k: int, discretizer: _BaseDiscretizer): - if not isinstance(k, int): - raise TypeError("`k` should be an int.") - if not isinstance(discretizer, _BaseDiscretizer): - raise TypeError("`discretizer` should inherite from _BaseDiscretizer.") - _BaseFeatureSelection.__init__(self) - self.k = k - self.discretizer = discretizer - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "RegressionInformationValue": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - - Returns - ------- - InformationValue: Instance of itself. - """ - self.check_dataframe(X) - self.check_y(X, y) - self.check_regression_target(y) - columns = X.columns - self.feature_importances_ = self.compute_information_value( - X, y, self.discretizer - ) - self.feature_importances_.sort_values(ascending=False, inplace=True) - self.selected_columns = list(self.feature_importances_.index[: self.k]) - self.columns_to_drop = [c for c in columns if c not in self.selected_columns] - self.idx_selected_columns = util.get_idx_columns( - X.columns, self.selected_columns - ) - return self - - @staticmethod - def compute_information_value( - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - discretizer: _BaseDiscretizer, - ) -> pd.Series: - """Compute information value. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. - discretizer : _BaseDiscretizer - Discretizer Transformer. - - Returns - ------- - pd.Series - Information value. - """ - discretizer.inplace = True - y_binned = discretizer.fit_transform(y.to_frame())[y.name] - discretizer.inplace = False - discretizer.output_columns = [] - return MultiClassInformationValue.compute_information_value( - X, y_binned.astype(float).astype(int), discretizer=discretizer - ) diff --git a/gators/feature_selection/select_from_model.py b/gators/feature_selection/select_from_model.py index 5e9de5ea..a957ae64 100644 --- a/gators/feature_selection/select_from_model.py +++ b/gators/feature_selection/select_from_model.py @@ -1,13 +1,9 @@ # License: Apache-2.0 -from typing import Union - -import databricks.koalas as ks -import pandas as pd - -from ..converter import KoalasToPandas from ..util import util from ._base_feature_selection import _BaseFeatureSelection +from gators import DataFrame, Series + class SelectFromModel(_BaseFeatureSelection): """Select From Model Transformer. @@ -24,56 +20,77 @@ class SelectFromModel(_BaseFeatureSelection): Examples --------- - * fit & transform with `pandas` + Imports and initialization: + + >>> from gators.feature_selection import SelectFromModel + Note that the model can be: + * a **xgboost.dask** or a **sklearn** model for `dask` dataframes + * a **sklearn** model for `pandas` and `dask` dataframes + * a **pyspark.ml** model for `koalas` dataframes + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd >>> import pandas as pd - >>> from sklearn.ensemble import RandomForestClassifier as RFC - >>> from gators.feature_selection import SelectFromModel - >>> X = pd.DataFrame( - ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> model = RFC(n_estimators=1, max_depth=2, random_state=0) - >>> obj = SelectFromModel(model=model, k=2) - >>> obj.fit_transform(X, y) - A C - 0 22.00 3.0 - 1 38.00 1.0 - 2 26.00 3.0 - 3 35.00 1.0 - 4 35.00 3.0 - 5 28.11 3.0 - 6 54.00 1.0 - 7 2.00 3.0 - 8 27.00 3.0 - 9 14.00 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks + >>> from xgboost.dask import XGBClassifier + >>> from distributed import Client + >>> client = Client(n_workers=2) + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0.94, 0.09, -0.43, 0.31, 0.99, 1.05, 1.02, -0.77, 0.03, 0.99], + ... 'B': [0.13, 0.01, -0.06, 0.04, 0.14, 0.14, 0.14, -0.1, 0.0, 0.13], + ... 'C': [0.8, 0.08, -0.37, 0.26, 0.85, 0.9, 0.87, -0.65, 0.02, 0.84]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([1, 0, 0, 0, 1, 1, 1, 0, 0, 1], name='TARGET'), npartitions=1) + >>> model = XGBClassifier( + ... n_estimators=1, random_state=0, eval_metric='logloss', use_label_encoder=False) + >>> model.client = client + >>> obj = SelectFromModel(model=model, k=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> from pyspark import SparkConf, SparkContext >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark - >>> from gators.feature_selection import SelectFromModel - >>> X = ks.DataFrame( - ... {'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') + >>> conf = SparkConf() + >>> _ = conf.set('spark.executor.memory', '2g') + >>> _ = SparkContext(conf=conf) + >>> X = ps.DataFrame({ + ... 'A': [0.94, 0.09, -0.43, 0.31, 0.99, 1.05, 1.02, -0.77, 0.03, 0.99], + ... 'B': [0.13, 0.01, -0.06, 0.04, 0.14, 0.14, 0.14, -0.1, 0.0, 0.13], + ... 'C': [0.8, 0.08, -0.37, 0.26, 0.85, 0.9, 0.87, -0.65, 0.02, 0.84]}) + >>> y = ps.Series([1, 0, 0, 0, 1, 1, 1, 0, 0, 1], name='TARGET') >>> model = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) - >>> obj = SelectFromModel(model=model, k=2) + >>> obj = SelectFromModel(model=model, k=1) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> from xgboost import XGBClassifier + >>> X = pd.DataFrame({ + ... 'A': [0.94, 0.09, -0.43, 0.31, 0.99, 1.05, 1.02, -0.77, 0.03, 0.99], + ... 'B': [0.13, 0.01, -0.06, 0.04, 0.14, 0.14, 0.14, -0.1, 0.0, 0.13], + ... 'C': [0.8, 0.08, -0.37, 0.26, 0.85, 0.9, 0.87, -0.65, 0.02, 0.84]}) + >>> y = pd.Series([1, 0, 0, 0, 1, 1, 1, 0, 0, 1], name='TARGET') + >>> model = XGBClassifier(n_estimators=1, random_state=0, eval_metric='logloss') + >>> obj = SelectFromModel(model=model, k=1) + + The result is a transformed dataframe belonging to the same dataframe library. + >>> obj.fit_transform(X, y) - A B - 0 22.00 7.25 - 1 38.00 71.28 - 2 26.00 7.92 - 3 35.00 53.10 - 4 35.00 8.05 - 5 28.11 8.46 - 6 54.00 51.86 - 7 2.00 21.08 - 8 27.00 11.13 - 9 14.00 30.07 + A + 0 0.94 + 1 0.09 + 2 -0.43 + 3 0.31 + 4 0.99 + 5 1.05 + 6 1.02 + 7 -0.77 + 8 0.03 + 9 0.99 See Also -------- @@ -91,41 +108,27 @@ def __init__(self, model, k: int): self.model = model self.k = k - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "SelectFromModel": + def fit(self, X: DataFrame, y: Series = None) -> "SelectFromModel": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - SelectFromModel: Instance of itself. + self : "SelectFromModel" + Instance of itself. """ self.check_dataframe(X) - self.check_y(X, y) + self.check_target(X, y) columns = list(X.columns) - if isinstance(X, pd.DataFrame): - self.feature_importances_ = self.calculate_feature_importances_pd( - model=self.model, X=X, y=y, columns=columns - ) - else: - if hasattr(self.model, "labelCol"): - self.feature_importances_ = self.calculate_feature_importances_ks( - model=self.model, X=X, y=y, columns=columns - ) - else: - X_, y_ = KoalasToPandas().transform(X, y) - self.feature_importances_ = self.calculate_feature_importances_pd( - model=self.model, X=X_, y=y_, columns=columns - ) + self.feature_importances_ = util.get_function(X).feature_importances_( + self.model, X, y + ) mask = self.feature_importances_ != 0 self.feature_importances_ = self.feature_importances_[mask] self.feature_importances_.sort_values(ascending=False, inplace=True) @@ -135,25 +138,3 @@ def fit( X.columns, self.selected_columns ) return self - - @staticmethod - def calculate_feature_importances_pd( - model: object, X: pd.DataFrame, y: Union[pd.Series, ks.Series], columns: list - ) -> pd.Series: - model.fit(X.to_numpy(), y) - feature_importances_ = pd.Series( - model.feature_importances_, - index=columns, - ) - return feature_importances_ - - @staticmethod - def calculate_feature_importances_ks( - model: object, X: ks.DataFrame, y: ks.Series, columns: list - ) -> pd.Series: - spark_df = util.generate_spark_dataframe(X=X, y=y) - trained_model = model.fit(spark_df) - feature_importances_ = pd.Series( - trained_model.featureImportances.toArray(), index=columns - ) - return feature_importances_ diff --git a/gators/feature_selection/select_from_models.py b/gators/feature_selection/select_from_models.py index 18a60fc7..8f6d123c 100644 --- a/gators/feature_selection/select_from_models.py +++ b/gators/feature_selection/select_from_models.py @@ -1,15 +1,15 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List -import databricks.koalas as ks import numpy as np import pandas as pd -import pyspark.sql.dataframe as ps from ..scalers.minmax_scaler import MinMaxScaler from ..util import util from ._base_feature_selection import _BaseFeatureSelection +from gators import DataFrame, Series + class SelectFromModels(_BaseFeatureSelection): """Select From Models By Vote Transformer. @@ -26,57 +26,83 @@ class SelectFromModels(_BaseFeatureSelection): Examples --------- - * fit & transform with `koalas` + Imports and initialization: - >>> import pandas as pd - >>> from sklearn.ensemble import RandomForestClassifier as RFC >>> from gators.feature_selection import SelectFromModels - >>> X = pd.DataFrame({ - ... 'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> models = [RFC(n_estimators=1, max_depth=1, random_state=0), - ... RFC(n_estimators=1, max_depth=2, random_state=1)] - >>> obj = SelectFromModels(models=models, k=2) - >>> obj.fit_transform(X, y) - B C - 0 7.25 3.0 - 1 71.28 1.0 - 2 7.92 3.0 - 3 53.10 1.0 - 4 8.05 3.0 - 5 8.46 3.0 - 6 51.86 1.0 - 7 21.08 3.0 - 8 11.13 3.0 - 9 30.07 2.0 - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks + + Note that the model can be: + + * a **xgboost.dask** or a **sklearn** model for `dask` dataframes + * a **sklearn** model for `pandas` and `pandas` dataframes + * a **pyspark.ml** model for `koalas` dataframes + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> from xgboost.dask import XGBClassifier + >>> from distributed import Client, LocalCluster + >>> cluster = LocalCluster() + >>> client = Client(cluster) + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0.94, 0.09, -0.43, 0.31, 0.99, 1.05, 1.02, -0.77, 0.03, 0.99], + ... 'B': [0.13, 0.01, -0.06, 0.04, 0.14, 0.14, 0.14, -0.1, 0.0, 0.13], + ... 'C': [0.8, 0.08, -0.37, 0.26, 0.85, 0.9, 0.87, -0.65, 0.02, 0.84]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([1, 0, 0, 0, 1, 1, 1, 0, 0, 1], name='TARGET'), npartitions=1) + >>> models = [ + ... XGBClassifier(n_estimators=1, random_state=0, eval_metric='logloss', use_label_encoder=False), + ... XGBClassifier(n_estimators=1, random_state=1, eval_metric='logloss', use_label_encoder=False)] + >>> models[0].client = client + >>> models[1].client = client + >>> obj = SelectFromModels(models=models, k=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> from pyspark import SparkConf, SparkContext >>> from pyspark.ml.classification import RandomForestClassifier as RFCSpark - >>> from gators.feature_selection import SelectFromModels - >>> X = ks.DataFrame({ - ... 'A': [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - ... 'B': [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - ... 'C': [3.0, 1.0, 3.0, 1.0, 3.0, 3.0, 1.0, 3.0, 3.0, 2.0]}) - >>> y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name='TARGET') - >>> models = [RFCSpark(numTrees=1, maxDepth=1, labelCol=y.name, seed=0), + >>> conf = SparkConf() + >>> _ = conf.set('spark.executor.memory', '2g') + >>> _ = SparkContext(conf=conf) + >>> X = ps.DataFrame({ + ... 'A': [0.94, 0.09, -0.43, 0.31, 0.99, 1.05, 1.02, -0.77, 0.03, 0.99], + ... 'B': [0.13, 0.01, -0.06, 0.04, 0.14, 0.14, 0.14, -0.1, 0.0, 0.13], + ... 'C': [0.8, 0.08, -0.37, 0.26, 0.85, 0.9, 0.87, -0.65, 0.02, 0.84]}) + >>> y = ps.Series([1, 0, 0, 0, 1, 1, 1, 0, 0, 1], name='TARGET') + >>> models = [RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0), ... RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=1)] - >>> obj = SelectFromModels(models=models, k=2) + >>> obj = SelectFromModels(models=models, k=1) + + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> from xgboost import XGBClassifier + >>> X = pd.DataFrame({ + ... 'A': [0.94, 0.09, -0.43, 0.31, 0.99, 1.05, 1.02, -0.77, 0.03, 0.99], + ... 'B': [0.13, 0.01, -0.06, 0.04, 0.14, 0.14, 0.14, -0.1, 0.0, 0.13], + ... 'C': [0.8, 0.08, -0.37, 0.26, 0.85, 0.9, 0.87, -0.65, 0.02, 0.84]}) + >>> y = pd.Series([1, 0, 0, 0, 1, 1, 1, 0, 0, 1], name='TARGET') + >>> models = [XGBClassifier(n_estimators=1, max_depth=3, random_state=0, eval_metric='logloss'), + ... XGBClassifier(n_estimators=1, max_depth=4, random_state=1, eval_metric='logloss')] + >>> obj = SelectFromModels(models=models, k=1) + + The result is a transformed dataframe belonging to the same dataframe library. + >>> obj.fit_transform(X, y) - A B - 0 22.00 7.25 - 1 38.00 71.28 - 2 26.00 7.92 - 3 35.00 53.10 - 4 35.00 8.05 - 5 28.11 8.46 - 6 54.00 51.86 - 7 2.00 21.08 - 8 27.00 11.13 - 9 14.00 30.07 + A + 0 0.94 + 1 0.09 + 2 -0.43 + 3 0.31 + 4 0.99 + 5 1.05 + 6 1.02 + 7 -0.77 + 8 0.03 + 9 0.99 See Also -------- @@ -86,7 +112,7 @@ class SelectFromModels(_BaseFeatureSelection): """ def __init__(self, models: List[object], k: int): - if not isinstance(models, list): + if not isinstance(models, (list, np.ndarray)): raise TypeError("`models` should be a list.") if not isinstance(k, int): raise TypeError("`k` should be an int.") @@ -99,40 +125,28 @@ def __init__(self, models: List[object], k: int): self.models = models self.k = k - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "SelectFromModels": + def fit(self, X: DataFrame, y: Series = None) -> "SelectFromModels": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - SelectFromModels: Instance of itself. + self : "SelectFromModels" + Instance of itself. """ self.check_dataframe(X) - self.check_y(X, y) + self.check_target(X, y) self.feature_importances_ = self.get_feature_importances_frame(X, self.models) - if isinstance(X, pd.DataFrame): - for col, model in zip(self.feature_importances_.columns, self.models): - model_feature_importances_ = self.get_feature_importances_pd( - model=model, X=X, y=y - ) - self.feature_importances_[col] = model_feature_importances_ - else: - spark_df = util.generate_spark_dataframe(X=X, y=y) - for col, model in zip(self.feature_importances_.columns, self.models): - model_feature_importances_ = self.get_feature_importances_sk( - model=model, spark_df=spark_df - ) - self.feature_importances_[col] = model_feature_importances_ + for col, model in zip(self.feature_importances_.columns, self.models): + self.feature_importances_[col] = util.get_function(X).feature_importances_( + model, X, y + ) self.feature_importances_ = self.clean_feature_importances_frame( self.feature_importances_ ) @@ -147,20 +161,6 @@ def fit( ) return self - @staticmethod - def get_feature_importances_pd( - model: object, X: pd.DataFrame, y: Union[pd.Series, ks.Series] - ): - model.fit(X, y) - feature_importances_ = model.feature_importances_ - return feature_importances_ - - @staticmethod - def get_feature_importances_sk(model: object, spark_df: ps.DataFrame): - trained_model = model.fit(spark_df) - feature_importances_ = trained_model.featureImportances.toArray() - return feature_importances_ - @staticmethod def get_feature_importances_frame(X, models): index = np.array(list(X.columns)) diff --git a/gators/feature_selection/supervized_correlation_filter.py b/gators/feature_selection/supervized_correlation_filter.py new file mode 100644 index 00000000..8547283e --- /dev/null +++ b/gators/feature_selection/supervized_correlation_filter.py @@ -0,0 +1,127 @@ +# License: Apache-2.0 +import pandas as pd + +from ..util import util +from ._base_feature_selection import _BaseFeatureSelection + +from gators import DataFrame, Series + + +class SupervizedCorrelationFilter(_BaseFeatureSelection): + """Remove highly correlated columns. + + Select the features based on the highest feature importance. + + Parameters + ---------- + feature_importances: Series + Feature importances. + max_corr : float + Max correlation value tolerated between two columns. + method: str or callable + Method of correlation: + + * pearson : standard correlation coefficient + * kendall : Kendall Tau correlation coefficient + * spearman : Spearman rank correlation + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_selection import SupervizedCorrelationFilter + >>> feature_importances = pd.Series({'A': 0.1, 'B': 0.7, 'C':0.9}) + >>> obj = SupervizedCorrelationFilter(max_corr=0.9, feature_importances=feature_importances) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + B C + 0 1.0 0.00 + 1 2.0 0.00 + 2 3.0 0.15 + + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([[1. , 0. ], + [2. , 0. ], + [3. , 0.15]]) + """ + + def __init__( + self, feature_importances: Series, max_corr: float, method: str = "pearson" + ): + if "Series" not in str(type(feature_importances)): + raise TypeError( + "`feature_importances` should be a pandas, dask, or pyspark Series." + ) + if not isinstance(max_corr, float): + raise TypeError("`max_corr` should be a float.") + _BaseFeatureSelection.__init__(self) + self.max_corr = max_corr + self.method = method + self.feature_importances = util.get_function(feature_importances).to_pandas( + feature_importances + ) + + def fit(self, X: DataFrame, y: Series = None) -> "SupervizedCorrelationFilter": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : "CorrelationFilter" + Instance of itself. + """ + self.check_dataframe(X) + columns = X.columns + corr = util.get_function(X).to_pandas(X.corr()).abs() + self.columns_to_drop = [] + for i in range(len(columns)): + for j in range(i + 1): + item = corr.iloc[j : (j + 1), (i + 1) : (i + 2)] + col = item.columns + row = item.index + val = item.values + if val >= self.max_corr: + col_value_corr = self.feature_importances[col.values[0]] + row_value_corr = self.feature_importances[row.values[0]] + if col_value_corr < row_value_corr: + self.columns_to_drop.append(col.values[0]) + else: + self.columns_to_drop.append(row.values[0]) + + self.columns_to_drop = list(set(self.columns_to_drop)) + self.selected_columns = [c for c in columns if c not in self.columns_to_drop] + self.feature_importances_ = pd.Series( + 1.0, index=self.selected_columns, dtype=float + ) + self.idx_selected_columns = util.get_idx_columns( + X.columns, self.selected_columns + ) + return self diff --git a/gators/feature_selection/supervized_correlation_filter_new.py b/gators/feature_selection/supervized_correlation_filter_new.py new file mode 100644 index 00000000..ac4ea663 --- /dev/null +++ b/gators/feature_selection/supervized_correlation_filter_new.py @@ -0,0 +1,124 @@ +# License: Apache-2.0 +import pandas as pd + +from ..util import util +from ._base_feature_selection import _BaseFeatureSelection + +from gators import DataFrame, Series + + +class SupervizedCorrelationFilterNew(_BaseFeatureSelection): + """Remove highly correlated columns. + + Select the features based on the highest feature importance. + + Parameters + ---------- + feature_importances: Series + Feature importances. + max_corr : float + Max correlation value tolerated between two columns. + method: str or callable + Method of correlation: + + * pearson : standard correlation coefficient + * kendall : Kendall Tau correlation coefficient + * spearman : Spearman rank correlation + + Examples + --------- + Imports and initialization: + + >>> from gators.feature_selection import SupervizedCorrelationFilter + >>> feature_importances = pd.Series({'A': 0.1, 'B': 0.7, 'C':0.9}) + >>> obj = SupervizedCorrelationFilter(max_corr=0.9, feature_importances=feature_importances) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + B C + 0 1.0 0.00 + 1 2.0 0.00 + 2 3.0 0.15 + + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + >>> _ = obj.fit(X) + >>> obj.transform_numpy(X.to_numpy()) + array([[1. , 0. ], + [2. , 0. ], + [3. , 0.15]]) + """ + + def __init__( + self, feature_importances: Series, corr: pd.DataFrame, max_corr: float + ): + if "Series" not in str(type(feature_importances)): + raise TypeError( + "`feature_importances` should be a pandas, dask, or pyspark Series." + ) + _BaseFeatureSelection.__init__(self) + self.corr = corr + self.max_corr = max_corr + self.feature_importances = util.get_function(feature_importances).to_pandas( + feature_importances + ) + + def fit(self, X: DataFrame, y: Series = None) -> "SupervizedCorrelationFilterNew": + """Fit the transformer on the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : "CorrelationFilter" + Instance of itself. + """ + self.check_dataframe(X) + columns = X.columns + self.columns_to_drop = [] + for i in range(len(columns)): + for j in range(i + 1): + item = self.corr.iloc[j : (j + 1), (i + 1) : (i + 2)] + col = item.columns + row = item.index + val = item.values + if val >= self.max_corr: + col_value_corr = self.feature_importances[col.values[0]] + row_value_corr = self.feature_importances[row.values[0]] + if col_value_corr < row_value_corr: + self.columns_to_drop.append(col.values[0]) + else: + self.columns_to_drop.append(row.values[0]) + + self.columns_to_drop = list(set(self.columns_to_drop)) + self.selected_columns = [c for c in columns if c not in self.columns_to_drop] + self.feature_importances_ = pd.Series( + 1.0, index=self.selected_columns, dtype=float + ) + self.idx_selected_columns = util.get_idx_columns( + X.columns, self.selected_columns + ) + return self diff --git a/gators/feature_selection/tests/_test_base_feature_selection.py b/gators/feature_selection/tests/_test_base_feature_selection.py deleted file mode 100644 index 4f7210c9..00000000 --- a/gators/feature_selection/tests/_test_base_feature_selection.py +++ /dev/null @@ -1,176 +0,0 @@ -# License: Apache-2.0 -import os - -import databricks.koalas as ks -import pandas as pd -import pytest -from pyspark.ml.classification import GBTClassifier as GBTCSpark -from pyspark.ml.classification import RandomForestClassifier as RFCSpark -from sklearn.datasets import load_breast_cancer -from xgboost import XGBClassifier - -from gators.feature_selection.information_value import InformationValue -from gators.feature_selection.select_from_model import SelectFromModel -from gators.feature_selection.select_from_models import SelectFromModels -from gators.feature_selection.variance_filter import VarianceFilter - - -@pytest.fixture -def data(): - dataset = load_breast_cancer(return_X_y=False) - X = pd.DataFrame(dataset.data, columns=dataset.feature_names) - y = dataset.target - return X, _, y - - -@pytest.mark.koalas -@pytest.fixture -def data(): - dataset = load_breast_cancer(return_X_y=False) - X = pd.DataFrame(dataset.data, columns=dataset.feature_names) - y = dataset.target - return X, ks.from_pandas(X), y - - -def test_variance_filter(data): - X, _, y = data - max_variance = 1 - variance_filter = VarianceFilter(max_variance=max_variance) - _ = variance_filter.fit_transform(X, y).columns - saved_features = [ - "mean radius", - "mean texture", - "mean perimeter", - "mean area", - "perimeter error", - "area error", - "worst radius", - "worst texture", - "worst perimeter", - "worst area", - ] - assert sorted(variance_filter.selected_columns) == sorted(saved_features) - - -@pytest.mark.koalas -def test_variance_filter_koalas(data): - _, X, y = data - max_variance = 1 - variance_filter = VarianceFilter(max_variance=max_variance) - _ = variance_filter.fit_transform(X, y).columns - saved_features = [ - "mean radius", - "mean texture", - "mean perimeter", - "mean area", - "perimeter error", - "area error", - "worst radius", - "worst texture", - "worst perimeter", - "worst area", - ] - assert sorted(variance_filter.selected_columns) == sorted(saved_features) - - -def test_information_value(data): - X, _, y = data - iv_selector = InformationValue(k=10) - _ = iv_selector.fit(X, y) - saved_features = [ - "worst perimeter", - "worst area", - "worst radius", - "mean concave points", - "worst concave points", - "mean concavity", - "mean perimeter", - "worst concavity", - "mean area", - "mean radius", - ] - assert sorted(iv_selector.selected_columns) == sorted(saved_features) - - -@pytest.mark.koalas -def test_information_value_koalas(data): - _, X, y = data - iv_selector = InformationValue(k=10) - _ = iv_selector.fit(X, y) - saved_features = [ - "worst perimeter", - "worst area", - "worst radius", - "mean concave points", - "worst concave points", - "mean concavity", - "mean perimeter", - "worst concavity", - "mean area", - "mean radius", - ] - assert sorted(iv_selector.selected_columns) == sorted(saved_features) - - -def test_select_from_model_with_xgb(data): - X, _, y = data - model = XGBClassifier(n_estimators=50, max_depth=3, random_state=0) - xgb_selector = SelectFromModel(model=model, k=10) - X_new = xgb_selector.fit_transform(X, y) - saved_features = [ - "worst radius", - "worst perimeter", - "mean concave points", - "worst concave points", - "concave points error", - "worst concavity", - "mean texture", - "worst texture", - "worst area", - "smoothness error", - ] - assert sorted(xgb_selector.selected_columns) == sorted(saved_features) - - -@pytest.mark.koalas -def test_select_from_model_random_forest_koalas(data): - X, X_ks, y = data - y_ks = ks.from_pandas(pd.Series(y)) - model = RFCSpark(numTrees=50, maxDepth=5, seed=0) - rf_selector = SelectFromModel(model=model, k=10) - _ = rf_selector.fit_transform(X_ks, y_ks) - selected_columns = [ - "worst perimeter", - "worst concave points", - "worst radius", - "mean concave points", - "worst area", - "area error", - "mean radius", - "mean perimeter", - "mean area", - "mean concavity", - ] - assert rf_selector.selected_columns == selected_columns - - -@pytest.mark.koalas -def test_select_from_models_koalas(data): - X, X_ks, y = data - y_ks = ks.from_pandas(pd.Series(y)) - gbt = GBTCSpark(maxIter=5, maxDepth=5, seed=0) - models_selector = SelectFromModels([gbt], k=10) - X_new = models_selector.fit_transform(X=X_ks, y=y_ks) - saved_features = [ - "worst perimeter", - "mean concave points", - "worst texture", - "worst concave points", - "mean texture", - "texture error", - "worst concavity", - "mean symmetry", - "mean smoothness", - "concave points error", - ] - assert sorted(models_selector.selected_columns) == sorted(saved_features) diff --git a/.tox/log/.lock b/gators/feature_selection/tests/dask-worker-space/global.lock old mode 100755 new mode 100644 similarity index 100% rename from .tox/log/.lock rename to gators/feature_selection/tests/dask-worker-space/global.lock diff --git a/build/lib.macosx-10.9-x86_64-3.9/gators/util/__init__.py b/gators/feature_selection/tests/dask-worker-space/purge.lock similarity index 100% rename from build/lib.macosx-10.9-x86_64-3.9/gators/util/__init__.py rename to gators/feature_selection/tests/dask-worker-space/purge.lock diff --git a/gators/feature_selection/tests/test_correlation_filter.py b/gators/feature_selection/tests/test_correlation_filter.py deleted file mode 100644 index e7798f54..00000000 --- a/gators/feature_selection/tests/test_correlation_filter.py +++ /dev/null @@ -1,78 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_selection.correlation_filter import CorrelationFilter - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - max_corr = 0.8 - X = pd.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - - X_expected = X[["B", "D", "F"]].copy() - obj = CorrelationFilter(max_corr=max_corr).fit(X) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - max_corr = 0.8 - X = ks.DataFrame( - { - "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], - "B": [1, 1, 0, 1, 0, 0], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [3, 1, 2, 1, 2, 3], - } - ) - - X_expected = X[["B", "D", "F"]].to_pandas().copy() - obj = CorrelationFilter(max_corr=max_corr).fit(X) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(np.float64)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(np.float64)) - - -def test_init(): - with pytest.raises(TypeError): - _ = CorrelationFilter(max_corr="a") diff --git a/gators/feature_selection/tests/test_correlation_filter_dd.py b/gators/feature_selection/tests/test_correlation_filter_dd.py new file mode 100644 index 00000000..2b77da30 --- /dev/null +++ b/gators/feature_selection/tests/test_correlation_filter_dd.py @@ -0,0 +1,40 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.correlation_filter import CorrelationFilter + + +@pytest.fixture +def data(): + max_corr = 0.8 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ), + npartitions=1, + ) + X_expected = X[["B", "D", "F"]].compute().copy() + obj = CorrelationFilter(max_corr=max_corr).fit(X) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) diff --git a/gators/feature_selection/tests/test_correlation_filter_ks.py b/gators/feature_selection/tests/test_correlation_filter_ks.py new file mode 100644 index 00000000..4896ed24 --- /dev/null +++ b/gators/feature_selection/tests/test_correlation_filter_ks.py @@ -0,0 +1,41 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.correlation_filter import CorrelationFilter + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + max_corr = 0.8 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = X[["B", "D", "F"]].to_pandas().copy() + obj = CorrelationFilter(max_corr=max_corr).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) diff --git a/gators/feature_selection/tests/test_correlation_filter_pd.py b/gators/feature_selection/tests/test_correlation_filter_pd.py new file mode 100644 index 00000000..47413ce6 --- /dev/null +++ b/gators/feature_selection/tests/test_correlation_filter_pd.py @@ -0,0 +1,41 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.correlation_filter import CorrelationFilter + + +@pytest.fixture +def data(): + max_corr = 0.8 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = X[["B", "D", "F"]].copy() + obj = CorrelationFilter(max_corr=max_corr).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) + + +def test_init(): + with pytest.raises(TypeError): + _ = CorrelationFilter(max_corr="a") diff --git a/gators/feature_selection/tests/test_information_value.py b/gators/feature_selection/tests/test_information_value.py deleted file mode 100644 index b5982454..00000000 --- a/gators/feature_selection/tests/test_information_value.py +++ /dev/null @@ -1,86 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning.discretizer import Discretizer -from gators.feature_selection.information_value import InformationValue - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - k = 3 - n_bins = 4 - X = pd.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "B", "C"]].copy() - y = pd.Series([1, 1, 1, 0, 0, 0], name="TARGET") - discretizer = Discretizer(n_bins=n_bins) - obj = InformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - k = 3 - n_bins = 4 - X = ks.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "B", "C"]].to_pandas().copy() - y = ks.Series([1, 1, 1, 0, 0, 0], name="TARGET") - discretizer = Discretizer(n_bins=n_bins) - obj = InformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = InformationValue(k="a", discretizer=Discretizer(n_bins=3)) - with pytest.raises(TypeError): - _ = InformationValue(k=2, discretizer="a") diff --git a/gators/feature_selection/tests/test_information_value_dd.py b/gators/feature_selection/tests/test_information_value_dd.py new file mode 100644 index 00000000..c4e8b532 --- /dev/null +++ b/gators/feature_selection/tests/test_information_value_dd.py @@ -0,0 +1,41 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning.binning import Binning +from gators.feature_selection.information_value import InformationValue + + +@pytest.fixture +def data(): + k = 3 + X = dd.from_pandas( + pd.DataFrame( + { + "A": ["a", "b", "a", "b", "c", "b"], + "B": ["true", "true", "false", "true", "false", "false"], + "D": ["a", "b", "c", "d", "e", "f"], + "F": ["e", "f", "g", "e", "f", "g"], + } + ), + npartitions=1, + ) + X_expected = X[["A", "B", "F"]].compute().copy() + y = dd.from_pandas(pd.Series([1, 1, 1, 0, 0, 0], name="TARGET"), npartitions=1) + obj = InformationValue(k=k).fit(X, y) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/feature_selection/tests/test_information_value_ks.py b/gators/feature_selection/tests/test_information_value_ks.py new file mode 100644 index 00000000..90a86f9a --- /dev/null +++ b/gators/feature_selection/tests/test_information_value_ks.py @@ -0,0 +1,42 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning.binning import Binning +from gators.feature_selection.information_value import InformationValue + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + k = 3 + X = ps.DataFrame( + { + "A": ["a", "b", "a", "b", "c", "b"], + "B": ["true", "true", "false", "true", "false", "false"], + "D": ["a", "b", "c", "d", "e", "f"], + "F": ["e", "f", "g", "e", "f", "g"], + } + ) + X_expected = X[["A", "B", "F"]].to_pandas().copy() + y = ps.Series([1, 1, 1, 0, 0, 0], name="TARGET") + obj = InformationValue(k=k).fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_selection/tests/test_information_value_pd.py b/gators/feature_selection/tests/test_information_value_pd.py new file mode 100644 index 00000000..c7147197 --- /dev/null +++ b/gators/feature_selection/tests/test_information_value_pd.py @@ -0,0 +1,46 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.binning.binning import Binning +from gators.feature_selection.information_value import InformationValue + + +@pytest.fixture +def data(): + k = 3 + X = pd.DataFrame( + { + "A": ["a", "b", "a", "b", "c", "b"], + "B": ["true", "true", "false", "true", "false", "false"], + "D": ["a", "b", "c", "d", "e", "f"], + "F": ["e", "f", "g", "e", "f", "g"], + } + ) + X_expected = X[["A", "B", "F"]].copy() + y = pd.Series([1, 1, 1, 0, 0, 0], name="TARGET") + obj = InformationValue(k=k).fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_init(): + with pytest.raises(TypeError): + _ = InformationValue(k="a") + with pytest.raises(TypeError): + _ = InformationValue(k=2, regularization="a") + with pytest.raises(TypeError): + _ = InformationValue(k=2, max_iv="a") diff --git a/gators/feature_selection/tests/test_multiclass_information_value.py b/gators/feature_selection/tests/test_multiclass_information_value.py deleted file mode 100644 index c42b1875..00000000 --- a/gators/feature_selection/tests/test_multiclass_information_value.py +++ /dev/null @@ -1,88 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning.discretizer import Discretizer -from gators.feature_selection.multiclass_information_value import ( - MultiClassInformationValue, -) - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - k = 3 - n_bins = 4 - X = pd.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "B", "C"]].copy() - y = pd.Series([1, 1, 2, 2, 0, 0], name="TARGET") - discretizer = Discretizer(n_bins=n_bins) - obj = MultiClassInformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - k = 3 - n_bins = 4 - X = ks.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "B", "C"]].to_pandas().copy() - y = ks.Series([1, 1, 2, 2, 0, 0], name="TARGET") - discretizer = Discretizer(n_bins=n_bins) - obj = MultiClassInformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = MultiClassInformationValue(k="a", discretizer=3) - with pytest.raises(TypeError): - _ = MultiClassInformationValue(k=2, discretizer="a") diff --git a/gators/feature_selection/tests/test_regression_information_value.py b/gators/feature_selection/tests/test_regression_information_value.py deleted file mode 100644 index 24633507..00000000 --- a/gators/feature_selection/tests/test_regression_information_value.py +++ /dev/null @@ -1,88 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.binning.discretizer import Discretizer -from gators.feature_selection.regression_information_value import ( - RegressionInformationValue, -) - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - k = 3 - n_bins = 4 - X = pd.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "B", "C"]].copy() - y = pd.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name="TARGET") - discretizer = Discretizer(n_bins=n_bins) - obj = RegressionInformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - k = 3 - n_bins = 4 - X = ks.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [11.0, 22.0, 33.0, 44.0, 55.0, 66.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "B", "C"]].to_pandas().copy() - y = ks.Series([11.56, 9.57, 33.33, 87.6, 0.01, -65.0], name="TARGET") - discretizer = Discretizer(n_bins=n_bins) - obj = RegressionInformationValue(k=k, discretizer=discretizer).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_init(): - with pytest.raises(TypeError): - _ = RegressionInformationValue(k="a", discretizer=3) - with pytest.raises(TypeError): - _ = RegressionInformationValue(k=2, discretizer="a") diff --git a/gators/feature_selection/tests/test_select_from_model.py b/gators/feature_selection/tests/test_select_from_model.py deleted file mode 100644 index d25f2c39..00000000 --- a/gators/feature_selection/tests/test_select_from_model.py +++ /dev/null @@ -1,122 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal -from pyspark.ml.classification import RandomForestClassifier as RFCSpark -from xgboost import XGBClassifier - -from gators.feature_selection.select_from_model import SelectFromModel - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - "B": [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - } - ) - y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") - X_expected = X[["A", "B"]].copy() - model = XGBClassifier( - random_state=0, - subsample=1.0, - n_estimators=2, - max_depth=2, - eval_metric="logloss", - use_label_encoder=False, - ) - obj = SelectFromModel(model=model, k=2).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - } - ) - y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") - X_expected = X[["A"]].to_pandas().copy() - model = RFCSpark(numTrees=2, maxDepth=1, labelCol=y.name, seed=0) - obj = SelectFromModel(model=model, k=2).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_combined(): - X = ks.DataFrame( - { - "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - } - ) - y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") - X_expected = X[["A"]].to_pandas().copy() - model = XGBClassifier( - random_state=0, - subsample=1.0, - n_estimators=2, - max_depth=2, - eval_metric="logloss", - use_label_encoder=False, - ) - obj = SelectFromModel(model=model, k=2).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert X_expected.shape == X_new.shape - - -@pytest.mark.koalas -def test_ks_pd(data_combined): - obj, X, X_expected = data_combined - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert X_expected.shape == X_new.shape - - -def test_init(): - with pytest.raises(TypeError): - _ = SelectFromModel(model=XGBClassifier(), k="a") - - class Model: - pass - - with pytest.raises(TypeError): - _ = SelectFromModel(model=Model(), k=2) diff --git a/gators/feature_selection/tests/test_select_from_model_dd.py b/gators/feature_selection/tests/test_select_from_model_dd.py new file mode 100644 index 00000000..7e580342 --- /dev/null +++ b/gators/feature_selection/tests/test_select_from_model_dd.py @@ -0,0 +1,51 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from xgboost.dask import XGBClassifier +from distributed import Client + +from gators.feature_selection.select_from_model import SelectFromModel + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], + "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + } + ), + npartitions=1, + ) + y = dd.from_pandas( + pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET"), npartitions=1 + ) + X_expected = X[["A"]].compute().copy() + model = XGBClassifier( + random_state=0, + subsample=1.0, + n_estimators=2, + max_depth=2, + eval_metric="logloss", + use_label_encoder=False, + ) + model.client = Client() + obj = SelectFromModel(model=model, k=1).fit(X, y) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) diff --git a/gators/feature_selection/tests/test_select_from_model_ks.py b/gators/feature_selection/tests/test_select_from_model_ks.py new file mode 100644 index 00000000..ff28734e --- /dev/null +++ b/gators/feature_selection/tests/test_select_from_model_ks.py @@ -0,0 +1,42 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pyspark.ml.classification import RandomForestClassifier as RFCSpark + +from gators.feature_selection.select_from_model import SelectFromModel + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], + "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + } + ) + y = ps.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") + X_expected = X[["A"]].copy() + model = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) + obj = SelectFromModel(model=model, k=2).fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + X_new = X_new.to_pandas() + assert X_expected.shape == X_new.shape + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert X_expected.shape == X_new.shape diff --git a/gators/feature_selection/tests/test_select_from_model_pd.py b/gators/feature_selection/tests/test_select_from_model_pd.py new file mode 100644 index 00000000..c1a08d89 --- /dev/null +++ b/gators/feature_selection/tests/test_select_from_model_pd.py @@ -0,0 +1,55 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from xgboost import XGBClassifier + +from gators.feature_selection.select_from_model import SelectFromModel + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], + "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + } + ) + y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") + X_expected = X[["A"]].copy() + model = XGBClassifier( + random_state=0, + subsample=1.0, + n_estimators=2, + max_depth=2, + eval_metric="logloss", + use_label_encoder=False, + ) + obj = SelectFromModel(model=model, k=1).fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) + + +def test_init(): + with pytest.raises(TypeError): + _ = SelectFromModel(model=XGBClassifier(), k="a") + + class Model: + pass + + with pytest.raises(TypeError): + _ = SelectFromModel(model=Model(), k=2) diff --git a/gators/feature_selection/tests/test_select_from_models.py b/gators/feature_selection/tests/test_select_from_models.py deleted file mode 100644 index 7c6c8eba..00000000 --- a/gators/feature_selection/tests/test_select_from_models.py +++ /dev/null @@ -1,103 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal -from pyspark.ml.classification import RandomForestClassifier as RFCSpark -from xgboost import XGBClassifier, XGBRFClassifier - -from gators.feature_selection.select_from_models import SelectFromModels - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame( - { - "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - "B": [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - } - ) - y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") - X_expected = X[["A", "B"]].copy() - model1 = XGBClassifier( - random_state=0, - subsample=1.0, - n_estimators=2, - max_depth=2, - eval_metric="logloss", - use_label_encoder=False, - ) - model2 = XGBRFClassifier( - random_state=0, - subsample=1.0, - n_estimators=2, - max_depth=2, - eval_metric="logloss", - use_label_encoder=False, - ) - obj = SelectFromModels(models=[model1, model2], k=2).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame( - { - "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], - "B": [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], - "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - } - ) - y = ks.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") - X_expected = X[["A", "B"]].to_pandas().copy() - model1_ks = RFCSpark(numTrees=2, maxDepth=2, labelCol=y.name, seed=0) - mode2_ks = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) - obj = SelectFromModels(models=[model1_ks, mode2_ks], k=2).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(np.float64)) - - -def test_init(): - with pytest.raises(TypeError): - _ = SelectFromModels(models=0, k="a") - - with pytest.raises(TypeError): - _ = SelectFromModels(models=[XGBClassifier()], k="a") - - class Model: - pass - - with pytest.raises(TypeError): - _ = SelectFromModels(models=[Model()], k=2) diff --git a/gators/feature_selection/tests/test_select_from_models_dd.py b/gators/feature_selection/tests/test_select_from_models_dd.py new file mode 100644 index 00000000..10e2b04f --- /dev/null +++ b/gators/feature_selection/tests/test_select_from_models_dd.py @@ -0,0 +1,60 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from xgboost.dask import XGBClassifier +from distributed import Client + +from gators.feature_selection.select_from_models import SelectFromModels + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], + "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + } + ), + npartitions=1, + ) + y = dd.from_pandas( + pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET"), npartitions=1 + ) + X_expected = X[["A"]].compute().copy() + model1 = XGBClassifier( + random_state=0, + subsample=1.0, + n_estimators=2, + max_depth=2, + eval_metric="logloss", + use_label_encoder=False, + ) + model2 = XGBClassifier( + random_state=0, + subsample=1.0, + n_estimators=2, + max_depth=2, + eval_metric="logloss", + use_label_encoder=False, + ) + model1.client = Client() + model2.client = Client() + obj = SelectFromModels(models=[model1, model2], k=1).fit(X, y) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) diff --git a/gators/feature_selection/tests/test_select_from_models_ks.py b/gators/feature_selection/tests/test_select_from_models_ks.py new file mode 100644 index 00000000..a2d818ef --- /dev/null +++ b/gators/feature_selection/tests/test_select_from_models_ks.py @@ -0,0 +1,43 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from pyspark.ml.classification import RandomForestClassifier as RFCSpark + +from gators.feature_selection.select_from_models import SelectFromModels + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame( + { + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], + "B": [7.25, 71.28, 7.92, 53.1, 8.05, 8.46, 51.86, 21.08, 11.13, 30.07], + "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + } + ) + y = ps.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") + X_expected = X[["A", "B"]].to_pandas().copy() + model1_ks = RFCSpark(numTrees=2, maxDepth=2, labelCol=y.name, seed=0) + mode2_ks = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) + obj = SelectFromModels(models=[model1_ks, mode2_ks], k=2).fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) diff --git a/gators/feature_selection/tests/test_select_from_models_pd.py b/gators/feature_selection/tests/test_select_from_models_pd.py new file mode 100644 index 00000000..82c940b7 --- /dev/null +++ b/gators/feature_selection/tests/test_select_from_models_pd.py @@ -0,0 +1,66 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from xgboost import XGBClassifier, XGBRFClassifier + +from gators.feature_selection.select_from_models import SelectFromModels + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 28.11, 54.0, 2.0, 27.0, 14.0], + "B": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "C": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + } + ) + y = pd.Series([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], name="TARGET") + X_expected = X[["A"]].copy() + model1 = XGBClassifier( + random_state=0, + subsample=1.0, + n_estimators=2, + max_depth=2, + eval_metric="logloss", + use_label_encoder=False, + ) + model2 = XGBRFClassifier( + random_state=0, + subsample=1.0, + n_estimators=2, + max_depth=2, + eval_metric="logloss", + use_label_encoder=False, + ) + obj = SelectFromModels(models=[model1, model2], k=1).fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert_frame_equal(X_new, pd.DataFrame(X_expected.to_numpy())) + + +def test_init(): + with pytest.raises(TypeError): + _ = SelectFromModels(models=0, k="a") + + with pytest.raises(TypeError): + _ = SelectFromModels(models=[XGBClassifier()], k="a") + + class Model: + pass + + with pytest.raises(TypeError): + _ = SelectFromModels(models=[Model()], k=2) diff --git a/gators/feature_selection/tests/test_supervized_correlation_filter_dd.py b/gators/feature_selection/tests/test_supervized_correlation_filter_dd.py new file mode 100644 index 00000000..d6caa85c --- /dev/null +++ b/gators/feature_selection/tests/test_supervized_correlation_filter_dd.py @@ -0,0 +1,74 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.supervized_correlation_filter import ( + SupervizedCorrelationFilter, +) + + +# @pytest.fixture +# def data(): +# max_corr = 0.8 +# X = dd.from_pandas( +# pd.DataFrame( +# { +# "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], +# "B": [1, 1, 0, 1, 0, 0], +# "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], +# "F": [3, 1, 2, 1, 2, 3], +# } +# ), +# npartitions=1, +# ) +# X_expected = X[["A", "B", "D"]].compute() +# feature_importances = pd.Series({"A": 1, "B": 0.8, "D": 0.7, "F": 0.1}) +# obj = SupervizedCorrelationFilter( +# feature_importances=feature_importances, max_corr=max_corr +# ).fit(X) +# return obj, X, X_expected + + +# def test_dd(data): +# obj, X, X_expected = data +# X_new = obj.transform(X).compute() +# assert_frame_equal(X_new, X_expected) + + +# def test_dd_np(data): +# obj, X, X_expected = data +# X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) +# X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) +# assert_frame_equal(X_new, X_expected.astype(np.float64)) + + +# import dask.dataframe as dd +# import numpy as np +# import pandas as pd +# import pytest +# from pandas.testing import assert_frame_equal + +# from gators.feature_selection.supervized_correlation_filter import ( +# SupervizedCorrelationFilter, +# ) + +# max_corr = 0.8 +# X = dd.from_pandas( +# pd.DataFrame( +# { +# "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], +# "B": [1, 1, 0, 1, 0, 0], +# "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], +# "F": [3, 1, 2, 1, 2, 3], +# } +# ), +# npartitions=1, +# ) +# X_expected = X[["A", "B", "D"]] +# feature_importances = pd.Series({"A": 1, "B": 0.8, "D": 0.7, "F": 0.1}) +# obj = SupervizedCorrelationFilter( +# feature_importances=feature_importances, max_corr=max_corr +# ).fit(X) diff --git a/gators/feature_selection/tests/test_supervized_correlation_filter_ks.py b/gators/feature_selection/tests/test_supervized_correlation_filter_ks.py new file mode 100644 index 00000000..10706e70 --- /dev/null +++ b/gators/feature_selection/tests/test_supervized_correlation_filter_ks.py @@ -0,0 +1,46 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.supervized_correlation_filter import ( + SupervizedCorrelationFilter, +) + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + max_corr = 0.8 + X = ps.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = X[["A", "B", "D"]].to_pandas() + feature_importances = ps.Series({"A": 1, "B": 0.8, "D": 0.7, "F": 0.1}) + obj = SupervizedCorrelationFilter( + feature_importances=feature_importances, max_corr=max_corr + ).fit(X) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) diff --git a/gators/feature_selection/tests/test_supervized_correlation_filter_pd.py b/gators/feature_selection/tests/test_supervized_correlation_filter_pd.py new file mode 100644 index 00000000..200fbed9 --- /dev/null +++ b/gators/feature_selection/tests/test_supervized_correlation_filter_pd.py @@ -0,0 +1,82 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.supervized_correlation_filter import ( + SupervizedCorrelationFilter, +) + + +@pytest.fixture +def data(): + max_corr = 0.8 + X = pd.DataFrame( + { + "A": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = X[["A", "B", "D"]] + feature_importances = pd.Series({"A": 1, "B": 0.8, "D": 0.7, "F": 0.1}) + obj = SupervizedCorrelationFilter( + feature_importances=feature_importances, max_corr=max_corr + ).fit(X) + return obj, X, X_expected + + +@pytest.fixture +def data_(): + max_corr = 0.8 + X = pd.DataFrame( + { + "D": [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583], + "A": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "B": [1, 1, 0, 1, 0, 0], + "F": [3, 1, 2, 1, 2, 3], + } + ) + X_expected = X[["A", "B", "F"]] + feature_importances = pd.Series({"A": 1, "B": 0.7, "D": 0.1, "F": 0.1}) + obj = SupervizedCorrelationFilter( + feature_importances=feature_importances, max_corr=max_corr + ).fit(X) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) + + +def test_pd(data_): + obj, X, X_expected = data_ + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data_): + obj, X, X_expected = data_ + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected.astype(np.float64)) + + +def test_init(): + with pytest.raises(TypeError): + _ = SupervizedCorrelationFilter(feature_importances="a", max_corr="a") + with pytest.raises(TypeError): + _ = SupervizedCorrelationFilter( + feature_importances=pd.Series({"A": 0.1}), max_corr="a" + ) diff --git a/gators/feature_selection/tests/test_variance_filter.py b/gators/feature_selection/tests/test_variance_filter.py deleted file mode 100644 index a7d8c62f..00000000 --- a/gators/feature_selection/tests/test_variance_filter.py +++ /dev/null @@ -1,86 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.feature_selection.variance_filter import VarianceFilter - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - min_var = 2.0 - X = pd.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "C", "D"]].copy() - - y = pd.Series([1, 1, 1, 0, 0, 0]) - obj = VarianceFilter(min_var=min_var).fit(X, y) - return obj, X, X_expected - - -@pytest.fixture -def data_ks(): - min_var = 2.0 - X = ks.DataFrame( - { - "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], - "B": [1, 1, 0, 1, 0, 0], - "C": ["a", "b", "b", "b", "a", "a"], - "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], - "F": [1, 2, 3, 1, 2, 4], - } - ) - X_expected = X[["A", "C", "D"]].to_pandas().copy() - y = ks.Series([1, 1, 1, 0, 0, 0]) - obj = VarianceFilter(min_var=min_var).fit(X, y) - return obj, X, X_expected - - -def test_pd(data): - obj, X, X_expected = data - X_new = obj.transform(X) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, X_expected = data_ks - X_new = obj.transform(X) - X_new = X_new.to_pandas() - assert_frame_equal(X_new, X_expected) - - -def test_pd_np(data): - obj, X, X_expected = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X, X_expected = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_empty_drop_columns(data): - obj, X, X_expected = data - obj.columns_to_drop = [] - assert_frame_equal(obj.transform(X), X) - - -def test_init(): - with pytest.raises(TypeError): - _ = VarianceFilter(min_var="a") diff --git a/gators/feature_selection/tests/test_variance_filter_dd.py b/gators/feature_selection/tests/test_variance_filter_dd.py new file mode 100644 index 00000000..cf9e17cd --- /dev/null +++ b/gators/feature_selection/tests/test_variance_filter_dd.py @@ -0,0 +1,46 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.variance_filter import VarianceFilter + + +@pytest.fixture +def data(): + min_var = 2.0 + X = dd.from_pandas( + pd.DataFrame( + { + "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [1, 2, 3, 1, 2, 4], + } + ), + npartitions=1, + ) + X_expected = X[["A", "D"]].copy().compute() + y = dd.from_pandas(pd.Series([1, 1, 1, 0, 0, 0]), npartitions=1) + obj = VarianceFilter(min_var=min_var).fit(X, y) + return obj, X, X_expected + + +def test_dd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_dd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_empty_drop_columns(data): + obj, X, _ = data + obj.columns_to_drop = [] + assert_frame_equal(obj.transform(X).compute(), X.compute()) diff --git a/gators/feature_selection/tests/test_variance_filter_ks.py b/gators/feature_selection/tests/test_variance_filter_ks.py new file mode 100644 index 00000000..2f9ba66f --- /dev/null +++ b/gators/feature_selection/tests/test_variance_filter_ks.py @@ -0,0 +1,41 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.variance_filter import VarianceFilter + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + min_var = 2.0 + X = ps.DataFrame( + { + "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [1, 2, 3, 1, 2, 4], + } + ) + X_expected = X[["A", "D"]].copy().to_pandas() + y = ps.Series([1, 1, 1, 0, 0, 0]) + obj = VarianceFilter(min_var=min_var).fit(X, y) + return obj, X, X_expected + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, X_expected = data_ks + X_new = obj.transform(X) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X, X_expected = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/feature_selection/tests/test_variance_filter_pd.py b/gators/feature_selection/tests/test_variance_filter_pd.py new file mode 100644 index 00000000..1e5e89f4 --- /dev/null +++ b/gators/feature_selection/tests/test_variance_filter_pd.py @@ -0,0 +1,65 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.feature_selection.variance_filter import VarianceFilter + + +@pytest.fixture +def data(): + min_var = 2.0 + X = pd.DataFrame( + { + "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], + "B": [1, 1, 0, 1, 0, 0], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [1, 2, 3, 1, 2, 4], + } + ) + X_expected = X[["A", "D"]].copy() + y = pd.Series([1, 1, 1, 0, 0, 0]) + obj = VarianceFilter(min_var=min_var).fit(X, y) + return obj, X, X_expected + + +@pytest.fixture +def data_ks(): + min_var = 2.0 + X = ps.DataFrame( + { + "A": [87.25, 5.25, 70.25, 5.25, 0.25, 7.25], + "B": [1, 1, 0, 1, 0, 0], + "C": ["a", "b", "b", "b", "a", "a"], + "D": [22.0, 38.0, 26.0, 35.0, 35.0, 31.2], + "F": [1, 2, 3, 1, 2, 4], + } + ) + X_expected = X[["A", "C", "D"]].to_pandas().copy() + y = ps.Series([1, 1, 1, 0, 0, 0]) + obj = VarianceFilter(min_var=min_var).fit(X, y) + return obj, X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_empty_drop_columns(data): + obj, X, X_expected = data + obj.columns_to_drop = [] + assert_frame_equal(obj.transform(X), X) + + +def test_init(): + with pytest.raises(TypeError): + _ = VarianceFilter(min_var="a") diff --git a/gators/feature_selection/variance_filter.py b/gators/feature_selection/variance_filter.py index 229be4c0..e1d433f8 100644 --- a/gators/feature_selection/variance_filter.py +++ b/gators/feature_selection/variance_filter.py @@ -1,12 +1,11 @@ # License: Apache-2.0 -from typing import Union -import databricks.koalas as ks -import pandas as pd from ..util import util from ._base_feature_selection import _BaseFeatureSelection +from gators import DataFrame, Series + class VarianceFilter(_BaseFeatureSelection): """Remove low variance columns. @@ -18,58 +17,43 @@ class VarianceFilter(_BaseFeatureSelection): Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.feature_selection import VarianceFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) >>> obj = VarianceFilter(min_var=0.9) - >>> obj.fit_transform(X) - B - 0 1.0 - 1 2.0 - 2 3.0 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.feature_selection import VarianceFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) >>> obj.fit_transform(X) B 0 1.0 1 2.0 2 3.0 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.feature_selection import VarianceFilter - >>> X = pd.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) + >>> X = pd.DataFrame({'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[1.], [2.], [3.]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.feature_selection import VarianceFilter - >>> X = ks.DataFrame( - ... {'A': [0., 0., 0.1], 'B': [1., 2., 3.], 'C': [0., 0., 0.15]}) - >>> obj = VarianceFilter(min_var=0.9) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.], - [2.], - [3.]]) - """ def __init__(self, min_var: float): @@ -78,30 +62,26 @@ def __init__(self, min_var: float): _BaseFeatureSelection.__init__(self) self.min_var = min_var - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "VarianceFilter": + def fit(self, X: DataFrame, y: Series = None) -> "VarianceFilter": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. - + y : Series, default None. + Target values. Returns ------- - VarianceFilter: Instance of itself. + self : "VarianceFilter" + Instance of itself. """ self.check_dataframe(X) numerical_columns = util.get_numerical_columns(X) - self.feature_importances_ = X[numerical_columns].var() - if isinstance(self.feature_importances_, ks.Series): - self.feature_importances_ = self.feature_importances_.to_pandas() - mask = self.feature_importances_ < self.min_var + self.feature_importances_ = util.get_function(X).to_pandas( + X[numerical_columns].var() + ) + mask = self.feature_importances_ <= self.min_var self.columns_to_drop = list(self.feature_importances_.index[mask]) self.selected_columns = util.exclude_columns(X.columns, self.columns_to_drop) self.idx_selected_columns = util.get_idx_columns( diff --git a/gators/imputers/.gitignore b/gators/imputers/.gitignore deleted file mode 100644 index a81c8ee1..00000000 --- a/gators/imputers/.gitignore +++ /dev/null @@ -1,138 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ diff --git a/gators/imputers/__init__.py b/gators/imputers/__init__.py index c6ed89b6..0cc76537 100644 --- a/gators/imputers/__init__.py +++ b/gators/imputers/__init__.py @@ -1,13 +1,9 @@ from ._base_imputer import _BaseImputer -from .float_imputer import FloatImputer -from .int_imputer import IntImputer -from .numerics_imputer import NumericsImputer +from .numeric_imputer import NumericImputer from .object_imputer import ObjectImputer __all__ = [ "_BaseImputer", - "FloatImputer", - "IntImputer", - "NumericsImputer", + "NumericImputer", "ObjectImputer", ] diff --git a/gators/imputers/_base_imputer.py b/gators/imputers/_base_imputer.py index 05cd2be4..b3fffcbc 100644 --- a/gators/imputers/_base_imputer.py +++ b/gators/imputers/_base_imputer.py @@ -1,11 +1,13 @@ # License: Apache-2.0 from typing import Dict, List, Union -import databricks.koalas as ks import numpy as np import pandas as pd from ..transformers.transformer import Transformer +from ..util import util + +from gators import DataFrame, Series class _BaseImputer(Transformer): @@ -21,15 +23,21 @@ class _BaseImputer(Transformer): * mean (only for the FloatImputer class) * median (only for the FloatImputer class) - value (Union[float, str, None]): Imputation value, default to None. + value (Union[float, str, None]) : Imputation value, default None. used for `strategy=constant`. - columns: List[str], default to None. + columns : List[float], default None. List of columns. - + inplace : bool, default True. + If True, impute in-place. + If False, create new imputed columns. """ def __init__( - self, strategy: str, value: Union[float, str, None], columns: List[str] + self, + strategy: str, + value: Union[float, str, None], + columns: List[str], + inplace: bool = True, ): if not isinstance(strategy, str): raise TypeError("`strategy` should be a string.") @@ -39,79 +47,76 @@ def __init__( raise ValueError("Imputation `strategy` not implemented.") if not isinstance(columns, list) and columns is not None: raise TypeError("`columns` should be a list or None.") - + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") Transformer.__init__(self) self.strategy = strategy self.value = value self.columns = columns + self.inplace = inplace + self.column_names = [] self.statistics: Dict = {} - self.statistics_values: np.ndarray = None + self.statistics_np: np.ndarray = None self.idx_columns: np.ndarray = None - self.X_dtypes: Union[pd.Series, ks.Series] = None + self.X_dtypes: Series = None - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - return X.fillna(self.statistics) - for col, val in self.statistics.items(): - X[col] = X[col].fillna(val) - return X + self.column_names = self.get_column_names(self.inplace, self.columns, "impute") + X_impute = util.get_function(X).fillna(X, value=self.statistics) + if self.inplace: + return X_impute + X_impute = X_impute[self.columns].rename( + columns=dict(zip(self.columns, self.column_names)) + ) + return X.join(X_impute) - @staticmethod def compute_statistics( - X: Union[pd.DataFrame, ks.DataFrame], - columns: List[str], - strategy: str, - value: Union[float, int, str, None], + self, X: DataFrame, value: Union[float, int, str, None] ) -> Dict[str, Union[float, int, str]]: """Compute the imputation values. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe used to compute the imputation values. - columns : List[str] - Columns to consider. - strategy : str - Imputation strategy. + X : DataFrame + Dataframe. used to compute the imputation values. value : Union[float, int, str, None] Value used for imputation. Returns ------- - Dict[str, Union[float, int, str]] + statistics : Dict[str, Union[float, int, str]] Imputation value mapping. """ - if strategy == "mean": - statistics = X[columns].astype(np.float64).mean().to_dict() - elif strategy == "median": - statistics = X[columns].astype(np.float64).median().to_dict() - elif strategy == "most_frequent": - values = [X[c].value_counts().index.to_numpy()[0] for c in columns] - statistics = dict(zip(columns, values)) - else: # strategy == 'constant' - values = len(columns) * [value] - statistics = dict(zip(columns, values)) + + if self.strategy == "mean": + statistics = util.get_function(X).to_dict(X[self.columns].mean()) + elif self.strategy == "median": + statistics = util.get_function(X).to_dict(X[self.columns].median()) + elif self.strategy == "most_frequent": + statistics = util.get_function(X).most_frequent(X[self.columns]) + elif self.strategy == "constant": + statistics = dict(zip(self.columns, len(self.columns) * [value])) + if pd.Series(statistics).isnull().sum(): raise ValueError( """Some columns contains only NaN values and the imputation values cannot be calculated. Remove these columns before performing the imputation - (e.g. with `gators.data_cleaning.drop_high_nan_ratio()`).""" + (e.g. with `gators.data_cleaning.drop_high_nan_ratio(max_ratio=0.99)`).""" ) + return statistics diff --git a/gators/imputers/float_imputer.py b/gators/imputers/float_imputer.py deleted file mode 100644 index 394a9a4a..00000000 --- a/gators/imputers/float_imputer.py +++ /dev/null @@ -1,194 +0,0 @@ -# License: Apache-2.0 -import warnings -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd -from imputer import float_imputer, float_imputer_object - -from ..util import util -from ._base_imputer import _BaseImputer - - -class FloatImputer(_BaseImputer): - """Impute the numerical columns satisfying the condition X != X.round() - using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'mean' - - 'median' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - columns: List[str], default to None. - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> obj.fit_transform(X) - A B - 0 0.10 z - 1 0.20 a - 2 0.15 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> obj.fit_transform(X) - A B - 0 0.1 z - 1 0.2 a - 2 0.1 a - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.15000000000000002, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import FloatImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = FloatImputer(strategy='median') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.1, 'a']], dtype=object) - - See Also - -------- - gators.imputers.IntImputer - Impute integer columns. - gators.imputers.NumericsImputer - Impute numerical columns. - gators.imputers.ObjectImputer - Impute categorical columns. - - """ - - def __init__(self, strategy: str, value: float = None, columns: List[str] = None): - _BaseImputer.__init__(self, strategy, value, columns) - if strategy not in ["constant", "mean", "median"]: - raise ValueError( - """`strategy` should be "constant", ,"mean" - or "median" for FloatImputer Transformer.""" - ) - if strategy == "constant" and not isinstance(value, float): - raise TypeError( - """`value` should be a float - for the FloatImputer class""" - ) - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "FloatImputer": - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - 'FloatImputer': Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_float_only_columns(X=X) - if not self.columns: - warnings.warn( - """`X` does not contain columns satisfying: - X[column] != X[column].round(), - `FloatImputer` is not needed""" - ) - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array(list(self.statistics.values())) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - return X.fillna(self.statistics) - for col, val in self.statistics.items(): - X[col] = X[col].replace({np.nan: val}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: - Transformed NumPy array. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if X.dtype == object: - return float_imputer_object( - X, self.statistics_values.astype(object), self.idx_columns - ) - return float_imputer(X, self.statistics_values, self.idx_columns) diff --git a/gators/imputers/imputer.c b/gators/imputers/imputer.c new file mode 100644 index 00000000..0479d51e --- /dev/null +++ b/gators/imputers/imputer.c @@ -0,0 +1,32556 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "imputer", + "sources": [ + "gators/imputers/imputer.pyx" + ] + }, + "module_name": "imputer" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__imputer +#define __PYX_HAVE_API__imputer +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#include +#include "pythread.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/imputers/imputer.pyx", + "", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS +#define __pyx_atomic_int_type int +#define __pyx_nonatomic_int_type int +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__)) + #include +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ + (defined(_MSC_VER) && _MSC_VER >= 1700))) + #include +#endif +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type atomic_int + #define __pyx_atomic_incr_aligned(value) atomic_fetch_add_explicit(value, 1, memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) atomic_fetch_sub_explicit(value, 1, memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C atomics" + #endif +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ +\ + (defined(_MSC_VER) && _MSC_VER >= 1700)) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type std::atomic_int + #define __pyx_atomic_incr_aligned(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) std::atomic_fetch_sub_explicit(value, 1, std::memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C++ atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C++ atomics" + #endif +#elif CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 &&\ + (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2)))) + #define __pyx_atomic_incr_aligned(value) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type long + #undef __pyx_nonatomic_int_type + #define __pyx_nonatomic_int_type long + #pragma intrinsic (_InterlockedExchangeAdd) + #define __pyx_atomic_incr_aligned(value) _InterlockedExchangeAdd(value, 1) + #define __pyx_atomic_decr_aligned(value) _InterlockedExchangeAdd(value, -1) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview)) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview)) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_defaults; +typedef struct __pyx_defaults __pyx_defaults; +struct __pyx_defaults { + PyObject *__pyx_arg__fused_sigindex; +}; + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":302 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int_type acquisition_count; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); + PyObject *(*_get_base)(struct __pyx_memoryview_obj *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* BuildPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char); + +/* JoinPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* PyObjectFormatSimple.proto */ +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#elif PY_MAJOR_VERSION < 3 + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") :\ + PyObject_Format(s, f)) +#elif CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_repr(s) :\ + likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_repr(s) :\ + PyObject_Format(s, f)) +#else + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#endif + +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* DivInt[Py_ssize_t].proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define __Pyx_UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* AssertionsEnabled.proto */ +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (1) +#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) + static int __pyx_assertions_enabled_flag; + #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) + static int __Pyx_init_assertions_enabled(void) { + PyObject *builtins, *debug, *debug_str; + int flag; + builtins = PyEval_GetBuiltins(); + if (!builtins) goto bad; + debug_str = PyUnicode_FromStringAndSize("__debug__", 9); + if (!debug_str) goto bad; + debug = PyObject_GetItem(builtins, debug_str); + Py_DECREF(debug_str); + if (!debug) goto bad; + flag = PyObject_IsTrue(debug); + Py_DECREF(debug); + if (flag == -1) goto bad; + __pyx_assertions_enabled_flag = flag; + return 0; + bad: + __pyx_assertions_enabled_flag = 1; + return -1; + } +#else + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (!Py_OptimizeFlag) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* PySequenceMultiply.proto */ +#define __Pyx_PySequence_Multiply_Left(mul, seq) __Pyx_PySequence_Multiply(seq, mul) +static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul); + +/* SetItemInt.proto */ +#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, + int is_list, int wraparound, int boundscheck); + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* DivInt[long].proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 +#define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) +#else +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); +#endif + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_itemsize(o) PyMemoryView_GET_BUFFER(o)->itemsize +#else + // can't get format like this unfortunately. It's unicode via getattr +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj); +#endif + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_ndim(o) PyMemoryView_GET_BUFFER(o)->ndim +#else + // can't get format like this unfortunately. It's unicode via getattr +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj); +#endif + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* py_dict_values.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d); + +/* UnpackUnboundCMethod.proto */ +typedef struct { + PyObject *type; + PyObject **method_name; + PyCFunction func; + PyObject *method; + int flag; +} __Pyx_CachedCFunction; + +/* CallUnboundCMethod0.proto */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CallUnboundCMethod0(cfunc, self)\ + (likely((cfunc)->func) ?\ + (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) :\ + (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\ + (PY_VERSION_HEX >= 0x030700A0 ?\ + (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\ + (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\ + (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\ + ((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, __pyx_empty_tuple) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)) +#else +#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self) +#endif + +/* dict_getitem_default.proto */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); + +/* CallUnboundCMethod1.proto */ +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#else +#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg) +#endif + +/* CallUnboundCMethod2.proto */ +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2); +#else +#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2) __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* FusedFunction.proto */ +typedef struct { + __pyx_CyFunctionObject func; + PyObject *__signatures__; + PyObject *self; +} __pyx_FusedFunctionObject; +static PyObject *__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code); +static int __pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self); +static int __pyx_FusedFunction_init(PyObject *module); +#define __Pyx_FusedFunction_USED + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *, int writable_flag); + +/* PyUCS4InUnicode.proto */ +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (&memview->acquisition_count) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XCLEAR_MEMVIEW(slice, have_gil) __Pyx_XCLEAR_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* ImportNumPyArray.proto */ +static PyObject *__pyx_numpy_ndarray = NULL; +static PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "libc.math" */ + +/* Module declarations from "imputer" */ +static PyObject *__pyx_collections_abc_Sequence = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static PyArrayObject *__pyx_f_7imputer_object_imputer(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7imputer_float_imputer(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7imputer_float_imputer(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static int assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, PyObject *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, PyObject *); /*proto*/ +static int __pyx_memoryview_err_no_memory(void); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_object = { "Python object", NULL, sizeof(PyObject *), { 0 }, 0, 'O', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', __PYX_IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t = { "float32_t", NULL, sizeof(__pyx_t_5numpy_float32_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "imputer" +extern int __pyx_module_is_main_imputer; +int __pyx_module_is_main_imputer = 0; + +/* Implementation of "imputer" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin___import__; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_AssertionError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = ": "; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_X[] = "X"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_s[] = "s"; +static const char __pyx_k__2[] = "."; +static const char __pyx_k__3[] = "*"; +static const char __pyx_k__6[] = "'"; +static const char __pyx_k__7[] = ")"; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k__11[] = "()"; +static const char __pyx_k__12[] = "|"; +static const char __pyx_k__32[] = "?"; +static const char __pyx_k_abc[] = "abc"; +static const char __pyx_k_and[] = " and "; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_got[] = " (got "; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_kind[] = "kind"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_count[] = "count"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_index[] = "index"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_split[] = "split"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_strip[] = "strip"; +static const char __pyx_k_enable[] = "enable"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_kwargs[] = "kwargs"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_values[] = "values"; +static const char __pyx_k_disable[] = "disable"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_imputer[] = "imputer"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_Sequence[] = "Sequence"; +static const char __pyx_k_defaults[] = "defaults"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_register[] = "register"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_float32_t[] = "float32_t"; +static const char __pyx_k_float64_t[] = "float64_t"; +static const char __pyx_k_isenabled[] = "isenabled"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_signatures[] = "signatures"; +static const char __pyx_k_statistics[] = "statistics"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_collections[] = "collections"; +static const char __pyx_k_idx_columns[] = "idx_columns"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = ""; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_class_getitem[] = "__class_getitem__"; +static const char __pyx_k_float_imputer[] = "float_imputer"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_AssertionError[] = "AssertionError"; +static const char __pyx_k_fused_sigindex[] = "_fused_sigindex"; +static const char __pyx_k_object_imputer[] = "object_imputer"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_collections_abc[] = "collections.abc"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_Invalid_shape_in_axis[] = "Invalid shape in axis "; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_Cannot_index_with_type[] = "Cannot index with type '"; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_pyx_fuse_0float_imputer[] = "__pyx_fuse_0float_imputer"; +static const char __pyx_k_pyx_fuse_1float_imputer[] = "__pyx_fuse_1float_imputer"; +static const char __pyx_k_Dimension_d_is_not_direct[] = "Dimension %d is not direct"; +static const char __pyx_k_Index_out_of_bounds_axis_d[] = "Index out of bounds (axis %d)"; +static const char __pyx_k_No_matching_signature_found[] = "No matching signature found"; +static const char __pyx_k_Step_may_not_be_zero_axis_d[] = "Step may not be zero (axis %d)"; +static const char __pyx_k_gators_imputers_imputer_pyx[] = "gators/imputers/imputer.pyx"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_All_dimensions_preceding_dimensi[] = "All dimensions preceding dimension %d must be indexed and not sliced"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Cannot_transpose_memoryview_with[] = "Cannot transpose memoryview with indirect dimensions"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Expected_at_least_d_argument_s_g[] = "Expected at least %d argument%s, got %d"; +static const char __pyx_k_Function_call_with_ambiguous_arg[] = "Function call with ambiguous argument types"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got "; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis "; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension "; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +/* #### Code section: decls ### */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_7imputer_object_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics, PyArrayObject *__pyx_v_idx_columns); /* proto */ +static PyObject *__pyx_pf_7imputer_2float_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_7imputer_4__pyx_fuse_0float_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics); /* proto */ +static PyObject *__pyx_pf_7imputer_6__pyx_fuse_1float_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, 0, 0, 0, 0}; +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_values = {0, 0, 0, 0, 0}; +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type___pyx_array; + PyObject *__pyx_type___pyx_MemviewEnum; + PyObject *__pyx_type___pyx_memoryview; + PyObject *__pyx_type___pyx_memoryviewslice; + #endif + PyTypeObject *__pyx_array_type; + PyTypeObject *__pyx_MemviewEnum_type; + PyTypeObject *__pyx_memoryview_type; + PyTypeObject *__pyx_memoryviewslice_type; + PyObject *__pyx_kp_u_; + PyObject *__pyx_n_s_ASCII; + PyObject *__pyx_kp_s_All_dimensions_preceding_dimensi; + PyObject *__pyx_n_s_AssertionError; + PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; + PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; + PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; + PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; + PyObject *__pyx_kp_u_Cannot_index_with_type; + PyObject *__pyx_kp_s_Cannot_transpose_memoryview_with; + PyObject *__pyx_kp_s_Dimension_d_is_not_direct; + PyObject *__pyx_n_s_Ellipsis; + PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; + PyObject *__pyx_kp_s_Expected_at_least_d_argument_s_g; + PyObject *__pyx_kp_s_Function_call_with_ambiguous_arg; + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + PyObject *__pyx_n_s_IndexError; + PyObject *__pyx_kp_s_Index_out_of_bounds_axis_d; + PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; + PyObject *__pyx_kp_u_Invalid_mode_expected_c_or_fortr; + PyObject *__pyx_kp_u_Invalid_shape_in_axis; + PyObject *__pyx_n_s_MemoryError; + PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; + PyObject *__pyx_kp_s_MemoryView_of_r_object; + PyObject *__pyx_kp_s_No_matching_signature_found; + PyObject *__pyx_n_b_O; + PyObject *__pyx_kp_u_Out_of_bounds_on_buffer_access_a; + PyObject *__pyx_n_s_PickleError; + PyObject *__pyx_n_s_Sequence; + PyObject *__pyx_kp_s_Step_may_not_be_zero_axis_d; + PyObject *__pyx_n_s_TypeError; + PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; + PyObject *__pyx_n_s_ValueError; + PyObject *__pyx_n_s_View_MemoryView; + PyObject *__pyx_n_s_X; + PyObject *__pyx_kp_s__11; + PyObject *__pyx_kp_s__12; + PyObject *__pyx_kp_u__12; + PyObject *__pyx_kp_u__2; + PyObject *__pyx_n_s__3; + PyObject *__pyx_n_s__32; + PyObject *__pyx_kp_u__6; + PyObject *__pyx_kp_u__7; + PyObject *__pyx_n_s_abc; + PyObject *__pyx_n_s_allocate_buffer; + PyObject *__pyx_kp_u_and; + PyObject *__pyx_n_s_args; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_base; + PyObject *__pyx_n_s_c; + PyObject *__pyx_n_u_c; + PyObject *__pyx_n_s_class; + PyObject *__pyx_n_s_class_getitem; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_collections; + PyObject *__pyx_kp_s_collections_abc; + PyObject *__pyx_kp_s_contiguous_and_direct; + PyObject *__pyx_kp_s_contiguous_and_indirect; + PyObject *__pyx_n_s_count; + PyObject *__pyx_n_s_defaults; + PyObject *__pyx_n_s_dict; + PyObject *__pyx_kp_u_disable; + PyObject *__pyx_n_s_dtype; + PyObject *__pyx_n_s_dtype_is_object; + PyObject *__pyx_kp_u_enable; + PyObject *__pyx_n_s_encode; + PyObject *__pyx_n_s_enumerate; + PyObject *__pyx_n_s_error; + PyObject *__pyx_n_s_flags; + PyObject *__pyx_n_s_float32_t; + PyObject *__pyx_n_s_float64_t; + PyObject *__pyx_n_s_float_imputer; + PyObject *__pyx_n_s_format; + PyObject *__pyx_n_s_fortran; + PyObject *__pyx_n_u_fortran; + PyObject *__pyx_n_s_fused_sigindex; + PyObject *__pyx_kp_s_gators_imputers_imputer_pyx; + PyObject *__pyx_kp_u_gc; + PyObject *__pyx_n_s_get; + PyObject *__pyx_n_s_getstate; + PyObject *__pyx_kp_u_got; + PyObject *__pyx_kp_u_got_differing_extents_in_dimensi; + PyObject *__pyx_n_s_id; + PyObject *__pyx_n_s_idx_columns; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_imputer; + PyObject *__pyx_n_s_index; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_kp_u_isenabled; + PyObject *__pyx_n_s_itemsize; + PyObject *__pyx_kp_s_itemsize_0_for_cython_array; + PyObject *__pyx_n_s_kind; + PyObject *__pyx_n_s_kwargs; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_memview; + PyObject *__pyx_n_s_mode; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_name_2; + PyObject *__pyx_n_s_ndim; + PyObject *__pyx_n_s_new; + PyObject *__pyx_kp_s_no_default___reduce___due_to_non; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_obj; + PyObject *__pyx_n_s_object_imputer; + PyObject *__pyx_n_s_pack; + PyObject *__pyx_n_s_pickle; + PyObject *__pyx_n_s_pyx_PickleError; + PyObject *__pyx_n_s_pyx_checksum; + PyObject *__pyx_n_s_pyx_fuse_0float_imputer; + PyObject *__pyx_n_s_pyx_fuse_1float_imputer; + PyObject *__pyx_n_s_pyx_result; + PyObject *__pyx_n_s_pyx_state; + PyObject *__pyx_n_s_pyx_type; + PyObject *__pyx_n_s_pyx_unpickle_Enum; + PyObject *__pyx_n_s_pyx_vtable; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_reduce; + PyObject *__pyx_n_s_reduce_cython; + PyObject *__pyx_n_s_reduce_ex; + PyObject *__pyx_n_s_register; + PyObject *__pyx_n_s_s; + PyObject *__pyx_n_s_setstate; + PyObject *__pyx_n_s_setstate_cython; + PyObject *__pyx_n_s_shape; + PyObject *__pyx_n_s_signatures; + PyObject *__pyx_n_s_size; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_split; + PyObject *__pyx_n_s_start; + PyObject *__pyx_n_s_statistics; + PyObject *__pyx_n_s_step; + PyObject *__pyx_n_s_stop; + PyObject *__pyx_kp_s_strided_and_direct; + PyObject *__pyx_kp_s_strided_and_direct_or_indirect; + PyObject *__pyx_kp_s_strided_and_indirect; + PyObject *__pyx_kp_s_stringsource; + PyObject *__pyx_n_s_strip; + PyObject *__pyx_n_s_struct; + PyObject *__pyx_n_s_sys; + PyObject *__pyx_n_s_test; + PyObject *__pyx_kp_s_unable_to_allocate_array_data; + PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; + PyObject *__pyx_n_s_unpack; + PyObject *__pyx_n_s_update; + PyObject *__pyx_n_s_values; + PyObject *__pyx_n_s_version_info; + PyObject *__pyx_int_0; + PyObject *__pyx_int_1; + PyObject *__pyx_int_2; + PyObject *__pyx_int_3; + PyObject *__pyx_int_112105877; + PyObject *__pyx_int_136983863; + PyObject *__pyx_int_184977713; + PyObject *__pyx_int_neg_1; + PyObject *__pyx_slice__5; + PyObject *__pyx_tuple__4; + PyObject *__pyx_tuple__8; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__10; + PyObject *__pyx_tuple__13; + PyObject *__pyx_tuple__14; + PyObject *__pyx_tuple__15; + PyObject *__pyx_tuple__16; + PyObject *__pyx_tuple__17; + PyObject *__pyx_tuple__18; + PyObject *__pyx_tuple__19; + PyObject *__pyx_tuple__20; + PyObject *__pyx_tuple__21; + PyObject *__pyx_tuple__22; + PyObject *__pyx_tuple__23; + PyObject *__pyx_tuple__24; + PyObject *__pyx_tuple__26; + PyObject *__pyx_tuple__28; + PyObject *__pyx_codeobj__25; + PyObject *__pyx_codeobj__27; + PyObject *__pyx_codeobj__29; + PyObject *__pyx_codeobj__30; + PyObject *__pyx_codeobj__31; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_array_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_array); + Py_CLEAR(clear_module_state->__pyx_MemviewEnum_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_MemviewEnum); + Py_CLEAR(clear_module_state->__pyx_memoryview_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryview); + Py_CLEAR(clear_module_state->__pyx_memoryviewslice_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryviewslice); + Py_CLEAR(clear_module_state->__pyx_kp_u_); + Py_CLEAR(clear_module_state->__pyx_n_s_ASCII); + Py_CLEAR(clear_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_CLEAR(clear_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_CLEAR(clear_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_CLEAR(clear_module_state->__pyx_n_s_Ellipsis); + Py_CLEAR(clear_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_CLEAR(clear_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_n_s_IndexError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_CLEAR(clear_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_CLEAR(clear_module_state->__pyx_kp_s_No_matching_signature_found); + Py_CLEAR(clear_module_state->__pyx_n_b_O); + Py_CLEAR(clear_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_Sequence); + Py_CLEAR(clear_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); + Py_CLEAR(clear_module_state->__pyx_n_s_View_MemoryView); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_kp_s__11); + Py_CLEAR(clear_module_state->__pyx_kp_s__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__2); + Py_CLEAR(clear_module_state->__pyx_n_s__3); + Py_CLEAR(clear_module_state->__pyx_n_s__32); + Py_CLEAR(clear_module_state->__pyx_kp_u__6); + Py_CLEAR(clear_module_state->__pyx_kp_u__7); + Py_CLEAR(clear_module_state->__pyx_n_s_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_allocate_buffer); + Py_CLEAR(clear_module_state->__pyx_kp_u_and); + Py_CLEAR(clear_module_state->__pyx_n_s_args); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_base); + Py_CLEAR(clear_module_state->__pyx_n_s_c); + Py_CLEAR(clear_module_state->__pyx_n_u_c); + Py_CLEAR(clear_module_state->__pyx_n_s_class); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_collections); + Py_CLEAR(clear_module_state->__pyx_kp_s_collections_abc); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_CLEAR(clear_module_state->__pyx_n_s_count); + Py_CLEAR(clear_module_state->__pyx_n_s_defaults); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype_is_object); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_encode); + Py_CLEAR(clear_module_state->__pyx_n_s_enumerate); + Py_CLEAR(clear_module_state->__pyx_n_s_error); + Py_CLEAR(clear_module_state->__pyx_n_s_flags); + Py_CLEAR(clear_module_state->__pyx_n_s_float32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_float64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_float_imputer); + Py_CLEAR(clear_module_state->__pyx_n_s_format); + Py_CLEAR(clear_module_state->__pyx_n_s_fortran); + Py_CLEAR(clear_module_state->__pyx_n_u_fortran); + Py_CLEAR(clear_module_state->__pyx_n_s_fused_sigindex); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_imputers_imputer_pyx); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_kp_u_got); + Py_CLEAR(clear_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_id); + Py_CLEAR(clear_module_state->__pyx_n_s_idx_columns); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_imputer); + Py_CLEAR(clear_module_state->__pyx_n_s_index); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_itemsize); + Py_CLEAR(clear_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_CLEAR(clear_module_state->__pyx_n_s_kind); + Py_CLEAR(clear_module_state->__pyx_n_s_kwargs); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_memview); + Py_CLEAR(clear_module_state->__pyx_n_s_mode); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_name_2); + Py_CLEAR(clear_module_state->__pyx_n_s_ndim); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_object_imputer); + Py_CLEAR(clear_module_state->__pyx_n_s_pack); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0float_imputer); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1float_imputer); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_register); + Py_CLEAR(clear_module_state->__pyx_n_s_s); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_shape); + Py_CLEAR(clear_module_state->__pyx_n_s_signatures); + Py_CLEAR(clear_module_state->__pyx_n_s_size); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_split); + Py_CLEAR(clear_module_state->__pyx_n_s_start); + Py_CLEAR(clear_module_state->__pyx_n_s_statistics); + Py_CLEAR(clear_module_state->__pyx_n_s_step); + Py_CLEAR(clear_module_state->__pyx_n_s_stop); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_strip); + Py_CLEAR(clear_module_state->__pyx_n_s_struct); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_CLEAR(clear_module_state->__pyx_n_s_unpack); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_values); + Py_CLEAR(clear_module_state->__pyx_n_s_version_info); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_2); + Py_CLEAR(clear_module_state->__pyx_int_3); + Py_CLEAR(clear_module_state->__pyx_int_112105877); + Py_CLEAR(clear_module_state->__pyx_int_136983863); + Py_CLEAR(clear_module_state->__pyx_int_184977713); + Py_CLEAR(clear_module_state->__pyx_int_neg_1); + Py_CLEAR(clear_module_state->__pyx_slice__5); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_tuple__8); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__10); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__15); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_tuple__17); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__19); + Py_CLEAR(clear_module_state->__pyx_tuple__20); + Py_CLEAR(clear_module_state->__pyx_tuple__21); + Py_CLEAR(clear_module_state->__pyx_tuple__22); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__24); + Py_CLEAR(clear_module_state->__pyx_tuple__26); + Py_CLEAR(clear_module_state->__pyx_tuple__28); + Py_CLEAR(clear_module_state->__pyx_codeobj__25); + Py_CLEAR(clear_module_state->__pyx_codeobj__27); + Py_CLEAR(clear_module_state->__pyx_codeobj__29); + Py_CLEAR(clear_module_state->__pyx_codeobj__30); + Py_CLEAR(clear_module_state->__pyx_codeobj__31); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_array_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_array); + Py_VISIT(traverse_module_state->__pyx_MemviewEnum_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_MemviewEnum); + Py_VISIT(traverse_module_state->__pyx_memoryview_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryview); + Py_VISIT(traverse_module_state->__pyx_memoryviewslice_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryviewslice); + Py_VISIT(traverse_module_state->__pyx_kp_u_); + Py_VISIT(traverse_module_state->__pyx_n_s_ASCII); + Py_VISIT(traverse_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_VISIT(traverse_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_VISIT(traverse_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_VISIT(traverse_module_state->__pyx_n_s_Ellipsis); + Py_VISIT(traverse_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_VISIT(traverse_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_n_s_IndexError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_VISIT(traverse_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_VISIT(traverse_module_state->__pyx_kp_s_No_matching_signature_found); + Py_VISIT(traverse_module_state->__pyx_n_b_O); + Py_VISIT(traverse_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_Sequence); + Py_VISIT(traverse_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); + Py_VISIT(traverse_module_state->__pyx_n_s_View_MemoryView); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_kp_s__11); + Py_VISIT(traverse_module_state->__pyx_kp_s__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__2); + Py_VISIT(traverse_module_state->__pyx_n_s__3); + Py_VISIT(traverse_module_state->__pyx_n_s__32); + Py_VISIT(traverse_module_state->__pyx_kp_u__6); + Py_VISIT(traverse_module_state->__pyx_kp_u__7); + Py_VISIT(traverse_module_state->__pyx_n_s_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_allocate_buffer); + Py_VISIT(traverse_module_state->__pyx_kp_u_and); + Py_VISIT(traverse_module_state->__pyx_n_s_args); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_base); + Py_VISIT(traverse_module_state->__pyx_n_s_c); + Py_VISIT(traverse_module_state->__pyx_n_u_c); + Py_VISIT(traverse_module_state->__pyx_n_s_class); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_collections); + Py_VISIT(traverse_module_state->__pyx_kp_s_collections_abc); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_VISIT(traverse_module_state->__pyx_n_s_count); + Py_VISIT(traverse_module_state->__pyx_n_s_defaults); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype_is_object); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_encode); + Py_VISIT(traverse_module_state->__pyx_n_s_enumerate); + Py_VISIT(traverse_module_state->__pyx_n_s_error); + Py_VISIT(traverse_module_state->__pyx_n_s_flags); + Py_VISIT(traverse_module_state->__pyx_n_s_float32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_float64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_float_imputer); + Py_VISIT(traverse_module_state->__pyx_n_s_format); + Py_VISIT(traverse_module_state->__pyx_n_s_fortran); + Py_VISIT(traverse_module_state->__pyx_n_u_fortran); + Py_VISIT(traverse_module_state->__pyx_n_s_fused_sigindex); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_imputers_imputer_pyx); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_kp_u_got); + Py_VISIT(traverse_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_id); + Py_VISIT(traverse_module_state->__pyx_n_s_idx_columns); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_imputer); + Py_VISIT(traverse_module_state->__pyx_n_s_index); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_itemsize); + Py_VISIT(traverse_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_VISIT(traverse_module_state->__pyx_n_s_kind); + Py_VISIT(traverse_module_state->__pyx_n_s_kwargs); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_memview); + Py_VISIT(traverse_module_state->__pyx_n_s_mode); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_name_2); + Py_VISIT(traverse_module_state->__pyx_n_s_ndim); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_object_imputer); + Py_VISIT(traverse_module_state->__pyx_n_s_pack); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0float_imputer); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1float_imputer); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_register); + Py_VISIT(traverse_module_state->__pyx_n_s_s); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_shape); + Py_VISIT(traverse_module_state->__pyx_n_s_signatures); + Py_VISIT(traverse_module_state->__pyx_n_s_size); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_split); + Py_VISIT(traverse_module_state->__pyx_n_s_start); + Py_VISIT(traverse_module_state->__pyx_n_s_statistics); + Py_VISIT(traverse_module_state->__pyx_n_s_step); + Py_VISIT(traverse_module_state->__pyx_n_s_stop); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_strip); + Py_VISIT(traverse_module_state->__pyx_n_s_struct); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_VISIT(traverse_module_state->__pyx_n_s_unpack); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_values); + Py_VISIT(traverse_module_state->__pyx_n_s_version_info); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_2); + Py_VISIT(traverse_module_state->__pyx_int_3); + Py_VISIT(traverse_module_state->__pyx_int_112105877); + Py_VISIT(traverse_module_state->__pyx_int_136983863); + Py_VISIT(traverse_module_state->__pyx_int_184977713); + Py_VISIT(traverse_module_state->__pyx_int_neg_1); + Py_VISIT(traverse_module_state->__pyx_slice__5); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_tuple__8); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__10); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__15); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_tuple__17); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__19); + Py_VISIT(traverse_module_state->__pyx_tuple__20); + Py_VISIT(traverse_module_state->__pyx_tuple__21); + Py_VISIT(traverse_module_state->__pyx_tuple__22); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__24); + Py_VISIT(traverse_module_state->__pyx_tuple__26); + Py_VISIT(traverse_module_state->__pyx_tuple__28); + Py_VISIT(traverse_module_state->__pyx_codeobj__25); + Py_VISIT(traverse_module_state->__pyx_codeobj__27); + Py_VISIT(traverse_module_state->__pyx_codeobj__29); + Py_VISIT(traverse_module_state->__pyx_codeobj__30); + Py_VISIT(traverse_module_state->__pyx_codeobj__31); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#define __pyx_type___pyx_array __pyx_mstate_global->__pyx_type___pyx_array +#define __pyx_type___pyx_MemviewEnum __pyx_mstate_global->__pyx_type___pyx_MemviewEnum +#define __pyx_type___pyx_memoryview __pyx_mstate_global->__pyx_type___pyx_memoryview +#define __pyx_type___pyx_memoryviewslice __pyx_mstate_global->__pyx_type___pyx_memoryviewslice +#endif +#define __pyx_array_type __pyx_mstate_global->__pyx_array_type +#define __pyx_MemviewEnum_type __pyx_mstate_global->__pyx_MemviewEnum_type +#define __pyx_memoryview_type __pyx_mstate_global->__pyx_memoryview_type +#define __pyx_memoryviewslice_type __pyx_mstate_global->__pyx_memoryviewslice_type +#define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ +#define __pyx_n_s_ASCII __pyx_mstate_global->__pyx_n_s_ASCII +#define __pyx_kp_s_All_dimensions_preceding_dimensi __pyx_mstate_global->__pyx_kp_s_All_dimensions_preceding_dimensi +#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError +#define __pyx_kp_s_Buffer_view_does_not_expose_stri __pyx_mstate_global->__pyx_kp_s_Buffer_view_does_not_expose_stri +#define __pyx_kp_s_Can_only_create_a_buffer_that_is __pyx_mstate_global->__pyx_kp_s_Can_only_create_a_buffer_that_is +#define __pyx_kp_s_Cannot_assign_to_read_only_memor __pyx_mstate_global->__pyx_kp_s_Cannot_assign_to_read_only_memor +#define __pyx_kp_s_Cannot_create_writable_memory_vi __pyx_mstate_global->__pyx_kp_s_Cannot_create_writable_memory_vi +#define __pyx_kp_u_Cannot_index_with_type __pyx_mstate_global->__pyx_kp_u_Cannot_index_with_type +#define __pyx_kp_s_Cannot_transpose_memoryview_with __pyx_mstate_global->__pyx_kp_s_Cannot_transpose_memoryview_with +#define __pyx_kp_s_Dimension_d_is_not_direct __pyx_mstate_global->__pyx_kp_s_Dimension_d_is_not_direct +#define __pyx_n_s_Ellipsis __pyx_mstate_global->__pyx_n_s_Ellipsis +#define __pyx_kp_s_Empty_shape_tuple_for_cython_arr __pyx_mstate_global->__pyx_kp_s_Empty_shape_tuple_for_cython_arr +#define __pyx_kp_s_Expected_at_least_d_argument_s_g __pyx_mstate_global->__pyx_kp_s_Expected_at_least_d_argument_s_g +#define __pyx_kp_s_Function_call_with_ambiguous_arg __pyx_mstate_global->__pyx_kp_s_Function_call_with_ambiguous_arg +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_n_s_IndexError __pyx_mstate_global->__pyx_n_s_IndexError +#define __pyx_kp_s_Index_out_of_bounds_axis_d __pyx_mstate_global->__pyx_kp_s_Index_out_of_bounds_axis_d +#define __pyx_kp_s_Indirect_dimensions_not_supporte __pyx_mstate_global->__pyx_kp_s_Indirect_dimensions_not_supporte +#define __pyx_kp_u_Invalid_mode_expected_c_or_fortr __pyx_mstate_global->__pyx_kp_u_Invalid_mode_expected_c_or_fortr +#define __pyx_kp_u_Invalid_shape_in_axis __pyx_mstate_global->__pyx_kp_u_Invalid_shape_in_axis +#define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError +#define __pyx_kp_s_MemoryView_of_r_at_0x_x __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_at_0x_x +#define __pyx_kp_s_MemoryView_of_r_object __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_object +#define __pyx_kp_s_No_matching_signature_found __pyx_mstate_global->__pyx_kp_s_No_matching_signature_found +#define __pyx_n_b_O __pyx_mstate_global->__pyx_n_b_O +#define __pyx_kp_u_Out_of_bounds_on_buffer_access_a __pyx_mstate_global->__pyx_kp_u_Out_of_bounds_on_buffer_access_a +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_Sequence __pyx_mstate_global->__pyx_n_s_Sequence +#define __pyx_kp_s_Step_may_not_be_zero_axis_d __pyx_mstate_global->__pyx_kp_s_Step_may_not_be_zero_axis_d +#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError +#define __pyx_kp_s_Unable_to_convert_item_to_object __pyx_mstate_global->__pyx_kp_s_Unable_to_convert_item_to_object +#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError +#define __pyx_n_s_View_MemoryView __pyx_mstate_global->__pyx_n_s_View_MemoryView +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_kp_s__11 __pyx_mstate_global->__pyx_kp_s__11 +#define __pyx_kp_s__12 __pyx_mstate_global->__pyx_kp_s__12 +#define __pyx_kp_u__12 __pyx_mstate_global->__pyx_kp_u__12 +#define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 +#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 +#define __pyx_n_s__32 __pyx_mstate_global->__pyx_n_s__32 +#define __pyx_kp_u__6 __pyx_mstate_global->__pyx_kp_u__6 +#define __pyx_kp_u__7 __pyx_mstate_global->__pyx_kp_u__7 +#define __pyx_n_s_abc __pyx_mstate_global->__pyx_n_s_abc +#define __pyx_n_s_allocate_buffer __pyx_mstate_global->__pyx_n_s_allocate_buffer +#define __pyx_kp_u_and __pyx_mstate_global->__pyx_kp_u_and +#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_base __pyx_mstate_global->__pyx_n_s_base +#define __pyx_n_s_c __pyx_mstate_global->__pyx_n_s_c +#define __pyx_n_u_c __pyx_mstate_global->__pyx_n_u_c +#define __pyx_n_s_class __pyx_mstate_global->__pyx_n_s_class +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_collections __pyx_mstate_global->__pyx_n_s_collections +#define __pyx_kp_s_collections_abc __pyx_mstate_global->__pyx_kp_s_collections_abc +#define __pyx_kp_s_contiguous_and_direct __pyx_mstate_global->__pyx_kp_s_contiguous_and_direct +#define __pyx_kp_s_contiguous_and_indirect __pyx_mstate_global->__pyx_kp_s_contiguous_and_indirect +#define __pyx_n_s_count __pyx_mstate_global->__pyx_n_s_count +#define __pyx_n_s_defaults __pyx_mstate_global->__pyx_n_s_defaults +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_dtype __pyx_mstate_global->__pyx_n_s_dtype +#define __pyx_n_s_dtype_is_object __pyx_mstate_global->__pyx_n_s_dtype_is_object +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode +#define __pyx_n_s_enumerate __pyx_mstate_global->__pyx_n_s_enumerate +#define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error +#define __pyx_n_s_flags __pyx_mstate_global->__pyx_n_s_flags +#define __pyx_n_s_float32_t __pyx_mstate_global->__pyx_n_s_float32_t +#define __pyx_n_s_float64_t __pyx_mstate_global->__pyx_n_s_float64_t +#define __pyx_n_s_float_imputer __pyx_mstate_global->__pyx_n_s_float_imputer +#define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format +#define __pyx_n_s_fortran __pyx_mstate_global->__pyx_n_s_fortran +#define __pyx_n_u_fortran __pyx_mstate_global->__pyx_n_u_fortran +#define __pyx_n_s_fused_sigindex __pyx_mstate_global->__pyx_n_s_fused_sigindex +#define __pyx_kp_s_gators_imputers_imputer_pyx __pyx_mstate_global->__pyx_kp_s_gators_imputers_imputer_pyx +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_kp_u_got __pyx_mstate_global->__pyx_kp_u_got +#define __pyx_kp_u_got_differing_extents_in_dimensi __pyx_mstate_global->__pyx_kp_u_got_differing_extents_in_dimensi +#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id +#define __pyx_n_s_idx_columns __pyx_mstate_global->__pyx_n_s_idx_columns +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_imputer __pyx_mstate_global->__pyx_n_s_imputer +#define __pyx_n_s_index __pyx_mstate_global->__pyx_n_s_index +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_itemsize __pyx_mstate_global->__pyx_n_s_itemsize +#define __pyx_kp_s_itemsize_0_for_cython_array __pyx_mstate_global->__pyx_kp_s_itemsize_0_for_cython_array +#define __pyx_n_s_kind __pyx_mstate_global->__pyx_n_s_kind +#define __pyx_n_s_kwargs __pyx_mstate_global->__pyx_n_s_kwargs +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_memview __pyx_mstate_global->__pyx_n_s_memview +#define __pyx_n_s_mode __pyx_mstate_global->__pyx_n_s_mode +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2 +#define __pyx_n_s_ndim __pyx_mstate_global->__pyx_n_s_ndim +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj +#define __pyx_n_s_object_imputer __pyx_mstate_global->__pyx_n_s_object_imputer +#define __pyx_n_s_pack __pyx_mstate_global->__pyx_n_s_pack +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_fuse_0float_imputer __pyx_mstate_global->__pyx_n_s_pyx_fuse_0float_imputer +#define __pyx_n_s_pyx_fuse_1float_imputer __pyx_mstate_global->__pyx_n_s_pyx_fuse_1float_imputer +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_Enum __pyx_mstate_global->__pyx_n_s_pyx_unpickle_Enum +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_register __pyx_mstate_global->__pyx_n_s_register +#define __pyx_n_s_s __pyx_mstate_global->__pyx_n_s_s +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_shape __pyx_mstate_global->__pyx_n_s_shape +#define __pyx_n_s_signatures __pyx_mstate_global->__pyx_n_s_signatures +#define __pyx_n_s_size __pyx_mstate_global->__pyx_n_s_size +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split +#define __pyx_n_s_start __pyx_mstate_global->__pyx_n_s_start +#define __pyx_n_s_statistics __pyx_mstate_global->__pyx_n_s_statistics +#define __pyx_n_s_step __pyx_mstate_global->__pyx_n_s_step +#define __pyx_n_s_stop __pyx_mstate_global->__pyx_n_s_stop +#define __pyx_kp_s_strided_and_direct __pyx_mstate_global->__pyx_kp_s_strided_and_direct +#define __pyx_kp_s_strided_and_direct_or_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_direct_or_indirect +#define __pyx_kp_s_strided_and_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_indirect +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_strip __pyx_mstate_global->__pyx_n_s_strip +#define __pyx_n_s_struct __pyx_mstate_global->__pyx_n_s_struct +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_kp_s_unable_to_allocate_array_data __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_array_data +#define __pyx_kp_s_unable_to_allocate_shape_and_str __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_shape_and_str +#define __pyx_n_s_unpack __pyx_mstate_global->__pyx_n_s_unpack +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values +#define __pyx_n_s_version_info __pyx_mstate_global->__pyx_n_s_version_info +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 +#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 +#define __pyx_int_112105877 __pyx_mstate_global->__pyx_int_112105877 +#define __pyx_int_136983863 __pyx_mstate_global->__pyx_int_136983863 +#define __pyx_int_184977713 __pyx_mstate_global->__pyx_int_184977713 +#define __pyx_int_neg_1 __pyx_mstate_global->__pyx_int_neg_1 +#define __pyx_slice__5 __pyx_mstate_global->__pyx_slice__5 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__15 __pyx_mstate_global->__pyx_tuple__15 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 +#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 +#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 +#define __pyx_tuple__22 __pyx_mstate_global->__pyx_tuple__22 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24 +#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26 +#define __pyx_tuple__28 __pyx_mstate_global->__pyx_tuple__28 +#define __pyx_codeobj__25 __pyx_mstate_global->__pyx_codeobj__25 +#define __pyx_codeobj__27 __pyx_mstate_global->__pyx_codeobj__27 +#define __pyx_codeobj__29 __pyx_mstate_global->__pyx_codeobj__29 +#define __pyx_codeobj__30 __pyx_mstate_global->__pyx_codeobj__30 +#define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 +/* #### Code section: module_code ### */ + +/* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)__pyx_n_s_c)); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_itemsize)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_format)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mode); + if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_allocate_buffer); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 131, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 132, __pyx_L3_error) + } else { + + /* "View.MemoryView":132 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, __pyx_nargs); __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 131, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 131, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_dim; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + char *__pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_UCS4 __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":137 + * cdef Py_ssize_t dim + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 137, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 137, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":138 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + __pyx_t_2 = (!(__pyx_v_self->ndim != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":141 + * + * if not self.ndim: + * raise ValueError, "Empty shape tuple for cython.array" # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Empty_shape_tuple_for_cython_arr, 0, 0); + __PYX_ERR(1, 141, __pyx_L1_error) + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + } + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + __pyx_t_2 = (__pyx_v_itemsize <= 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":144 + * + * if itemsize <= 0: + * raise ValueError, "itemsize <= 0 for cython.array" # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_itemsize_0_for_cython_array, 0, 0); + __PYX_ERR(1, 144, __pyx_L1_error) + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + } + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_3 = (!__pyx_t_2); + if (__pyx_t_3) { + + /* "View.MemoryView":147 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_n_s_ASCII}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":148 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_format))) __PYX_ERR(1, 148, __pyx_L1_error) + __pyx_t_4 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":149 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 149, __pyx_L1_error) + } + __pyx_t_8 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) __PYX_ERR(1, 149, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_8; + + /* "View.MemoryView":152 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":153 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + __pyx_t_3 = (!(__pyx_v_self->_shape != 0)); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":156 + * + * if not self._shape: + * raise MemoryError, "unable to allocate shape and strides." # <<<<<<<<<<<<<< + * + * + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_shape_and_str, 0, 0); + __PYX_ERR(1, 156, __pyx_L1_error) + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + } + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + __pyx_t_7 = 0; + __pyx_t_4 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_4); + __pyx_t_1 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #endif + if (__pyx_t_1 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_9; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + __pyx_t_3 = (__pyx_v_dim <= 0); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":161 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_5 = PyTuple_New(5); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = 0; + __pyx_t_10 = 127; + __Pyx_INCREF(__pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_9 += 22; + __Pyx_GIVEREF(__pyx_kp_u_Invalid_shape_in_axis); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_6 = __Pyx_PyUnicode_From_int(__pyx_v_idx, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u_); + __pyx_t_9 += 2; + __Pyx_GIVEREF(__pyx_kp_u_); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u_); + __pyx_t_6 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u__2); + __pyx_t_9 += 1; + __Pyx_GIVEREF(__pyx_kp_u__2); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_kp_u__2); + __pyx_t_6 = __Pyx_PyUnicode_Join(__pyx_t_5, 5, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 161, __pyx_L1_error) + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":162 + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 165, __pyx_L1_error) + if (__pyx_t_3) { + + /* "View.MemoryView":166 + * cdef char order + * if mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * elif mode == 'fortran': + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":167 + * if mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * elif mode == 'fortran': + * order = b'F' + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 168, __pyx_L1_error) + if (likely(__pyx_t_3)) { + + /* "View.MemoryView":169 + * self.mode = u'c' + * elif mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * else: + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":170 + * elif mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":172 + * self.mode = u'fortran' + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_FormatSimple(__pyx_v_mode, __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 172, __pyx_L1_error) + } + __pyx_L11:; + + /* "View.MemoryView":174 + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) # <<<<<<<<<<<<<< + * + * self.free_data = allocate_buffer + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":176 + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":177 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * + * if allocate_buffer: + */ + __pyx_t_6 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 177, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_3; + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + if (__pyx_v_allocate_buffer) { + + /* "View.MemoryView":180 + * + * if allocate_buffer: + * _allocate_buffer(self) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_t_7 = __pyx_array_allocate_buffer(__pyx_v_self); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(1, 180, __pyx_L1_error) + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + } + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + char *__pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_ssize_t *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":184 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_t_1 = ((__pyx_v_flags & ((PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS) | PyBUF_ANY_CONTIGUOUS)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 186, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":187 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L4; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 188, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L4:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + __pyx_t_1 = (!((__pyx_v_flags & __pyx_v_bufmode) != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Can_only_create_a_buffer_that_is, 0, 0); + __PYX_ERR(1, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + } + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * + */ + __pyx_t_2 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_2; + + /* "View.MemoryView":193 + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_3; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":196 + * + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_4 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_4; + + /* "View.MemoryView":197 + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * else: + */ + __pyx_t_5 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":198 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * else: + * info.ndim = 1 + */ + __pyx_t_5 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_5; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + goto __pyx_L6; + } + + /* "View.MemoryView":200 + * info.strides = self._strides + * else: + * info.ndim = 1 # <<<<<<<<<<<<<< + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL + */ + /*else*/ { + __pyx_v_info->ndim = 1; + + /* "View.MemoryView":201 + * else: + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL # <<<<<<<<<<<<<< + * info.strides = NULL + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + __pyx_t_5 = (&__pyx_v_self->len); + } else { + __pyx_t_5 = NULL; + } + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":202 + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL # <<<<<<<<<<<<<< + * + * info.suboffsets = NULL + */ + __pyx_v_info->strides = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":204 + * info.strides = NULL + * + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":205 + * + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + */ + __pyx_t_3 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_3; + + /* "View.MemoryView":206 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":207 + * info.itemsize = self.itemsize + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_self->format; + } else { + __pyx_t_2 = NULL; + } + __pyx_v_info->format = __pyx_t_2; + + /* "View.MemoryView":208 + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + __pyx_t_1 = (__pyx_v_self->callback_free_data != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + if (__pyx_v_self->free_data) { + } else { + __pyx_t_1 = __pyx_v_self->free_data; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->data != NULL); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":215 + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) # <<<<<<<<<<<<<< + * free(self.data) + * PyObject_Free(self._shape) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + } + + /* "View.MemoryView":216 + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + } + __pyx_L3:; + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ +} + +/* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":221 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_memview", 1); + + /* "View.MemoryView":225 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":226 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + + /* "View.MemoryView":229 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getattr__", 1); + + /* "View.MemoryView":232 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":235 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 1); + + /* "View.MemoryView":238 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0))) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_i; + PyObject **__pyx_v_p; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":254 + * cdef PyObject **p + * + * self.free_data = True # <<<<<<<<<<<<<< + * self.data = malloc(self.len) + * if not self.data: + */ + __pyx_v_self->free_data = 1; + + /* "View.MemoryView":255 + * + * self.free_data = True + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError, "unable to allocate array data." + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + __pyx_t_1 = (!(__pyx_v_self->data != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":257 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError, "unable to allocate array data." # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_array_data, 0, 0); + __PYX_ERR(1, 257, __pyx_L1_error) + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":260 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":261 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len // self.itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_self->itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_self->itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_self->itemsize); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":262 + * p = self.data + * for i in range(self.len // self.itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * return 0 + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":263 + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * return 0 + * + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + } + + /* "View.MemoryView":264 + * p[i] = Py_None + * Py_INCREF(Py_None) + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_c_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + PyObject *__pyx_v_mode = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("array_cwrapper", 1); + + /* "View.MemoryView":270 + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. # <<<<<<<<<<<<<< + * + * if buf is NULL: + */ + __pyx_t_2 = ((__pyx_v_c_mode[0]) == 'f'); + if (__pyx_t_2) { + __Pyx_INCREF(__pyx_n_s_fortran); + __pyx_t_1 = __pyx_n_s_fortran; + } else { + __Pyx_INCREF(__pyx_n_s_c); + __pyx_t_1 = __pyx_n_s_c; + } + __pyx_v_mode = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + __pyx_t_2 = (__pyx_v_buf == NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":273 + * + * if buf is NULL: + * result = array.__new__(array, shape, itemsize, format, mode) # <<<<<<<<<<<<<< + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + */ + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_shape)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_mode)) __PYX_ERR(1, 273, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_4, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":275 + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + /*else*/ { + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_mode)) __PYX_ERR(1, 275, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 275, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_1, __pyx_t_4)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":276 + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":278 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_mode); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 304, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 304, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 304, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "View.MemoryView":305 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":307 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 349, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_dtype_is_object); + if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 349, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, __pyx_nargs); __PYX_ERR(1, 349, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_intptr_t __pyx_t_4; + size_t __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 1); + + /* "View.MemoryView":350 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":351 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_obj != Py_None); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":353 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_3 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 353, __pyx_L1_error) + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = (((PyObject *)__pyx_v_self->view.obj) == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":356 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + __pyx_t_1 = (!__PYX_CYTHON_ATOMICS_ENABLED()); + if (__pyx_t_1) { + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = (__pyx_memoryview_thread_locks_used < 8); + if (__pyx_t_1) { + + /* "View.MemoryView":361 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":362 + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":364 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":366 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(1, 366, __pyx_L1_error) + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + } + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":369 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = ((__pyx_v_self->view.format[0]) == 'O'); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_self->view.format[1]) == '\x00'); + __pyx_t_1 = __pyx_t_2; + __pyx_L12_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":371 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L11:; + + /* "View.MemoryView":373 + * self.dtype_is_object = dtype_is_object + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 # <<<<<<<<<<<<<< + * self.typeinfo = NULL + * + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_4 = ((Py_intptr_t)((void *)(&__pyx_v_self->acquisition_count))); + __pyx_t_5 = (sizeof(__pyx_atomic_int_type)); + if (unlikely(__pyx_t_5 == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 373, __pyx_L1_error) + } + __pyx_t_1 = ((__pyx_t_4 % __pyx_t_5) == 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 373, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 373, __pyx_L1_error) + #endif + + /* "View.MemoryView":374 + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyThread_type_lock __pyx_t_5; + PyThread_type_lock __pyx_t_6; + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":378 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + __pyx_t_1 = (((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":381 + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< + * Py_DECREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; + + /* "View.MemoryView":382 + * + * (<__pyx_buffer *> &self.view).obj = NULL + * Py_DECREF(Py_None) # <<<<<<<<<<<<<< + * + * cdef int i + */ + Py_DECREF(Py_None); + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + } + __pyx_L3:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_1 = (__pyx_v_self->lock != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":387 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_2 = __pyx_memoryview_thread_locks_used; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock); + if (__pyx_t_1) { + + /* "View.MemoryView":389 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_1 = (__pyx_v_i != __pyx_memoryview_thread_locks_used); + if (__pyx_t_1) { + + /* "View.MemoryView":392 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_5 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":391 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_5; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_6; + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":393 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":395 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ +} + +/* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_item_pointer", 1); + + /* "View.MemoryView":399 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 401, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 401, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":402 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":404 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + if (__pyx_t_1) { + + /* "View.MemoryView":409 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":411 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 411, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 411, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_indices = __pyx_t_4; + __pyx_t_4 = 0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 414, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":415 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":417 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_5 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(1, 417, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_5; + + /* "View.MemoryView":418 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + if (unlikely(__pyx_v_self->view.readonly)) { + + /* "View.MemoryView":422 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_Cannot_assign_to_read_only_memor, 0, 0); + __PYX_ERR(1, 422, __pyx_L1_error) + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + } + + /* "View.MemoryView":424 + * raise TypeError, "Cannot assign to read-only memoryview" + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_1 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 424, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 424, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 426, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":427 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 428, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":429 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_1 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_1, __pyx_v_obj); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":431 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 431, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_3), __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":433 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":439 + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 439, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":440 + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 440, __pyx_L6_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + + /* "View.MemoryView":441 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __pyx_L6_except_error:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":443 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + __Pyx_memviewslice __pyx_v_msrc; + __Pyx_memviewslice __pyx_v_mdst; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 1); + + /* "View.MemoryView":448 + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_v_msrc = (__pyx_t_1[0]); + + /* "View.MemoryView":449 + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] # <<<<<<<<<<<<<< + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_v_mdst = (__pyx_t_1[0]); + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = __pyx_memoryview_copy_contents(__pyx_v_msrc, __pyx_v_mdst, __pyx_t_3, __pyx_t_4, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 451, __pyx_L1_error) + + /* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + char const *__pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 1); + + /* "View.MemoryView":455 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":460 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 460, __pyx_L1_error) + __pyx_v_dst_slice = __pyx_t_1; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_2 = (((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))); + if (__pyx_t_2) { + + /* "View.MemoryView":463 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_2 = (__pyx_v_tmp == NULL); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":465 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(1, 465, __pyx_L1_error) + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":466 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":468 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":470 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":472 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":474 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 474, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_2 = (__pyx_v_self->view.suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":479 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_4 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 479, __pyx_L6_error) + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":480 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":483 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_indexed", 1); + + /* "View.MemoryView":486 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 486, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":487 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 487, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":492 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 492, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":495 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":497 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError, "Unable to convert item to object" + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_9 = __Pyx_ssize_strlen(__pyx_v_self->view.format); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(1, 501, __pyx_L5_except_error) + __pyx_t_10 = (__pyx_t_9 == 1); + if (__pyx_t_10) { + + /* "View.MemoryView":502 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 502, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":503 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":498 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError, "Unable to convert item to object" + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_6); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "View.MemoryView":499 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError, "Unable to convert item to object" # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Unable_to_convert_item_to_object, 0, 0); + __PYX_ERR(1, 499, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + char *__pyx_t_9; + char *__pyx_t_10; + char *__pyx_t_11; + char *__pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":508 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + if (__pyx_t_2) { + + /* "View.MemoryView":514 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 514, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":516 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_v_value}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 516, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 518, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_8 = __pyx_v_bytesvalue; + __pyx_t_10 = PyBytes_AS_STRING(__pyx_t_8); + __pyx_t_11 = (__pyx_t_10 + PyBytes_GET_SIZE(__pyx_t_8)); + for (__pyx_t_12 = __pyx_t_10; __pyx_t_12 < __pyx_t_11; __pyx_t_12++) { + __pyx_t_9 = __pyx_t_12; + __pyx_v_c = (__pyx_t_9[0]); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_7; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + char *__pyx_t_4; + void *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":524 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError, "Cannot create writable memory view from read-only memoryview" # <<<<<<<<<<<<<< + * + * if flags & PyBUF_ND: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Cannot_create_writable_memory_vi, 0, 0); + __PYX_ERR(1, 524, __pyx_L1_error) + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + } + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":527 + * + * if flags & PyBUF_ND: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_3 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_3; + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":529 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":532 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_3 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_3; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":534 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":537 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_3 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_3; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":539 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":542 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":544 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":546 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_5 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_5; + + /* "View.MemoryView":547 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_6 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":548 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_7 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_7; + + /* "View.MemoryView":549 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_7 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_7; + + /* "View.MemoryView":550 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":551 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":556 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 556, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 556, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":557 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(1, 557, __pyx_L1_error) + + /* "View.MemoryView":558 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":562 + * @property + * def base(self): + * return self._get_base() # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->_get_base(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 562, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.base.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":565 + * + * cdef _get_base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_7genexpr__pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":569 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_7genexpr__pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_7genexpr__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } /* exit inner scope */ + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr1__pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + __pyx_t_1 = (__pyx_v_self->view.strides == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":575 + * if self.view.strides == NULL: + * + * raise ValueError, "Buffer view does not expose strides" # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Buffer_view_does_not_expose_stri, 0, 0); + __PYX_ERR(1, 575, __pyx_L1_error) + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + } + + /* "View.MemoryView":577 + * raise ValueError, "Buffer view does not expose strides" + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr1__pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr1__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr2__pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = (__pyx_v_self->view.suboffsets == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PySequence_Multiply(__pyx_tuple__4, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":584 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.suboffsets; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr2__pyx_v_suboffset = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr2__pyx_v_suboffset); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":588 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 588, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":592 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 592, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":596 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":601 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":603 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_t_5 = PyInt_FromSsize_t((__pyx_t_2[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 603, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":604 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_5 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 604, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_5); + __pyx_t_5 = 0; + } + + /* "View.MemoryView":606 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":608 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = (__pyx_v_self->view.ndim >= 1); + if (__pyx_t_1) { + + /* "View.MemoryView":612 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":614 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":618 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 1); + + /* "View.MemoryView":621 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_c_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_c_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_c_contig", 1); + + /* "View.MemoryView":627 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 627, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":628 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_f_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_f_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_f_contig", 1); + + /* "View.MemoryView":633 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 633, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":634 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy", 1); + + /* "View.MemoryView":638 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":640 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":641 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 641, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":646 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 646, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy_fortran", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy_fortran", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy_fortran", 1); + + /* "View.MemoryView":650 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":652 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":653 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 653, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":658 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 1); + + /* "View.MemoryView":663 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":664 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":665 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":669 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_idx; + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_UCS4 __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_unellipsify", 1); + + /* "View.MemoryView":677 + * """ + * cdef Py_ssize_t idx + * tup = index if isinstance(index, tuple) else (index,) # <<<<<<<<<<<<<< + * + * result = [slice(None)] * ndim + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_index); + if (__pyx_t_2) { + __Pyx_INCREF(((PyObject*)__pyx_v_index)); + __pyx_t_1 = __pyx_v_index; + } else { + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index)) __PYX_ERR(1, 677, __pyx_L1_error); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_v_tup = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_1 = PyList_New(1 * ((__pyx_v_ndim<0) ? 0:__pyx_v_ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_ndim; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error); + } + } + __pyx_v_result = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":680 + * + * result = [slice(None)] * ndim + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * idx = 0 + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":681 + * result = [slice(None)] * ndim + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * idx = 0 + * for item in tup: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":682 + * have_slices = False + * seen_ellipsis = False + * idx = 0 # <<<<<<<<<<<<<< + * for item in tup: + * if item is Ellipsis: + */ + __pyx_v_idx = 0; + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 683, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_1); + __pyx_t_4 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #endif + if (__pyx_t_4 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 683, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + __pyx_t_2 = (!__pyx_v_seen_ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":686 + * if item is Ellipsis: + * if not seen_ellipsis: + * idx += ndim - len(tup) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * have_slices = True + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 686, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(__pyx_v_tup); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 686, __pyx_L1_error) + __pyx_v_idx = (__pyx_v_idx + (__pyx_v_ndim - __pyx_t_5)); + + /* "View.MemoryView":687 + * if not seen_ellipsis: + * idx += ndim - len(tup) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + } + + /* "View.MemoryView":688 + * idx += ndim - len(tup) + * seen_ellipsis = True + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if isinstance(item, slice): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + if (__pyx_t_2) { + + /* "View.MemoryView":691 + * else: + * if isinstance(item, slice): + * have_slices = True # <<<<<<<<<<<<<< + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + goto __pyx_L7; + } + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + __pyx_t_2 = (!(PyIndex_Check(__pyx_v_item) != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":693 + * have_slices = True + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" # <<<<<<<<<<<<<< + * result[idx] = item + * idx += 1 + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_6 = 127; + __Pyx_INCREF(__pyx_kp_u_Cannot_index_with_type); + __pyx_t_5 += 24; + __Pyx_GIVEREF(__pyx_kp_u_Cannot_index_with_type); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Cannot_index_with_type); + __pyx_t_7 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_item)), __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6; + __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_kp_u__6); + __pyx_t_5 += 1; + __Pyx_GIVEREF(__pyx_kp_u__6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__6); + __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_t_7, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(1, 693, __pyx_L1_error) + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + } + __pyx_L7:; + + /* "View.MemoryView":694 + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item # <<<<<<<<<<<<<< + * idx += 1 + * + */ + if (unlikely((__Pyx_SetItemInt(__pyx_v_result, __pyx_v_idx, __pyx_v_item, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1) < 0))) __PYX_ERR(1, 694, __pyx_L1_error) + } + __pyx_L5:; + + /* "View.MemoryView":695 + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + * idx += 1 # <<<<<<<<<<<<<< + * + * nslices = ndim - idx + */ + __pyx_v_idx = (__pyx_v_idx + 1); + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":697 + * idx += 1 + * + * nslices = ndim - idx # <<<<<<<<<<<<<< + * return have_slices or nslices, tuple(result) + * + */ + __pyx_v_nslices = (__pyx_v_ndim - __pyx_v_idx); + + /* "View.MemoryView":698 + * + * nslices = ndim - idx + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_7 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + __pyx_L9_bool_binop_done:; + __pyx_t_7 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 698, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_7 = 0; + __pyx_r = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static int assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + int __pyx_r; + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":701 + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + __pyx_t_4 = (__pyx_v_suboffset >= 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":703 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" # <<<<<<<<<<<<<< + * return 0 # return type just used as an error flag + * + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Indirect_dimensions_not_supporte, 0, 0); + __PYX_ERR(1, 703, __pyx_L1_error) + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + } + } + + /* "View.MemoryView":704 + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + Py_ssize_t __pyx_v_cindex; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + struct __pyx_memoryview_obj *__pyx_t_3; + char *__pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + PyObject *(*__pyx_t_7)(PyObject *); + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memview_slice", 1); + + /* "View.MemoryView":712 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":719 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":723 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_1 = (__pyx_v_memview->view.ndim > 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 723, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 723, __pyx_L1_error) + #endif + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":726 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 726, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":727 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":729 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":730 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":736 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_3 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_3; + + /* "View.MemoryView":737 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_4; + + /* "View.MemoryView":742 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step, cindex + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":743 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step, cindex + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + __pyx_t_5 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_2 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_2); + __pyx_t_6 = 0; + __pyx_t_7 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 747, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_7)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_7(__pyx_t_2); + if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 747, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_dim = __pyx_t_5; + __pyx_t_5 = (__pyx_t_5 + 1); + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + __pyx_t_1 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":749 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * cindex = index # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 749, __pyx_L1_error) + __pyx_v_cindex = __pyx_t_9; + + /* "View.MemoryView":750 + * if PyIndex_Check(index): + * cindex = index + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_cindex, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 750, __pyx_L1_error) + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + goto __pyx_L6; + } + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_1 = (__pyx_v_index == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":757 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":758 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":759 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":760 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":762 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 762, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 762, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_9; + + /* "View.MemoryView":763 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 763, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 763, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 763, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_9; + + /* "View.MemoryView":764 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 764, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 764, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 764, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_9; + + /* "View.MemoryView":766 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":767 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 767, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":768 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":770 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 770, __pyx_L1_error) + + /* "View.MemoryView":776 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":780 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 780, __pyx_L1_error) } + + /* "View.MemoryView":781 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 781, __pyx_L1_error) } + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 779, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":785 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 784, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = (!__pyx_v_is_slice); + if (__pyx_t_1) { + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = (__pyx_v_start < 0); + if (__pyx_t_1) { + + /* "View.MemoryView":816 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":818 + * start += shape + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 818, __pyx_L1_error) + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_have_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":822 + * + * if have_step: + * negative_step = step < 0 # <<<<<<<<<<<<<< + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + */ + __pyx_v_negative_step = (__pyx_v_step < 0); + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + __pyx_t_2 = (__pyx_v_step == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":824 + * negative_step = step < 0 + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * negative_step = False + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 824, __pyx_L1_error) + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":826 + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + * negative_step = False # <<<<<<<<<<<<<< + * step = 1 + * + */ + /*else*/ { + __pyx_v_negative_step = 0; + + /* "View.MemoryView":827 + * else: + * negative_step = False + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + } + __pyx_L6:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":832 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":834 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = (__pyx_v_start >= __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + if (__pyx_v_negative_step) { + + /* "View.MemoryView":837 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":839 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L11:; + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L9:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L8; + } + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":842 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":844 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L12:; + } + __pyx_L8:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":850 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = (__pyx_v_stop > __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":852 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L14:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L13; + } + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":855 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L16; + } + + /* "View.MemoryView":857 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L16:; + } + __pyx_L13:; + + /* "View.MemoryView":861 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":864 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = (__pyx_v_new_shape < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":867 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":870 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":871 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":872 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = ((__pyx_v_suboffset_dim[0]) < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":878 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L19:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = (!__pyx_v_is_slice); + if (__pyx_t_2) { + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = (__pyx_v_new_ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":883 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L22; + } + + /* "View.MemoryView":885 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":886 + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 885, __pyx_L1_error) + } + __pyx_L22:; + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L21; + } + + /* "View.MemoryView":888 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L21:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":890 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_UCS4 __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("pybuffer_index", 1); + + /* "View.MemoryView":898 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":899 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + __pyx_t_2 = (__pyx_v_view->ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":903 + * + * if view.ndim == 0: + * shape = view.len // itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":904 + * if view.ndim == 0: + * shape = view.len // itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":906 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":907 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = (__pyx_v_view->suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":909 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":914 + * index += view.shape[dim] + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_5 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__7); + __pyx_t_5 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 914, __pyx_L1_error) + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index >= __pyx_v_shape); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":917 + * + * if index >= shape: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_3 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u__7); + __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_5, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 917, __pyx_L1_error) + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":919 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":923 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":930 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":932 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":933 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":937 + * + * cdef int i, j + * for i in range(ndim // 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":938 + * cdef int i, j + * for i in range(ndim // 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":939 + * for i in range(ndim // 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":940 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":943 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_t_9 = __pyx_memoryview_err(PyExc_ValueError, __pyx_kp_s_Cannot_transpose_memoryview_with); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L1_error) + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":945 + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + + /* "View.MemoryView":964 + * + * def __dealloc__(self): + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XCLEAR_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_object_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":968 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 968, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":970 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 970, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_dtype_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":974 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 974, __pyx_L1_error) + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":976 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":979 + * + * cdef _get_base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_fromslice", 1); + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_memviewslice.memview) == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":1008 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1013 + * + * + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = ((PyObject *)__pyx_tp_new__memoryviewslice(((PyTypeObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1015 + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1016 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview)._get_base() + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1018 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview)._get_base() # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->__pyx_vtab)->_get_base(((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1018, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1019 + * + * result.from_object = ( memviewslice.memview)._get_base() + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1021 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1022 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1023 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1024 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1025 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1028 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1030 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1032 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1033 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1036 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1037 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = (__pyx_v_suboffset >= 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1039 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1040 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1042 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1043 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1043, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1044 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1046 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1047 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1049 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_slice_from_memview", 1); + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1056 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1056, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1057 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1059 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1060 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1067 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1068 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1069 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1071 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1072 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1074 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1075 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1076 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1077 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + __pyx_t_6 = (__pyx_v_suboffsets != 0); + if (__pyx_t_6) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ +} + +/* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy", 1); + + /* "View.MemoryView":1083 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1084 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1084, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *(*__pyx_t_2)(char *); + int (*__pyx_t_3)(char *, PyObject *); + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 1); + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1095 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_2 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_2; + + /* "View.MemoryView":1096 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_3; + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1098 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1099 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1101 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1103 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":1110 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: + * return -arg if arg < 0 else arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + __pyx_t_2 = (__pyx_v_arg < 0); + if (__pyx_t_2) { + __pyx_t_1 = (-__pyx_v_arg); + } else { + __pyx_t_1 = __pyx_v_arg; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1118 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1119 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1121 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1123 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1124 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1126 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1128 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1129 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = (abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)); + if (__pyx_t_2) { + + /* "View.MemoryView":1132 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1134 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + + /* "View.MemoryView":1144 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1146 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = (__pyx_v_src_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_dst_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1151 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_1 = __pyx_t_2; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1152 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1154 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1155 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1156 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1157 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1159 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1160 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1164 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1165 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1170 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + + /* "View.MemoryView":1176 + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for shape in src.shape[:ndim]: + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1178 + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * + * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< + * size *= shape + * + */ + __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); + for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_shape = (__pyx_t_2[0]); + + /* "View.MemoryView":1179 + * + * for shape in src.shape[:ndim]: + * size *= shape # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * __pyx_v_shape); + } + + /* "View.MemoryView":1181 + * size *= shape + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = (__pyx_v_order == 'F'); + if (__pyx_t_1) { + + /* "View.MemoryView":1194 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1195 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1196 + * for idx in range(ndim): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1198 + * stride *= shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1199 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1200 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1202 + * stride *= shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1216 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1217 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1219 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err_no_memory() + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + __pyx_t_2 = (!(__pyx_v_result != 0)); + if (__pyx_t_2) { + + /* "View.MemoryView":1221 + * result = malloc(size) + * if not result: + * _err_no_memory() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_no_memory(); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1221, __pyx_L1_error) + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + } + + /* "View.MemoryView":1224 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1225 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1226 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1227 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1228 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1230 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) # <<<<<<<<<<<<<< + * + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = ((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = __pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_UCS4 __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = PyTuple_New(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = 0; + __pyx_t_3 = 127; + __Pyx_INCREF(__pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_2 += 35; + __Pyx_GIVEREF(__pyx_kp_u_got_differing_extents_in_dimensi); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_i, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_got); + __pyx_t_2 += 6; + __Pyx_GIVEREF(__pyx_kp_u_got); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_got); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent1, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_and); + __pyx_t_2 += 5; + __Pyx_GIVEREF(__pyx_kp_u_and); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_kp_u_and); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent2, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_2 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_kp_u__7); + __pyx_t_4 = __Pyx_PyUnicode_Join(__pyx_t_1, 7, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, PyObject *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1253 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: + * raise error, msg % dim # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_v_msg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_t_2, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1253, __pyx_L1_error) + + /* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, PyObject *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1257 + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: + * raise error, msg # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_no_memory') + */ + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_v_msg, 0, 0); + __PYX_ERR(1, 1257, __pyx_L1_error) + + /* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + +static int __pyx_memoryview_err_no_memory(void) { + int __pyx_r; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1261 + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: + * raise MemoryError # <<<<<<<<<<<<<< + * + * + */ + PyErr_NoMemory(); __PYX_ERR(1, 1261, __pyx_L1_error) + + /* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err_no_memory", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1273 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1274 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1276 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1277 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1278 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = (__pyx_v_src_ndim < __pyx_v_dst_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1282 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = (__pyx_v_dst_ndim < __pyx_v_src_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1284 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1286 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + __pyx_t_2 = (__pyx_t_3 > __pyx_t_4); + if (__pyx_t_2) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1288 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1291 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1292 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1294 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1294, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = ((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1297 + * + * if src.suboffsets[i] >= 0: + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Dimension_d_is_not_direct, __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1297, __pyx_L1_error) + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = __pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = (!__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim)); + if (__pyx_t_2) { + + /* "View.MemoryView":1302 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1304 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1304, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1305 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (!__pyx_v_broadcasting); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1311 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1313 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + if (__pyx_v_direct_copy) { + + /* "View.MemoryView":1317 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1318 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1319 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1320 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1321 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + if (__pyx_t_2) { + + /* "View.MemoryView":1326 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1326, __pyx_L1_error) + + /* "View.MemoryView":1327 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1327, __pyx_L1_error) + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1329 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1330 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1331 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1333 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1334 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1341 + * int ndim_other) noexcept nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1343 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1344 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1345 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1346 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1348 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1349 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1350 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1351 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + if (__pyx_v_dtype_is_object) { + + /* "View.MemoryView":1362 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + } + + /* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1368 + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + + /* function exit code */ + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1374 + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * + * for i in range(shape[0]): + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1376 + * cdef Py_ssize_t stride = strides[0] + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = (__pyx_v_ndim == 1); + if (__pyx_t_4) { + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + if (__pyx_v_inc) { + + /* "View.MemoryView":1379 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1381 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1383 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += stride + */ + /*else*/ { + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1385 + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + * + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + + /* function exit code */ +} + +/* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1394 + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1395 + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) # <<<<<<<<<<<<<< + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1396 + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1404 + * size_t itemsize, void *item) noexcept nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1405 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1408 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1409 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1410 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1412 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1413 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) # <<<<<<<<<<<<<< + * data += stride + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1414 + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__8, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "imputer.pyx":13 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] object_imputer( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[object, ndim=1] statistics, + */ + +static PyObject *__pyx_pw_7imputer_1object_imputer(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyArrayObject *__pyx_f_7imputer_object_imputer(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics, PyArrayObject *__pyx_v_idx_columns, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_statistics; + __Pyx_Buffer __pyx_pybuffer_statistics; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + Py_ssize_t __pyx_t_11; + __pyx_t_5numpy_int64_t __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + int __pyx_t_15; + PyObject **__pyx_t_16; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("object_imputer", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_statistics.pybuffer.buf = NULL; + __pyx_pybuffer_statistics.refcount = 0; + __pyx_pybuffernd_statistics.data = NULL; + __pyx_pybuffernd_statistics.rcbuffer = &__pyx_pybuffer_statistics; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 13, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer, (PyObject*)__pyx_v_statistics, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 13, __pyx_L1_error) + } + __pyx_pybuffernd_statistics.diminfo[0].strides = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_statistics.diminfo[0].shape = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 13, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + + /* "imputer.pyx":30 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_idx_columns = idx_columns.shape[0] + * for j in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "imputer.pyx":31 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = idx_columns.shape[0] # <<<<<<<<<<<<<< + * for j in range(n_rows): + * for i in range(n_idx_columns): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_idx_columns)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 31, __pyx_L1_error) + __pyx_v_n_idx_columns = (__pyx_t_1[0]); + + /* "imputer.pyx":32 + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = idx_columns.shape[0] + * for j in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_idx_columns): + * if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "imputer.pyx":33 + * cdef int n_idx_columns = idx_columns.shape[0] + * for j in range(n_rows): + * for i in range(n_idx_columns): # <<<<<<<<<<<<<< + * if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): + * X[j, idx_columns[i]] = statistics[i] + */ + __pyx_t_5 = __pyx_v_n_idx_columns; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "imputer.pyx":34 + * for j in range(n_rows): + * for i in range(n_idx_columns): + * if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): # <<<<<<<<<<<<<< + * X[j, idx_columns[i]] = statistics[i] + * return X + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + __pyx_t_12 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_10 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_10 == NULL)) __pyx_t_10 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_10); + __pyx_t_9 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + __pyx_t_12 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_13 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_13 == NULL)) __pyx_t_13 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_13); + __pyx_t_14 = PyObject_RichCompare(__pyx_t_10, __pyx_t_13, Py_NE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely((__pyx_t_15 < 0))) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + if (!__pyx_t_15) { + } else { + __pyx_t_8 = __pyx_t_15; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_9 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + __pyx_t_12 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_14 = (PyObject *) *__Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides); + if (unlikely(__pyx_t_14 == NULL)) __pyx_t_14 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_14); + __pyx_t_13 = PyObject_RichCompare(__pyx_t_14, Py_None, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely((__pyx_t_15 < 0))) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_8 = __pyx_t_15; + __pyx_L8_bool_binop_done:; + if (__pyx_t_8) { + + /* "imputer.pyx":35 + * for i in range(n_idx_columns): + * if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): + * X[j, idx_columns[i]] = statistics[i] # <<<<<<<<<<<<<< + * return X + * + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_13 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_statistics.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_statistics.diminfo[0].strides); + if (unlikely(__pyx_t_13 == NULL)) __pyx_t_13 = Py_None; + __Pyx_INCREF((PyObject*)__pyx_t_13); + __pyx_t_9 = __pyx_v_i; + __pyx_t_11 = __pyx_v_j; + __pyx_t_12 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_idx_columns.diminfo[0].strides)); + __pyx_t_16 = __Pyx_BufPtrStrided2d(PyObject **, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides); + __Pyx_XGOTREF(*__pyx_t_16); + __Pyx_INCREF(__pyx_t_13); __Pyx_XDECREF(*__pyx_t_16); + *__pyx_t_16 = __pyx_t_13; + __Pyx_XGIVEREF(*__pyx_t_16); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + + /* "imputer.pyx":34 + * for j in range(n_rows): + * for i in range(n_idx_columns): + * if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): # <<<<<<<<<<<<<< + * X[j, idx_columns[i]] = statistics[i] + * return X + */ + } + } + } + + /* "imputer.pyx":36 + * if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): + * X[j, idx_columns[i]] = statistics[i] + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "imputer.pyx":13 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] object_imputer( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[object, ndim=1] statistics, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("imputer.object_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7imputer_1object_imputer(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +PyDoc_STRVAR(__pyx_doc_7imputer_object_imputer, "Object imputer.\n\n Args:\n X (np.ndarray): Input array.\n statistics(np.ndarray): Imputation values.\n idx_columns (np.ndarray): Array of column indices.\n \n Returns:\n np.ndarray: Imputed array.\n "); +static PyMethodDef __pyx_mdef_7imputer_1object_imputer = {"object_imputer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7imputer_1object_imputer, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7imputer_object_imputer}; +static PyObject *__pyx_pw_7imputer_1object_imputer(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_statistics = 0; + PyArrayObject *__pyx_v_idx_columns = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("object_imputer (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_statistics,&__pyx_n_s_idx_columns,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 13, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_statistics)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 13, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("object_imputer", 1, 3, 3, 1); __PYX_ERR(0, 13, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_idx_columns)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 13, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("object_imputer", 1, 3, 3, 2); __PYX_ERR(0, 13, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "object_imputer") < 0)) __PYX_ERR(0, 13, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_statistics = ((PyArrayObject *)values[1]); + __pyx_v_idx_columns = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("object_imputer", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 13, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("imputer.object_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 14, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_statistics), __pyx_ptype_5numpy_ndarray, 1, "statistics", 0))) __PYX_ERR(0, 15, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_idx_columns), __pyx_ptype_5numpy_ndarray, 1, "idx_columns", 0))) __PYX_ERR(0, 16, __pyx_L1_error) + __pyx_r = __pyx_pf_7imputer_object_imputer(__pyx_self, __pyx_v_X, __pyx_v_statistics, __pyx_v_idx_columns); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7imputer_object_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics, PyArrayObject *__pyx_v_idx_columns) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_idx_columns; + __Pyx_Buffer __pyx_pybuffer_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_statistics; + __Pyx_Buffer __pyx_pybuffer_statistics; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("object_imputer", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_statistics.pybuffer.buf = NULL; + __pyx_pybuffer_statistics.refcount = 0; + __pyx_pybuffernd_statistics.data = NULL; + __pyx_pybuffernd_statistics.rcbuffer = &__pyx_pybuffer_statistics; + __pyx_pybuffer_idx_columns.pybuffer.buf = NULL; + __pyx_pybuffer_idx_columns.refcount = 0; + __pyx_pybuffernd_idx_columns.data = NULL; + __pyx_pybuffernd_idx_columns.rcbuffer = &__pyx_pybuffer_idx_columns; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 13, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer, (PyObject*)__pyx_v_statistics, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 13, __pyx_L1_error) + } + __pyx_pybuffernd_statistics.diminfo[0].strides = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_statistics.diminfo[0].shape = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer, (PyObject*)__pyx_v_idx_columns, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 13, __pyx_L1_error) + } + __pyx_pybuffernd_idx_columns.diminfo[0].strides = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_idx_columns.diminfo[0].shape = __pyx_pybuffernd_idx_columns.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_f_7imputer_object_imputer(__pyx_v_X, __pyx_v_statistics, __pyx_v_idx_columns, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("imputer.object_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_idx_columns.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "imputer.pyx":41 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.float64_t, ndim=1] statistics, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7imputer_3float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +PyDoc_STRVAR(__pyx_doc_7imputer_2float_imputer, "Float imputer.\n\n Args:\n X (np.ndarray): Input array.\n statistics (np.ndarray): Imputation values.\n \n Returns:\n np.ndarray: Imputed array.\n "); +static PyMethodDef __pyx_mdef_7imputer_3float_imputer = {"float_imputer", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7imputer_3float_imputer, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7imputer_2float_imputer}; +static PyObject *__pyx_pw_7imputer_3float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 41, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 41, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 41, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 41, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 41, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("imputer.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7imputer_2float_imputer(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7imputer_2float_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + CYTHON_UNUSED int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("float_imputer", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 41, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_2); + __Pyx_GIVEREF(__pyx_int_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_2)) __PYX_ERR(0, 41, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 41, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L19_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L22_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L33_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L32_next_and; + } + __pyx_L33_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_L32_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 41, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L39_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L38_next_and; + } + __pyx_L39_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L37_bool_binop_done; + } + __pyx_L38_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L37_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 41, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L29_try_end; + __pyx_L22_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("imputer.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 41, __pyx_L24_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L23_exception_handled; + } + goto __pyx_L24_except_error; + __pyx_L24_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L27_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L23_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L29_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 41, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L49; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L49:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 41, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L53; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 41, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 41, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L53:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L68_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L68_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L52_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L52_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L70_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 41, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("imputer.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7imputer_5__pyx_fuse_0float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7imputer_3float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_7imputer_float_imputer(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_statistics; + __Pyx_Buffer __pyx_pybuffer_statistics; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0float_imputer", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_statistics.pybuffer.buf = NULL; + __pyx_pybuffer_statistics.refcount = 0; + __pyx_pybuffernd_statistics.data = NULL; + __pyx_pybuffernd_statistics.rcbuffer = &__pyx_pybuffer_statistics; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer, (PyObject*)__pyx_v_statistics, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_statistics.diminfo[0].strides = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_statistics.diminfo[0].shape = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.shape[0]; + + /* "imputer.pyx":58 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_idx_columns = X.shape[1] + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "imputer.pyx":59 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = X.shape[1] # <<<<<<<<<<<<<< + * with nogil: + * for j in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_idx_columns = (__pyx_t_1[1]); + + /* "imputer.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_rows): + * for i in range(n_idx_columns): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "imputer.pyx":61 + * cdef int n_idx_columns = X.shape[1] + * with nogil: + * for j in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_idx_columns): + * if isnan(X[j, i]): + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "imputer.pyx":62 + * with nogil: + * for j in range(n_rows): + * for i in range(n_idx_columns): # <<<<<<<<<<<<<< + * if isnan(X[j, i]): + * X[j, i] = statistics[i] + */ + __pyx_t_5 = __pyx_v_n_idx_columns; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "imputer.pyx":63 + * for j in range(n_rows): + * for i in range(n_idx_columns): + * if isnan(X[j, i]): # <<<<<<<<<<<<<< + * X[j, i] = statistics[i] + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = isnan((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "imputer.pyx":64 + * for i in range(n_idx_columns): + * if isnan(X[j, i]): + * X[j, i] = statistics[i] # <<<<<<<<<<<<<< + * return X + * + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + __pyx_t_11 = __pyx_v_i; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_statistics.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_statistics.diminfo[0].strides)); + + /* "imputer.pyx":63 + * for j in range(n_rows): + * for i in range(n_idx_columns): + * if isnan(X[j, i]): # <<<<<<<<<<<<<< + * X[j, i] = statistics[i] + * return X + */ + } + } + } + } + + /* "imputer.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_rows): + * for i in range(n_idx_columns): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "imputer.pyx":65 + * if isnan(X[j, i]): + * X[j, i] = statistics[i] + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "imputer.pyx":41 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.float64_t, ndim=1] statistics, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("imputer.float_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7imputer_5__pyx_fuse_0float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_7imputer_5__pyx_fuse_0float_imputer = {"__pyx_fuse_0float_imputer", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7imputer_5__pyx_fuse_0float_imputer, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7imputer_2float_imputer}; +static PyObject *__pyx_pw_7imputer_5__pyx_fuse_0float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_statistics = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0float_imputer (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_statistics,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_statistics)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0float_imputer", 1, 2, 2, 1); __PYX_ERR(0, 41, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0float_imputer") < 0)) __PYX_ERR(0, 41, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_statistics = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0float_imputer", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 41, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("imputer.__pyx_fuse_0float_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 42, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_statistics), __pyx_ptype_5numpy_ndarray, 1, "statistics", 0))) __PYX_ERR(0, 43, __pyx_L1_error) + __pyx_r = __pyx_pf_7imputer_4__pyx_fuse_0float_imputer(__pyx_self, __pyx_v_X, __pyx_v_statistics); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7imputer_4__pyx_fuse_0float_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_statistics; + __Pyx_Buffer __pyx_pybuffer_statistics; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0float_imputer", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_statistics.pybuffer.buf = NULL; + __pyx_pybuffer_statistics.refcount = 0; + __pyx_pybuffernd_statistics.data = NULL; + __pyx_pybuffernd_statistics.rcbuffer = &__pyx_pybuffer_statistics; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer, (PyObject*)__pyx_v_statistics, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_statistics.diminfo[0].strides = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_statistics.diminfo[0].shape = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_7imputer_float_imputer(((PyArrayObject *)__pyx_v_X), __pyx_v_statistics, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("imputer.__pyx_fuse_0float_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_7imputer_7__pyx_fuse_1float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7imputer_3float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_7imputer_float_imputer(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_idx_columns; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_statistics; + __Pyx_Buffer __pyx_pybuffer_statistics; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1float_imputer", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_statistics.pybuffer.buf = NULL; + __pyx_pybuffer_statistics.refcount = 0; + __pyx_pybuffernd_statistics.data = NULL; + __pyx_pybuffernd_statistics.rcbuffer = &__pyx_pybuffer_statistics; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer, (PyObject*)__pyx_v_statistics, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_statistics.diminfo[0].strides = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_statistics.diminfo[0].shape = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.shape[0]; + + /* "imputer.pyx":58 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_idx_columns = X.shape[1] + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "imputer.pyx":59 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = X.shape[1] # <<<<<<<<<<<<<< + * with nogil: + * for j in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error) + __pyx_v_n_idx_columns = (__pyx_t_1[1]); + + /* "imputer.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_rows): + * for i in range(n_idx_columns): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "imputer.pyx":61 + * cdef int n_idx_columns = X.shape[1] + * with nogil: + * for j in range(n_rows): # <<<<<<<<<<<<<< + * for i in range(n_idx_columns): + * if isnan(X[j, i]): + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_j = __pyx_t_4; + + /* "imputer.pyx":62 + * with nogil: + * for j in range(n_rows): + * for i in range(n_idx_columns): # <<<<<<<<<<<<<< + * if isnan(X[j, i]): + * X[j, i] = statistics[i] + */ + __pyx_t_5 = __pyx_v_n_idx_columns; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "imputer.pyx":63 + * for j in range(n_rows): + * for i in range(n_idx_columns): + * if isnan(X[j, i]): # <<<<<<<<<<<<<< + * X[j, i] = statistics[i] + * return X + */ + __pyx_t_8 = __pyx_v_j; + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = isnan((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides))); + if (__pyx_t_10) { + + /* "imputer.pyx":64 + * for i in range(n_idx_columns): + * if isnan(X[j, i]): + * X[j, i] = statistics[i] # <<<<<<<<<<<<<< + * return X + * + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + __pyx_t_11 = __pyx_v_i; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides) = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_statistics.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_statistics.diminfo[0].strides)); + + /* "imputer.pyx":63 + * for j in range(n_rows): + * for i in range(n_idx_columns): + * if isnan(X[j, i]): # <<<<<<<<<<<<<< + * X[j, i] = statistics[i] + * return X + */ + } + } + } + } + + /* "imputer.pyx":60 + * cdef int n_rows = X.shape[0] + * cdef int n_idx_columns = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for j in range(n_rows): + * for i in range(n_idx_columns): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "imputer.pyx":65 + * if isnan(X[j, i]): + * X[j, i] = statistics[i] + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "imputer.pyx":41 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.float64_t, ndim=1] statistics, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("imputer.float_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7imputer_7__pyx_fuse_1float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_7imputer_7__pyx_fuse_1float_imputer = {"__pyx_fuse_1float_imputer", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7imputer_7__pyx_fuse_1float_imputer, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7imputer_2float_imputer}; +static PyObject *__pyx_pw_7imputer_7__pyx_fuse_1float_imputer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_statistics = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1float_imputer (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_statistics,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_statistics)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1float_imputer", 1, 2, 2, 1); __PYX_ERR(0, 41, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1float_imputer") < 0)) __PYX_ERR(0, 41, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_statistics = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1float_imputer", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 41, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("imputer.__pyx_fuse_1float_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 42, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_statistics), __pyx_ptype_5numpy_ndarray, 1, "statistics", 0))) __PYX_ERR(0, 43, __pyx_L1_error) + __pyx_r = __pyx_pf_7imputer_6__pyx_fuse_1float_imputer(__pyx_self, __pyx_v_X, __pyx_v_statistics); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7imputer_6__pyx_fuse_1float_imputer(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_statistics) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_statistics; + __Pyx_Buffer __pyx_pybuffer_statistics; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1float_imputer", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_statistics.pybuffer.buf = NULL; + __pyx_pybuffer_statistics.refcount = 0; + __pyx_pybuffernd_statistics.data = NULL; + __pyx_pybuffernd_statistics.rcbuffer = &__pyx_pybuffer_statistics; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer, (PyObject*)__pyx_v_statistics, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 41, __pyx_L1_error) + } + __pyx_pybuffernd_statistics.diminfo[0].strides = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_statistics.diminfo[0].shape = __pyx_pybuffernd_statistics.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_7imputer_float_imputer(((PyArrayObject *)__pyx_v_X), __pyx_v_statistics, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("imputer.__pyx_fuse_1float_imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_statistics.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_array) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_array___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_array_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_array}, + {Py_sq_length, (void *)__pyx_array___len__}, + {Py_sq_item, (void *)__pyx_sq_item_array}, + {Py_mp_length, (void *)__pyx_array___len__}, + {Py_mp_subscript, (void *)__pyx_array___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_array}, + {Py_tp_getattro, (void *)__pyx_tp_getattro_array}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_array_getbuffer}, + #endif + {Py_tp_methods, (void *)__pyx_methods_array}, + {Py_tp_getset, (void *)__pyx_getsets_array}, + {Py_tp_new, (void *)__pyx_tp_new_array}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_array_spec = { + "imputer.array", + sizeof(struct __pyx_array_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_array_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "imputer.""array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_Enum) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_specialmethod___pyx_MemviewEnum___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_MemviewEnum___repr__(self); +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_MemviewEnum___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_MemviewEnum_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_Enum}, + {Py_tp_repr, (void *)__pyx_MemviewEnum___repr__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_Enum}, + {Py_tp_clear, (void *)__pyx_tp_clear_Enum}, + {Py_tp_methods, (void *)__pyx_methods_Enum}, + {Py_tp_init, (void *)__pyx_MemviewEnum___init__}, + {Py_tp_new, (void *)__pyx_tp_new_Enum}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_MemviewEnum_spec = { + "imputer.Enum", + sizeof(struct __pyx_MemviewEnum_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_MemviewEnum_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "imputer.""Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_memoryview) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryview___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyObject *__pyx_specialmethod___pyx_memoryview___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_memoryview___repr__(self); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_memoryview___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"is_c_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_c_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"is_f_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_f_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy_fortran", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy_fortran, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_memoryview_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_memoryview}, + {Py_tp_repr, (void *)__pyx_memoryview___repr__}, + {Py_sq_length, (void *)__pyx_memoryview___len__}, + {Py_sq_item, (void *)__pyx_sq_item_memoryview}, + {Py_mp_length, (void *)__pyx_memoryview___len__}, + {Py_mp_subscript, (void *)__pyx_memoryview___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_memoryview}, + {Py_tp_str, (void *)__pyx_memoryview___str__}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_memoryview_getbuffer}, + #endif + {Py_tp_traverse, (void *)__pyx_tp_traverse_memoryview}, + {Py_tp_clear, (void *)__pyx_tp_clear_memoryview}, + {Py_tp_methods, (void *)__pyx_methods_memoryview}, + {Py_tp_getset, (void *)__pyx_getsets_memoryview}, + {Py_tp_new, (void *)__pyx_tp_new_memoryview}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryview_spec = { + "imputer.memoryview", + sizeof(struct __pyx_memoryview_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_memoryview_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "imputer.""memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc__memoryviewslice) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryviewslice___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XCLEAR_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_memoryviewslice_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc__memoryviewslice}, + {Py_tp_doc, (void *)PyDoc_STR("Internal class for passing memoryview slices to Python")}, + {Py_tp_traverse, (void *)__pyx_tp_traverse__memoryviewslice}, + {Py_tp_clear, (void *)__pyx_tp_clear__memoryviewslice}, + {Py_tp_methods, (void *)__pyx_methods__memoryviewslice}, + {Py_tp_new, (void *)__pyx_tp_new__memoryviewslice}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryviewslice_spec = { + "imputer._memoryviewslice", + sizeof(struct __pyx_memoryviewslice_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_memoryviewslice_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "imputer.""_memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + PyDoc_STR("Internal class for passing memoryview slices to Python"), /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_k_All_dimensions_preceding_dimensi, sizeof(__pyx_k_All_dimensions_preceding_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_u_Cannot_index_with_type, __pyx_k_Cannot_index_with_type, sizeof(__pyx_k_Cannot_index_with_type), 0, 1, 0, 0}, + {&__pyx_kp_s_Cannot_transpose_memoryview_with, __pyx_k_Cannot_transpose_memoryview_with, sizeof(__pyx_k_Cannot_transpose_memoryview_with), 0, 0, 1, 0}, + {&__pyx_kp_s_Dimension_d_is_not_direct, __pyx_k_Dimension_d_is_not_direct, sizeof(__pyx_k_Dimension_d_is_not_direct), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_k_Expected_at_least_d_argument_s_g, sizeof(__pyx_k_Expected_at_least_d_argument_s_g), 0, 0, 1, 0}, + {&__pyx_kp_s_Function_call_with_ambiguous_arg, __pyx_k_Function_call_with_ambiguous_arg, sizeof(__pyx_k_Function_call_with_ambiguous_arg), 0, 0, 1, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_k_Index_out_of_bounds_axis_d, sizeof(__pyx_k_Index_out_of_bounds_axis_d), 0, 0, 1, 0}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 1, 0, 0}, + {&__pyx_kp_u_Invalid_shape_in_axis, __pyx_k_Invalid_shape_in_axis, sizeof(__pyx_k_Invalid_shape_in_axis), 0, 1, 0, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_kp_s_No_matching_signature_found, __pyx_k_No_matching_signature_found, sizeof(__pyx_k_No_matching_signature_found), 0, 0, 1, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_u_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 1, 0, 0}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_Sequence, __pyx_k_Sequence, sizeof(__pyx_k_Sequence), 0, 0, 1, 1}, + {&__pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_k_Step_may_not_be_zero_axis_d, sizeof(__pyx_k_Step_may_not_be_zero_axis_d), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0}, + {&__pyx_kp_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 0}, + {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, + {&__pyx_n_s__32, __pyx_k__32, sizeof(__pyx_k__32), 0, 0, 1, 1}, + {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_n_s_abc, __pyx_k_abc, sizeof(__pyx_k_abc), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_kp_u_and, __pyx_k_and, sizeof(__pyx_k_and), 0, 1, 0, 0}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_collections, __pyx_k_collections, sizeof(__pyx_k_collections), 0, 0, 1, 1}, + {&__pyx_kp_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, + {&__pyx_n_s_defaults, __pyx_k_defaults, sizeof(__pyx_k_defaults), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32_t, __pyx_k_float32_t, sizeof(__pyx_k_float32_t), 0, 0, 1, 1}, + {&__pyx_n_s_float64_t, __pyx_k_float64_t, sizeof(__pyx_k_float64_t), 0, 0, 1, 1}, + {&__pyx_n_s_float_imputer, __pyx_k_float_imputer, sizeof(__pyx_k_float_imputer), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_fused_sigindex, __pyx_k_fused_sigindex, sizeof(__pyx_k_fused_sigindex), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_imputers_imputer_pyx, __pyx_k_gators_imputers_imputer_pyx, sizeof(__pyx_k_gators_imputers_imputer_pyx), 0, 0, 1, 0}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_u_got, __pyx_k_got, sizeof(__pyx_k_got), 0, 1, 0, 0}, + {&__pyx_kp_u_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 1, 0, 0}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_idx_columns, __pyx_k_idx_columns, sizeof(__pyx_k_idx_columns), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_imputer, __pyx_k_imputer, sizeof(__pyx_k_imputer), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_kind, __pyx_k_kind, sizeof(__pyx_k_kind), 0, 0, 1, 1}, + {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_object_imputer, __pyx_k_object_imputer, sizeof(__pyx_k_object_imputer), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0float_imputer, __pyx_k_pyx_fuse_0float_imputer, sizeof(__pyx_k_pyx_fuse_0float_imputer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1float_imputer, __pyx_k_pyx_fuse_1float_imputer, sizeof(__pyx_k_pyx_fuse_1float_imputer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1}, + {&__pyx_n_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_signatures, __pyx_k_signatures, sizeof(__pyx_k_signatures), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_statistics, __pyx_k_statistics, sizeof(__pyx_k_statistics), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 32, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_builtin___import__ = __Pyx_GetBuiltinName(__pyx_n_s_import); if (!__pyx_builtin___import__) __PYX_ERR(1, 100, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 156, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 159, __pyx_L1_error) + __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(1, 373, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 408, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 618, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 914, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__4 = PyTuple_New(1); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_tuple__4, 0, __pyx_int_neg_1)) __PYX_ERR(1, 582, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_slice__5 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_tuple__8 = PyTuple_Pack(3, __pyx_int_136983863, __pyx_int_112105877, __pyx_int_184977713); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "imputer.pyx":41 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.float64_t, ndim=1] statistics, + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_No_matching_signature_found); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_Function_call_with_ambiguous_arg); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_n_s_sys); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_tuple__16 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_3); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_collections_abc); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_n_s_collections); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__24 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "imputer.pyx":13 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] object_imputer( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[object, ndim=1] statistics, + */ + __pyx_tuple__26 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_statistics, __pyx_n_s_idx_columns); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_imputers_imputer_pyx, __pyx_n_s_object_imputer, 13, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 13, __pyx_L1_error) + + /* "imputer.pyx":41 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.float64_t, ndim=1] statistics, + */ + __pyx_tuple__28 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_statistics); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_imputers_imputer_pyx, __pyx_n_s_pyx_fuse_0float_imputer, 41, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_imputers_imputer_pyx, __pyx_n_s_pyx_fuse_0float_imputer, 41, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_imputers_imputer_pyx, __pyx_n_s_pyx_fuse_1float_imputer, 41, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get; + __pyx_umethod_PyDict_Type_values.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_values.method_name = &__pyx_n_s_values; + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_112105877 = PyInt_FromLong(112105877L); if (unlikely(!__pyx_int_112105877)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_136983863 = PyInt_FromLong(136983863L); if (unlikely(!__pyx_int_136983863)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* AssertionsEnabled.init */ + if (likely(__Pyx_init_assertions_enabled() == 0)); else + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_collections_abc_Sequence = Py_None; Py_INCREF(Py_None); + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + #if CYTHON_USE_TYPE_SPECS + __pyx_array_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_array_spec, NULL); if (unlikely(!__pyx_array_type)) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_array_type->tp_as_buffer = &__pyx_tp_as_buffer_array; + if (!__pyx_array_type->tp_as_buffer->bf_releasebuffer && __pyx_array_type->tp_base->tp_as_buffer && __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_array_type->tp_as_buffer->bf_releasebuffer = __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_array_spec, __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #else + __pyx_array_type = &__pyx_type___pyx_array; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_array_type->tp_print = 0; + #endif + if (__Pyx_SetVtable(__pyx_array_type, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_MemviewEnum_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_MemviewEnum_spec, NULL); if (unlikely(!__pyx_MemviewEnum_type)) __PYX_ERR(1, 302, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_MemviewEnum_spec, __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #else + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_MemviewEnum_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_MemviewEnum_type->tp_dictoffset && __pyx_MemviewEnum_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_MemviewEnum_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + __pyx_vtable_memoryview._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryview__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_memoryview_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryview_spec, NULL); if (unlikely(!__pyx_memoryview_type)) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryview_type->tp_as_buffer = &__pyx_tp_as_buffer_memoryview; + if (!__pyx_memoryview_type->tp_as_buffer->bf_releasebuffer && __pyx_memoryview_type->tp_base->tp_as_buffer && __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_memoryview_type->tp_as_buffer->bf_releasebuffer = __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryview_spec, __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #else + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryview_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryview_type->tp_dictoffset && __pyx_memoryview_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryview_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryview_type, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_vtable__memoryviewslice.__pyx_base._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryviewslice__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_memoryview_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 952, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_memoryviewslice_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryviewslice_spec, __pyx_t_1); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_memoryviewslice_type)) __PYX_ERR(1, 952, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryviewslice_spec, __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #else + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryviewslice_type->tp_base = __pyx_memoryview_type; + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryviewslice_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryviewslice_type->tp_dictoffset && __pyx_memoryviewslice_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryviewslice_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryviewslice_type, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_imputer(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_imputer}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "imputer", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initimputer(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initimputer(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_imputer(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_imputer(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_imputer(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + static PyThread_type_lock __pyx_t_8[8]; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'imputer' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("imputer", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "imputer" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_imputer(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_imputer) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "imputer")) { + if (unlikely((PyDict_SetItemString(modules, "imputer", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_version_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_tuple__16, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_abc); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L7_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":104 + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + * except: # <<<<<<<<<<<<<< + * + * __pyx_collections_abc_Sequence = None + */ + /*except:*/ { + __Pyx_AddTraceback("View.MemoryView", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(1, 104, __pyx_L4_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + + /* "View.MemoryView":106 + * except: + * + * __pyx_collections_abc_Sequence = None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF(Py_None); + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + __pyx_L4_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L7_try_end:; + } + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":242 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":243 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L16_try_end; + __pyx_L11_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":244 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L12_exception_handled; + } + __pyx_L12_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L16_try_end:; + } + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":323 + * + * + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":324 + * + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_8[0] = PyThread_allocate_lock(); + __pyx_t_8[1] = PyThread_allocate_lock(); + __pyx_t_8[2] = PyThread_allocate_lock(); + __pyx_t_8[3] = PyThread_allocate_lock(); + __pyx_t_8[4] = PyThread_allocate_lock(); + __pyx_t_8[5] = PyThread_allocate_lock(); + __pyx_t_8[6] = PyThread_allocate_lock(); + __pyx_t_8[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_8, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":983 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":984 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L22_try_end; + __pyx_L17_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":985 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L18_exception_handled; + } + __pyx_L18_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L22_try_end:; + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_collections_abc_Sequence); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 989, __pyx_L23_error) + if (__pyx_t_6) { + + /* "View.MemoryView":993 + * + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence.register(array) + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, ((PyObject *)__pyx_memoryviewslice_type)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":994 + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) # <<<<<<<<<<<<<< + * except: + * pass # ignore failure, it's a minor issue + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_array_type)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L28_try_end; + __pyx_L23_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":995 + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) + * except: # <<<<<<<<<<<<<< + * pass # ignore failure, it's a minor issue + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L24_exception_handled; + } + __pyx_L24_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L28_try_end:; + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_7 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_7) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "imputer.pyx":13 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[object, ndim = 2] object_imputer( # <<<<<<<<<<<<<< + * np.ndarray[object, ndim=2] X, + * np.ndarray[object, ndim=1] statistics, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7imputer_1object_imputer, 0, __pyx_n_s_object_imputer, NULL, __pyx_n_s_imputer, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_object_imputer, __pyx_t_7) < 0) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "imputer.pyx":41 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[np.float64_t, ndim=1] statistics, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_7imputer_5__pyx_fuse_0float_imputer, 0, __pyx_n_s_pyx_fuse_0float_imputer, NULL, __pyx_n_s_imputer, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_float_imputer, __pyx_t_7) < 0) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_7imputer_7__pyx_fuse_1float_imputer, 0, __pyx_n_s_pyx_fuse_1float_imputer, NULL, __pyx_n_s_imputer, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_float_imputer, __pyx_t_7) < 0) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_7imputer_5__pyx_fuse_0float_imputer, 0, __pyx_n_s_pyx_fuse_0float_imputer, NULL, __pyx_n_s_imputer, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_7imputer_7__pyx_fuse_1float_imputer, 0, __pyx_n_s_pyx_fuse_1float_imputer, NULL, __pyx_n_s_imputer, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_7imputer_3float_imputer, 0, __pyx_n_s_float_imputer, NULL, __pyx_n_s_imputer, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults), 1)) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_float_imputer, __pyx_t_4) < 0) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "imputer.pyx":1 + * # License: Apache-2.0 # <<<<<<<<<<<<<< + * cimport cython + * cimport numpy as np + */ + __pyx_t_4 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_4) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init imputer", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init imputer"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* CIntToDigits */ +static const char DIGIT_PAIRS_10[2*10*10+1] = { + "00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" +}; +static const char DIGIT_PAIRS_8[2*8*8+1] = { + "0001020304050607" + "1011121314151617" + "2021222324252627" + "3031323334353637" + "4041424344454647" + "5051525354555657" + "6061626364656667" + "7071727374757677" +}; +static const char DIGITS_HEX[2*16+1] = { + "0123456789abcdef" + "0123456789ABCDEF" +}; + +/* BuildPyUnicode */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char) { + PyObject *uval; + Py_ssize_t uoffset = ulength - clength; +#if CYTHON_USE_UNICODE_INTERNALS + Py_ssize_t i; +#if CYTHON_PEP393_ENABLED + void *udata; + uval = PyUnicode_New(ulength, 127); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_DATA(uval); +#else + Py_UNICODE *udata; + uval = PyUnicode_FromUnicode(NULL, ulength); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_AS_UNICODE(uval); +#endif + if (uoffset > 0) { + i = 0; + if (prepend_sign) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-'); + i++; + } + for (; i < uoffset; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char); + } + } + for (i=0; i < clength; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]); + } +#else + { + PyObject *sign = NULL, *padding = NULL; + uval = NULL; + if (uoffset > 0) { + prepend_sign = !!prepend_sign; + if (uoffset > prepend_sign) { + padding = PyUnicode_FromOrdinal(padding_char); + if (likely(padding) && uoffset > prepend_sign + 1) { + PyObject *tmp; + PyObject *repeat = PyInt_FromSsize_t(uoffset - prepend_sign); + if (unlikely(!repeat)) goto done_or_error; + tmp = PyNumber_Multiply(padding, repeat); + Py_DECREF(repeat); + Py_DECREF(padding); + padding = tmp; + } + if (unlikely(!padding)) goto done_or_error; + } + if (prepend_sign) { + sign = PyUnicode_FromOrdinal('-'); + if (unlikely(!sign)) goto done_or_error; + } + } + uval = PyUnicode_DecodeASCII(chars, clength, NULL); + if (likely(uval) && padding) { + PyObject *tmp = PyNumber_Add(padding, uval); + Py_DECREF(uval); + uval = tmp; + } + if (likely(uval) && sign) { + PyObject *tmp = PyNumber_Add(sign, uval); + Py_DECREF(uval); + uval = tmp; + } +done_or_error: + Py_XDECREF(padding); + Py_XDECREF(sign); + } +#endif + return uval; +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(int)*3+2]; + char *dpos, *end = digits + sizeof(int)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + int remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (int) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (int) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (int) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(Py_ssize_t)*3+2]; + char *dpos, *end = digits + sizeof(Py_ssize_t)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + Py_ssize_t remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const Py_ssize_t neg_one = (Py_ssize_t) -1, const_zero = (Py_ssize_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (Py_ssize_t) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (Py_ssize_t) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (Py_ssize_t) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* JoinPyUnicode */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char) { +#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *result_uval; + int result_ukind, kind_shift; + Py_ssize_t i, char_pos; + void *result_udata; + CYTHON_MAYBE_UNUSED_VAR(max_char); +#if CYTHON_PEP393_ENABLED + result_uval = PyUnicode_New(result_ulength, max_char); + if (unlikely(!result_uval)) return NULL; + result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND; + kind_shift = (result_ukind == PyUnicode_4BYTE_KIND) ? 2 : result_ukind - 1; + result_udata = PyUnicode_DATA(result_uval); +#else + result_uval = PyUnicode_FromUnicode(NULL, result_ulength); + if (unlikely(!result_uval)) return NULL; + result_ukind = sizeof(Py_UNICODE); + kind_shift = (result_ukind == 4) ? 2 : result_ukind - 1; + result_udata = PyUnicode_AS_UNICODE(result_uval); +#endif + assert(kind_shift == 2 || kind_shift == 1 || kind_shift == 0); + char_pos = 0; + for (i=0; i < value_count; i++) { + int ukind; + Py_ssize_t ulength; + void *udata; + PyObject *uval = PyTuple_GET_ITEM(value_tuple, i); + if (unlikely(__Pyx_PyUnicode_READY(uval))) + goto bad; + ulength = __Pyx_PyUnicode_GET_LENGTH(uval); + if (unlikely(!ulength)) + continue; + if (unlikely((PY_SSIZE_T_MAX >> kind_shift) - ulength < char_pos)) + goto overflow; + ukind = __Pyx_PyUnicode_KIND(uval); + udata = __Pyx_PyUnicode_DATA(uval); + if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) { + memcpy((char *)result_udata + (char_pos << kind_shift), udata, (size_t) (ulength << kind_shift)); + } else { + #if PY_VERSION_HEX >= 0x030d0000 + if (unlikely(PyUnicode_CopyCharacters(result_uval, char_pos, uval, 0, ulength) < 0)) goto bad; + #elif CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters) + _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength); + #else + Py_ssize_t j; + for (j=0; j < ulength; j++) { + Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j); + __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar); + } + #endif + } + char_pos += ulength; + } + return result_uval; +overflow: + PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string"); +bad: + Py_DECREF(result_uval); + return NULL; +#else + CYTHON_UNUSED_VAR(max_char); + CYTHON_UNUSED_VAR(result_ulength); + CYTHON_UNUSED_VAR(value_count); + return PyUnicode_Join(__pyx_empty_unicode, value_tuple); +#endif +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kw, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { + Py_ssize_t kwsize; +#if CYTHON_ASSUME_SAFE_MACROS + kwsize = PyTuple_GET_SIZE(kw); +#else + kwsize = PyTuple_Size(kw); + if (kwsize < 0) return 0; +#endif + if (unlikely(kwsize == 0)) + return 1; + if (!kw_allowed) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, 0); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + goto invalid_keyword; + } +#if PY_VERSION_HEX < 0x03090000 + for (pos = 0; pos < kwsize; pos++) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, pos); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } +#endif + return 1; + } + while (PyDict_Next(kw, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if (!kw_allowed && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* DivInt[Py_ssize_t] */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__3; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; itp_as_sequence && type->tp_as_sequence->sq_repeat)) { + return type->tp_as_sequence->sq_repeat(seq, mul); + } else +#endif + { + return __Pyx_PySequence_Multiply_Generic(seq, mul); + } +} + +/* SetItemInt */ +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { + int r; + if (unlikely(!j)) return -1; + r = PyObject_SetItem(o, j, v); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, + CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_ass_subscript) { + int r; + PyObject *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return -1; + r = mm->mp_ass_subscript(o, key, v); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_ass_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return -1; + PyErr_Clear(); + } + } + return sm->sq_ass_item(o, i, v); + } + } +#else + if (is_list || !PyMapping_Check(o)) + { + return PySequence_SetItem(o, i, v); + } +#endif + return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); +} + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* DivInt[long] */ +static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__2); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} +#endif + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* DictGetItem */ + #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* UnicodeAsUCS4 */ + static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ + static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + __Pyx_TypeName c_type_name = __Pyx_PyType_GetName(Py_TYPE(c)); + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but " __Pyx_FMT_TYPENAME " found", + c_type_name); + __Pyx_DECREF_TypeName(c_type_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* memoryview_get_from_buffer */ + #if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj) { + Py_ssize_t result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_itemsize); + if (!attr) { + goto bad; + } + result = PyLong_AsSsize_t(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* memoryview_get_from_buffer */ + #if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj) { + int result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_ndim); + if (!attr) { + goto bad; + } + result = PyLong_AsLong(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* IterFinish */ + static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* PyObjectCallNoArg */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ + static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ + static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* UnpackItemEndCheck */ + static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* UnpackTupleError */ + static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ + static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ + #if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* UnpackUnboundCMethod */ + static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { + PyObject *result; + PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); + if (unlikely(!selfless_args)) return NULL; + result = PyObject_Call(method, selfless_args, kwargs); + Py_DECREF(selfless_args); + return result; +} +static PyMethodDef __Pyx_UnboundCMethod_Def = { + "CythonUnboundCMethod", + __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), + METH_VARARGS | METH_KEYWORDS, + NULL +}; +static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { + PyObject *method; + method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); + if (unlikely(!method)) + return -1; + target->method = method; +#if CYTHON_COMPILING_IN_CPYTHON + #if PY_MAJOR_VERSION >= 3 + if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) + #else + if (likely(!__Pyx_CyOrPyCFunction_Check(method))) + #endif + { + PyMethodDescrObject *descr = (PyMethodDescrObject*) method; + target->func = descr->d_method->ml_meth; + target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); + } else +#endif +#if CYTHON_COMPILING_IN_PYPY +#else + if (PyCFunction_Check(method)) +#endif + { + PyObject *self; + int self_found; +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + self = PyObject_GetAttrString(method, "__self__"); + if (!self) { + PyErr_Clear(); + } +#else + self = PyCFunction_GET_SELF(method); +#endif + self_found = (self && self != Py_None); +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + Py_XDECREF(self); +#endif + if (self_found) { + PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); + if (unlikely(!unbound_method)) return -1; + Py_DECREF(method); + target->method = unbound_method; + } + } + return 0; +} + +/* CallUnboundCMethod0 */ + static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) { + PyObject *args, *result = NULL; + if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_ASSUME_SAFE_MACROS + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); +#else + args = PyTuple_Pack(1, self); + if (unlikely(!args)) goto bad; +#endif + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + Py_DECREF(args); +bad: + return result; +} + +/* py_dict_values */ + static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) { + if (PY_MAJOR_VERSION >= 3) + return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_values, d); + else + return PyDict_Values(d); +} + +/* CallUnboundCMethod1 */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) { + if (likely(cfunc->func)) { + int flag = cfunc->flag; + if (flag == METH_O) { + return (*(cfunc->func))(self, arg); + } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + #endif + } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) { + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + } + } + return __Pyx__CallUnboundCMethod1(cfunc, self, arg); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(2, self, arg); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* CallUnboundCMethod2 */ + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) { + if (likely(cfunc->func)) { + PyObject *args[2] = {arg1, arg2}; + if (cfunc->flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + #if PY_VERSION_HEX >= 0x030700A0 + if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS)) + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(3); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 1, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 2, arg2); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(3, self, arg1, arg2); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* dict_getitem_default */ + static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { + PyObject* value; +#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (unlikely(PyErr_Occurred())) + return NULL; + value = default_value; + } + Py_INCREF(value); + if ((1)); +#else + if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { + value = PyDict_GetItem(d, key); + if (unlikely(!value)) { + value = default_value; + } + Py_INCREF(value); + } +#endif + else { + if (default_value == Py_None) + value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key); + else + value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value); + } + return value; +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ + #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ + static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* SetVTable */ + static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ + static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* FusedFunction */ + static PyObject * +__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code) +{ + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_FusedFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + __pyx_FusedFunctionObject *fusedfunc = (__pyx_FusedFunctionObject *) op; + fusedfunc->__signatures__ = NULL; + fusedfunc->self = NULL; + PyObject_GC_Track(op); + } + return op; +} +static void +__pyx_FusedFunction_dealloc(__pyx_FusedFunctionObject *self) +{ + PyObject_GC_UnTrack(self); + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + __Pyx__CyFunction_dealloc((__pyx_CyFunctionObject *) self); +} +static int +__pyx_FusedFunction_traverse(__pyx_FusedFunctionObject *self, + visitproc visit, + void *arg) +{ + Py_VISIT(self->self); + Py_VISIT(self->__signatures__); + return __Pyx_CyFunction_traverse((__pyx_CyFunctionObject *) self, visit, arg); +} +static int +__pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self) +{ + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + return __Pyx_CyFunction_clear((__pyx_CyFunctionObject *) self); +} +static PyObject * +__pyx_FusedFunction_descr_get(PyObject *self, PyObject *obj, PyObject *type) +{ + __pyx_FusedFunctionObject *func, *meth; + func = (__pyx_FusedFunctionObject *) self; + if (func->self || func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(self); + return self; + } + if (obj == Py_None) + obj = NULL; + if (func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD) + obj = type; + if (obj == NULL) { + Py_INCREF(self); + return self; + } + meth = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_New( + ((PyCFunctionObject *) func)->m_ml, + ((__pyx_CyFunctionObject *) func)->flags, + ((__pyx_CyFunctionObject *) func)->func_qualname, + ((__pyx_CyFunctionObject *) func)->func_closure, + ((PyCFunctionObject *) func)->m_module, + ((__pyx_CyFunctionObject *) func)->func_globals, + ((__pyx_CyFunctionObject *) func)->func_code); + if (unlikely(!meth)) + return NULL; + if (func->func.defaults) { + PyObject **pydefaults; + int i; + if (unlikely(!__Pyx_CyFunction_InitDefaults( + (PyObject*)meth, + func->func.defaults_size, + func->func.defaults_pyobjects))) { + Py_XDECREF((PyObject*)meth); + return NULL; + } + memcpy(meth->func.defaults, func->func.defaults, func->func.defaults_size); + pydefaults = __Pyx_CyFunction_Defaults(PyObject *, meth); + for (i = 0; i < meth->func.defaults_pyobjects; i++) + Py_XINCREF(pydefaults[i]); + } + __Pyx_CyFunction_SetClassObj(meth, __Pyx_CyFunction_GetClassObj(func)); + Py_XINCREF(func->__signatures__); + meth->__signatures__ = func->__signatures__; + Py_XINCREF(func->func.defaults_tuple); + meth->func.defaults_tuple = func->func.defaults_tuple; + Py_XINCREF(obj); + meth->self = obj; + return (PyObject *) meth; +} +static PyObject * +_obj_to_string(PyObject *obj) +{ + if (PyUnicode_CheckExact(obj)) + return __Pyx_NewRef(obj); +#if PY_MAJOR_VERSION == 2 + else if (PyString_Check(obj)) + return PyUnicode_FromEncodedObject(obj, NULL, "strict"); +#endif + else if (PyType_Check(obj)) + return PyObject_GetAttr(obj, __pyx_n_s_name_2); + else + return PyObject_Unicode(obj); +} +static PyObject * +__pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx) +{ + PyObject *signature = NULL; + PyObject *unbound_result_func; + PyObject *result_func = NULL; + if (unlikely(self->__signatures__ == NULL)) { + PyErr_SetString(PyExc_TypeError, "Function is not fused"); + return NULL; + } + if (PyTuple_Check(idx)) { + Py_ssize_t n = PyTuple_GET_SIZE(idx); + PyObject *list = PyList_New(n); + int i; + if (unlikely(!list)) + return NULL; + for (i = 0; i < n; i++) { + PyObject *string; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(idx, i); +#else + PyObject *item = PySequence_ITEM(idx, i); if (unlikely(!item)) goto __pyx_err; +#endif + string = _obj_to_string(item); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(item); +#endif + if (unlikely(!string)) goto __pyx_err; + PyList_SET_ITEM(list, i, string); + } + signature = PyUnicode_Join(__pyx_kp_u__12, list); +__pyx_err:; + Py_DECREF(list); + } else { + signature = _obj_to_string(idx); + } + if (unlikely(!signature)) + return NULL; + unbound_result_func = PyObject_GetItem(self->__signatures__, signature); + if (likely(unbound_result_func)) { + if (self->self) { + __pyx_FusedFunctionObject *unbound = (__pyx_FusedFunctionObject *) unbound_result_func; + __Pyx_CyFunction_SetClassObj(unbound, __Pyx_CyFunction_GetClassObj(self)); + result_func = __pyx_FusedFunction_descr_get(unbound_result_func, + self->self, self->self); + } else { + result_func = unbound_result_func; + Py_INCREF(result_func); + } + } + Py_DECREF(signature); + Py_XDECREF(unbound_result_func); + return result_func; +} +static PyObject * +__pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; + int static_specialized = (cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD && + !((__pyx_FusedFunctionObject *) func)->__signatures__); + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !static_specialized) { + return __Pyx_CyFunction_CallAsMethod(func, args, kw); + } else { + return __Pyx_CyFunction_Call(func, args, kw); + } +} +static PyObject * +__pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_FusedFunctionObject *binding_func = (__pyx_FusedFunctionObject *) func; + Py_ssize_t argc = PyTuple_GET_SIZE(args); + PyObject *new_args = NULL; + __pyx_FusedFunctionObject *new_func = NULL; + PyObject *result = NULL; + int is_staticmethod = binding_func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD; + if (binding_func->self) { + PyObject *self; + Py_ssize_t i; + new_args = PyTuple_New(argc + 1); + if (unlikely(!new_args)) + return NULL; + self = binding_func->self; + Py_INCREF(self); + PyTuple_SET_ITEM(new_args, 0, self); + self = NULL; + for (i = 0; i < argc; i++) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(args, i); + Py_INCREF(item); +#else + PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad; +#endif + PyTuple_SET_ITEM(new_args, i + 1, item); + } + args = new_args; + } + if (binding_func->__signatures__) { + PyObject *tup; + if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) { + tup = PyTuple_Pack(3, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod( + func, binding_func->__signatures__, tup, NULL); + } else { + tup = PyTuple_Pack(4, binding_func->__signatures__, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL); + } + Py_DECREF(tup); + if (unlikely(!new_func)) + goto bad; + __Pyx_CyFunction_SetClassObj(new_func, __Pyx_CyFunction_GetClassObj(binding_func)); + func = (PyObject *) new_func; + } + result = __pyx_FusedFunction_callfunction(func, args, kw); +bad: + Py_XDECREF(new_args); + Py_XDECREF((PyObject *) new_func); + return result; +} +static PyMemberDef __pyx_FusedFunction_members[] = { + {(char *) "__signatures__", + T_OBJECT, + offsetof(__pyx_FusedFunctionObject, __signatures__), + READONLY, + 0}, + {(char *) "__self__", T_OBJECT_EX, offsetof(__pyx_FusedFunctionObject, self), READONLY, 0}, + {0, 0, 0, 0, 0}, +}; +static PyGetSetDef __pyx_FusedFunction_getsets[] = { + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_FusedFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__pyx_FusedFunction_dealloc}, + {Py_tp_call, (void *)__pyx_FusedFunction_call}, + {Py_tp_traverse, (void *)__pyx_FusedFunction_traverse}, + {Py_tp_clear, (void *)__pyx_FusedFunction_clear}, + {Py_tp_members, (void *)__pyx_FusedFunction_members}, + {Py_tp_getset, (void *)__pyx_FusedFunction_getsets}, + {Py_tp_descr_get, (void *)__pyx_FusedFunction_descr_get}, + {Py_mp_subscript, (void *)__pyx_FusedFunction_getitem}, + {0, 0}, +}; +static PyType_Spec __pyx_FusedFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_FusedFunctionType_slots +}; +#else +static PyMappingMethods __pyx_FusedFunction_mapping_methods = { + 0, + (binaryfunc) __pyx_FusedFunction_getitem, + 0, +}; +static PyTypeObject __pyx_FusedFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + (destructor) __pyx_FusedFunction_dealloc, + 0, + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + 0, + 0, + 0, + &__pyx_FusedFunction_mapping_methods, + 0, + (ternaryfunc) __pyx_FusedFunction_call, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __pyx_FusedFunction_traverse, + (inquiry) __pyx_FusedFunction_clear, + 0, + 0, + 0, + 0, + 0, + __pyx_FusedFunction_members, + __pyx_FusedFunction_getsets, + &__pyx_CyFunctionType_type, + 0, + __pyx_FusedFunction_descr_get, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_FusedFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + PyObject *bases = PyTuple_Pack(1, __pyx_CyFunctionType); + if (unlikely(!bases)) { + return -1; + } + __pyx_FusedFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_FusedFunctionType_spec, bases); + Py_DECREF(bases); +#else + CYTHON_UNUSED_VAR(module); + __pyx_FusedFunctionType_type.tp_base = __pyx_CyFunctionType; + __pyx_FusedFunctionType = __Pyx_FetchCommonType(&__pyx_FusedFunctionType_type); +#endif + if (unlikely(__pyx_FusedFunctionType == NULL)) { + return -1; + } + return 0; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (unlikely(buf->strides[dim] != sizeof(void *))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (unlikely(buf->strides[dim] != buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (unlikely(stride < buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (unlikely(buf->suboffsets)) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, int ndim, int spec) +{ + CYTHON_UNUSED_VAR(ndim); + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (unlikely(buf->ndim != ndim)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; + } + if (unlikely((unsigned) buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->len > 0) { + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; + } + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) + goto fail; + } + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* PyUCS4InUnicode */ + #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if PY_VERSION_HEX < 0x03090000 +#define __Pyx_PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(op) +#define __Pyx_PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(op) +#else +#define __Pyx_PyUnicode_AS_UNICODE(op) (((PyASCIIObject *)(op))->wstr) +#define __Pyx_PyUnicode_GET_SIZE(op) ((PyCompactUnicodeObject *)(op))->wstr_length +#endif +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 +static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE high_val, low_val; + Py_UNICODE* pos; + high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1))); + low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1))); + for (pos=buffer; pos < buffer+length-1; pos++) { + if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1; + } + return 0; +} +#endif +static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE uchar; + Py_UNICODE* pos; + uchar = (Py_UNICODE) character; + for (pos=buffer; pos < buffer+length; pos++) { + if (unlikely(uchar == pos[0])) return 1; + } + return 0; +} +#endif +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { +#if CYTHON_PEP393_ENABLED + const int kind = PyUnicode_KIND(unicode); + #ifdef PyUnicode_WCHAR_KIND + if (likely(kind != PyUnicode_WCHAR_KIND)) + #endif + { + Py_ssize_t i; + const void* udata = PyUnicode_DATA(unicode); + const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); + for (i=0; i < length; i++) { + if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1; + } + return 0; + } +#elif PY_VERSION_HEX >= 0x03090000 + #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. +#elif !defined(PyUnicode_AS_UNICODE) + #error Cannot use "UChar in Unicode" in Python < 3.9 without Py_UNICODE support. +#endif +#if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 + if ((sizeof(Py_UNICODE) == 2) && unlikely(character > 65535)) { + return __Pyx_PyUnicodeBufferContainsUCS4_SP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } else +#endif + { + return __Pyx_PyUnicodeBufferContainsUCS4_BMP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } +#endif +} + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (unlikely(from_mvs->suboffsets[i] >= 0)) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (unlikely(memviewslice->memview || memviewslice->data)) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#if PY_VERSION_HEX >= 0x030A0000 || defined(HAVE_STDARG_PROTOTYPES) + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + return; + } + old_acquisition_count = __pyx_add_acquisition_count(memview); + if (unlikely(old_acquisition_count <= 0)) { + if (likely(old_acquisition_count == 0)) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count+1, lineno); + } + } +} +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + memslice->memview = NULL; + return; + } + old_acquisition_count = __pyx_sub_acquisition_count(memview); + memslice->data = NULL; + if (likely(old_acquisition_count > 1)) { + memslice->memview = NULL; + } else if (likely(old_acquisition_count == 1)) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count-1, lineno); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* ImportNumPyArray */ + static PyObject* __Pyx__ImportNumPyArray(void) { + PyObject *numpy_module, *ndarray_object = NULL; + numpy_module = __Pyx_Import(__pyx_n_s_numpy, NULL, 0); + if (likely(numpy_module)) { + ndarray_object = PyObject_GetAttrString(numpy_module, "ndarray"); + Py_DECREF(numpy_module); + } + if (unlikely(!ndarray_object)) { + PyErr_Clear(); + } + if (unlikely(!ndarray_object || !PyObject_TypeCheck(ndarray_object, &PyType_Type))) { + Py_XDECREF(ndarray_object); + Py_INCREF(Py_None); + ndarray_object = Py_None; + } + return ndarray_object; +} +static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void) { + if (unlikely(!__pyx_numpy_ndarray)) { + __pyx_numpy_ndarray = __Pyx__ImportNumPyArray(); + } + Py_INCREF(__pyx_numpy_ndarray); + return __pyx_numpy_ndarray; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const char neg_one = (char) -1, const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(char) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 2 * PyLong_SHIFT)) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 3 * PyLong_SHIFT)) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 4 * PyLong_SHIFT)) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(char) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(char) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(char) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (char) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (char) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (char) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (char) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(char) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(char) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((char) 1) << (sizeof(char) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name_2); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__32); + } + return name; +} +#endif + +/* CheckBinaryVersion */ + static unsigned long __Pyx_get_runtime_version(void) { +#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/imputers/imputer.pyx b/gators/imputers/imputer.pyx index ecb652af..c89bea3f 100644 --- a/gators/imputers/imputer.pyx +++ b/gators/imputers/imputer.pyx @@ -31,7 +31,7 @@ cpdef np.ndarray[object, ndim = 2] object_imputer( cdef int n_idx_columns = idx_columns.shape[0] for j in range(n_rows): for i in range(n_idx_columns): - if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] is None): + if (X[j, idx_columns[i]] != X[j, idx_columns[i]]) or (X[j, idx_columns[i]] == None): X[j, idx_columns[i]] = statistics[i] return X @@ -41,14 +41,13 @@ cpdef np.ndarray[object, ndim = 2] object_imputer( cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( np.ndarray[num_float_t, ndim=2] X, np.ndarray[np.float64_t, ndim=1] statistics, - np.ndarray[np.int64_t, ndim=1] idx_columns, + # np.ndarray[np.int64_t, ndim=1] idx_columns, ): """Float imputer. Args: X (np.ndarray): Input array. statistics (np.ndarray): Imputation values. - idx_columns (np.ndarray): Array of column indices. Returns: np.ndarray: Imputed array. @@ -57,40 +56,40 @@ cpdef np.ndarray[num_float_t, ndim = 2] float_imputer( cdef int i cdef int j cdef int n_rows = X.shape[0] - cdef int n_idx_columns = idx_columns.shape[0] + cdef int n_idx_columns = X.shape[1] with nogil: for j in range(n_rows): for i in range(n_idx_columns): - if isnan(X[j, idx_columns[i]]): - X[j, idx_columns[i]] = statistics[i] + if isnan(X[j, i]): + X[j, i] = statistics[i] return X -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef np.ndarray[object, ndim = 2] float_imputer_object( - np.ndarray[object, ndim=2] X, - np.ndarray[object, ndim=1] statistics, - np.ndarray[np.int64_t, ndim=1] idx_columns, -): - """Float imputer. +# @cython.boundscheck(False) +# @cython.wraparound(False) +# cpdef np.ndarray[object, ndim = 2] float_imputer_object( +# np.ndarray[object, ndim=2] X, +# np.ndarray[object, ndim=1] statistics, +# np.ndarray[np.int64_t, ndim=1] idx_columns, +# ): +# """Float imputer. - Args: - X (np.ndarray): Input array. - statistics(np.ndarray): Imputation values. - idx_columns (np.ndarray): Array of column indices. +# Args: +# X (np.ndarray): Input array. +# statistics(np.ndarray): Imputation values. +# idx_columns (np.ndarray): Array of column indices. - Returns: - np.ndarray: Imputed array. - """ +# Returns: +# np.ndarray: Imputed array. +# """ - cdef int i - cdef int j - cdef int n_rows = X.shape[0] - cdef int n_idx_columns = idx_columns.shape[0] - for j in range(n_rows): - for i in range(n_idx_columns): - if isnan(X[j, idx_columns[i]]): - X[j, idx_columns[i]] = statistics[i] - return X +# cdef int i +# cdef int j +# cdef int n_rows = X.shape[0] +# cdef int n_idx_columns = idx_columns.shape[0] +# for j in range(n_rows): +# for i in range(n_idx_columns): +# if isnan(X[j, idx_columns[i]]): +# X[j, idx_columns[i]] = statistics[i] +# return X diff --git a/gators/imputers/int_imputer.py b/gators/imputers/int_imputer.py deleted file mode 100644 index 8928fbed..00000000 --- a/gators/imputers/int_imputer.py +++ /dev/null @@ -1,174 +0,0 @@ -# License: Apache-2.0 -import warnings -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd -from imputer import float_imputer, float_imputer_object - -from ..util import util -from ._base_imputer import _BaseImputer - - -class IntImputer(_BaseImputer): - """Impute the numerical columns satisfying the condition X == X.round() - using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'most_frequent' - - 'mean' - - 'median' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - columns: List[str], default to None. - List of columns. - - Examples - --------- - - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> obj.fit_transform(X) - A B - 0 1.0 z - 1 2.0 a - 2 -999.0 a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> obj.fit_transform(X) - A B - 0 1.0 z - 1 2.0 a - 2 -999.0 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = pd.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.0, 'z'], - [2.0, 'a'], - [-999.0, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> X = ks.DataFrame({'A': [1, 2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = IntImputer(strategy='constant', value=-999) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[1.0, 'z'], - [2.0, 'a'], - [-999.0, 'a']], dtype=object) - - See Also - -------- - gators.imputers.FloatImputer - Impute float columns. - gators.imputers.NumericsImputer - Impute numerical columns. - gators.imputers.ObjectImputer - Impute categorical columns. - - """ - - def __init__(self, strategy: str, value: float = None, columns: List[str] = None): - _BaseImputer.__init__(self, strategy, value, columns) - if strategy == "constant" and not isinstance(value, int): - raise TypeError( - """`value` should be a integer - for the IntImputer class""" - ) - self.columns = columns - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "IntImputer": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Imputer: Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_int_only_columns(X=X) - if not self.columns: - warnings.warn( - """`X` does not contain columns satisfying: - X[column] == X[column].round(), - `IntImputer` is not needed""" - ) - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array(list(self.statistics.values())).astype( - np.float64 - ) - return self - - def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - X_dtype = X.dtype - if "int" in str(X_dtype): - return X - elif X_dtype == object: - return float_imputer_object( - X, self.statistics_values.astype(object), self.idx_columns - ) - else: - return float_imputer(X, self.statistics_values, self.idx_columns) diff --git a/gators/imputers/numeric_imputer.py b/gators/imputers/numeric_imputer.py new file mode 100644 index 00000000..b12cd305 --- /dev/null +++ b/gators/imputers/numeric_imputer.py @@ -0,0 +1,173 @@ +# License: Apache-2.0 +import warnings +from typing import List + +import numpy as np + +from imputer import float_imputer + +from ._base_imputer import _BaseImputer + +from gators import DataFrame, Series + + +class NumericImputer(_BaseImputer): + """Impute the numerical columns using the strategy passed by the user. + + Parameters + ---------- + strategy : str + Imputation strategy. + + Supported imputation strategies are: + + - 'constant' + - 'mean' + - 'median' + + value : str, default None. + Imputation value used for `strategy=constant`. + inplace : bool, default True. + If True, impute in-place. + If False, create new imputed columns. + + Examples + --------- + + >>> from gators.imputers import NumericImputer + + >>> bins = {'A':[-np.inf, 0, np.inf], 'B':[-np.inf, 1, np.inf]} + + The imputation can be done for the selected numerical columns + + >>> obj = NumericImputer(strategy='mean', columns=['A']) + + or for all the numerical columns + + >>> obj = NumericImputer(strategy='mean') + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> import numpy as np + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> import numpy as np + >>> X = ps.DataFrame( + ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> import numpy as np + >>> X = pd.DataFrame( + ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) + + The result is a transformed dataframe belonging to the same dataframe library. + + * imputation done for the selected columns: + + >>> obj = NumericImputer(strategy='mean', columns=['A']) + >>> obj.fit_transform(X) + A B C + 0 0.10 1.0 z + 1 0.20 2.0 a + 2 0.15 NaN a + + * imputation done for all the columns: + + >>> X = pd.DataFrame( + ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) + >>> obj = NumericImputer(strategy='mean') + >>> obj.fit_transform(X) + A B C + 0 0.10 1.0 z + 1 0.20 2.0 a + 2 0.15 1.5 a + + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame( + ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) + >>> obj.transform_numpy(X.to_numpy()) + array([[0.1, 1.0, 'z'], + [0.2, 2.0, 'a'], + [0.15000000000000002, 1.5, 'a']], dtype=object) + + See Also + -------- + gators.imputers.ObjectImputer + Impute categorical columns. + """ + + def __init__( + self, + strategy: str, + value: float = None, + columns: List[str] = None, + inplace: bool = True, + ): + _BaseImputer.__init__(self, strategy, value, columns=columns, inplace=inplace) + if strategy == "constant" and not isinstance(self.value, (int, float)): + raise TypeError( + """`value` should be an int or a float + for the NumericImputer class""" + ) + self.value = float(self.value) if self.value is not None else None + + def fit(self, X: DataFrame, y: Series = None) -> "NumericImputer": + """Fit the transformer on the dataframe X. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : 'NumericImputer' + Instance of itself. + """ + self.check_dataframe(X) + self.set_columns(X, [int, float], suffix="impute") + self.statistics = self.compute_statistics(X=X, value=self.value) + self.statistics_np = np.array(list(self.statistics.values())) + return self + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the NumPy array X. + + Parameters + ---------- + X :np.ndarray: + Input array. + + Returns + ------- + X : np.ndarray: + Transformed array. + """ + self.check_array(X) + if self.idx_columns.size == 0: + return X + if self.inplace: + X[:, self.idx_columns] = float_imputer( + X[:, self.idx_columns].astype(float), self.statistics_np + ) + return X + X_impute = float_imputer( + X[:, self.idx_columns].copy().astype(float), self.statistics_np + ) + return np.concatenate((X, X_impute), axis=1) diff --git a/gators/imputers/numerics_imputer.py b/gators/imputers/numerics_imputer.py deleted file mode 100644 index f5d75e8d..00000000 --- a/gators/imputers/numerics_imputer.py +++ /dev/null @@ -1,206 +0,0 @@ -# License: Apache-2.0 -import warnings -from typing import List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd -from imputer import float_imputer, float_imputer_object - -from ..util import util -from ._base_imputer import _BaseImputer - - -class NumericsImputer(_BaseImputer): - """Impute the numerical columns using the strategy passed by the user. - - Parameters - ---------- - strategy : str - Imputation strategy. - - Supported imputation strategies are: - - - 'constant' - - 'mean' - - 'median' - - value : str, default to None. - Imputation value used for `strategy=constant`. - - Examples - --------- - - * fit & transform with `pandas` - - - impute all the numerical columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = pd.DataFrame( - ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> obj.fit_transform(X) - A B C - 0 0.10 1.0 z - 1 0.20 2.0 a - 2 0.15 1.5 a - - - impute selected numerical columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = pd.DataFrame( - ... {'A': [0.1, 0.2, np.nan], 'B': [1, 2, np.nan], 'C': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean', columns=['A']) - >>> obj.fit_transform(X) - A B C - 0 0.10 1.0 z - 1 0.20 2.0 a - 2 0.15 NaN a - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> obj.fit_transform(X) - A B - 0 0.10 z - 1 0.20 a - 2 0.15 a - - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = pd.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.15000000000000002, 'a']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import NumericsImputer - >>> X = ks.DataFrame({'A': [0.1, 0.2, np.nan], 'B': ['z', 'a', 'a']}) - >>> obj = NumericsImputer(strategy='mean') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 'z'], - [0.2, 'a'], - [0.15000000000000002, 'a']], dtype=object) - - See Also - -------- - gators.imputers.IntImputer - Impute integer columns. - gators.imputers.FloatImputer - Impute float columns. - gators.imputers.ObjectImputer - Impute categorical columns. - - """ - - def __init__(self, strategy: str, value: float = None, columns: List[str] = None): - _BaseImputer.__init__(self, strategy, value, columns) - if strategy not in ["constant", "mean", "median"]: - raise ValueError( - """`strategy` should be "constant", ,"mean" - or "median" for NumericsImputer Transformer.""" - ) - if strategy == "constant" and not isinstance(value, float): - raise TypeError( - """`value` should be a float - for the NumericsImputer class""" - ) - - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "NumericsImputer": - """Fit the transformer on the pandas/koalas dataframe X. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - 'NumericsImputer': Instance of itself. - """ - self.check_dataframe(X) - if not self.columns: - self.columns = util.get_datatype_columns(X, float) - if not self.columns: - warnings.warn( - """`X` does not contain numerical columns, - `NumericsImputer` is not needed""" - ) - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array(list(self.statistics.values())) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - if isinstance(X, pd.DataFrame): - return X.fillna(self.statistics) - for col, val in self.statistics.items(): - X[col] = X[col].replace({np.nan: val}) - return X - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: - Transformed NumPy array. - """ - self.check_array(X) - if self.idx_columns.size == 0: - return X - if X.dtype == object: - return float_imputer_object( - X, self.statistics_values.astype(object), self.idx_columns - ) - return float_imputer(X, self.statistics_values, self.idx_columns) diff --git a/gators/imputers/object_imputer.py b/gators/imputers/object_imputer.py index 4b40bb4c..d69b3f77 100644 --- a/gators/imputers/object_imputer.py +++ b/gators/imputers/object_imputer.py @@ -1,15 +1,15 @@ # License: Apache-2.0 import warnings -from typing import Union -import databricks.koalas as ks + import numpy as np -import pandas as pd + from imputer import object_imputer -from ..util import util from ._base_imputer import _BaseImputer +from gators import DataFrame, Series + class ObjectImputer(_BaseImputer): """Impute the categorical columns using the strategy passed by the user. @@ -24,104 +24,106 @@ class ObjectImputer(_BaseImputer): - 'constant' - 'most_frequent' - value : str, default to None. + value : str, default None. Imputation value used for `strategy=constant`. + inplace : bool, default True. + If True, impute in-place. + If False, create new imputed columns. Examples --------- - - * fit & transform with `pandas` - - - impute all the object columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'a', None], - ... 'B': ['c', 'c', 'd', None], - ... 'C': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent') - >>> obj.fit_transform(X) - A B C - 0 a c 0.0 - 1 b c 1.0 - 2 a d 2.0 - 3 a c NaN - - - impute selected object columns - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = pd.DataFrame( - ... {'A': ['a', 'b', 'a', None], - ... 'B': ['c', 'c', 'd', None], - ... 'C': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent', columns=['A']) - >>> obj.fit_transform(X) - A B C - 0 a c 0.0 - 1 b c 1.0 - 2 a d 2.0 - 3 a None NaN - - - * fit & transform with `koalas` - - >>> import databricks.koalas as ks - >>> import numpy as np >>> from gators.imputers import ObjectImputer - >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) + + The imputation can be done for the selected categorical columns + + >>> obj = ObjectImputer(strategy='most_frequent', columns=['A']) + + or for all the categorical columns + >>> obj = ObjectImputer(strategy='most_frequent') - >>> obj.fit_transform(X) - A B - 0 a 0.0 - 1 b 1.0 - 2 a 2.0 - 3 a NaN - * fit with `pandas` & transform with `NumPy` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + >>> import dask.dataframe as dd >>> import pandas as pd >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) - >>> obj = ObjectImputer(strategy='most_frequent') - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([['a', 0.0], - ['b', 1.0], - ['a', 2.0], - ['a', nan]], dtype=object) + >>> X = dd.from_pandas(pd.DataFrame( + ... {'A': ['a', 'b', 'a', None], + ... 'B': ['c', 'c', 'd', None], + ... 'C': [0, 1, 2, np.nan]}), npartitions=1) - * fit with `koalas` & transform with `NumPy` + * `koalas` dataframes: - >>> import databricks.koalas as ks + >>> import pyspark.pandas as ps >>> import numpy as np - >>> from gators.imputers import ObjectImputer - >>> X = ks.DataFrame({'A': ['a', 'b', 'a', np.nan], 'B': [0, 1, 2, np.nan]}) + >>> X = ps.DataFrame( + ... {'A': ['a', 'b', 'a', None], + ... 'B': ['c', 'c', 'd', None], + ... 'C': [0, 1, 2, np.nan]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> import numpy as np + >>> X = pd.DataFrame( + ... {'A': ['a', 'b', 'a', None], + ... 'B': ['c', 'c', 'd', None], + ... 'C': [0, 1, 2, np.nan]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + * imputation done for the selected columns: + + >>> obj = ObjectImputer(strategy='most_frequent', columns=['A']) + >>> obj.fit_transform(X) + A B C + 0 a c 0.0 + 1 b c 1.0 + 2 a d 2.0 + 3 a None NaN + + * imputation done for all the columns: + + >>> X = pd.DataFrame( + ... {'A': ['a', 'b', 'a', None], + ... 'B': ['c', 'c', 'd', None], + ... 'C': [0, 1, 2, np.nan]}) >>> obj = ObjectImputer(strategy='most_frequent') - >>> _ = obj.fit(X) + >>> obj.fit_transform(X) + A B C + 0 a c 0.0 + 1 b c 1.0 + 2 a d 2.0 + 3 a c NaN + + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> X = pd.DataFrame( + ... {'A': ['a', 'b', 'a', None], + ... 'B': ['c', 'c', 'd', None], + ... 'C': [0, 1, 2, np.nan]}) >>> obj.transform_numpy(X.to_numpy()) - array([['a', 0.0], - ['b', 1.0], - ['a', 2.0], - ['a', nan]], dtype=object) + array([['a', 'c', 0.0], + ['b', 'c', 1.0], + ['a', 'd', 2.0], + ['a', 'c', nan]], dtype=object) See Also -------- - gators.imputers.IntImputer - Impute integer columns. - gators.imputers.FloatImputer - Impute float columns. - gators.imputers.NumericsImputer + gators.imputers.NumericImputer Impute numerical columns. """ - def __init__(self, strategy: str, value: str = None, columns=None): - _BaseImputer.__init__(self, strategy, value, columns=columns) + def __init__( + self, strategy: str, value: str = None, columns=None, inplace: bool = True + ): + _BaseImputer.__init__(self, strategy, value, columns=columns, inplace=inplace) if strategy not in ["constant", "most_frequent"]: raise ValueError( """`strategy` should be "constant" or "most_frequent" @@ -133,57 +135,45 @@ def __init__(self, strategy: str, value: str = None, columns=None): for the ObjectImputer class""" ) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "ObjectImputer": + def fit(self, X: DataFrame, y: Series = None) -> "ObjectImputer": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- - ObjectImputer: Instance of itself. + self : 'ObjectImputer' + Instance of itself. """ self.check_dataframe(X) - if not self.columns: - self.columns = util.get_datatype_columns(X, object) - if not self.columns: - warnings.warn( - """`X` does not contain object columns: - `ObjectImputer` is not needed""" - ) - self.idx_columns = np.array([]) - return self - self.idx_columns = util.get_idx_columns(X.columns, self.columns) - self.idx_columns = np.array(util.get_idx_columns(X, self.columns)) - self.statistics = self.compute_statistics( - X=X, - columns=self.columns, - strategy=self.strategy, - value=self.value, - ) - self.statistics_values = np.array(list(self.statistics.values())).astype(object) + self.set_columns(X, [object, "string[pyarrow]"], suffix="impute") + self.statistics = self.compute_statistics(X=X, value=self.value) + self.statistics_np = np.array(list(self.statistics.values())).astype(object) return self - def transform_numpy(self, X: Union[pd.Series, ks.Series], y=None): - """Transform the numpy ndarray X. + def transform_numpy(self, X: Series, y: Series = None): + """Transform the NumPy array X. Parameters ---------- - X (np.ndarray): Input ndarray. + X :np.ndarray: + Input array. Returns ------- - np.ndarray: Imputed ndarray. + X : np.ndarray + Transformed array. """ self.check_array(X) if self.idx_columns.size == 0: return X - return object_imputer(X, self.statistics_values, self.idx_columns) + if self.inplace: + return object_imputer(X, self.statistics_np, self.idx_columns) + else: + X_impute = object_imputer(X.copy(), self.statistics_np, self.idx_columns) + return np.concatenate((X, X_impute[:, self.idx_columns]), axis=1) diff --git a/gators/imputers/tests/test_imputers.py b/gators/imputers/tests/test_imputers.py deleted file mode 100644 index 5105036b..00000000 --- a/gators/imputers/tests/test_imputers.py +++ /dev/null @@ -1,915 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.imputers.float_imputer import FloatImputer -from gators.imputers.int_imputer import IntImputer -from gators.imputers.numerics_imputer import NumericsImputer -from gators.imputers.object_imputer import ObjectImputer - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture() -def data(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) - X_int_expected = pd.DataFrame( - {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} - ) - X_float_expected = pd.DataFrame( - {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} - ) - X_object_expected = pd.DataFrame( - {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} - ) - obj_int = IntImputer(strategy="constant", value=-9).fit(X_int) - obj_float = FloatImputer(strategy="mean").fit(X_float) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) - X_dict = { - "int": X_int, - "float": X_float, - "object": X_object, - } - X_expected_dict = { - "int": X_int_expected, - "float": X_float_expected, - "object": X_object_expected, - } - objs_dict = { - "int": obj_int, - "float": obj_float, - "object": obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_num(): - X_int = pd.DataFrame( - {"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}, dtype=np.float32 - ) - X_float = pd.DataFrame( - {"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}, dtype=np.float32 - ) - X_int_expected = pd.DataFrame( - {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]}, dtype=np.float32 - ) - X_float_expected = pd.DataFrame( - {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]}, dtype=np.float32 - ) - obj_int = IntImputer(strategy="constant", value=-9).fit(X_int) - obj_float = FloatImputer(strategy="mean").fit(X_float) - X_dict = { - "int": X_int, - "float": X_float, - } - X_expected_dict = { - "int": X_int_expected, - "float": X_float_expected, - } - objs_dict = { - "int": obj_int, - "float": obj_float, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_no_missing(): - X_int = pd.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, 9.0], "D": [2.1, 3.1, 4.1, 9.0]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", "x"], "F": ["a", "a", "s", "x"]}) - obj_int = IntImputer(strategy="constant", value=-9).fit(X_int) - obj_float = FloatImputer(strategy="mean").fit(X_float) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) - X_dict = { - "int": X_int, - "float": X_float, - "object": X_object, - } - X_expected_dict = { - "int": X_int.copy(), - "float": X_float.copy(), - "object": X_object.copy(), - } - objs_dict = { - "int": obj_int, - "float": obj_float, - "object": obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture -def data_full(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -9.0, 1.1, 3.1, "w", "a"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_int = IntImputer(strategy="constant", value=-9).fit(X) - obj_float = FloatImputer(strategy="median").fit(X) - obj_object = ObjectImputer(strategy="most_frequent").fit(X) - objs_dict = { - "int": obj_int, - "float": obj_float, - "object": obj_object, - } - return objs_dict, X, X_expected - - -@pytest.fixture() -def data_ks(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) - X_int_expected = pd.DataFrame( - {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} - ) - X_float_expected = pd.DataFrame( - {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} - ) - X_object_expected = pd.DataFrame( - {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} - ) - X_int_ks = ks.from_pandas(X_int) - X_float_ks = ks.from_pandas(X_float) - X_object_ks = ks.from_pandas(X_object) - obj_int = IntImputer(strategy="constant", value=-9).fit(X_int) - obj_float = FloatImputer(strategy="mean").fit(X_float) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) - X_dict = { - "int": X_int, - "float": X_float, - "object": X_object, - } - - X_dict = { - "int": X_int_ks, - "float": X_float_ks, - "object": X_object_ks, - } - - X_expected_dict = { - "int": X_int_expected, - "float": X_float_expected, - "object": X_object_expected, - } - - objs_dict = { - "int": obj_int, - "float": obj_float, - "object": obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_num_ks(): - X_int = ks.DataFrame( - {"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}, dtype=np.float32 - ) - X_float = ks.DataFrame( - {"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}, dtype=np.float32 - ) - X_int_expected = pd.DataFrame( - {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]}, dtype=np.float32 - ) - X_float_expected = pd.DataFrame( - {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]}, dtype=np.float32 - ) - obj_int = IntImputer(strategy="constant", value=-9).fit(X_int) - obj_float = FloatImputer(strategy="mean").fit(X_float) - X_dict = { - "int": X_int, - "float": X_float, - } - X_expected_dict = { - "int": X_int_expected, - "float": X_float_expected, - } - objs_dict = { - "int": obj_int, - "float": obj_float, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture() -def data_no_missing_ks(): - X_int = ks.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) - X_float = ks.DataFrame({"C": [0.1, 1.1, 2.1, 9.0], "D": [2.1, 3.1, 4.1, 9.0]}) - X_object = ks.DataFrame({"E": ["q", "w", "w", "x"], "F": ["a", "a", "s", "x"]}) - obj_int = IntImputer(strategy="constant", value=-9).fit(X_int) - obj_float = FloatImputer(strategy="mean").fit(X_float) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) - X_dict = { - "int": X_int, - "float": X_float, - "object": X_object, - } - X_expected_dict = { - "int": X_int.to_pandas().copy(), - "float": X_float.to_pandas().copy(), - "object": X_object.to_pandas().copy(), - } - objs_dict = { - "int": obj_int, - "float": obj_float, - "object": obj_object, - } - return objs_dict, X_dict, X_expected_dict - - -@pytest.fixture -def data_full_ks(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = ks.from_pandas(pd.concat([X_int, X_float, X_object], axis=1)) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -9.0, 1.1, 3.1, "w", "a"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_int = IntImputer(strategy="constant", value=-9).fit(X) - obj_float = FloatImputer(strategy="median").fit(X) - obj_object = ObjectImputer(strategy="most_frequent").fit(X) - objs_dict = { - "int": obj_int, - "float": obj_float, - "object": obj_object, - } - return objs_dict, X, X_expected - - -def test_int_pd(data): - objs_dict, X_dict, X_expected_dict = data - assert_frame_equal( - objs_dict["int"].transform(X_dict["int"]), - X_expected_dict["int"], - ) - - -def test_float_pd(data): - objs_dict, X_dict, X_expected_dict = data - assert_frame_equal( - objs_dict["float"].transform(X_dict["float"]), - X_expected_dict["float"], - ) - - -def test_object_pd(data): - objs_dict, X_dict, X_expected_dict = data - assert_frame_equal( - objs_dict["object"].transform(X_dict["object"]), - X_expected_dict["object"], - ) - - -@pytest.mark.koalas -def test_int_ks(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - assert_frame_equal( - objs_dict["int"].transform(X_dict["int"]).to_pandas(), - X_expected_dict["int"], - ) - - -@pytest.mark.koalas -def test_float_ks(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - assert_frame_equal( - objs_dict["float"].transform(X_dict["float"]).to_pandas(), - X_expected_dict["float"], - ) - - -@pytest.mark.koalas -def test_object_ks(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - assert_frame_equal( - objs_dict["object"].transform(X_dict["object"]).to_pandas(), - X_expected_dict["object"], - ) - - -def test_int_pd_np(data): - objs_dict, X_dict, X_expected_dict = data - X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) - assert_frame_equal(X_new, X_expected_dict["int"]) - - -def test_float_pd_np(data): - objs_dict, X_dict, X_expected_dict = data - X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) - assert_frame_equal(X_new, X_expected_dict["float"]) - - -def test_object_pd_np(data): - objs_dict, X_dict, X_expected_dict = data - X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) - assert_frame_equal(X_new, X_expected_dict["object"]) - - -@pytest.mark.koalas -def test_int_ks_np(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) - assert_frame_equal(X_new, X_expected_dict["int"]) - - -@pytest.mark.koalas -def test_float_ks_np(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) - assert_frame_equal(X_new, X_expected_dict["float"]) - - -@pytest.mark.koalas -def test_object_ks_np(data_ks): - objs_dict, X_dict, X_expected_dict = data_ks - X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) - assert_frame_equal(X_new, X_expected_dict["object"]) - - -def test_num_int_pd(data_num): - objs_dict, X_dict, X_expected_dict = data_num - assert_frame_equal( - objs_dict["int"].transform(X_dict["int"]), - X_expected_dict["int"], - ) - - -def test_num_float_pd(data_num): - objs_dict, X_dict, X_expected_dict = data_num - assert_frame_equal( - objs_dict["float"].transform(X_dict["float"]), - X_expected_dict["float"], - ) - - -@pytest.mark.koalas -def test_num_int_ks(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - assert_frame_equal( - objs_dict["int"].transform(X_dict["int"].to_pandas()), - X_expected_dict["int"], - ) - - -@pytest.mark.koalas -def test_num_float_ks(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - assert_frame_equal( - objs_dict["float"].transform(X_dict["float"].to_pandas()), - X_expected_dict["float"], - ) - - -def test_num_int_pd_np(data_num): - objs_dict, X_dict, X_expected_dict = data_num - X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) - assert_frame_equal(X_new, X_expected_dict["int"]) - - -def test_num_float_pd_np(data_num): - objs_dict, X_dict, X_expected_dict = data_num - X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) - assert_frame_equal(X_new, X_expected_dict["float"]) - - -@pytest.mark.koalas -def test_num_int_ks_np(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) - assert_frame_equal(X_new, X_expected_dict["int"]) - - -@pytest.mark.koalas -def test_num_float_ks_np(data_num_ks): - objs_dict, X_dict, X_expected_dict = data_num_ks - X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) - assert_frame_equal(X_new, X_expected_dict["float"]) - - -def test_no_missing_int_pd(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - assert_frame_equal( - objs_dict["int"].transform(X_dict["int"]), - X_expected_dict["int"], - ) - - -def test_no_missing_float_pd(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - assert_frame_equal( - objs_dict["float"].transform(X_dict["float"]), - X_expected_dict["float"], - ) - - -def test_no_missing_object_pd(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - assert_frame_equal( - objs_dict["object"].transform(X_dict["object"]), - X_expected_dict["object"], - ) - - -@pytest.mark.koalas -def test_no_missing_int_ks(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - assert_frame_equal( - objs_dict["int"].transform(X_dict["int"].to_pandas()), - X_expected_dict["int"], - ) - - -@pytest.mark.koalas -def test_no_missing_float_ks(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - assert_frame_equal( - objs_dict["float"].transform(X_dict["float"].to_pandas()), - X_expected_dict["float"], - ) - - -@pytest.mark.koalas -def test_no_missing_object_ks(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - assert_frame_equal( - objs_dict["object"].transform(X_dict["object"].to_pandas()), - X_expected_dict["object"], - ) - - -def test_no_missing_int_pd_np(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) - assert_frame_equal(X_new, X_expected_dict["int"]) - - -def test_no_missing_float_pd_np(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) - assert_frame_equal(X_new, X_expected_dict["float"]) - - -def test_no_missing_object_pd_np(data_no_missing): - objs_dict, X_dict, X_expected_dict = data_no_missing - X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) - assert_frame_equal(X_new, X_expected_dict["object"]) - - -@pytest.mark.koalas -def test_no_missing_int_ks_np(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) - assert_frame_equal(X_new, X_expected_dict["int"]) - - -@pytest.mark.koalas -def test_no_missing_float_ks_np(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) - assert_frame_equal(X_new, X_expected_dict["float"]) - - -@pytest.mark.koalas -def test_no_missing_object_ks_np(data_no_missing_ks): - objs_dict, X_dict, X_expected_dict = data_no_missing_ks - X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) - X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) - assert_frame_equal(X_new, X_expected_dict["object"]) - - -def test_full_pd(data_full): - objs_dict, X, X_expected = data_full - X_new = objs_dict["object"].transform(X) - X_new = objs_dict["int"].transform(X_new) - X_new = objs_dict["float"].transform(X_new) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_full_ks(data_full_ks): - objs_dict, X, X_expected = data_full_ks - X_new = objs_dict["object"].transform(X) - X_new = objs_dict["int"].transform(X_new) - X_new = objs_dict["float"].transform(X_new) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_full_pd_np(data_full): - objs_dict, X, X_expected = data_full - X_new = objs_dict["object"].transform_numpy(X.to_numpy()) - X_new = objs_dict["int"].transform_numpy(X_new) - X_new = objs_dict["float"].transform_numpy(X_new) - X_new = pd.DataFrame(X_new, columns=["A", "B", "C", "D", "E", "F"]) - assert_frame_equal(X_new, X_expected.astype(object)) - - -@pytest.mark.koalas -def test_full_ks_np(data_full_ks): - objs_dict, X, X_expected = data_full_ks - X_new = objs_dict["object"].transform_numpy(X.to_numpy()) - X_new = objs_dict["int"].transform_numpy(X_new) - X_new = objs_dict["float"].transform_numpy(X_new) - X_new = pd.DataFrame(X_new, columns=["A", "B", "C", "D", "E", "F"]) - assert_frame_equal(X_new, X_expected.astype(object)) - - -def test_imputers_columns_pd(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -99.0, -999.0, -9999.0, "missing", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_int_A = IntImputer(strategy="constant", value=-9, columns=["A"]).fit(X) - obj_int_B = IntImputer(strategy="constant", value=-99, columns=["B"]).fit(X) - obj_float_C = FloatImputer(strategy="constant", value=-999.0, columns=["C"]).fit(X) - obj_float_D = FloatImputer(strategy="constant", value=-9999.0, columns=["D"]).fit(X) - obj_object_E = ObjectImputer( - strategy="constant", value="missing", columns=["E"] - ).fit(X) - obj_object_F = ObjectImputer( - strategy="constant", value="MISSING", columns=["F"] - ).fit(X) - X_new = obj_int_A.transform(X) - X_new = obj_int_B.transform(X_new) - X_new = obj_float_C.transform(X_new) - X_new = obj_float_D.transform(X_new) - X_new = obj_object_E.transform(X_new) - X_new = obj_object_F.transform(X_new) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_imputers_columns_ks(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -99.0, -999.0, -9999.0, "missing", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_int_A = IntImputer(strategy="constant", value=-9, columns=["A"]).fit(X) - obj_int_B = IntImputer(strategy="constant", value=-99, columns=["B"]).fit(X) - obj_float_C = FloatImputer(strategy="constant", value=-999.0, columns=["C"]).fit(X) - obj_float_D = FloatImputer(strategy="constant", value=-9999.0, columns=["D"]).fit(X) - obj_object_E = ObjectImputer( - strategy="constant", value="missing", columns=["E"] - ).fit(X) - obj_object_F = ObjectImputer( - strategy="constant", value="MISSING", columns=["F"] - ).fit(X) - X_new = obj_int_A.transform(X) - X_new = obj_int_B.transform(X_new) - X_new = obj_float_C.transform(X_new) - X_new = obj_float_D.transform(X_new) - X_new = obj_object_E.transform(X_new) - X_new = obj_object_F.transform(X_new) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_imputers_columns_pd_np(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -99.0, -999.0, -9999.0, "missing", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_int_A = IntImputer(strategy="constant", value=-9, columns=["A"]).fit(X) - obj_int_B = IntImputer(strategy="constant", value=-99, columns=["B"]).fit(X) - obj_float_C = FloatImputer(strategy="constant", value=-999.0, columns=["C"]).fit(X) - obj_float_D = FloatImputer(strategy="constant", value=-9999.0, columns=["D"]).fit(X) - obj_object_E = ObjectImputer( - strategy="constant", value="missing", columns=["E"] - ).fit(X) - obj_object_F = ObjectImputer( - strategy="constant", value="MISSING", columns=["F"] - ).fit(X) - X_new = obj_int_A.transform_numpy(X.to_numpy()) - X_new = obj_int_B.transform_numpy(X_new) - X_new = obj_float_C.transform_numpy(X_new) - X_new = obj_float_D.transform_numpy(X_new) - X_new = obj_object_E.transform_numpy(X_new) - X_new = obj_object_F.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list("ABCDEF")), X_expected.astype(object) - ) - - -@pytest.mark.koalas -def test_imputers_columns_ks_np(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -99.0, -999.0, -9999.0, "missing", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_int_A = IntImputer(strategy="constant", value=-9, columns=["A"]).fit(X) - obj_int_B = IntImputer(strategy="constant", value=-99, columns=["B"]).fit(X) - obj_float_C = FloatImputer(strategy="constant", value=-999.0, columns=["C"]).fit(X) - obj_float_D = FloatImputer(strategy="constant", value=-9999.0, columns=["D"]).fit(X) - obj_object_E = ObjectImputer( - strategy="constant", value="missing", columns=["E"] - ).fit(X) - obj_object_F = ObjectImputer( - strategy="constant", value="MISSING", columns=["F"] - ).fit(X) - X_new = obj_int_A.transform_numpy(X.to_numpy()) - X_new = obj_int_B.transform_numpy(X_new) - X_new = obj_float_C.transform_numpy(X_new) - X_new = obj_float_D.transform_numpy(X_new) - X_new = obj_object_E.transform_numpy(X_new) - X_new = obj_object_F.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list("ABCDEF")), X_expected.astype(object) - ) - - -def test_imputers_num_pd(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -9.0, -9.0, -9.0, "MISSING", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_num = NumericsImputer(strategy="constant", value=-9.0).fit(X) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X) - X_new = obj_num.transform(X) - X_new = obj_object.transform(X_new) - assert_frame_equal(X_new, X_expected) - - -@pytest.mark.koalas -def test_imputers_num_ks(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -9.0, -9.0, -9.0, "MISSING", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_num = NumericsImputer(strategy="constant", value=-9.0).fit(X) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X) - X_new = obj_num.transform(X) - X_new = obj_object.transform(X_new) - assert_frame_equal(X_new.to_pandas(), X_expected) - - -def test_imputers_num_pd_np(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -9.0, -9.0, -9.0, "MISSING", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_num = NumericsImputer(strategy="constant", value=-9.0).fit(X) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X) - X_new = obj_num.transform_numpy(X.to_numpy()) - X_new = obj_object.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list("ABCDEF")), X_expected.astype(object) - ) - - -@pytest.mark.koalas -def test_imputers_num_ks_np(): - X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) - X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) - X = pd.concat([X_int, X_float, X_object], axis=1) - X = ks.from_pandas(X) - X_expected = pd.DataFrame( - [ - [0.0, 3.0, 0.1, 2.1, "q", "a"], - [1.0, 4.0, 1.1, 3.1, "w", "a"], - [1.0, 4.0, 2.1, 4.1, "w", "s"], - [-9.0, -9.0, -9.0, -9.0, "MISSING", "MISSING"], - ], - columns=["A", "B", "C", "D", "E", "F"], - ) - obj_num = NumericsImputer(strategy="constant", value=-9.0).fit(X) - obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X) - X_new = obj_num.transform_numpy(X.to_numpy()) - X_new = obj_object.transform_numpy(X_new) - assert_frame_equal( - pd.DataFrame(X_new, columns=list("ABCDEF")), X_expected.astype(object) - ) - - -def test_num_np(): - X = pd.DataFrame({"A": [0, 1, np.nan]}) - obj = NumericsImputer(strategy="mean").fit(X) - assert obj.transform_numpy(X.to_numpy()).tolist() == [[0.0], [1.0], [0.5]] - - -def test_imputers_stategy(): - X = pd.DataFrame([]) - with pytest.raises(TypeError): - _ = FloatImputer(strategy=0) - with pytest.raises(TypeError): - _ = NumericsImputer(strategy=0) - with pytest.raises(TypeError): - _ = IntImputer(strategy="constant", value="a").fit(X) - with pytest.raises(TypeError): - _ = FloatImputer(strategy="constant", value="a").fit(X) - with pytest.raises(TypeError): - _ = NumericsImputer(strategy="constant", value="a").fit(X) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy="constant", value=1).fit(X) - with pytest.raises(ValueError): - _ = IntImputer(strategy="").fit(X) - with pytest.raises(ValueError): - _ = FloatImputer(strategy="").fit(X) - with pytest.raises(ValueError): - _ = NumericsImputer(strategy="").fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy="").fit(X) - with pytest.raises(ValueError): - _ = FloatImputer(strategy="most_frequent").fit(X) - with pytest.raises(ValueError): - _ = NumericsImputer(strategy="most_frequent").fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy="mean").fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy="median").fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy="constant").fit(X) - with pytest.raises(ValueError): - _ = FloatImputer(strategy="constant").fit(X) - with pytest.raises(ValueError): - _ = NumericsImputer(strategy="constant").fit(X) - with pytest.raises(ValueError): - _ = IntImputer(strategy="constant").fit(X) - with pytest.raises(ValueError): - _ = ObjectImputer(strategy="abc").fit(X) - - -def test_compute_stategy(): - with pytest.raises(ValueError): - X = pd.DataFrame(np.arange(9).reshape(3, 3) + 0.1, columns=list("qwe")) - X.iloc[:, 0] = np.nan - _ = FloatImputer(strategy="mean").fit(X) - - -def test_imputers_input_data(): - with pytest.raises(TypeError): - _ = FloatImputer(strategy="mean").fit(np.array([[]])) - with pytest.raises(TypeError): - _ = IntImputer(strategy="most_frequent").fit(np.array([[]])) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy="most_frequent").fit(np.array([[]])) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy="most_frequent", columns="a") - - -def test_imputers_transform_input_data(): - with pytest.raises(TypeError): - _ = FloatImputer(strategy="mean").fit_transform(np.array([])) - with pytest.raises(TypeError): - _ = ( - IntImputer(strategy="most_frequent") - .fit(np.array([])) - .transform(np.array([])) - ) - with pytest.raises(TypeError): - _ = ObjectImputer(strategy="most_frequent").transform(np.array([])) - - -def test_warnings_empty_columns(data): - objs_dict, X_dict, X_expected_dict = data - with pytest.warns(Warning): - obj = FloatImputer(strategy="mean") - obj.fit(X_dict["int"]) - with pytest.warns(Warning): - obj = IntImputer(strategy="mean") - obj.fit(X_dict["float"]) - with pytest.warns(Warning): - obj = ObjectImputer(strategy="most_frequent") - obj.fit(X_dict["int"]) - with pytest.warns(Warning): - obj = NumericsImputer(strategy="mean") - obj.fit(X_dict["object"]) - - -def test_empty_columns_float(): - X = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - obj = FloatImputer(strategy="mean") - _ = obj.fit(X) - assert_frame_equal(obj.transform(X.copy()), X) - assert np.allclose(obj.transform_numpy(X.to_numpy()), X.to_numpy(), equal_nan=True) - - -def test_empty_columns_int(): - X = pd.DataFrame({"A": [0.1, 1, 1, np.nan], "B": [3.1, 4, 4, np.nan]}) - obj = IntImputer(strategy="mean") - _ = obj.fit(X) - assert_frame_equal(obj.transform(X.copy()), X) - assert np.allclose(obj.transform_numpy(X.to_numpy()), X.to_numpy(), equal_nan=True) - - -def test_empty_columns_object(): - X = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) - obj = ObjectImputer(strategy="most_frequent") - _ = obj.fit(X) - assert_frame_equal(obj.fit_transform(X.copy()), X) - assert_frame_equal( - pd.DataFrame(obj.transform_numpy(X.to_numpy())), pd.DataFrame(X.to_numpy()) - ) - - -def test_num_idx_columns_empty(): - X = pd.DataFrame({"A": ["a", "b", "b", "c"]}) - obj = NumericsImputer(strategy="mean").fit(X) - _ = obj.fit(X) - assert_frame_equal(obj.transform(X.copy()), X) - assert_frame_equal( - pd.DataFrame(obj.transform_numpy(X.to_numpy())), pd.DataFrame(X.to_numpy()) - ) diff --git a/gators/imputers/tests/test_imputers_dd.py b/gators/imputers/tests/test_imputers_dd.py new file mode 100644 index 00000000..44ea6065 --- /dev/null +++ b/gators/imputers/tests/test_imputers_dd.py @@ -0,0 +1,324 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.imputers.numeric_imputer import NumericImputer +from gators.imputers.object_imputer import ObjectImputer + + +@pytest.fixture() +def data(): + X_int = dd.from_pandas( + pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}), npartitions=1 + ) + X_float = dd.from_pandas( + pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}), + npartitions=1, + ) + X_object = dd.from_pandas( + pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}), + npartitions=1, + ) + X_int_expected = pd.DataFrame( + {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} + ) + X_float_expected = pd.DataFrame( + {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} + ) + X_object_expected = pd.DataFrame( + {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + "object": X_object_expected, + } + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_num(): + X_int = dd.from_pandas( + pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}), + npartitions=1, + ) + X_float = dd.from_pandas( + pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}), + npartitions=1, + ) + X_int_expected = pd.DataFrame( + {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} + ) + X_float_expected = pd.DataFrame( + {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + X_dict = { + "int": X_int, + "float": X_float, + } + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + } + objs_dict = { + "int": obj_int, + "float": obj_float, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_no_missing(): + X_int = dd.from_pandas( + pd.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int), npartitions=1 + ) + X_float = dd.from_pandas( + pd.DataFrame({"C": [0.1, 1.1, 2.1, 9.0], "D": [2.1, 3.1, 4.1, 9.0]}), + npartitions=1, + ) + X_object = dd.from_pandas( + pd.DataFrame({"E": ["q", "w", "w", "x"], "F": ["a", "a", "s", "x"]}), + npartitions=1, + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + X_expected_dict = { + "int": X_int.compute().copy(), + "float": X_float.compute().copy(), + "object": X_object.compute().copy(), + } + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture +def data_full(): + X_int = dd.from_pandas( + pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}), npartitions=1 + ) + X_float = dd.from_pandas( + pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}), + npartitions=1, + ) + X_object = dd.from_pandas( + pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}), + npartitions=1, + ) + X = dd.concat([X_int, X_float, X_object], axis=1) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -9.0, 1.1, 3.1, "w", "a"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit(X) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X) + obj_object = ObjectImputer(strategy="most_frequent").fit(X) + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X, X_expected + + +def test_int_dd(data): + objs_dict, X_dict, X_expected_dict = data + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]).compute(), X_expected_dict["int"] + ) + + +def test_float_dd(data): + objs_dict, X_dict, X_expected_dict = data + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]).compute(), + X_expected_dict["float"], + ) + + +def test_object_dd(data): + objs_dict, X_dict, X_expected_dict = data + X_new = objs_dict["object"].transform(X_dict["object"]).compute() + X_new[["E", "F"]] = X_new[["E", "F"]].astype(object) + assert_frame_equal( + X_new, + X_expected_dict["object"], + ) + + +def test_int_dd_np(data): + objs_dict, X_dict, X_expected_dict = data + X_new_np = objs_dict["int"].transform_numpy( + X_dict["int"].compute().replace({pd.NA: None}).to_numpy() + ) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_float_dd_np(data): + objs_dict, X_dict, X_expected_dict = data + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].compute().to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_object_dd_np(data): + objs_dict, X_dict, X_expected_dict = data + X_new_np = objs_dict["object"].transform_numpy( + X_dict["object"].compute().replace({pd.NA: None}).to_numpy() + ) + X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"]) + + +def test_num_int_dd(data_num): + objs_dict, X_dict, X_expected_dict = data_num + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]).compute(), + X_expected_dict["int"], + ) + + +def test_num_float_dd(data_num): + objs_dict, X_dict, X_expected_dict = data_num + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]).compute(), + X_expected_dict["float"], + ) + + +def test_num_int_dd_np(data_num): + objs_dict, X_dict, X_expected_dict = data_num + X_new_np = objs_dict["int"].transform_numpy( + X_dict["int"].compute().replace({pd.NA: None}).to_numpy() + ) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_num_float_dd_np(data_num): + objs_dict, X_dict, X_expected_dict = data_num + X_new_np = objs_dict["float"].transform_numpy( + X_dict["float"].compute().replace({pd.NA: None}).to_numpy() + ) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_no_missing_int_dd(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]).compute(), X_expected_dict["int"] + ) + + +def test_no_missing_float_dd(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]).compute(), + X_expected_dict["float"], + ) + + +def test_no_missing_object_dd(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new = objs_dict["object"].transform(X_dict["object"]).compute() + assert_frame_equal( + X_new, + X_expected_dict["object"], + ) + + # assert_frame_equal( + # objs_dict["object"].transform(X_dict["object"]).compute(), + # X_expected_dict["object"], + # ) + + +def test_no_missing_int_dd_np(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new_np = objs_dict["int"].transform_numpy( + X_dict["int"].compute().replace({pd.NA: None}).to_numpy() + ) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_no_missing_float_dd_np(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].compute().to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_no_missing_object_dd_np(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new_np = objs_dict["object"].transform_numpy( + X_dict["object"].compute().replace({pd.NA: None}).to_numpy() + ) + X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"].astype(object)) + + +def test_full_dd(data_full): + objs_dict, X, X_expected = data_full + X_new = objs_dict["object"].transform(X) + X_new = objs_dict["int"].transform(X_new) + X_new = objs_dict["float"].transform(X_new).compute() + X_new[["E", "F"]] = X_new[["E", "F"]].astype(object) + assert_frame_equal(X_new, X_expected) + + # X_new = objs_dict["object"].transform(X_dict["object"]).compute() + # X_new[["E", "F"]] = X_new[["E", "F"]].astype(object) + # assert_frame_equal( + # X_new, + # X_expected_dict["object"], + # ) + + +def test_full_dd_np(data_full): + objs_dict, X, X_expected = data_full + X_new = objs_dict["object"].transform_numpy( + X.compute().replace({pd.NA: None}).to_numpy() + ) + X_new = objs_dict["int"].transform_numpy(X_new) + X_new = objs_dict["float"].transform_numpy(X_new) + X_new = pd.DataFrame(X_new, columns=["A", "B", "C", "D", "E", "F"]) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/imputers/tests/test_imputers_ks.py b/gators/imputers/tests/test_imputers_ks.py new file mode 100644 index 00000000..88bfdcf6 --- /dev/null +++ b/gators/imputers/tests/test_imputers_ks.py @@ -0,0 +1,297 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.imputers.numeric_imputer import NumericImputer +from gators.imputers.object_imputer import ObjectImputer + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture() +def data_ks(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) + X_int_expected = pd.DataFrame( + {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} + ) + X_float_expected = pd.DataFrame( + {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} + ) + X_object_expected = pd.DataFrame( + {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} + ) + X_int_ks = ps.from_pandas(X_int) + X_float_ks = ps.from_pandas(X_float) + X_object_ks = ps.from_pandas(X_object) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + + X_dict = { + "int": X_int_ks, + "float": X_float_ks, + "object": X_object_ks, + } + + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + "object": X_object_expected, + } + + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_num_ks(): + X_int = ps.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = ps.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_int_expected = pd.DataFrame( + {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} + ) + X_float_expected = pd.DataFrame( + {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + X_dict = { + "int": X_int, + "float": X_float, + } + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + } + objs_dict = { + "int": obj_int, + "float": obj_float, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_no_missing_ks(): + X_int = ps.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) + X_float = ps.DataFrame({"C": [0.1, 1.1, 2.1, 9.0], "D": [2.1, 3.1, 4.1, 9.0]}) + X_object = ps.DataFrame({"E": ["q", "w", "w", "x"], "F": ["a", "a", "s", "x"]}) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + X_expected_dict = { + "int": X_int.to_pandas().copy(), + "float": X_float.to_pandas().copy(), + "object": X_object.to_pandas().copy(), + } + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture +def data_full_ks(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) + X = ps.from_pandas(pd.concat([X_int, X_float, X_object], axis=1)) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -9.0, 1.1, 3.1, "w", "a"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit(X) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X) + obj_object = ObjectImputer(strategy="most_frequent").fit(X) + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X, X_expected + + +@pytest.mark.pyspark +def test_int_ks(data_ks): + objs_dict, X_dict, X_expected_dict = data_ks + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]).to_pandas(), + X_expected_dict["int"], + ) + + +@pytest.mark.pyspark +def test_float_ks(data_ks): + objs_dict, X_dict, X_expected_dict = data_ks + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]).to_pandas(), + X_expected_dict["float"], + ) + + +@pytest.mark.pyspark +def test_object_ks(data_ks): + objs_dict, X_dict, X_expected_dict = data_ks + assert_frame_equal( + objs_dict["object"].transform(X_dict["object"]).to_pandas(), + X_expected_dict["object"], + ) + + +@pytest.mark.pyspark +def test_int_ks_np(data_ks): + objs_dict, X_dict, X_expected_dict = data_ks + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +@pytest.mark.pyspark +def test_float_ks_np(data_ks): + objs_dict, X_dict, X_expected_dict = data_ks + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +@pytest.mark.pyspark +def test_object_ks_np(data_ks): + objs_dict, X_dict, X_expected_dict = data_ks + X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"]) + + +@pytest.mark.pyspark +def test_num_int_ks(data_num_ks): + objs_dict, X_dict, X_expected_dict = data_num_ks + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"].to_pandas()), + X_expected_dict["int"], + ) + + +@pytest.mark.pyspark +def test_num_float_ks(data_num_ks): + objs_dict, X_dict, X_expected_dict = data_num_ks + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"].to_pandas()), + X_expected_dict["float"], + ) + + +@pytest.mark.pyspark +def test_num_int_ks_np(data_num_ks): + objs_dict, X_dict, X_expected_dict = data_num_ks + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +@pytest.mark.pyspark +def test_num_float_ks_np(data_num_ks): + objs_dict, X_dict, X_expected_dict = data_num_ks + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +@pytest.mark.pyspark +def test_no_missing_int_ks(data_no_missing_ks): + objs_dict, X_dict, X_expected_dict = data_no_missing_ks + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"].to_pandas()), + X_expected_dict["int"], + ) + + +@pytest.mark.pyspark +def test_no_missing_float_ks(data_no_missing_ks): + objs_dict, X_dict, X_expected_dict = data_no_missing_ks + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"].to_pandas()), + X_expected_dict["float"], + ) + + +@pytest.mark.pyspark +def test_no_missing_object_ks(data_no_missing_ks): + objs_dict, X_dict, X_expected_dict = data_no_missing_ks + assert_frame_equal( + objs_dict["object"].transform(X_dict["object"].to_pandas()), + X_expected_dict["object"], + ) + + +@pytest.mark.pyspark +def test_no_missing_int_ks_np(data_no_missing_ks): + objs_dict, X_dict, X_expected_dict = data_no_missing_ks + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +@pytest.mark.pyspark +def test_no_missing_float_ks_np(data_no_missing_ks): + objs_dict, X_dict, X_expected_dict = data_no_missing_ks + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +@pytest.mark.pyspark +def test_no_missing_object_ks_np(data_no_missing_ks): + objs_dict, X_dict, X_expected_dict = data_no_missing_ks + X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"]) + + +@pytest.mark.pyspark +def test_full_ks(data_full_ks): + objs_dict, X, X_expected = data_full_ks + X_new = objs_dict["object"].transform(X) + X_new = objs_dict["int"].transform(X_new) + X_new = objs_dict["float"].transform(X_new) + assert_frame_equal(X_new.to_pandas(), X_expected) + + +@pytest.mark.pyspark +def test_full_ks_np(data_full_ks): + objs_dict, X, X_expected = data_full_ks + X_new = objs_dict["object"].transform_numpy(X.to_numpy()) + X_new = objs_dict["int"].transform_numpy(X_new) + X_new = objs_dict["float"].transform_numpy(X_new) + X_new = pd.DataFrame(X_new, columns=["A", "B", "C", "D", "E", "F"]) + assert_frame_equal(X_new, X_expected.astype(object)) diff --git a/gators/imputers/tests/test_imputers_pd.py b/gators/imputers/tests/test_imputers_pd.py new file mode 100644 index 00000000..d1907e66 --- /dev/null +++ b/gators/imputers/tests/test_imputers_pd.py @@ -0,0 +1,554 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.imputers.numeric_imputer import NumericImputer +from gators.imputers.object_imputer import ObjectImputer + + +@pytest.fixture() +def data(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) + X_int_expected = pd.DataFrame( + {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} + ) + X_float_expected = pd.DataFrame( + {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} + ) + X_object_expected = pd.DataFrame( + {"E": ["q", "w", "w", "MISSING"], "F": ["a", "a", "s", "MISSING"]} + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + "object": X_object_expected, + } + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_not_inplace(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", None], "F": ["a", "a", "s", np.nan]}) + X_int_expected = pd.DataFrame( + { + "A": [0, 1, 1, np.nan], + "B": [3, 4, 4, np.nan], + "A__impute": [0.0, 1.0, 1.0, -9.0], + "B__impute": [3.0, 4.0, 4.0, -9.0], + } + ) + X_float_expected = pd.DataFrame( + { + "C": [0.1, 1.1, 2.1, np.nan], + "D": [2.1, 3.1, 4.1, np.nan], + "C__impute": [0.1, 1.1, 2.1, 1.1], + "D__impute": [2.1, 3.1, 4.1, 3.1], + } + ) + X_object_expected = pd.DataFrame( + { + "E": ["q", "w", "w", None], + "F": ["a", "a", "s", np.nan], + "E__impute": ["q", "w", "w", "MISSING"], + "F__impute": ["a", "a", "s", "MISSING"], + } + ) + obj_int = NumericImputer( + strategy="constant", value=-9, columns=list("AB"), inplace=False + ).fit(X_int) + obj_float = NumericImputer(strategy="mean", columns=list("CD"), inplace=False).fit( + X_float + ) + obj_object = ObjectImputer(strategy="constant", value="MISSING", inplace=False).fit( + X_object + ) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + "object": X_object_expected, + } + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_num(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_int_expected = pd.DataFrame( + {"A": [0.0, 1.0, 1.0, -9.0], "B": [3.0, 4.0, 4.0, -9.0]} + ) + X_float_expected = pd.DataFrame( + {"C": [0.1, 1.1, 2.1, 1.1], "D": [2.1, 3.1, 4.1, 3.1]} + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + X_dict = { + "int": X_int, + "float": X_float, + } + X_expected_dict = { + "int": X_int_expected, + "float": X_float_expected, + } + objs_dict = { + "int": obj_int, + "float": obj_float, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture() +def data_no_missing(): + X_int = pd.DataFrame({"A": [0, 1, 1, 8], "B": [3, 4, 4, 8]}, dtype=int) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, 9.0], "D": [2.1, 3.1, 4.1, 9.0]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", "x"], "F": ["a", "a", "s", "x"]}) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit( + X_int + ) + obj_float = NumericImputer(strategy="mean", columns=list("CD")).fit(X_float) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X_object) + X_dict = { + "int": X_int, + "float": X_float, + "object": X_object, + } + X_expected_dict = { + "int": X_int.copy(), + "float": X_float.copy(), + "object": X_object.copy(), + } + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X_dict, X_expected_dict + + +@pytest.fixture +def data_full(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) + X = pd.concat([X_int, X_float, X_object], axis=1) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -9.0, 1.1, 3.1, "w", "a"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_int = NumericImputer(strategy="constant", value=-9, columns=list("AB")).fit(X) + obj_float = NumericImputer(strategy="median", columns=list("CD")).fit(X) + obj_object = ObjectImputer(strategy="most_frequent").fit(X) + objs_dict = { + "int": obj_int, + "float": obj_float, + "object": obj_object, + } + return objs_dict, X, X_expected + + +def test_int_pd(data): + objs_dict, X_dict, X_expected_dict = data + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]), + X_expected_dict["int"], + ) + + +def test_float_pd(data): + objs_dict, X_dict, X_expected_dict = data + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]), + X_expected_dict["float"], + ) + + +def test_object_pd(data): + objs_dict, X_dict, X_expected_dict = data + assert_frame_equal( + objs_dict["object"].transform(X_dict["object"]), + X_expected_dict["object"], + ) + + +def test_int_pd_np(data): + objs_dict, X_dict, X_expected_dict = data + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_float_pd_np(data): + objs_dict, X_dict, X_expected_dict = data + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_object_pd_np(data): + objs_dict, X_dict, X_expected_dict = data + X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"]) + + +def test_num_int_pd(data_num): + objs_dict, X_dict, X_expected_dict = data_num + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]), + X_expected_dict["int"], + ) + + +def test_num_float_pd(data_num): + objs_dict, X_dict, X_expected_dict = data_num + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]), + X_expected_dict["float"], + ) + + +def test_num_int_pd_np(data_num): + objs_dict, X_dict, X_expected_dict = data_num + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_num_float_pd_np(data_num): + objs_dict, X_dict, X_expected_dict = data_num + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_no_missing_int_pd(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]), + X_expected_dict["int"], + ) + + +def test_no_missing_float_pd(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]), + X_expected_dict["float"], + ) + + +def test_no_missing_object_pd(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + assert_frame_equal( + objs_dict["object"].transform(X_dict["object"]), + X_expected_dict["object"], + ) + + +def test_no_missing_int_pd_np(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_no_missing_float_pd_np(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_no_missing_object_pd_np(data_no_missing): + objs_dict, X_dict, X_expected_dict = data_no_missing + X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"]) + + +def test_full_pd(data_full): + objs_dict, X, X_expected = data_full + X_new = objs_dict["object"].transform(X) + X_new = objs_dict["int"].transform(X_new) + X_new = objs_dict["float"].transform(X_new) + assert_frame_equal(X_new, X_expected) + + +def test_full_pd_np(data_full): + objs_dict, X, X_expected = data_full + X_new = objs_dict["object"].transform_numpy(X.to_numpy()) + X_new = objs_dict["int"].transform_numpy(X_new) + X_new = objs_dict["float"].transform_numpy(X_new) + X_new = pd.DataFrame(X_new, columns=["A", "B", "C", "D", "E", "F"]) + assert_frame_equal(X_new, X_expected.astype(object)) + + +def test_imputers_columns_pd(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) + X = pd.concat([X_int, X_float, X_object], axis=1) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -99.0, -999.0, -9999.0, "missing", "MISSING"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_int_A = NumericImputer(strategy="constant", value=-9, columns=["A"]).fit(X) + obj_int_B = NumericImputer(strategy="constant", value=-99, columns=["B"]).fit(X) + obj_float_C = NumericImputer(strategy="constant", value=-999.0, columns=["C"]).fit( + X + ) + obj_float_D = NumericImputer(strategy="constant", value=-9999.0, columns=["D"]).fit( + X + ) + obj_object_E = ObjectImputer( + strategy="constant", value="missing", columns=["E"] + ).fit(X) + obj_object_F = ObjectImputer( + strategy="constant", value="MISSING", columns=["F"] + ).fit(X) + X_new = obj_int_A.transform(X) + X_new = obj_int_B.transform(X_new) + X_new = obj_float_C.transform(X_new) + X_new = obj_float_D.transform(X_new) + X_new = obj_object_E.transform(X_new) + X_new = obj_object_F.transform(X_new) + assert_frame_equal(X_new, X_expected) + + +def test_imputers_columns_pd_np(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) + X = pd.concat([X_int, X_float, X_object], axis=1) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -99.0, -999.0, -9999.0, "missing", "MISSING"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_int_A = NumericImputer(strategy="constant", value=-9, columns=["A"]).fit(X) + obj_int_B = NumericImputer(strategy="constant", value=-99, columns=["B"]).fit(X) + obj_float_C = NumericImputer(strategy="constant", value=-999.0, columns=["C"]).fit( + X + ) + obj_float_D = NumericImputer(strategy="constant", value=-9999.0, columns=["D"]).fit( + X + ) + obj_object_E = ObjectImputer( + strategy="constant", value="missing", columns=["E"] + ).fit(X) + obj_object_F = ObjectImputer( + strategy="constant", value="MISSING", columns=["F"] + ).fit(X) + X_new = obj_int_A.transform_numpy(X.to_numpy()) + X_new = obj_int_B.transform_numpy(X_new) + X_new = obj_float_C.transform_numpy(X_new) + X_new = obj_float_D.transform_numpy(X_new) + X_new = obj_object_E.transform_numpy(X_new) + X_new = obj_object_F.transform_numpy(X_new) + assert_frame_equal( + pd.DataFrame(X_new, columns=list("ABCDEF")), X_expected.astype(object) + ) + + +def test_imputers_num_pd(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) + X = pd.concat([X_int, X_float, X_object], axis=1) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -9.0, -9.0, -9.0, "MISSING", "MISSING"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_num = NumericImputer(strategy="constant", value=-9.0).fit(X) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X) + X_new = obj_num.transform(X) + X_new = obj_object.transform(X_new) + assert_frame_equal(X_new, X_expected) + + +def test_imputers_num_pd_np(): + X_int = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + X_float = pd.DataFrame({"C": [0.1, 1.1, 2.1, np.nan], "D": [2.1, 3.1, 4.1, np.nan]}) + X_object = pd.DataFrame({"E": ["q", "w", "w", np.nan], "F": ["a", "a", "s", None]}) + X = pd.concat([X_int, X_float, X_object], axis=1) + X_expected = pd.DataFrame( + [ + [0.0, 3.0, 0.1, 2.1, "q", "a"], + [1.0, 4.0, 1.1, 3.1, "w", "a"], + [1.0, 4.0, 2.1, 4.1, "w", "s"], + [-9.0, -9.0, -9.0, -9.0, "MISSING", "MISSING"], + ], + columns=["A", "B", "C", "D", "E", "F"], + ) + obj_num = NumericImputer(strategy="constant", value=-9.0).fit(X) + obj_object = ObjectImputer(strategy="constant", value="MISSING").fit(X) + X_new = obj_num.transform_numpy(X.to_numpy()) + X_new = obj_object.transform_numpy(X_new) + assert_frame_equal( + pd.DataFrame(X_new, columns=list("ABCDEF")), X_expected.astype(object) + ) + + +def test_num_np(): + X = pd.DataFrame({"A": [0, 1, np.nan]}) + obj = NumericImputer(strategy="mean").fit(X) + assert obj.transform_numpy(X.to_numpy()).tolist() == [[0.0], [1.0], [0.5]] + + +def test_imputers_stategy(): + X = pd.DataFrame([]) + with pytest.raises(TypeError): + _ = NumericImputer(strategy=0) + with pytest.raises(TypeError): + _ = NumericImputer(strategy=0) + with pytest.raises(TypeError): + _ = NumericImputer(strategy="constant", value="a").fit(X) + with pytest.raises(TypeError): + _ = ObjectImputer(strategy="constant", value=1).fit(X) + with pytest.raises(ValueError): + _ = NumericImputer(strategy="").fit(X) + with pytest.raises(ValueError): + _ = ObjectImputer(strategy="").fit(X) + with pytest.raises(ValueError): + _ = ObjectImputer(strategy="mean").fit(X) + with pytest.raises(ValueError): + _ = ObjectImputer(strategy="median").fit(X) + with pytest.raises(ValueError): + _ = ObjectImputer(strategy="constant").fit(X) + with pytest.raises(ValueError): + _ = NumericImputer(strategy="constant").fit(X) + with pytest.raises(ValueError): + _ = NumericImputer(strategy="abc").fit(X) + with pytest.raises(TypeError): + _ = NumericImputer(strategy="mean", inplace="abc").fit(X) + + +def test_compute_stategy(): + with pytest.raises(ValueError): + X = pd.DataFrame(np.arange(9).reshape(3, 3) + 0.1, columns=list("qwe")) + X.iloc[:, 0] = np.nan + _ = NumericImputer(strategy="mean").fit(X) + + +def test_imputers_input_data(): + with pytest.raises(TypeError): + _ = ObjectImputer(strategy="most_frequent").fit(np.array([[]])) + with pytest.raises(TypeError): + _ = ObjectImputer(strategy="most_frequent", columns="a") + + +def test_empty_columns_object(): + X = pd.DataFrame({"A": [0, 1, 1, np.nan], "B": [3, 4, 4, np.nan]}) + obj = ObjectImputer(strategy="most_frequent") + _ = obj.fit(X) + assert_frame_equal(obj.transform(X.copy()), X) + assert_frame_equal( + pd.DataFrame(obj.transform_numpy(X.to_numpy())), pd.DataFrame(X.to_numpy()) + ) + + +def test_num_idx_columns_empty(): + X = pd.DataFrame({"A": ["a", "b", "b", "c"]}) + obj = NumericImputer(strategy="mean").fit(X) + _ = obj.fit(X) + assert_frame_equal(obj.transform(X.copy()), X) + assert_frame_equal( + pd.DataFrame(obj.transform_numpy(X.to_numpy())), pd.DataFrame(X.to_numpy()) + ) + + +def test_not_inplace_int_pd(data_not_inplace): + objs_dict, X_dict, X_expected_dict = data_not_inplace + assert_frame_equal( + objs_dict["int"].transform(X_dict["int"]), + X_expected_dict["int"], + ) + + +def test_not_inplace_float_pd(data_not_inplace): + objs_dict, X_dict, X_expected_dict = data_not_inplace + assert_frame_equal( + objs_dict["float"].transform(X_dict["float"]), + X_expected_dict["float"], + ) + + +def test_not_inplace_object_pd(data_not_inplace): + objs_dict, X_dict, X_expected_dict = data_not_inplace + assert_frame_equal( + objs_dict["object"].transform(X_dict["object"]), + X_expected_dict["object"], + ) + + +def test_not_inplace_int_pd_np(data_not_inplace): + objs_dict, X_dict, X_expected_dict = data_not_inplace + X_new_np = objs_dict["int"].transform_numpy(X_dict["int"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_expected_dict["int"].columns) + assert_frame_equal(X_new, X_expected_dict["int"]) + + +def test_not_inplace_float_pd_np(data_not_inplace): + objs_dict, X_dict, X_expected_dict = data_not_inplace + X_new_np = objs_dict["float"].transform_numpy(X_dict["float"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_expected_dict["float"].columns) + assert_frame_equal(X_new, X_expected_dict["float"]) + + +def test_not_inplace_object_pd_np(data_not_inplace): + objs_dict, X_dict, X_expected_dict = data_not_inplace + X_new_np = objs_dict["object"].transform_numpy(X_dict["object"].to_numpy()) + X_new = pd.DataFrame(X_new_np, columns=X_expected_dict["object"].columns) + assert_frame_equal(X_new, X_expected_dict["object"]) diff --git a/gators/model_building/.gitignore b/gators/model_building/.gitignore deleted file mode 100644 index a81c8ee1..00000000 --- a/gators/model_building/.gitignore +++ /dev/null @@ -1,138 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ diff --git a/gators/model_building/__init__.py b/gators/model_building/__init__.py deleted file mode 100644 index d6a9b12d..00000000 --- a/gators/model_building/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .hyperopt import HyperOpt -from .lgbm_treelite_dumper import LGBMTreeliteDumper -from .train_test_split import TrainTestSplit -from .xgb_booster_builder import XGBBoosterBuilder -from .xgb_treelite_dumper import XGBTreeliteDumper - -__all__ = [ - "TrainTestSplit", - "HyperOpt", - "XGBBoosterBuilder", - "XGBTreeliteDumper", - "LGBMTreeliteDumper", -] diff --git a/gators/model_building/hyperopt.py b/gators/model_building/hyperopt.py deleted file mode 100644 index 2ff26a65..00000000 --- a/gators/model_building/hyperopt.py +++ /dev/null @@ -1,209 +0,0 @@ -# License: Apache-2.0 -from typing import Callable, Dict, List, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd -from hyperopt import Trials, fmin -from hyperopt.pyll.base import Apply -from sklearn.metrics._scorer import _PredictScorer -from sklearn.model_selection import KFold, StratifiedKFold, cross_val_score - - -class HyperOpt: - """Hyper parameter optimization using the Hyperopt package. - - Parameters - ---------- - model : object - Machine learning model. - algo: Callable - `algo` can be: - - * hp.rand.suggest for random search. - * hp.tpe.suggest for tree of parzen estimators. - * hp.atpe.suggest for adaptative tree of parzen estimators. - - scoring : _PredictScorer - Score (or loss) function with signature score_func(y, y_pred). - space : Dict[str, Apply] - Hyperopt search space. - kfold : Union[KFold, StratifiedKFold] - sklearn K-Folds cross-validator. - max_evals : int - Number of evaluations. - features: List[str] - List of feature names. - - Examples - -------- - - >>> import numpy as np - >>> import sklearn - >>> from hyperopt import hp, tpe - >>> from lightgbm import LGBMClassifier - >>> from gators.model_building import HyperOpt - >>> from sklearn.model_selection import StratifiedKFold - >>> X_np = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_np = np.array([0, 1, 1, 0]) - >>> hyper = HyperOpt( - ... model=LGBMClassifier(random_state=0), - ... algo=tpe.suggest, - ... scoring=sklearn.metrics.make_scorer(sklearn.metrics.f1_score), - ... space={'max_depth': hp.quniform('max_depth',1, 3, 1)}, - ... max_evals=3, - ... kfold=StratifiedKFold(n_splits=2), - ... features=['x', 'y'], - ... ) - >>> _ = hyper.fit(X_np, y_np) - 100%|##########| 3/3 [00:03<00:00, 1.03s/trial, best loss: -0.0] - >>> hyper.model - LGBMClassifier(max_depth=2, random_state=0) - - """ - - def __init__( - self, - model: object, - scoring: _PredictScorer, - algo: Callable, - space: Dict[str, Apply], - kfold: Union[KFold, StratifiedKFold], - max_evals: int, - features: List[str], - ) -> "HyperOpt": - - if not hasattr(model, "fit") or not hasattr(model, "predict"): - raise TypeError("`model` should have the methods `fit` and `predict`") - if not callable(algo): - raise TypeError( - """ - `algo` should be: - hyperopt.rand, hyperopt.tpe, or hyperopt.atpe""" - ) - if not isinstance(scoring, (str, _PredictScorer)): - raise TypeError( - """`scoring` should be a str or - a sklearn.metrics._scorer._PredictScorer""" - ) - if not isinstance(space, dict): - raise TypeError("`space` should be a dict") - if not isinstance(kfold, (KFold, StratifiedKFold)): - raise TypeError( - "`scoring` should be a sklearn.metrics._scorer._PredictScorer" - ) - if not isinstance(max_evals, int): - raise TypeError("`max_evals` should be an int") - if not isinstance(features, list): - raise TypeError("`features` should be a list") - self.model = model - self.algo = algo - self.scoring = scoring - self.space = space - self.kfold = kfold - self.max_evals = max_evals - self.history = pd.DataFrame() - self.int_parameters: List[str] = self.get_int_parameters(space) - self.features = features - - def fit(self, X: np.ndarray, y: np.ndarray) -> "HyperOpt": - """Fit model on X with y. - - Parameters - ---------- - X : np.ndarray - NumPy array. - y : np.ndarray - Target values. - - Returns - ------- - HyperOpt - Instance of itself. - """ - if not isinstance(X, np.ndarray): - raise TypeError("""`X` must be a NumPy array.""") - if not isinstance(y, np.ndarray): - raise TypeError("""`y` must be a NumPy array.""") - - def fn(params, cv=self.kfold, X=X, y=y): - for int_parameter in self.int_parameters: - params[int_parameter] = int(params[int_parameter]) - self.model.set_params(**params) - self.model.fit(X, y) - score = cross_val_score( - self.model, X, y, cv=cv, scoring=self.scoring, n_jobs=-1 - ).mean() - return -score - - trials = Trials() - best = fmin( - fn=fn, - space=self.space, - algo=self.algo, - max_evals=self.max_evals, - trials=trials, - rstate=np.random.RandomState(0), - ) - for int_parameter in self.int_parameters: - best[int_parameter] = int(best[int_parameter]) - self.history = self.generate_history(trials) - self.model.set_params(**best) - self.model.fit(X, y) - return self - - def get_feature_importances(self) -> pd.Series: - """Generate the feature importances from the selected model. - - Returns - ------- - pd.Series - Feature importances. - """ - feature_importances_ = pd.Series(self.model.feature_importances_, self.features) - return feature_importances_.sort_values(ascending=False) - - @staticmethod - def generate_history(trials: object) -> pd.DataFrame: - """Generate hyperparameter tuning history. - - Parameters - ---------- - trials : object - Hyperopt trial funnction. - - Returns - ------- - pd.DataFrame - Hyperparameter tuning history. - """ - - def f(x) -> ks.Series[np.float32]: - return pd.Series({key: val[0] for key, val in x.items()}) - - loss = pd.DataFrame(trials.results) - params = pd.DataFrame(trials.miscs)["vals"].apply(f) - history = pd.concat([params, loss], axis=1) - history["id"] = history.index - history.sort_values("loss", ascending=False) - return history - - @staticmethod - def get_int_parameters(space) -> List[str]: - """Get the list of int parameters based on the hyperopt search space. - - Parameters - ---------- - space : object - Hyperopt search space. - - Returns - ------- - List[str] - List of int parameters. - """ - int_parameters = [] - for key in space.keys(): - if "qlog" in str(space[key]) or "quni" in str(space[key]): - int_parameters.append(key) - return int_parameters diff --git a/gators/model_building/lgbm_treelite_dumper.py b/gators/model_building/lgbm_treelite_dumper.py deleted file mode 100644 index b1f4b345..00000000 --- a/gators/model_building/lgbm_treelite_dumper.py +++ /dev/null @@ -1,94 +0,0 @@ -# License: Apache-2.0 -import os -from typing import Union - -import treelite -from lightgbm.sklearn import LGBMClassifier, LGBMRegressor - - -class LGBMTreeliteDumper: - """LightGBM Treelite Dumper class. - - Examples - -------- - >>> import numpy as np - >>> from lightgbm import LGBMClassifier - >>> from gators.model_building import LGBMTreeliteDumper - >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_train = np.array([0, 1, 1, 0]) - >>> model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) - >>> LGBMTreeliteDumper.dump( - ... model=model, - ... toolchain='gcc', - ... parallel_comp=1, - ... model_path='.', - ... model_name='dummy') - [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler - [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... - """ - - @staticmethod - def dump( - model: Union[LGBMClassifier, LGBMRegressor], - toolchain: str, - parallel_comp: int, - model_path: str, - model_name: str, - ): - """Dump the XGBoost treelite as a .so and a - .dylib file. - - Parameters - ---------- - model: Union[LGBMClassifier, LGBMRegressor]. - LightGBM trained model. - toolchain: str - Compiler. List of available treelite compiler. - * gcc - * clang - * msvc - parallel_comp: int - Treelite parallel compilation. - model_path : str - Model path. - model_name : str - Model name. - """ - if not isinstance(model, (LGBMClassifier, LGBMRegressor)): - raise TypeError("`model` should be a LGBMClassifier or LGBMRegressor.") - if not isinstance(toolchain, str): - raise TypeError("`toolchain` should be a str.") - if toolchain not in ["gcc", "clang", "msvc"]: - raise ValueError("`toolchain` should be `gcc`, `clang`, or `msvc`.") - if not isinstance(parallel_comp, int): - raise TypeError("`parallel_comp` should be an int.") - if not isinstance(model_path, str): - raise TypeError("`model_path` should be a str.") - if not isinstance(model_name, str): - raise TypeError("`model_name` should be a str.") - file_name = "dummy_lgbm_model.txt" - model.booster_.save_model(file_name) - model_ = treelite.Model.load(file_name, model_format="lightgbm") - platform_dict = {"gcc": "unix", "clang": "osx", "msvc": "windows"} - format_dict = {"gcc": ".so", "clang": ".dylib", "msvc": ".dll"} - model_.export_lib( - toolchain=toolchain, - libpath=os.path.join(model_path, model_name + format_dict[toolchain]), - verbose=False, - params={"parallel_comp": parallel_comp}, - nthread=1, - ) - model_.export_srcpkg( - platform=platform_dict[toolchain], - toolchain=toolchain, - params={"parallel_comp": parallel_comp}, - pkgpath=os.path.join(model_path, model_name + ".zip"), - libname=os.path.join(model_path, model_name + format_dict[toolchain]), - verbose=True, - ) diff --git a/gators/model_building/tests/test_hyperopt.py b/gators/model_building/tests/test_hyperopt.py deleted file mode 100644 index b2c62a75..00000000 --- a/gators/model_building/tests/test_hyperopt.py +++ /dev/null @@ -1,150 +0,0 @@ -# License: Apache-2.0 -import numpy as np -import pandas as pd -import pytest -from hyperopt import hp, tpe -from pandas.testing import assert_series_equal -from sklearn.datasets import make_classification -from sklearn.metrics import make_scorer -from sklearn.model_selection import StratifiedKFold -from xgboost import XGBClassifier - -from gators.model_building.hyperopt import HyperOpt - - -@pytest.fixture -def data(): - X, y = make_classification( - random_state=0, n_samples=10, n_features=5, n_informative=3 - ) - model = XGBClassifier(random_state=0, eval_metric="logloss", max_depth=2) - n_splits = 2 - max_evals = 10 - kfold = StratifiedKFold(n_splits=n_splits) - space = {"n_estimators": hp.quniform("n_estimators", 5, 25, 5)} - model = XGBClassifier( - random_state=0, eval_metric="logloss", use_label_encoder=False - ) - - def f1_score(y_true, y_pred): - p = y_true[y_pred == 1].mean() - r = y_pred[y_true == 1].mean() - if (p == 0) | (r == 0): - return 0 - return 2 * p * r / (p + r) - - f1_scoring = make_scorer(f1_score) - y_pred_expected = np.array([0, 1, 1, 0, 1, 0, 1, 0, 1, 1]) - return model, f1_scoring, space, max_evals, kfold, X, y, y_pred_expected - - -def test_hyperopt(data): - model, f1_scoring, space, max_evals, kfold, X, y, y_pred_expected = data - hyper = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ).fit(X, y) - y_pred = hyper.model.predict(X) - feature_importances = hyper.get_feature_importances() - assert feature_importances[-3:].sum() == 0 - assert np.allclose(y_pred, y_pred_expected) - - -def test_input(data): - model, f1_scoring, space, max_evals, kfold, X, y, y_pred_expected = data - with pytest.raises(TypeError): - _ = HyperOpt( - model=0, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=0, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=0, - space=space, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=0, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals="a", - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=0, - features=["A", "B", "C", "D", "E"], - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=0, - ) - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ).fit(0, 0) - - with pytest.raises(TypeError): - _ = HyperOpt( - model=model, - algo=tpe.suggest, - scoring=f1_scoring, - space=space, - max_evals=max_evals, - kfold=kfold, - features=["A", "B", "C", "D", "E"], - ).fit(X, 0) diff --git a/gators/model_building/tests/test_lgbm_treelite_dumper.py b/gators/model_building/tests/test_lgbm_treelite_dumper.py deleted file mode 100644 index 4c31c666..00000000 --- a/gators/model_building/tests/test_lgbm_treelite_dumper.py +++ /dev/null @@ -1,96 +0,0 @@ -# License: Apache-2.0 -import glob -import os -import platform - -import numpy as np -import pytest -from lightgbm import LGBMClassifier - -from gators.model_building.lgbm_treelite_dumper import LGBMTreeliteDumper - - -def test(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) - if platform.system() == 'Linux': - - - LGBMTreeliteDumper.dump( - model=model, - toolchain="gcc", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - print(glob.glob("*")) - elif platform.system() == 'Darwin': - LGBMTreeliteDumper.dump( - model=model, - toolchain="clang", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - elif platform.system() == 'Windows': - LGBMTreeliteDumper.dump( - model=model, - toolchain="msvc", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - else: - pass - [os.remove(f) for f in glob.glob("*") if f.startswith('dummy')] - - -def test_input(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - model = LGBMClassifier(max_depth=1, n_estimators=1).fit(X_train, y_train) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=0, - toolchain="gcc", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain=0, - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain="gcc", - parallel_comp="a", - model_path=".", - model_name="dummy", - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, - toolchain="gcc", - parallel_comp=1, - model_path=0, - model_name="dummy", - ) - with pytest.raises(TypeError): - LGBMTreeliteDumper.dump( - model=model, toolchain="gcc", parallel_comp=1, model_path=".", model_name=0 - ) - with pytest.raises(ValueError): - LGBMTreeliteDumper.dump( - model=model, - toolchain="a", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) diff --git a/gators/model_building/tests/test_train_test_split.py b/gators/model_building/tests/test_train_test_split.py deleted file mode 100644 index ee063e6a..00000000 --- a/gators/model_building/tests/test_train_test_split.py +++ /dev/null @@ -1,247 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal, assert_series_equal - -from gators.model_building.train_test_split import TrainTestSplit - - -@pytest.fixture() -def data_ordered(): - X = pd.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) - y_name = "TARGET" - y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy="ordered") - X_train_expected = pd.DataFrame( - { - "A": {0: 0, 1: 5, 2: 10, 3: 15}, - "B": {0: 1, 1: 6, 2: 11, 3: 16}, - "C": {0: 2, 1: 7, 2: 12, 3: 17}, - "D": {0: 3, 1: 8, 2: 13, 3: 18}, - "E": {0: 4, 1: 9, 2: 14, 3: 19}, - } - ) - X_test_expected = pd.DataFrame( - { - "A": {4: 20, 5: 25, 6: 30, 7: 35}, - "B": {4: 21, 5: 26, 6: 31, 7: 36}, - "C": {4: 22, 5: 27, 6: 32, 7: 37}, - "D": {4: 23, 5: 28, 6: 33, 7: 38}, - "E": {4: 24, 5: 29, 6: 34, 7: 39}, - } - ) - y_train_expected = pd.Series({0: 0, 1: 1, 2: 2, 3: 0}, name=y_name) - y_test_expected = pd.Series({4: 1, 5: 2, 6: 0, 7: 1}, name=y_name) - return ( - obj, - X, - y, - X_train_expected, - X_test_expected, - y_train_expected, - y_test_expected, - ) - - -@pytest.fixture() -def data_random(): - X = pd.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) - y_name = "TARGET" - y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy="random", random_state=0) - X_train_expected = pd.DataFrame( - { - "A": {0: 0, 3: 15, 4: 20, 5: 25}, - "B": {0: 1, 3: 16, 4: 21, 5: 26}, - "C": {0: 2, 3: 17, 4: 22, 5: 27}, - "D": {0: 3, 3: 18, 4: 23, 5: 28}, - "E": {0: 4, 3: 19, 4: 24, 5: 29}, - } - ) - X_test_expected = pd.DataFrame( - { - "A": {6: 30, 2: 10, 1: 5, 7: 35}, - "B": {6: 31, 2: 11, 1: 6, 7: 36}, - "C": {6: 32, 2: 12, 1: 7, 7: 37}, - "D": {6: 33, 2: 13, 1: 8, 7: 38}, - "E": {6: 34, 2: 14, 1: 9, 7: 39}, - } - ) - y_train_expected = pd.Series({0: 0, 3: 0, 4: 1, 5: 2}, name=y_name) - y_test_expected = pd.Series({6: 0, 2: 2, 1: 1, 7: 1}, name=y_name) - return ( - obj, - X, - y, - X_train_expected, - X_test_expected, - y_train_expected, - y_test_expected, - ) - - -@pytest.fixture() -def data_stratified(): - X = pd.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) - y_name = "TARGET" - y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy="stratified", random_state=0) - - X_train_expected = pd.DataFrame( - { - "A": {0: 0, 1: 5, 2: 10}, - "B": {0: 1, 1: 6, 2: 11}, - "C": {0: 2, 1: 7, 2: 12}, - "D": {0: 3, 1: 8, 2: 13}, - "E": {0: 4, 1: 9, 2: 14}, - } - ) - X_test_expected = pd.DataFrame( - { - "A": {6: 30, 3: 15, 7: 35, 4: 20, 5: 25}, - "B": {6: 31, 3: 16, 7: 36, 4: 21, 5: 26}, - "C": {6: 32, 3: 17, 7: 37, 4: 22, 5: 27}, - "D": {6: 33, 3: 18, 7: 38, 4: 23, 5: 28}, - "E": {6: 34, 3: 19, 7: 39, 4: 24, 5: 29}, - } - ) - y_train_expected = pd.Series({0: 0, 1: 1, 2: 2}, name=y_name) - y_test_expected = pd.Series({6: 0, 3: 0, 7: 1, 4: 1, 5: 2}, name=y_name) - return ( - obj, - X, - y, - X_train_expected, - X_test_expected, - y_train_expected, - y_test_expected, - ) - - -@pytest.fixture() -def data_ordered_ks(): - X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) - y_name = "TARGET" - y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy="ordered") - return obj, X, y - - -@pytest.fixture() -def data_random_ks(): - X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) - y_name = "TARGET" - y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy="random", random_state=0) - return obj, X, y - - -@pytest.fixture() -def data_stratified_ks(): - X = ks.DataFrame(np.arange(40).reshape(8, 5), columns=list("ABCDE")) - y_name = "TARGET" - y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name=y_name) - test_ratio = 0.5 - obj = TrainTestSplit(test_ratio=test_ratio, strategy="stratified", random_state=0) - return obj, X, y - - -def test_ordered(data_ordered): - ( - obj, - X, - y, - X_train_expected, - X_test_expected, - y_train_expected, - y_test_expected, - ) = data_ordered - X_train, X_test, y_train, y_test = obj.transform(X, y) - assert_frame_equal(X_train, X_train_expected) - assert_frame_equal(X_test, X_test_expected) - assert_series_equal(y_train, y_train_expected) - assert_series_equal(y_test, y_test_expected) - - -@pytest.mark.koalas -def test_ordered_ks(data_ordered_ks): - obj, X, y = data_ordered_ks - X_train, X_test, y_train, y_test = obj.transform(X, y) - X_new = pd.concat([X_train.to_pandas(), X_test.to_pandas()]) - y_new = pd.concat([y_train.to_pandas(), y_test.to_pandas()]) - assert_frame_equal(X.to_pandas(), X_new.sort_index()) - assert_series_equal(y.to_pandas(), y_new.sort_index()) - - -def test_random(data_random): - ( - obj, - X, - y, - X_train_expected, - X_test_expected, - y_train_expected, - y_test_expected, - ) = data_random - X_train, X_test, y_train, y_test = obj.transform(X, y) - assert_frame_equal(X_train, X_train_expected) - assert_frame_equal(X_test, X_test_expected) - assert_series_equal(y_train, y_train_expected) - assert_series_equal(y_test, y_test_expected) - - -@pytest.mark.koalas -def test_random_ks(data_random_ks): - obj, X, y = data_random_ks - X_train, X_test, y_train, y_test = obj.transform(X, y) - X_new = pd.concat([X_train.to_pandas(), X_test.to_pandas()]) - y_new = pd.concat([y_train.to_pandas(), y_test.to_pandas()]) - assert_frame_equal(X.to_pandas().drop("index", axis=1), X_new.sort_index()) - assert_series_equal(y.to_pandas(), y_new.sort_index()) - - -def test_stratified(data_stratified): - ( - obj, - X, - y, - X_train_expected, - X_test_expected, - y_train_expected, - y_test_expected, - ) = data_stratified - X_train, X_test, y_train, y_test = obj.transform(X, y) - assert_frame_equal(X_train.sort_index(), X_train_expected.sort_index()) - assert_frame_equal(X_test.sort_index(), X_test_expected.sort_index()) - assert_series_equal(y_train.sort_index(), y_train_expected.sort_index()) - assert_series_equal(y_test.sort_index(), y_test_expected.sort_index()) - - -@pytest.mark.koalas -def test_stratified_ks(data_stratified_ks): - obj, X, y = data_stratified_ks - X_train, X_test, y_train, y_test = obj.transform(X, y) - X_new = pd.concat([X_train.to_pandas(), X_test.to_pandas()]) - y_new = pd.concat([y_train.to_pandas(), y_test.to_pandas()]) - assert_frame_equal(X.to_pandas().drop("index", axis=1), X_new.sort_index()) - assert_series_equal(y.to_pandas(), y_new.sort_index()) - - -def test_input(): - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio="q", random_state="q", strategy="q") - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio="q", random_state="q", strategy="q") - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio=0.1, random_state="q", strategy="q") - with pytest.raises(TypeError): - _ = TrainTestSplit(test_ratio=0.1, random_state=0, strategy=0) - with pytest.raises(ValueError): - _ = TrainTestSplit(test_ratio=0.1, random_state=0, strategy="q") diff --git a/gators/model_building/tests/test_xgb_booster_builder.py b/gators/model_building/tests/test_xgb_booster_builder.py deleted file mode 100644 index 8d280077..00000000 --- a/gators/model_building/tests/test_xgb_booster_builder.py +++ /dev/null @@ -1,45 +0,0 @@ -# License: Apache-2.0 -import numpy as np -import pytest -import xgboost -from xgboost import XGBClassifier - -from gators.model_building.xgb_booster_builder import XGBBoosterBuilder - - -def test(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - xgb = XGBClassifier(n_estimators=2, max_depth=2, use_label_encoder=False) - xgb.fit(X_train, y_train) - xgb_booster = XGBBoosterBuilder.train(xgb, X_train, y_train) - assert np.allclose( - xgb.predict_proba(X_train)[:, 1], xgb_booster.predict(xgboost.DMatrix(X_train)) - ) - - -def test_num_class(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 2, 0]) - xgb = XGBClassifier(n_estimators=2, max_depth=2) - xgb.fit(X_train, y_train) - xgb_booster = XGBBoosterBuilder.train(xgb, X_train, y_train, num_class=3) - assert np.allclose( - xgb.predict_proba(X_train), xgb_booster.predict(xgboost.DMatrix(X_train)) - ) - - -def test_input(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - xgb = XGBClassifier(n_estimators=2, max_depth=2) - xgb.fit(X_train, y_train) - num_class = 2 - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(0, X_train, y_train, num_class) - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(xgb, 0, y_train, num_class) - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(xgb, X_train, 0, num_class) - with pytest.raises(TypeError): - _ = XGBBoosterBuilder.train(xgb, X_train, y_train, "a") diff --git a/gators/model_building/tests/test_xgb_treelite_dumper.py b/gators/model_building/tests/test_xgb_treelite_dumper.py deleted file mode 100644 index ef1f3caa..00000000 --- a/gators/model_building/tests/test_xgb_treelite_dumper.py +++ /dev/null @@ -1,97 +0,0 @@ -# License: Apache-2.0 -import glob -import os -import platform - -import numpy as np -import pytest -import xgboost -from xgboost import XGBClassifier - -from gators.model_building.xgb_treelite_dumper import XGBTreeliteDumper - - -def test(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - dtrain = xgboost.DMatrix(X_train, label=y_train) - model = xgboost.train({"max_depth": 1}, dtrain, num_boost_round=1) - if platform.system() == 'Linux': - XGBTreeliteDumper.dump( - model=model, - toolchain="gcc", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - elif platform.system() == 'Darwin': - XGBTreeliteDumper.dump( - model=model, - toolchain="clang", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - elif platform.system() == 'Windows': - XGBTreeliteDumper.dump( - model=model, - toolchain="msvc", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - else: - pass - - [os.remove(f) for f in glob.glob("*") if f.startswith('dummy')] - - -def test_input(): - X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y_train = np.array([0, 1, 1, 0]) - dtrain = xgboost.DMatrix(X_train, label=y_train) - model = xgboost.train({"max_depth": 1}, dtrain, num_boost_round=1) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=0, - toolchain="gcc", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain=0, - parallel_comp=1, - model_path=".", - model_name="dummy", - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain="gcc", - parallel_comp="a", - model_path=".", - model_name="dummy", - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, - toolchain="gcc", - parallel_comp=1, - model_path=0, - model_name="dummy", - ) - with pytest.raises(TypeError): - XGBTreeliteDumper.dump( - model=model, toolchain="gcc", parallel_comp=1, model_path=".", model_name=0 - ) - with pytest.raises(ValueError): - XGBTreeliteDumper.dump( - model=model, - toolchain="a", - parallel_comp=1, - model_path=".", - model_name="dummy", - ) diff --git a/gators/model_building/train_test_split.py b/gators/model_building/train_test_split.py deleted file mode 100644 index ec9d918f..00000000 --- a/gators/model_building/train_test_split.py +++ /dev/null @@ -1,419 +0,0 @@ -from typing import Tuple, Union - -import databricks.koalas as ks -import pandas as pd - -from ..transformers import TransformerXY -from ..util import util - - -class TrainTestSplit(TransformerXY): - """TrainTestSplit class. - - Parameters - ---------- - test_ratio : float - Proportion of the dataset to include in the test split. - strategy : str - Train/Test split strategy. The possible values are: - - * ordered - * random - * stratified - - random_state : int - Random state. - - Notes - ----- - Note that the `random` and `stratified` strategies will be give different - results for pandas and koalas. - - Examples - -------- - - * transform with `pandas` - - - ordered split - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 1 3 4 5 - 2 6 7 8 - 3 9 10 11 - >>> X_test - A B C - 4 12 13 14 - 5 15 16 17 - 6 18 19 20 - 7 21 22 23 - >>> y_train - 0 0 - 1 1 - 2 2 - 3 0 - Name: TARGET, dtype: int64 - >>> y_test - 4 1 - 5 2 - 6 0 - 7 1 - Name: TARGET, dtype: int64 - - - random split - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 3 9 10 11 - 4 12 13 14 - 5 15 16 17 - >>> X_test - A B C - 6 18 19 20 - 2 6 7 8 - 1 3 4 5 - 7 21 22 23 - >>> y_train - 0 0 - 3 0 - 4 1 - 5 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 2 2 - 1 1 - 7 1 - Name: TARGET, dtype: int64 - - - stratified split - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = pd.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = pd.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 1 3 4 5 - 2 6 7 8 - >>> X_test - A B C - 6 18 19 20 - 3 9 10 11 - 7 21 22 23 - 4 12 13 14 - 5 15 16 17 - >>> y_train - 0 0 - 1 1 - 2 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 3 0 - 7 1 - 4 1 - 5 2 - Name: TARGET, dtype: int64 - - * transform with `koalas` - - - ordered split - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='ordered') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 1 3 4 5 - 2 6 7 8 - 3 9 10 11 - >>> X_test - A B C - 4 12 13 14 - 5 15 16 17 - 6 18 19 20 - 7 21 22 23 - >>> y_train - 0 0 - 1 1 - 2 2 - 3 0 - Name: TARGET, dtype: int64 - >>> y_test - 4 1 - 5 2 - 6 0 - 7 1 - Name: TARGET, dtype: int64 - - - random split - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='random') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 7 21 22 23 - 3 9 10 11 - 2 6 7 8 - >>> X_test - A B C - 6 18 19 20 - 5 15 16 17 - 1 3 4 5 - 4 12 13 14 - >>> y_train - 0 0 - 7 1 - 3 0 - 2 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 5 2 - 1 1 - 4 1 - Name: TARGET, dtype: int64 - - - stratified split - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.model_building import TrainTestSplit - >>> X = ks.DataFrame(np.arange(24).reshape(8, 3), columns=list('ABC')) - >>> y = ks.Series([0, 1, 2, 0, 1, 2, 0, 1], name='TARGET') - >>> test_ratio = 0.5 - >>> obj = TrainTestSplit(test_ratio=test_ratio, strategy='stratified') - >>> X_train, X_test, y_train, y_test = obj.transform(X, y) - >>> X_train - A B C - 0 0 1 2 - 3 9 10 11 - 7 21 22 23 - 2 6 7 8 - >>> X_test - A B C - 6 18 19 20 - 1 3 4 5 - 4 12 13 14 - 5 15 16 17 - >>> y_train - 0 0 - 3 0 - 7 1 - 2 2 - Name: TARGET, dtype: int64 - >>> y_test - 6 0 - 1 1 - 4 1 - 5 2 - Name: TARGET, dtype: int64 - - """ - - def __init__(self, test_ratio: float, strategy: str, random_state: int = 0): - if not isinstance(strategy, str): - raise TypeError("`strategy` must be a string.") - if not isinstance(test_ratio, float): - raise TypeError("`test_ratio` must be a float.") - if not isinstance(random_state, int): - raise TypeError("`random_state` must be an int.") - if strategy not in ["ordered", "random", "stratified"]: - raise ValueError("`strategy` not implemented.") - self.test_ratio = test_ratio - self.random_state = random_state - self.strategy = strategy - - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[ - Union[pd.DataFrame, ks.DataFrame], - Union[pd.DataFrame, ks.DataFrame], - Union[pd.Series, ks.Series], - Union[pd.Series, ks.Series], - ]: - """Transform dataframe and series. - - Parameters - ---------- - X: Union[pd.DataFrame, ks.DataFrame] - Dataframe. - y: np.ndarray - Labels - test_ratio: float - Ratio of data points used for the test set. - - Returns - -------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame], - Union[pd.Series, ks.Series], Union[pd.Series, ks.Series]] - Train-Test split. - """ - self.check_dataframe(X) - self.check_y(X, y) - if self.strategy == "ordered": - return self.ordered_split(X, y) - y_name = y.name - x_name = X.index.name - if isinstance(X, ks.DataFrame): - X["index"] = X.index - Xy = X.join(y) - - if self.strategy == "random": - Xy_train, Xy_test = self.random_split(Xy, x_name) - else: - Xy_train, Xy_test = self.stratified_split(Xy, x_name, y_name) - return ( - Xy_train.drop(y_name, axis=1), - Xy_test.drop(y_name, axis=1), - Xy_train[y_name], - Xy_test[y_name], - ) - - def ordered_split( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: - """Perform random split. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - y : Union[pd.Series, ks.Series] - Series - Returns - ------- - Union[pd.DataFrame, ks.DataFrame]: - Train set. - Union[pd.DataFrame, ks.DataFrame]: - Test set. - """ - n_samples = X.shape[0] - n_test = int(self.test_ratio * n_samples) - n_train = n_samples - n_test - return X.head(n_train), X.tail(n_test), y.head(n_train), y.tail(n_test) - - def random_split( - self, Xy: Union[pd.DataFrame, ks.DataFrame], x_name: str - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: - """Perform random split. - - Parameters - ---------- - Xy : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - x_name: str - Dataframe index name. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame]: - Train set. - Union[pd.DataFrame, ks.DataFrame]: - Test set. - """ - - if isinstance(Xy, ks.DataFrame): - self.test_ratio -= 1e-6 - Xy_train, Xy_test = Xy.to_spark().randomSplit( - [1.0 - self.test_ratio, self.test_ratio], seed=self.random_state - ) - Xy_train = Xy_train.to_koalas() - Xy_test = Xy_test.to_koalas() - Xy_train.set_index("index", drop=True, inplace=True) - Xy_train.index.name = x_name - Xy_test.set_index("index", drop=True, inplace=True) - Xy_test.index.name = x_name - else: - Xy_test = Xy.sample(frac=self.test_ratio, random_state=self.random_state) - Xy_train = Xy.drop(Xy_test.index) - return Xy_train, Xy_test - - def stratified_split( - self, Xy: Union[pd.DataFrame, ks.DataFrame], x_name: str, y_name: str - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.DataFrame, ks.DataFrame]]: - """Perform stratified split. - - Parameters - ---------- - Xy : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - x_name: str - Dataframe index name. - y_name: str - Target column name. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame]: - Train set. - Union[pd.DataFrame, ks.DataFrame]: - Test set. - """ - y_values = Xy[y_name].value_counts(normalize=True) - Xy_test_list = [] - Xy_train_list = [] - if isinstance(Xy, ks.DataFrame): - self.test_ratio -= 1e-6 - for label, ratio in y_values.iteritems(): - Xy_label = Xy[Xy[y_name] == label] - Xy_train_label, Xy_test_label = Xy_label.to_spark().randomSplit( - [1.0 - self.test_ratio, self.test_ratio], seed=self.random_state - ) - Xy_train_label = Xy_train_label.to_koalas() - Xy_test_label = Xy_test_label.to_koalas() - Xy_train_label.set_index("index", drop=True, inplace=True) - Xy_train_label.index.name = x_name - Xy_test_label.set_index("index", drop=True, inplace=True) - Xy_test_label.index.name = x_name - Xy_test_list.append(Xy_test_label) - Xy_train_list.append(Xy_train_label) - return util.concat(Xy_train_list, axis=0), util.concat(Xy_test_list, axis=0) - - for label, ratio in y_values.iteritems(): - Xy_label = Xy[Xy[y_name] == label] - Xy_label_test = Xy_label.sample( - frac=self.test_ratio, random_state=self.random_state - ) - Xy_test_list.append(Xy_label_test) - Xy_train_list.append(Xy_label.drop(Xy_label_test.index)) - return util.concat(Xy_train_list, axis=0), util.concat(Xy_test_list, axis=0) diff --git a/gators/model_building/xgb_booster_builder.py b/gators/model_building/xgb_booster_builder.py deleted file mode 100644 index 74e3a9a1..00000000 --- a/gators/model_building/xgb_booster_builder.py +++ /dev/null @@ -1,67 +0,0 @@ -# License: Apache-2.0 -from typing import Union - -import numpy as np -import xgboost -from xgboost import XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor - - -class XGBBoosterBuilder: - """XGBoost Booster Converter Class. - - Examples - -------- - >>> import numpy as np - >>> import xgboost as xgb - >>> from gators.model_building import XGBBoosterBuilder - >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_train = np.array([0, 1, 1, 0]) - >>> model = xgb.XGBClassifier(eval_metric='logloss').fit(X_train, y_train) - >>> xgbooster = XGBBoosterBuilder.train( - ... model=model, - ... X_train=X_train, - ... y_train=y_train, - >>> xgbooster.predict(xgb.DMatrix(X_train)) - array([0.5, 0.5, 0.5, 0.5], dtype=float32) - - """ - - @staticmethod - def train( - model: Union[XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor], - X_train: np.array, - y_train: np.ndarray, - num_class=None, - ): - """Convert the XGBoost model to a XGB Booster model. - - Parameters - ---------- - model : Union[XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor] - Trained xgboost.sklearn model. - X_train : np.ndarray - Train array. - y_train : np.ndarray - Labels. - - Returns - ------- - xgboost.Booster - Trained xgboost Booster model. - """ - if not isinstance( - model, (XGBClassifier, XGBRegressor, XGBRFClassifier, XGBRFRegressor) - ): - raise TypeError("`model` should be a `xgboost.sklearn` model.") - if not isinstance(X_train, np.ndarray): - raise TypeError("`X_train` should be a NumPy array.") - if not isinstance(y_train, np.ndarray): - raise TypeError("`y_train` should be a NumPy array.") - if num_class is not None and not isinstance(num_class, int): - raise TypeError("`num_class` should be an int.") - params = model.get_xgb_params() - if num_class: - params["num_class"] = num_class - n_estimators = model.n_estimators - dtrain = xgboost.DMatrix(X_train, label=y_train) - return xgboost.train(params, dtrain, n_estimators) diff --git a/gators/model_building/xgb_treelite_dumper.py b/gators/model_building/xgb_treelite_dumper.py deleted file mode 100644 index 9e5e8f74..00000000 --- a/gators/model_building/xgb_treelite_dumper.py +++ /dev/null @@ -1,94 +0,0 @@ -# License: Apache-2.0 -import os - -import numpy as np -import treelite -import xgboost -from xgboost.sklearn import XGBClassifier - - -class XGBTreeliteDumper: - """XGBoost Treelite Dumper class. - - Examples - -------- - >>> import numpy as np - >>> import xgboost as xgb - >>> from gators.model_building import XGBTreeliteDumper - >>> X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - >>> y_train = np.array([0, 1, 1, 0]) - >>> dtrain = xgb.DMatrix(X_train, label=y_train) - >>> model = xgb.train({'max_depth': 1}, dtrain, num_boost_round=1) - >>> XGBTreeliteDumper.dump( - ... model=model, - ... toolchain='gcc', - ... parallel_comp=1, - ... model_path='.', - ... model_name='dummy') - [00:00:00] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/compiler/ast_native.cc:45: Using ASTNativeCompiler - [00:00:01] ../src/compiler/ast/split.cc:31: Parallel compilation enabled; member trees will be divided into 1 translation units. - [00:00:01] ../src/c_api/c_api.cc:121: Code generation finished. Writing code to files... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file tu0.c... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file header.h... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file recipe.json... - [00:00:01] ../src/c_api/c_api.cc:126: Writing file main.c... - """ - - @staticmethod - def dump( - model: xgboost.core.Booster, - toolchain: str, - parallel_comp: int, - model_path: str, - model_name: str, - ): - """Dump the XGBoost treelite as a .so and a - .dylib file. - - Parameters - ---------- - model: xgboost.core.Booster. - Trained model. - toolchain: str - Compiler. List of available treelite compiler. - * gcc - * clang - * msvc - parallel_comp: int - Treelite parallel compilation. - model_path : str - Model path. - model_name : str - Model name. - """ - if not isinstance(model, xgboost.core.Booster): - raise TypeError("`model` should be an xgboost.core.Booster.") - if not isinstance(toolchain, str): - raise TypeError("`toolchain` should be a str.") - if toolchain not in ["gcc", "clang", "msvc"]: - raise ValueError("`toolchain` should be `gcc`, `clang`, or `msvc`.") - if not isinstance(parallel_comp, int): - raise TypeError("`parallel_comp` should be an int.") - if not isinstance(model_path, str): - raise TypeError("`model_path` should be a str.") - if not isinstance(model_name, str): - raise TypeError("`model_name` should be a str.") - model_ = treelite.Model.from_xgboost(model) - platform_dict = {"gcc": "unix", "clang": "osx", "msvc": "windows"} - format_dict = {"gcc": ".so", "clang": ".dylib", "msvc": ".dll"} - model_.export_lib( - toolchain=toolchain, - libpath=os.path.join(model_path, model_name + format_dict[toolchain]), - verbose=False, - params={"parallel_comp": parallel_comp}, - nthread=1, - ) - model_.export_srcpkg( - platform=platform_dict[toolchain], - toolchain=toolchain, - params={"parallel_comp": parallel_comp}, - pkgpath=os.path.join(model_path, model_name + ".zip"), - libname=os.path.join(model_path, model_name + format_dict[toolchain]), - verbose=True, - ) diff --git a/gators/pipeline/__pycache__/__init__.cpython-38.pyc b/gators/pipeline/__pycache__/__init__.cpython-38.pyc index 6dee637f..64554744 100644 Binary files a/gators/pipeline/__pycache__/__init__.cpython-38.pyc and b/gators/pipeline/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/pipeline/__pycache__/pipeline.cpython-38.pyc b/gators/pipeline/__pycache__/pipeline.cpython-38.pyc index bea1ceb6..6cb6a903 100644 Binary files a/gators/pipeline/__pycache__/pipeline.cpython-38.pyc and b/gators/pipeline/__pycache__/pipeline.cpython-38.pyc differ diff --git a/gators/pipeline/pipeline.py b/gators/pipeline/pipeline.py index ceac232c..c892f29e 100644 --- a/gators/pipeline/pipeline.py +++ b/gators/pipeline/pipeline.py @@ -1,66 +1,69 @@ # License: Apache-2.0 -from typing import List, Union +from typing import List, Tuple -import databricks.koalas as ks import numpy as np -import pandas as pd - +from sklearn.pipeline import Pipeline as SciKitPipeline from ..transformers.transformer import Transformer -from ..util import util + +from gators import Series -class Pipeline(Transformer): - """Chain the **gators** transformers together. +class Pipeline(SciKitPipeline, Transformer): + """SciKitPileline Chain the **gators** transformers together. Parameters ---------- - steps : List[Transformer] - List of transformations. + steps : List[Tuple[Transformer]] + List of transformers ending, or not, by an estimator. + + memory : str, default None. + Scilit-learn pipeline `memory` parameter. + + verbose : bool, default False. + Verbosity. Examples --------- + Imports and initialization: - * fit & transform with `pandas` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer + >>> from gators.imputers import NumericImputer >>> from gators.imputers import ObjectImputer >>> from gators.pipeline import Pipeline - >>> X = pd.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] + ... ('ObjectImputer', ObjectImputer(strategy='constant', value='MISSING')), + ... ('NumericImputerMedian', NumericImputer(strategy='median', columns=['A'])), + ... ('NumericImputerFrequent', NumericImputer(strategy='most_frequent', columns=['B']))] >>> obj = Pipeline(steps=steps) - >>> obj.fit_transform(X) - A B C - 0 0.1 1.0 a - 1 0.2 2.0 b - 2 0.3 2.0 c - 3 0.2 2.0 MISSING - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0.1, 0.2, 0.3, np.nan], + ... 'B': [1, 2, 2, np.nan], + ... 'C': ['a', 'b', 'c', None]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': [0.1, 0.2, 0.3, np.nan], + ... 'B': [1, 2, 2, np.nan], + ... 'C': ['a', 'b', 'c', None]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({ + ... 'A': [0.1, 0.2, 0.3, np.nan], + ... 'B': [1, 2, 2, np.nan], + ... 'C': ['a', 'b', 'c', None]}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline - >>> X = ks.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) >>> obj.fit_transform(X) A B C 0 0.1 1.0 a @@ -68,47 +71,10 @@ class Pipeline(Transformer): 2 0.3 2.0 c 3 0.2 2.0 MISSING - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline >>> X = pd.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0.1, 1.0, 'a'], - [0.2, 2.0, 'b'], - [0.3, 2.0, 'c'], - [0.2, 2.0, 'MISSING']], dtype=object) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> import numpy as np - >>> from gators.imputers import IntImputer - >>> from gators.imputers import FloatImputer - >>> from gators.imputers import ObjectImputer - >>> from gators.pipeline import Pipeline - >>> X = ks.DataFrame({ - ... 'A': [0.1, 0.2, 0.3, np.nan], - ... 'B': [1, 2, 2, np.nan], - ... 'C': ['a', 'b', 'c', np.nan]}) - >>> steps = [ - ... ObjectImputer(strategy='constant', value='MISSING'), - ... FloatImputer(strategy='median'), - ... IntImputer(strategy='most_frequent')] - >>> obj = Pipeline(steps=steps) + ... 'A': [0.1, 0.2, 0.3, np.nan], + ... 'B': [1, 2, 2, np.nan], + ... 'C': ['a', 'b', 'c', None]}) >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[0.1, 1.0, 'a'], @@ -117,65 +83,21 @@ class Pipeline(Transformer): [0.2, 2.0, 'MISSING']], dtype=object) """ - def __init__(self, steps: List[Transformer]): - if not isinstance(steps, list): + def __init__(self, steps: List[Tuple[Transformer]], memory=None, verbose=False): + if not isinstance(steps, (list, np.ndarray)): raise TypeError("`steps` should be a list.") if not steps: - raise TypeError("`steps` should be an empty list.") + raise TypeError("`steps` should not be an empty list.") self.steps = steps - self.is_model = hasattr(self.steps[-1], "predict") + self.is_model = (hasattr(self.steps[-1][1], "predict")) or ( + "pyspark.ml" in str(type(self.steps[-1][1])) + ) + SciKitPipeline.__init__(self, steps=steps, memory=memory, verbose=verbose) self.n_steps = len(self.steps) self.n_transformations = self.n_steps - 1 if self.is_model else self.n_steps - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "Pipeline": - """Fit the transformer on the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - y : None - None. - - Returns - ------- - Pipeline - Instance of itself. - """ - self.base_columns = list(X.columns) - for step in self.steps[: self.n_transformations]: - step = step.fit(X, y) - X = step.transform(X) - if self.is_model: - _ = self.steps[-1].fit(X, y) - return self - - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame] - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - for step in self.steps[: self.n_transformations]: - X = step.transform(X) - return X - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the NumPy array `X`. + """Transform the array `X`. Parameters ---------- @@ -184,172 +106,10 @@ def transform_numpy(self, X: np.ndarray) -> np.ndarray: Returns ------- - np.ndarray + X : np.ndarray Transformed array. """ self.check_array(X) for step in self.steps[: self.n_transformations]: - X = step.transform_numpy(X) - return X - - def fit_transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Fit and transform the pandas dataframe. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed pandas dataframe. - """ - self.base_columns = list(X.columns).copy() - # import time - for step in self.steps[: self.n_transformations]: - step = step.fit(X, y) - X = step.transform(X) + X = step[1].transform_numpy(X) return X - - def predict( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> np.ndarray: - """Predict on X, and predict. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - np.ndarray - Model predictions. - """ - for step in self.steps[:-1]: - X = step.transform(X) - return self.steps[-1].predict(X) - - def predict_proba( - self, X: Union[pd.DataFrame, ks.DataFrame], y: np.array = None - ) -> np.ndarray: - """Predict on X, and return the probability of success. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - np.ndarray - Model probabilities of success. - """ - for step in self.steps[:-1]: - X = step.transform(X) - return self.steps[-1].predict_proba(X) - - def predict_numpy( - self, X: np.ndarray, y: Union[pd.Series, ks.Series] = None - ) -> np.ndarray: - """Predict on X, and predict. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - np.ndarray - Model predictions. - """ - for step in self.steps[:-1]: - X = step.transform_numpy(X) - return self.steps[-1].predict(X) - - def predict_proba_numpy(self, X: np.ndarray) -> np.ndarray: - """Predict on X, and return the probability of success. - - Parameters - ---------- - X : np.ndarray - Input array. - - Returns - ------- - np.ndarray - Model probabilities of success. - """ - for step in self.steps[:-1]: - X = step.transform_numpy(X) - return self.steps[-1].predict_proba(X) - - def get_feature_importances(self, k: int) -> pd.Series: - """Get the feature importances of the pipeline. - - Parameters - ---------- - k int - Number of top features to return. - - Returns - ------- - pd.Series - Feature importances. - """ - if not hasattr(self.steps[-1], "feature_importances_"): - raise AttributeError( - """The last step of the pipeline should have - the attribute `feature_importances_`""" - ) - feature_importances_ = self.steps[-1].feature_importances_ - return feature_importances_.sort_values(ascending=False).iloc[:k] - - def get_features(self) -> List[str]: - """Get the feature importances of the pipeline. - - Parameters - ---------- - k int - Number of top features to return. - - Returns - ------- - List[str] - List of features. - """ - if not hasattr(self.steps[-1], "selected_columns"): - raise AttributeError( - """The last step of the pipeline should have - the attribute `selected_columns`""" - ) - return self.steps[-1].selected_columns - - def get_production_columns(self): - has_feature_importances_ = hasattr(self.steps[-1], "feature_importances_") - if not has_feature_importances_: - raise AttributeError( - """The last step of the pipeline should contains - the atrribute `feature_importances_`""" - ) - features = self.steps[-1].selected_columns - - base_columns_ = features.copy() - for step in self.steps[::-1]: - if not hasattr(step, "column_names"): - continue - for i, col in enumerate(base_columns_): - if col in step.column_mapping: - base_columns_[i] = step.column_mapping[col] - base_columns_ = list(set(util.flatten_list(base_columns_))) - base_columns_ = list(set(base_columns_)) - prod_columns = [c for c in self.base_columns if c in base_columns_] - return prod_columns diff --git a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-36-pytest-6.2.5.pyc b/gators/pipeline/tests/__pycache__/test_pipeline.cpython-36-pytest-6.2.5.pyc deleted file mode 100644 index 8a2aca85..00000000 Binary files a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-36-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-37-pytest-6.2.5.pyc b/gators/pipeline/tests/__pycache__/test_pipeline.cpython-37-pytest-6.2.5.pyc deleted file mode 100644 index 35098d96..00000000 Binary files a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-37-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-38-pytest-6.2.5.pyc b/gators/pipeline/tests/__pycache__/test_pipeline.cpython-38-pytest-6.2.5.pyc deleted file mode 100644 index 81f67cfc..00000000 Binary files a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-38-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-39-pytest-6.2.5.pyc b/gators/pipeline/tests/__pycache__/test_pipeline.cpython-39-pytest-6.2.5.pyc deleted file mode 100644 index 16e12ca9..00000000 Binary files a/gators/pipeline/tests/__pycache__/test_pipeline.cpython-39-pytest-6.2.5.pyc and /dev/null differ diff --git a/gators/pipeline/tests/test_pipeline.py b/gators/pipeline/tests/test_pipeline.py deleted file mode 100644 index f55c2518..00000000 --- a/gators/pipeline/tests/test_pipeline.py +++ /dev/null @@ -1,233 +0,0 @@ -# License: Apache-2.0 -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal, assert_series_equal -from sklearn.ensemble import RandomForestClassifier - -from gators.feature_selection.select_from_model import SelectFromModel -from gators.pipeline.pipeline import Pipeline -from gators.transformers.transformer import Transformer - - -class MultiplyTransformer(Transformer): - def __init__(self, multiplier): - self.multiplier = multiplier - - def fit(self, X, y=None): - return self - - def transform(self, X): - - return self.multiplier * X - - def transform_numpy(self, X): - return self.multiplier * X - - -class NameTransformer(Transformer): - def fit(self, X, y=None): - self.column_names = [f"{c}_new" for c in X.columns] - self.column_mapping = dict(zip(self.column_names, [[c] for c in X.columns])) - self.column_mapping["D_new"] = "D" - return self - - def transform(self, X): - return X.rename(columns=dict(zip(X.columns, self.column_names))) - - def transform_numpy(self, X): - return X - - -@pytest.fixture -def pipeline_example(): - X = pd.DataFrame( - [ - [1.764, 0.4, 0.979, 2.241], - [1.868, -0.977, 0.95, -0.151], - [-0.103, 0.411, 0.144, 1.454], - [0.761, 0.122, 0.444, 0.334], - ], - columns=list("ABCD"), - ) - y = pd.Series([0, 1, 0, 1], name="TARGET") - steps = [ - MultiplyTransformer(4.0), - MultiplyTransformer(0.5), - NameTransformer(), - ] - pipe = Pipeline(steps) - X_expected = pd.DataFrame( - { - "A_new": {0: 3.528, 1: 3.736, 2: -0.206, 3: 1.522}, - "B_new": {0: 0.8, 1: -1.954, 2: 0.822, 3: 0.244}, - "C_new": {0: 1.958, 1: 1.9, 2: 0.288, 3: 0.888}, - "D_new": {0: 4.482, 1: -0.302, 2: 2.908, 3: 0.668}, - } - ) - return pipe, X, X_expected - - -@pytest.fixture -def pipeline_with_feature_selection_example(): - X = pd.DataFrame( - [ - [1.764, 0.4, 0.979, 2.241], - [1.868, -0.977, 0.95, -0.151], - [-0.103, 0.411, 0.144, 1.454], - [0.761, 0.122, 0.444, 0.334], - ], - columns=list("ABCD"), - ) - y = pd.Series([0, 1, 0, 1], name="TARGET") - model = RandomForestClassifier(n_estimators=6, max_depth=4, random_state=0) - steps = [ - MultiplyTransformer(4.0), - MultiplyTransformer(0.5), - NameTransformer(), - SelectFromModel(model=model, k=3), - ] - pipe = Pipeline(steps).fit(X, y) - X_expected = pd.DataFrame( - { - "A_new": {0: 3.528, 1: 3.736, 2: -0.206, 3: 1.522}, - "B_new": {0: 0.8, 1: -1.954, 2: 0.822, 3: 0.244}, - "C_new": {0: 1.958, 1: 1.9, 2: 0.288, 3: 0.888}, - "D_new": {0: 4.482, 1: -0.302, 2: 2.908, 3: 0.668}, - } - ) - return pipe, X, X_expected - - -@pytest.fixture -def pipeline_with_model_example(): - X = pd.DataFrame( - [ - [1.764, 0.4, 0.979, 2.241], - [1.868, -0.977, 0.95, -0.151], - [-0.103, 0.411, 0.144, 1.454], - [0.761, 0.122, 0.444, 0.334], - ], - columns=list("ABCD"), - ) - y = pd.Series([0, 1, 0, 1], name="TARGET") - model = RandomForestClassifier(n_estimators=6, max_depth=4, random_state=0) - steps = [ - MultiplyTransformer(4.0), - MultiplyTransformer(0.5), - NameTransformer(), - model, - ] - X_expected = pd.DataFrame( - { - "A_new": {0: 3.528, 1: 3.736, 2: -0.206, 3: 1.522}, - "B_new": {0: 0.8, 1: -1.954, 2: 0.822, 3: 0.244}, - "C_new": {0: 1.958, 1: 1.9, 2: 0.288, 3: 0.888}, - "D_new": {0: 4.482, 1: -0.302, 2: 2.908, 3: 0.668}, - } - ) - pipe = Pipeline(steps).fit(X, y) - return pipe, X, X_expected - - -def test_pandas_pipeline_fit_and_transform(pipeline_example): - pipe, X, X_expected = pipeline_example - _ = pipe.fit(X) - X_new = pipe.transform(X) - assert_frame_equal(X_expected, X_new) - - -def test_pandas_fit_transform_pipeline(pipeline_example): - pipe, X, X_expected = pipeline_example - X_new = pipe.fit_transform(X) - assert_frame_equal(X_expected, X_new) - - -def test_pipeline_predict_pandas(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict(X) - assert y_pred.shape == (4,) - - -def test_pipeline_predict_proba_pandas(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict_proba(X) - assert y_pred.shape == (4, 2) - - -def test_pipeline_numpy(pipeline_example): - pipe, X, X_expected = pipeline_example - _ = pipe.fit(X) - X_numpy_new = pipe.transform_numpy(X.to_numpy()) - assert np.allclose(X_expected.to_numpy(), X_numpy_new) - - -def test_pipeline_predict_numpy(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict_numpy(X.to_numpy()) - assert y_pred.shape == (4,) - - -def test_pipeline_predict_proba_numpy(pipeline_with_model_example): - pipe, X, X_expected = pipeline_with_model_example - y_pred = pipe.predict_proba_numpy(X.to_numpy()) - assert y_pred.shape == (4, 2) - - -def test_default_fit_transform_pipeline(pipeline_example): - pipe, X, X_expected = pipeline_example - X_new = pipe.fit_transform(X) - assert_frame_equal(X_expected, X_new) - - -def test_init(): - with pytest.raises(TypeError): - _ = Pipeline(0) - with pytest.raises(TypeError): - _ = Pipeline([]) - - -def test_pipeline_transform_input_data(pipeline_example): - pipe, X, _ = pipeline_example - _ = pipe.fit(X) - with pytest.raises(TypeError): - _ = pipe.transform(X.to_numpy()) - with pytest.raises(TypeError): - _ = pipe.transform(X, X) - with pytest.raises(TypeError): - _ = pipe.transform_numpy(X) - - -def test_get_feature_importances(pipeline_with_feature_selection_example): - pipe, _, _ = pipeline_with_feature_selection_example - feature_importances_expected = pd.Series({"D_new": 0.6, "B_new": 0.4}) - feature_importances = pipe.get_feature_importances(k=2) - assert_series_equal(feature_importances, feature_importances_expected) - - -def test_get_features(pipeline_with_feature_selection_example): - pipe, _, _ = pipeline_with_feature_selection_example - assert ["D_new", "B_new"] == pipe.get_features() - - -def test_get_feature_importances_no_feature_selection(pipeline_example): - pipe, _, _ = pipeline_example - with pytest.raises(AttributeError): - pipe.get_feature_importances(k=2) - - -def test_get_features_no_feature_selection(pipeline_example): - pipe, _, _ = pipeline_example - with pytest.raises(AttributeError): - pipe.get_features() - - -def test_get_production_columns(pipeline_with_feature_selection_example): - pipe, _, _ = pipeline_with_feature_selection_example - assert pipe.get_production_columns() == ["B", "D"] - - -def test_get_production_columns_no_feature_selection(pipeline_example): - pipe, _, _ = pipeline_example - with pytest.raises(AttributeError): - pipe.get_production_columns() diff --git a/gators/pipeline/tests/test_pipeline_dd.py b/gators/pipeline/tests/test_pipeline_dd.py new file mode 100644 index 00000000..4e32ef0d --- /dev/null +++ b/gators/pipeline/tests/test_pipeline_dd.py @@ -0,0 +1,126 @@ +# License: Apache-2.0 +import pytest +import dask.dataframe as dd +import pandas as pd +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier + +# from gators.model_building.model import Model +from gators.pipeline.pipeline import Pipeline +from gators.transformers.transformer import Transformer + +data = load_iris() + + +class MultiplyTransformer(Transformer): + def __init__(self, multiplier): + self.multiplier = multiplier + + def fit(self, X, y=None): + return self + + def transform(self, X): + Transformer.check_dataframe(X) + return self.multiplier * X + + def transform_numpy(self, X): + Transformer.check_array(X) + return self.multiplier * X + + +class NameTransformer(Transformer): + def fit(self, X, y=None): + self.column_names = [f"{c}_new" for c in X.columns] + return self + + def transform(self, X): + return X.rename(columns=dict(zip(X.columns, self.column_names))) + + def transform_numpy(self, X): + return X + + +@pytest.fixture +def pipeline_example(): + X = dd.from_pandas( + pd.DataFrame(data["data"], columns=data["feature_names"]), npartitions=1 + ) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + ] + pipe = Pipeline(steps) + return pipe, X + + +@pytest.fixture +def pipeline_with_model_example(): + X = dd.from_pandas( + pd.DataFrame(data["data"], columns=data["feature_names"]), npartitions=1 + ) + y = dd.from_pandas(pd.Series(data["target"], name="TARGET"), npartitions=1) + # model = RandomForestClassifier(n_estimators=6, max_depth=4, random_state=0) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + # ["Estimator", Model(model)], + ] + pipe = Pipeline(steps).fit(X, y) + return pipe, X + + +def test_pipeline_fit_and_transform(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + X_new = pipe.transform(X) + assert X_new.compute().shape == (150, 4) + assert list(X_new.columns) == [ + "sepal length (cm)_new", + "sepal width (cm)_new", + "petal length (cm)_new", + "petal width (cm)_new", + ] + + +def test_fit_transform_pipeline(pipeline_example): + pipe, X = pipeline_example + X_new = pipe.fit_transform(X) + assert X_new.compute().shape == (150, 4) + assert list(X_new.columns) == [ + "sepal length (cm)_new", + "sepal width (cm)_new", + "petal length (cm)_new", + "petal width (cm)_new", + ] + + +# def test_pipeline_predict(pipeline_with_model_example): +# pipe, X = pipeline_with_model_example +# y_pred = pipe.predict(X) +# assert y_pred.shape == (150,) + + +# def test_pipeline_predict_proba(pipeline_with_model_example): +# pipe, X = pipeline_with_model_example +# y_pred = pipe.predict_proba(X) +# assert y_pred.shape == (150, 3) + + +def test_pipeline_numpy(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + X_numpy_new = pipe.transform_numpy(X.compute().to_numpy()) + assert X_numpy_new.shape == (150, 4) + + +def test_pipeline_transform_input_data(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + with pytest.raises(TypeError): + _ = pipe.transform(X.compute().to_numpy()) + with pytest.raises(TypeError): + _ = pipe.transform(X, X) + with pytest.raises(TypeError): + _ = pipe.transform_numpy(X) diff --git a/gators/pipeline/tests/test_pipeline_ks.py b/gators/pipeline/tests/test_pipeline_ks.py new file mode 100644 index 00000000..9b120e20 --- /dev/null +++ b/gators/pipeline/tests/test_pipeline_ks.py @@ -0,0 +1,127 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest + +# from pyspark.ml.classification import RandomForestClassifier as RFCSpark +from sklearn.datasets import load_iris + +from gators.feature_selection.select_from_model import SelectFromModel + +# from gators.model_building.model import Model +from gators.pipeline.pipeline import Pipeline +from gators.transformers.transformer import Transformer + +ps.set_option("compute.default_index_type", "distributed-sequence") + +from sklearn.datasets import load_iris + +data = load_iris() + + +class MultiplyTransformer(Transformer): + def __init__(self, multiplier): + self.multiplier = multiplier + + def fit(self, X, y=None): + return self + + def transform(self, X): + Transformer.check_dataframe(X) + return self.multiplier * X + + def transform_numpy(self, X): + Transformer.check_array(X) + return self.multiplier * X + + +class NameTransformer(Transformer): + def fit(self, X, y=None): + self.column_names = [f"{c}_new" for c in X.columns] + return self + + def transform(self, X): + Transformer.check_dataframe(X) + return X.rename(columns=dict(zip(X.columns, self.column_names))) + + def transform_numpy(self, X): + Transformer.check_array(X) + return X + + +@pytest.fixture +def pipeline_example(): + X = ps.DataFrame(data["data"], columns=data["feature_names"]) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + ] + pipe = Pipeline(steps) + return pipe, X + + +@pytest.fixture +def pipeline_with_model_example(): + X = ps.DataFrame(data["data"], columns=data["feature_names"]) + y = ps.Series(data["target"], name="TARGET") + + # model = RFCSpark(numTrees=1, maxDepth=2, labelCol=y.name, seed=0) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + # ["Estimator", Model(model)], + ] + pipe = Pipeline(steps).fit(X, y) + return pipe, X + + +@pytest.mark.pyspark +def test_pipeline_fit_and_transform_ks(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + X_new = pipe.transform(X) + assert X_new.shape == (150, 4) + assert list(X_new.columns) == [ + "sepal length (cm)_new", + "sepal width (cm)_new", + "petal length (cm)_new", + "petal width (cm)_new", + ] + + +@pytest.mark.pyspark +def test_fit_transform_pipeline_ks(pipeline_example): + pipe, X = pipeline_example + X_new = pipe.fit_transform(X) + assert X_new.shape == (150, 4) + assert list(X_new.columns) == [ + "sepal length (cm)_new", + "sepal width (cm)_new", + "petal length (cm)_new", + "petal width (cm)_new", + ] + + +# @pytest.mark.pyspark +# def test_pipeline_predict_ks(pipeline_with_model_example): +# pipe, X = pipeline_with_model_example +# y_pred = pipe.predict(X) +# assert y_pred.shape == (150,) + + +# @pytest.mark.pyspark +# def test_pipeline_predict_proba_ks(pipeline_with_model_example): +# pipe, X = pipeline_with_model_example +# y_pred = pipe.predict_proba(X) +# assert y_pred.shape == (150,) + + +@pytest.mark.pyspark +def test_pipeline_np_ks(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + X_numpy_new = pipe.transform_numpy(X.to_numpy()) + assert X_numpy_new.shape == (150, 4) diff --git a/gators/pipeline/tests/test_pipeline_pd.py b/gators/pipeline/tests/test_pipeline_pd.py new file mode 100644 index 00000000..fbb42ccc --- /dev/null +++ b/gators/pipeline/tests/test_pipeline_pd.py @@ -0,0 +1,166 @@ +# License: Apache-2.0import numpy as np +import pandas as pd +import pytest +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier + +# from gators.model_building.model import Model +from gators.feature_selection.select_from_model import SelectFromModel +from gators.pipeline.pipeline import Pipeline +from gators.transformers.transformer import Transformer + +data = load_iris() + + +class MultiplyTransformer(Transformer): + def __init__(self, multiplier): + self.multiplier = multiplier + + def fit(self, X, y=None): + return self + + def transform(self, X): + Transformer.check_dataframe(X) + + return self.multiplier * X + + def transform_numpy(self, X): + Transformer.check_array(X) + return self.multiplier * X + + +class NameTransformer(Transformer): + def fit(self, X, y=None): + self.column_names = [f"{c}_new" for c in X.columns] + return self + + def transform(self, X): + Transformer.check_dataframe(X) + return X.rename(columns=dict(zip(X.columns, self.column_names))) + + def transform_numpy(self, X): + Transformer.check_array(X) + return X + + +@pytest.fixture +def pipeline_example(): + X = pd.DataFrame(data["data"], columns=data["feature_names"]) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + ] + pipe = Pipeline(steps) + return pipe, X + + +@pytest.fixture +def pipeline_with_feature_selection_example(): + X = pd.DataFrame(data["data"], columns=data["feature_names"]) + y = pd.Series(data["target"], name="TARGET") + + model = RandomForestClassifier(n_estimators=6, max_depth=4, random_state=0) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + ["SelectFromModel", SelectFromModel(model=model, k=3)], + ] + pipe = Pipeline(steps).fit(X, y) + return pipe, X + + +# @pytest.fixture +# def pipeline_with_model_example(): +# X = pd.DataFrame(data["data"], columns=data["feature_names"]) +# y = pd.Series(data["target"], name="TARGET") +# model = RandomForestClassifier(n_estimators=6, max_depth=4, random_state=0) +# steps = [ +# ["MultiplyTransformer1", MultiplyTransformer(4.0)], +# ["MultiplyTransformer2", MultiplyTransformer(0.5)], +# ["NameTransformer", NameTransformer()], +# ["Estimator", Model(model)], +# ] +# pipe = Pipeline(steps).fit(X, y) +# return pipe, X + + +def test_pipeline_fit_and_transform(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + X_new = pipe.transform(X) + assert X_new.shape == (150, 4) + assert list(X_new.columns) == [ + "sepal length (cm)_new", + "sepal width (cm)_new", + "petal length (cm)_new", + "petal width (cm)_new", + ] + + +def test_fit_transform_pipeline(pipeline_example): + pipe, X = pipeline_example + X_new = pipe.fit_transform(X) + assert X_new.shape == (150, 4) + assert list(X_new.columns) == [ + "sepal length (cm)_new", + "sepal width (cm)_new", + "petal length (cm)_new", + "petal width (cm)_new", + ] + + +# def test_pipeline_predict(pipeline_with_model_example): +# pipe, X = pipeline_with_model_example +# y_pred = pipe.predict(X) +# assert y_pred.shape == (150,) + + +# def test_pipeline_predict_proba(pipeline_with_model_example): +# pipe, X = pipeline_with_model_example +# y_pred = pipe.predict_proba(X) +# assert y_pred.shape == (150, 3) + + +def test_pipeline_numpy(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + X_numpy_new = pipe.transform_numpy(X.to_numpy()) + assert X_numpy_new.shape == (150, 4) + + +def test_init(): + with pytest.raises(TypeError): + _ = Pipeline(0) + with pytest.raises(TypeError): + _ = Pipeline([]) + with pytest.raises(TypeError): + _ = Pipeline(verbose=5) + + +def test_pipeline_transform_input_data(pipeline_example): + pipe, X = pipeline_example + _ = pipe.fit(X) + with pytest.raises(TypeError): + _ = pipe.transform(X.to_numpy()) + with pytest.raises(TypeError): + _ = pipe.transform(X, X) + with pytest.raises(TypeError): + _ = pipe.transform_numpy(X) + + +def test_verbose(): + X = pd.DataFrame(data["data"], columns=data["feature_names"]) + y = pd.Series(data["target"], name="TARGET") + + # model = RandomForestClassifier(n_estimators=6, max_depth=4, random_state=0) + steps = [ + ["MultiplyTransformer1", MultiplyTransformer(4.0)], + ["MultiplyTransformer2", MultiplyTransformer(0.5)], + ["NameTransformer", NameTransformer()], + # ["Estimator", SelectFromModel(model=model, k=3)], + ] + pipe = Pipeline(steps, verbose=True).fit(X, y) + _ = pipe.transform(X) + _ = Pipeline(steps, verbose=True).fit_transform(X, y) diff --git a/gators/sampling/__pycache__/__init__.cpython-38.pyc b/gators/sampling/__pycache__/__init__.cpython-38.pyc index 607b0f35..ac3f9e78 100644 Binary files a/gators/sampling/__pycache__/__init__.cpython-38.pyc and b/gators/sampling/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/sampling/__pycache__/supervised_sampling.cpython-38.pyc b/gators/sampling/__pycache__/supervised_sampling.cpython-38.pyc index df7051a9..da711904 100644 Binary files a/gators/sampling/__pycache__/supervised_sampling.cpython-38.pyc and b/gators/sampling/__pycache__/supervised_sampling.cpython-38.pyc differ diff --git a/gators/sampling/__pycache__/unsupervised_sampling.cpython-38.pyc b/gators/sampling/__pycache__/unsupervised_sampling.cpython-38.pyc index 2988aabb..9331d73f 100644 Binary files a/gators/sampling/__pycache__/unsupervised_sampling.cpython-38.pyc and b/gators/sampling/__pycache__/unsupervised_sampling.cpython-38.pyc differ diff --git a/gators/sampling/supervised_sampling.py b/gators/sampling/supervised_sampling.py index 0370e011..b69653ed 100644 --- a/gators/sampling/supervised_sampling.py +++ b/gators/sampling/supervised_sampling.py @@ -1,17 +1,13 @@ -from typing import Tuple, Union - -import databricks.koalas as ks -import pandas as pd +from typing import Dict, Tuple from ..transformers import TransformerXY from ..util import util +from gators import DataFrame, Series -class SupervisedSampling(TransformerXY): - """Sample each class depending on its occurrence. - For example, in a stronly imbalanced binary classification problem, - only the majority is undersampled. +class SupervisedSampling(TransformerXY): + """Sample each class depending on the user input. Parameters ---------- @@ -20,151 +16,105 @@ class SupervisedSampling(TransformerXY): Examples -------- - * pandas transform + Imports and initialization: - >>> import pandas as pd >>> from gators.sampling import SupervisedSampling + >>> obj = SupervisedSampling(frac_dict={0: 0.5, 1:0.5, 2:1, 3:1}) + + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0, 3, 6, 9, 12, 15], + ... 'B': [1, 4, 7, 10, 13, 16], + ... 'C': [2, 5, 8, 11, 14, 17]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([0, 0, 1, 1, 2, 3], name='TARGET'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': [0, 3, 6, 9, 12, 15], + ... 'B': [1, 4, 7, 10, 13, 16], + ... 'C': [2, 5, 8, 11, 14, 17]}) + >>> y = ps.Series([0, 0, 1, 1, 2, 3], name='TARGET') + + * and `pandas` dataframes: + + >>> import pandas as pd >>> X = pd.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) + ... 'A': [0, 3, 6, 9, 12, 15], + ... 'B': [1, 4, 7, 10, 13, 16], + ... 'C': [2, 5, 8, 11, 14, 17]}) >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = SupervisedSampling(n_samples=3) - >>> X, y = obj.transform(X, y) - >>> X - A B C - 1 3 4 5 - 3 9 10 11 - 4 12 13 14 - 5 15 16 17 - >>> y - 1 0 - 3 1 - 4 2 - 5 3 - Name: TARGET, dtype: int64 - * koalas transform + The result is a transformed dataframe and series belonging to the same dataframe library. - >>> import pandas as ks - >>> from gators.sampling import SupervisedSampling - >>> X = ks.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) - >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = SupervisedSampling(n_samples=3) >>> X, y = obj.transform(X, y) >>> X A B C - 1 3 4 5 - 3 9 10 11 - 4 12 13 14 - 5 15 16 17 + 0 3 4 5 + 1 9 10 11 + 2 12 13 14 + 3 15 16 17 >>> y - 1 0 - 3 1 - 4 2 - 5 3 + 0 0 + 1 1 + 2 2 + 3 3 Name: TARGET, dtype: int64 - """ - def __init__(self, n_samples: int): - if not isinstance(n_samples, int): - raise TypeError("`n_samples` should be an int.") - self.n_samples = n_samples - self.frac_vec = pd.Series([]) + def __init__(self, frac_dict: Dict[str, float], random_state: int = 0): + if (not isinstance(random_state, int)) or (random_state < 0): + raise TypeError("`random_state` should be a positive int.") + if not isinstance(frac_dict, dict): + raise TypeError("`frac_dict` should be a dict.") + for k, v in frac_dict.items(): + if not isinstance(k, int): + raise TypeError("the keys of `frac_dict` should be an int.") + if (not isinstance(v, (int, float))) or (v > 1 or v < 0): + raise TypeError( + "the values of `frac_dict` should be float beting 0 an 1." + ) + self.frac_dict = frac_dict + self.random_state = random_state - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: + def transform(self, X: DataFrame, y: Series) -> Tuple[DataFrame, Series]: """Fit and transform the dataframe `X` and the series `y`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series] + y : Series Input target. Returns ------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: - Transformed dataframe and the series. + X : DataFrame + Sampled dataframe. + y : Series + Sampled series. """ self.check_dataframe(X) - self.check_y(X, y) + self.check_target(X, y) y_name = y.name - self.frac_vec = self.compute_sampling_fractions(y, self.n_samples) - Xy = X.join(y) - Xy_sampled = self.sample_dataframe(Xy=Xy, frac_vec=self.frac_vec, y_name=y_name) + index_name = X.index.name + + def f(x, frac_dict, random_state): + return x.sample( + frac=float(frac_dict[x[y_name].iloc[0]]), random_state=random_state + ) + + Xy = util.get_function(X).join(X, y.to_frame()) + Xy_sampled = ( + Xy.groupby(y.name) + .apply(f, self.frac_dict, self.random_state) + .reset_index(drop=True) + ) + Xy_sampled.index.name = index_name return Xy_sampled.drop(y_name, axis=1), Xy_sampled[y_name] - - @staticmethod - def compute_sampling_fractions( - y: Union[pd.Series, ks.Series], n_samples: int - ) -> pd.Series: - """Compute the sampling fractions. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - n_samples : int - Number of samples to keep. - - Returns - ------- - pd.Series - Fraction to keep for each label. - """ - class_count = y.value_counts() - n_classes = len(class_count) - n_samples_per_class = int(n_samples / n_classes) - mask = class_count > n_samples_per_class - n_classes_ = mask.sum() - n_samples_ = n_samples - class_count[~mask].sum() - frac_vec = n_samples_ / (class_count * n_classes_) - if isinstance(frac_vec, ks.Series): - frac_vec = frac_vec.to_pandas() - frac_vec[frac_vec > 1] = 1.0 - frac_vec = frac_vec.mask(frac_vec < 1.0 / n_samples, 1.0 / n_samples) - return frac_vec - - @staticmethod - def sample_dataframe( - Xy: Union[pd.DataFrame, ks.DataFrame], frac_vec: pd.Series, y_name: str - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Sample dataframe. - - Parameters - ---------- - Xy : Union[pd.DataFrame, ks.DataFrame] - Dataframe. - frac_vec : pd.Series - Fraction to keep for each label. - y_name : str - Target name. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - if isinstance(Xy, pd.DataFrame): - Xy_sampled = pd.DataFrame(columns=Xy.columns) - else: - Xy_sampled = ks.DataFrame(columns=Xy.columns) - for c, frac in frac_vec.iteritems(): - if frac == 1: - Xy_sampled = util.concat([Xy_sampled, Xy[Xy[y_name] == int(c)]], axis=0) - else: - Xy_sampled = util.concat( - [ - Xy_sampled, - Xy[Xy[y_name] == int(c)].sample(frac=frac, random_state=0), - ], - axis=0, - ) - return Xy_sampled.astype(Xy.dtypes.to_dict()) diff --git a/gators/sampling/tests/test_supervised_sampling.py b/gators/sampling/tests/test_supervised_sampling.py deleted file mode 100644 index 9d68700b..00000000 --- a/gators/sampling/tests/test_supervised_sampling.py +++ /dev/null @@ -1,150 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal, assert_series_equal - -from gators.sampling import SupervisedSampling - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - n_rows = 30 - n_cols = 5 - n_samples = 5 - np.random.seed(1) - X = pd.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") - ) - y = pd.Series( - [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 3, - ], - name="TARGET", - ) - obj = SupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame( - { - "A": {2: 10, 8: 40, 12: 60, 18: 90, 27: 135, 22: 110, 29: 145}, - "B": {2: 11, 8: 41, 12: 61, 18: 91, 27: 136, 22: 111, 29: 146}, - "C": {2: 12, 8: 42, 12: 62, 18: 92, 27: 137, 22: 112, 29: 147}, - "D": {2: 13, 8: 43, 12: 63, 18: 93, 27: 138, 22: 113, 29: 148}, - "E": {2: 14, 8: 44, 12: 64, 18: 94, 27: 139, 22: 114, 29: 149}, - } - ) - y_expected = pd.Series( - {2: 0, 8: 0, 12: 1, 18: 1, 27: 2, 22: 2, 29: 3}, name="TARGET" - ) - return obj, X, y, X_expected, y_expected - - -@pytest.fixture -def data_ks(): - n_rows = 30 - n_cols = 5 - n_samples = 5 - X = ks.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") - ) - y = ks.Series( - [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 3, - ], - name="TARGET", - ) - np.random.seed(1) - obj = SupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame( - { - "A": {0: 0, 7: 35, 8: 40, 18: 90, 21: 105, 20: 100, 29: 145}, - "B": {0: 1, 7: 36, 8: 41, 18: 91, 21: 106, 20: 101, 29: 146}, - "C": {0: 2, 7: 37, 8: 42, 18: 92, 21: 107, 20: 102, 29: 147}, - "D": {0: 3, 7: 38, 8: 43, 18: 93, 21: 108, 20: 103, 29: 148}, - "E": {0: 4, 7: 39, 8: 44, 18: 94, 21: 109, 20: 104, 29: 149}, - } - ) - y_expected = pd.Series( - {0: 0, 7: 0, 8: 0, 18: 1, 21: 2, 20: 2, 29: 3}, name="TARGET" - ) - return obj, X, y, X_expected, y_expected - - -def test_pd(data): - obj, X, y, X_expected, y_expected = data - X_new, y_new = obj.transform(X, y) - assert_frame_equal(X_new.sort_index(), X_expected.sort_index()) - assert_series_equal(y_new.sort_index(), y_expected.sort_index()) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, y, X_expected, y_expected = data_ks - X_new, y_new = obj.transform(X, y) - assert_frame_equal(X_new.to_pandas().sort_index(), X_expected.sort_index()) - assert_series_equal(y_new.to_pandas().sort_index(), y_expected.sort_index()) - - -def test_init(): - with pytest.raises(TypeError): - _ = SupervisedSampling(n_samples="a") diff --git a/gators/sampling/tests/test_supervised_sampling_dd.py b/gators/sampling/tests/test_supervised_sampling_dd.py new file mode 100644 index 00000000..1285863d --- /dev/null +++ b/gators/sampling/tests/test_supervised_sampling_dd.py @@ -0,0 +1,40 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest + +from gators.sampling import SupervisedSampling + + +@pytest.fixture +def data(): + n_rows = 14 + n_cols = 5 + n_samples = 7 + np.random.seed(1) + X = dd.from_pandas( + pd.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ), + npartitions=1, + ) + y = dd.from_pandas( + pd.Series([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2], name="TARGET"), + npartitions=1, + ) + obj = SupervisedSampling(frac_dict={0: 0.2, 1: 0.5, 2: 1.0}) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +def test_dd(data): + obj, X, y, X_expected_shape, y_expected_shape = data + X_new, y_new = obj.transform(X, y) + X_new, y_new = X_new.compute(), y_new.compute() + assert X_new.shape == X_expected_shape + assert y_new.shape == y_expected_shape + assert (y_new == 0).sum() == 2 + assert (y_new == 1).sum() == 1 + assert (y_new == 2).sum() == 2 diff --git a/gators/sampling/tests/test_supervised_sampling_ks.py b/gators/sampling/tests/test_supervised_sampling_ks.py new file mode 100644 index 00000000..a84eb68e --- /dev/null +++ b/gators/sampling/tests/test_supervised_sampling_ks.py @@ -0,0 +1,53 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pytest + +from gators.sampling import SupervisedSampling + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + n_rows = 14 + n_cols = 5 + n_samples = 7 + X = ps.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ) + y = ps.Series( + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + ], + name="TARGET", + ) + np.random.seed(1) + obj = SupervisedSampling(frac_dict={0: 0.2, 1: 0.5, 2: 1.0}) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, y, X_expected_shape, y_expected_shape = data_ks + X_new, y_new = obj.transform(X, y) + assert X_new.shape == X_expected_shape + assert y_new.shape == y_expected_shape + assert (y_new == 0).sum() == 2 + assert (y_new == 1).sum() == 1 + assert (y_new == 2).sum() == 2 diff --git a/gators/sampling/tests/test_supervised_sampling_pd.py b/gators/sampling/tests/test_supervised_sampling_pd.py new file mode 100644 index 00000000..58f1ba24 --- /dev/null +++ b/gators/sampling/tests/test_supervised_sampling_pd.py @@ -0,0 +1,43 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest + +from gators.sampling import SupervisedSampling + + +@pytest.fixture +def data(): + n_rows = 14 + n_cols = 5 + n_samples = 7 + np.random.seed(1) + X = pd.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ) + y = pd.Series([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2], name="TARGET") + obj = SupervisedSampling(frac_dict={0: 0.2, 1: 0.5, 2: 1.0}) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +def test_pd(data): + obj, X, y, X_expected_shape, y_expected_shape = data + X_new, y_new = obj.transform(X, y) + assert X_new.shape == X_expected_shape + assert y_new.shape == y_expected_shape + assert (y_new == 0).sum() == 2 + assert (y_new == 1).sum() == 1 + assert (y_new == 2).sum() == 2 + + +def test_init(): + with pytest.raises(TypeError): + _ = SupervisedSampling(frac_dict="a") + with pytest.raises(TypeError): + _ = SupervisedSampling(frac_dict={"a": 0.1}) + with pytest.raises(TypeError): + _ = SupervisedSampling(frac_dict={1: "a"}) + with pytest.raises(TypeError): + _ = SupervisedSampling(frac_dict={1: 0.1}, random_state=-1) diff --git a/gators/sampling/tests/test_unsupervised_sampling.py b/gators/sampling/tests/test_unsupervised_sampling.py deleted file mode 100644 index ecb4fd62..00000000 --- a/gators/sampling/tests/test_unsupervised_sampling.py +++ /dev/null @@ -1,89 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal, assert_series_equal - -from gators.sampling import UnsupervisedSampling - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - n_rows = 30 - n_cols = 5 - n_classes = 4 - n_samples = 5 - X = pd.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") - ) - np.random.seed(1) - y = pd.Series(np.random.randint(0, n_classes, n_rows), name="TARGET") - obj = UnsupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame( - { - "A": {2: 10, 28: 140, 13: 65, 10: 50, 26: 130}, - "B": {2: 11, 28: 141, 13: 66, 10: 51, 26: 131}, - "C": {2: 12, 28: 142, 13: 67, 10: 52, 26: 132}, - "D": {2: 13, 28: 143, 13: 68, 10: 53, 26: 133}, - "E": {2: 14, 28: 144, 13: 69, 10: 54, 26: 134}, - } - ) - y_expected = pd.Series({2: 0, 28: 1, 13: 3, 10: 0, 26: 2}, name="TARGET") - return obj, X, y, X_expected, y_expected - - -@pytest.fixture -def data_ks(): - n_rows = 30 - n_cols = 5 - n_classes = 4 - n_samples = 5 - X = ks.DataFrame( - np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") - ) - np.random.seed(1) - y = ks.Series(np.random.randint(0, n_classes, n_rows), name="TARGET") - obj = UnsupervisedSampling(n_samples=n_samples) - X_expected = pd.DataFrame( - { - "A": {0: 0, 7: 35, 8: 40, 18: 90, 21: 105, 20: 100}, - "B": {0: 1, 7: 36, 8: 41, 18: 91, 21: 106, 20: 101}, - "C": {0: 2, 7: 37, 8: 42, 18: 92, 21: 107, 20: 102}, - "D": {0: 3, 7: 38, 8: 43, 18: 93, 21: 108, 20: 103}, - "E": {0: 4, 7: 39, 8: 44, 18: 94, 21: 109, 20: 104}, - } - ) - y_expected = pd.Series({0: 1, 7: 1, 8: 3, 18: 2, 21: 1, 20: 2}, name="TARGET") - return obj, X, y, X_expected, y_expected - - -def test_pd(data): - obj, X, y, X_expected, y_expected = data - X_new, y_new = obj.transform(X, y) - assert_frame_equal(X_new.sort_index(), X_expected.sort_index()) - assert_series_equal(y_new.sort_index(), y_expected.sort_index()) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X, y, X_expected, y_expected = data_ks - X_new, y_new = obj.transform(X, y) - assert X_new.to_pandas().shape[0] + 1 == X_expected.shape[0] - assert y_new.to_pandas().shape[0] == y_new.shape[0] - assert X_new.to_pandas().shape[1] == X_expected.shape[1] - - -def test_init(): - with pytest.raises(TypeError): - _ = UnsupervisedSampling(n_samples="a") - - -def test_no_sampling(): - X = pd.DataFrame({"A": [0, 1, 2]}) - y = pd.Series([0, 0, 1], name="TARGET") - obj = UnsupervisedSampling(n_samples=5) - assert_frame_equal(X, obj.transform(X, y)[0]) - assert_series_equal(y, obj.transform(X, y)[1]) diff --git a/gators/sampling/tests/test_unsupervised_sampling_dd.py b/gators/sampling/tests/test_unsupervised_sampling_dd.py new file mode 100644 index 00000000..ffb605f4 --- /dev/null +++ b/gators/sampling/tests/test_unsupervised_sampling_dd.py @@ -0,0 +1,49 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.sampling import UnsupervisedSampling + + +@pytest.fixture +def data(): + n_rows = 30 + n_cols = 5 + n_classes = 4 + n_samples = 5 + X = dd.from_pandas( + pd.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ), + npartitions=1, + ) + y = dd.from_pandas( + pd.Series(np.random.randint(0, n_classes, n_rows), name="TARGET"), npartitions=1 + ) + obj = UnsupervisedSampling(n_samples=n_samples) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +def test_pd(data): + obj, X, y, X_expected_shape, y_expected_shape = data + X_new, y_new = obj.transform(X, y) + assert X_new.compute().shape == X_expected_shape + assert y_new.compute().shape == y_expected_shape + + +def test_init(): + with pytest.raises(TypeError): + _ = UnsupervisedSampling(n_samples="a") + + +def test_no_sampling(): + X = dd.from_pandas(pd.DataFrame({"A": [0, 1, 2]}), npartitions=1) + y = dd.from_pandas(pd.Series([0, 0, 1], name="TARGET"), npartitions=1) + obj = UnsupervisedSampling(n_samples=5) + assert_frame_equal(X.compute(), obj.transform(X, y)[0].compute()) + assert_series_equal(y.compute(), obj.transform(X, y)[1].compute()) diff --git a/gators/sampling/tests/test_unsupervised_sampling_ks.py b/gators/sampling/tests/test_unsupervised_sampling_ks.py new file mode 100644 index 00000000..e7583c34 --- /dev/null +++ b/gators/sampling/tests/test_unsupervised_sampling_ks.py @@ -0,0 +1,50 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest + +from gators.sampling import UnsupervisedSampling + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data(): + n_rows = 30 + n_cols = 5 + n_classes = 4 + n_samples = 5 + X = pd.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ) + y = pd.Series(np.random.randint(0, n_classes, n_rows), name="TARGET") + obj = UnsupervisedSampling(n_samples=n_samples) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +@pytest.fixture +def data_ks(): + n_rows = 30 + n_cols = 5 + n_classes = 4 + n_samples = 5 + X = ps.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ) + np.random.seed(1) + y = ps.Series(np.random.randint(0, n_classes, n_rows), name="TARGET") + obj = UnsupervisedSampling(n_samples=n_samples) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X, y, X_expected_shape, y_expected_shape = data_ks + X_new, y_new = obj.transform(X, y) + assert X_new.shape == X_expected_shape + assert y_new.shape == y_expected_shape diff --git a/gators/sampling/tests/test_unsupervised_sampling_pd.py b/gators/sampling/tests/test_unsupervised_sampling_pd.py new file mode 100644 index 00000000..cd2f69fa --- /dev/null +++ b/gators/sampling/tests/test_unsupervised_sampling_pd.py @@ -0,0 +1,43 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal, assert_series_equal + +from gators.sampling import UnsupervisedSampling + + +@pytest.fixture +def data(): + n_rows = 30 + n_cols = 5 + n_classes = 4 + n_samples = 5 + X = pd.DataFrame( + np.arange(n_rows * n_cols).reshape(n_rows, n_cols), columns=list("ABCDE") + ) + y = pd.Series(np.random.randint(0, n_classes, n_rows), name="TARGET") + obj = UnsupervisedSampling(n_samples=n_samples) + X_expected_shape = (5, 5) + y_expected_shape = (5,) + return obj, X, y, X_expected_shape, y_expected_shape + + +def test_pd(data): + obj, X, y, X_expected_shape, y_expected_shape = data + X_new, y_new = obj.transform(X, y) + assert X_new.shape == X_expected_shape + assert y_new.shape == y_expected_shape + + +def test_init(): + with pytest.raises(TypeError): + _ = UnsupervisedSampling(n_samples="a") + + +def test_no_sampling(): + X = pd.DataFrame({"A": [0, 1, 2]}) + y = pd.Series([0, 0, 1], name="TARGET") + obj = UnsupervisedSampling(n_samples=5) + assert_frame_equal(X, obj.transform(X, y)[0]) + assert_series_equal(y, obj.transform(X, y)[1]) diff --git a/gators/sampling/unsupervised_sampling.py b/gators/sampling/unsupervised_sampling.py index be85448f..6e1cc95a 100644 --- a/gators/sampling/unsupervised_sampling.py +++ b/gators/sampling/unsupervised_sampling.py @@ -1,10 +1,9 @@ -from typing import Dict, Tuple, Union - -import databricks.koalas as ks -import numpy as np -import pandas as pd +from typing import Dict, Tuple from ..transformers import TransformerXY +from ..util import util + +from gators import DataFrame, Series class UnsupervisedSampling(TransformerXY): @@ -17,17 +16,41 @@ class UnsupervisedSampling(TransformerXY): Examples -------- + >>> from gators.sampling import UnsupervisedSampling + >>> obj = UnsupervisedSampling(n_samples=3) + + The `fit`, `transform`, and `fit_transform` methods accept: - * pandas transform + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... 'A': [0, 3, 6, 9, 12, 15], + ... 'B': [1, 4, 7, 10, 13, 16], + ... 'C': [2, 5, 8, 11, 14, 17]}), npartitions=1) + >>> y = dd.from_pandas(pd.Series([0, 0, 1, 1, 2, 3], name='TARGET'), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... 'A': [0, 3, 6, 9, 12, 15], + ... 'B': [1, 4, 7, 10, 13, 16], + ... 'C': [2, 5, 8, 11, 14, 17]}) + >>> y = ps.Series([0, 0, 1, 1, 2, 3], name='TARGET') + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.sampling import UnsupervisedSampling >>> X = pd.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) + ... 'A': [0, 3, 6, 9, 12, 15], + ... 'B': [1, 4, 7, 10, 13, 16], + ... 'C': [2, 5, 8, 11, 14, 17]}) >>> y = pd.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = UnsupervisedSampling(n_samples=3) + + The result is a transformed dataframe and series belonging to the same dataframe library. + >>> X, y = obj.transform(X, y) >>> X A B C @@ -39,29 +62,6 @@ class UnsupervisedSampling(TransformerXY): 2 1 1 0 Name: TARGET, dtype: int64 - - * koalas transform - - >>> import databricks.koalas as ks - >>> from gators.sampling import UnsupervisedSampling - >>> X = ks.DataFrame({ - ... 'A': {0: 0, 1: 3, 2: 6, 3: 9, 4: 12, 5: 15}, - ... 'B': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16}, - ... 'C': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14, 5: 17}}) - >>> y = ks.Series([0, 0, 1, 1, 2, 3], name='TARGET') - >>> obj = UnsupervisedSampling(n_samples=3) - >>> X, y = obj.transform(X, y) - >>> X - A B C - 0 0 1 2 - 3 9 10 11 - 2 6 7 8 - >>> y - 0 0 - 3 1 - 2 1 - Name: TARGET, dtype: int64 - """ def __init__(self, n_samples: int): @@ -69,29 +69,32 @@ def __init__(self, n_samples: int): raise TypeError("`n_samples` should be an int.") self.n_samples = n_samples - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series], - ) -> Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: + def transform(self, X: DataFrame, y: Series) -> Tuple[DataFrame, Series]: """Fit and transform the dataframe `X` and the series `y`. - Parameters: - X : Union[pd.DataFrame, ks.DataFrame] + Parameters + ---------- + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series] + y : Series Input target. Returns ------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]]: - Transformed dataframe and the series. + X : DataFrame + Sampled dataframe. + y : Series + Sampled series. """ self.check_dataframe(X) - self.check_y(X, y) - frac = self.n_samples / X.shape[0] + self.check_target(X, y) + frac = self.n_samples / util.get_function(X).shape(X)[0] if frac >= 1.0: return X, y y_name = y.name - Xy = X.join(y).sample(frac=round(frac, 3), random_state=0) + Xy = ( + util.get_function(X) + .join(X, y.to_frame()) + .sample(frac=round(frac, 3), random_state=0) + ) return Xy.drop(y_name, axis=1), Xy[y_name] diff --git a/gators/scalers/__init__.py b/gators/scalers/__init__.py index f1089345..ddd3fc13 100644 --- a/gators/scalers/__init__.py +++ b/gators/scalers/__init__.py @@ -1,7 +1,9 @@ from .minmax_scaler import MinMaxScaler from .standard_scaler import StandardScaler +from .yeo_johnson import YeoJohnson __all__ = [ "MinMaxScaler", "StandardScaler", + "YeoJohnson", ] diff --git a/gators/scalers/__pycache__/__init__.cpython-38.pyc b/gators/scalers/__pycache__/__init__.cpython-38.pyc index aaaf3b07..fb90cdef 100644 Binary files a/gators/scalers/__pycache__/__init__.cpython-38.pyc and b/gators/scalers/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/scalers/__pycache__/minmax_scaler.cpython-38.pyc b/gators/scalers/__pycache__/minmax_scaler.cpython-38.pyc index b0386ba6..08be3bf3 100644 Binary files a/gators/scalers/__pycache__/minmax_scaler.cpython-38.pyc and b/gators/scalers/__pycache__/minmax_scaler.cpython-38.pyc differ diff --git a/gators/scalers/__pycache__/standard_scaler.cpython-38.pyc b/gators/scalers/__pycache__/standard_scaler.cpython-38.pyc index 29c84a33..4056f01e 100644 Binary files a/gators/scalers/__pycache__/standard_scaler.cpython-38.pyc and b/gators/scalers/__pycache__/standard_scaler.cpython-38.pyc differ diff --git a/gators/scalers/_base_scaler.py b/gators/scalers/_base_scaler.py new file mode 100644 index 00000000..3e10ab83 --- /dev/null +++ b/gators/scalers/_base_scaler.py @@ -0,0 +1,63 @@ +# License: Apache-2.0 +import numpy as np + +from scaler import scaler + +from ..transformers.transformer import Transformer +from gators import DataFrame + + +class _BaseScaler(Transformer): + """Base scaler transformer class. + + Parameters + ---------- + inplace : bool. + If True, perform the encoding inplace. + """ + + def __init__(self, inplace: bool): + self.X_offset: DataFrame = None + self.X_scale: DataFrame = None + self.X_offset_np = np.array([]) + self.X_scale_np = np.array([]) + self.inplace = inplace + + def transform(self, X): + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + X[self.columns] = X[self.columns].astype(float) + for col, name in zip(self.columns, self.column_names): + X[name] = (X[col] - self.X_offset[col]) * self.X_scale[col] + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X :np.ndarray: + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + X_scale = scaler(X.astype(float), self.X_offset_np, self.X_scale_np) + if self.inplace: + X[:, self.idx_columns] = X_scale + return X + return np.concatenate((X, X_scale), axis=1) diff --git a/gators/scalers/minmax_scaler.py b/gators/scalers/minmax_scaler.py index 9436586f..adfd1653 100644 --- a/gators/scalers/minmax_scaler.py +++ b/gators/scalers/minmax_scaler.py @@ -1,140 +1,92 @@ # License: Apache-2.0 -from typing import Union +from ._base_scaler import _BaseScaler +from ..util import util -import databricks.koalas as ks -import numpy as np -import pandas as pd -from scaler import minmax_scaler +from gators import DataFrame, Series -from ..transformers.transformer import Transformer - -class MinMaxScaler(Transformer): +class MinMaxScaler(_BaseScaler): """Scale each column to the [0, 1] range. Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. + inplace : bool, default True. + If True, perform the scaling in-place. + If False, create new columns. Examples --------- - * fit & transform with `pandas` + Imports and initialization: - >>> import pandas as pd >>> from gators.scalers import MinMaxScaler - >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) >>> obj = MinMaxScaler() - >>> obj.fit_transform(X) - A B - 0 0.0 0.00 - 1 0.5 0.75 - 2 1.0 1.00 - * fit & transform with `koalas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) + + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.scalers import MinMaxScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() >>> obj.fit_transform(X) A B 0 0.0 0.00 1 0.5 0.75 2 1.0 1.00 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.scalers import MinMaxScaler >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[0. , 0. ], - [0.5 , 0.75], - [1. , 1. ]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.scalers import MinMaxScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = MinMaxScaler() >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[0. , 0. ], [0.5 , 0.75], [1. , 1. ]]) - """ - def __init__(self, dtype: type = np.float64): - self.dtype = dtype - self.X_min: Union[pd.DataFrame, ks.DataFrame] = None - self.X_max: Union[pd.DataFrame, ks.DataFrame] = None - self.X_min_np = np.array([]) - self.X_max_np = np.array([]) + def __init__(self, inplace: bool = True): + _BaseScaler.__init__(self, inplace=inplace) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "MinMaxScaler": - """Fit the transformer on the pandas/koalas dataframe X. + def fit(self, X: DataFrame, y: Series = None) -> "MinMaxScaler": + """Fit the transformer on the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Labels. + y : Series, default None. + Target values. Returns ------- - 'MinMaxScaler': Instance of itself. + self : 'MinMaxScaler' + Instance of itself. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.X_min = X.min().astype(self.dtype) - self.X_max = X.max().astype(self.dtype) - self.X_min_np = self.X_min.to_numpy().astype(self.dtype) - self.X_max_np = self.X_max.to_numpy().astype(self.dtype) + self.base_columns = list(X.columns) + self.columns = util.get_numerical_columns(X) + self.idx_columns = util.get_idx_columns(X, self.columns) + self.column_names = self.get_column_names( + self.inplace, self.columns, "minmax_scaler" + ) + X_min = util.get_function(X).to_pandas(X[self.columns].min()) + X_max = util.get_function(X).to_pandas(X[self.columns].max()) + self.X_offset = X_min.astype(float) + self.X_scale = (1.0 / (X_max - X_min)).astype(float) + self.X_offset_np = util.get_function(self.X_offset).to_numpy(self.X_offset) + self.X_scale_np = util.get_function(self.X_scale).to_numpy(self.X_scale) + self.X_offset = self.X_offset.to_dict() + self.X_scale = self.X_scale.to_dict() return self - - def transform(self, X): - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - - def f(x: ks.Series[self.dtype]): - c = x.name - return (x - self.X_min.loc[c]) / (self.X_max[c] - self.X_min[c]) - - return X.astype(self.dtype).apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the array X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - return minmax_scaler(X.astype(self.dtype), self.X_min_np, self.X_max_np) diff --git a/gators/scalers/scaler.c b/gators/scalers/scaler.c new file mode 100644 index 00000000..826806ef --- /dev/null +++ b/gators/scalers/scaler.c @@ -0,0 +1,34399 @@ +/* Generated by Cython 3.0.8 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/arrayscalars.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarrayobject.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ndarraytypes.h", + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include/numpy/ufuncobject.h" + ], + "extra_compile_args": [ + "-O3" + ], + "include_dirs": [ + "/Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/include" + ], + "name": "scaler", + "sources": [ + "gators/scalers/scaler.pyx" + ] + }, + "module_name": "scaler" +} +END: Cython Metadata */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#if defined(CYTHON_LIMITED_API) && 0 + #ifndef Py_LIMITED_API + #if CYTHON_LIMITED_API+0 > 0x03030000 + #define Py_LIMITED_API CYTHON_LIMITED_API + #else + #define Py_LIMITED_API 0x03030000 + #endif + #endif +#endif + +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.7+ or Python 3.3+. +#else +#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API +#define __PYX_EXTRA_ABI_MODULE_NAME "limited" +#else +#define __PYX_EXTRA_ABI_MODULE_NAME "" +#endif +#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI +#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." +#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX +#if defined(GRAALVM_PYTHON) + /* For very preliminary testing purposes. Most variables are set the same as PyPy. + The existence of this section does not imply that anything works or is even tested */ + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PYPY_VERSION) + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) + #endif + #if PY_VERSION_HEX < 0x03090000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(CYTHON_LIMITED_API) + #ifdef Py_LIMITED_API + #undef __PYX_LIMITED_VERSION_HEX + #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API + #endif + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 1 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_CLINE_IN_TRACEBACK + #define CYTHON_CLINE_IN_TRACEBACK 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 1 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #endif + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL 0 + #undef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 1 + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_LIMITED_API 0 + #define CYTHON_COMPILING_IN_GRAAL 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #ifndef CYTHON_USE_TYPE_SPECS + #define CYTHON_USE_TYPE_SPECS 0 + #endif + #ifndef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #ifndef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_GIL + #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) + #endif + #ifndef CYTHON_METH_FASTCALL + #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP487_INIT_SUBCLASS + #define CYTHON_PEP487_INIT_SUBCLASS 1 + #endif + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_MODULE_STATE + #define CYTHON_USE_MODULE_STATE 0 + #endif + #if PY_VERSION_HEX < 0x030400a1 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #elif !defined(CYTHON_USE_TP_FINALIZE) + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #if PY_VERSION_HEX < 0x030600B1 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #elif !defined(CYTHON_USE_DICT_VERSIONS) + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) + #endif + #if PY_VERSION_HEX < 0x030700A3 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK 1 + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if !defined(CYTHON_VECTORCALL) +#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) +#endif +#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(maybe_unused) + #define CYTHON_UNUSED [[maybe_unused]] + #endif + #endif + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR + #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_USE_CPP_STD_MOVE + #if defined(__cplusplus) && (\ + __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) + #define CYTHON_USE_CPP_STD_MOVE 1 + #else + #define CYTHON_USE_CPP_STD_MOVE 0 + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + #endif + #endif + #if _MSC_VER < 1300 + #ifdef _WIN64 + typedef unsigned long long __pyx_uintptr_t; + #else + typedef unsigned int __pyx_uintptr_t; + #endif + #else + #ifdef _WIN64 + typedef unsigned __int64 __pyx_uintptr_t; + #else + typedef unsigned __int32 __pyx_uintptr_t; + #endif + #endif +#else + #include + typedef uintptr_t __pyx_uintptr_t; +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) + /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 + * but leads to warnings with -pedantic, since it is a C++17 feature */ + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif +#ifdef __cplusplus + template + struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; + #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) +#else + #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) +#endif +#if CYTHON_COMPILING_IN_PYPY == 1 + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) +#else + #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) +#endif +#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_DefaultClassType PyClass_Type + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if CYTHON_COMPILING_IN_LIMITED_API + static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *exception_table = NULL; + PyObject *types_module=NULL, *code_type=NULL, *result=NULL; + #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 + PyObject *version_info; + PyObject *py_minor_version = NULL; + #endif + long minor_version = 0; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 + minor_version = 11; + #else + if (!(version_info = PySys_GetObject("version_info"))) goto end; + if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; + minor_version = PyLong_AsLong(py_minor_version); + Py_DECREF(py_minor_version); + if (minor_version == -1 && PyErr_Occurred()) goto end; + #endif + if (!(types_module = PyImport_ImportModule("types"))) goto end; + if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; + if (minor_version <= 7) { + (void)p; + result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else if (minor_version <= 10) { + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, fline, lnos, fv, cell); + } else { + if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; + result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, + c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); + } + end: + Py_XDECREF(code_type); + Py_XDECREF(exception_table); + Py_XDECREF(types_module); + if (type) { + PyErr_Restore(type, value, traceback); + } + return result; + } + #ifndef CO_OPTIMIZED + #define CO_OPTIMIZED 0x0001 + #endif + #ifndef CO_NEWLOCALS + #define CO_NEWLOCALS 0x0002 + #endif + #ifndef CO_VARARGS + #define CO_VARARGS 0x0004 + #endif + #ifndef CO_VARKEYWORDS + #define CO_VARKEYWORDS 0x0008 + #endif + #ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x0200 + #endif + #ifndef CO_GENERATOR + #define CO_GENERATOR 0x0020 + #endif + #ifndef CO_COROUTINE + #define CO_COROUTINE 0x0080 + #endif +#elif PY_VERSION_HEX >= 0x030B0000 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyCodeObject *result; + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); + if (!empty_bytes) return NULL; + result = + #if PY_VERSION_HEX >= 0x030C0000 + PyUnstable_Code_NewWithPosOnlyArgs + #else + PyCode_NewWithPosOnlyArgs + #endif + (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); + Py_DECREF(empty_bytes); + return result; + } +#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif +#endif +#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) + #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) +#else + #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) + #define __Pyx_Py_Is(x, y) Py_Is(x, y) +#else + #define __Pyx_Py_Is(x, y) ((x) == (y)) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) + #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) +#else + #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) + #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) +#else + #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) +#endif +#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) + #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) +#else + #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) +#endif +#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) +#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) +#else + #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) +#endif +#ifndef CO_COROUTINE + #define CO_COROUTINE 0x80 +#endif +#ifndef CO_ASYNC_GENERATOR + #define CO_ASYNC_GENERATOR 0x200 +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef Py_TPFLAGS_SEQUENCE + #define Py_TPFLAGS_SEQUENCE 0 +#endif +#ifndef Py_TPFLAGS_MAPPING + #define Py_TPFLAGS_MAPPING 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_METH_FASTCALL + #define __Pyx_METH_FASTCALL METH_FASTCALL + #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast + #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords +#else + #define __Pyx_METH_FASTCALL METH_VARARGS + #define __Pyx_PyCFunction_FastCall PyCFunction + #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords +#endif +#if CYTHON_VECTORCALL + #define __pyx_vectorcallfunc vectorcallfunc + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET + #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) +#elif CYTHON_BACKPORT_VECTORCALL + typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) +#else + #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 + #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) +#endif +#if PY_MAJOR_VERSION >= 0x030900B1 +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) +#else +#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) +#endif +#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) +#elif !CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) +#endif +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) +static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { + return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; +} +#endif +static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { +#if CYTHON_COMPILING_IN_LIMITED_API + return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; +#else + return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +#endif +} +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) +#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) + typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +#else + #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) + #define __Pyx_PyCMethod PyCMethod +#endif +#ifndef METH_METHOD + #define METH_METHOD 0x200 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyThreadState_Current PyThreadState_Get() +#elif !CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) +{ + void *result; + result = PyModule_GetState(op); + if (!result) + Py_FatalError("Couldn't find the module state"); + return result; +} +#endif +#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) +#else + #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if PY_MAJOR_VERSION < 3 + #if CYTHON_COMPILING_IN_PYPY + #if PYPY_VERSION_NUM < 0x07030600 + #if defined(__cplusplus) && __cplusplus >= 201402L + [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] + #elif defined(__GNUC__) || defined(__clang__) + __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) + #elif defined(_MSC_VER) + __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) + #endif + static CYTHON_INLINE int PyGILState_Check(void) { + return 0; + } + #else // PYPY_VERSION_NUM < 0x07030600 + #endif // PYPY_VERSION_NUM < 0x07030600 + #else + static CYTHON_INLINE int PyGILState_Check(void) { + PyThreadState * tstate = _PyThreadState_Current; + return tstate && (tstate == PyGILState_GetThisThreadState()); + } + #endif +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { + PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); + if (res == NULL) PyErr_Clear(); + return res; +} +#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) +#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#else +static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { +#if CYTHON_COMPILING_IN_PYPY + return PyDict_GetItem(dict, name); +#else + PyDictEntry *ep; + PyDictObject *mp = (PyDictObject*) dict; + long hash = ((PyStringObject *) name)->ob_shash; + assert(hash != -1); + ep = (mp->ma_lookup)(mp, name, hash); + if (ep == NULL) { + return NULL; + } + return ep->me_value; +#endif +} +#define __Pyx_PyDict_GetItemStr PyDict_GetItem +#endif +#if CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) + #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) + #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) +#else + #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) + #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) + #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) +#else + #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) +#endif +#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 +#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ + PyTypeObject *type = Py_TYPE((PyObject*)obj);\ + assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ + PyObject_GC_Del(obj);\ + Py_DECREF(type);\ +} +#else +#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) +#endif +#if CYTHON_COMPILING_IN_LIMITED_API + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) + #define __Pyx_PyUnicode_DATA(u) ((void*)u) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) +#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) + #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #if !defined(PyUnicode_DecodeUnicodeEscape) + #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) + #endif + #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) + #undef PyUnicode_Contains + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) + #endif + #if !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) + #endif + #if !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) + #endif +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_PySequence_ListKeepNew(obj)\ + (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) +#else + #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) +#else + #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) + #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) + #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) + #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) + #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) + #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) + #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) + #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) +#endif +#if PY_VERSION_HEX >= 0x030d00A1 + #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) +#else + static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { + PyObject *module = PyImport_AddModule(name); + Py_XINCREF(module); + return module; + } +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define __Pyx_Py3Int_Check(op) PyLong_Check(op) + #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#else + #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) + #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifdef CYTHON_EXTERN_C + #undef __PYX_EXTERN_C + #define __PYX_EXTERN_C CYTHON_EXTERN_C +#elif defined(__PYX_EXTERN_C) + #ifdef _MSC_VER + #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") + #else + #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. + #endif +#else + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__scaler +#define __PYX_HAVE_API__scaler +/* Early includes */ +#include +#include + + /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */ + +#include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" +#include "numpy/ufuncobject.h" +#include "math.h" +#include "pythread.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) +{ + const wchar_t *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#endif +#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_VERSION_HEX >= 0x030C00A7 + #ifndef _PyLong_SIGN_MASK + #define _PyLong_SIGN_MASK 3 + #endif + #ifndef _PyLong_NON_SIZE_BITS + #define _PyLong_NON_SIZE_BITS 3 + #endif + #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) + #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) + #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) + #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) + #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_SignedDigitCount(x)\ + ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) + #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) + #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) + #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) + #else + #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) + #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) + #endif + typedef Py_ssize_t __Pyx_compact_pylong; + typedef size_t __Pyx_compact_upylong; + #else + #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) + #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) + #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) + #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) + #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) + #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) + #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) + #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) + #define __Pyx_PyLong_CompactValue(x)\ + ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) + typedef sdigit __Pyx_compact_pylong; + typedef digit __Pyx_compact_upylong; + #endif + #if PY_VERSION_HEX >= 0x030C00A5 + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) + #else + #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) + #endif +#endif +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +#include +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = (char) c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#include +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +#if !CYTHON_USE_MODULE_STATE +static PyObject *__pyx_m = NULL; +#endif +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm = __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +/* #### Code section: filename_table ### */ + +static const char *__pyx_f[] = { + "gators/scalers/scaler.pyx", + "", + "__init__.cython-30.pxd", + "type.pxd", +}; +/* #### Code section: utility_code_proto_before_types ### */ +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS +#define __pyx_atomic_int_type int +#define __pyx_nonatomic_int_type int +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__)) + #include +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ + (defined(_MSC_VER) && _MSC_VER >= 1700))) + #include +#endif +#if CYTHON_ATOMICS && (defined(__STDC_VERSION__) &&\ + (__STDC_VERSION__ >= 201112L) &&\ + !defined(__STDC_NO_ATOMICS__) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type atomic_int + #define __pyx_atomic_incr_aligned(value) atomic_fetch_add_explicit(value, 1, memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) atomic_fetch_sub_explicit(value, 1, memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C atomics" + #endif +#elif CYTHON_ATOMICS && (defined(__cplusplus) && (\ + (__cplusplus >= 201103L) ||\ +\ + (defined(_MSC_VER) && _MSC_VER >= 1700)) &&\ + ATOMIC_INT_LOCK_FREE == 2) + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type std::atomic_int + #define __pyx_atomic_incr_aligned(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_relaxed) + #define __pyx_atomic_decr_aligned(value) std::atomic_fetch_sub_explicit(value, 1, std::memory_order_acq_rel) + #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER) + #pragma message ("Using standard C++ atomics") + #elif defined(__PYX_DEBUG_ATOMICS) + #warning "Using standard C++ atomics" + #endif +#elif CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 &&\ + (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2)))) + #define __pyx_atomic_incr_aligned(value) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type long + #undef __pyx_nonatomic_int_type + #define __pyx_nonatomic_int_type long + #pragma intrinsic (_InterlockedExchangeAdd) + #define __pyx_atomic_incr_aligned(value) _InterlockedExchangeAdd(value, 1) + #define __pyx_atomic_decr_aligned(value) _InterlockedExchangeAdd(value, -1) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview)) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview)) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* #### Code section: numeric_typedefs ### */ + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":757 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":758 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":760 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":761 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":763 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":764 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":765 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* #### Code section: complex_type_declarations ### */ +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* #### Code section: type_declarations ### */ + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":767 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":768 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":769 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":771 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_defaults; +typedef struct __pyx_defaults __pyx_defaults; +struct __pyx_defaults1; +typedef struct __pyx_defaults1 __pyx_defaults1; +struct __pyx_defaults { + PyObject *__pyx_arg__fused_sigindex; +}; +struct __pyx_defaults1 { + PyObject *__pyx_arg__fused_sigindex; +}; + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":302 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int_type acquisition_count; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":114 + * @cython.collection_type("sequence") + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":337 + * + * @cname('__pyx_memoryview') + * cdef class memoryview: # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); + PyObject *(*_get_base)(struct __pyx_memoryview_obj *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":952 + * @cython.collection_type("sequence") + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; +/* #### Code section: utility_code_proto ### */ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, Py_ssize_t); + void (*DECREF)(void*, PyObject*, Py_ssize_t); + void (*GOTREF)(void*, PyObject*, Py_ssize_t); + void (*GIVEREF)(void*, PyObject*, Py_ssize_t); + void* (*SetupContext)(const char*, Py_ssize_t, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ + } + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) + #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() +#endif + #define __Pyx_RefNannyFinishContextNogil() {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __Pyx_RefNannyFinishContext();\ + PyGILState_Release(__pyx_gilstate_save);\ + } + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) + #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContextNogil() + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_Py_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; Py_XDECREF(tmp);\ + } while (0) +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#if PY_VERSION_HEX >= 0x030C00A6 +#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) +#else +#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) +#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) +#endif +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) +#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* TupleAndListFromArray.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); +static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* fastcall.proto */ +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) +#elif CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) +#else + #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) +#endif +#if CYTHON_AVOID_BORROWED_REFS + #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) + #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) +#else + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) +#define __Pyx_KwValues_VARARGS(args, nargs) NULL +#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) +#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) +#if CYTHON_METH_FASTCALL + #define __Pyx_Arg_FASTCALL(args, i) args[i] + #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) + #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) + static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); + #else + #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) + #endif + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) +#else + #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS + #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS + #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS + #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS + #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS + #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) + #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) +#else +#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) +#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#if !CYTHON_VECTORCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if !CYTHON_VECTORCALL +#if PY_VERSION_HEX >= 0x03080000 + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets() + #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) +#else + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectFastCall.proto */ +#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); + +/* RaiseUnexpectedTypeError.proto */ +static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); + +/* GCCDiagnostics.proto */ +#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* BuildPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char); + +/* CIntToPyUnicode.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char); + +/* JoinPyUnicode.proto */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* PyObjectFormatSimple.proto */ +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#elif PY_MAJOR_VERSION < 3 + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") :\ + PyObject_Format(s, f)) +#elif CYTHON_USE_TYPE_SLOTS + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_repr(s) :\ + likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_repr(s) :\ + PyObject_Format(s, f)) +#else + #define __Pyx_PyObject_FormatSimple(s, f) (\ + likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\ + PyObject_Format(s, f)) +#endif + +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); + +/* DivInt[Py_ssize_t].proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define __Pyx_UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) do {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} while(0) +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* AssertionsEnabled.proto */ +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (1) +#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) + static int __pyx_assertions_enabled_flag; + #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) + static int __Pyx_init_assertions_enabled(void) { + PyObject *builtins, *debug, *debug_str; + int flag; + builtins = PyEval_GetBuiltins(); + if (!builtins) goto bad; + debug_str = PyUnicode_FromStringAndSize("__debug__", 9); + if (!debug_str) goto bad; + debug = PyObject_GetItem(builtins, debug_str); + Py_DECREF(debug_str); + if (!debug) goto bad; + flag = PyObject_IsTrue(debug); + Py_DECREF(debug); + if (flag == -1) goto bad; + __pyx_assertions_enabled_flag = flag; + return 0; + bad: + __pyx_assertions_enabled_flag = 1; + return -1; + } +#else + #define __Pyx_init_assertions_enabled() (0) + #define __pyx_assertions_enabled() (!Py_OptimizeFlag) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportDottedModule.proto */ +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* PySequenceMultiply.proto */ +#define __Pyx_PySequence_Multiply_Left(mul, seq) __Pyx_PySequence_Multiply(seq, mul) +static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul); + +/* SetItemInt.proto */ +#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, + int is_list, int wraparound, int boundscheck); + +/* RaiseUnboundLocalError.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* DivInt[long].proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 +#define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) +#else +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); +#endif + +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_itemsize(o) PyMemoryView_GET_BUFFER(o)->itemsize +#else + // can't get format like this unfortunately. It's unicode via getattr +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj); +#endif + +/* memoryview_get_from_buffer.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#define __Pyx_PyMemoryView_Get_ndim(o) PyMemoryView_GET_BUFFER(o)->ndim +#else + // can't get format like this unfortunately. It's unicode via getattr +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj); +#endif + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* PyObjectCallNoArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* py_dict_values.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d); + +/* UnpackUnboundCMethod.proto */ +typedef struct { + PyObject *type; + PyObject **method_name; + PyCFunction func; + PyObject *method; + int flag; +} __Pyx_CachedCFunction; + +/* CallUnboundCMethod0.proto */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_CallUnboundCMethod0(cfunc, self)\ + (likely((cfunc)->func) ?\ + (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) :\ + (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\ + (PY_VERSION_HEX >= 0x030700A0 ?\ + (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\ + (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\ + (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\ + (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\ + ((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, __pyx_empty_tuple) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\ + __Pyx__CallUnboundCMethod0(cfunc, self)) +#else +#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self) +#endif + +/* dict_getitem_default.proto */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value); + +/* CallUnboundCMethod1.proto */ +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg); +#else +#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg) +#endif + +/* CallUnboundCMethod2.proto */ +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2); +#else +#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2) __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 + L->ob_item[len] = x; + #else + PyList_SET_ITEM(list, len, x); + #endif + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* BufferGetAndValidate.proto */ +#define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ + ((obj == Py_None || obj == NULL) ?\ + (__Pyx_ZeroBuffer(buf), 0) :\ + __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) +static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static void __Pyx_ZeroBuffer(Py_buffer* buf); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* SoftComplexToDouble.proto */ +static double __Pyx_SoftComplexToDouble(__pyx_t_double_complex value, int have_gil); + +/* ErrOccurredWithGIL.proto */ +static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* IncludeStructmemberH.proto */ +#include + +/* FixUpExtensionType.proto */ +#if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); +#endif + +/* ValidateBasesTuple.proto */ +#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); +#endif + +/* PyType_Ready.proto */ +CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); + +/* GetVTable.proto */ +static void* __Pyx_GetVtable(PyTypeObject *type); + +/* MergeVTables.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type); +#endif + +/* SetupReduce.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce(PyObject* type_obj); +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_8 +#define __PYX_HAVE_RT_ImportType_proto_3_0_8 +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include +#endif +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) alignof(s) +#else +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_8(s) sizeof(void*) +#endif +enum __Pyx_ImportType_CheckSize_3_0_8 { + __Pyx_ImportType_CheckSize_Error_3_0_8 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_8 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_8 = 2 +}; +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size); +#endif + +/* FetchSharedCythonModule.proto */ +static PyObject *__Pyx_FetchSharedCythonABIModule(void); + +/* FetchCommonType.proto */ +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); +#else +static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); +#endif + +/* PyMethodNew.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + typesModule = PyImport_ImportModule("types"); + if (!typesModule) return NULL; + methodType = PyObject_GetAttrString(typesModule, "MethodType"); + Py_DECREF(typesModule); + if (!methodType) return NULL; + result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); + Py_DECREF(methodType); + return result; +} +#elif PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { + CYTHON_UNUSED_VAR(typ); + if (!self) + return __Pyx_NewRef(func); + return PyMethod_New(func, self); +} +#else + #define __Pyx_PyMethod_New PyMethod_New +#endif + +/* PyVectorcallFastCallDict.proto */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); +#endif + +/* CythonFunctionShared.proto */ +#define __Pyx_CyFunction_USED +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CYFUNCTION_COROUTINE 0x08 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + #define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#else + #define __Pyx_CyFunction_GetClassObj(f)\ + ((PyObject*) ((PyCMethodObject *) (f))->mm_class) +#endif +#define __Pyx_CyFunction_SetClassObj(f, classobj)\ + __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject_HEAD + PyObject *func; +#elif PY_VERSION_HEX < 0x030900B1 + PyCFunctionObject func; +#else + PyCMethodObject func; +#endif +#if CYTHON_BACKPORT_VECTORCALL + __pyx_vectorcallfunc func_vectorcall; +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + PyObject *func_classobj; +#endif + void *defaults; + int defaults_pyobjects; + size_t defaults_size; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; + PyObject *func_is_coroutine; +} __pyx_CyFunctionObject; +#undef __Pyx_CyOrPyCFunction_Check +#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) +#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) +#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); +#undef __Pyx_IsSameCFunction +#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(PyObject *module); +#if CYTHON_METH_FASTCALL +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +#if CYTHON_BACKPORT_VECTORCALL +#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) +#else +#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) +#endif +#endif + +/* CythonFunction.proto */ +static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *closure, + PyObject *module, PyObject *globals, + PyObject* code); + +/* FusedFunction.proto */ +typedef struct { + __pyx_CyFunctionObject func; + PyObject *__signatures__; + PyObject *self; +} __pyx_FusedFunctionObject; +static PyObject *__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code); +static int __pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self); +static int __pyx_FusedFunction_init(PyObject *module); +#define __Pyx_FusedFunction_USED + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +#if !CYTHON_COMPILING_IN_LIMITED_API +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); +#endif + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *, int writable_flag); + +/* PyUCS4InUnicode.proto */ +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int_type *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (&memview->acquisition_count) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XCLEAR_MEMVIEW(slice, have_gil) __Pyx_XCLEAR_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* ImportNumPyArray.proto */ +static PyObject *__pyx_numpy_ndarray = NULL; +static PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* FormatTypeName.proto */ +#if CYTHON_COMPILING_IN_LIMITED_API +typedef PyObject *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%U" +static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); +#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) +#else +typedef const char *__Pyx_TypeName; +#define __Pyx_FMT_TYPENAME "%.200s" +#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) +#define __Pyx_DECREF_TypeName(obj) +#endif + +/* CheckBinaryVersion.proto */ +static unsigned long __Pyx_get_runtime_version(void); +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +/* #### Code section: module_declarations ### */ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self); /* proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self); /* proto*/ + +/* Module declarations from "cython" */ + +/* Module declarations from "libc.string" */ + +/* Module declarations from "libc.stdio" */ + +/* Module declarations from "__builtin__" */ + +/* Module declarations from "cpython.type" */ + +/* Module declarations from "cpython" */ + +/* Module declarations from "cpython.object" */ + +/* Module declarations from "cpython.ref" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "numpy" */ + +/* Module declarations from "scaler" */ +static PyObject *__pyx_collections_abc_Sequence = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static PyArrayObject *__pyx_fuse_0__pyx_f_6scaler_scaler(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_6scaler_scaler(PyArrayObject *, PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_6scaler_yeo_johnson(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_6scaler_yeo_johnson(PyArrayObject *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/ +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static int assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, PyObject *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, PyObject *); /*proto*/ +static int __pyx_memoryview_err_no_memory(void); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +/* #### Code section: typeinfo ### */ +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t = { "float32_t", NULL, sizeof(__pyx_t_5numpy_float32_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; +/* #### Code section: before_global_var ### */ +#define __Pyx_MODULE_NAME "scaler" +extern int __pyx_module_is_main_scaler; +int __pyx_module_is_main_scaler = 0; + +/* Implementation of "scaler" */ +/* #### Code section: global_var ### */ +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin___import__; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_AssertionError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_ImportError; +/* #### Code section: string_decls ### */ +static const char __pyx_k_[] = ": "; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_X[] = "X"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_s[] = "s"; +static const char __pyx_k__2[] = "."; +static const char __pyx_k__3[] = "*"; +static const char __pyx_k__6[] = "'"; +static const char __pyx_k__7[] = ")"; +static const char __pyx_k_gc[] = "gc"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k__11[] = "()"; +static const char __pyx_k__12[] = "|"; +static const char __pyx_k__34[] = "?"; +static const char __pyx_k_abc[] = "abc"; +static const char __pyx_k_and[] = " and "; +static const char __pyx_k_get[] = "get"; +static const char __pyx_k_got[] = " (got "; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_kind[] = "kind"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_spec[] = "__spec__"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_count[] = "count"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_index[] = "index"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_split[] = "split"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_strip[] = "strip"; +static const char __pyx_k_enable[] = "enable"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_kwargs[] = "kwargs"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_scaler[] = "scaler"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_values[] = "values"; +static const char __pyx_k_X_scale[] = "X_scale"; +static const char __pyx_k_disable[] = "disable"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_lambdas[] = "lambdas"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_Sequence[] = "Sequence"; +static const char __pyx_k_X_offset[] = "X_offset"; +static const char __pyx_k_defaults[] = "defaults"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_register[] = "register"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_float32_t[] = "float32_t"; +static const char __pyx_k_float64_t[] = "float64_t"; +static const char __pyx_k_isenabled[] = "isenabled"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_signatures[] = "signatures"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_collections[] = "collections"; +static const char __pyx_k_yeo_johnson[] = "yeo_johnson"; +static const char __pyx_k_initializing[] = "_initializing"; +static const char __pyx_k_is_coroutine[] = "_is_coroutine"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = ""; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_class_getitem[] = "__class_getitem__"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_AssertionError[] = "AssertionError"; +static const char __pyx_k_fused_sigindex[] = "_fused_sigindex"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_collections_abc[] = "collections.abc"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_fuse_0scaler[] = "__pyx_fuse_0scaler"; +static const char __pyx_k_pyx_fuse_1scaler[] = "__pyx_fuse_1scaler"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_Invalid_shape_in_axis[] = "Invalid shape in axis "; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_pyx_fuse_0yeo_johnson[] = "__pyx_fuse_0yeo_johnson"; +static const char __pyx_k_pyx_fuse_1yeo_johnson[] = "__pyx_fuse_1yeo_johnson"; +static const char __pyx_k_Cannot_index_with_type[] = "Cannot index with type '"; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_Dimension_d_is_not_direct[] = "Dimension %d is not direct"; +static const char __pyx_k_gators_scalers_scaler_pyx[] = "gators/scalers/scaler.pyx"; +static const char __pyx_k_Index_out_of_bounds_axis_d[] = "Index out of bounds (axis %d)"; +static const char __pyx_k_No_matching_signature_found[] = "No matching signature found"; +static const char __pyx_k_Step_may_not_be_zero_axis_d[] = "Step may not be zero (axis %d)"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_All_dimensions_preceding_dimensi[] = "All dimensions preceding dimension %d must be indexed and not sliced"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Cannot_transpose_memoryview_with[] = "Cannot transpose memoryview with indirect dimensions"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Expected_at_least_d_argument_s_g[] = "Expected at least %d argument%s, got %d"; +static const char __pyx_k_Function_call_with_ambiguous_arg[] = "Function call with ambiguous argument types"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got "; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis "; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension "; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +/* #### Code section: decls ### */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_6scaler_scaler(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_6scaler_4__pyx_fuse_0scaler(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_X_offset, PyArrayObject *__pyx_v_X_scale); /* proto */ +static PyObject *__pyx_pf_6scaler_6__pyx_fuse_1scaler(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_X_offset, PyArrayObject *__pyx_v_X_scale); /* proto */ +static PyObject *__pyx_pf_6scaler_2yeo_johnson(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex); /* proto */ +static PyObject *__pyx_pf_6scaler_10__pyx_fuse_0yeo_johnson(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_lambdas); /* proto */ +static PyObject *__pyx_pf_6scaler_12__pyx_fuse_1yeo_johnson(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_lambdas); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, 0, 0, 0, 0}; +static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_values = {0, 0, 0, 0, 0}; +/* #### Code section: late_includes ### */ +/* #### Code section: module_state ### */ +typedef struct { + PyObject *__pyx_d; + PyObject *__pyx_b; + PyObject *__pyx_cython_runtime; + PyObject *__pyx_empty_tuple; + PyObject *__pyx_empty_bytes; + PyObject *__pyx_empty_unicode; + #ifdef __Pyx_CyFunction_USED + PyTypeObject *__pyx_CyFunctionType; + #endif + #ifdef __Pyx_FusedFunction_USED + PyTypeObject *__pyx_FusedFunctionType; + #endif + #ifdef __Pyx_Generator_USED + PyTypeObject *__pyx_GeneratorType; + #endif + #ifdef __Pyx_IterableCoroutine_USED + PyTypeObject *__pyx_IterableCoroutineType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineAwaitType; + #endif + #ifdef __Pyx_Coroutine_USED + PyTypeObject *__pyx_CoroutineType; + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_7cpython_4type_type; + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + #if CYTHON_USE_MODULE_STATE + #endif + PyTypeObject *__pyx_ptype_5numpy_dtype; + PyTypeObject *__pyx_ptype_5numpy_flatiter; + PyTypeObject *__pyx_ptype_5numpy_broadcast; + PyTypeObject *__pyx_ptype_5numpy_ndarray; + PyTypeObject *__pyx_ptype_5numpy_generic; + PyTypeObject *__pyx_ptype_5numpy_number; + PyTypeObject *__pyx_ptype_5numpy_integer; + PyTypeObject *__pyx_ptype_5numpy_signedinteger; + PyTypeObject *__pyx_ptype_5numpy_unsignedinteger; + PyTypeObject *__pyx_ptype_5numpy_inexact; + PyTypeObject *__pyx_ptype_5numpy_floating; + PyTypeObject *__pyx_ptype_5numpy_complexfloating; + PyTypeObject *__pyx_ptype_5numpy_flexible; + PyTypeObject *__pyx_ptype_5numpy_character; + PyTypeObject *__pyx_ptype_5numpy_ufunc; + #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type___pyx_array; + PyObject *__pyx_type___pyx_MemviewEnum; + PyObject *__pyx_type___pyx_memoryview; + PyObject *__pyx_type___pyx_memoryviewslice; + #endif + PyTypeObject *__pyx_array_type; + PyTypeObject *__pyx_MemviewEnum_type; + PyTypeObject *__pyx_memoryview_type; + PyTypeObject *__pyx_memoryviewslice_type; + PyObject *__pyx_kp_u_; + PyObject *__pyx_n_s_ASCII; + PyObject *__pyx_kp_s_All_dimensions_preceding_dimensi; + PyObject *__pyx_n_s_AssertionError; + PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; + PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; + PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; + PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; + PyObject *__pyx_kp_u_Cannot_index_with_type; + PyObject *__pyx_kp_s_Cannot_transpose_memoryview_with; + PyObject *__pyx_kp_s_Dimension_d_is_not_direct; + PyObject *__pyx_n_s_Ellipsis; + PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; + PyObject *__pyx_kp_s_Expected_at_least_d_argument_s_g; + PyObject *__pyx_kp_s_Function_call_with_ambiguous_arg; + PyObject *__pyx_n_s_ImportError; + PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + PyObject *__pyx_n_s_IndexError; + PyObject *__pyx_kp_s_Index_out_of_bounds_axis_d; + PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; + PyObject *__pyx_kp_u_Invalid_mode_expected_c_or_fortr; + PyObject *__pyx_kp_u_Invalid_shape_in_axis; + PyObject *__pyx_n_s_MemoryError; + PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; + PyObject *__pyx_kp_s_MemoryView_of_r_object; + PyObject *__pyx_kp_s_No_matching_signature_found; + PyObject *__pyx_n_b_O; + PyObject *__pyx_kp_u_Out_of_bounds_on_buffer_access_a; + PyObject *__pyx_n_s_PickleError; + PyObject *__pyx_n_s_Sequence; + PyObject *__pyx_kp_s_Step_may_not_be_zero_axis_d; + PyObject *__pyx_n_s_TypeError; + PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; + PyObject *__pyx_n_s_ValueError; + PyObject *__pyx_n_s_View_MemoryView; + PyObject *__pyx_n_s_X; + PyObject *__pyx_n_s_X_offset; + PyObject *__pyx_n_s_X_scale; + PyObject *__pyx_kp_s__11; + PyObject *__pyx_kp_s__12; + PyObject *__pyx_kp_u__12; + PyObject *__pyx_kp_u__2; + PyObject *__pyx_n_s__3; + PyObject *__pyx_n_s__34; + PyObject *__pyx_kp_u__6; + PyObject *__pyx_kp_u__7; + PyObject *__pyx_n_s_abc; + PyObject *__pyx_n_s_allocate_buffer; + PyObject *__pyx_kp_u_and; + PyObject *__pyx_n_s_args; + PyObject *__pyx_n_s_asyncio_coroutines; + PyObject *__pyx_n_s_base; + PyObject *__pyx_n_s_c; + PyObject *__pyx_n_u_c; + PyObject *__pyx_n_s_class; + PyObject *__pyx_n_s_class_getitem; + PyObject *__pyx_n_s_cline_in_traceback; + PyObject *__pyx_n_s_collections; + PyObject *__pyx_kp_s_collections_abc; + PyObject *__pyx_kp_s_contiguous_and_direct; + PyObject *__pyx_kp_s_contiguous_and_indirect; + PyObject *__pyx_n_s_count; + PyObject *__pyx_n_s_defaults; + PyObject *__pyx_n_s_dict; + PyObject *__pyx_kp_u_disable; + PyObject *__pyx_n_s_dtype; + PyObject *__pyx_n_s_dtype_is_object; + PyObject *__pyx_kp_u_enable; + PyObject *__pyx_n_s_encode; + PyObject *__pyx_n_s_enumerate; + PyObject *__pyx_n_s_error; + PyObject *__pyx_n_s_flags; + PyObject *__pyx_n_s_float32_t; + PyObject *__pyx_n_s_float64_t; + PyObject *__pyx_n_s_format; + PyObject *__pyx_n_s_fortran; + PyObject *__pyx_n_u_fortran; + PyObject *__pyx_n_s_fused_sigindex; + PyObject *__pyx_kp_s_gators_scalers_scaler_pyx; + PyObject *__pyx_kp_u_gc; + PyObject *__pyx_n_s_get; + PyObject *__pyx_n_s_getstate; + PyObject *__pyx_kp_u_got; + PyObject *__pyx_kp_u_got_differing_extents_in_dimensi; + PyObject *__pyx_n_s_id; + PyObject *__pyx_n_s_import; + PyObject *__pyx_n_s_index; + PyObject *__pyx_n_s_initializing; + PyObject *__pyx_n_s_is_coroutine; + PyObject *__pyx_kp_u_isenabled; + PyObject *__pyx_n_s_itemsize; + PyObject *__pyx_kp_s_itemsize_0_for_cython_array; + PyObject *__pyx_n_s_kind; + PyObject *__pyx_n_s_kwargs; + PyObject *__pyx_n_s_lambdas; + PyObject *__pyx_n_s_main; + PyObject *__pyx_n_s_memview; + PyObject *__pyx_n_s_mode; + PyObject *__pyx_n_s_name; + PyObject *__pyx_n_s_name_2; + PyObject *__pyx_n_s_ndim; + PyObject *__pyx_n_s_new; + PyObject *__pyx_kp_s_no_default___reduce___due_to_non; + PyObject *__pyx_n_s_np; + PyObject *__pyx_n_s_numpy; + PyObject *__pyx_kp_u_numpy_core_multiarray_failed_to; + PyObject *__pyx_kp_u_numpy_core_umath_failed_to_impor; + PyObject *__pyx_n_s_obj; + PyObject *__pyx_n_s_pack; + PyObject *__pyx_n_s_pickle; + PyObject *__pyx_n_s_pyx_PickleError; + PyObject *__pyx_n_s_pyx_checksum; + PyObject *__pyx_n_s_pyx_fuse_0scaler; + PyObject *__pyx_n_s_pyx_fuse_0yeo_johnson; + PyObject *__pyx_n_s_pyx_fuse_1scaler; + PyObject *__pyx_n_s_pyx_fuse_1yeo_johnson; + PyObject *__pyx_n_s_pyx_result; + PyObject *__pyx_n_s_pyx_state; + PyObject *__pyx_n_s_pyx_type; + PyObject *__pyx_n_s_pyx_unpickle_Enum; + PyObject *__pyx_n_s_pyx_vtable; + PyObject *__pyx_n_s_range; + PyObject *__pyx_n_s_reduce; + PyObject *__pyx_n_s_reduce_cython; + PyObject *__pyx_n_s_reduce_ex; + PyObject *__pyx_n_s_register; + PyObject *__pyx_n_s_s; + PyObject *__pyx_n_s_scaler; + PyObject *__pyx_n_s_setstate; + PyObject *__pyx_n_s_setstate_cython; + PyObject *__pyx_n_s_shape; + PyObject *__pyx_n_s_signatures; + PyObject *__pyx_n_s_size; + PyObject *__pyx_n_s_spec; + PyObject *__pyx_n_s_split; + PyObject *__pyx_n_s_start; + PyObject *__pyx_n_s_step; + PyObject *__pyx_n_s_stop; + PyObject *__pyx_kp_s_strided_and_direct; + PyObject *__pyx_kp_s_strided_and_direct_or_indirect; + PyObject *__pyx_kp_s_strided_and_indirect; + PyObject *__pyx_kp_s_stringsource; + PyObject *__pyx_n_s_strip; + PyObject *__pyx_n_s_struct; + PyObject *__pyx_n_s_sys; + PyObject *__pyx_n_s_test; + PyObject *__pyx_kp_s_unable_to_allocate_array_data; + PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; + PyObject *__pyx_n_s_unpack; + PyObject *__pyx_n_s_update; + PyObject *__pyx_n_s_values; + PyObject *__pyx_n_s_version_info; + PyObject *__pyx_n_s_yeo_johnson; + PyObject *__pyx_int_0; + PyObject *__pyx_int_1; + PyObject *__pyx_int_2; + PyObject *__pyx_int_3; + PyObject *__pyx_int_112105877; + PyObject *__pyx_int_136983863; + PyObject *__pyx_int_184977713; + PyObject *__pyx_int_neg_1; + PyObject *__pyx_slice__5; + PyObject *__pyx_tuple__4; + PyObject *__pyx_tuple__8; + PyObject *__pyx_tuple__9; + PyObject *__pyx_tuple__10; + PyObject *__pyx_tuple__13; + PyObject *__pyx_tuple__14; + PyObject *__pyx_tuple__15; + PyObject *__pyx_tuple__16; + PyObject *__pyx_tuple__17; + PyObject *__pyx_tuple__18; + PyObject *__pyx_tuple__19; + PyObject *__pyx_tuple__20; + PyObject *__pyx_tuple__21; + PyObject *__pyx_tuple__22; + PyObject *__pyx_tuple__23; + PyObject *__pyx_tuple__24; + PyObject *__pyx_tuple__26; + PyObject *__pyx_tuple__30; + PyObject *__pyx_codeobj__25; + PyObject *__pyx_codeobj__27; + PyObject *__pyx_codeobj__28; + PyObject *__pyx_codeobj__29; + PyObject *__pyx_codeobj__31; + PyObject *__pyx_codeobj__32; + PyObject *__pyx_codeobj__33; +} __pyx_mstate; + +#if CYTHON_USE_MODULE_STATE +#ifdef __cplusplus +namespace { + extern struct PyModuleDef __pyx_moduledef; +} /* anonymous namespace */ +#else +static struct PyModuleDef __pyx_moduledef; +#endif + +#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) + +#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) + +#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) +#else +static __pyx_mstate __pyx_mstate_global_static = +#ifdef __cplusplus + {}; +#else + {0}; +#endif +static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; +#endif +/* #### Code section: module_state_clear ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_clear(PyObject *m) { + __pyx_mstate *clear_module_state = __pyx_mstate(m); + if (!clear_module_state) return 0; + Py_CLEAR(clear_module_state->__pyx_d); + Py_CLEAR(clear_module_state->__pyx_b); + Py_CLEAR(clear_module_state->__pyx_cython_runtime); + Py_CLEAR(clear_module_state->__pyx_empty_tuple); + Py_CLEAR(clear_module_state->__pyx_empty_bytes); + Py_CLEAR(clear_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_CLEAR(clear_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); + #endif + Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_dtype); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flatiter); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_broadcast); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ndarray); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_generic); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_number); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_integer); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_signedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_inexact); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_floating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_complexfloating); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); + Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_array_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_array); + Py_CLEAR(clear_module_state->__pyx_MemviewEnum_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_MemviewEnum); + Py_CLEAR(clear_module_state->__pyx_memoryview_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryview); + Py_CLEAR(clear_module_state->__pyx_memoryviewslice_type); + Py_CLEAR(clear_module_state->__pyx_type___pyx_memoryviewslice); + Py_CLEAR(clear_module_state->__pyx_kp_u_); + Py_CLEAR(clear_module_state->__pyx_n_s_ASCII); + Py_CLEAR(clear_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_CLEAR(clear_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_CLEAR(clear_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_CLEAR(clear_module_state->__pyx_n_s_Ellipsis); + Py_CLEAR(clear_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_CLEAR(clear_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_CLEAR(clear_module_state->__pyx_n_s_IndexError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_CLEAR(clear_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_CLEAR(clear_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_CLEAR(clear_module_state->__pyx_kp_s_No_matching_signature_found); + Py_CLEAR(clear_module_state->__pyx_n_b_O); + Py_CLEAR(clear_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_Sequence); + Py_CLEAR(clear_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); + Py_CLEAR(clear_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); + Py_CLEAR(clear_module_state->__pyx_n_s_View_MemoryView); + Py_CLEAR(clear_module_state->__pyx_n_s_X); + Py_CLEAR(clear_module_state->__pyx_n_s_X_offset); + Py_CLEAR(clear_module_state->__pyx_n_s_X_scale); + Py_CLEAR(clear_module_state->__pyx_kp_s__11); + Py_CLEAR(clear_module_state->__pyx_kp_s__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__12); + Py_CLEAR(clear_module_state->__pyx_kp_u__2); + Py_CLEAR(clear_module_state->__pyx_n_s__3); + Py_CLEAR(clear_module_state->__pyx_n_s__34); + Py_CLEAR(clear_module_state->__pyx_kp_u__6); + Py_CLEAR(clear_module_state->__pyx_kp_u__7); + Py_CLEAR(clear_module_state->__pyx_n_s_abc); + Py_CLEAR(clear_module_state->__pyx_n_s_allocate_buffer); + Py_CLEAR(clear_module_state->__pyx_kp_u_and); + Py_CLEAR(clear_module_state->__pyx_n_s_args); + Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); + Py_CLEAR(clear_module_state->__pyx_n_s_base); + Py_CLEAR(clear_module_state->__pyx_n_s_c); + Py_CLEAR(clear_module_state->__pyx_n_u_c); + Py_CLEAR(clear_module_state->__pyx_n_s_class); + Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); + Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); + Py_CLEAR(clear_module_state->__pyx_n_s_collections); + Py_CLEAR(clear_module_state->__pyx_kp_s_collections_abc); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_CLEAR(clear_module_state->__pyx_n_s_count); + Py_CLEAR(clear_module_state->__pyx_n_s_defaults); + Py_CLEAR(clear_module_state->__pyx_n_s_dict); + Py_CLEAR(clear_module_state->__pyx_kp_u_disable); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype); + Py_CLEAR(clear_module_state->__pyx_n_s_dtype_is_object); + Py_CLEAR(clear_module_state->__pyx_kp_u_enable); + Py_CLEAR(clear_module_state->__pyx_n_s_encode); + Py_CLEAR(clear_module_state->__pyx_n_s_enumerate); + Py_CLEAR(clear_module_state->__pyx_n_s_error); + Py_CLEAR(clear_module_state->__pyx_n_s_flags); + Py_CLEAR(clear_module_state->__pyx_n_s_float32_t); + Py_CLEAR(clear_module_state->__pyx_n_s_float64_t); + Py_CLEAR(clear_module_state->__pyx_n_s_format); + Py_CLEAR(clear_module_state->__pyx_n_s_fortran); + Py_CLEAR(clear_module_state->__pyx_n_u_fortran); + Py_CLEAR(clear_module_state->__pyx_n_s_fused_sigindex); + Py_CLEAR(clear_module_state->__pyx_kp_s_gators_scalers_scaler_pyx); + Py_CLEAR(clear_module_state->__pyx_kp_u_gc); + Py_CLEAR(clear_module_state->__pyx_n_s_get); + Py_CLEAR(clear_module_state->__pyx_n_s_getstate); + Py_CLEAR(clear_module_state->__pyx_kp_u_got); + Py_CLEAR(clear_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_CLEAR(clear_module_state->__pyx_n_s_id); + Py_CLEAR(clear_module_state->__pyx_n_s_import); + Py_CLEAR(clear_module_state->__pyx_n_s_index); + Py_CLEAR(clear_module_state->__pyx_n_s_initializing); + Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); + Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); + Py_CLEAR(clear_module_state->__pyx_n_s_itemsize); + Py_CLEAR(clear_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_CLEAR(clear_module_state->__pyx_n_s_kind); + Py_CLEAR(clear_module_state->__pyx_n_s_kwargs); + Py_CLEAR(clear_module_state->__pyx_n_s_lambdas); + Py_CLEAR(clear_module_state->__pyx_n_s_main); + Py_CLEAR(clear_module_state->__pyx_n_s_memview); + Py_CLEAR(clear_module_state->__pyx_n_s_mode); + Py_CLEAR(clear_module_state->__pyx_n_s_name); + Py_CLEAR(clear_module_state->__pyx_n_s_name_2); + Py_CLEAR(clear_module_state->__pyx_n_s_ndim); + Py_CLEAR(clear_module_state->__pyx_n_s_new); + Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_CLEAR(clear_module_state->__pyx_n_s_np); + Py_CLEAR(clear_module_state->__pyx_n_s_numpy); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_CLEAR(clear_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_CLEAR(clear_module_state->__pyx_n_s_obj); + Py_CLEAR(clear_module_state->__pyx_n_s_pack); + Py_CLEAR(clear_module_state->__pyx_n_s_pickle); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0scaler); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_0yeo_johnson); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1scaler); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_fuse_1yeo_johnson); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); + Py_CLEAR(clear_module_state->__pyx_n_s_range); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); + Py_CLEAR(clear_module_state->__pyx_n_s_register); + Py_CLEAR(clear_module_state->__pyx_n_s_s); + Py_CLEAR(clear_module_state->__pyx_n_s_scaler); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate); + Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); + Py_CLEAR(clear_module_state->__pyx_n_s_shape); + Py_CLEAR(clear_module_state->__pyx_n_s_signatures); + Py_CLEAR(clear_module_state->__pyx_n_s_size); + Py_CLEAR(clear_module_state->__pyx_n_s_spec); + Py_CLEAR(clear_module_state->__pyx_n_s_split); + Py_CLEAR(clear_module_state->__pyx_n_s_start); + Py_CLEAR(clear_module_state->__pyx_n_s_step); + Py_CLEAR(clear_module_state->__pyx_n_s_stop); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_strided_and_indirect); + Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); + Py_CLEAR(clear_module_state->__pyx_n_s_strip); + Py_CLEAR(clear_module_state->__pyx_n_s_struct); + Py_CLEAR(clear_module_state->__pyx_n_s_sys); + Py_CLEAR(clear_module_state->__pyx_n_s_test); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_CLEAR(clear_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_CLEAR(clear_module_state->__pyx_n_s_unpack); + Py_CLEAR(clear_module_state->__pyx_n_s_update); + Py_CLEAR(clear_module_state->__pyx_n_s_values); + Py_CLEAR(clear_module_state->__pyx_n_s_version_info); + Py_CLEAR(clear_module_state->__pyx_n_s_yeo_johnson); + Py_CLEAR(clear_module_state->__pyx_int_0); + Py_CLEAR(clear_module_state->__pyx_int_1); + Py_CLEAR(clear_module_state->__pyx_int_2); + Py_CLEAR(clear_module_state->__pyx_int_3); + Py_CLEAR(clear_module_state->__pyx_int_112105877); + Py_CLEAR(clear_module_state->__pyx_int_136983863); + Py_CLEAR(clear_module_state->__pyx_int_184977713); + Py_CLEAR(clear_module_state->__pyx_int_neg_1); + Py_CLEAR(clear_module_state->__pyx_slice__5); + Py_CLEAR(clear_module_state->__pyx_tuple__4); + Py_CLEAR(clear_module_state->__pyx_tuple__8); + Py_CLEAR(clear_module_state->__pyx_tuple__9); + Py_CLEAR(clear_module_state->__pyx_tuple__10); + Py_CLEAR(clear_module_state->__pyx_tuple__13); + Py_CLEAR(clear_module_state->__pyx_tuple__14); + Py_CLEAR(clear_module_state->__pyx_tuple__15); + Py_CLEAR(clear_module_state->__pyx_tuple__16); + Py_CLEAR(clear_module_state->__pyx_tuple__17); + Py_CLEAR(clear_module_state->__pyx_tuple__18); + Py_CLEAR(clear_module_state->__pyx_tuple__19); + Py_CLEAR(clear_module_state->__pyx_tuple__20); + Py_CLEAR(clear_module_state->__pyx_tuple__21); + Py_CLEAR(clear_module_state->__pyx_tuple__22); + Py_CLEAR(clear_module_state->__pyx_tuple__23); + Py_CLEAR(clear_module_state->__pyx_tuple__24); + Py_CLEAR(clear_module_state->__pyx_tuple__26); + Py_CLEAR(clear_module_state->__pyx_tuple__30); + Py_CLEAR(clear_module_state->__pyx_codeobj__25); + Py_CLEAR(clear_module_state->__pyx_codeobj__27); + Py_CLEAR(clear_module_state->__pyx_codeobj__28); + Py_CLEAR(clear_module_state->__pyx_codeobj__29); + Py_CLEAR(clear_module_state->__pyx_codeobj__31); + Py_CLEAR(clear_module_state->__pyx_codeobj__32); + Py_CLEAR(clear_module_state->__pyx_codeobj__33); + return 0; +} +#endif +/* #### Code section: module_state_traverse ### */ +#if CYTHON_USE_MODULE_STATE +static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { + __pyx_mstate *traverse_module_state = __pyx_mstate(m); + if (!traverse_module_state) return 0; + Py_VISIT(traverse_module_state->__pyx_d); + Py_VISIT(traverse_module_state->__pyx_b); + Py_VISIT(traverse_module_state->__pyx_cython_runtime); + Py_VISIT(traverse_module_state->__pyx_empty_tuple); + Py_VISIT(traverse_module_state->__pyx_empty_bytes); + Py_VISIT(traverse_module_state->__pyx_empty_unicode); + #ifdef __Pyx_CyFunction_USED + Py_VISIT(traverse_module_state->__pyx_CyFunctionType); + #endif + #ifdef __Pyx_FusedFunction_USED + Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); + #endif + Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_dtype); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flatiter); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_broadcast); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ndarray); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_generic); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_number); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_integer); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_signedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_unsignedinteger); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_inexact); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_floating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_complexfloating); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); + Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_array_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_array); + Py_VISIT(traverse_module_state->__pyx_MemviewEnum_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_MemviewEnum); + Py_VISIT(traverse_module_state->__pyx_memoryview_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryview); + Py_VISIT(traverse_module_state->__pyx_memoryviewslice_type); + Py_VISIT(traverse_module_state->__pyx_type___pyx_memoryviewslice); + Py_VISIT(traverse_module_state->__pyx_kp_u_); + Py_VISIT(traverse_module_state->__pyx_n_s_ASCII); + Py_VISIT(traverse_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_VISIT(traverse_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); + Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_index_with_type); + Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_transpose_memoryview_with); + Py_VISIT(traverse_module_state->__pyx_kp_s_Dimension_d_is_not_direct); + Py_VISIT(traverse_module_state->__pyx_n_s_Ellipsis); + Py_VISIT(traverse_module_state->__pyx_kp_s_Empty_shape_tuple_for_cython_arr); + Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_at_least_d_argument_s_g); + Py_VISIT(traverse_module_state->__pyx_kp_s_Function_call_with_ambiguous_arg); + Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); + Py_VISIT(traverse_module_state->__pyx_n_s_IndexError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Index_out_of_bounds_axis_d); + Py_VISIT(traverse_module_state->__pyx_kp_s_Indirect_dimensions_not_supporte); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_mode_expected_c_or_fortr); + Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_shape_in_axis); + Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_at_0x_x); + Py_VISIT(traverse_module_state->__pyx_kp_s_MemoryView_of_r_object); + Py_VISIT(traverse_module_state->__pyx_kp_s_No_matching_signature_found); + Py_VISIT(traverse_module_state->__pyx_n_b_O); + Py_VISIT(traverse_module_state->__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_Sequence); + Py_VISIT(traverse_module_state->__pyx_kp_s_Step_may_not_be_zero_axis_d); + Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); + Py_VISIT(traverse_module_state->__pyx_kp_s_Unable_to_convert_item_to_object); + Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); + Py_VISIT(traverse_module_state->__pyx_n_s_View_MemoryView); + Py_VISIT(traverse_module_state->__pyx_n_s_X); + Py_VISIT(traverse_module_state->__pyx_n_s_X_offset); + Py_VISIT(traverse_module_state->__pyx_n_s_X_scale); + Py_VISIT(traverse_module_state->__pyx_kp_s__11); + Py_VISIT(traverse_module_state->__pyx_kp_s__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__12); + Py_VISIT(traverse_module_state->__pyx_kp_u__2); + Py_VISIT(traverse_module_state->__pyx_n_s__3); + Py_VISIT(traverse_module_state->__pyx_n_s__34); + Py_VISIT(traverse_module_state->__pyx_kp_u__6); + Py_VISIT(traverse_module_state->__pyx_kp_u__7); + Py_VISIT(traverse_module_state->__pyx_n_s_abc); + Py_VISIT(traverse_module_state->__pyx_n_s_allocate_buffer); + Py_VISIT(traverse_module_state->__pyx_kp_u_and); + Py_VISIT(traverse_module_state->__pyx_n_s_args); + Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); + Py_VISIT(traverse_module_state->__pyx_n_s_base); + Py_VISIT(traverse_module_state->__pyx_n_s_c); + Py_VISIT(traverse_module_state->__pyx_n_u_c); + Py_VISIT(traverse_module_state->__pyx_n_s_class); + Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); + Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); + Py_VISIT(traverse_module_state->__pyx_n_s_collections); + Py_VISIT(traverse_module_state->__pyx_kp_s_collections_abc); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_indirect); + Py_VISIT(traverse_module_state->__pyx_n_s_count); + Py_VISIT(traverse_module_state->__pyx_n_s_defaults); + Py_VISIT(traverse_module_state->__pyx_n_s_dict); + Py_VISIT(traverse_module_state->__pyx_kp_u_disable); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype); + Py_VISIT(traverse_module_state->__pyx_n_s_dtype_is_object); + Py_VISIT(traverse_module_state->__pyx_kp_u_enable); + Py_VISIT(traverse_module_state->__pyx_n_s_encode); + Py_VISIT(traverse_module_state->__pyx_n_s_enumerate); + Py_VISIT(traverse_module_state->__pyx_n_s_error); + Py_VISIT(traverse_module_state->__pyx_n_s_flags); + Py_VISIT(traverse_module_state->__pyx_n_s_float32_t); + Py_VISIT(traverse_module_state->__pyx_n_s_float64_t); + Py_VISIT(traverse_module_state->__pyx_n_s_format); + Py_VISIT(traverse_module_state->__pyx_n_s_fortran); + Py_VISIT(traverse_module_state->__pyx_n_u_fortran); + Py_VISIT(traverse_module_state->__pyx_n_s_fused_sigindex); + Py_VISIT(traverse_module_state->__pyx_kp_s_gators_scalers_scaler_pyx); + Py_VISIT(traverse_module_state->__pyx_kp_u_gc); + Py_VISIT(traverse_module_state->__pyx_n_s_get); + Py_VISIT(traverse_module_state->__pyx_n_s_getstate); + Py_VISIT(traverse_module_state->__pyx_kp_u_got); + Py_VISIT(traverse_module_state->__pyx_kp_u_got_differing_extents_in_dimensi); + Py_VISIT(traverse_module_state->__pyx_n_s_id); + Py_VISIT(traverse_module_state->__pyx_n_s_import); + Py_VISIT(traverse_module_state->__pyx_n_s_index); + Py_VISIT(traverse_module_state->__pyx_n_s_initializing); + Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); + Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); + Py_VISIT(traverse_module_state->__pyx_n_s_itemsize); + Py_VISIT(traverse_module_state->__pyx_kp_s_itemsize_0_for_cython_array); + Py_VISIT(traverse_module_state->__pyx_n_s_kind); + Py_VISIT(traverse_module_state->__pyx_n_s_kwargs); + Py_VISIT(traverse_module_state->__pyx_n_s_lambdas); + Py_VISIT(traverse_module_state->__pyx_n_s_main); + Py_VISIT(traverse_module_state->__pyx_n_s_memview); + Py_VISIT(traverse_module_state->__pyx_n_s_mode); + Py_VISIT(traverse_module_state->__pyx_n_s_name); + Py_VISIT(traverse_module_state->__pyx_n_s_name_2); + Py_VISIT(traverse_module_state->__pyx_n_s_ndim); + Py_VISIT(traverse_module_state->__pyx_n_s_new); + Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); + Py_VISIT(traverse_module_state->__pyx_n_s_np); + Py_VISIT(traverse_module_state->__pyx_n_s_numpy); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_multiarray_failed_to); + Py_VISIT(traverse_module_state->__pyx_kp_u_numpy_core_umath_failed_to_impor); + Py_VISIT(traverse_module_state->__pyx_n_s_obj); + Py_VISIT(traverse_module_state->__pyx_n_s_pack); + Py_VISIT(traverse_module_state->__pyx_n_s_pickle); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0scaler); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_0yeo_johnson); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1scaler); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_fuse_1yeo_johnson); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_Enum); + Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); + Py_VISIT(traverse_module_state->__pyx_n_s_range); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); + Py_VISIT(traverse_module_state->__pyx_n_s_register); + Py_VISIT(traverse_module_state->__pyx_n_s_s); + Py_VISIT(traverse_module_state->__pyx_n_s_scaler); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate); + Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); + Py_VISIT(traverse_module_state->__pyx_n_s_shape); + Py_VISIT(traverse_module_state->__pyx_n_s_signatures); + Py_VISIT(traverse_module_state->__pyx_n_s_size); + Py_VISIT(traverse_module_state->__pyx_n_s_spec); + Py_VISIT(traverse_module_state->__pyx_n_s_split); + Py_VISIT(traverse_module_state->__pyx_n_s_start); + Py_VISIT(traverse_module_state->__pyx_n_s_step); + Py_VISIT(traverse_module_state->__pyx_n_s_stop); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_direct_or_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_strided_and_indirect); + Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); + Py_VISIT(traverse_module_state->__pyx_n_s_strip); + Py_VISIT(traverse_module_state->__pyx_n_s_struct); + Py_VISIT(traverse_module_state->__pyx_n_s_sys); + Py_VISIT(traverse_module_state->__pyx_n_s_test); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_array_data); + Py_VISIT(traverse_module_state->__pyx_kp_s_unable_to_allocate_shape_and_str); + Py_VISIT(traverse_module_state->__pyx_n_s_unpack); + Py_VISIT(traverse_module_state->__pyx_n_s_update); + Py_VISIT(traverse_module_state->__pyx_n_s_values); + Py_VISIT(traverse_module_state->__pyx_n_s_version_info); + Py_VISIT(traverse_module_state->__pyx_n_s_yeo_johnson); + Py_VISIT(traverse_module_state->__pyx_int_0); + Py_VISIT(traverse_module_state->__pyx_int_1); + Py_VISIT(traverse_module_state->__pyx_int_2); + Py_VISIT(traverse_module_state->__pyx_int_3); + Py_VISIT(traverse_module_state->__pyx_int_112105877); + Py_VISIT(traverse_module_state->__pyx_int_136983863); + Py_VISIT(traverse_module_state->__pyx_int_184977713); + Py_VISIT(traverse_module_state->__pyx_int_neg_1); + Py_VISIT(traverse_module_state->__pyx_slice__5); + Py_VISIT(traverse_module_state->__pyx_tuple__4); + Py_VISIT(traverse_module_state->__pyx_tuple__8); + Py_VISIT(traverse_module_state->__pyx_tuple__9); + Py_VISIT(traverse_module_state->__pyx_tuple__10); + Py_VISIT(traverse_module_state->__pyx_tuple__13); + Py_VISIT(traverse_module_state->__pyx_tuple__14); + Py_VISIT(traverse_module_state->__pyx_tuple__15); + Py_VISIT(traverse_module_state->__pyx_tuple__16); + Py_VISIT(traverse_module_state->__pyx_tuple__17); + Py_VISIT(traverse_module_state->__pyx_tuple__18); + Py_VISIT(traverse_module_state->__pyx_tuple__19); + Py_VISIT(traverse_module_state->__pyx_tuple__20); + Py_VISIT(traverse_module_state->__pyx_tuple__21); + Py_VISIT(traverse_module_state->__pyx_tuple__22); + Py_VISIT(traverse_module_state->__pyx_tuple__23); + Py_VISIT(traverse_module_state->__pyx_tuple__24); + Py_VISIT(traverse_module_state->__pyx_tuple__26); + Py_VISIT(traverse_module_state->__pyx_tuple__30); + Py_VISIT(traverse_module_state->__pyx_codeobj__25); + Py_VISIT(traverse_module_state->__pyx_codeobj__27); + Py_VISIT(traverse_module_state->__pyx_codeobj__28); + Py_VISIT(traverse_module_state->__pyx_codeobj__29); + Py_VISIT(traverse_module_state->__pyx_codeobj__31); + Py_VISIT(traverse_module_state->__pyx_codeobj__32); + Py_VISIT(traverse_module_state->__pyx_codeobj__33); + return 0; +} +#endif +/* #### Code section: module_state_defines ### */ +#define __pyx_d __pyx_mstate_global->__pyx_d +#define __pyx_b __pyx_mstate_global->__pyx_b +#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime +#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple +#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes +#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode +#ifdef __Pyx_CyFunction_USED +#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType +#endif +#ifdef __Pyx_FusedFunction_USED +#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType +#endif +#ifdef __Pyx_Generator_USED +#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType +#endif +#ifdef __Pyx_IterableCoroutine_USED +#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType +#endif +#ifdef __Pyx_Coroutine_USED +#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#if CYTHON_USE_MODULE_STATE +#endif +#define __pyx_ptype_5numpy_dtype __pyx_mstate_global->__pyx_ptype_5numpy_dtype +#define __pyx_ptype_5numpy_flatiter __pyx_mstate_global->__pyx_ptype_5numpy_flatiter +#define __pyx_ptype_5numpy_broadcast __pyx_mstate_global->__pyx_ptype_5numpy_broadcast +#define __pyx_ptype_5numpy_ndarray __pyx_mstate_global->__pyx_ptype_5numpy_ndarray +#define __pyx_ptype_5numpy_generic __pyx_mstate_global->__pyx_ptype_5numpy_generic +#define __pyx_ptype_5numpy_number __pyx_mstate_global->__pyx_ptype_5numpy_number +#define __pyx_ptype_5numpy_integer __pyx_mstate_global->__pyx_ptype_5numpy_integer +#define __pyx_ptype_5numpy_signedinteger __pyx_mstate_global->__pyx_ptype_5numpy_signedinteger +#define __pyx_ptype_5numpy_unsignedinteger __pyx_mstate_global->__pyx_ptype_5numpy_unsignedinteger +#define __pyx_ptype_5numpy_inexact __pyx_mstate_global->__pyx_ptype_5numpy_inexact +#define __pyx_ptype_5numpy_floating __pyx_mstate_global->__pyx_ptype_5numpy_floating +#define __pyx_ptype_5numpy_complexfloating __pyx_mstate_global->__pyx_ptype_5numpy_complexfloating +#define __pyx_ptype_5numpy_flexible __pyx_mstate_global->__pyx_ptype_5numpy_flexible +#define __pyx_ptype_5numpy_character __pyx_mstate_global->__pyx_ptype_5numpy_character +#define __pyx_ptype_5numpy_ufunc __pyx_mstate_global->__pyx_ptype_5numpy_ufunc +#if CYTHON_USE_MODULE_STATE +#define __pyx_type___pyx_array __pyx_mstate_global->__pyx_type___pyx_array +#define __pyx_type___pyx_MemviewEnum __pyx_mstate_global->__pyx_type___pyx_MemviewEnum +#define __pyx_type___pyx_memoryview __pyx_mstate_global->__pyx_type___pyx_memoryview +#define __pyx_type___pyx_memoryviewslice __pyx_mstate_global->__pyx_type___pyx_memoryviewslice +#endif +#define __pyx_array_type __pyx_mstate_global->__pyx_array_type +#define __pyx_MemviewEnum_type __pyx_mstate_global->__pyx_MemviewEnum_type +#define __pyx_memoryview_type __pyx_mstate_global->__pyx_memoryview_type +#define __pyx_memoryviewslice_type __pyx_mstate_global->__pyx_memoryviewslice_type +#define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ +#define __pyx_n_s_ASCII __pyx_mstate_global->__pyx_n_s_ASCII +#define __pyx_kp_s_All_dimensions_preceding_dimensi __pyx_mstate_global->__pyx_kp_s_All_dimensions_preceding_dimensi +#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError +#define __pyx_kp_s_Buffer_view_does_not_expose_stri __pyx_mstate_global->__pyx_kp_s_Buffer_view_does_not_expose_stri +#define __pyx_kp_s_Can_only_create_a_buffer_that_is __pyx_mstate_global->__pyx_kp_s_Can_only_create_a_buffer_that_is +#define __pyx_kp_s_Cannot_assign_to_read_only_memor __pyx_mstate_global->__pyx_kp_s_Cannot_assign_to_read_only_memor +#define __pyx_kp_s_Cannot_create_writable_memory_vi __pyx_mstate_global->__pyx_kp_s_Cannot_create_writable_memory_vi +#define __pyx_kp_u_Cannot_index_with_type __pyx_mstate_global->__pyx_kp_u_Cannot_index_with_type +#define __pyx_kp_s_Cannot_transpose_memoryview_with __pyx_mstate_global->__pyx_kp_s_Cannot_transpose_memoryview_with +#define __pyx_kp_s_Dimension_d_is_not_direct __pyx_mstate_global->__pyx_kp_s_Dimension_d_is_not_direct +#define __pyx_n_s_Ellipsis __pyx_mstate_global->__pyx_n_s_Ellipsis +#define __pyx_kp_s_Empty_shape_tuple_for_cython_arr __pyx_mstate_global->__pyx_kp_s_Empty_shape_tuple_for_cython_arr +#define __pyx_kp_s_Expected_at_least_d_argument_s_g __pyx_mstate_global->__pyx_kp_s_Expected_at_least_d_argument_s_g +#define __pyx_kp_s_Function_call_with_ambiguous_arg __pyx_mstate_global->__pyx_kp_s_Function_call_with_ambiguous_arg +#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError +#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 +#define __pyx_n_s_IndexError __pyx_mstate_global->__pyx_n_s_IndexError +#define __pyx_kp_s_Index_out_of_bounds_axis_d __pyx_mstate_global->__pyx_kp_s_Index_out_of_bounds_axis_d +#define __pyx_kp_s_Indirect_dimensions_not_supporte __pyx_mstate_global->__pyx_kp_s_Indirect_dimensions_not_supporte +#define __pyx_kp_u_Invalid_mode_expected_c_or_fortr __pyx_mstate_global->__pyx_kp_u_Invalid_mode_expected_c_or_fortr +#define __pyx_kp_u_Invalid_shape_in_axis __pyx_mstate_global->__pyx_kp_u_Invalid_shape_in_axis +#define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError +#define __pyx_kp_s_MemoryView_of_r_at_0x_x __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_at_0x_x +#define __pyx_kp_s_MemoryView_of_r_object __pyx_mstate_global->__pyx_kp_s_MemoryView_of_r_object +#define __pyx_kp_s_No_matching_signature_found __pyx_mstate_global->__pyx_kp_s_No_matching_signature_found +#define __pyx_n_b_O __pyx_mstate_global->__pyx_n_b_O +#define __pyx_kp_u_Out_of_bounds_on_buffer_access_a __pyx_mstate_global->__pyx_kp_u_Out_of_bounds_on_buffer_access_a +#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError +#define __pyx_n_s_Sequence __pyx_mstate_global->__pyx_n_s_Sequence +#define __pyx_kp_s_Step_may_not_be_zero_axis_d __pyx_mstate_global->__pyx_kp_s_Step_may_not_be_zero_axis_d +#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError +#define __pyx_kp_s_Unable_to_convert_item_to_object __pyx_mstate_global->__pyx_kp_s_Unable_to_convert_item_to_object +#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError +#define __pyx_n_s_View_MemoryView __pyx_mstate_global->__pyx_n_s_View_MemoryView +#define __pyx_n_s_X __pyx_mstate_global->__pyx_n_s_X +#define __pyx_n_s_X_offset __pyx_mstate_global->__pyx_n_s_X_offset +#define __pyx_n_s_X_scale __pyx_mstate_global->__pyx_n_s_X_scale +#define __pyx_kp_s__11 __pyx_mstate_global->__pyx_kp_s__11 +#define __pyx_kp_s__12 __pyx_mstate_global->__pyx_kp_s__12 +#define __pyx_kp_u__12 __pyx_mstate_global->__pyx_kp_u__12 +#define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 +#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 +#define __pyx_n_s__34 __pyx_mstate_global->__pyx_n_s__34 +#define __pyx_kp_u__6 __pyx_mstate_global->__pyx_kp_u__6 +#define __pyx_kp_u__7 __pyx_mstate_global->__pyx_kp_u__7 +#define __pyx_n_s_abc __pyx_mstate_global->__pyx_n_s_abc +#define __pyx_n_s_allocate_buffer __pyx_mstate_global->__pyx_n_s_allocate_buffer +#define __pyx_kp_u_and __pyx_mstate_global->__pyx_kp_u_and +#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args +#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines +#define __pyx_n_s_base __pyx_mstate_global->__pyx_n_s_base +#define __pyx_n_s_c __pyx_mstate_global->__pyx_n_s_c +#define __pyx_n_u_c __pyx_mstate_global->__pyx_n_u_c +#define __pyx_n_s_class __pyx_mstate_global->__pyx_n_s_class +#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem +#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback +#define __pyx_n_s_collections __pyx_mstate_global->__pyx_n_s_collections +#define __pyx_kp_s_collections_abc __pyx_mstate_global->__pyx_kp_s_collections_abc +#define __pyx_kp_s_contiguous_and_direct __pyx_mstate_global->__pyx_kp_s_contiguous_and_direct +#define __pyx_kp_s_contiguous_and_indirect __pyx_mstate_global->__pyx_kp_s_contiguous_and_indirect +#define __pyx_n_s_count __pyx_mstate_global->__pyx_n_s_count +#define __pyx_n_s_defaults __pyx_mstate_global->__pyx_n_s_defaults +#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict +#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable +#define __pyx_n_s_dtype __pyx_mstate_global->__pyx_n_s_dtype +#define __pyx_n_s_dtype_is_object __pyx_mstate_global->__pyx_n_s_dtype_is_object +#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable +#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode +#define __pyx_n_s_enumerate __pyx_mstate_global->__pyx_n_s_enumerate +#define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error +#define __pyx_n_s_flags __pyx_mstate_global->__pyx_n_s_flags +#define __pyx_n_s_float32_t __pyx_mstate_global->__pyx_n_s_float32_t +#define __pyx_n_s_float64_t __pyx_mstate_global->__pyx_n_s_float64_t +#define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format +#define __pyx_n_s_fortran __pyx_mstate_global->__pyx_n_s_fortran +#define __pyx_n_u_fortran __pyx_mstate_global->__pyx_n_u_fortran +#define __pyx_n_s_fused_sigindex __pyx_mstate_global->__pyx_n_s_fused_sigindex +#define __pyx_kp_s_gators_scalers_scaler_pyx __pyx_mstate_global->__pyx_kp_s_gators_scalers_scaler_pyx +#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc +#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get +#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate +#define __pyx_kp_u_got __pyx_mstate_global->__pyx_kp_u_got +#define __pyx_kp_u_got_differing_extents_in_dimensi __pyx_mstate_global->__pyx_kp_u_got_differing_extents_in_dimensi +#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id +#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import +#define __pyx_n_s_index __pyx_mstate_global->__pyx_n_s_index +#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing +#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine +#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled +#define __pyx_n_s_itemsize __pyx_mstate_global->__pyx_n_s_itemsize +#define __pyx_kp_s_itemsize_0_for_cython_array __pyx_mstate_global->__pyx_kp_s_itemsize_0_for_cython_array +#define __pyx_n_s_kind __pyx_mstate_global->__pyx_n_s_kind +#define __pyx_n_s_kwargs __pyx_mstate_global->__pyx_n_s_kwargs +#define __pyx_n_s_lambdas __pyx_mstate_global->__pyx_n_s_lambdas +#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main +#define __pyx_n_s_memview __pyx_mstate_global->__pyx_n_s_memview +#define __pyx_n_s_mode __pyx_mstate_global->__pyx_n_s_mode +#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name +#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2 +#define __pyx_n_s_ndim __pyx_mstate_global->__pyx_n_s_ndim +#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new +#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non +#define __pyx_n_s_np __pyx_mstate_global->__pyx_n_s_np +#define __pyx_n_s_numpy __pyx_mstate_global->__pyx_n_s_numpy +#define __pyx_kp_u_numpy_core_multiarray_failed_to __pyx_mstate_global->__pyx_kp_u_numpy_core_multiarray_failed_to +#define __pyx_kp_u_numpy_core_umath_failed_to_impor __pyx_mstate_global->__pyx_kp_u_numpy_core_umath_failed_to_impor +#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj +#define __pyx_n_s_pack __pyx_mstate_global->__pyx_n_s_pack +#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle +#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError +#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum +#define __pyx_n_s_pyx_fuse_0scaler __pyx_mstate_global->__pyx_n_s_pyx_fuse_0scaler +#define __pyx_n_s_pyx_fuse_0yeo_johnson __pyx_mstate_global->__pyx_n_s_pyx_fuse_0yeo_johnson +#define __pyx_n_s_pyx_fuse_1scaler __pyx_mstate_global->__pyx_n_s_pyx_fuse_1scaler +#define __pyx_n_s_pyx_fuse_1yeo_johnson __pyx_mstate_global->__pyx_n_s_pyx_fuse_1yeo_johnson +#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result +#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state +#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type +#define __pyx_n_s_pyx_unpickle_Enum __pyx_mstate_global->__pyx_n_s_pyx_unpickle_Enum +#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable +#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range +#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce +#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython +#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex +#define __pyx_n_s_register __pyx_mstate_global->__pyx_n_s_register +#define __pyx_n_s_s __pyx_mstate_global->__pyx_n_s_s +#define __pyx_n_s_scaler __pyx_mstate_global->__pyx_n_s_scaler +#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate +#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython +#define __pyx_n_s_shape __pyx_mstate_global->__pyx_n_s_shape +#define __pyx_n_s_signatures __pyx_mstate_global->__pyx_n_s_signatures +#define __pyx_n_s_size __pyx_mstate_global->__pyx_n_s_size +#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec +#define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split +#define __pyx_n_s_start __pyx_mstate_global->__pyx_n_s_start +#define __pyx_n_s_step __pyx_mstate_global->__pyx_n_s_step +#define __pyx_n_s_stop __pyx_mstate_global->__pyx_n_s_stop +#define __pyx_kp_s_strided_and_direct __pyx_mstate_global->__pyx_kp_s_strided_and_direct +#define __pyx_kp_s_strided_and_direct_or_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_direct_or_indirect +#define __pyx_kp_s_strided_and_indirect __pyx_mstate_global->__pyx_kp_s_strided_and_indirect +#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource +#define __pyx_n_s_strip __pyx_mstate_global->__pyx_n_s_strip +#define __pyx_n_s_struct __pyx_mstate_global->__pyx_n_s_struct +#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys +#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test +#define __pyx_kp_s_unable_to_allocate_array_data __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_array_data +#define __pyx_kp_s_unable_to_allocate_shape_and_str __pyx_mstate_global->__pyx_kp_s_unable_to_allocate_shape_and_str +#define __pyx_n_s_unpack __pyx_mstate_global->__pyx_n_s_unpack +#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update +#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values +#define __pyx_n_s_version_info __pyx_mstate_global->__pyx_n_s_version_info +#define __pyx_n_s_yeo_johnson __pyx_mstate_global->__pyx_n_s_yeo_johnson +#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 +#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 +#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 +#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 +#define __pyx_int_112105877 __pyx_mstate_global->__pyx_int_112105877 +#define __pyx_int_136983863 __pyx_mstate_global->__pyx_int_136983863 +#define __pyx_int_184977713 __pyx_mstate_global->__pyx_int_184977713 +#define __pyx_int_neg_1 __pyx_mstate_global->__pyx_int_neg_1 +#define __pyx_slice__5 __pyx_mstate_global->__pyx_slice__5 +#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 +#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 +#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 +#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 +#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 +#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 +#define __pyx_tuple__15 __pyx_mstate_global->__pyx_tuple__15 +#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 +#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 +#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 +#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 +#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 +#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 +#define __pyx_tuple__22 __pyx_mstate_global->__pyx_tuple__22 +#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 +#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24 +#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26 +#define __pyx_tuple__30 __pyx_mstate_global->__pyx_tuple__30 +#define __pyx_codeobj__25 __pyx_mstate_global->__pyx_codeobj__25 +#define __pyx_codeobj__27 __pyx_mstate_global->__pyx_codeobj__27 +#define __pyx_codeobj__28 __pyx_mstate_global->__pyx_codeobj__28 +#define __pyx_codeobj__29 __pyx_mstate_global->__pyx_codeobj__29 +#define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 +#define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 +#define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 +/* #### Code section: module_code ### */ + +/* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)__pyx_n_s_c)); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_itemsize)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_format)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mode); + if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_allocate_buffer); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 131, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 132, __pyx_L3_error) + } else { + + /* "View.MemoryView":132 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, __pyx_nargs); __PYX_ERR(1, 131, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 131, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 131, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_dim; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + char *__pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_UCS4 __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":137 + * cdef Py_ssize_t dim + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 137, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 137, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":138 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + __pyx_t_2 = (!(__pyx_v_self->ndim != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":141 + * + * if not self.ndim: + * raise ValueError, "Empty shape tuple for cython.array" # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Empty_shape_tuple_for_cython_arr, 0, 0); + __PYX_ERR(1, 141, __pyx_L1_error) + + /* "View.MemoryView":140 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError, "Empty shape tuple for cython.array" + * + */ + } + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + __pyx_t_2 = (__pyx_v_itemsize <= 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":144 + * + * if itemsize <= 0: + * raise ValueError, "itemsize <= 0 for cython.array" # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_itemsize_0_for_cython_array, 0, 0); + __PYX_ERR(1, 144, __pyx_L1_error) + + /* "View.MemoryView":143 + * raise ValueError, "Empty shape tuple for cython.array" + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError, "itemsize <= 0 for cython.array" + * + */ + } + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_3 = (!__pyx_t_2); + if (__pyx_t_3) { + + /* "View.MemoryView":147 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_7 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_n_s_ASCII}; + __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":146 + * raise ValueError, "itemsize <= 0 for cython.array" + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":148 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_format))) __PYX_ERR(1, 148, __pyx_L1_error) + __pyx_t_4 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":149 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 149, __pyx_L1_error) + } + __pyx_t_8 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) __PYX_ERR(1, 149, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_8; + + /* "View.MemoryView":152 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":153 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + __pyx_t_3 = (!(__pyx_v_self->_shape != 0)); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":156 + * + * if not self._shape: + * raise MemoryError, "unable to allocate shape and strides." # <<<<<<<<<<<<<< + * + * + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_shape_and_str, 0, 0); + __PYX_ERR(1, 156, __pyx_L1_error) + + /* "View.MemoryView":155 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate shape and strides." + * + */ + } + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + __pyx_t_7 = 0; + __pyx_t_4 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_4); + __pyx_t_1 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #endif + if (__pyx_t_1 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(1, 159, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_9; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + __pyx_t_3 = (__pyx_v_dim <= 0); + if (unlikely(__pyx_t_3)) { + + /* "View.MemoryView":161 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_5 = PyTuple_New(5); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = 0; + __pyx_t_10 = 127; + __Pyx_INCREF(__pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_9 += 22; + __Pyx_GIVEREF(__pyx_kp_u_Invalid_shape_in_axis); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Invalid_shape_in_axis); + __pyx_t_6 = __Pyx_PyUnicode_From_int(__pyx_v_idx, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u_); + __pyx_t_9 += 2; + __Pyx_GIVEREF(__pyx_kp_u_); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u_); + __pyx_t_6 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_INCREF(__pyx_kp_u__2); + __pyx_t_9 += 1; + __Pyx_GIVEREF(__pyx_kp_u__2); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_kp_u__2); + __pyx_t_6 = __Pyx_PyUnicode_Join(__pyx_t_5, 5, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 161, __pyx_L1_error) + + /* "View.MemoryView":160 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":162 + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":159 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError, f"Invalid shape in axis {idx}: {dim}." + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 165, __pyx_L1_error) + if (__pyx_t_3) { + + /* "View.MemoryView":166 + * cdef char order + * if mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * elif mode == 'fortran': + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":167 + * if mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * elif mode == 'fortran': + * order = b'F' + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":165 + * + * cdef char order + * if mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(1, 168, __pyx_L1_error) + if (likely(__pyx_t_3)) { + + /* "View.MemoryView":169 + * self.mode = u'c' + * elif mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * else: + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":170 + * elif mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":168 + * order = b'C' + * self.mode = u'c' + * elif mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L11; + } + + /* "View.MemoryView":172 + * self.mode = u'fortran' + * else: + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_FormatSimple(__pyx_v_mode, __pyx_empty_unicode); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_6, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 172, __pyx_L1_error) + } + __pyx_L11:; + + /* "View.MemoryView":174 + * raise ValueError, f"Invalid mode, expected 'c' or 'fortran', got {mode}" + * + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) # <<<<<<<<<<<<<< + * + * self.free_data = allocate_buffer + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":176 + * self.len = fill_contig_strides_array(self._shape, self._strides, itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":177 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * + * if allocate_buffer: + */ + __pyx_t_6 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 177, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_3; + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + if (__pyx_v_allocate_buffer) { + + /* "View.MemoryView":180 + * + * if allocate_buffer: + * _allocate_buffer(self) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_t_7 = __pyx_array_allocate_buffer(__pyx_v_self); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(1, 180, __pyx_L1_error) + + /* "View.MemoryView":179 + * self.dtype_is_object = format == b'O' + * + * if allocate_buffer: # <<<<<<<<<<<<<< + * _allocate_buffer(self) + * + */ + } + + /* "View.MemoryView":131 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + char *__pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_ssize_t *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":184 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_t_1 = ((__pyx_v_flags & ((PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS) | PyBUF_ANY_CONTIGUOUS)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 186, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":187 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L4; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 188, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L4:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + __pyx_t_1 = (!((__pyx_v_flags & __pyx_v_bufmode) != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Can_only_create_a_buffer_that_is, 0, 0); + __PYX_ERR(1, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + */ + } + + /* "View.MemoryView":185 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if flags & (PyBUF_C_CONTIGUOUS | PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS): # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * + */ + __pyx_t_2 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_2; + + /* "View.MemoryView":193 + * raise ValueError, "Can only create a buffer that is contiguous in memory." + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_3; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":196 + * + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_4 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_4; + + /* "View.MemoryView":197 + * if flags & PyBUF_STRIDES: + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * else: + */ + __pyx_t_5 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":198 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * else: + * info.ndim = 1 + */ + __pyx_t_5 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_5; + + /* "View.MemoryView":195 + * info.len = self.len + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + goto __pyx_L6; + } + + /* "View.MemoryView":200 + * info.strides = self._strides + * else: + * info.ndim = 1 # <<<<<<<<<<<<<< + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL + */ + /*else*/ { + __pyx_v_info->ndim = 1; + + /* "View.MemoryView":201 + * else: + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL # <<<<<<<<<<<<<< + * info.strides = NULL + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + __pyx_t_5 = (&__pyx_v_self->len); + } else { + __pyx_t_5 = NULL; + } + __pyx_v_info->shape = __pyx_t_5; + + /* "View.MemoryView":202 + * info.ndim = 1 + * info.shape = &self.len if flags & PyBUF_ND else NULL + * info.strides = NULL # <<<<<<<<<<<<<< + * + * info.suboffsets = NULL + */ + __pyx_v_info->strides = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":204 + * info.strides = NULL + * + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":205 + * + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + */ + __pyx_t_3 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_3; + + /* "View.MemoryView":206 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":207 + * info.itemsize = self.itemsize + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_self->format; + } else { + __pyx_t_2 = NULL; + } + __pyx_v_info->format = __pyx_t_2; + + /* "View.MemoryView":208 + * info.readonly = 0 + * info.format = self.format if flags & PyBUF_FORMAT else NULL + * info.obj = self # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":182 + * _allocate_buffer(self) + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + __pyx_t_1 = (__pyx_v_self->callback_free_data != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + if (__pyx_v_self->free_data) { + } else { + __pyx_t_1 = __pyx_v_self->free_data; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->data != NULL); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":215 + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) # <<<<<<<<<<<<<< + * free(self.data) + * PyObject_Free(self._shape) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + */ + } + + /* "View.MemoryView":216 + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data and self.data is not NULL: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + */ + } + __pyx_L3:; + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, self._strides, self.ndim, inc=False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * info.obj = self + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ +} + +/* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":221 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":219 + * PyObject_Free(self._shape) + * + * @property # <<<<<<<<<<<<<< + * def memview(self): + * return self.get_memview() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_memview", 1); + + /* "View.MemoryView":225 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":226 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 226, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":224 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + + /* "View.MemoryView":229 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":228 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getattr__", 1); + + /* "View.MemoryView":232 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":231 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":235 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":234 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 1); + + /* "View.MemoryView":238 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely((PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0))) __PYX_ERR(1, 238, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":237 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + +static int __pyx_array_allocate_buffer(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_i; + PyObject **__pyx_v_p; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":254 + * cdef PyObject **p + * + * self.free_data = True # <<<<<<<<<<<<<< + * self.data = malloc(self.len) + * if not self.data: + */ + __pyx_v_self->free_data = 1; + + /* "View.MemoryView":255 + * + * self.free_data = True + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError, "unable to allocate array data." + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + __pyx_t_1 = (!(__pyx_v_self->data != 0)); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":257 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError, "unable to allocate array data." # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __Pyx_Raise(__pyx_builtin_MemoryError, __pyx_kp_s_unable_to_allocate_array_data, 0, 0); + __PYX_ERR(1, 257, __pyx_L1_error) + + /* "View.MemoryView":256 + * self.free_data = True + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError, "unable to allocate array data." + * + */ + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":260 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":261 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len // self.itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_self->itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_self->itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 261, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_self->itemsize); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":262 + * p = self.data + * for i in range(self.len // self.itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * return 0 + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":263 + * for i in range(self.len // self.itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * return 0 + * + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":259 + * raise MemoryError, "unable to allocate array data." + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len // self.itemsize): + */ + } + + /* "View.MemoryView":264 + * p[i] = Py_None + * Py_INCREF(Py_None) + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":248 + * + * @cname("__pyx_array_allocate_buffer") + * cdef int _allocate_buffer(array self) except -1: # <<<<<<<<<<<<<< + * + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_c_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + PyObject *__pyx_v_mode = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("array_cwrapper", 1); + + /* "View.MemoryView":270 + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. # <<<<<<<<<<<<<< + * + * if buf is NULL: + */ + __pyx_t_2 = ((__pyx_v_c_mode[0]) == 'f'); + if (__pyx_t_2) { + __Pyx_INCREF(__pyx_n_s_fortran); + __pyx_t_1 = __pyx_n_s_fortran; + } else { + __Pyx_INCREF(__pyx_n_s_c); + __pyx_t_1 = __pyx_n_s_c; + } + __pyx_v_mode = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + __pyx_t_2 = (__pyx_v_buf == NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":273 + * + * if buf is NULL: + * result = array.__new__(array, shape, itemsize, format, mode) # <<<<<<<<<<<<<< + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + */ + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_shape)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_mode)) __PYX_ERR(1, 273, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_4, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 273, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":272 + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + * + * if buf is NULL: # <<<<<<<<<<<<<< + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":275 + * result = array.__new__(array, shape, itemsize, format, mode) + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + /*else*/ { + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_mode); + __Pyx_GIVEREF(__pyx_v_mode); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_mode)) __PYX_ERR(1, 275, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 275, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_tp_new_array(((PyTypeObject *)__pyx_array_type), __pyx_t_1, __pyx_t_4)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 275, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":276 + * else: + * result = array.__new__(array, shape, itemsize, format, mode, allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":278 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":268 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, char *c_mode, char *buf): # <<<<<<<<<<<<<< + * cdef array result + * cdef str mode = "fortran" if c_mode[0] == b'f' else "c" # this often comes from a constant C string. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_mode); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 304, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 304, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 304, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 1); + + /* "View.MemoryView":305 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":304 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":307 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":306 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); + __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_2; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + if (__pyx_v_use_setstate) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_136983863); + __Pyx_GIVEREF(__pyx_int_136983863); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_136983863)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":17 + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_Enum, (type(self), 0x82a3537, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 349, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_dtype_is_object); + if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 349, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 349, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, __pyx_nargs); __PYX_ERR(1, 349, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_intptr_t __pyx_t_4; + size_t __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 1); + + /* "View.MemoryView":350 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":351 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_obj != Py_None); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":353 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_3 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 353, __pyx_L1_error) + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = (((PyObject *)__pyx_v_self->view.obj) == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":356 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":354 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":352 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + __pyx_t_1 = (!__PYX_CYTHON_ATOMICS_ENABLED()); + if (__pyx_t_1) { + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = (__pyx_memoryview_thread_locks_used < 8); + if (__pyx_t_1) { + + /* "View.MemoryView":361 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":362 + * if __pyx_memoryview_thread_locks_used < 8: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":360 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":364 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = (__pyx_v_self->lock == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":366 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(1, 366, __pyx_L1_error) + + /* "View.MemoryView":365 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":363 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":358 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < 8: + */ + } + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":369 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = ((__pyx_v_self->view.format[0]) == 'O'); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_self->view.format[1]) == '\x00'); + __pyx_t_1 = __pyx_t_2; + __pyx_L12_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":368 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":371 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L11:; + + /* "View.MemoryView":373 + * self.dtype_is_object = dtype_is_object + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 # <<<<<<<<<<<<<< + * self.typeinfo = NULL + * + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_4 = ((Py_intptr_t)((void *)(&__pyx_v_self->acquisition_count))); + __pyx_t_5 = (sizeof(__pyx_atomic_int_type)); + if (unlikely(__pyx_t_5 == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 373, __pyx_L1_error) + } + __pyx_t_1 = ((__pyx_t_4 % __pyx_t_5) == 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 373, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 373, __pyx_L1_error) + #endif + + /* "View.MemoryView":374 + * + * assert (&self.acquisition_count) % sizeof(__pyx_atomic_int_type) == 0 + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":349 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyThread_type_lock __pyx_t_5; + PyThread_type_lock __pyx_t_6; + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":378 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":377 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + __pyx_t_1 = (((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":381 + * elif (<__pyx_buffer *> &self.view).obj == Py_None: + * + * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< + * Py_DECREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; + + /* "View.MemoryView":382 + * + * (<__pyx_buffer *> &self.view).obj = NULL + * Py_DECREF(Py_None) # <<<<<<<<<<<<<< + * + * cdef int i + */ + Py_DECREF(Py_None); + + /* "View.MemoryView":379 + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< + * + * (<__pyx_buffer *> &self.view).obj = NULL + */ + } + __pyx_L3:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_1 = (__pyx_v_self->lock != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":387 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_2 = __pyx_memoryview_thread_locks_used; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock); + if (__pyx_t_1) { + + /* "View.MemoryView":389 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_1 = (__pyx_v_i != __pyx_memoryview_thread_locks_used); + if (__pyx_t_1) { + + /* "View.MemoryView":392 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_5 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":391 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_5; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_6; + + /* "View.MemoryView":390 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":393 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":388 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":395 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":386 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":376 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ +} + +/* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_item_pointer", 1); + + /* "View.MemoryView":399 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 401, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #endif + if (__pyx_t_3 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(1, 401, __pyx_L1_error) + #else + __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 401, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 401, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":402 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 402, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":401 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":404 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":397 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 1); + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + if (__pyx_t_1) { + + /* "View.MemoryView":409 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":408 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":411 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 411, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 411, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 411, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __pyx_v_indices = __pyx_t_4; + __pyx_t_4 = 0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 414, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":415 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":414 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":417 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_5 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(1, 417, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_5; + + /* "View.MemoryView":418 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":407 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + if (unlikely(__pyx_v_self->view.readonly)) { + + /* "View.MemoryView":422 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_Cannot_assign_to_read_only_memor, 0, 0); + __PYX_ERR(1, 422, __pyx_L1_error) + + /* "View.MemoryView":421 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError, "Cannot assign to read-only memoryview" + * + */ + } + + /* "View.MemoryView":424 + * raise TypeError, "Cannot assign to read-only memoryview" + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_1 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (likely(__pyx_t_1 != Py_None)) { + PyObject* sequence = __pyx_t_1; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 424, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + #else + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 424, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_2; + __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 426, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":427 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_obj = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(1, 428, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":429 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_1 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_1, __pyx_v_obj); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":428 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":431 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_3 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 431, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_3), __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 431, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":426 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":433 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":420 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError, "Cannot assign to read-only memoryview" + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":439 + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 439, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":438 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_6); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6)) __PYX_ERR(1, 438, __pyx_L4_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 438, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":440 + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 440, __pyx_L6_except_error) + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + + /* "View.MemoryView":441 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + + /* "View.MemoryView":437 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __pyx_L6_except_error:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":436 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":443 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":435 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + __Pyx_memviewslice __pyx_v_msrc; + __Pyx_memviewslice __pyx_v_mdst; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 1); + + /* "View.MemoryView":448 + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 448, __pyx_L1_error) + __pyx_v_msrc = (__pyx_t_1[0]); + + /* "View.MemoryView":449 + * cdef __Pyx_memviewslice src_slice + * cdef __Pyx_memviewslice msrc = get_slice_from_memview(src, &src_slice)[0] + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] # <<<<<<<<<<<<<< + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 449, __pyx_L1_error) + __pyx_v_mdst = (__pyx_t_1[0]); + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice mdst = get_slice_from_memview(dst, &dst_slice)[0] + * + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 451, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = __pyx_memoryview_copy_contents(__pyx_v_msrc, __pyx_v_mdst, __pyx_t_3, __pyx_t_4, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 451, __pyx_L1_error) + + /* "View.MemoryView":445 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + char const *__pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 1); + + /* "View.MemoryView":455 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":460 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 460, __pyx_L1_error) + __pyx_v_dst_slice = __pyx_t_1; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_2 = (((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))); + if (__pyx_t_2) { + + /* "View.MemoryView":463 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_2 = (__pyx_v_tmp == NULL); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":465 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(1, 465, __pyx_L1_error) + + /* "View.MemoryView":464 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":466 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":462 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":468 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":470 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + if (__pyx_v_self->dtype_is_object) { + + /* "View.MemoryView":472 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":471 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":474 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 474, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_2 = (__pyx_v_self->view.suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":479 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_4 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 479, __pyx_L6_error) + + /* "View.MemoryView":478 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":480 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":483 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); + __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":453 + * memoryview_copy_contents(msrc, mdst, src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("setitem_indexed", 1); + + /* "View.MemoryView":486 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 486, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":487 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 487, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":485 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":492 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 492, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":495 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 495, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":497 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError, "Unable to convert item to object" + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 497, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_9 = __Pyx_ssize_strlen(__pyx_v_self->view.format); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(1, 501, __pyx_L5_except_error) + __pyx_t_10 = (__pyx_t_9 == 1); + if (__pyx_t_10) { + + /* "View.MemoryView":502 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 502, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":501 + * raise ValueError, "Unable to convert item to object" + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":503 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":498 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError, "Unable to convert item to object" + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_6); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 498, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_1); + + /* "View.MemoryView":499 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError, "Unable to convert item to object" # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Unable_to_convert_item_to_object, 0, 0); + __PYX_ERR(1, 499, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "View.MemoryView":496 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":489 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + char *__pyx_t_9; + char *__pyx_t_10; + char *__pyx_t_11; + char *__pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":508 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_struct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + if (__pyx_t_2) { + + /* "View.MemoryView":514 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 514, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":513 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":516 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = NULL; + __pyx_t_6 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_6 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_v_value}; + __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(1, 516, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 518, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_8 = __pyx_v_bytesvalue; + __pyx_t_10 = PyBytes_AS_STRING(__pyx_t_8); + __pyx_t_11 = (__pyx_t_10 + PyBytes_GET_SIZE(__pyx_t_8)); + for (__pyx_t_12 = __pyx_t_10; __pyx_t_12 < __pyx_t_11; __pyx_t_12++) { + __pyx_t_9 = __pyx_t_12; + __pyx_v_c = (__pyx_t_9[0]); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_7; + + /* "View.MemoryView":518 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":519 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "View.MemoryView":505 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + +/* Python wrapper */ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +CYTHON_UNUSED static int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + char *__pyx_t_4; + void *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + if (unlikely(__pyx_v_info == NULL)) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":524 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError, "Cannot create writable memory view from read-only memoryview" # <<<<<<<<<<<<<< + * + * if flags & PyBUF_ND: + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Cannot_create_writable_memory_vi, 0, 0); + __PYX_ERR(1, 524, __pyx_L1_error) + + /* "View.MemoryView":523 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + */ + } + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":527 + * + * if flags & PyBUF_ND: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_3 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_3; + + /* "View.MemoryView":526 + * raise ValueError, "Cannot create writable memory view from read-only memoryview" + * + * if flags & PyBUF_ND: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":529 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":532 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_3 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_3; + + /* "View.MemoryView":531 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":534 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":537 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_3 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_3; + + /* "View.MemoryView":536 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":539 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":542 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":541 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":544 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":546 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_5 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_5; + + /* "View.MemoryView":547 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_6 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":548 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_7 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_7; + + /* "View.MemoryView":549 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_7 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_7; + + /* "View.MemoryView":550 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":551 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_GIVEREF((PyObject *)__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":521 + * itemp[i] = c + * + * @cname('getbuffer') # <<<<<<<<<<<<<< + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":556 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 556, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 556, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":557 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(1, 557, __pyx_L1_error) + + /* "View.MemoryView":558 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * + * @property # <<<<<<<<<<<<<< + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":562 + * @property + * def base(self): + * return self._get_base() # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->_get_base(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 562, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":560 + * return result + * + * @property # <<<<<<<<<<<<<< + * def base(self): + * return self._get_base() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.base.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +static PyObject *__pyx_memoryview__get_base(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":565 + * + * cdef _get_base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":564 + * return self._get_base() + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_7genexpr__pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":569 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_7genexpr__pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_7genexpr__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } /* exit inner scope */ + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 569, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":567 + * return self.obj + * + * @property # <<<<<<<<<<<<<< + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr1__pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + __pyx_t_1 = (__pyx_v_self->view.strides == NULL); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":575 + * if self.view.strides == NULL: + * + * raise ValueError, "Buffer view does not expose strides" # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Buffer_view_does_not_expose_stri, 0, 0); + __PYX_ERR(1, 575, __pyx_L1_error) + + /* "View.MemoryView":573 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError, "Buffer view does not expose strides" + */ + } + + /* "View.MemoryView":577 + * raise ValueError, "Buffer view does not expose strides" + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr1__pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr1__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def strides(self): + * if self.view.strides == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_8genexpr2__pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = (__pyx_v_self->view.suboffsets == NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PySequence_Multiply(__pyx_tuple__4, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":584 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + { /* enter inner scope */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.suboffsets; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_8genexpr2__pyx_v_suboffset = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_8genexpr2__pyx_v_suboffset); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } /* exit inner scope */ + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":579 + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def suboffsets(self): + * if self.view.suboffsets == NULL: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":588 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 588, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":586 + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + * + * @property # <<<<<<<<<<<<<< + * def ndim(self): + * return self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":592 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 592, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":590 + * return self.view.ndim + * + * @property # <<<<<<<<<<<<<< + * def itemsize(self): + * return self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":596 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 596, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":594 + * return self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def nbytes(self): + * return self.size * self.view.itemsize + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 1); + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":601 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":603 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_t_5 = PyInt_FromSsize_t((__pyx_t_2[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 603, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":604 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_5 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 604, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_5); + __pyx_t_5 = 0; + } + + /* "View.MemoryView":606 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":600 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":608 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":598 + * return self.size * self.view.itemsize + * + * @property # <<<<<<<<<<<<<< + * def size(self): + * if self._size is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = (__pyx_v_self->view.ndim >= 1); + if (__pyx_t_1) { + + /* "View.MemoryView":612 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":611 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":614 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 1); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":618 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":617 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":616 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 1); + + /* "View.MemoryView":621 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 621, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_c_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_c_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_c_contig", 1); + + /* "View.MemoryView":627 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 627, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":628 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 628, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":624 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("is_f_contig", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_f_contig", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_f_contig", 1); + + /* "View.MemoryView":633 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(1, 633, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":634 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":630 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy", 1); + + /* "View.MemoryView":638 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":640 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":641 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 641, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":646 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 646, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":636 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("copy_fortran", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "copy_fortran", 0))) return NULL; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("copy_fortran", 1); + + /* "View.MemoryView":650 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":652 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":653 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 653, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":658 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":648 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 1); + + /* "View.MemoryView":663 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 663, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 663, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":664 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":665 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":662 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":669 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":668 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o) noexcept: # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_idx; + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_UCS4 __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_unellipsify", 1); + + /* "View.MemoryView":677 + * """ + * cdef Py_ssize_t idx + * tup = index if isinstance(index, tuple) else (index,) # <<<<<<<<<<<<<< + * + * result = [slice(None)] * ndim + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_index); + if (__pyx_t_2) { + __Pyx_INCREF(((PyObject*)__pyx_v_index)); + __pyx_t_1 = __pyx_v_index; + } else { + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index)) __PYX_ERR(1, 677, __pyx_L1_error); + __pyx_t_1 = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_v_tup = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_1 = PyList_New(1 * ((__pyx_v_ndim<0) ? 0:__pyx_v_ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_ndim; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error); + } + } + __pyx_v_result = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":680 + * + * result = [slice(None)] * ndim + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * idx = 0 + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":681 + * result = [slice(None)] * ndim + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * idx = 0 + * for item in tup: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":682 + * have_slices = False + * seen_ellipsis = False + * idx = 0 # <<<<<<<<<<<<<< + * for item in tup: + * if item is Ellipsis: + */ + __pyx_v_idx = 0; + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 683, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_1); + __pyx_t_4 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #endif + if (__pyx_t_4 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(1, 683, __pyx_L1_error) + #else + __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 683, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + __pyx_t_2 = (!__pyx_v_seen_ellipsis); + if (__pyx_t_2) { + + /* "View.MemoryView":686 + * if item is Ellipsis: + * if not seen_ellipsis: + * idx += ndim - len(tup) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * have_slices = True + */ + if (unlikely(__pyx_v_tup == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 686, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(__pyx_v_tup); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 686, __pyx_L1_error) + __pyx_v_idx = (__pyx_v_idx + (__pyx_v_ndim - __pyx_t_5)); + + /* "View.MemoryView":687 + * if not seen_ellipsis: + * idx += ndim - len(tup) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":685 + * for item in tup: + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * idx += ndim - len(tup) + * seen_ellipsis = True + */ + } + + /* "View.MemoryView":688 + * idx += ndim - len(tup) + * seen_ellipsis = True + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if isinstance(item, slice): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":684 + * idx = 0 + * for item in tup: + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * idx += ndim - len(tup) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + if (__pyx_t_2) { + + /* "View.MemoryView":691 + * else: + * if isinstance(item, slice): + * have_slices = True # <<<<<<<<<<<<<< + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":690 + * have_slices = True + * else: + * if isinstance(item, slice): # <<<<<<<<<<<<<< + * have_slices = True + * elif not PyIndex_Check(item): + */ + goto __pyx_L7; + } + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + __pyx_t_2 = (!(PyIndex_Check(__pyx_v_item) != 0)); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":693 + * have_slices = True + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" # <<<<<<<<<<<<<< + * result[idx] = item + * idx += 1 + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_6 = 127; + __Pyx_INCREF(__pyx_kp_u_Cannot_index_with_type); + __pyx_t_5 += 24; + __Pyx_GIVEREF(__pyx_kp_u_Cannot_index_with_type); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Cannot_index_with_type); + __pyx_t_7 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_item)), __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6; + __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_kp_u__6); + __pyx_t_5 += 1; + __Pyx_GIVEREF(__pyx_kp_u__6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__6); + __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_t_7, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(1, 693, __pyx_L1_error) + + /* "View.MemoryView":692 + * if isinstance(item, slice): + * have_slices = True + * elif not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + */ + } + __pyx_L7:; + + /* "View.MemoryView":694 + * elif not PyIndex_Check(item): + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item # <<<<<<<<<<<<<< + * idx += 1 + * + */ + if (unlikely((__Pyx_SetItemInt(__pyx_v_result, __pyx_v_idx, __pyx_v_item, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1) < 0))) __PYX_ERR(1, 694, __pyx_L1_error) + } + __pyx_L5:; + + /* "View.MemoryView":695 + * raise TypeError, f"Cannot index with type '{type(item)}'" + * result[idx] = item + * idx += 1 # <<<<<<<<<<<<<< + * + * nslices = ndim - idx + */ + __pyx_v_idx = (__pyx_v_idx + 1); + + /* "View.MemoryView":683 + * seen_ellipsis = False + * idx = 0 + * for item in tup: # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":697 + * idx += 1 + * + * nslices = ndim - idx # <<<<<<<<<<<<<< + * return have_slices or nslices, tuple(result) + * + */ + __pyx_v_nslices = (__pyx_v_ndim - __pyx_v_idx); + + /* "View.MemoryView":698 + * + * nslices = ndim - idx + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_7 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __pyx_t_7; + __pyx_t_7 = 0; + __pyx_L9_bool_binop_done:; + __pyx_t_7 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 698, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_7); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7)) __PYX_ERR(1, 698, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_7 = 0; + __pyx_r = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":671 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static int assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + int __pyx_r; + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "View.MemoryView":701 + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + __pyx_t_4 = (__pyx_v_suboffset >= 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":703 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" # <<<<<<<<<<<<<< + * return 0 # return type just used as an error flag + * + */ + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_s_Indirect_dimensions_not_supporte, 0, 0); + __PYX_ERR(1, 703, __pyx_L1_error) + + /* "View.MemoryView":702 + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag + */ + } + } + + /* "View.MemoryView":704 + * if suboffset >= 0: + * raise ValueError, "Indirect dimensions not supported" + * return 0 # return type just used as an error flag # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":700 + * return have_slices or nslices, tuple(result) + * + * cdef int assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim) except -1: # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + Py_ssize_t __pyx_v_cindex; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + struct __pyx_memoryview_obj *__pyx_t_3; + char *__pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + PyObject *(*__pyx_t_7)(PyObject *); + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memview_slice", 1); + + /* "View.MemoryView":712 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":719 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":723 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(__pyx_assertions_enabled())) { + __pyx_t_1 = (__pyx_v_memview->view.ndim > 0); + if (unlikely(!__pyx_t_1)) { + __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); + __PYX_ERR(1, 723, __pyx_L1_error) + } + } + #else + if ((1)); else __PYX_ERR(1, 723, __pyx_L1_error) + #endif + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":726 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 726, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":727 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":725 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":729 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":730 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":736 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_3 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_3; + + /* "View.MemoryView":737 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_4; + + /* "View.MemoryView":742 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step, cindex + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":743 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step, cindex + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + __pyx_t_5 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_2 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_2); + __pyx_t_6 = 0; + __pyx_t_7 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 747, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_7)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + { + Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #endif + if (__pyx_t_6 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely((0 < 0))) __PYX_ERR(1, 747, __pyx_L1_error) + #else + __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_7(__pyx_t_2); + if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 747, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_dim = __pyx_t_5; + __pyx_t_5 = (__pyx_t_5 + 1); + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + __pyx_t_1 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":749 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * cindex = index # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 749, __pyx_L1_error) + __pyx_v_cindex = __pyx_t_9; + + /* "View.MemoryView":750 + * if PyIndex_Check(index): + * cindex = index + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_cindex, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 750, __pyx_L1_error) + + /* "View.MemoryView":748 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * cindex = index + * slice_memviewslice( + */ + goto __pyx_L6; + } + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_1 = (__pyx_v_index == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":757 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":758 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":759 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":760 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":756 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":762 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 762, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 762, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 762, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_9; + + /* "View.MemoryView":763 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 763, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 763, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 763, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_9; + + /* "View.MemoryView":764 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 764, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 764, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else { + __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 764, __pyx_L1_error) + __pyx_t_9 = __pyx_t_11; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_9 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_9; + + /* "View.MemoryView":766 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":767 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 767, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":768 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = (__pyx_t_8 != Py_None); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":770 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_10 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 770, __pyx_L1_error) + + /* "View.MemoryView":776 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":747 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * cindex = index + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":780 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 780, __pyx_L1_error) } + + /* "View.MemoryView":781 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 781, __pyx_L1_error) } + + /* "View.MemoryView":779 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 779, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":778 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF((PyObject *)__pyx_r); + + /* "View.MemoryView":785 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":784 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_memoryview_type))))) __PYX_ERR(1, 784, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":711 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = (!__pyx_v_is_slice); + if (__pyx_t_1) { + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = (__pyx_v_start < 0); + if (__pyx_t_1) { + + /* "View.MemoryView":816 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":815 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = (!__pyx_t_1); + if (__pyx_t_2) { + + /* "View.MemoryView":818 + * start += shape + * if not 0 <= start < shape: + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 818, __pyx_L1_error) + + /* "View.MemoryView":817 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(PyExc_IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":813 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_have_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":822 + * + * if have_step: + * negative_step = step < 0 # <<<<<<<<<<<<<< + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + */ + __pyx_v_negative_step = (__pyx_v_step < 0); + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + __pyx_t_2 = (__pyx_v_step == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":824 + * negative_step = step < 0 + * if step == 0: + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * negative_step = False + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 824, __pyx_L1_error) + + /* "View.MemoryView":823 + * if have_step: + * negative_step = step < 0 + * if step == 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":821 + * else: + * + * if have_step: # <<<<<<<<<<<<<< + * negative_step = step < 0 + * if step == 0: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":826 + * _err_dim(PyExc_ValueError, "Step may not be zero (axis %d)", dim) + * else: + * negative_step = False # <<<<<<<<<<<<<< + * step = 1 + * + */ + /*else*/ { + __pyx_v_negative_step = 0; + + /* "View.MemoryView":827 + * else: + * negative_step = False + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + } + __pyx_L6:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":832 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = (__pyx_v_start < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":834 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":833 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":831 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = (__pyx_v_start >= __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + if (__pyx_v_negative_step) { + + /* "View.MemoryView":837 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":836 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L11; + } + + /* "View.MemoryView":839 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L11:; + + /* "View.MemoryView":835 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L9:; + + /* "View.MemoryView":830 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L8; + } + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":842 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":841 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":844 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L12:; + } + __pyx_L8:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = (__pyx_v_stop < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":850 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":849 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":847 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = (__pyx_v_stop > __pyx_v_shape); + if (__pyx_t_2) { + + /* "View.MemoryView":852 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":851 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L14:; + + /* "View.MemoryView":846 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L13; + } + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + if (__pyx_v_negative_step) { + + /* "View.MemoryView":855 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":854 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L16; + } + + /* "View.MemoryView":857 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L16:; + } + __pyx_L13:; + + /* "View.MemoryView":861 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":864 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":863 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = (__pyx_v_new_shape < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":867 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":866 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":870 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":871 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":872 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = ((__pyx_v_suboffset_dim[0]) < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":875 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":878 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L19:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = (!__pyx_v_is_slice); + if (__pyx_t_2) { + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = (__pyx_v_new_ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":883 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":882 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L22; + } + + /* "View.MemoryView":885 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":886 + * else: + * _err_dim(PyExc_IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(PyExc_IndexError, __pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 885, __pyx_L1_error) + } + __pyx_L22:; + + /* "View.MemoryView":881 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L21; + } + + /* "View.MemoryView":888 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L21:; + + /* "View.MemoryView":880 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":890 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":793 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_UCS4 __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("pybuffer_index", 1); + + /* "View.MemoryView":898 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":899 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + __pyx_t_2 = (__pyx_v_view->ndim == 0); + if (__pyx_t_2) { + + /* "View.MemoryView":903 + * + * if view.ndim == 0: + * shape = view.len // itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 903, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":904 + * if view.ndim == 0: + * shape = view.len // itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":902 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len // itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":906 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":907 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = (__pyx_v_view->suboffsets != NULL); + if (__pyx_t_2) { + + /* "View.MemoryView":909 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":908 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index < 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":914 + * index += view.shape[dim] + * if index < 0: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_5 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u__7); + __pyx_t_5 = __Pyx_PyUnicode_Join(__pyx_t_3, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 914, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 914, __pyx_L1_error) + + /* "View.MemoryView":913 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":911 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + __pyx_t_2 = (__pyx_v_index >= __pyx_v_shape); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":917 + * + * if index >= shape: + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = 0; + __pyx_t_4 = 127; + __Pyx_INCREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_1 += 37; + __Pyx_GIVEREF(__pyx_kp_u_Out_of_bounds_on_buffer_access_a); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_Out_of_bounds_on_buffer_access_a); + __pyx_t_3 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_dim, 0, ' ', 'd'); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_1 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u__7); + __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_5, 3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 917, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 917, __pyx_L1_error) + + /* "View.MemoryView":916 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + */ + } + + /* "View.MemoryView":919 + * raise IndexError, f"Out of bounds on buffer access (axis {dim})" + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = (__pyx_v_suboffset >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":920 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":923 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":896 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":930 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":932 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":933 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":937 + * + * cdef int i, j + * for i in range(ndim // 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":938 + * cdef int i, j + * for i in range(ndim // 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":939 + * for i in range(ndim // 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":940 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = ((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":943 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_t_9 = __pyx_memoryview_err(PyExc_ValueError, __pyx_kp_s_Cannot_transpose_memoryview_with); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L1_error) + + /* "View.MemoryView":942 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":945 + * _err(PyExc_ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":929 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) except -1 nogil: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + + /* "View.MemoryView":964 + * + * def __dealloc__(self): + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XCLEAR_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":963 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("convert_item_to_object", 1); + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_object_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":968 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 968, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":967 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":970 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 970, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":966 + * __PYX_XCLEAR_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assign_item_from_object", 1); + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = (__pyx_v_self->to_dtype_func != NULL); + if (__pyx_t_1) { + + /* "View.MemoryView":974 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 974, __pyx_L1_error) + + /* "View.MemoryView":973 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":976 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * cdef _get_base(self): + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":972 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +static PyObject *__pyx_memoryviewslice__get_base(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_get_base", 1); + + /* "View.MemoryView":979 + * + * cdef _get_base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":978 + * memoryview.assign_item_from_object(self, itemp, value) + * + * cdef _get_base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + if (unlikely(__pyx_nargs > 0)) { + __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} + if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 1); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[1] = {0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 1)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + } + __pyx_v___pyx_state = values[0]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 1); + + /* "(tree fragment)":4 + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< + */ + __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_fromslice", 1); + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = (((PyObject *)__pyx_v_memviewslice.memview) == Py_None); + if (__pyx_t_1) { + + /* "View.MemoryView":1008 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1007 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1013 + * + * + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0)) __PYX_ERR(1, 1013, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error); + __pyx_t_2 = 0; + __pyx_t_2 = ((PyObject *)__pyx_tp_new__memoryviewslice(((PyTypeObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF((PyObject *)__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1015 + * result = _memoryviewslice.__new__(_memoryviewslice, None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1016 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview)._get_base() + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1018 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview)._get_base() # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->__pyx_vtab)->_get_base(((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1018, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1019 + * + * result.from_object = ( memviewslice.memview)._get_base() + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1021 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1022 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1023 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1024 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1025 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1028 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1027 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1030 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1032 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1033 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1036 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1037 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = (__pyx_v_suboffset >= 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1039 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1040 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1038 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1042 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1043 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1043, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1044 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1044, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1046 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1047 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1049 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_result); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":999 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_slice_from_memview", 1); + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1056 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1056, __pyx_L1_error) + __pyx_t_2 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1057 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1055 + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1059 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1060 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1052 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice) except NULL: + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1067 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1068 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1069 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1071 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1072 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1074 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1075 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1076 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1077 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + __pyx_t_6 = (__pyx_v_suboffsets != 0); + if (__pyx_t_6) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1063 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst) noexcept: # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ +} + +/* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy", 1); + + /* "View.MemoryView":1083 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1084 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1084, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1080 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *(*__pyx_t_2)(char *); + int (*__pyx_t_3)(char *, PyObject *); + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 1); + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + if (__pyx_t_1) { + + /* "View.MemoryView":1095 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_2 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_2; + + /* "View.MemoryView":1096 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_3; + + /* "View.MemoryView":1094 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1098 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1099 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1101 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1103 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1087 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + + /* "View.MemoryView":1110 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: + * return -arg if arg < 0 else arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + __pyx_t_2 = (__pyx_v_arg < 0); + if (__pyx_t_2) { + __pyx_t_1 = (-__pyx_v_arg); + } else { + __pyx_t_1 = __pyx_v_arg; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":1109 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) noexcept nogil: # <<<<<<<<<<<<<< + * return -arg if arg < 0 else arg + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1118 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1119 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1121 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1123 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1124 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1122 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1126 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = ((__pyx_v_mslice->shape[__pyx_v_i]) > 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1128 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1129 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1127 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = (abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)); + if (__pyx_t_2) { + + /* "View.MemoryView":1132 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1131 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1134 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1113 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + + /* "View.MemoryView":1144 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1146 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = (__pyx_v_src_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_dst_stride > 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1151 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_1 = __pyx_t_2; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1152 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1150 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1154 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1155 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1156 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1157 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1149 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1159 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_3 = __pyx_v_dst_extent; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":1160 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1164 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1165 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1137 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1170 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1167 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + + /* "View.MemoryView":1176 + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for shape in src.shape[:ndim]: + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1178 + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + * + * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< + * size *= shape + * + */ + __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); + for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_shape = (__pyx_t_2[0]); + + /* "View.MemoryView":1179 + * + * for shape in src.shape[:ndim]: + * size *= shape # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * __pyx_v_shape); + } + + /* "View.MemoryView":1181 + * size *= shape + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1174 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) noexcept nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef Py_ssize_t shape, size = src.memview.view.itemsize + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = (__pyx_v_order == 'F'); + if (__pyx_t_1) { + + /* "View.MemoryView":1194 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1195 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1196 + * for idx in range(ndim): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1193 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1198 + * stride *= shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride *= shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1199 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride *= shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1200 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride *= shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1202 + * stride *= shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1184 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) noexcept nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1216 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1217 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1219 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err_no_memory() + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + __pyx_t_2 = (!(__pyx_v_result != 0)); + if (__pyx_t_2) { + + /* "View.MemoryView":1221 + * result = malloc(size) + * if not result: + * _err_no_memory() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_no_memory(); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1221, __pyx_L1_error) + + /* "View.MemoryView":1220 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err_no_memory() + * + */ + } + + /* "View.MemoryView":1224 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1225 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1226 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1227 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1228 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1230 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, ndim, order) # <<<<<<<<<<<<<< + * + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = ((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = __pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1205 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_UCS4 __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = PyTuple_New(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = 0; + __pyx_t_3 = 127; + __Pyx_INCREF(__pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_2 += 35; + __Pyx_GIVEREF(__pyx_kp_u_got_differing_extents_in_dimensi); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_got_differing_extents_in_dimensi); + __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_i, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_got); + __pyx_t_2 += 6; + __Pyx_GIVEREF(__pyx_kp_u_got); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_got); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent1, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u_and); + __pyx_t_2 += 5; + __Pyx_GIVEREF(__pyx_kp_u_and); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_kp_u_and); + __pyx_t_4 = __Pyx_PyUnicode_From_Py_ssize_t(__pyx_v_extent2, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_4); + __pyx_t_4 = 0; + __Pyx_INCREF(__pyx_kp_u__7); + __pyx_t_2 += 1; + __Pyx_GIVEREF(__pyx_kp_u__7); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_kp_u__7); + __pyx_t_4 = __Pyx_PyUnicode_Join(__pyx_t_1, 7, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_builtin_ValueError, __pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError, f"got differing extents in dimension {i} (got {extent1} and {extent2})" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, PyObject *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1253 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: + * raise error, msg % dim # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_v_msg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_t_2, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1253, __pyx_L1_error) + + /* "View.MemoryView":1252 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg % dim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, PyObject *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_msg); + + /* "View.MemoryView":1257 + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: + * raise error, msg # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_no_memory') + */ + __Pyx_Raise(((PyObject *)__pyx_v_error), __pyx_v_msg, 0, 0); + __PYX_ERR(1, 1257, __pyx_L1_error) + + /* "View.MemoryView":1256 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(PyObject *error, str msg) except -1 with gil: # <<<<<<<<<<<<<< + * raise error, msg + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + +static int __pyx_memoryview_err_no_memory(void) { + int __pyx_r; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1261 + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: + * raise MemoryError # <<<<<<<<<<<<<< + * + * + */ + PyErr_NoMemory(); __PYX_ERR(1, 1261, __pyx_L1_error) + + /* "View.MemoryView":1260 + * + * @cname('__pyx_memoryview_err_no_memory') + * cdef int _err_no_memory() except -1 with gil: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView._err_no_memory", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save; + #endif + + /* "View.MemoryView":1273 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1274 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1276 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1277 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1278 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = (__pyx_v_src_ndim < __pyx_v_dst_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1282 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1281 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = (__pyx_v_dst_ndim < __pyx_v_src_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1284 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1283 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1286 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + __pyx_t_2 = (__pyx_t_3 > __pyx_t_4); + if (__pyx_t_2) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1288 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = ((__pyx_v_src.shape[__pyx_v_i]) == 1); + if (__pyx_t_2) { + + /* "View.MemoryView":1291 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1292 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1290 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1294 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1294, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1289 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = ((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1297 + * + * if src.suboffsets[i] >= 0: + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(PyExc_ValueError, __pyx_kp_s_Dimension_d_is_not_direct, __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1297, __pyx_L1_error) + + /* "View.MemoryView":1296 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = __pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = (!__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim)); + if (__pyx_t_2) { + + /* "View.MemoryView":1302 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1301 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1304 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1304, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1305 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1299 + * _err_dim(PyExc_ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (!__pyx_v_broadcasting); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1311 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1310 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = __pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim); + if (__pyx_t_2) { + + /* "View.MemoryView":1313 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1312 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + if (__pyx_v_direct_copy) { + + /* "View.MemoryView":1317 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1318 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1319 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1320 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1321 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1315 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + } + + /* "View.MemoryView":1307 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + if (__pyx_t_2) { + + /* "View.MemoryView":1326 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1326, __pyx_L1_error) + + /* "View.MemoryView":1327 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 1327, __pyx_L1_error) + + /* "View.MemoryView":1323 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1329 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1330 + * + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1331 + * refcount_copying(&dst, dtype_is_object, ndim, inc=False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1333 + * refcount_copying(&dst, dtype_is_object, ndim, inc=True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1334 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1265 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1341 + * int ndim_other) noexcept nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1343 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1344 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1345 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1346 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1348 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1349 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1350 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1351 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1337 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + if (__pyx_v_dtype_is_object) { + + /* "View.MemoryView":1362 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1361 + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, dst.strides, ndim, inc) + * + */ + } + + /* "View.MemoryView":1359 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil: # <<<<<<<<<<<<<< + * + * if dtype_is_object: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + + /* "View.MemoryView":1368 + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1365 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) noexcept with gil: + */ + + /* function exit code */ + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1374 + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * + * for i in range(shape[0]): + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1376 + * cdef Py_ssize_t stride = strides[0] + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = (__pyx_v_ndim == 1); + if (__pyx_t_4) { + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + if (__pyx_v_inc) { + + /* "View.MemoryView":1379 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1378 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1381 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1377 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1383 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += stride + */ + /*else*/ { + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1385 + * refcount_objects_in_slice(data, shape + 1, strides + 1, ndim - 1, inc) + * + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1371 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc) noexcept: + * cdef Py_ssize_t i + */ + + /* function exit code */ +} + +/* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1394 + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1395 + * bint dtype_is_object) noexcept nogil: + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) # <<<<<<<<<<<<<< + * refcount_copying(dst, dtype_is_object, ndim, inc=True) + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1396 + * refcount_copying(dst, dtype_is_object, ndim, inc=False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, inc=True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1391 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) noexcept nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1404 + * size_t itemsize, void *item) noexcept nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1405 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = (__pyx_v_ndim == 1); + if (__pyx_t_1) { + + /* "View.MemoryView":1408 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1409 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1410 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1407 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1412 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1413 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) # <<<<<<<<<<<<<< + * data += stride + * + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1414 + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1400 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) noexcept nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, +#if CYTHON_METH_FASTCALL +PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds +#else +PyObject *__pyx_args, PyObject *__pyx_kwds +#endif +) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + #if !CYTHON_METH_FASTCALL + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + #endif + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + #if !CYTHON_METH_FASTCALL + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + #endif + __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { + (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); + values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); + values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 1); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__8, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_v___pyx_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_2 = (__pyx_v___pyx_state != Py_None); + if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 1); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 > 1); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) { + PyObject *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":248 + * """Returns a borrowed reference to the object owning the data/memory. + * """ + * return PyArray_BASE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_BASE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":245 + * + * @property + * cdef inline PyObject* base(self) nogil: # <<<<<<<<<<<<<< + * """Returns a borrowed reference to the object owning the data/memory. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + +static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArrayObject *__pyx_v_self) { + PyArray_Descr *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyArray_Descr *__pyx_t_1; + __Pyx_RefNannySetupContext("descr", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":254 + * """Returns an owned reference to the dtype of the array. + * """ + * return PyArray_DESCR(self) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __pyx_t_1 = PyArray_DESCR(__pyx_v_self); + __Pyx_INCREF((PyObject *)((PyArray_Descr *)__pyx_t_1)); + __pyx_r = ((PyArray_Descr *)__pyx_t_1); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":251 + * + * @property + * cdef inline dtype descr(self): # <<<<<<<<<<<<<< + * """Returns an owned reference to the dtype of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + +static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":260 + * """Returns the number of dimensions in the array. + * """ + * return PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_NDIM(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":257 + * + * @property + * cdef inline int ndim(self) nogil: # <<<<<<<<<<<<<< + * """Returns the number of dimensions in the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":268 + * Can return NULL for 0-dimensional arrays. + * """ + * return PyArray_DIMS(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_DIMS(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":263 + * + * @property + * cdef inline npy_intp *shape(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the dimensions/shape of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + +static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) { + npy_intp *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":275 + * The number of elements matches the number of dimensions of the array (ndim). + * """ + * return PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_STRIDES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":271 + * + * @property + * cdef inline npy_intp *strides(self) nogil: # <<<<<<<<<<<<<< + * """Returns a pointer to the strides of the array. + * The number of elements matches the number of dimensions of the array (ndim). + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + +static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) { + npy_intp __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":281 + * """Returns the total size (in number of elements) of the array. + * """ + * return PyArray_SIZE(self) # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_r = PyArray_SIZE(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":278 + * + * @property + * cdef inline npy_intp size(self) nogil: # <<<<<<<<<<<<<< + * """Returns the total size (in number of elements) of the array. + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) { + char *__pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":290 + * of `PyArray_DATA()` instead, which returns a 'void*'. + * """ + * return PyArray_BYTES(self) # <<<<<<<<<<<<<< + * + * ctypedef unsigned char npy_bool + */ + __pyx_r = PyArray_BYTES(__pyx_v_self); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":284 + * + * @property + * cdef inline char* data(self) nogil: # <<<<<<<<<<<<<< + * """The pointer to the data buffer as a char*. + * This is provided for legacy reasons to avoid direct struct field access. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":774 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":773 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":777 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":776 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":780 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":779 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":783 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":782 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":786 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":785 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":790 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":789 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":792 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":788 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":969 + * + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< + * PyArray_SetBaseObject(arr, base) + * + */ + Py_INCREF(__pyx_v_base); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":970 + * cdef inline void set_array_base(ndarray arr, object base): + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 970, __pyx_L1_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":968 + * int _import_umath() except -1 + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * Py_INCREF(base) # important to do this before stealing the reference below! + * PyArray_SetBaseObject(arr, base) + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_v_base; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":973 + * + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< + * if base is NULL: + * return None + */ + __pyx_v_base = PyArray_BASE(__pyx_v_arr); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + __pyx_t_1 = (__pyx_v_base == NULL); + if (__pyx_t_1) { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":975 + * base = PyArray_BASE(arr) + * if base is NULL: + * return None # <<<<<<<<<<<<<< + * return base + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":974 + * cdef inline object get_array_base(ndarray arr): + * base = PyArray_BASE(arr) + * if base is NULL: # <<<<<<<<<<<<<< + * return None + * return base + */ + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":976 + * if base is NULL: + * return None + * return base # <<<<<<<<<<<<<< + * + * # Versions of the import_* functions which are more suitable for + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_base)); + __pyx_r = ((PyObject *)__pyx_v_base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":972 + * PyArray_SetBaseObject(arr, base) + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * base = PyArray_BASE(arr) + * if base is NULL: + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_array", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":982 + * cdef inline int import_array() except -1: + * try: + * __pyx_import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 982, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":983 + * try: + * __pyx_import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 983, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 984, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 984, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":981 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * __pyx_import_array() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":980 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * __pyx_import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_umath", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":988 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 988, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":989 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 989, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 990, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 990, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":987 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":986 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("import_ufunc", 1); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":994 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 994, __pyx_L3_error) + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":995 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 995, __pyx_L5_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":996 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 996, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 996, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":993 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __pyx_L5_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":992 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1011 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":999 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1026 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1014 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1036 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1029 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1043 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1039 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1050 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":1046 + * + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "scaler.pyx":15 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] scaler( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] X_offset, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6scaler_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6scaler_1scaler = {"scaler", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6scaler_1scaler, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6scaler_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 15, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 15, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 15, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 15, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 15, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("scaler.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6scaler_scaler(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6scaler_scaler(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + CYTHON_UNUSED int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("scaler", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 15, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_3)) __PYX_ERR(0, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 15, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L19_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L22_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L33_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L32_next_and; + } + __pyx_L33_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_L32_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 15, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L39_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L38_next_and; + } + __pyx_L39_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L37_bool_binop_done; + } + __pyx_L38_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L37_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 15, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L29_try_end; + __pyx_L22_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("scaler.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 15, __pyx_L24_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L23_exception_handled; + } + goto __pyx_L24_except_error; + __pyx_L24_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L27_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L23_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L29_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 15, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L49; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L49:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 15, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L53; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 15, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 15, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 15, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L53:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L68_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L68_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L52_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L52_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L70_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 15, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("scaler.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_6scaler_5__pyx_fuse_0scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_6scaler_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_6scaler_scaler(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_X_offset, PyArrayObject *__pyx_v_X_scale, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_offset; + __Pyx_Buffer __pyx_pybuffer_X_offset; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_scale; + __Pyx_Buffer __pyx_pybuffer_X_scale; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0scaler", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_X_offset.pybuffer.buf = NULL; + __pyx_pybuffer_X_offset.refcount = 0; + __pyx_pybuffernd_X_offset.data = NULL; + __pyx_pybuffernd_X_offset.rcbuffer = &__pyx_pybuffer_X_offset; + __pyx_pybuffer_X_scale.pybuffer.buf = NULL; + __pyx_pybuffer_X_scale.refcount = 0; + __pyx_pybuffernd_X_scale.data = NULL; + __pyx_pybuffernd_X_scale.rcbuffer = &__pyx_pybuffer_X_scale; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_offset, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_offset.diminfo[0].strides = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_offset.diminfo[0].shape = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_scale, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_scale.diminfo[0].strides = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_scale.diminfo[0].shape = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.shape[0]; + + /* "scaler.pyx":23 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 23, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "scaler.pyx":24 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "scaler.pyx":25 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "scaler.pyx":26 + * cdef int n_cols = X.shape[1] + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "scaler.pyx":27 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] + * return X + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "scaler.pyx":28 + * for i in range(n_rows): + * for j in range(n_cols): + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] # <<<<<<<<<<<<<< + * return X + * + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_10 = __pyx_v_j; + __pyx_t_11 = __pyx_v_j; + __pyx_t_12 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)) - (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X_offset.diminfo[0].strides))) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X_scale.diminfo[0].strides))); + } + } + } + + /* "scaler.pyx":25 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "scaler.pyx":29 + * for j in range(n_cols): + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "scaler.pyx":15 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] scaler( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] X_offset, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_6scaler_5__pyx_fuse_0scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_6scaler_5__pyx_fuse_0scaler = {"__pyx_fuse_0scaler", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6scaler_5__pyx_fuse_0scaler, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6scaler_5__pyx_fuse_0scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_X_offset = 0; + PyArrayObject *__pyx_v_X_scale = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0scaler (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_X_offset,&__pyx_n_s_X_scale,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X_offset)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0scaler", 1, 3, 3, 1); __PYX_ERR(0, 15, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X_scale)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0scaler", 1, 3, 3, 2); __PYX_ERR(0, 15, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0scaler") < 0)) __PYX_ERR(0, 15, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_X_offset = ((PyArrayObject *)values[1]); + __pyx_v_X_scale = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0scaler", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 15, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("scaler.__pyx_fuse_0scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 16, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_offset), __pyx_ptype_5numpy_ndarray, 1, "X_offset", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_scale), __pyx_ptype_5numpy_ndarray, 1, "X_scale", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + __pyx_r = __pyx_pf_6scaler_4__pyx_fuse_0scaler(__pyx_self, __pyx_v_X, __pyx_v_X_offset, __pyx_v_X_scale); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6scaler_4__pyx_fuse_0scaler(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_X_offset, PyArrayObject *__pyx_v_X_scale) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_offset; + __Pyx_Buffer __pyx_pybuffer_X_offset; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_scale; + __Pyx_Buffer __pyx_pybuffer_X_scale; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0scaler", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_X_offset.pybuffer.buf = NULL; + __pyx_pybuffer_X_offset.refcount = 0; + __pyx_pybuffernd_X_offset.data = NULL; + __pyx_pybuffernd_X_offset.rcbuffer = &__pyx_pybuffer_X_offset; + __pyx_pybuffer_X_scale.pybuffer.buf = NULL; + __pyx_pybuffer_X_scale.refcount = 0; + __pyx_pybuffernd_X_scale.data = NULL; + __pyx_pybuffernd_X_scale.rcbuffer = &__pyx_pybuffer_X_scale; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_offset, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_offset.diminfo[0].strides = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_offset.diminfo[0].shape = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_scale, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_scale.diminfo[0].strides = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_scale.diminfo[0].shape = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_6scaler_scaler(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_X_offset), ((PyArrayObject *)__pyx_v_X_scale), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.__pyx_fuse_0scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_6scaler_7__pyx_fuse_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_6scaler_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_6scaler_scaler(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_X_offset, PyArrayObject *__pyx_v_X_scale, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_offset; + __Pyx_Buffer __pyx_pybuffer_X_offset; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_scale; + __Pyx_Buffer __pyx_pybuffer_X_scale; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1scaler", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_X_offset.pybuffer.buf = NULL; + __pyx_pybuffer_X_offset.refcount = 0; + __pyx_pybuffernd_X_offset.data = NULL; + __pyx_pybuffernd_X_offset.rcbuffer = &__pyx_pybuffer_X_offset; + __pyx_pybuffer_X_scale.pybuffer.buf = NULL; + __pyx_pybuffer_X_scale.refcount = 0; + __pyx_pybuffernd_X_scale.data = NULL; + __pyx_pybuffernd_X_scale.rcbuffer = &__pyx_pybuffer_X_scale; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_offset, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_offset.diminfo[0].strides = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_offset.diminfo[0].shape = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_scale, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_scale.diminfo[0].strides = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_scale.diminfo[0].shape = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.shape[0]; + + /* "scaler.pyx":23 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * with nogil: + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 23, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "scaler.pyx":24 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * with nogil: + * for i in range(n_rows): + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 24, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "scaler.pyx":25 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "scaler.pyx":26 + * cdef int n_cols = X.shape[1] + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "scaler.pyx":27 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] + * return X + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "scaler.pyx":28 + * for i in range(n_rows): + * for j in range(n_cols): + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] # <<<<<<<<<<<<<< + * return X + * + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_10 = __pyx_v_j; + __pyx_t_11 = __pyx_v_j; + __pyx_t_12 = __pyx_v_i; + __pyx_t_13 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_X.diminfo[1].strides) = (((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)) - (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X_offset.diminfo[0].strides))) * (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X_scale.diminfo[0].strides))); + } + } + } + + /* "scaler.pyx":25 + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "scaler.pyx":29 + * for j in range(n_cols): + * X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] + * return X # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "scaler.pyx":15 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] scaler( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] X_offset, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_6scaler_7__pyx_fuse_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_6scaler_7__pyx_fuse_1scaler = {"__pyx_fuse_1scaler", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6scaler_7__pyx_fuse_1scaler, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6scaler_7__pyx_fuse_1scaler(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_X_offset = 0; + PyArrayObject *__pyx_v_X_scale = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[3] = {0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1scaler (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_X_offset,&__pyx_n_s_X_scale,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X_offset)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1scaler", 1, 3, 3, 1); __PYX_ERR(0, 15, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X_scale)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1scaler", 1, 3, 3, 2); __PYX_ERR(0, 15, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1scaler") < 0)) __PYX_ERR(0, 15, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 3)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_X_offset = ((PyArrayObject *)values[1]); + __pyx_v_X_scale = ((PyArrayObject *)values[2]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1scaler", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 15, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("scaler.__pyx_fuse_1scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 16, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_offset), __pyx_ptype_5numpy_ndarray, 1, "X_offset", 0))) __PYX_ERR(0, 17, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_scale), __pyx_ptype_5numpy_ndarray, 1, "X_scale", 0))) __PYX_ERR(0, 18, __pyx_L1_error) + __pyx_r = __pyx_pf_6scaler_6__pyx_fuse_1scaler(__pyx_self, __pyx_v_X, __pyx_v_X_offset, __pyx_v_X_scale); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6scaler_6__pyx_fuse_1scaler(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_X_offset, PyArrayObject *__pyx_v_X_scale) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_offset; + __Pyx_Buffer __pyx_pybuffer_X_offset; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X_scale; + __Pyx_Buffer __pyx_pybuffer_X_scale; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1scaler", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_X_offset.pybuffer.buf = NULL; + __pyx_pybuffer_X_offset.refcount = 0; + __pyx_pybuffernd_X_offset.data = NULL; + __pyx_pybuffernd_X_offset.rcbuffer = &__pyx_pybuffer_X_offset; + __pyx_pybuffer_X_scale.pybuffer.buf = NULL; + __pyx_pybuffer_X_scale.refcount = 0; + __pyx_pybuffernd_X_scale.data = NULL; + __pyx_pybuffernd_X_scale.rcbuffer = &__pyx_pybuffer_X_scale; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_offset, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_offset.diminfo[0].strides = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_offset.diminfo[0].shape = __pyx_pybuffernd_X_offset.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_scale, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 15, __pyx_L1_error) + } + __pyx_pybuffernd_X_scale.diminfo[0].strides = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_scale.diminfo[0].shape = __pyx_pybuffernd_X_scale.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_6scaler_scaler(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_X_offset), ((PyArrayObject *)__pyx_v_X_scale), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.__pyx_fuse_1scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_offset.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_scale.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "scaler.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] yeo_johnson( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] lambdas, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6scaler_3yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6scaler_3yeo_johnson = {"yeo_johnson", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6scaler_3yeo_johnson, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6scaler_3yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_signatures = 0; + PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; + CYTHON_UNUSED PyObject *__pyx_v_defaults = 0; + PyObject *__pyx_v__fused_sigindex = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[5] = {0,0,0,0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,&__pyx_n_s_fused_sigindex,0}; + __pyx_defaults1 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_self); + values[4] = __Pyx_Arg_NewRef_VARARGS(__pyx_dynamic_args->__pyx_arg__fused_sigindex); + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_signatures)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 1); __PYX_ERR(0, 35, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_kwargs)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[2]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 2); __PYX_ERR(0, 35, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_defaults)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[3]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, 3); __PYX_ERR(0, 35, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fused_sigindex); + if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 35, __pyx_L3_error) + } + } else { + switch (__pyx_nargs) { + case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_signatures = values[0]; + __pyx_v_args = values[1]; + __pyx_v_kwargs = values[2]; + __pyx_v_defaults = values[3]; + __pyx_v__fused_sigindex = values[4]; + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 35, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("scaler.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6scaler_2yeo_johnson(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults, __pyx_v__fused_sigindex); + + /* function exit code */ + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6scaler_2yeo_johnson(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults, PyObject *__pyx_v__fused_sigindex) { + PyObject *__pyx_v_search_list = 0; + PyObject *__pyx_v_sigindex_node = 0; + PyObject *__pyx_v_dest_sig = NULL; + PyTypeObject *__pyx_v_ndarray = 0; + PyObject *__pyx_v_arg_as_memoryview = 0; + __Pyx_memviewslice __pyx_v_memslice; + Py_ssize_t __pyx_v_itemsize; + CYTHON_UNUSED int __pyx_v_dtype_signed; + Py_UCS4 __pyx_v_kind; + PyObject *__pyx_v_arg = NULL; + PyObject *__pyx_v_dtype = NULL; + PyObject *__pyx_v_arg_base = NULL; + PyObject *__pyx_v_sig = NULL; + PyObject *__pyx_v_sig_series = NULL; + PyObject *__pyx_v_last_type = NULL; + PyObject *__pyx_v_sig_type = NULL; + PyObject *__pyx_v_sigindex_matches = NULL; + PyObject *__pyx_v_sigindex_candidates = NULL; + PyObject *__pyx_v_dst_type = NULL; + PyObject *__pyx_v_found_matches = NULL; + PyObject *__pyx_v_found_candidates = NULL; + PyObject *__pyx_v_sn = NULL; + PyObject *__pyx_v_type_match = NULL; + PyObject *__pyx_v_candidates = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + __Pyx_memviewslice __pyx_t_12; + PyObject *__pyx_t_13 = NULL; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + int __pyx_t_19; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("yeo_johnson", 0); + __Pyx_INCREF(__pyx_v_kwargs); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(0, 35, __pyx_L1_error); + __pyx_v_dest_sig = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_3) { + } else { + __pyx_t_2 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_3); + __pyx_t_2 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None); + } + __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1); + __pyx_t_1 = 0; + __pyx_v_itemsize = -1L; + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_2 = (0 < __pyx_t_5); + if (__pyx_t_2) { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + __pyx_t_4 = (__pyx_v_kwargs != Py_None); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L7_bool_binop_done; + } + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_X, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_2 = __pyx_t_4; + __pyx_L7_bool_binop_done:; + if (likely(__pyx_t_2)) { + if (unlikely(__pyx_v_kwargs == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_X); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_arg = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6; + } + /*else*/ { + if (unlikely(__pyx_v_args == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_int_2); + __Pyx_GIVEREF(__pyx_int_2); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_2)) __PYX_ERR(0, 35, __pyx_L1_error); + __Pyx_INCREF(__pyx_n_s_s); + __Pyx_GIVEREF(__pyx_n_s_s); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s)) __PYX_ERR(0, 35, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_t_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_L6:; + while (1) { + __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None)); + if (__pyx_t_2) { + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L12; + } + __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_base = __pyx_t_6; + __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_dtype = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L13; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L13:; + goto __pyx_L12; + } + /*else*/ { + __Pyx_INCREF(Py_None); + __pyx_v_dtype = Py_None; + } + __pyx_L12:; + __pyx_v_itemsize = -1L; + __pyx_t_2 = (__pyx_v_dtype != Py_None); + if (__pyx_t_2) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_itemsize = __pyx_t_5; + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_kind = __pyx_t_7; + __pyx_v_dtype_signed = (__pyx_v_kind == 0x69); + switch (__pyx_v_kind) { + case 0x69: + case 0x75: + break; + case 0x66: + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_t_4 = ((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = (((Py_ssize_t)__pyx_t_5) == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L19_bool_binop_done:; + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + goto __pyx_L10_break; + } + break; + case 99: + break; + case 79: + break; + default: break; + } + } + } + __pyx_t_2 = (__pyx_v_arg == Py_None); + if (__pyx_t_2) { + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + goto __pyx_L10_break; + } + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + /*try:*/ { + __pyx_t_6 = PyMemoryView_FromObject(__pyx_v_arg); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L22_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_arg_as_memoryview = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + } + /*else:*/ { + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L33_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float32_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L32_next_and; + } + __pyx_L33_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L31_bool_binop_done; + } + __pyx_L32_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L31_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 35, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + __pyx_t_4 = (__pyx_v_itemsize == -1L); + if (!__pyx_t_4) { + goto __pyx_L39_next_or; + } else { + } + __pyx_t_5 = __Pyx_PyMemoryView_Get_itemsize(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_5 == (sizeof(__pyx_t_5numpy_float64_t))); + if (!__pyx_t_4) { + } else { + goto __pyx_L38_next_and; + } + __pyx_L39_next_or:; + __pyx_t_4 = (__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L37_bool_binop_done; + } + __pyx_L38_next_and:; + __pyx_t_11 = __Pyx_PyMemoryView_Get_ndim(__pyx_v_arg_as_memoryview); if (unlikely(__pyx_t_11 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L24_except_error) + __pyx_t_4 = (__pyx_t_11 == 2); + __pyx_t_2 = __pyx_t_4; + __pyx_L37_bool_binop_done:; + if (__pyx_t_2) { + __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(__pyx_v_arg_as_memoryview, 0); + __pyx_v_memslice = __pyx_t_12; + __pyx_t_2 = (__pyx_v_memslice.memview != 0); + if (__pyx_t_2) { + __PYX_XCLEAR_MEMVIEW((&__pyx_v_memslice), 1); + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 35, __pyx_L24_except_error) + goto __pyx_L27_try_break; + } + /*else*/ { + PyErr_Clear(); + } + } + } + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L29_try_end; + __pyx_L22_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_ValueError, __pyx_builtin_TypeError); + if (__pyx_t_11) { + __Pyx_AddTraceback("scaler.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_13) < 0) __PYX_ERR(0, 35, __pyx_L24_except_error) + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L23_exception_handled; + } + goto __pyx_L24_except_error; + __pyx_L24_except_error:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L1_error; + __pyx_L27_try_break:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + goto __pyx_L10_break; + __pyx_L23_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10); + __pyx_L29_try_end:; + } + if (unlikely((__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + goto __pyx_L10_break; + } + __pyx_L10_break:; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v__fused_sigindex); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_4 = (!__pyx_t_2); + if (__pyx_t_4) { + __pyx_t_5 = 0; + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_14), (&__pyx_t_11)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_13); + __pyx_t_13 = __pyx_t_1; + __pyx_t_1 = 0; + while (1) { + __pyx_t_15 = __Pyx_dict_iter_next(__pyx_t_13, __pyx_t_14, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_11); + if (unlikely(__pyx_t_15 == 0)) break; + if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v__fused_sigindex; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_17 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_17)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_17); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_17, __pyx_kp_s__11}; + __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_split); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + __pyx_t_15 = 0; + #if CYTHON_UNPACK_METHODS + if (likely(PyMethod_Check(__pyx_t_16))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_16); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_16, function); + __pyx_t_15 = 1; + } + } + #endif + { + PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_s__12}; + __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_16, __pyx_callargs+1-__pyx_t_15, 1+__pyx_t_15); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_t_16 = __Pyx_PySequence_ListKeepNew(__pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_18 = PyList_GET_SIZE(__pyx_t_16); + if (unlikely(__pyx_t_18 < 1)) { + __Pyx_RaiseNeedMoreValuesError(0+__pyx_t_18); __PYX_ERR(0, 35, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_18-1); + ((PyVarObject*)__pyx_t_16)->ob_size--; + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_16, __pyx_t_18-1); + #endif + __Pyx_GOTREF(__pyx_t_6); + #if !CYTHON_COMPILING_IN_CPYTHON + __pyx_t_17 = PySequence_GetSlice(__pyx_t_16, 0, __pyx_t_18-1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); + __pyx_t_16 = __pyx_t_17; __pyx_t_17 = NULL; + #else + CYTHON_UNUSED_VAR(__pyx_t_17); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_series, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + __Pyx_XDECREF_SET(__pyx_v_last_type, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __pyx_v_sig_series; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sig_type, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_sig_type, __pyx_v_sigindex_node, Py_NE)); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + if (__pyx_t_4) { + __pyx_t_6 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_sig_type, __pyx_t_6) < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_sigindex_node, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L49; + } + /*else*/ { + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItem(__pyx_v_sigindex_node, __pyx_v_sig_type); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_16 = __pyx_t_6; + __Pyx_INCREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_sigindex_node, ((PyObject*)__pyx_t_16)); + __pyx_t_16 = 0; + } + __pyx_L49:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__pyx_v_sigindex_node == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + if (unlikely((PyDict_SetItem(__pyx_v_sigindex_node, __pyx_v_last_type, __pyx_v_sig) < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_v_sigindex_matches = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v__fused_sigindex); + __Pyx_GIVEREF(__pyx_v__fused_sigindex); + if (__Pyx_PyList_SET_ITEM(__pyx_t_13, 0, __pyx_v__fused_sigindex)) __PYX_ERR(0, 35, __pyx_L1_error); + __pyx_v_sigindex_candidates = ((PyObject*)__pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __pyx_v_dest_sig; __Pyx_INCREF(__pyx_t_13); + __pyx_t_14 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_13); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #endif + if (__pyx_t_14 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_14); __Pyx_INCREF(__pyx_t_1); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_13, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_matches, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_found_candidates, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_v_dst_type == Py_None); + if (__pyx_t_4) { + __pyx_t_1 = __pyx_v_sigindex_matches; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_matches, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_v_sigindex_candidates; __Pyx_INCREF(__pyx_t_1); + __pyx_t_5 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #endif + if (__pyx_t_5 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_16 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_16); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #else + __pyx_t_16 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_16); + __pyx_t_16 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_16 = __Pyx_PyDict_Values(((PyObject*)__pyx_v_sn)); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_19 = __Pyx_PyList_Extend(__pyx_v_found_candidates, __pyx_t_16); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L53; + } + /*else*/ { + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_sigindex_matches); + __Pyx_GIVEREF(__pyx_v_sigindex_matches); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sigindex_matches)) __PYX_ERR(0, 35, __pyx_L1_error); + __Pyx_INCREF(__pyx_v_sigindex_candidates); + __Pyx_GIVEREF(__pyx_v_sigindex_candidates); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_sigindex_candidates)) __PYX_ERR(0, 35, __pyx_L1_error); + __pyx_t_16 = __pyx_t_1; __Pyx_INCREF(__pyx_t_16); + __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_5 >= 2) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #else + __pyx_t_1 = __Pyx_PySequence_ITEM(__pyx_t_16, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_XDECREF_SET(__pyx_v_search_list, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + if (unlikely(__pyx_v_search_list == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_search_list; __Pyx_INCREF(__pyx_t_1); + __pyx_t_18 = 0; + for (;;) { + { + Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); + #if !CYTHON_ASSUME_SAFE_MACROS + if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #endif + if (__pyx_t_18 >= __pyx_temp) break; + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_18); __Pyx_INCREF(__pyx_t_6); __pyx_t_18++; if (unlikely((0 < 0))) __PYX_ERR(0, 35, __pyx_L1_error) + #else + __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + #endif + __Pyx_XDECREF_SET(__pyx_v_sn, __pyx_t_6); + __pyx_t_6 = 0; + if (unlikely(__pyx_v_sn == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyDict_GetItemDefault(((PyObject*)__pyx_v_sn), __pyx_v_dst_type, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_type_match, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = (__pyx_v_type_match != Py_None); + if (__pyx_t_4) { + __pyx_t_19 = __Pyx_PyList_Append(__pyx_v_found_matches, __pyx_v_type_match); if (unlikely(__pyx_t_19 == ((int)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } + __pyx_L53:; + __Pyx_INCREF(__pyx_v_found_matches); + __Pyx_DECREF_SET(__pyx_v_sigindex_matches, __pyx_v_found_matches); + __Pyx_INCREF(__pyx_v_found_candidates); + __Pyx_DECREF_SET(__pyx_v_sigindex_candidates, __pyx_v_found_candidates); + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_matches) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_4 = __pyx_t_2; + goto __pyx_L68_bool_binop_done; + } + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_found_candidates) != 0); + __pyx_t_4 = __pyx_t_2; + __pyx_L68_bool_binop_done:; + __pyx_t_2 = (!__pyx_t_4); + if (__pyx_t_2) { + goto __pyx_L52_break; + } + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L52_break:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L70_for_end; + __pyx_L70_for_end:; + __Pyx_INCREF(__pyx_v_sigindex_matches); + __pyx_v_candidates = __pyx_v_sigindex_matches; + __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0); + __pyx_t_4 = (!__pyx_t_2); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_14 = __Pyx_PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_14 == ((Py_ssize_t)-1))) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_14 > 1); + if (unlikely(__pyx_t_4)) { + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_Raise(__pyx_t_13, 0, 0, 0); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __PYX_ERR(0, 35, __pyx_L1_error) + } + /*else*/ { + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_signatures == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("scaler.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_search_list); + __Pyx_XDECREF(__pyx_v_sigindex_node); + __Pyx_XDECREF(__pyx_v_dest_sig); + __Pyx_XDECREF((PyObject *)__pyx_v_ndarray); + __Pyx_XDECREF(__pyx_v_arg_as_memoryview); + __Pyx_XDECREF(__pyx_v_arg); + __Pyx_XDECREF(__pyx_v_dtype); + __Pyx_XDECREF(__pyx_v_arg_base); + __Pyx_XDECREF(__pyx_v_sig); + __Pyx_XDECREF(__pyx_v_sig_series); + __Pyx_XDECREF(__pyx_v_last_type); + __Pyx_XDECREF(__pyx_v_sig_type); + __Pyx_XDECREF(__pyx_v_sigindex_matches); + __Pyx_XDECREF(__pyx_v_sigindex_candidates); + __Pyx_XDECREF(__pyx_v_dst_type); + __Pyx_XDECREF(__pyx_v_found_matches); + __Pyx_XDECREF(__pyx_v_found_candidates); + __Pyx_XDECREF(__pyx_v_sn); + __Pyx_XDECREF(__pyx_v_type_match); + __Pyx_XDECREF(__pyx_v_candidates); + __Pyx_XDECREF(__pyx_v_kwargs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_6scaler_11__pyx_fuse_0yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_6scaler_3yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_0__pyx_f_6scaler_yeo_johnson(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_lambdas, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + float __pyx_v_lmbda; + float __pyx_v_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_lambdas; + __Pyx_Buffer __pyx_pybuffer_lambdas; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + __pyx_t_double_complex __pyx_t_11; + __pyx_t_double_complex __pyx_t_12; + double __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0yeo_johnson", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_lambdas.pybuffer.buf = NULL; + __pyx_pybuffer_lambdas.refcount = 0; + __pyx_pybuffernd_lambdas.data = NULL; + __pyx_pybuffernd_lambdas.rcbuffer = &__pyx_pybuffer_lambdas; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer, (PyObject*)__pyx_v_lambdas, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_lambdas.diminfo[0].strides = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_lambdas.diminfo[0].shape = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.shape[0]; + + /* "scaler.pyx":42 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef float lmbda + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 42, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "scaler.pyx":43 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef float lmbda + * cdef float x + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 43, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "scaler.pyx":46 + * cdef float lmbda + * cdef float x + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "scaler.pyx":47 + * cdef float x + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * lmbda = lambdas[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "scaler.pyx":48 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * lmbda = lambdas[j] + * x = X[i, j] + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "scaler.pyx":49 + * for i in range(n_rows): + * for j in range(n_cols): + * lmbda = lambdas[j] # <<<<<<<<<<<<<< + * x = X[i, j] + * if lmbda == 0: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_lmbda = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_lambdas.diminfo[0].strides)); + + /* "scaler.pyx":50 + * for j in range(n_cols): + * lmbda = lambdas[j] + * x = X[i, j] # <<<<<<<<<<<<<< + * if lmbda == 0: + * if X[i, j] >= 0: + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_x = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "scaler.pyx":51 + * lmbda = lambdas[j] + * x = X[i, j] + * if lmbda == 0: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = log(x+1) + */ + __pyx_t_10 = (__pyx_v_lmbda == 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":52 + * x = X[i, j] + * if lmbda == 0: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = log(x+1) + * else: + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + __pyx_t_10 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides)) >= 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":53 + * if lmbda == 0: + * if X[i, j] >= 0: + * X[i, j] = log(x+1) # <<<<<<<<<<<<<< + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides) = log((__pyx_v_x + 1.0)); + + /* "scaler.pyx":52 + * x = X[i, j] + * if lmbda == 0: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = log(x+1) + * else: + */ + goto __pyx_L11; + } + + /* "scaler.pyx":55 + * X[i, j] = log(x+1) + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) # <<<<<<<<<<<<<< + * elif lmbda == 2: + * if X[i, j] >= 0: + */ + /*else*/ { + __pyx_t_11 = __Pyx_c_neg_double(__Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts(((-__pyx_v_x) + 1.0), 0), __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0)), __pyx_t_double_complex_from_parts(1, 0))); + __pyx_t_12 = __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_12))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 55, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_11, __pyx_t_12), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 55, __pyx_L4_error) + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + } + __pyx_L11:; + + /* "scaler.pyx":51 + * lmbda = lambdas[j] + * x = X[i, j] + * if lmbda == 0: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = log(x+1) + */ + goto __pyx_L10; + } + + /* "scaler.pyx":56 + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + */ + __pyx_t_10 = (__pyx_v_lmbda == 2.0); + if (__pyx_t_10) { + + /* "scaler.pyx":57 + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_10 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)) >= 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":58 + * elif lmbda == 2: + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda # <<<<<<<<<<<<<< + * else: + * X[i, j] = -log(-x+1) + */ + __pyx_t_12 = __Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts((__pyx_v_x + 1.0), 0), __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0)), __pyx_t_double_complex_from_parts(1, 0)); + __pyx_t_11 = __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_11))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 58, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_12, __pyx_t_11), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 58, __pyx_L4_error) + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + + /* "scaler.pyx":57 + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + goto __pyx_L12; + } + + /* "scaler.pyx":60 + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + * X[i, j] = -log(-x+1) # <<<<<<<<<<<<<< + * else: + * if X[i, j] >= 0: + */ + /*else*/ { + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides) = (-log(((-__pyx_v_x) + 1.0))); + } + __pyx_L12:; + + /* "scaler.pyx":56 + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + */ + goto __pyx_L10; + } + + /* "scaler.pyx":62 + * X[i, j] = -log(-x+1) + * else: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + /*else*/ { + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + __pyx_t_10 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides)) >= 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":63 + * else: + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda # <<<<<<<<<<<<<< + * else: + * X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + */ + __pyx_t_11 = __Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts((__pyx_v_x + 1.0), 0), __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0)), __pyx_t_double_complex_from_parts(1, 0)); + __pyx_t_12 = __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_12))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 63, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_11, __pyx_t_12), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 63, __pyx_L4_error) + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + + /* "scaler.pyx":62 + * X[i, j] = -log(-x+1) + * else: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + goto __pyx_L13; + } + + /* "scaler.pyx":65 + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + * X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) # <<<<<<<<<<<<<< + * return X + */ + /*else*/ { + __pyx_t_12 = __Pyx_c_neg_double(__Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts(((-__pyx_v_x) + 1.0), 0), __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0)), __pyx_t_double_complex_from_parts(1, 0))); + __pyx_t_11 = __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_11))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 65, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_12, __pyx_t_11), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 65, __pyx_L4_error) + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float32_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + } + __pyx_L13:; + } + __pyx_L10:; + } + } + } + + /* "scaler.pyx":46 + * cdef float lmbda + * cdef float x + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L4_error: { + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L1_error; + } + __pyx_L5:; + } + } + + /* "scaler.pyx":66 + * else: + * X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "scaler.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] yeo_johnson( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] lambdas, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.yeo_johnson", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_6scaler_11__pyx_fuse_0yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_0__pyx_mdef_6scaler_11__pyx_fuse_0yeo_johnson = {"__pyx_fuse_0yeo_johnson", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6scaler_11__pyx_fuse_0yeo_johnson, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6scaler_11__pyx_fuse_0yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_lambdas = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_0yeo_johnson (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_lambdas,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_lambdas)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0yeo_johnson", 1, 2, 2, 1); __PYX_ERR(0, 35, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_0yeo_johnson") < 0)) __PYX_ERR(0, 35, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_lambdas = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_0yeo_johnson", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 35, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("scaler.__pyx_fuse_0yeo_johnson", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 36, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_lambdas), __pyx_ptype_5numpy_ndarray, 1, "lambdas", 0))) __PYX_ERR(0, 37, __pyx_L1_error) + __pyx_r = __pyx_pf_6scaler_10__pyx_fuse_0yeo_johnson(__pyx_self, __pyx_v_X, __pyx_v_lambdas); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6scaler_10__pyx_fuse_0yeo_johnson(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_lambdas) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_lambdas; + __Pyx_Buffer __pyx_pybuffer_lambdas; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_0yeo_johnson", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_lambdas.pybuffer.buf = NULL; + __pyx_pybuffer_lambdas.refcount = 0; + __pyx_pybuffernd_lambdas.data = NULL; + __pyx_pybuffernd_lambdas.rcbuffer = &__pyx_pybuffer_lambdas; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer, (PyObject*)__pyx_v_lambdas, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_lambdas.diminfo[0].strides = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_lambdas.diminfo[0].shape = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_0__pyx_f_6scaler_yeo_johnson(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_lambdas), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.__pyx_fuse_0yeo_johnson", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pw_6scaler_13__pyx_fuse_1yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_6scaler_3yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyArrayObject *__pyx_fuse_1__pyx_f_6scaler_yeo_johnson(PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_lambdas, CYTHON_UNUSED int __pyx_skip_dispatch) { + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_rows; + int __pyx_v_n_cols; + float __pyx_v_lmbda; + float __pyx_v_x; + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_lambdas; + __Pyx_Buffer __pyx_pybuffer_lambdas; + PyArrayObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + __pyx_t_double_complex __pyx_t_11; + __pyx_t_double_complex __pyx_t_12; + double __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1yeo_johnson", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_lambdas.pybuffer.buf = NULL; + __pyx_pybuffer_lambdas.refcount = 0; + __pyx_pybuffernd_lambdas.data = NULL; + __pyx_pybuffernd_lambdas.rcbuffer = &__pyx_pybuffer_lambdas; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer, (PyObject*)__pyx_v_lambdas, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_lambdas.diminfo[0].strides = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_lambdas.diminfo[0].shape = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.shape[0]; + + /* "scaler.pyx":42 + * cdef int i + * cdef int j + * cdef int n_rows = X.shape[0] # <<<<<<<<<<<<<< + * cdef int n_cols = X.shape[1] + * cdef float lmbda + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 42, __pyx_L1_error) + __pyx_v_n_rows = (__pyx_t_1[0]); + + /* "scaler.pyx":43 + * cdef int j + * cdef int n_rows = X.shape[0] + * cdef int n_cols = X.shape[1] # <<<<<<<<<<<<<< + * cdef float lmbda + * cdef float x + */ + __pyx_t_1 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_X)); if (unlikely(__pyx_t_1 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 43, __pyx_L1_error) + __pyx_v_n_cols = (__pyx_t_1[1]); + + /* "scaler.pyx":46 + * cdef float lmbda + * cdef float x + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + _save = NULL; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "scaler.pyx":47 + * cdef float x + * with nogil: + * for i in range(n_rows): # <<<<<<<<<<<<<< + * for j in range(n_cols): + * lmbda = lambdas[j] + */ + __pyx_t_2 = __pyx_v_n_rows; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "scaler.pyx":48 + * with nogil: + * for i in range(n_rows): + * for j in range(n_cols): # <<<<<<<<<<<<<< + * lmbda = lambdas[j] + * x = X[i, j] + */ + __pyx_t_5 = __pyx_v_n_cols; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_j = __pyx_t_7; + + /* "scaler.pyx":49 + * for i in range(n_rows): + * for j in range(n_cols): + * lmbda = lambdas[j] # <<<<<<<<<<<<<< + * x = X[i, j] + * if lmbda == 0: + */ + __pyx_t_8 = __pyx_v_j; + __pyx_v_lmbda = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_lambdas.diminfo[0].strides)); + + /* "scaler.pyx":50 + * for j in range(n_cols): + * lmbda = lambdas[j] + * x = X[i, j] # <<<<<<<<<<<<<< + * if lmbda == 0: + * if X[i, j] >= 0: + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_v_x = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)); + + /* "scaler.pyx":51 + * lmbda = lambdas[j] + * x = X[i, j] + * if lmbda == 0: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = log(x+1) + */ + __pyx_t_10 = (__pyx_v_lmbda == 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":52 + * x = X[i, j] + * if lmbda == 0: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = log(x+1) + * else: + */ + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + __pyx_t_10 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides)) >= 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":53 + * if lmbda == 0: + * if X[i, j] >= 0: + * X[i, j] = log(x+1) # <<<<<<<<<<<<<< + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides) = log((__pyx_v_x + 1.0)); + + /* "scaler.pyx":52 + * x = X[i, j] + * if lmbda == 0: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = log(x+1) + * else: + */ + goto __pyx_L11; + } + + /* "scaler.pyx":55 + * X[i, j] = log(x+1) + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) # <<<<<<<<<<<<<< + * elif lmbda == 2: + * if X[i, j] >= 0: + */ + /*else*/ { + __pyx_t_11 = __Pyx_c_neg_double(__Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts(((-__pyx_v_x) + 1.0), 0), __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0)), __pyx_t_double_complex_from_parts(1, 0))); + __pyx_t_12 = __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_12))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 55, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_11, __pyx_t_12), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 55, __pyx_L4_error) + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + } + __pyx_L11:; + + /* "scaler.pyx":51 + * lmbda = lambdas[j] + * x = X[i, j] + * if lmbda == 0: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = log(x+1) + */ + goto __pyx_L10; + } + + /* "scaler.pyx":56 + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + */ + __pyx_t_10 = (__pyx_v_lmbda == 2.0); + if (__pyx_t_10) { + + /* "scaler.pyx":57 + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + __pyx_t_10 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides)) >= 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":58 + * elif lmbda == 2: + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda # <<<<<<<<<<<<<< + * else: + * X[i, j] = -log(-x+1) + */ + __pyx_t_12 = __Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts((__pyx_v_x + 1.0), 0), __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0)), __pyx_t_double_complex_from_parts(1, 0)); + __pyx_t_11 = __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_11))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 58, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_12, __pyx_t_11), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 58, __pyx_L4_error) + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + + /* "scaler.pyx":57 + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + goto __pyx_L12; + } + + /* "scaler.pyx":60 + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + * X[i, j] = -log(-x+1) # <<<<<<<<<<<<<< + * else: + * if X[i, j] >= 0: + */ + /*else*/ { + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides) = (-log(((-__pyx_v_x) + 1.0))); + } + __pyx_L12:; + + /* "scaler.pyx":56 + * else: + * X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * elif lmbda == 2: # <<<<<<<<<<<<<< + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + */ + goto __pyx_L10; + } + + /* "scaler.pyx":62 + * X[i, j] = -log(-x+1) + * else: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + /*else*/ { + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + __pyx_t_10 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides)) >= 0.0); + if (__pyx_t_10) { + + /* "scaler.pyx":63 + * else: + * if X[i, j] >= 0: + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda # <<<<<<<<<<<<<< + * else: + * X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + */ + __pyx_t_11 = __Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts((__pyx_v_x + 1.0), 0), __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0)), __pyx_t_double_complex_from_parts(1, 0)); + __pyx_t_12 = __pyx_t_double_complex_from_parts(__pyx_v_lmbda, 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_12))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 63, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_11, __pyx_t_12), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 63, __pyx_L4_error) + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + + /* "scaler.pyx":62 + * X[i, j] = -log(-x+1) + * else: + * if X[i, j] >= 0: # <<<<<<<<<<<<<< + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + */ + goto __pyx_L13; + } + + /* "scaler.pyx":65 + * X[i, j] = ((x+1) ** lmbda - 1) / lmbda + * else: + * X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) # <<<<<<<<<<<<<< + * return X + */ + /*else*/ { + __pyx_t_12 = __Pyx_c_neg_double(__Pyx_c_diff_double(__Pyx_c_pow_double(__pyx_t_double_complex_from_parts(((-__pyx_v_x) + 1.0), 0), __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0)), __pyx_t_double_complex_from_parts(1, 0))); + __pyx_t_11 = __pyx_t_double_complex_from_parts((2.0 - __pyx_v_lmbda), 0); + if (unlikely(__Pyx_c_is_zero_double(__pyx_t_11))) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 65, __pyx_L4_error) + } + __pyx_t_13 = __Pyx_SoftComplexToDouble(__Pyx_c_quot_double(__pyx_t_12, __pyx_t_11), 0); if (unlikely(__pyx_t_13 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 65, __pyx_L4_error) + __pyx_t_9 = __pyx_v_i; + __pyx_t_8 = __pyx_v_j; + *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_X.diminfo[1].strides) = __pyx_t_13; + } + __pyx_L13:; + } + __pyx_L10:; + } + } + } + + /* "scaler.pyx":46 + * cdef float lmbda + * cdef float x + * with nogil: # <<<<<<<<<<<<<< + * for i in range(n_rows): + * for j in range(n_cols): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L4_error: { + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L1_error; + } + __pyx_L5:; + } + } + + /* "scaler.pyx":66 + * else: + * X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + * return X # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF((PyObject *)__pyx_r); + __Pyx_INCREF((PyObject *)__pyx_v_X); + __pyx_r = ((PyArrayObject *)__pyx_v_X); + goto __pyx_L0; + + /* "scaler.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] yeo_johnson( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] lambdas, + */ + + /* function exit code */ + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.yeo_johnson", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_6scaler_13__pyx_fuse_1yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_fuse_1__pyx_mdef_6scaler_13__pyx_fuse_1yeo_johnson = {"__pyx_fuse_1yeo_johnson", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6scaler_13__pyx_fuse_1yeo_johnson, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6scaler_13__pyx_fuse_1yeo_johnson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_X = 0; + PyArrayObject *__pyx_v_lambdas = 0; + CYTHON_UNUSED Py_ssize_t __pyx_nargs; + CYTHON_UNUSED PyObject *const *__pyx_kwvalues; + PyObject* values[2] = {0,0}; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_fuse_1yeo_johnson (wrapper)", 0); + #if CYTHON_ASSUME_SAFE_MACROS + __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); + #else + __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; + #endif + __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); + { + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_lambdas,0}; + if (__pyx_kwds) { + Py_ssize_t kw_args; + switch (__pyx_nargs) { + case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); + switch (__pyx_nargs) { + case 0: + if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_X)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[0]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_lambdas)) != 0)) { + (void)__Pyx_Arg_NewRef_VARARGS(values[1]); + kw_args--; + } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L3_error) + else { + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1yeo_johnson", 1, 2, 2, 1); __PYX_ERR(0, 35, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + const Py_ssize_t kwd_pos_args = __pyx_nargs; + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_fuse_1yeo_johnson") < 0)) __PYX_ERR(0, 35, __pyx_L3_error) + } + } else if (unlikely(__pyx_nargs != 2)) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + } + __pyx_v_X = ((PyArrayObject *)values[0]); + __pyx_v_lambdas = ((PyArrayObject *)values[1]); + } + goto __pyx_L6_skip; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_fuse_1yeo_johnson", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 35, __pyx_L3_error) + __pyx_L6_skip:; + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_AddTraceback("scaler.__pyx_fuse_1yeo_johnson", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 36, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_lambdas), __pyx_ptype_5numpy_ndarray, 1, "lambdas", 0))) __PYX_ERR(0, 37, __pyx_L1_error) + __pyx_r = __pyx_pf_6scaler_12__pyx_fuse_1yeo_johnson(__pyx_self, __pyx_v_X, __pyx_v_lambdas); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + { + Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { + __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); + } + } + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6scaler_12__pyx_fuse_1yeo_johnson(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_lambdas) { + __Pyx_LocalBuf_ND __pyx_pybuffernd_X; + __Pyx_Buffer __pyx_pybuffer_X; + __Pyx_LocalBuf_ND __pyx_pybuffernd_lambdas; + __Pyx_Buffer __pyx_pybuffer_lambdas; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_fuse_1yeo_johnson", 1); + __pyx_pybuffer_X.pybuffer.buf = NULL; + __pyx_pybuffer_X.refcount = 0; + __pyx_pybuffernd_X.data = NULL; + __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; + __pyx_pybuffer_lambdas.pybuffer.buf = NULL; + __pyx_pybuffer_lambdas.refcount = 0; + __pyx_pybuffernd_lambdas.data = NULL; + __pyx_pybuffernd_lambdas.rcbuffer = &__pyx_pybuffer_lambdas; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer, (PyObject*)__pyx_v_lambdas, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 35, __pyx_L1_error) + } + __pyx_pybuffernd_lambdas.diminfo[0].strides = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_lambdas.diminfo[0].shape = __pyx_pybuffernd_lambdas.rcbuffer->pybuffer.shape[0]; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PyObject *)__pyx_fuse_1__pyx_f_6scaler_yeo_johnson(((PyArrayObject *)__pyx_v_X), ((PyArrayObject *)__pyx_v_lambdas), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("scaler.__pyx_fuse_1yeo_johnson", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_lambdas.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_array) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_array___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_array_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_array_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_array}, + {Py_sq_length, (void *)__pyx_array___len__}, + {Py_sq_item, (void *)__pyx_sq_item_array}, + {Py_mp_length, (void *)__pyx_array___len__}, + {Py_mp_subscript, (void *)__pyx_array___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_array}, + {Py_tp_getattro, (void *)__pyx_tp_getattro_array}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_array_getbuffer}, + #endif + {Py_tp_methods, (void *)__pyx_methods_array}, + {Py_tp_getset, (void *)__pyx_getsets_array}, + {Py_tp_new, (void *)__pyx_tp_new_array}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_array_spec = { + "scaler.array", + sizeof(struct __pyx_array_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_array_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "scaler.""array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_Enum) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_specialmethod___pyx_MemviewEnum___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_MemviewEnum___repr__(self); +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_MemviewEnum___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_MemviewEnum_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_Enum}, + {Py_tp_repr, (void *)__pyx_MemviewEnum___repr__}, + {Py_tp_traverse, (void *)__pyx_tp_traverse_Enum}, + {Py_tp_clear, (void *)__pyx_tp_clear_Enum}, + {Py_tp_methods, (void *)__pyx_methods_Enum}, + {Py_tp_init, (void *)__pyx_MemviewEnum___init__}, + {Py_tp_new, (void *)__pyx_tp_new_Enum}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_MemviewEnum_spec = { + "scaler.Enum", + sizeof(struct __pyx_MemviewEnum_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_MemviewEnum_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "scaler.""Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_memoryview) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryview___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + (*Py_TYPE(o)->tp_free)(o); + #else + { + freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); + if (tp_free) tp_free(o); + } + #endif +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + __Pyx_TypeName o_type_name; + o_type_name = __Pyx_PyType_GetName(Py_TYPE(o)); + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name); + __Pyx_DECREF_TypeName(o_type_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyObject *__pyx_specialmethod___pyx_memoryview___repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __pyx_memoryview___repr__(self); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_memoryview___repr__, METH_NOARGS|METH_COEXIST, 0}, + {"is_c_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_c_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"is_f_contig", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_is_f_contig, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"copy_fortran", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_memoryview_copy_fortran, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryview_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +#if !CYTHON_COMPILING_IN_LIMITED_API + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; +#endif +static PyType_Slot __pyx_type___pyx_memoryview_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_memoryview}, + {Py_tp_repr, (void *)__pyx_memoryview___repr__}, + {Py_sq_length, (void *)__pyx_memoryview___len__}, + {Py_sq_item, (void *)__pyx_sq_item_memoryview}, + {Py_mp_length, (void *)__pyx_memoryview___len__}, + {Py_mp_subscript, (void *)__pyx_memoryview___getitem__}, + {Py_mp_ass_subscript, (void *)__pyx_mp_ass_subscript_memoryview}, + {Py_tp_str, (void *)__pyx_memoryview___str__}, + #if defined(Py_bf_getbuffer) + {Py_bf_getbuffer, (void *)__pyx_memoryview_getbuffer}, + #endif + {Py_tp_traverse, (void *)__pyx_tp_traverse_memoryview}, + {Py_tp_clear, (void *)__pyx_tp_clear_memoryview}, + {Py_tp_methods, (void *)__pyx_methods_memoryview}, + {Py_tp_getset, (void *)__pyx_getsets_memoryview}, + {Py_tp_new, (void *)__pyx_tp_new_memoryview}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryview_spec = { + "scaler.memoryview", + sizeof(struct __pyx_memoryview_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + __pyx_type___pyx_memoryview_slots, +}; +#else + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "scaler.""memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc__memoryviewslice) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_memoryviewslice___dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XCLEAR_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, + {0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type___pyx_memoryviewslice_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc__memoryviewslice}, + {Py_tp_doc, (void *)PyDoc_STR("Internal class for passing memoryview slices to Python")}, + {Py_tp_traverse, (void *)__pyx_tp_traverse__memoryviewslice}, + {Py_tp_clear, (void *)__pyx_tp_clear__memoryviewslice}, + {Py_tp_methods, (void *)__pyx_methods__memoryviewslice}, + {Py_tp_new, (void *)__pyx_tp_new__memoryviewslice}, + {0, 0}, +}; +static PyType_Spec __pyx_type___pyx_memoryviewslice_spec = { + "scaler._memoryviewslice", + sizeof(struct __pyx_memoryviewslice_obj), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, + __pyx_type___pyx_memoryviewslice_slots, +}; +#else + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "scaler.""_memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY || 0 + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_SEQUENCE, /*tp_flags*/ + PyDoc_STR("Internal class for passing memoryview slices to Python"), /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif +/* #### Code section: pystring_table ### */ + +static int __Pyx_CreateStringTabAndInitStrings(void) { + __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_k_All_dimensions_preceding_dimensi, sizeof(__pyx_k_All_dimensions_preceding_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_u_Cannot_index_with_type, __pyx_k_Cannot_index_with_type, sizeof(__pyx_k_Cannot_index_with_type), 0, 1, 0, 0}, + {&__pyx_kp_s_Cannot_transpose_memoryview_with, __pyx_k_Cannot_transpose_memoryview_with, sizeof(__pyx_k_Cannot_transpose_memoryview_with), 0, 0, 1, 0}, + {&__pyx_kp_s_Dimension_d_is_not_direct, __pyx_k_Dimension_d_is_not_direct, sizeof(__pyx_k_Dimension_d_is_not_direct), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_k_Expected_at_least_d_argument_s_g, sizeof(__pyx_k_Expected_at_least_d_argument_s_g), 0, 0, 1, 0}, + {&__pyx_kp_s_Function_call_with_ambiguous_arg, __pyx_k_Function_call_with_ambiguous_arg, sizeof(__pyx_k_Function_call_with_ambiguous_arg), 0, 0, 1, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Index_out_of_bounds_axis_d, __pyx_k_Index_out_of_bounds_axis_d, sizeof(__pyx_k_Index_out_of_bounds_axis_d), 0, 0, 1, 0}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_u_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 1, 0, 0}, + {&__pyx_kp_u_Invalid_shape_in_axis, __pyx_k_Invalid_shape_in_axis, sizeof(__pyx_k_Invalid_shape_in_axis), 0, 1, 0, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_kp_s_No_matching_signature_found, __pyx_k_No_matching_signature_found, sizeof(__pyx_k_No_matching_signature_found), 0, 0, 1, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_u_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 1, 0, 0}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_Sequence, __pyx_k_Sequence, sizeof(__pyx_k_Sequence), 0, 0, 1, 1}, + {&__pyx_kp_s_Step_may_not_be_zero_axis_d, __pyx_k_Step_may_not_be_zero_axis_d, sizeof(__pyx_k_Step_may_not_be_zero_axis_d), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, + {&__pyx_n_s_X_offset, __pyx_k_X_offset, sizeof(__pyx_k_X_offset), 0, 0, 1, 1}, + {&__pyx_n_s_X_scale, __pyx_k_X_scale, sizeof(__pyx_k_X_scale), 0, 0, 1, 1}, + {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0}, + {&__pyx_kp_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 0}, + {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, + {&__pyx_n_s__34, __pyx_k__34, sizeof(__pyx_k__34), 0, 0, 1, 1}, + {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_n_s_abc, __pyx_k_abc, sizeof(__pyx_k_abc), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_kp_u_and, __pyx_k_and, sizeof(__pyx_k_and), 0, 1, 0, 0}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_collections, __pyx_k_collections, sizeof(__pyx_k_collections), 0, 0, 1, 1}, + {&__pyx_kp_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, + {&__pyx_n_s_defaults, __pyx_k_defaults, sizeof(__pyx_k_defaults), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32_t, __pyx_k_float32_t, sizeof(__pyx_k_float32_t), 0, 0, 1, 1}, + {&__pyx_n_s_float64_t, __pyx_k_float64_t, sizeof(__pyx_k_float64_t), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_fused_sigindex, __pyx_k_fused_sigindex, sizeof(__pyx_k_fused_sigindex), 0, 0, 1, 1}, + {&__pyx_kp_s_gators_scalers_scaler_pyx, __pyx_k_gators_scalers_scaler_pyx, sizeof(__pyx_k_gators_scalers_scaler_pyx), 0, 0, 1, 0}, + {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, + {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_u_got, __pyx_k_got, sizeof(__pyx_k_got), 0, 1, 0, 0}, + {&__pyx_kp_u_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 1, 0, 0}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, + {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, + {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_kind, __pyx_k_kind, sizeof(__pyx_k_kind), 0, 0, 1, 1}, + {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1}, + {&__pyx_n_s_lambdas, __pyx_k_lambdas, sizeof(__pyx_k_lambdas), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_u_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 1, 0, 0}, + {&__pyx_kp_u_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 1, 0, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0scaler, __pyx_k_pyx_fuse_0scaler, sizeof(__pyx_k_pyx_fuse_0scaler), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_0yeo_johnson, __pyx_k_pyx_fuse_0yeo_johnson, sizeof(__pyx_k_pyx_fuse_0yeo_johnson), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1scaler, __pyx_k_pyx_fuse_1scaler, sizeof(__pyx_k_pyx_fuse_1scaler), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_fuse_1yeo_johnson, __pyx_k_pyx_fuse_1yeo_johnson, sizeof(__pyx_k_pyx_fuse_1yeo_johnson), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1}, + {&__pyx_n_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 1}, + {&__pyx_n_s_scaler, __pyx_k_scaler, sizeof(__pyx_k_scaler), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_signatures, __pyx_k_signatures, sizeof(__pyx_k_signatures), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, + {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {&__pyx_n_s_yeo_johnson, __pyx_k_yeo_johnson, sizeof(__pyx_k_yeo_johnson), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; + return __Pyx_InitStrings(__pyx_string_tab); +} +/* #### Code section: cached_builtins ### */ +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 26, __pyx_L1_error) + __pyx_builtin___import__ = __Pyx_GetBuiltinName(__pyx_n_s_import); if (!__pyx_builtin___import__) __PYX_ERR(1, 100, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(1, 156, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 159, __pyx_L1_error) + __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(1, 373, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 408, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 618, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 914, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 984, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: cached_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "View.MemoryView":582 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__4 = PyTuple_New(1); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + if (__Pyx_PyTuple_SET_ITEM(__pyx_tuple__4, 0, __pyx_int_neg_1)) __PYX_ERR(1, 582, __pyx_L1_error); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "View.MemoryView":679 + * tup = index if isinstance(index, tuple) else (index,) + * + * result = [slice(None)] * ndim # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_slice__5 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__5)) __PYX_ERR(1, 679, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__5); + __Pyx_GIVEREF(__pyx_slice__5); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum not in (0x82a3537, 0x6ae9995, 0xb068931): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0x82a3537, 0x6ae9995, 0xb068931) = (name))" % __pyx_checksum + */ + __pyx_tuple__8 = PyTuple_Pack(3, __pyx_int_136983863, __pyx_int_112105877, __pyx_int_184977713); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":984 + * __pyx_import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../gators311/lib/python3.11/site-packages/numpy/__init__.cython-30.pxd":990 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "scaler.pyx":15 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] scaler( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] X_offset, + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_No_matching_signature_found); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_Function_call_with_ambiguous_arg); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_n_s_sys); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_tuple__16 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_3); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_collections_abc); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 101, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_n_s_collections); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__24 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "scaler.pyx":15 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] scaler( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] X_offset, + */ + __pyx_tuple__26 = PyTuple_Pack(3, __pyx_n_s_X, __pyx_n_s_X_offset, __pyx_n_s_X_scale); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_scalers_scaler_pyx, __pyx_n_s_pyx_fuse_0scaler, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_scalers_scaler_pyx, __pyx_n_s_pyx_fuse_0scaler, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_scalers_scaler_pyx, __pyx_n_s_pyx_fuse_1scaler, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 15, __pyx_L1_error) + + /* "scaler.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] yeo_johnson( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] lambdas, + */ + __pyx_tuple__30 = PyTuple_Pack(2, __pyx_n_s_X, __pyx_n_s_lambdas); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_scalers_scaler_pyx, __pyx_n_s_pyx_fuse_0yeo_johnson, 35, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_scalers_scaler_pyx, __pyx_n_s_pyx_fuse_0yeo_johnson, 35, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gators_scalers_scaler_pyx, __pyx_n_s_pyx_fuse_1yeo_johnson, 35, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} +/* #### Code section: init_constants ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { + __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get; + __pyx_umethod_PyDict_Type_values.type = (PyObject*)&PyDict_Type; + __pyx_umethod_PyDict_Type_values.method_name = &__pyx_n_s_values; + if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_112105877 = PyInt_FromLong(112105877L); if (unlikely(!__pyx_int_112105877)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_136983863 = PyInt_FromLong(136983863L); if (unlikely(!__pyx_int_136983863)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_globals ### */ + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + /* AssertionsEnabled.init */ + if (likely(__Pyx_init_assertions_enabled() == 0)); else + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + /* NumpyImportArray.init */ + /* + * Cython has automatically inserted a call to _import_array since + * you didn't include one when you cimported numpy. To disable this + * add the line + * numpy._import_array + */ +#ifdef NPY_FEATURE_VERSION +#ifndef NO_IMPORT_ARRAY +if (unlikely(_import_array() == -1)) { + PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import " + "(auto-generated because you didn't call 'numpy.import_array()' after cimporting numpy; " + "use 'numpy._import_array' to disable if you are certain you don't need it)."); +} +#endif +#endif + +if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) + + return 0; + __pyx_L1_error:; + return -1; +} +/* #### Code section: init_module ### */ + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_collections_abc_Sequence = Py_None; Py_INCREF(Py_None); + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + #if CYTHON_USE_TYPE_SPECS + __pyx_array_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_array_spec, NULL); if (unlikely(!__pyx_array_type)) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_array_type->tp_as_buffer = &__pyx_tp_as_buffer_array; + if (!__pyx_array_type->tp_as_buffer->bf_releasebuffer && __pyx_array_type->tp_base->tp_as_buffer && __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_array_type->tp_as_buffer->bf_releasebuffer = __pyx_array_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_array_spec, __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #else + __pyx_array_type = &__pyx_type___pyx_array; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_array_type->tp_print = 0; + #endif + if (__Pyx_SetVtable(__pyx_array_type, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_array_type) < 0) __PYX_ERR(1, 114, __pyx_L1_error) + #endif + #if CYTHON_USE_TYPE_SPECS + __pyx_MemviewEnum_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_MemviewEnum_spec, NULL); if (unlikely(!__pyx_MemviewEnum_type)) __PYX_ERR(1, 302, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_MemviewEnum_spec, __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #else + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_MemviewEnum_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_MemviewEnum_type->tp_dictoffset && __pyx_MemviewEnum_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_MemviewEnum_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_MemviewEnum_type) < 0) __PYX_ERR(1, 302, __pyx_L1_error) + #endif + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + __pyx_vtable_memoryview._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryview__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_memoryview_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryview_spec, NULL); if (unlikely(!__pyx_memoryview_type)) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryview_type->tp_as_buffer = &__pyx_tp_as_buffer_memoryview; + if (!__pyx_memoryview_type->tp_as_buffer->bf_releasebuffer && __pyx_memoryview_type->tp_base->tp_as_buffer && __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer) { + __pyx_memoryview_type->tp_as_buffer->bf_releasebuffer = __pyx_memoryview_type->tp_base->tp_as_buffer->bf_releasebuffer; + } + #elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer) + /* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */ + #elif defined(_MSC_VER) + #pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.") + #else + #warning "The buffer protocol is not supported in the Limited C-API < 3.11." + #endif + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryview_spec, __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #else + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryview_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryview_type->tp_dictoffset && __pyx_memoryview_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryview_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryview_type, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryview_type) < 0) __PYX_ERR(1, 337, __pyx_L1_error) + #endif + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_vtable__memoryviewslice.__pyx_base._get_base = (PyObject *(*)(struct __pyx_memoryview_obj *))__pyx_memoryviewslice__get_base; + #if CYTHON_USE_TYPE_SPECS + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_memoryview_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 952, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_memoryviewslice_type = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type___pyx_memoryviewslice_spec, __pyx_t_1); + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(!__pyx_memoryviewslice_type)) __PYX_ERR(1, 952, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type___pyx_memoryviewslice_spec, __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #else + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + __pyx_memoryviewslice_type->tp_base = __pyx_memoryview_type; + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_memoryviewslice_type->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_memoryviewslice_type->tp_dictoffset && __pyx_memoryviewslice_type->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_memoryviewslice_type->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (__Pyx_SetVtable(__pyx_memoryviewslice_type, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_MergeVtables(__pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if (__Pyx_setup_reduce((PyObject *) __pyx_memoryviewslice_type) < 0) __PYX_ERR(1, 952, __pyx_L1_error) + #endif + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_8(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #elif CYTHON_COMPILING_IN_LIMITED_API + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyTypeObject), + #else + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 202, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_5numpy_dtype = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArray_Descr),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 202, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 225, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 229, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 809, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 811, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 813, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 815, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 817, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 819, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 821, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 823, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 825, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_8); if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 827, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_8(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_8(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_8); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 866, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_scaler(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_scaler}, + {0, NULL} +}; +#endif + +#ifdef __cplusplus +namespace { + struct PyModuleDef __pyx_moduledef = + #else + static struct PyModuleDef __pyx_moduledef = + #endif + { + PyModuleDef_HEAD_INIT, + "scaler", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #elif CYTHON_USE_MODULE_STATE + sizeof(__pyx_mstate), /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + #if CYTHON_USE_MODULE_STATE + __pyx_m_traverse, /* m_traverse */ + __pyx_m_clear, /* m_clear */ + NULL /* m_free */ + #else + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ + #endif + }; + #ifdef __cplusplus +} /* anonymous namespace */ +#endif +#endif + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initscaler(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initscaler(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_scaler(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_scaler(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +#if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) +#else +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) +#endif +{ + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { +#if CYTHON_COMPILING_IN_LIMITED_API + result = PyModule_AddObject(module, to_name, value); +#else + result = PyDict_SetItemString(moddict, to_name, value); +#endif + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + CYTHON_UNUSED_VAR(def); + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + moddict = module; +#else + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; +#endif + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_scaler(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + int stringtab_initialized = 0; + #if CYTHON_USE_MODULE_STATE + int pystate_addmodule_run = 0; + #endif + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + static PyThread_type_lock __pyx_t_8[8]; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'scaler' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("scaler", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #elif CYTHON_USE_MODULE_STATE + __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + { + int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "scaler" pseudovariable */ + if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + pystate_addmodule_run = 1; + } + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #endif + CYTHON_UNUSED_VAR(__pyx_t_1); + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_scaler(void)", 0); + if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + stringtab_initialized = 1; + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_scaler) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "scaler")) { + if (unlikely((PyDict_SetItemString(modules, "scaler", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_version_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_tuple__16, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 100, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + + /* "View.MemoryView":101 + * try: + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence # <<<<<<<<<<<<<< + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_abc); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 101, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":100 + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: + * if __import__("sys").version_info >= (3, 3): # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":103 + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence # <<<<<<<<<<<<<< + * except: + * + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin___import__, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Sequence); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 103, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L7_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":104 + * else: + * __pyx_collections_abc_Sequence = __import__("collections").Sequence + * except: # <<<<<<<<<<<<<< + * + * __pyx_collections_abc_Sequence = None + */ + /*except:*/ { + __Pyx_AddTraceback("View.MemoryView", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(1, 104, __pyx_L4_except_error) + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_7); + + /* "View.MemoryView":106 + * except: + * + * __pyx_collections_abc_Sequence = None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_INCREF(Py_None); + __Pyx_XGOTREF(__pyx_collections_abc_Sequence); + __Pyx_DECREF_SET(__pyx_collections_abc_Sequence, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + + /* "View.MemoryView":99 + * + * cdef object __pyx_collections_abc_Sequence "__pyx_collections_abc_Sequence" + * try: # <<<<<<<<<<<<<< + * if __import__("sys").version_info >= (3, 3): + * __pyx_collections_abc_Sequence = __import__("collections.abc").abc.Sequence + */ + __pyx_L4_except_error:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L7_try_end:; + } + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":242 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 242, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":243 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_array_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 243, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":241 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L16_try_end; + __pyx_L11_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":244 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L12_exception_handled; + } + __pyx_L12_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L16_try_end:; + } + + /* "View.MemoryView":309 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":310 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 310, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":311 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 311, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":314 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 314, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":315 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 315, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":323 + * + * + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":324 + * + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[8] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_8[0] = PyThread_allocate_lock(); + __pyx_t_8[1] = PyThread_allocate_lock(); + __pyx_t_8[2] = PyThread_allocate_lock(); + __pyx_t_8[3] = PyThread_allocate_lock(); + __pyx_t_8[4] = PyThread_allocate_lock(); + __pyx_t_8[5] = PyThread_allocate_lock(); + __pyx_t_8[6] = PyThread_allocate_lock(); + __pyx_t_8[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_8, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "View.MemoryView":983 + * + * try: + * count = __pyx_collections_abc_Sequence.count # <<<<<<<<<<<<<< + * index = __pyx_collections_abc_Sequence.index + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_count); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_count, __pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":984 + * try: + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index # <<<<<<<<<<<<<< + * except: + * pass + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_SetItemOnTypeDict(__pyx_memoryviewslice_type, __pyx_n_s_index, __pyx_t_7) < 0) __PYX_ERR(1, 984, __pyx_L17_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "View.MemoryView":982 + * + * + * try: # <<<<<<<<<<<<<< + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L22_try_end; + __pyx_L17_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":985 + * count = __pyx_collections_abc_Sequence.count + * index = __pyx_collections_abc_Sequence.index + * except: # <<<<<<<<<<<<<< + * pass + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L18_exception_handled; + } + __pyx_L18_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L22_try_end:; + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_1); + /*try:*/ { + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_collections_abc_Sequence); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(1, 989, __pyx_L23_error) + if (__pyx_t_6) { + + /* "View.MemoryView":993 + * + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) # <<<<<<<<<<<<<< + * __pyx_collections_abc_Sequence.register(array) + * except: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, ((PyObject *)__pyx_memoryviewslice_type)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 993, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":994 + * + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) # <<<<<<<<<<<<<< + * except: + * pass # ignore failure, it's a minor issue + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_collections_abc_Sequence, __pyx_n_s_register); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_array_type)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 994, __pyx_L23_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":989 + * + * try: + * if __pyx_collections_abc_Sequence: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":988 + * pass + * + * try: # <<<<<<<<<<<<<< + * if __pyx_collections_abc_Sequence: + * + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L28_try_end; + __pyx_L23_error:; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":995 + * __pyx_collections_abc_Sequence.register(_memoryviewslice) + * __pyx_collections_abc_Sequence.register(array) + * except: # <<<<<<<<<<<<<< + * pass # ignore failure, it's a minor issue + * + */ + /*except:*/ { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L24_exception_handled; + } + __pyx_L24_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_2, __pyx_t_1); + __pyx_L28_try_end:; + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_7 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_7) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "scaler.pyx":2 + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * + */ + __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "scaler.pyx":15 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] scaler( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] X_offset, + */ + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_6scaler_5__pyx_fuse_0scaler, 0, __pyx_n_s_pyx_fuse_0scaler, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_scaler, __pyx_t_7) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_6scaler_7__pyx_fuse_1scaler, 0, __pyx_n_s_pyx_fuse_1scaler, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_scaler, __pyx_t_7) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_6scaler_5__pyx_fuse_0scaler, 0, __pyx_n_s_pyx_fuse_0scaler, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_6scaler_7__pyx_fuse_1scaler, 0, __pyx_n_s_pyx_fuse_1scaler, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_6scaler_1scaler, 0, __pyx_n_s_scaler, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults), 1)) __PYX_ERR(0, 15, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_4)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_7; + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_scaler, __pyx_t_4) < 0) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "scaler.pyx":35 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cpdef np.ndarray[num_float_t, ndim = 2] yeo_johnson( # <<<<<<<<<<<<<< + * np.ndarray[num_float_t, ndim=2] X, + * np.ndarray[num_float_t, ndim=1] lambdas, + */ + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_0__pyx_mdef_6scaler_11__pyx_fuse_0yeo_johnson, 0, __pyx_n_s_pyx_fuse_0yeo_johnson, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_yeo_johnson, __pyx_t_4) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_fuse_1__pyx_mdef_6scaler_13__pyx_fuse_1yeo_johnson, 0, __pyx_n_s_pyx_fuse_1yeo_johnson, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_yeo_johnson, __pyx_t_4) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_6scaler_11__pyx_fuse_0yeo_johnson, 0, __pyx_n_s_pyx_fuse_0yeo_johnson, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_7) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_6scaler_13__pyx_fuse_1yeo_johnson, 0, __pyx_n_s_pyx_fuse_1yeo_johnson, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_7) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __pyx_FusedFunction_New(&__pyx_mdef_6scaler_3yeo_johnson, 0, __pyx_n_s_yeo_johnson, NULL, __pyx_n_s_scaler, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults1), 1)) __PYX_ERR(0, 35, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_CyFunction_Defaults(__pyx_defaults1, __pyx_t_7)->__pyx_arg__fused_sigindex = __pyx_t_5; + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_empty_tuple); + ((__pyx_FusedFunctionObject *) __pyx_t_7)->__signatures__ = __pyx_t_4; + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_yeo_johnson, __pyx_t_7) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "scaler.pyx":1 + * import cython # <<<<<<<<<<<<<< + * import numpy as np + * cimport numpy as np + */ + __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + if (__pyx_m) { + if (__pyx_d && stringtab_initialized) { + __Pyx_AddTraceback("init scaler", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + #if !CYTHON_USE_MODULE_STATE + Py_CLEAR(__pyx_m); + #else + Py_DECREF(__pyx_m); + if (pystate_addmodule_run) { + PyObject *tp, *value, *tb; + PyErr_Fetch(&tp, &value, &tb); + PyState_RemoveModule(&__pyx_moduledef); + PyErr_Restore(tp, value, tb); + } + #endif + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init scaler"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} +/* #### Code section: cleanup_globals ### */ +/* #### Code section: cleanup_module ### */ +/* #### Code section: main_method ### */ +/* #### Code section: utility_code_pragmas ### */ +#ifdef _MSC_VER +#pragma warning( push ) +/* Warning 4127: conditional expression is constant + * Cython uses constant conditional expressions to allow in inline functions to be optimized at + * compile-time, so this warning is not useful + */ +#pragma warning( disable : 4127 ) +#endif + + + +/* #### Code section: utility_code_def ### */ + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0x030C00A6 + PyObject *current_exception = tstate->current_exception; + if (unlikely(!current_exception)) return 0; + exc_type = (PyObject*) Py_TYPE(current_exception); + if (exc_type == err) return 1; +#else + exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; +#endif + #if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(exc_type); + #endif + if (unlikely(PyTuple_Check(err))) { + result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + } else { + result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); + } + #if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(exc_type); + #endif + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject *tmp_value; + assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); + if (value) { + #if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) + #endif + PyException_SetTraceback(value, tb); + } + tmp_value = tstate->current_exception; + tstate->current_exception = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#if PY_VERSION_HEX >= 0x030C00A6 + PyObject* exc_value; + exc_value = tstate->current_exception; + tstate->current_exception = 0; + *value = exc_value; + *type = NULL; + *tb = NULL; + if (exc_value) { + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + #if CYTHON_COMPILING_IN_CPYTHON + *tb = ((PyBaseExceptionObject*) exc_value)->traceback; + Py_XINCREF(*tb); + #else + *tb = PyException_GetTraceback(exc_value); + #endif + } +#else + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#endif +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + (void) PyObject_GetOptionalAttr(obj, attr_name, &result); + return result; +#else +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +#endif +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); + if (unlikely(!result) && !PyErr_Occurred()) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* TupleAndListFromArray */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { + PyObject *v; + Py_ssize_t i; + for (i = 0; i < length; i++) { + v = dest[i] = src[i]; + Py_INCREF(v); + } +} +static CYTHON_INLINE PyObject * +__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + Py_INCREF(__pyx_empty_tuple); + return __pyx_empty_tuple; + } + res = PyTuple_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); + return res; +} +static CYTHON_INLINE PyObject * +__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) +{ + PyObject *res; + if (n <= 0) { + return PyList_New(0); + } + res = PyList_New(n); + if (unlikely(res == NULL)) return NULL; + __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); + return res; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* fastcall */ +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) +{ + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) + { + if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; + } + for (i = 0; i < n; i++) + { + int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); + if (unlikely(eq != 0)) { + if (unlikely(eq < 0)) return NULL; + return kwvalues[i]; + } + } + return NULL; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 +CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { + Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); + PyObject *dict; + dict = PyDict_New(); + if (unlikely(!dict)) + return NULL; + for (i=0; i= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject *const *kwvalues, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); + while (1) { + Py_XDECREF(key); key = NULL; + Py_XDECREF(value); value = NULL; + if (kwds_is_tuple) { + Py_ssize_t size; +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(kwds); +#else + size = PyTuple_Size(kwds); + if (size < 0) goto bad; +#endif + if (pos >= size) break; +#if CYTHON_AVOID_BORROWED_REFS + key = __Pyx_PySequence_ITEM(kwds, pos); + if (!key) goto bad; +#elif CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kwds, pos); +#else + key = PyTuple_GetItem(kwds, pos); + if (!key) goto bad; +#endif + value = kwvalues[pos]; + pos++; + } + else + { + if (!PyDict_Next(kwds, &pos, &key, &value)) break; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + } + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + Py_INCREF(value); + Py_DECREF(key); +#endif + key = NULL; + value = NULL; + continue; + } +#if !CYTHON_AVOID_BORROWED_REFS + Py_INCREF(key); +#endif + Py_INCREF(value); + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = ( + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key) + ); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; +#if CYTHON_AVOID_BORROWED_REFS + value = NULL; +#endif + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + Py_XDECREF(key); + Py_XDECREF(value); + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + Py_XDECREF(key); + Py_XDECREF(value); + return -1; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + __Pyx_TypeName type_name; + __Pyx_TypeName obj_type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + type_name = __Pyx_PyType_GetName(type); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME + ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); + __Pyx_DECREF_TypeName(type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + __Pyx_PyThreadState_declare + CYTHON_UNUSED_VAR(cause); + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + #if PY_VERSION_HEX >= 0x030C00A6 + PyException_SetTraceback(value, tb); + #elif CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#else + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { + return NULL; + } + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { + return NULL; + } + #endif + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); + self = __Pyx_CyOrPyCFunction_GET_SELF(func); + #if PY_MAJOR_VERSION < 3 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + #else + if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) + return NULL; + #endif + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectFastCall */ +#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API +static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { + PyObject *argstuple; + PyObject *result = 0; + size_t i; + argstuple = PyTuple_New((Py_ssize_t)nargs); + if (unlikely(!argstuple)) return NULL; + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; + } + result = __Pyx_PyObject_Call(func, argstuple, kwargs); + bad: + Py_DECREF(argstuple); + return result; +} +#endif +static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { + Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); +#if CYTHON_COMPILING_IN_CPYTHON + if (nargs == 0 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) + return __Pyx_PyObject_CallMethO(func, NULL); + } + else if (nargs == 1 && kwargs == NULL) { + if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) + return __Pyx_PyObject_CallMethO(func, args[0]); + } +#endif + #if PY_VERSION_HEX < 0x030800B1 + #if CYTHON_FAST_PYCCALL + if (PyCFunction_Check(func)) { + if (kwargs) { + return _PyCFunction_FastCallDict(func, args, nargs, kwargs); + } else { + return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); + } + } + #if PY_VERSION_HEX >= 0x030700A1 + if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { + return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); + } + #endif + #endif + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); + } + #endif + #endif + if (kwargs == NULL) { + #if CYTHON_VECTORCALL + #if PY_VERSION_HEX < 0x03090000 + vectorcallfunc f = _PyVectorcall_Function(func); + #else + vectorcallfunc f = PyVectorcall_Function(func); + #endif + if (f) { + return f(func, args, (size_t)nargs, NULL); + } + #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL + if (__Pyx_CyFunction_CheckExact(func)) { + __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); + if (f) return f(func, args, (size_t)nargs, NULL); + } + #endif + } + if (nargs == 0) { + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); + } + #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API + return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); + #else + return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); + #endif +} + +/* RaiseUnexpectedTypeError */ +static int +__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) +{ + __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, + expected, obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return 0; +} + +/* CIntToDigits */ +static const char DIGIT_PAIRS_10[2*10*10+1] = { + "00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" +}; +static const char DIGIT_PAIRS_8[2*8*8+1] = { + "0001020304050607" + "1011121314151617" + "2021222324252627" + "3031323334353637" + "4041424344454647" + "5051525354555657" + "6061626364656667" + "7071727374757677" +}; +static const char DIGITS_HEX[2*16+1] = { + "0123456789abcdef" + "0123456789ABCDEF" +}; + +/* BuildPyUnicode */ +static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, + int prepend_sign, char padding_char) { + PyObject *uval; + Py_ssize_t uoffset = ulength - clength; +#if CYTHON_USE_UNICODE_INTERNALS + Py_ssize_t i; +#if CYTHON_PEP393_ENABLED + void *udata; + uval = PyUnicode_New(ulength, 127); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_DATA(uval); +#else + Py_UNICODE *udata; + uval = PyUnicode_FromUnicode(NULL, ulength); + if (unlikely(!uval)) return NULL; + udata = PyUnicode_AS_UNICODE(uval); +#endif + if (uoffset > 0) { + i = 0; + if (prepend_sign) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-'); + i++; + } + for (; i < uoffset; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char); + } + } + for (i=0; i < clength; i++) { + __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]); + } +#else + { + PyObject *sign = NULL, *padding = NULL; + uval = NULL; + if (uoffset > 0) { + prepend_sign = !!prepend_sign; + if (uoffset > prepend_sign) { + padding = PyUnicode_FromOrdinal(padding_char); + if (likely(padding) && uoffset > prepend_sign + 1) { + PyObject *tmp; + PyObject *repeat = PyInt_FromSsize_t(uoffset - prepend_sign); + if (unlikely(!repeat)) goto done_or_error; + tmp = PyNumber_Multiply(padding, repeat); + Py_DECREF(repeat); + Py_DECREF(padding); + padding = tmp; + } + if (unlikely(!padding)) goto done_or_error; + } + if (prepend_sign) { + sign = PyUnicode_FromOrdinal('-'); + if (unlikely(!sign)) goto done_or_error; + } + } + uval = PyUnicode_DecodeASCII(chars, clength, NULL); + if (likely(uval) && padding) { + PyObject *tmp = PyNumber_Add(padding, uval); + Py_DECREF(uval); + uval = tmp; + } + if (likely(uval) && sign) { + PyObject *tmp = PyNumber_Add(sign, uval); + Py_DECREF(uval); + uval = tmp; + } +done_or_error: + Py_XDECREF(padding); + Py_XDECREF(sign); + } +#endif + return uval; +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(int)*3+2]; + char *dpos, *end = digits + sizeof(int)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + int remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (int) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (int) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (int) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* CIntToPyUnicode */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_Py_ssize_t(Py_ssize_t value, Py_ssize_t width, char padding_char, char format_char) { + char digits[sizeof(Py_ssize_t)*3+2]; + char *dpos, *end = digits + sizeof(Py_ssize_t)*3+2; + const char *hex_digits = DIGITS_HEX; + Py_ssize_t length, ulength; + int prepend_sign, last_one_off; + Py_ssize_t remaining; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const Py_ssize_t neg_one = (Py_ssize_t) -1, const_zero = (Py_ssize_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (format_char == 'X') { + hex_digits += 16; + format_char = 'x'; + } + remaining = value; + last_one_off = 0; + dpos = end; + do { + int digit_pos; + switch (format_char) { + case 'o': + digit_pos = abs((int)(remaining % (8*8))); + remaining = (Py_ssize_t) (remaining / (8*8)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); + last_one_off = (digit_pos < 8); + break; + case 'd': + digit_pos = abs((int)(remaining % (10*10))); + remaining = (Py_ssize_t) (remaining / (10*10)); + dpos -= 2; + memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); + last_one_off = (digit_pos < 10); + break; + case 'x': + *(--dpos) = hex_digits[abs((int)(remaining % 16))]; + remaining = (Py_ssize_t) (remaining / 16); + break; + default: + assert(0); + break; + } + } while (unlikely(remaining != 0)); + assert(!last_one_off || *dpos == '0'); + dpos += last_one_off; + length = end - dpos; + ulength = length; + prepend_sign = 0; + if (!is_unsigned && value <= neg_one) { + if (padding_char == ' ' || width <= length + 1) { + *(--dpos) = '-'; + ++length; + } else { + prepend_sign = 1; + } + ++ulength; + } + if (width > ulength) { + ulength = width; + } + if (ulength == 1) { + return PyUnicode_FromOrdinal(*dpos); + } + return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); +} + +/* JoinPyUnicode */ +static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength, + Py_UCS4 max_char) { +#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *result_uval; + int result_ukind, kind_shift; + Py_ssize_t i, char_pos; + void *result_udata; + CYTHON_MAYBE_UNUSED_VAR(max_char); +#if CYTHON_PEP393_ENABLED + result_uval = PyUnicode_New(result_ulength, max_char); + if (unlikely(!result_uval)) return NULL; + result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND; + kind_shift = (result_ukind == PyUnicode_4BYTE_KIND) ? 2 : result_ukind - 1; + result_udata = PyUnicode_DATA(result_uval); +#else + result_uval = PyUnicode_FromUnicode(NULL, result_ulength); + if (unlikely(!result_uval)) return NULL; + result_ukind = sizeof(Py_UNICODE); + kind_shift = (result_ukind == 4) ? 2 : result_ukind - 1; + result_udata = PyUnicode_AS_UNICODE(result_uval); +#endif + assert(kind_shift == 2 || kind_shift == 1 || kind_shift == 0); + char_pos = 0; + for (i=0; i < value_count; i++) { + int ukind; + Py_ssize_t ulength; + void *udata; + PyObject *uval = PyTuple_GET_ITEM(value_tuple, i); + if (unlikely(__Pyx_PyUnicode_READY(uval))) + goto bad; + ulength = __Pyx_PyUnicode_GET_LENGTH(uval); + if (unlikely(!ulength)) + continue; + if (unlikely((PY_SSIZE_T_MAX >> kind_shift) - ulength < char_pos)) + goto overflow; + ukind = __Pyx_PyUnicode_KIND(uval); + udata = __Pyx_PyUnicode_DATA(uval); + if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) { + memcpy((char *)result_udata + (char_pos << kind_shift), udata, (size_t) (ulength << kind_shift)); + } else { + #if PY_VERSION_HEX >= 0x030d0000 + if (unlikely(PyUnicode_CopyCharacters(result_uval, char_pos, uval, 0, ulength) < 0)) goto bad; + #elif CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters) + _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength); + #else + Py_ssize_t j; + for (j=0; j < ulength; j++) { + Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j); + __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar); + } + #endif + } + char_pos += ulength; + } + return result_uval; +overflow: + PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string"); +bad: + Py_DECREF(result_uval); + return NULL; +#else + CYTHON_UNUSED_VAR(max_char); + CYTHON_UNUSED_VAR(result_ulength); + CYTHON_UNUSED_VAR(value_count); + return PyUnicode_Join(__pyx_empty_unicode, value_tuple); +#endif +} + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (unlikely(!j)) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_subscript) { + PyObject *r, *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return NULL; + r = mm->mp_subscript(o, key); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return sm->sq_item(o, i); + } + } +#else + if (is_list || !PyMapping_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* PyObjectCallOneArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *args[2] = {NULL, arg}; + return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { + PyObject *runerr = NULL; + Py_ssize_t key_value; + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, + "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); + __Pyx_DECREF_TypeName(index_type_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { + __Pyx_TypeName obj_type_name; + if (likely(PyType_Check(obj))) { + PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); + if (!meth) { + PyErr_Clear(); + } else { + PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); + Py_DECREF(meth); + return result; + } + } + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { + PyTypeObject *tp = Py_TYPE(obj); + PyMappingMethods *mm = tp->tp_as_mapping; + PySequenceMethods *sm = tp->tp_as_sequence; + if (likely(mm && mm->mp_subscript)) { + return mm->mp_subscript(obj, key); + } + if (likely(sm && sm->sq_item)) { + return __Pyx_PyObject_GetIndex(obj, key); + } + return __Pyx_PyObject_GetItem_Slow(obj, key); +} +#endif + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kw, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { + Py_ssize_t kwsize; +#if CYTHON_ASSUME_SAFE_MACROS + kwsize = PyTuple_GET_SIZE(kw); +#else + kwsize = PyTuple_Size(kw); + if (kwsize < 0) return 0; +#endif + if (unlikely(kwsize == 0)) + return 1; + if (!kw_allowed) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, 0); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + goto invalid_keyword; + } +#if PY_VERSION_HEX < 0x03090000 + for (pos = 0; pos < kwsize; pos++) { +#if CYTHON_ASSUME_SAFE_MACROS + key = PyTuple_GET_ITEM(kw, pos); +#else + key = PyTuple_GetItem(kw, pos); + if (!key) return 0; +#endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } +#endif + return 1; + } + while (PyDict_Next(kw, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if (!kw_allowed && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + #if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_TypeError, + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + PyErr_Format(PyExc_TypeError, + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* DivInt[Py_ssize_t] */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr3 */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +#endif +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r; +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 + int res = PyObject_GetOptionalAttr(o, n, &r); + return (res != 0) ? r : __Pyx_NewRef(d); +#else + #if CYTHON_USE_TYPE_SLOTS + if (likely(PyString_Check(n))) { + r = __Pyx_PyObject_GetAttrStrNoError(o, n); + if (unlikely(!r) && likely(!PyErr_Occurred())) { + r = __Pyx_NewRef(d); + } + return r; + } + #endif + r = PyObject_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +#endif +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#elif CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(!__pyx_m)) { + return NULL; + } + result = PyObject_GetAttr(__pyx_m, name); + if (likely(result)) { + return result; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + __Pyx_TypeName obj_type_name; + __Pyx_TypeName type_name; + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + type_name = __Pyx_PyType_GetName(type); + PyErr_Format(PyExc_TypeError, + "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, + obj_type_name, type_name); + __Pyx_DECREF_TypeName(obj_type_name); + __Pyx_DECREF_TypeName(type_name); + return 0; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + PyObject *exc_value = exc_info->exc_value; + if (exc_value == NULL || exc_value == Py_None) { + *value = NULL; + *type = NULL; + *tb = NULL; + } else { + *value = exc_value; + Py_INCREF(*value); + *type = (PyObject*) Py_TYPE(exc_value); + Py_INCREF(*type); + *tb = PyException_GetTraceback(exc_value); + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); + #endif +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + PyObject *tmp_value = exc_info->exc_value; + exc_info->exc_value = value; + Py_XDECREF(tmp_value); + Py_XDECREF(type); + Py_XDECREF(tb); + #else + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + #endif +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type = NULL, *local_value, *local_tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030C00A6 + local_value = tstate->current_exception; + tstate->current_exception = 0; + if (likely(local_value)) { + local_type = (PyObject*) Py_TYPE(local_value); + Py_INCREF(local_type); + local_tb = PyException_GetTraceback(local_value); + } + #else + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + #endif +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 + if (unlikely(tstate->current_exception)) +#elif CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + #if PY_VERSION_HEX >= 0x030B00a4 + tmp_value = exc_info->exc_value; + exc_info->exc_value = local_value; + tmp_type = NULL; + tmp_tb = NULL; + Py_XDECREF(local_type); + Py_XDECREF(local_tb); + #else + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + #endif + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_value = exc_info->exc_value; + exc_info->exc_value = *value; + if (tmp_value == NULL || tmp_value == Py_None) { + Py_XDECREF(tmp_value); + tmp_value = NULL; + tmp_type = NULL; + tmp_tb = NULL; + } else { + tmp_type = (PyObject*) Py_TYPE(tmp_value); + Py_INCREF(tmp_type); + #if CYTHON_COMPILING_IN_CPYTHON + tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; + Py_XINCREF(tmp_tb); + #else + tmp_tb = PyException_GetTraceback(tmp_value); + #endif + } + #elif CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *module = 0; + PyObject *empty_dict = 0; + PyObject *empty_list = 0; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (unlikely(!py_import)) + goto bad; + if (!from_list) { + empty_list = PyList_New(0); + if (unlikely(!empty_list)) + goto bad; + from_list = empty_list; + } + #endif + empty_dict = PyDict_New(); + if (unlikely(!empty_dict)) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, 1); + if (unlikely(!module)) { + if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (unlikely(!py_level)) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, __pyx_d, empty_dict, from_list, level); + #endif + } + } +bad: + Py_XDECREF(empty_dict); + Py_XDECREF(empty_list); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + return module; +} + +/* ImportDottedModule */ +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { + PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; + if (unlikely(PyErr_Occurred())) { + PyErr_Clear(); + } + if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { + partial_name = name; + } else { + slice = PySequence_GetSlice(parts_tuple, 0, count); + if (unlikely(!slice)) + goto bad; + sep = PyUnicode_FromStringAndSize(".", 1); + if (unlikely(!sep)) + goto bad; + partial_name = PyUnicode_Join(sep, slice); + } + PyErr_Format( +#if PY_MAJOR_VERSION < 3 + PyExc_ImportError, + "No module named '%s'", PyString_AS_STRING(partial_name)); +#else +#if PY_VERSION_HEX >= 0x030600B1 + PyExc_ModuleNotFoundError, +#else + PyExc_ImportError, +#endif + "No module named '%U'", partial_name); +#endif +bad: + Py_XDECREF(sep); + Py_XDECREF(slice); + Py_XDECREF(partial_name); + return NULL; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { + PyObject *imported_module; +#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + return NULL; + imported_module = __Pyx_PyDict_GetItemStr(modules, name); + Py_XINCREF(imported_module); +#else + imported_module = PyImport_GetModule(name); +#endif + return imported_module; +} +#endif +#if PY_MAJOR_VERSION >= 3 +static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { + Py_ssize_t i, nparts; + nparts = PyTuple_GET_SIZE(parts_tuple); + for (i=1; i < nparts && module; i++) { + PyObject *part, *submodule; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + part = PyTuple_GET_ITEM(parts_tuple, i); +#else + part = PySequence_ITEM(parts_tuple, i); +#endif + submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(part); +#endif + Py_DECREF(module); + module = submodule; + } + if (unlikely(!module)) { + return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); + } + return module; +} +#endif +static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if PY_MAJOR_VERSION < 3 + PyObject *module, *from_list, *star = __pyx_n_s__3; + CYTHON_UNUSED_VAR(parts_tuple); + from_list = PyList_New(1); + if (unlikely(!from_list)) + return NULL; + Py_INCREF(star); + PyList_SET_ITEM(from_list, 0, star); + module = __Pyx_Import(name, from_list, 0); + Py_DECREF(from_list); + return module; +#else + PyObject *imported_module; + PyObject *module = __Pyx_Import(name, NULL, 0); + if (!parts_tuple || unlikely(!module)) + return module; + imported_module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(imported_module)) { + Py_DECREF(module); + return imported_module; + } + PyErr_Clear(); + return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); +#endif +} +static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 + PyObject *module = __Pyx__ImportDottedModule_Lookup(name); + if (likely(module)) { + PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); + if (likely(spec)) { + PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); + if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { + Py_DECREF(spec); + spec = NULL; + } + Py_XDECREF(unsafe); + } + if (likely(!spec)) { + PyErr_Clear(); + return module; + } + Py_DECREF(spec); + Py_DECREF(module); + } else if (PyErr_Occurred()) { + PyErr_Clear(); + } +#endif + return __Pyx__ImportDottedModule(name, parts_tuple); +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (cls == a || cls == b) return 1; + mro = cls->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + PyObject *base = PyTuple_GET_ITEM(mro, i); + if (base == (PyObject *)a || base == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + if (exc_type1) { + return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); + } else { + return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; itp_as_sequence && type->tp_as_sequence->sq_repeat)) { + return type->tp_as_sequence->sq_repeat(seq, mul); + } else +#endif + { + return __Pyx_PySequence_Multiply_Generic(seq, mul); + } +} + +/* SetItemInt */ +static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { + int r; + if (unlikely(!j)) return -1; + r = PyObject_SetItem(o, j, v); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, + CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; + } + } else { + PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; + PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; + if (mm && mm->mp_ass_subscript) { + int r; + PyObject *key = PyInt_FromSsize_t(i); + if (unlikely(!key)) return -1; + r = mm->mp_ass_subscript(o, key, v); + Py_DECREF(key); + return r; + } + if (likely(sm && sm->sq_ass_item)) { + if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { + Py_ssize_t l = sm->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return -1; + PyErr_Clear(); + } + } + return sm->sq_ass_item(o, i, v); + } + } +#else + if (is_list || !PyMapping_Check(o)) + { + return PySequence_SetItem(o, i, v); + } +#endif + return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); +} + +/* RaiseUnboundLocalError */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* DivInt[long] */ +static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + const char* module_name_str = 0; + PyObject* module_name = 0; + PyObject* module_dot = 0; + PyObject* full_name = 0; + PyErr_Clear(); + module_name_str = PyModule_GetName(module); + if (unlikely(!module_name_str)) { goto modbad; } + module_name = PyUnicode_FromString(module_name_str); + if (unlikely(!module_name)) { goto modbad; } + module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__2); + if (unlikely(!module_dot)) { goto modbad; } + full_name = PyUnicode_Concat(module_dot, name); + if (unlikely(!full_name)) { goto modbad; } + #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) + { + PyObject *modules = PyImport_GetModuleDict(); + if (unlikely(!modules)) + goto modbad; + value = PyObject_GetItem(modules, full_name); + } + #else + value = PyImport_GetModule(full_name); + #endif + modbad: + Py_XDECREF(full_name); + Py_XDECREF(module_dot); + Py_XDECREF(module_name); + } + if (unlikely(!value)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (!r) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} +#endif + +/* DictGetItem */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* UnicodeAsUCS4 */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ +static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + __Pyx_TypeName c_type_name = __Pyx_PyType_GetName(Py_TYPE(c)); + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but " __Pyx_FMT_TYPENAME " found", + c_type_name); + __Pyx_DECREF_TypeName(c_type_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* memoryview_get_from_buffer */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static Py_ssize_t __Pyx_PyMemoryView_Get_itemsize(PyObject *obj) { + Py_ssize_t result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_itemsize); + if (!attr) { + goto bad; + } + result = PyLong_AsSsize_t(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* memoryview_get_from_buffer */ +#if !CYTHON_COMPILING_IN_LIMITED_API || CYTHON_LIMITED_API >= 0x030b0000 +#else +static int __Pyx_PyMemoryView_Get_ndim(PyObject *obj) { + int result; + PyObject *attr = PyObject_GetAttr(obj, __pyx_n_s_ndim); + if (!attr) { + goto bad; + } + result = PyLong_AsLong(attr); + Py_DECREF(attr); + return result; + bad: + Py_XDECREF(attr); + return -1; +} +#endif + +/* IterFinish */ +static CYTHON_INLINE int __Pyx_IterFinish(void) { + PyObject* exc_type; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + exc_type = __Pyx_PyErr_CurrentExceptionType(); + if (unlikely(exc_type)) { + if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) + return -1; + __Pyx_PyErr_Clear(); + return 0; + } + return 0; +} + +/* PyObjectCallNoArg */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + PyObject *arg[2] = {NULL, NULL}; + return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); +} + +/* PyObjectGetMethod */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + __Pyx_TypeName type_name; + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR + if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) +#elif PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (likely(descr != NULL)) { + *method = descr; + return 0; + } + type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* UnpackItemEndCheck */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } + return __Pyx_IterFinish(); +} + +/* UnpackTupleError */ +static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = __Pyx_PyObject_GetIterNextFunc(iter); + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ +#if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +#include +#endif +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* UnpackUnboundCMethod */ +static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { + PyObject *result; + PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); + if (unlikely(!selfless_args)) return NULL; + result = PyObject_Call(method, selfless_args, kwargs); + Py_DECREF(selfless_args); + return result; +} +static PyMethodDef __Pyx_UnboundCMethod_Def = { + "CythonUnboundCMethod", + __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), + METH_VARARGS | METH_KEYWORDS, + NULL +}; +static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { + PyObject *method; + method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); + if (unlikely(!method)) + return -1; + target->method = method; +#if CYTHON_COMPILING_IN_CPYTHON + #if PY_MAJOR_VERSION >= 3 + if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) + #else + if (likely(!__Pyx_CyOrPyCFunction_Check(method))) + #endif + { + PyMethodDescrObject *descr = (PyMethodDescrObject*) method; + target->func = descr->d_method->ml_meth; + target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); + } else +#endif +#if CYTHON_COMPILING_IN_PYPY +#else + if (PyCFunction_Check(method)) +#endif + { + PyObject *self; + int self_found; +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + self = PyObject_GetAttrString(method, "__self__"); + if (!self) { + PyErr_Clear(); + } +#else + self = PyCFunction_GET_SELF(method); +#endif + self_found = (self && self != Py_None); +#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY + Py_XDECREF(self); +#endif + if (self_found) { + PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); + if (unlikely(!unbound_method)) return -1; + Py_DECREF(method); + target->method = unbound_method; + } + } + return 0; +} + +/* CallUnboundCMethod0 */ +static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) { + PyObject *args, *result = NULL; + if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_ASSUME_SAFE_MACROS + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); +#else + args = PyTuple_Pack(1, self); + if (unlikely(!args)) goto bad; +#endif + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + Py_DECREF(args); +bad: + return result; +} + +/* py_dict_values */ +static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) { + if (PY_MAJOR_VERSION >= 3) + return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_values, d); + else + return PyDict_Values(d); +} + +/* CallUnboundCMethod1 */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) { + if (likely(cfunc->func)) { + int flag = cfunc->flag; + if (flag == METH_O) { + return (*(cfunc->func))(self, arg); + } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + #endif + } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) { + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL); + } + } + return __Pyx__CallUnboundCMethod1(cfunc, self, arg); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(1); + if (unlikely(!args)) goto bad; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(2, self, arg); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* CallUnboundCMethod2 */ +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1 +static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) { + if (likely(cfunc->func)) { + PyObject *args[2] = {arg1, arg2}; + if (cfunc->flag == METH_FASTCALL) { + #if PY_VERSION_HEX >= 0x030700A0 + return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2); + #else + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + #if PY_VERSION_HEX >= 0x030700A0 + if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS)) + return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL); + #endif + } + return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2); +} +#endif +static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){ + PyObject *args, *result = NULL; + if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; +#if CYTHON_COMPILING_IN_CPYTHON + if (cfunc->func && (cfunc->flag & METH_VARARGS)) { + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + if (cfunc->flag & METH_KEYWORDS) + result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL); + else + result = (*cfunc->func)(self, args); + } else { + args = PyTuple_New(3); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 1, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 2, arg2); + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); + } +#else + args = PyTuple_Pack(3, self, arg1, arg2); + if (unlikely(!args)) goto bad; + result = __Pyx_PyObject_Call(cfunc->method, args, NULL); +#endif +bad: + Py_XDECREF(args); + return result; +} + +/* dict_getitem_default */ +static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) { + PyObject* value; +#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (unlikely(PyErr_Occurred())) + return NULL; + value = default_value; + } + Py_INCREF(value); + if ((1)); +#else + if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) { + value = PyDict_GetItem(d, key); + if (unlikely(!value)) { + value = default_value; + } + Py_INCREF(value); + } +#endif + else { + if (default_value == Py_None) + value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key); + else + value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value); + } + return value; +} + +/* IsLittleEndian */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t <= '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case '?': return "'bool'"; + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparsable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, int is_complex) { + CYTHON_UNUSED_VAR(is_complex); + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static int +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number, ndim; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return -1; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return -1; + ndim = ctx->head->field->type->ndim; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return -1; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + return -1; + } + if (*ts != ',' && *ts != ')') { + PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + return -1; + } + if (*ts == ',') ts++; + i++; + } + if (i != ndim) { + PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + return -1; + } + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return -1; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return 0; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (__pyx_buffmt_parse_array(ctx, &ts) < 0) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* BufferGetAndValidate */ + static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (unlikely(info->buf == NULL)) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} +static void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static int __Pyx__GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + buf->buf = NULL; + if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { + __Pyx_ZeroBuffer(buf); + return -1; + } + if (unlikely(buf->ndim != nd)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if (unlikely((size_t)buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_SafeReleaseBuffer(buf); + return -1; +} + +/* SoftComplexToDouble */ + static double __Pyx_SoftComplexToDouble(__pyx_t_double_complex value, int have_gil) { + if (unlikely(__Pyx_CIMAG(value))) { + PyGILState_STATE gilstate; + if (!have_gil) + gilstate = PyGILState_Ensure(); + PyErr_SetString(PyExc_TypeError, + "Cannot convert 'complex' with non-zero imaginary component to 'double' " + "(this most likely comes from the '**' operator; " + "use 'cython.cpow(True)' to return 'nan' instead of a " + "complex number)."); + if (!have_gil) + PyGILState_Release(gilstate); + return -1.; + } + return __Pyx_CREAL(value); +} + +/* ErrOccurredWithGIL */ + static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void) { + int err; + #ifdef WITH_THREAD + PyGILState_STATE _save = PyGILState_Ensure(); + #endif + err = !!PyErr_Occurred(); + #ifdef WITH_THREAD + PyGILState_Release(_save); + #endif + return err; +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", + type_name, attr_name); +#else + "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", + type_name, PyString_AS_STRING(attr_name)); +#endif + __Pyx_DECREF_TypeName(type_name); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* FixUpExtensionType */ + #if CYTHON_USE_TYPE_SPECS +static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { +#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + CYTHON_UNUSED_VAR(spec); + CYTHON_UNUSED_VAR(type); +#else + const PyType_Slot *slot = spec->slots; + while (slot && slot->slot && slot->slot != Py_tp_members) + slot++; + if (slot && slot->slot == Py_tp_members) { + int changed = 0; +#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) + const +#endif + PyMemberDef *memb = (PyMemberDef*) slot->pfunc; + while (memb && memb->name) { + if (memb->name[0] == '_' && memb->name[1] == '_') { +#if PY_VERSION_HEX < 0x030900b1 + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_weaklistoffset = memb->offset; + changed = 1; + } + else if (strcmp(memb->name, "__dictoffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + type->tp_dictoffset = memb->offset; + changed = 1; + } +#if CYTHON_METH_FASTCALL + else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); +#if PY_VERSION_HEX >= 0x030800b4 + type->tp_vectorcall_offset = memb->offset; +#else + type->tp_print = (printfunc) memb->offset; +#endif + changed = 1; + } +#endif +#else + if ((0)); +#endif +#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON + else if (strcmp(memb->name, "__module__") == 0) { + PyObject *descr; + assert(memb->type == T_OBJECT); + assert(memb->flags == 0 || memb->flags == READONLY); + descr = PyDescr_NewMember(type, memb); + if (unlikely(!descr)) + return -1; + if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { + Py_DECREF(descr); + return -1; + } + Py_DECREF(descr); + changed = 1; + } +#endif + } + memb++; + } + if (changed) + PyType_Modified(type); + } +#endif + return 0; +} +#endif + +/* ValidateBasesTuple */ + #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS +static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { + Py_ssize_t i, n; +#if CYTHON_ASSUME_SAFE_MACROS + n = PyTuple_GET_SIZE(bases); +#else + n = PyTuple_Size(bases); + if (n < 0) return -1; +#endif + for (i = 1; i < n; i++) + { +#if CYTHON_AVOID_BORROWED_REFS + PyObject *b0 = PySequence_GetItem(bases, i); + if (!b0) return -1; +#elif CYTHON_ASSUME_SAFE_MACROS + PyObject *b0 = PyTuple_GET_ITEM(bases, i); +#else + PyObject *b0 = PyTuple_GetItem(bases, i); + if (!b0) return -1; +#endif + PyTypeObject *b; +#if PY_MAJOR_VERSION < 3 + if (PyClass_Check(b0)) + { + PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", + PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } +#endif + b = (PyTypeObject*) b0; + if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); + __Pyx_DECREF_TypeName(b_name); +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + if (dictoffset == 0) + { + Py_ssize_t b_dictoffset = 0; +#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY + b_dictoffset = b->tp_dictoffset; +#else + PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); + if (!py_b_dictoffset) goto dictoffset_return; + b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); + Py_DECREF(py_b_dictoffset); + if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; +#endif + if (b_dictoffset) { + { + __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); + PyErr_Format(PyExc_TypeError, + "extension type '%.200s' has no __dict__ slot, " + "but base type '" __Pyx_FMT_TYPENAME "' has: " + "either add 'cdef dict __dict__' to the extension type " + "or add '__slots__ = [...]' to the base type", + type_name, b_name); + __Pyx_DECREF_TypeName(b_name); + } +#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) + dictoffset_return: +#endif +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + return -1; + } + } +#if CYTHON_AVOID_BORROWED_REFS + Py_DECREF(b0); +#endif + } + return 0; +} +#endif + +/* PyType_Ready */ + static int __Pyx_PyType_Ready(PyTypeObject *t) { +#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) + (void)__Pyx_PyObject_CallMethod0; +#if CYTHON_USE_TYPE_SPECS + (void)__Pyx_validate_bases_tuple; +#endif + return PyType_Ready(t); +#else + int r; + PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); + if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) + return -1; +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + { + int gc_was_enabled; + #if PY_VERSION_HEX >= 0x030A00b1 + gc_was_enabled = PyGC_Disable(); + (void)__Pyx_PyObject_CallMethod0; + #else + PyObject *ret, *py_status; + PyObject *gc = NULL; + #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) + gc = PyImport_GetModule(__pyx_kp_u_gc); + #endif + if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); + if (unlikely(!gc)) return -1; + py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); + if (unlikely(!py_status)) { + Py_DECREF(gc); + return -1; + } + gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); + Py_DECREF(py_status); + if (gc_was_enabled > 0) { + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); + if (unlikely(!ret)) { + Py_DECREF(gc); + return -1; + } + Py_DECREF(ret); + } else if (unlikely(gc_was_enabled == -1)) { + Py_DECREF(gc); + return -1; + } + #endif + t->tp_flags |= Py_TPFLAGS_HEAPTYPE; +#if PY_VERSION_HEX >= 0x030A0000 + t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; +#endif +#else + (void)__Pyx_PyObject_CallMethod0; +#endif + r = PyType_Ready(t); +#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) + t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + #if PY_VERSION_HEX >= 0x030A00b1 + if (gc_was_enabled) + PyGC_Enable(); + #else + if (gc_was_enabled) { + PyObject *tp, *v, *tb; + PyErr_Fetch(&tp, &v, &tb); + ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); + if (likely(ret || r == -1)) { + Py_XDECREF(ret); + PyErr_Restore(tp, v, tb); + } else { + Py_XDECREF(tp); + Py_XDECREF(v); + Py_XDECREF(tb); + r = -1; + } + } + Py_DECREF(gc); + #endif + } +#endif + return r; +#endif +} + +/* SetVTable */ + static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { + PyObject *ob = PyCapsule_New(vtable, 0, 0); + if (unlikely(!ob)) + goto bad; +#if CYTHON_COMPILING_IN_LIMITED_API + if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) +#else + if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) +#endif + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* GetVTable */ + static void* __Pyx_GetVtable(PyTypeObject *type) { + void* ptr; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); +#else + PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); +#endif + if (!ob) + goto bad; + ptr = PyCapsule_GetPointer(ob, 0); + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +} + +/* MergeVTables */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_MergeVtables(PyTypeObject *type) { + int i; + void** base_vtables; + __Pyx_TypeName tp_base_name; + __Pyx_TypeName base_name; + void* unknown = (void*)-1; + PyObject* bases = type->tp_bases; + int base_depth = 0; + { + PyTypeObject* base = type->tp_base; + while (base) { + base_depth += 1; + base = base->tp_base; + } + } + base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); + base_vtables[0] = unknown; + for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { + void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); + if (base_vtable != NULL) { + int j; + PyTypeObject* base = type->tp_base; + for (j = 0; j < base_depth; j++) { + if (base_vtables[j] == unknown) { + base_vtables[j] = __Pyx_GetVtable(base); + base_vtables[j + 1] = unknown; + } + if (base_vtables[j] == base_vtable) { + break; + } else if (base_vtables[j] == NULL) { + goto bad; + } + base = base->tp_base; + } + } + } + PyErr_Clear(); + free(base_vtables); + return 0; +bad: + tp_base_name = __Pyx_PyType_GetName(type->tp_base); + base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); + PyErr_Format(PyExc_TypeError, + "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); + __Pyx_DECREF_TypeName(tp_base_name); + __Pyx_DECREF_TypeName(base_name); + free(base_vtables); + return -1; +} +#endif + +/* SetupReduce */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); +#else + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) { + __Pyx_TypeName type_obj_name = + __Pyx_PyType_GetName((PyTypeObject*)type_obj); + PyErr_Format(PyExc_RuntimeError, + "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); + __Pyx_DECREF_TypeName(type_obj_name); + } + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType_3_0_8 +#define __PYX_HAVE_RT_ImportType_3_0_8 +static PyTypeObject *__Pyx_ImportType_3_0_8(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_8 check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; + Py_ssize_t itemsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + PyObject *py_itemsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#if !CYTHON_COMPILING_IN_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; + itemsize = ((PyTypeObject *)result)->tp_itemsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; + py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); + if (!py_itemsize) + goto bad; + itemsize = PyLong_AsSsize_t(py_itemsize); + Py_DECREF(py_itemsize); + py_itemsize = 0; + if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (itemsize) { + if (size % alignment) { + alignment = size % alignment; + } + if (itemsize < (Py_ssize_t)alignment) + itemsize = (Py_ssize_t)alignment; + } + if ((size_t)(basicsize + itemsize) < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize+itemsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_8 && + ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd-%zd from PyObject", + module_name, class_name, size, basicsize, basicsize+itemsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_8 && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* FetchSharedCythonModule */ + static PyObject *__Pyx_FetchSharedCythonABIModule(void) { + return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); +} + +/* FetchCommonType */ + static int __Pyx_VerifyCachedType(PyObject *cached_type, + const char *name, + Py_ssize_t basicsize, + Py_ssize_t expected_basicsize) { + if (!PyType_Check(cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", name); + return -1; + } + if (basicsize != expected_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + name); + return -1; + } + return 0; +} +#if !CYTHON_USE_TYPE_SPECS +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* abi_module; + const char* object_name; + PyTypeObject *cached_type = NULL; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + object_name = strrchr(type->tp_name, '.'); + object_name = object_name ? object_name+1 : type->tp_name; + cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + if (__Pyx_VerifyCachedType( + (PyObject *)cached_type, + object_name, + cached_type->tp_basicsize, + type->tp_basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; +done: + Py_DECREF(abi_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#else +static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { + PyObject *abi_module, *cached_type = NULL; + const char* object_name = strrchr(spec->name, '.'); + object_name = object_name ? object_name+1 : spec->name; + abi_module = __Pyx_FetchSharedCythonABIModule(); + if (!abi_module) return NULL; + cached_type = PyObject_GetAttrString(abi_module, object_name); + if (cached_type) { + Py_ssize_t basicsize; +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *py_basicsize; + py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); + if (unlikely(!py_basicsize)) goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; +#else + basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; +#endif + if (__Pyx_VerifyCachedType( + cached_type, + object_name, + basicsize, + spec->basicsize) < 0) { + goto bad; + } + goto done; + } + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + CYTHON_UNUSED_VAR(module); + cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); + if (unlikely(!cached_type)) goto bad; + if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; + if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; +done: + Py_DECREF(abi_module); + assert(cached_type == NULL || PyType_Check(cached_type)); + return (PyTypeObject *) cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} +#endif + +/* PyVectorcallFastCallDict */ + #if CYTHON_METH_FASTCALL +static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + PyObject *res = NULL; + PyObject *kwnames; + PyObject **newargs; + PyObject **kwvalues; + Py_ssize_t i, pos; + size_t j; + PyObject *key, *value; + unsigned long keys_are_strings; + Py_ssize_t nkw = PyDict_GET_SIZE(kw); + newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); + if (unlikely(newargs == NULL)) { + PyErr_NoMemory(); + return NULL; + } + for (j = 0; j < nargs; j++) newargs[j] = args[j]; + kwnames = PyTuple_New(nkw); + if (unlikely(kwnames == NULL)) { + PyMem_Free(newargs); + return NULL; + } + kwvalues = newargs + nargs; + pos = i = 0; + keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; + while (PyDict_Next(kw, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(kwnames, i, key); + kwvalues[i] = value; + i++; + } + if (unlikely(!keys_are_strings)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + goto cleanup; + } + res = vc(func, newargs, nargs, kwnames); +cleanup: + Py_DECREF(kwnames); + for (i = 0; i < nkw; i++) + Py_DECREF(kwvalues[i]); + PyMem_Free(newargs); + return res; +} +static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) +{ + if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { + return vc(func, args, nargs, NULL); + } + return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); +} +#endif + +/* CythonFunctionShared */ + #if CYTHON_COMPILING_IN_LIMITED_API +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + if (__Pyx_CyFunction_Check(func)) { + return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; + } else if (PyCFunction_Check(func)) { + return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; + } + return 0; +} +#else +static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { + return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; +} +#endif +static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + __Pyx_Py_XDECREF_SET( + __Pyx_CyFunction_GetClassObj(f), + ((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#else + __Pyx_Py_XDECREF_SET( + ((PyCMethodObject *) (f))->mm_class, + (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); +#endif +} +static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) +{ + CYTHON_UNUSED_VAR(closure); + if (unlikely(op->func_doc == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); + if (unlikely(!op->func_doc)) return NULL; +#else + if (((PyCFunctionObject*)op)->m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } +#endif + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_doc, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_name == NULL)) { +#if CYTHON_COMPILING_IN_LIMITED_API + op->func_name = PyObject_GetAttrString(op->func, "__name__"); +#elif PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_name, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_qualname, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) +{ + CYTHON_UNUSED_VAR(context); + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->func_dict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(context); + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) +{ + CYTHON_UNUSED_VAR(op); + CYTHON_UNUSED_VAR(context); + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + CYTHON_UNUSED_VAR(context); + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_tuple; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value) { + value = Py_None; + } else if (unlikely(value != Py_None && !PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " + "currently affect the values used in function calls", 1); + Py_INCREF(value); + __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->defaults_kwdict; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + if (op->defaults_getter) { + if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + if (!value || value == Py_None) { + value = NULL; + } else if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + __Pyx_Py_XDECREF_SET(op->func_annotations, value); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { + PyObject* result = op->func_annotations; + CYTHON_UNUSED_VAR(context); + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyObject * +__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { + int is_coroutine; + CYTHON_UNUSED_VAR(context); + if (op->func_is_coroutine) { + return __Pyx_NewRef(op->func_is_coroutine); + } + is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; +#if PY_VERSION_HEX >= 0x03050000 + if (is_coroutine) { + PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; + fromlist = PyList_New(1); + if (unlikely(!fromlist)) return NULL; + Py_INCREF(marker); +#if CYTHON_ASSUME_SAFE_MACROS + PyList_SET_ITEM(fromlist, 0, marker); +#else + if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { + Py_DECREF(marker); + Py_DECREF(fromlist); + return NULL; + } +#endif + module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); + Py_DECREF(fromlist); + if (unlikely(!module)) goto ignore; + op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); + Py_DECREF(module); + if (likely(op->func_is_coroutine)) { + return __Pyx_NewRef(op->func_is_coroutine); + } +ignore: + PyErr_Clear(); + } +#endif + op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); + return __Pyx_NewRef(op->func_is_coroutine); +} +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject * +__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_GetAttrString(op->func, "__module__"); +} +static int +__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { + CYTHON_UNUSED_VAR(context); + return PyObject_SetAttrString(op->func, "__module__", value); +} +#endif +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, +#if CYTHON_COMPILING_IN_LIMITED_API + {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, +#endif + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, +#endif +#if CYTHON_USE_TYPE_SPECS + {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, +#if CYTHON_METH_FASTCALL +#if CYTHON_BACKPORT_VECTORCALL + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, +#else +#if !CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, +#endif +#endif +#endif +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, +#else + {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, +#endif +#endif + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) +{ + CYTHON_UNUSED_VAR(args); +#if PY_MAJOR_VERSION >= 3 + Py_INCREF(m->func_qualname); + return m->func_qualname; +#else + return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +#if !CYTHON_COMPILING_IN_LIMITED_API + PyCFunctionObject *cf = (PyCFunctionObject*) op; +#endif + if (unlikely(op == NULL)) + return NULL; +#if CYTHON_COMPILING_IN_LIMITED_API + op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); + if (unlikely(!op->func)) return NULL; +#endif + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +#if !CYTHON_COMPILING_IN_LIMITED_API + cf->m_ml = ml; + cf->m_self = (PyObject *) op; +#endif + Py_XINCREF(closure); + op->func_closure = closure; +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_XINCREF(module); + cf->m_module = module; +#endif + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; +#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API + op->func_classobj = NULL; +#else + ((PyCMethodObject*)op)->mm_class = NULL; +#endif + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + op->func_is_coroutine = NULL; +#if CYTHON_METH_FASTCALL + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { + case METH_NOARGS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; + break; + case METH_O: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; + break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; + break; + case METH_FASTCALL | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; + break; + case METH_VARARGS | METH_KEYWORDS: + __Pyx_CyFunction_func_vectorcall(op) = NULL; + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + Py_DECREF(op); + return NULL; + } +#endif + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_CLEAR(m->func); +#else + Py_CLEAR(((PyCFunctionObject*)m)->m_module); +#endif + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API +#if PY_VERSION_HEX < 0x030900B1 + Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); +#else + { + PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; + ((PyCMethodObject *) (m))->mm_class = NULL; + Py_XDECREF(cls); + } +#endif +#endif + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + Py_CLEAR(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + __Pyx_PyHeapTypeObject_GC_Del(m); +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + __Pyx__CyFunction_dealloc(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); +#if CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(m->func); +#else + Py_VISIT(((PyCFunctionObject*)m)->m_module); +#endif + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); +#if !CYTHON_COMPILING_IN_LIMITED_API + Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); +#endif + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + Py_VISIT(m->func_is_coroutine); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_LIMITED_API + PyObject *f = ((__pyx_CyFunctionObject*)func)->func; + PyObject *py_name = NULL; + PyCFunction meth; + int flags; + meth = PyCFunction_GetFunction(f); + if (unlikely(!meth)) return NULL; + flags = PyCFunction_GetFlags(f); + if (unlikely(flags < 0)) return NULL; +#else + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + int flags = f->m_ml->ml_flags; +#endif + Py_ssize_t size; + switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 0)) + return (*meth)(self, NULL); +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { +#if CYTHON_ASSUME_SAFE_MACROS + size = PyTuple_GET_SIZE(arg); +#else + size = PyTuple_Size(arg); + if (unlikely(size < 0)) return NULL; +#endif + if (likely(size == 1)) { + PyObject *result, *arg0; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + arg0 = PyTuple_GET_ITEM(arg, 0); + #else + arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; + #endif + result = (*meth)(self, arg0); + #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(arg0); + #endif + return result; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, + "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + py_name, size); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); +#endif + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); + return NULL; + } +#if CYTHON_COMPILING_IN_LIMITED_API + py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); + if (!py_name) return NULL; + PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", + py_name); + Py_DECREF(py_name); +#else + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); +#endif + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *self, *result; +#if CYTHON_COMPILING_IN_LIMITED_API + self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); + if (unlikely(!self) && PyErr_Occurred()) return NULL; +#else + self = ((PyCFunctionObject*)func)->m_self; +#endif + result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); + return result; +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; +#if CYTHON_METH_FASTCALL + __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); + if (vc) { +#if CYTHON_ASSUME_SAFE_MACROS + return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); +#else + (void) &__Pyx_PyVectorcall_FastCallDict; + return PyVectorcall_Call(func, args, kw); +#endif + } +#endif + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; +#if CYTHON_ASSUME_SAFE_MACROS + argc = PyTuple_GET_SIZE(args); +#else + argc = PyTuple_Size(args); + if (unlikely(!argc) < 0) return NULL; +#endif + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); +#if PY_MAJOR_VERSION > 2 + PyErr_Format(PyExc_TypeError, + "unbound method %.200S() needs an argument", + cyfunc->func_qualname); +#else + PyErr_SetString(PyExc_TypeError, + "unbound method needs an argument"); +#endif + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +#if CYTHON_METH_FASTCALL +static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) +{ + int ret = 0; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + if (unlikely(nargs < 1)) { + PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", + ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + ret = 1; + } + if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); + return -1; + } + return ret; +} +static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 0)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, NULL); +} +static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + if (unlikely(nargs != 1)) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + def->ml_name, nargs); + return NULL; + } + return def->ml_meth(self, args[0]); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); +} +static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; + PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; + PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); +#if CYTHON_BACKPORT_VECTORCALL + Py_ssize_t nargs = (Py_ssize_t)nargsf; +#else + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); +#endif + PyObject *self; + switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { + case 1: + self = args[0]; + args += 1; + nargs -= 1; + break; + case 0: + self = ((PyCFunctionObject*)cyfunc)->m_self; + break; + default: + return NULL; + } + return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); +} +#endif +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_CyFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, + {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, + {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, + {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, + {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, + {Py_tp_methods, (void *)__pyx_CyFunction_methods}, + {Py_tp_members, (void *)__pyx_CyFunction_members}, + {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, + {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, + {0, 0}, +}; +static PyType_Spec __pyx_CyFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_CyFunctionType_slots +}; +#else +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, +#if !CYTHON_METH_FASTCALL + 0, +#elif CYTHON_BACKPORT_VECTORCALL + (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), +#else + offsetof(PyCFunctionObject, vectorcall), +#endif + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, +#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR + Py_TPFLAGS_METHOD_DESCRIPTOR | +#endif +#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL + _Py_TPFLAGS_HAVE_VECTORCALL | +#endif + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_PyMethod_New, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_CyFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); +#else + CYTHON_UNUSED_VAR(module); + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +#endif + if (unlikely(__pyx_CyFunctionType == NULL)) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (unlikely(!m->defaults)) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + m->defaults_size = size; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* CythonFunction */ + static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + PyObject_GC_Track(op); + } + return op; +} + +/* FusedFunction */ + static PyObject * +__pyx_FusedFunction_New(PyMethodDef *ml, int flags, + PyObject *qualname, PyObject *closure, + PyObject *module, PyObject *globals, + PyObject *code) +{ + PyObject *op = __Pyx_CyFunction_Init( + PyObject_GC_New(__pyx_CyFunctionObject, __pyx_FusedFunctionType), + ml, flags, qualname, closure, module, globals, code + ); + if (likely(op)) { + __pyx_FusedFunctionObject *fusedfunc = (__pyx_FusedFunctionObject *) op; + fusedfunc->__signatures__ = NULL; + fusedfunc->self = NULL; + PyObject_GC_Track(op); + } + return op; +} +static void +__pyx_FusedFunction_dealloc(__pyx_FusedFunctionObject *self) +{ + PyObject_GC_UnTrack(self); + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + __Pyx__CyFunction_dealloc((__pyx_CyFunctionObject *) self); +} +static int +__pyx_FusedFunction_traverse(__pyx_FusedFunctionObject *self, + visitproc visit, + void *arg) +{ + Py_VISIT(self->self); + Py_VISIT(self->__signatures__); + return __Pyx_CyFunction_traverse((__pyx_CyFunctionObject *) self, visit, arg); +} +static int +__pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self) +{ + Py_CLEAR(self->self); + Py_CLEAR(self->__signatures__); + return __Pyx_CyFunction_clear((__pyx_CyFunctionObject *) self); +} +static PyObject * +__pyx_FusedFunction_descr_get(PyObject *self, PyObject *obj, PyObject *type) +{ + __pyx_FusedFunctionObject *func, *meth; + func = (__pyx_FusedFunctionObject *) self; + if (func->self || func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(self); + return self; + } + if (obj == Py_None) + obj = NULL; + if (func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD) + obj = type; + if (obj == NULL) { + Py_INCREF(self); + return self; + } + meth = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_New( + ((PyCFunctionObject *) func)->m_ml, + ((__pyx_CyFunctionObject *) func)->flags, + ((__pyx_CyFunctionObject *) func)->func_qualname, + ((__pyx_CyFunctionObject *) func)->func_closure, + ((PyCFunctionObject *) func)->m_module, + ((__pyx_CyFunctionObject *) func)->func_globals, + ((__pyx_CyFunctionObject *) func)->func_code); + if (unlikely(!meth)) + return NULL; + if (func->func.defaults) { + PyObject **pydefaults; + int i; + if (unlikely(!__Pyx_CyFunction_InitDefaults( + (PyObject*)meth, + func->func.defaults_size, + func->func.defaults_pyobjects))) { + Py_XDECREF((PyObject*)meth); + return NULL; + } + memcpy(meth->func.defaults, func->func.defaults, func->func.defaults_size); + pydefaults = __Pyx_CyFunction_Defaults(PyObject *, meth); + for (i = 0; i < meth->func.defaults_pyobjects; i++) + Py_XINCREF(pydefaults[i]); + } + __Pyx_CyFunction_SetClassObj(meth, __Pyx_CyFunction_GetClassObj(func)); + Py_XINCREF(func->__signatures__); + meth->__signatures__ = func->__signatures__; + Py_XINCREF(func->func.defaults_tuple); + meth->func.defaults_tuple = func->func.defaults_tuple; + Py_XINCREF(obj); + meth->self = obj; + return (PyObject *) meth; +} +static PyObject * +_obj_to_string(PyObject *obj) +{ + if (PyUnicode_CheckExact(obj)) + return __Pyx_NewRef(obj); +#if PY_MAJOR_VERSION == 2 + else if (PyString_Check(obj)) + return PyUnicode_FromEncodedObject(obj, NULL, "strict"); +#endif + else if (PyType_Check(obj)) + return PyObject_GetAttr(obj, __pyx_n_s_name_2); + else + return PyObject_Unicode(obj); +} +static PyObject * +__pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx) +{ + PyObject *signature = NULL; + PyObject *unbound_result_func; + PyObject *result_func = NULL; + if (unlikely(self->__signatures__ == NULL)) { + PyErr_SetString(PyExc_TypeError, "Function is not fused"); + return NULL; + } + if (PyTuple_Check(idx)) { + Py_ssize_t n = PyTuple_GET_SIZE(idx); + PyObject *list = PyList_New(n); + int i; + if (unlikely(!list)) + return NULL; + for (i = 0; i < n; i++) { + PyObject *string; +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(idx, i); +#else + PyObject *item = PySequence_ITEM(idx, i); if (unlikely(!item)) goto __pyx_err; +#endif + string = _obj_to_string(item); +#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) + Py_DECREF(item); +#endif + if (unlikely(!string)) goto __pyx_err; + PyList_SET_ITEM(list, i, string); + } + signature = PyUnicode_Join(__pyx_kp_u__12, list); +__pyx_err:; + Py_DECREF(list); + } else { + signature = _obj_to_string(idx); + } + if (unlikely(!signature)) + return NULL; + unbound_result_func = PyObject_GetItem(self->__signatures__, signature); + if (likely(unbound_result_func)) { + if (self->self) { + __pyx_FusedFunctionObject *unbound = (__pyx_FusedFunctionObject *) unbound_result_func; + __Pyx_CyFunction_SetClassObj(unbound, __Pyx_CyFunction_GetClassObj(self)); + result_func = __pyx_FusedFunction_descr_get(unbound_result_func, + self->self, self->self); + } else { + result_func = unbound_result_func; + Py_INCREF(result_func); + } + } + Py_DECREF(signature); + Py_XDECREF(unbound_result_func); + return result_func; +} +static PyObject * +__pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; + int static_specialized = (cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD && + !((__pyx_FusedFunctionObject *) func)->__signatures__); + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !static_specialized) { + return __Pyx_CyFunction_CallAsMethod(func, args, kw); + } else { + return __Pyx_CyFunction_Call(func, args, kw); + } +} +static PyObject * +__pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw) +{ + __pyx_FusedFunctionObject *binding_func = (__pyx_FusedFunctionObject *) func; + Py_ssize_t argc = PyTuple_GET_SIZE(args); + PyObject *new_args = NULL; + __pyx_FusedFunctionObject *new_func = NULL; + PyObject *result = NULL; + int is_staticmethod = binding_func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD; + if (binding_func->self) { + PyObject *self; + Py_ssize_t i; + new_args = PyTuple_New(argc + 1); + if (unlikely(!new_args)) + return NULL; + self = binding_func->self; + Py_INCREF(self); + PyTuple_SET_ITEM(new_args, 0, self); + self = NULL; + for (i = 0; i < argc; i++) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + PyObject *item = PyTuple_GET_ITEM(args, i); + Py_INCREF(item); +#else + PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad; +#endif + PyTuple_SET_ITEM(new_args, i + 1, item); + } + args = new_args; + } + if (binding_func->__signatures__) { + PyObject *tup; + if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) { + tup = PyTuple_Pack(3, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod( + func, binding_func->__signatures__, tup, NULL); + } else { + tup = PyTuple_Pack(4, binding_func->__signatures__, args, + kw == NULL ? Py_None : kw, + binding_func->func.defaults_tuple); + if (unlikely(!tup)) goto bad; + new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL); + } + Py_DECREF(tup); + if (unlikely(!new_func)) + goto bad; + __Pyx_CyFunction_SetClassObj(new_func, __Pyx_CyFunction_GetClassObj(binding_func)); + func = (PyObject *) new_func; + } + result = __pyx_FusedFunction_callfunction(func, args, kw); +bad: + Py_XDECREF(new_args); + Py_XDECREF((PyObject *) new_func); + return result; +} +static PyMemberDef __pyx_FusedFunction_members[] = { + {(char *) "__signatures__", + T_OBJECT, + offsetof(__pyx_FusedFunctionObject, __signatures__), + READONLY, + 0}, + {(char *) "__self__", T_OBJECT_EX, offsetof(__pyx_FusedFunctionObject, self), READONLY, 0}, + {0, 0, 0, 0, 0}, +}; +static PyGetSetDef __pyx_FusedFunction_getsets[] = { + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {0, 0, 0, 0, 0} +}; +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_FusedFunctionType_slots[] = { + {Py_tp_dealloc, (void *)__pyx_FusedFunction_dealloc}, + {Py_tp_call, (void *)__pyx_FusedFunction_call}, + {Py_tp_traverse, (void *)__pyx_FusedFunction_traverse}, + {Py_tp_clear, (void *)__pyx_FusedFunction_clear}, + {Py_tp_members, (void *)__pyx_FusedFunction_members}, + {Py_tp_getset, (void *)__pyx_FusedFunction_getsets}, + {Py_tp_descr_get, (void *)__pyx_FusedFunction_descr_get}, + {Py_mp_subscript, (void *)__pyx_FusedFunction_getitem}, + {0, 0}, +}; +static PyType_Spec __pyx_FusedFunctionType_spec = { + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + __pyx_FusedFunctionType_slots +}; +#else +static PyMappingMethods __pyx_FusedFunction_mapping_methods = { + 0, + (binaryfunc) __pyx_FusedFunction_getitem, + 0, +}; +static PyTypeObject __pyx_FusedFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + __PYX_TYPE_MODULE_PREFIX "fused_cython_function", + sizeof(__pyx_FusedFunctionObject), + 0, + (destructor) __pyx_FusedFunction_dealloc, + 0, + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + 0, + 0, + 0, + &__pyx_FusedFunction_mapping_methods, + 0, + (ternaryfunc) __pyx_FusedFunction_call, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + 0, + (traverseproc) __pyx_FusedFunction_traverse, + (inquiry) __pyx_FusedFunction_clear, + 0, + 0, + 0, + 0, + 0, + __pyx_FusedFunction_members, + __pyx_FusedFunction_getsets, + &__pyx_CyFunctionType_type, + 0, + __pyx_FusedFunction_descr_get, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, +#endif +#if __PYX_NEED_TP_PRINT_SLOT + 0, +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, +#endif +}; +#endif +static int __pyx_FusedFunction_init(PyObject *module) { +#if CYTHON_USE_TYPE_SPECS + PyObject *bases = PyTuple_Pack(1, __pyx_CyFunctionType); + if (unlikely(!bases)) { + return -1; + } + __pyx_FusedFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_FusedFunctionType_spec, bases); + Py_DECREF(bases); +#else + CYTHON_UNUSED_VAR(module); + __pyx_FusedFunctionType_type.tp_base = __pyx_CyFunctionType; + __pyx_FusedFunctionType = __Pyx_FetchCommonType(&__pyx_FusedFunctionType_type); +#endif + if (unlikely(__pyx_FusedFunctionType == NULL)) { + return -1; + } + return 0; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + CYTHON_MAYBE_UNUSED_VAR(tstate); + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + #if !CYTHON_COMPILING_IN_LIMITED_API +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} +#endif + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +#if CYTHON_COMPILING_IN_LIMITED_API +static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, + PyObject *firstlineno, PyObject *name) { + PyObject *replace = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; + replace = PyObject_GetAttrString(code, "replace"); + if (likely(replace)) { + PyObject *result; + result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); + Py_DECREF(replace); + return result; + } + PyErr_Clear(); + #if __PYX_LIMITED_VERSION_HEX < 0x030780000 + { + PyObject *compiled = NULL, *result = NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; + if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; + compiled = Py_CompileString( + "out = type(code)(\n" + " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" + " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" + " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" + " code.co_lnotab)\n", "", Py_file_input); + if (!compiled) return NULL; + result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); + Py_DECREF(compiled); + if (!result) PyErr_Print(); + Py_DECREF(result); + result = PyDict_GetItemString(scratch_dict, "out"); + if (result) Py_INCREF(result); + return result; + } + #else + return NULL; + #endif +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; + PyObject *replace = NULL, *getframe = NULL, *frame = NULL; + PyObject *exc_type, *exc_value, *exc_traceback; + int success = 0; + if (c_line) { + (void) __pyx_cfilenm; + (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); + code_object = Py_CompileString("_getframe()", filename, Py_eval_input); + if (unlikely(!code_object)) goto bad; + py_py_line = PyLong_FromLong(py_line); + if (unlikely(!py_py_line)) goto bad; + py_funcname = PyUnicode_FromString(funcname); + if (unlikely(!py_funcname)) goto bad; + dict = PyDict_New(); + if (unlikely(!dict)) goto bad; + { + PyObject *old_code_object = code_object; + code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); + Py_DECREF(old_code_object); + } + if (unlikely(!code_object)) goto bad; + getframe = PySys_GetObject("_getframe"); + if (unlikely(!getframe)) goto bad; + if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; + frame = PyEval_EvalCode(code_object, dict, dict); + if (unlikely(!frame) || frame == Py_None) goto bad; + success = 1; + bad: + PyErr_Restore(exc_type, exc_value, exc_traceback); + Py_XDECREF(code_object); + Py_XDECREF(py_py_line); + Py_XDECREF(py_funcname); + Py_XDECREF(dict); + Py_XDECREF(replace); + if (success) { + PyTraceBack_Here( + (struct _frame*)frame); + } + Py_XDECREF(frame); +} +#else +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} +#endif + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + __Pyx_TypeName obj_type_name; + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); + PyErr_Format(PyExc_TypeError, + "'" __Pyx_FMT_TYPENAME "' does not have the buffer interface", + obj_type_name); + __Pyx_DECREF_TypeName(obj_type_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (unlikely(buf->strides[dim] != sizeof(void *))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (unlikely(buf->strides[dim] != buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (unlikely(stride < buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (unlikely(buf->suboffsets)) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, int ndim, int spec) +{ + CYTHON_UNUSED_VAR(ndim); + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (unlikely(buf->ndim != ndim)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; + } + if (unlikely((unsigned) buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->len > 0) { + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; + } + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) + goto fail; + } + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* PyUCS4InUnicode */ + #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if PY_VERSION_HEX < 0x03090000 +#define __Pyx_PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(op) +#define __Pyx_PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(op) +#else +#define __Pyx_PyUnicode_AS_UNICODE(op) (((PyASCIIObject *)(op))->wstr) +#define __Pyx_PyUnicode_GET_SIZE(op) ((PyCompactUnicodeObject *)(op))->wstr_length +#endif +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 +static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE high_val, low_val; + Py_UNICODE* pos; + high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1))); + low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1))); + for (pos=buffer; pos < buffer+length-1; pos++) { + if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1; + } + return 0; +} +#endif +static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { + Py_UNICODE uchar; + Py_UNICODE* pos; + uchar = (Py_UNICODE) character; + for (pos=buffer; pos < buffer+length; pos++) { + if (unlikely(uchar == pos[0])) return 1; + } + return 0; +} +#endif +static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { +#if CYTHON_PEP393_ENABLED + const int kind = PyUnicode_KIND(unicode); + #ifdef PyUnicode_WCHAR_KIND + if (likely(kind != PyUnicode_WCHAR_KIND)) + #endif + { + Py_ssize_t i; + const void* udata = PyUnicode_DATA(unicode); + const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); + for (i=0; i < length; i++) { + if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1; + } + return 0; + } +#elif PY_VERSION_HEX >= 0x03090000 + #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. +#elif !defined(PyUnicode_AS_UNICODE) + #error Cannot use "UChar in Unicode" in Python < 3.9 without Py_UNICODE support. +#endif +#if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) +#if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 + if ((sizeof(Py_UNICODE) == 2) && unlikely(character > 65535)) { + return __Pyx_PyUnicodeBufferContainsUCS4_SP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } else +#endif + { + return __Pyx_PyUnicodeBufferContainsUCS4_BMP( + __Pyx_PyUnicode_AS_UNICODE(unicode), + __Pyx_PyUnicode_GET_SIZE(unicode), + character); + } +#endif +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = (double)(1.0) / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = (double)(1.0) / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = (float)(1.0) / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = (float)(1.0) / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (unlikely(from_mvs->suboffsets[i] >= 0)) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (unlikely(memviewslice->memview || memviewslice->data)) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#if PY_VERSION_HEX >= 0x030A0000 || defined(HAVE_STDARG_PROTOTYPES) + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int_type *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + return; + } + old_acquisition_count = __pyx_add_acquisition_count(memview); + if (unlikely(old_acquisition_count <= 0)) { + if (likely(old_acquisition_count == 0)) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count+1, lineno); + } + } +} +static CYTHON_INLINE void __Pyx_XCLEAR_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + __pyx_nonatomic_int_type old_acquisition_count; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + memslice->memview = NULL; + return; + } + old_acquisition_count = __pyx_sub_acquisition_count(memview); + memslice->data = NULL; + if (likely(old_acquisition_count > 1)) { + memslice->memview = NULL; + } else if (likely(old_acquisition_count == 1)) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + __pyx_fatalerror("Acquisition count is %d (line %d)", + old_acquisition_count-1, lineno); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); +#else + PyObject *from_bytes, *result = NULL; + PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; + from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); + if (!from_bytes) return NULL; + py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); + if (!py_bytes) goto limited_bad; + order_str = PyUnicode_FromString(little ? "little" : "big"); + if (!order_str) goto limited_bad; + arg_tuple = PyTuple_Pack(2, py_bytes, order_str); + if (!arg_tuple) goto limited_bad; + if (!is_unsigned) { + kwds = PyDict_New(); + if (!kwds) goto limited_bad; + if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; + } + result = PyObject_Call(from_bytes, arg_tuple, kwds); + limited_bad: + Py_XDECREF(kwds); + Py_XDECREF(arg_tuple); + Py_XDECREF(order_str); + Py_XDECREF(py_bytes); + Py_XDECREF(from_bytes); + return result; +#endif + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(int) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(int) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(int) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (int) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (int) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (int) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (int) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((int) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* ImportNumPyArray */ + static PyObject* __Pyx__ImportNumPyArray(void) { + PyObject *numpy_module, *ndarray_object = NULL; + numpy_module = __Pyx_Import(__pyx_n_s_numpy, NULL, 0); + if (likely(numpy_module)) { + ndarray_object = PyObject_GetAttrString(numpy_module, "ndarray"); + Py_DECREF(numpy_module); + } + if (unlikely(!ndarray_object)) { + PyErr_Clear(); + } + if (unlikely(!ndarray_object || !PyObject_TypeCheck(ndarray_object, &PyType_Type))) { + Py_XDECREF(ndarray_object); + Py_INCREF(Py_None); + ndarray_object = Py_None; + } + return ndarray_object; +} +static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(void) { + if (unlikely(!__pyx_numpy_ndarray)) { + __pyx_numpy_ndarray = __Pyx__ImportNumPyArray(); + } + Py_INCREF(__pyx_numpy_ndarray); + return __pyx_numpy_ndarray; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(long) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(long) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(long) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (long) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (long) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (long) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (long) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((long) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const char neg_one = (char) -1, const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if ((sizeof(char) < sizeof(long))) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + if (unlikely(__Pyx_PyLong_IsNeg(x))) { + goto raise_neg_overflow; + } else if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_DigitCount(x)) { + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 2 * PyLong_SHIFT)) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 3 * PyLong_SHIFT)) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) >= 4 * PyLong_SHIFT)) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if ((sizeof(char) <= sizeof(unsigned long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(unsigned PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + if (__Pyx_PyLong_IsCompact(x)) { + __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) + } else { + const digit* digits = __Pyx_PyLong_Digits(x); + assert(__Pyx_PyLong_DigitCount(x) > 1); + switch (__Pyx_PyLong_SignedDigitCount(x)) { + case -2: + if ((8 * sizeof(char) - 1 > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { + if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } + } +#endif + if ((sizeof(char) <= sizeof(long))) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if ((sizeof(char) <= sizeof(PY_LONG_LONG))) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); +#if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } +#endif + if (likely(v)) { + int ret = -1; +#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); +#else + PyObject *stepval = NULL, *mask = NULL, *shift = NULL; + int bits, remaining_bits, is_negative = 0; + long idigit; + int chunk_size = (sizeof(long) < 8) ? 30 : 62; + if (unlikely(!PyLong_CheckExact(v))) { + PyObject *tmp = v; + v = PyNumber_Long(v); + assert(PyLong_CheckExact(v)); + Py_DECREF(tmp); + if (unlikely(!v)) return (char) -1; + } +#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(x) == 0) + return (char) 0; + is_negative = Py_SIZE(x) < 0; +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + is_negative = result == 1; + } +#endif + if (is_unsigned && unlikely(is_negative)) { + goto raise_neg_overflow; + } else if (is_negative) { + stepval = PyNumber_Invert(v); + if (unlikely(!stepval)) + return (char) -1; + } else { + stepval = __Pyx_NewRef(v); + } + val = (char) 0; + mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; + shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; + for (bits = 0; bits < (int) sizeof(char) * 8 - chunk_size; bits += chunk_size) { + PyObject *tmp, *digit; + digit = PyNumber_And(stepval, mask); + if (unlikely(!digit)) goto done; + idigit = PyLong_AsLong(digit); + Py_DECREF(digit); + if (unlikely(idigit < 0)) goto done; + tmp = PyNumber_Rshift(stepval, shift); + if (unlikely(!tmp)) goto done; + Py_DECREF(stepval); stepval = tmp; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + if (Py_SIZE(stepval) == 0) + goto unpacking_done; + #endif + } + idigit = PyLong_AsLong(stepval); + if (unlikely(idigit < 0)) goto done; + remaining_bits = ((int) sizeof(char) * 8) - bits - (is_unsigned ? 0 : 1); + if (unlikely(idigit >= (1L << remaining_bits))) + goto raise_overflow; + val |= ((char) idigit) << bits; + #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 + unpacking_done: + #endif + if (!is_unsigned) { + if (unlikely(val & (((char) 1) << (sizeof(char) * 8 - 1)))) + goto raise_overflow; + if (is_negative) + val = ~val; + } + ret = 0; + done: + Py_XDECREF(shift); + Py_XDECREF(mask); + Py_XDECREF(stepval); +#endif + Py_DECREF(v); + if (likely(!ret)) + return val; + } + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* FormatTypeName */ + #if CYTHON_COMPILING_IN_LIMITED_API +static __Pyx_TypeName +__Pyx_PyType_GetName(PyTypeObject* tp) +{ + PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, + __pyx_n_s_name_2); + if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { + PyErr_Clear(); + Py_XDECREF(name); + name = __Pyx_NewRef(__pyx_n_s__34); + } + return name; +} +#endif + +/* CheckBinaryVersion */ + static unsigned long __Pyx_get_runtime_version(void) { +#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 + return Py_Version & ~0xFFUL; +#else + const char* rt_version = Py_GetVersion(); + unsigned long version = 0; + unsigned long factor = 0x01000000UL; + unsigned int digit = 0; + int i = 0; + while (factor) { + while ('0' <= rt_version[i] && rt_version[i] <= '9') { + digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); + ++i; + } + version += factor * digit; + if (rt_version[i] != '.') + break; + digit = 0; + factor >>= 8; + ++i; + } + return version; +#endif +} +static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { + const unsigned long MAJOR_MINOR = 0xFFFF0000UL; + if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) + return 0; + if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) + return 1; + { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compile time Python version %d.%d " + "of module '%.100s' " + "%s " + "runtime version %d.%d", + (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), + __Pyx_MODULE_NAME, + (allow_newer) ? "was newer than" : "does not match", + (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) + ); + return PyErr_WarnEx(NULL, message, 1); + } +} + +/* InitStrings */ + #if PY_MAJOR_VERSION >= 3 +static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { + if (t.is_unicode | t.is_str) { + if (t.intern) { + *str = PyUnicode_InternFromString(t.s); + } else if (t.encoding) { + *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); + } else { + *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); + } + } else { + *str = PyBytes_FromStringAndSize(t.s, t.n - 1); + } + if (!*str) + return -1; + if (PyObject_Hash(*str) == -1) + return -1; + return 0; +} +#endif +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION >= 3 + __Pyx_InitString(*t, t->p); + #else + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + #endif + ++t; + } + return 0; +} + +#include +static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { + size_t len = strlen(s); + if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, "byte string is too long"); + return -1; + } + return (Py_ssize_t) len; +} +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return __Pyx_PyUnicode_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { + Py_ssize_t len = __Pyx_ssize_strlen(c_str); + if (unlikely(len < 0)) return NULL; + return PyByteArray_FromStringAndSize(c_str, len); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { + __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " + "The ability to return an instance of a strict subclass of int is deprecated, " + "and may be removed in a future version of Python.", + result_type_name)) { + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; + } + __Pyx_DECREF_TypeName(result_type_name); + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", + type_name, type_name, result_type_name); + __Pyx_DECREF_TypeName(result_type_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(__Pyx_PyLong_IsCompact(b))) { + return __Pyx_PyLong_CompactValue(b); + } else { + const digit* digits = __Pyx_PyLong_Digits(b); + const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +/* #### Code section: utility_code_pragmas_end ### */ +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + + + +/* #### Code section: end ### */ +#endif /* Py_PYTHON_H */ diff --git a/gators/scalers/scaler.pyx b/gators/scalers/scaler.pyx index 9b3b9ab7..0ddff56c 100644 --- a/gators/scalers/scaler.pyx +++ b/gators/scalers/scaler.pyx @@ -6,14 +6,16 @@ ctypedef fused num_float_t: np.float32_t np.float64_t +cdef extern from "math.h": + double log(double x) nogil + -@cython.cdivision(True) @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] standard_scaler( +cpdef np.ndarray[num_float_t, ndim = 2] scaler( np.ndarray[num_float_t, ndim=2] X, - np.ndarray[num_float_t, ndim=1] X_mean, - np.ndarray[num_float_t, ndim=1] X_std, + np.ndarray[num_float_t, ndim=1] X_offset, + np.ndarray[num_float_t, ndim=1] X_scale, ): cdef int i @@ -23,23 +25,42 @@ cpdef np.ndarray[num_float_t, ndim = 2] standard_scaler( with nogil: for i in range(n_rows): for j in range(n_cols): - X[i, j] = (X[i, j] - X_mean[j]) / X_std[j] + X[i, j] = (X[i, j] - X_offset[j]) * X_scale[j] return X + + @cython.boundscheck(False) @cython.wraparound(False) -cpdef np.ndarray[num_float_t, ndim = 2] minmax_scaler( +cpdef np.ndarray[num_float_t, ndim = 2] yeo_johnson( np.ndarray[num_float_t, ndim=2] X, - np.ndarray[num_float_t, ndim=1] X_min, - np.ndarray[num_float_t, ndim=1] X_max, + np.ndarray[num_float_t, ndim=1] lambdas, ): cdef int i cdef int j cdef int n_rows = X.shape[0] cdef int n_cols = X.shape[1] + cdef float lmbda + cdef float x with nogil: for i in range(n_rows): for j in range(n_cols): - X[i, j] = (X[i, j] - X_min[j]) / (X_max[j] - X_min[j]) + lmbda = lambdas[j] + x = X[i, j] + if lmbda == 0: + if X[i, j] >= 0: + X[i, j] = log(x+1) + else: + X[i, j] = - ((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) + elif lmbda == 2: + if X[i, j] >= 0: + X[i, j] = ((x+1) ** lmbda - 1) / lmbda + else: + X[i, j] = -log(-x+1) + else: + if X[i, j] >= 0: + X[i, j] = ((x+1) ** lmbda - 1) / lmbda + else: + X[i, j] = -((-x+1) ** (2-lmbda) - 1) / (2 - lmbda) return X \ No newline at end of file diff --git a/gators/scalers/standard_scaler.py b/gators/scalers/standard_scaler.py index 38cb0b39..95f61e27 100644 --- a/gators/scalers/standard_scaler.py +++ b/gators/scalers/standard_scaler.py @@ -1,143 +1,97 @@ # License: Apache-2.0 -from typing import Union -import databricks.koalas as ks -import numpy as np -import pandas as pd -from scaler import standard_scaler -from ..transformers.transformer import Transformer +from ._base_scaler import _BaseScaler +from ..util import util +from gators import DataFrame, Series -class StandardScaler(Transformer): + +class StandardScaler(_BaseScaler): """Scale each column by setting the mean to 0 and the standard deviation to 1. Parameters ---------- - dtype : type, default to np.float64. - Numerical datatype of the output data. + inplace : bool, default True. + If True, perform the scaling in-place. + If False, create new columns. Examples -------- + Imports and initialization: + + >>> from gators.scalers import StandardScaler + >>> obj = StandardScaler() - * fit & transform with `pandas` + The `fit`, `transform`, and `fit_transform` methods accept: + + * `dask` dataframes: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) + + * and `pandas` dataframes: >>> import pandas as pd - >>> from gators.scalers import StandardScaler >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() - >>> obj.fit_transform(X) - A B - 0 -1.0 -1.120897 - 1 0.0 0.320256 - 2 1.0 0.800641 - * fit & transform with `koalas` + The result is a transformed dataframe belonging to the same dataframe library. - >>> import databricks.koalas as ks - >>> from gators.scalers import StandardScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() >>> obj.fit_transform(X) A B 0 -1.0 -1.120897 1 0.0 0.320256 2 1.0 0.800641 - * fit with `pandas` & transform with `NumPy` - - >>> import pandas as pd - >>> from gators.scalers import StandardScaler >>> X = pd.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() >>> _ = obj.fit(X) >>> obj.transform_numpy(X.to_numpy()) array([[-1. , -1.12089708], [ 0. , 0.32025631], [ 1. , 0.80064077]]) - - * fit with `koalas` & transform with `NumPy` - - >>> import databricks.koalas as ks - >>> from gators.scalers import StandardScaler - >>> X = ks.DataFrame({'A': [1, 2, 3], 'B': [-0.1, 0.2, 0.3]}) - >>> obj = StandardScaler() - >>> _ = obj.fit(X) - >>> obj.transform_numpy(X.to_numpy()) - array([[-1. , -1.12089708], - [ 0. , 0.32025631], - [ 1. , 0.80064077]]) - """ - def __init__(self, dtype: type = np.float64): - self.dtype = dtype - self.X_mean: Union[pd.DataFrame, ks.DataFrame] = None - self.X_std: Union[pd.DataFrame, ks.DataFrame] = None - self.X_mean_np = np.array([]) - self.X_std_np = np.array([]) + def __init__(self, inplace: bool = True): + _BaseScaler.__init__(self, inplace=inplace) - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "StandardScaler": - """Fit the transformer on the pandas/koalas dataframe X. + def fit(self, X: DataFrame, y: Series = None) -> "StandardScaler": + """Fit the transformer on the dataframe X. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- - 'StandardScaler': Instance of itself. + self : 'StandardScaler' + Instance of itself. """ self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - self.X_std = X.std().astype(self.dtype) - self.X_mean = X.mean().astype(self.dtype) - self.X_mean_np = self.X_mean.to_numpy().astype(self.dtype) - self.X_std_np = self.X_std.to_numpy().astype(self.dtype) + self.base_columns = list(X.columns) + self.columns = util.get_numerical_columns(X) + self.idx_columns = util.get_idx_columns(X, self.columns) + self.column_names = self.get_column_names( + self.inplace, self.columns, "standard_scaler" + ) + self.X_offset = ( + util.get_function(X).to_pandas(X[self.columns].mean()).astype(float) + ) + self.X_scale = ( + 1.0 / util.get_function(X).to_pandas(X[self.columns].std()) + ).astype(float) + self.X_offset_np = util.get_function(self.X_offset).to_numpy(self.X_offset) + self.X_scale_np = util.get_function(self.X_scale).to_numpy(self.X_scale) + self.X_offset = self.X_offset.to_dict() + self.X_scale = self.X_scale.to_dict() return self - - def transform(self, X): - """Transform the dataframe `X`. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame]. - Input dataframe. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. - """ - self.check_dataframe(X) - self.check_dataframe_is_numerics(X) - - def f(x: ks.Series[self.dtype]): - c = x.name - return (x - self.X_mean[c]) / self.X_std[c] - - return X.astype(self.dtype).apply(f) - - def transform_numpy(self, X: np.ndarray) -> np.ndarray: - """Transform the numpy ndarray X. - - Parameters - ---------- - X (np.ndarray): Input ndarray. - - Returns - ------- - np.ndarray: Imputed ndarray. - """ - self.check_array(X) - self.check_array_is_numerics(X) - return standard_scaler(X.astype(self.dtype), self.X_mean_np, self.X_std_np) diff --git a/gators/scalers/tests/test_minmax_scaler.py b/gators/scalers/tests/test_minmax_scaler.py deleted file mode 100644 index 27c86c94..00000000 --- a/gators/scalers/tests/test_minmax_scaler.py +++ /dev/null @@ -1,103 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest - -from gators.scalers.minmax_scaler import MinMaxScaler - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) - return MinMaxScaler().fit(X), X - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) - return MinMaxScaler().fit(X), X - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame( - np.random.randn(5, 5), - columns=list("ABCDF"), - ) - return MinMaxScaler(dtype=np.float32).fit(X), X - - -@pytest.fixture -def data_float32_ks(): - X = pd.DataFrame( - np.random.randn(5, 5), - columns=list("ABCDF"), - ) - return MinMaxScaler(dtype=np.float32).fit(X), X - - -def test_pd(data): - obj, X = data - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X = data_ks - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -def test_pd_np(data): - obj, X = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -def test_float32_pd(data_float32): - obj, X = data_float32 - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X = data_float32_ks - X_new = obj.transform(X) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -def test_float32_pd_np(data_float32): - obj, X = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.min().mean(), 0) - assert np.allclose(X_new.max().mean(), 1) diff --git a/gators/scalers/tests/test_minmax_scaler_dd.py b/gators/scalers/tests/test_minmax_scaler_dd.py new file mode 100644 index 00000000..3ec0ad44 --- /dev/null +++ b/gators/scalers/tests/test_minmax_scaler_dd.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest + +from gators.scalers.minmax_scaler import MinMaxScaler + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")), + npartitions=1, + ) + return MinMaxScaler().fit(X), X + + +@pytest.fixture +def data_not_inplace(): + X = dd.from_pandas( + pd.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")), + npartitions=1, + ) + return MinMaxScaler(inplace=False).fit(X), X + + +def test_dd(data): + obj, X = data + X_new = obj.transform(X).compute() + assert np.allclose(X_new.min().mean(), 0) + assert np.allclose(X_new.max().mean(), 1) + + +def test_dd_np(data): + obj, X = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.min().mean(), 0) + assert np.allclose(X_new.max().mean(), 1) + + +def test_not_inplace_dd(data_not_inplace): + obj, X = data_not_inplace + X_new = obj.transform(X).compute() + assert np.allclose(X_new.iloc[:, 5:].min().mean(), 0) + assert np.allclose(X_new.iloc[:, 5:].max().mean(), 1) + assert X_new.shape[1] == 10 + + +def test_not_inplace_dd_np(data_not_inplace): + obj, X = data_not_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + assert np.allclose(X_numpy_new[:, 5:].min().mean(), 0) + assert np.allclose(X_numpy_new[:, 5:].max().mean(), 1) + assert X_numpy_new.shape[1] == 10 diff --git a/gators/scalers/tests/test_minmax_scaler_ks.py b/gators/scalers/tests/test_minmax_scaler_ks.py new file mode 100644 index 00000000..62b19b01 --- /dev/null +++ b/gators/scalers/tests/test_minmax_scaler_ks.py @@ -0,0 +1,56 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest + +from gators.scalers.minmax_scaler import MinMaxScaler + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) + return MinMaxScaler().fit(X), X + + +@pytest.fixture +def data_not_inplace(): + X = ps.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) + return MinMaxScaler(inplace=False).fit(X), X + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X = data_ks + X_new = obj.transform(X) + assert np.allclose(X_new.min().mean(), 0) + assert np.allclose(X_new.max().mean(), 1) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.min().mean(), 0) + assert np.allclose(X_new.max().mean(), 1) + + +@pytest.mark.pyspark +def test_not_inplace_pd(data_not_inplace): + obj, X = data_not_inplace + X_new = obj.transform(X).to_pandas() + assert np.allclose(X_new.iloc[:, 5:].min().mean(), 0) + assert np.allclose(X_new.iloc[:, 5:].max().mean(), 1) + assert X_new.shape[1] == 10 + + +@pytest.mark.pyspark +def test_not_inplace_pd_np(data_not_inplace): + obj, X = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + assert np.allclose(X_numpy_new[:, 5:].min().mean(), 0) + assert np.allclose(X_numpy_new[:, 5:].max().mean(), 1) + assert X_numpy_new.shape[1] == 10 diff --git a/gators/scalers/tests/test_minmax_scaler_pd.py b/gators/scalers/tests/test_minmax_scaler_pd.py new file mode 100644 index 00000000..390c5c09 --- /dev/null +++ b/gators/scalers/tests/test_minmax_scaler_pd.py @@ -0,0 +1,49 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest + +from gators.scalers.minmax_scaler import MinMaxScaler + + +@pytest.fixture +def data(): + X = pd.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) + return MinMaxScaler().fit(X), X + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame(np.arange(25).reshape((5, 5)), columns=list("ABCDF")) + return MinMaxScaler(inplace=False).fit(X), X + + +def test_pd(data): + obj, X = data + X_new = obj.transform(X) + assert np.allclose(X_new.min().mean(), 0) + assert np.allclose(X_new.max().mean(), 1) + + +def test_pd_np(data): + obj, X = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.min().mean(), 0) + assert np.allclose(X_new.max().mean(), 1) + + +def test_not_inplace_pd(data_not_inplace): + obj, X = data_not_inplace + X_new = obj.transform(X) + assert np.allclose(X_new.iloc[:, 5:].min().mean(), 0) + assert np.allclose(X_new.iloc[:, 5:].max().mean(), 1) + assert X_new.shape[1] == 10 + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + assert np.allclose(X_numpy_new[:, 5:].min().mean(), 0) + assert np.allclose(X_numpy_new[:, 5:].max().mean(), 1) + assert X_numpy_new.shape[1] == 10 diff --git a/gators/scalers/tests/test_standard_scaler.py b/gators/scalers/tests/test_standard_scaler.py deleted file mode 100644 index bf752ef8..00000000 --- a/gators/scalers/tests/test_standard_scaler.py +++ /dev/null @@ -1,97 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest - -from gators.scalers.standard_scaler import StandardScaler - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - X = pd.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) - return StandardScaler().fit(X), X - - -@pytest.fixture -def data_ks(): - X = ks.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) - return StandardScaler().fit(X), X - - -@pytest.fixture -def data_float32(): - X = pd.DataFrame(np.random.randn(5, 5), columns=list("ABCDF"), dtype=np.float32) - return StandardScaler().fit(X), X - - -@pytest.fixture -def data_float32_ks(): - X = ks.DataFrame(np.random.randn(5, 5), columns=list("ABCDF"), dtype=np.float32) - return StandardScaler().fit(X), X - - -def test_pd(data): - obj, X = data - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -@pytest.mark.koalas -def test_ks(data_ks): - obj, X = data_ks - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -def test_pd_np(data): - obj, X = data - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -@pytest.mark.koalas -def test_ks_np(data_ks): - obj, X = data_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0) - assert np.allclose(X_new.std().mean(), 1) - - -def test_float32_pd(data_float32): - obj, X = data_float32 - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) - - -@pytest.mark.koalas -def test_float32_ks(data_float32_ks): - obj, X = data_float32_ks - X_new = obj.transform(X) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) - - -def test_float32_pd_np(data_float32): - obj, X = data_float32 - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) - - -@pytest.mark.koalas -def test_float32_ks_np(data_float32_ks): - obj, X = data_float32_ks - X_numpy_new = obj.transform_numpy(X.to_numpy()) - X_new = pd.DataFrame(X_numpy_new) - assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) - assert np.allclose(X_new.std().mean(), 1, atol=1e-7) diff --git a/gators/scalers/tests/test_standard_scaler_dd.py b/gators/scalers/tests/test_standard_scaler_dd.py new file mode 100644 index 00000000..3f62c359 --- /dev/null +++ b/gators/scalers/tests/test_standard_scaler_dd.py @@ -0,0 +1,30 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest + +from gators.scalers.standard_scaler import StandardScaler + + +@pytest.fixture +def data(): + X = dd.from_pandas( + pd.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")), npartitions=1 + ) + return StandardScaler().fit(X), X + + +def test_pd(data): + obj, X = data + X_new = obj.transform(X).compute() + assert np.allclose(X_new.mean().mean(), 0) + assert np.allclose(X_new.std().mean(), 1) + + +def test_pd_np(data): + obj, X = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.mean().mean(), 0) + assert np.allclose(X_new.std().mean(), 1) diff --git a/gators/scalers/tests/test_standard_scaler_ks.py b/gators/scalers/tests/test_standard_scaler_ks.py new file mode 100644 index 00000000..0d09e92d --- /dev/null +++ b/gators/scalers/tests/test_standard_scaler_ks.py @@ -0,0 +1,55 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest + +from gators.scalers.standard_scaler import StandardScaler + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + X = ps.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) + return StandardScaler().fit(X), X + + +@pytest.fixture +def data_float32_ks(): + X = ps.DataFrame(np.random.randn(5, 5), columns=list("ABCDF"), dtype=np.float32) + return StandardScaler().fit(X), X + + +@pytest.mark.pyspark +def test_ks(data_ks): + obj, X = data_ks + X_new = obj.transform(X) + assert np.allclose(X_new.mean().mean(), 0) + assert np.allclose(X_new.std().mean(), 1) + + +@pytest.mark.pyspark +def test_ks_np(data_ks): + obj, X = data_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.mean().mean(), 0) + assert np.allclose(X_new.std().mean(), 1) + + +@pytest.mark.pyspark +def test_float32_ks(data_float32_ks): + obj, X = data_float32_ks + X_new = obj.transform(X) + assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) + assert np.allclose(X_new.std().mean(), 1, atol=1e-7) + + +@pytest.mark.pyspark +def test_float32_ks_np(data_float32_ks): + obj, X = data_float32_ks + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.mean().mean(), 0, atol=1e-7) + assert np.allclose(X_new.std().mean(), 1, atol=1e-7) diff --git a/gators/scalers/tests/test_standard_scaler_pd.py b/gators/scalers/tests/test_standard_scaler_pd.py new file mode 100644 index 00000000..ba58972c --- /dev/null +++ b/gators/scalers/tests/test_standard_scaler_pd.py @@ -0,0 +1,49 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest + +from gators.scalers.standard_scaler import StandardScaler + + +@pytest.fixture +def data(): + X = pd.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) + return StandardScaler().fit(X), X + + +@pytest.fixture +def data_not_inplace(): + X = pd.DataFrame(np.random.randn(5, 5), columns=list("ABCDF")) + return StandardScaler(inplace=False).fit(X), X + + +def test_pd(data): + obj, X = data + X_new = obj.transform(X) + assert np.allclose(X_new.mean().mean(), 0) + assert np.allclose(X_new.std().mean(), 1) + + +def test_pd_np(data): + obj, X = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new) + assert np.allclose(X_new.mean().mean(), 0) + assert np.allclose(X_new.std().mean(), 1) + + +def test_not_inplace_pd(data_not_inplace): + obj, X = data_not_inplace + X_new = obj.transform(X) + assert np.allclose(X_new.iloc[:, 5:].mean(0).mean(), 0, atol=1e-7) + assert np.allclose(X_new.iloc[:, 5:].std(0, ddof=1).mean(), 1, atol=1e-7) + assert X_new.shape[1] == 10 + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + assert np.allclose(X_numpy_new[:, 5:].mean(0).mean(), 0, atol=1e-7) + assert np.allclose(X_numpy_new[:, 5:].std(0, ddof=1).mean(), 1, atol=1e-7) + assert X_numpy_new.shape[1] == 10 diff --git a/gators/scalers/tests/test_yeo_johnson_dd.py b/gators/scalers/tests/test_yeo_johnson_dd.py new file mode 100644 index 00000000..6cf103df --- /dev/null +++ b/gators/scalers/tests/test_yeo_johnson_dd.py @@ -0,0 +1,247 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.scalers.yeo_johnson import YeoJohnson + + +@pytest.fixture +def data(): + + X = dd.from_pandas( + pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ), + npartitions=2, + ) + lambdas_dict = { + "A": 0.8130050344716966, + "B": 1.0431595843133055, + "C": 0.9168245659045446, + } + X_expected = pd.DataFrame( + { + "A": { + 0: 2.566505499508099, + 1: 0.9309500374418126, + 2: -3.52463810254087, + 3: -1.0756407146577545, + 4: -3.52463810254087, + }, + "B": { + 0: 24.28482282762873, + 1: 42.83224067680155, + 2: -23.431273698291413, + 3: 39.324309978116744, + 4: -1.9450189509681384, + }, + "C": { + 0: 6.459179705999775, + 1: 54.13297098278756, + 2: -8.961788539290808, + 3: -68.6845869657268, + 4: -9.111836147073353, + }, + }, + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.fixture +def data_not_inplace(): + + X = dd.from_pandas( + pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ), + npartitions=2, + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + "A__yeojohnson": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B__yeojohnson": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C__yeojohnson": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict, inplace=False).fit(X), X, X_expected + + +@pytest.fixture +def data_0lambda(): + X = dd.from_pandas( + pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ), + npartitions=2, + ) + lambdas_dict = {"A": 0, "B": 0, "C": 0} + X_expected = pd.DataFrame( + { + "A": { + 0: 1.3862943611198906, + 1: 0.6931471805599453, + 2: -7.5, + 3: -1.5, + 4: -7.5, + }, + "B": { + 0: 3.1354942159291497, + 1: 3.6635616461296463, + 2: -364.0, + 3: 3.58351893845611, + 4: -4.0, + }, + "C": { + 0: 2.1102132003465894, + 1: 4.2805931204649, + 2: -39.32781250000001, + 3: -1462.905, + 4: -40.45125000000001, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.fixture +def data_2lambda(): + + X = dd.from_pandas( + pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ), + npartitions=2, + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_0lambda_pd(data_0lambda): + obj, X, X_expected = data_0lambda + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_2lambda_pd(data_2lambda): + obj, X, X_expected = data_2lambda + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X).compute() + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def compute_iv(X, y, regularization=0.1): + y_name = y.name + mask = X.dtypes == object + object_columns = mask[mask].index + stats = ( + pd.melt(X[object_columns].join(y), id_vars=y_name) + .groupby(["variable", "value"]) + .agg(["sum", "count"])[y_name] + ) + stats = stats.rename(columns={"sum": "1"}) + stats["0"] = stats["count"] - stats["1"] + stats = stats.drop("count", axis=1) + stats = stats[["0", "1"]] + stats[["distrib_0", "distrib_1"]] = (stats[["0", "1"]] + regularization) / ( + stats[["0", "1"]].groupby("variable").sum() + 2 * regularization + ) + iv = (stats["distrib_1"] - stats["distrib_0"]) * np.log( + stats["distrib_1"] / stats["distrib_0"] + ) + iv = iv.groupby("variable").sum() + iv.index.name = "iv" + return iv, stats diff --git a/gators/scalers/tests/test_yeo_johnson_ks.py b/gators/scalers/tests/test_yeo_johnson_ks.py new file mode 100644 index 00000000..1ef94e57 --- /dev/null +++ b/gators/scalers/tests/test_yeo_johnson_ks.py @@ -0,0 +1,215 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.scalers.yeo_johnson import YeoJohnson + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data(): + + X = ps.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.fixture +def data_not_inplace(): + + X = ps.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + "A__yeojohnson": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B__yeojohnson": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C__yeojohnson": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict, inplace=False).fit(X), X, X_expected + + +@pytest.fixture +def data_0lambda(): + X = ps.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 0, "B": 0, "C": 0} + X_expected = pd.DataFrame( + { + "A": { + 0: 1.3862943611198906, + 1: 0.6931471805599453, + 2: -7.5, + 3: -1.5, + 4: -7.5, + }, + "B": { + 0: 3.1354942159291497, + 1: 3.6635616461296463, + 2: -364.0, + 3: 3.58351893845611, + 4: -4.0, + }, + "C": { + 0: 2.1102132003465894, + 1: 4.2805931204649, + 2: -39.32781250000001, + 3: -1462.905, + 4: -40.45125000000001, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.fixture +def data_2lambda(): + + X = ps.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.mark.pyspark +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X).to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_0lambda_pd(data_0lambda): + obj, X, X_expected = data_0lambda + X_new = obj.transform(X).to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_2lambda_pd(data_2lambda): + obj, X, X_expected = data_2lambda + X_new = obj.transform(X).to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X).to_pandas() + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +@pytest.mark.pyspark +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) diff --git a/gators/scalers/tests/test_yeo_johnson_pd.py b/gators/scalers/tests/test_yeo_johnson_pd.py new file mode 100644 index 00000000..304b4915 --- /dev/null +++ b/gators/scalers/tests/test_yeo_johnson_pd.py @@ -0,0 +1,233 @@ +# License: Apache-2.0 +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.scalers.yeo_johnson import YeoJohnson + + +@pytest.fixture +def data(): + + X = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = { + "A": 0.8130050344716966, + "B": 1.0431595843133055, + "C": 0.9168245659045446, + } + X_expected = pd.DataFrame( + { + "A": { + 0: 2.566505499508099, + 1: 0.9309500374418126, + 2: -3.52463810254087, + 3: -1.0756407146577545, + 4: -3.52463810254087, + }, + "B": { + 0: 24.28482282762873, + 1: 42.83224067680155, + 2: -23.431273698291413, + 3: 39.324309978116744, + 4: -1.9450189509681384, + }, + "C": { + 0: 6.459179705999775, + 1: 54.13297098278756, + 2: -8.961788539290808, + 3: -68.6845869657268, + 4: -9.111836147073353, + }, + }, + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.fixture +def data_not_inplace(): + + X = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + "A__yeojohnson": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B__yeojohnson": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C__yeojohnson": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict, inplace=False).fit(X), X, X_expected + + +@pytest.fixture +def data_0lambda(): + X = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 0, "B": 0, "C": 0} + X_expected = pd.DataFrame( + { + "A": { + 0: 1.3862943611198906, + 1: 0.6931471805599453, + 2: -7.5, + 3: -1.5, + 4: -7.5, + }, + "B": { + 0: 3.1354942159291497, + 1: 3.6635616461296463, + 2: -364.0, + 3: 3.58351893845611, + 4: -4.0, + }, + "C": { + 0: 2.1102132003465894, + 1: 4.2805931204649, + 2: -39.32781250000001, + 3: -1462.905, + 4: -40.45125000000001, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +@pytest.fixture +def data_2lambda(): + + X = pd.DataFrame( + { + "A": {0: 3.0, 1: 1.0, 2: -3.0, 3: -1.0, 4: -3.0}, + "B": {0: 22.0, 1: 38.0, 2: -26.0, 3: 35.0, 4: 3 - 5.0}, + "C": {0: 7.25, 1: 71.2833, 2: -7.925, 3: -53.1, 4: -8.05}, + } + ) + lambdas_dict = {"A": 2, "B": 2, "C": 2} + X_expected = pd.DataFrame( + { + "A": { + 0: 7.5, + 1: 1.5, + 2: -1.3862943611198906, + 3: -0.6931471805599453, + 4: -1.3862943611198906, + }, + "B": { + 0: 264.0, + 1: 760.0, + 2: -3.295836866004329, + 3: 647.5, + 4: -1.0986122886681098, + }, + "C": { + 0: 33.53125, + 1: 2611.9377294449996, + 2: -2.188856327665703, + 3: -3.9908341858524357, + 4: -2.2027647577118348, + }, + } + ) + + return YeoJohnson(lambdas_dict=lambdas_dict).fit(X), X, X_expected + + +def test_pd(data): + obj, X, X_expected = data + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_0lambda_pd(data_0lambda): + obj, X, X_expected = data_0lambda + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_2lambda_pd(data_2lambda): + obj, X, X_expected = data_2lambda + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X) + assert_frame_equal(X_new, X_expected) + + +def test_pd_np(data): + obj, X, X_expected = data + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_0lambda_pd_np(data_0lambda): + obj, X, X_expected = data_0lambda + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_2lambda_pd_np(data_2lambda): + obj, X, X_expected = data_2lambda + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_not_inplace_pd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.to_numpy()) + X_new = pd.DataFrame(X_numpy_new, columns=X_expected.columns) + assert_frame_equal(X_new, X_expected) + + +def test_inputs(): + with pytest.raises(TypeError): + YeoJohnson(lambdas_dict=[]) + with pytest.raises(ValueError): + YeoJohnson(lambdas_dict={}) + with pytest.raises(TypeError): + YeoJohnson(lambdas_dict={"A": 0.5}, inplace="x") diff --git a/gators/scalers/yeo_johnson.py b/gators/scalers/yeo_johnson.py new file mode 100644 index 00000000..da67027d --- /dev/null +++ b/gators/scalers/yeo_johnson.py @@ -0,0 +1,180 @@ +# License: Apache-2.0 +from typing import Dict + +import numpy as np + +from scaler import yeo_johnson + +from . import StandardScaler +from ..transformers.transformer import Transformer +from ..util import util + +from gators import DataFrame, Series + + +class YeoJohnson(Transformer): + """Scale the data accoring to the Yeo-Johnson transformation. + + .. note:: + It is recommanded to use the StandardScaler transformer before running YeoJohnson. + + Parameters + ---------- + lambdas_dict : Dict[str, List[float]] + The keys are the columns, the values are the list of lambdas: + + Examples + --------- + Imports and initialization: + + >>> from gators.scalers import YeoJohnson + >>> lambdas_dict = {'A': 0.8130050344716966, 'B': 1.0431595843133055, 'C': 0.9168245659045446} + >>> obj = YeoJohnson(lambdas_dict=lambdas_dict) + + The `fit`, `transform`, and `fit_transform` methods accept: + + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> X = dd.from_pandas(pd.DataFrame({ + ... "A": [3., 1., -3., -1., -3.], + ... "B": [22.0, 38.0, -26.0, 35.0, 3 - 5.0], + ... "C": [7.25, 71.2833, -7.925, -53.1, -8.05]}), npartitions=1) + + * `koalas` dataframes: + + >>> import pyspark.pandas as ps + >>> X = ps.DataFrame({ + ... "A": [3., 1., -3., -1., -3.], + ... "B": [22.0, 38.0, -26.0, 35.0, 3 - 5.0], + ... "C": [7.25, 71.2833, -7.925, -53.1, -8.05]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> X = pd.DataFrame({ + ... "A": [3., 1., -3., -1., -3.], + ... "B": [22.0, 38.0, -26.0, 35.0, 3 - 5.0], + ... "C": [7.25, 71.2833, -7.925, -53.1, -8.05]}) + + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) + A B C + 0 2.566505 24.284823 6.459180 + 1 0.930950 42.832241 54.132971 + 2 -3.524638 -23.431274 -8.961789 + 3 -1.075641 39.324310 -68.684587 + 4 -3.524638 -1.945019 -9.111836 + + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + + >>> obj.transform_numpy(X.to_numpy()) + array([[ 2.22845745, 26.90617943, 5.7929225 ], + [ 0.87009573, 48.50683594, 41.9899559 ], + [ -4.21259165, -21.19840813, -10.21141434], + [ -1.16205084, 44.38453674, -90.64434052], + [ -4.21259165, -1.89256322, -10.39319134]]) + """ + + def __init__(self, lambdas_dict: Dict[str, float], inplace: bool = True): + if not isinstance(lambdas_dict, dict): + raise TypeError("`lambdas_dict` should be a dictionary.") + if len(lambdas_dict) == 0: + raise ValueError("Length of `lambdas_dict` should be not zero.") + if not isinstance(inplace, bool): + raise TypeError("`inplace` should be a bool.") + self.lambdas_dict = lambdas_dict + self.inplace = inplace + self.lambdas_np = np.array(list(lambdas_dict.values())).astype(float) + self.columns = list(lambdas_dict.keys()) + + def fit(self, X: DataFrame, y: Series = None) -> "YeoJonhson": + """Fit the transformer on the dataframe X. + + Parameters + ---------- + X : DataFrame + Input dataframe. + y : Series, default None. + Target values. + + Returns + ------- + self : 'YeoJonhson' + Instance of itself. + """ + self.check_dataframe(X) + self.base_columns = list(X.columns) + self.idx_columns = util.get_idx_columns(X, self.columns) + self.column_names = self.get_column_names( + self.inplace, self.columns, "yeojohnson" + ) + return self + + def transform(self, X): + """Transform the dataframe `X`. + + Parameters + ---------- + X : DataFrame. + Input dataframe. + + Returns + ------- + X : DataFrame + Transformed dataframe. + """ + self.check_dataframe(X) + for col, name in zip(self.columns, self.column_names): + lmbda = self.lambdas_dict[col] + if lmbda == 0: + X[name] = ( + X[col] + .where(X[col] < 0, np.log1p(X[col])) + .where( + X[col] >= 0, -((-X[col] + 1) ** (2 - lmbda) - 1) / (2 - lmbda) + ) + ) + elif lmbda == 2: + X[name] = ( + X[col] + .where(X[col] < 0, ((X[col] + 1) ** lmbda - 1) / lmbda) + .where(X[col] >= 0, -np.log1p(-X[col])) + ) + else: + X[name] = ( + X[col] + .where(X[col] < 0, ((X[col] + 1) ** lmbda - 1) / lmbda) + .where( + X[col] >= 0, -((-X[col] + 1) ** (2 - lmbda) - 1) / (2 - lmbda) + ) + ) + + return X + + def transform_numpy(self, X: np.ndarray) -> np.ndarray: + """Transform the array `X`. + + Parameters + ---------- + X :np.ndarray: + Input array. + + Returns + ------- + X : np.ndarray + Transformed array. + """ + self.check_array(X) + X_yeo_johnson = yeo_johnson(X.astype(float), self.lambdas_np) + if self.inplace: + X[:, self.idx_columns] = X_yeo_johnson + return X + return np.concatenate((X, X_yeo_johnson), axis=1) + # if self.inplace: + # return yeo_johnson(X, self.idx_columns, self.lambdas_np) + # else: + # X_yeo_johnson = yeo_johnson(X.copy(), self.idx_columns, self.lambdas_np) + # return np.concatenate((X, X_yeo_johnson[:, self.idx_columns]), axis=1) diff --git a/gators/transformers/__pycache__/__init__.cpython-38.pyc b/gators/transformers/__pycache__/__init__.cpython-38.pyc index a13bab89..42ad2e33 100644 Binary files a/gators/transformers/__pycache__/__init__.cpython-38.pyc and b/gators/transformers/__pycache__/__init__.cpython-38.pyc differ diff --git a/gators/transformers/__pycache__/transformer.cpython-38.pyc b/gators/transformers/__pycache__/transformer.cpython-38.pyc deleted file mode 100644 index b333e929..00000000 Binary files a/gators/transformers/__pycache__/transformer.cpython-38.pyc and /dev/null differ diff --git a/gators/transformers/__pycache__/transformer_xy.cpython-38.pyc b/gators/transformers/__pycache__/transformer_xy.cpython-38.pyc deleted file mode 100644 index caa7ece0..00000000 Binary files a/gators/transformers/__pycache__/transformer_xy.cpython-38.pyc and /dev/null differ diff --git a/gators/transformers/tests/test_transformer.py b/gators/transformers/tests/test_transformer.py deleted file mode 100644 index fe60c663..00000000 --- a/gators/transformers/tests/test_transformer.py +++ /dev/null @@ -1,115 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest - -from gators.transformers.transformer import Transformer - - -class Class(Transformer): - def fit(self, X, y=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - - -def test_no_fit_method(): - with pytest.raises(TypeError): - - class Class(Transformer): - pass - - Class() - - -def test_no_transform_method(): - with pytest.raises(TypeError): - - class Class(Transformer): - def fit(self): - pass - - Class() - - -def test_object_creation(): - class Class(Transformer): - def fit(self, X, y=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - - Class().fit(0).transform(0) - assert True - - -def test_object_creation_with_fit_transform(): - class Class(Transformer): - def fit(self, X, y_none=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - - Class().fit_transform(0) - assert True - - -def test_check_dataframe_contains_numerics(): - Transformer.check_dataframe_contains_numerics(pd.DataFrame({"A": [1], "B": ["b"]})) - - -def test_checks(): - X = pd.DataFrame() - with pytest.raises(TypeError): - Transformer.check_dataframe([]) - with pytest.raises(ValueError): - Transformer.check_dataframe(pd.DataFrame({"A": [1], 0: ["x"]})) - with pytest.raises(TypeError): - Transformer.check_y(pd.DataFrame({"A": [1], 0: ["x"]}), []) - with pytest.raises(TypeError): - Transformer.check_y(ks.DataFrame({"A": [1], 0: ["x"]}), []) - with pytest.raises(TypeError): - Transformer.check_y(pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1])) - with pytest.raises(ValueError): - Transformer.check_y( - pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1, 2], name="Y") - ) - with pytest.raises(TypeError): - Transformer.check_array([]) - with pytest.raises(TypeError): - Transformer.check_y(X, []) - with pytest.raises(ValueError): - Class().check_array_is_numerics(np.array(["a"])) - with pytest.raises(ValueError): - Transformer.check_dataframe_is_numerics(pd.DataFrame({"A": [1], "x": ["x"]})) - with pytest.raises(ValueError): - Transformer.check_binary_target(pd.Series([1, 2, 3], name="TARGET")) - with pytest.raises(ValueError): - Transformer.check_multiclass_target(pd.Series([1.1, 2.2, 3.3], name="TARGET")) - with pytest.raises(ValueError): - Transformer.check_regression_target(pd.Series([1, 0, 0], name="TARGET")) - with pytest.raises(ValueError): - Class().check_nans(pd.DataFrame({"A": [np.nan]}), columns=["A"]) - with pytest.raises(ValueError): - Class().check_dataframe_with_objects(pd.DataFrame({"A": [1.1], "B": [0]})) - with pytest.raises(ValueError): - Class().check_dataframe_contains_numerics( - pd.DataFrame({"A": ["a"], "B": ["b"]}) - ) - with pytest.raises(ValueError): - Class().check_datatype(object, [np.float64]) - with pytest.raises(ValueError): - Class().check_array_is_numerics(np.array([["a"], ["b"]])) diff --git a/gators/transformers/tests/test_transformer_dd.py b/gators/transformers/tests/test_transformer_dd.py new file mode 100644 index 00000000..2870e2f0 --- /dev/null +++ b/gators/transformers/tests/test_transformer_dd.py @@ -0,0 +1,46 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import numpy as np +import pandas as pd +import pytest + +from gators.transformers.transformer import Transformer + + +class Class(Transformer): + def fit(self, X, y=None): + return self + + def transform(self, X): + pass + + def transform_numpy(self, X): + pass + + +def test_checks(): + X = dd.from_pandas(pd.DataFrame(), npartitions=1) + with pytest.raises(TypeError): + Transformer.check_dataframe([]) + with pytest.raises(TypeError): + Transformer.check_dataframe( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1) + ) + with pytest.raises(TypeError): + Transformer.check_target( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1), [] + ) + with pytest.raises(TypeError): + Transformer.check_target( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1), + dd.from_pandas(pd.Series([1]), npartitions=1), + ) + with pytest.raises(ValueError): + Transformer.check_target( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1), + dd.from_pandas(pd.Series([1, 2], name="Y"), npartitions=1), + ) + with pytest.raises(TypeError): + Transformer.check_array([]) + with pytest.raises(TypeError): + Transformer.check_target(X, []) diff --git a/gators/transformers/tests/test_transformer_ks.py b/gators/transformers/tests/test_transformer_ks.py new file mode 100644 index 00000000..1342675c --- /dev/null +++ b/gators/transformers/tests/test_transformer_ks.py @@ -0,0 +1,41 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest + +from gators.transformers.transformer import Transformer + + +class Class(Transformer): + def fit(self, X, y=None): + return self + + def transform(self, X): + pass + + def transform_numpy(self, X): + pass + + +@pytest.mark.pyspark +def test_checks(): + X = ps.DataFrame() + with pytest.raises(TypeError): + Transformer.check_dataframe([]) + with pytest.raises(TypeError): + Transformer.check_dataframe(ps.DataFrame({"A": [1], 0: ["x"]})) + with pytest.raises(TypeError): + Transformer.check_target(ps.DataFrame({"A": [1], 0: ["x"]}), []) + with pytest.raises(TypeError): + Transformer.check_target(ps.DataFrame({"A": [1], 0: ["x"]}), []) + with pytest.raises(TypeError): + Transformer.check_target(ps.DataFrame({"A": [1], 0: ["x"]}), ps.Series([1])) + with pytest.raises(ValueError): + Transformer.check_target( + ps.DataFrame({"A": [1], 0: ["x"]}), ps.Series([1, 2], name="Y") + ) + with pytest.raises(TypeError): + Transformer.check_array([]) + with pytest.raises(TypeError): + Transformer.check_target(X, []) diff --git a/gators/transformers/tests/test_transformer_pd.py b/gators/transformers/tests/test_transformer_pd.py new file mode 100644 index 00000000..daf0d959 --- /dev/null +++ b/gators/transformers/tests/test_transformer_pd.py @@ -0,0 +1,83 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest + +from gators.transformers.transformer import Transformer + + +class Class(Transformer): + def fit(self, X, y=None): + return self + + def transform(self, X): + pass + + def transform_numpy(self, X): + pass + + +def test_no_fit_method(): + with pytest.raises(TypeError): + + class Class(Transformer): + pass + + Class() + + +def test_no_transform_method(): + with pytest.raises(TypeError): + + class Class(Transformer): + def fit(self): + pass + + Class() + + +def test_object_creation(): + class Class(Transformer): + def fit(self, X, y=None): + return self + + def transform(self, X): + pass + + def transform_numpy(self, X): + pass + + Class().fit(0).transform(0) + assert True + + +def test_object_creation_with_fit_transform(): + class Class(Transformer): + def fit(self, X, y_none=None): + return self + + def transform(self, X): + pass + + def transform_numpy(self, X): + pass + + +def test_checks(): + X = pd.DataFrame() + with pytest.raises(TypeError): + Transformer.check_dataframe([]) + with pytest.raises(TypeError): + Transformer.check_dataframe(pd.DataFrame({"A": [1], 0: ["x"]})) + with pytest.raises(TypeError): + Transformer.check_target(pd.DataFrame({"A": [1], 0: ["x"]}), []) + with pytest.raises(TypeError): + Transformer.check_target(pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1])) + with pytest.raises(ValueError): + Transformer.check_target( + pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1, 2], name="Y") + ) + with pytest.raises(TypeError): + Transformer.check_array([]) + with pytest.raises(TypeError): + Transformer.check_target(X, []) diff --git a/gators/transformers/tests/test_transformer_xy.py b/gators/transformers/tests/test_transformer_xy.py deleted file mode 100644 index e339f8be..00000000 --- a/gators/transformers/tests/test_transformer_xy.py +++ /dev/null @@ -1,51 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest - -from gators.transformers.transformer_xy import TransformerXY - - -def test_no_transform_method(): - with pytest.raises(TypeError): - - class Class(TransformerXY): - def fit(self): - pass - - Class() - - -def test_object_creation(): - class Class(TransformerXY): - def fit(self, X, y=None): - return self - - def transform(self, X): - pass - - def transform_numpy(self, X): - pass - - Class().fit(0).transform(0) - assert True - - -def test_checks(): - with pytest.raises(TypeError): - TransformerXY.check_dataframe([]) - with pytest.raises(TypeError): - TransformerXY.check_dataframe(pd.DataFrame({"A": [1], 0: ["x"]})) - with pytest.raises(TypeError): - TransformerXY.check_y(pd.DataFrame({"A": [1], 0: ["x"]}), []) - with pytest.raises(TypeError): - TransformerXY.check_y(ks.DataFrame({"A": [1], 0: ["x"]}), []) - with pytest.raises(TypeError): - TransformerXY.check_y(pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1])) - with pytest.raises(ValueError): - TransformerXY.check_y( - pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1, 2], name="y") - ) - with pytest.raises(TypeError): - TransformerXY.check_y([]) diff --git a/gators/transformers/tests/test_transformer_xy_dd.py b/gators/transformers/tests/test_transformer_xy_dd.py new file mode 100644 index 00000000..0cd53e71 --- /dev/null +++ b/gators/transformers/tests/test_transformer_xy_dd.py @@ -0,0 +1,26 @@ +# License: Apache-2.0 +import dask.dataframe as dd +import pandas as pd +import pytest + +from gators.transformers.transformer_xy import TransformerXY + + +def test_checks(): + with pytest.raises(TypeError): + TransformerXY.check_dataframe([]) + with pytest.raises(TypeError): + TransformerXY.check_dataframe( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1) + ) + with pytest.raises(TypeError): + TransformerXY.check_target( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1), [] + ) + with pytest.raises(TypeError): + TransformerXY.check_target( + dd.from_pandas(pd.DataFrame({"A": [1], 0: ["x"]}), npartitions=1), + dd.from_pandas(pd.Series([1]), npartitions=1), + ) + with pytest.raises(TypeError): + TransformerXY.check_target(pd.DataFrame({"A": [1], "B": [2]}), pd.Series([0])) diff --git a/gators/transformers/tests/test_transformer_xy_ks.py b/gators/transformers/tests/test_transformer_xy_ks.py new file mode 100644 index 00000000..49eeea07 --- /dev/null +++ b/gators/transformers/tests/test_transformer_xy_ks.py @@ -0,0 +1,20 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import pandas as pd +import pytest + +from gators.transformers.transformer_xy import TransformerXY + + +@pytest.mark.pyspark +def test_checks(): + with pytest.raises(TypeError): + TransformerXY.check_dataframe([]) + with pytest.raises(TypeError): + TransformerXY.check_dataframe(ps.DataFrame({"A": [1], 0: ["x"]})) + with pytest.raises(TypeError): + TransformerXY.check_target(ps.DataFrame({"A": [1], 0: ["x"]}), []) + with pytest.raises(TypeError): + TransformerXY.check_target(ps.DataFrame({"A": [1], 0: ["x"]}), ps.Series([1])) + with pytest.raises(TypeError): + TransformerXY.check_target(ps.DataFrame({"A": [1], "B": [2]}), pd.Series([0])) diff --git a/gators/transformers/tests/test_transformer_xy_pd.py b/gators/transformers/tests/test_transformer_xy_pd.py new file mode 100644 index 00000000..1fc6bd6a --- /dev/null +++ b/gators/transformers/tests/test_transformer_xy_pd.py @@ -0,0 +1,45 @@ +# License: Apache-2.0 +import pandas as pd +import pytest + +from gators.transformers.transformer_xy import TransformerXY + + +def test_no_transform_method(): + with pytest.raises(TypeError): + + class Class(TransformerXY): + def fit(self): + pass + + Class() + + +def test_object_creation(): + class Class(TransformerXY): + def fit(self, X, y=None): + return self + + def transform(self, X): + pass + + def transform_numpy(self, X): + pass + + Class().fit(0).transform(0) + assert True + + +def test_checks(): + with pytest.raises(TypeError): + TransformerXY.check_dataframe([]) + with pytest.raises(TypeError): + TransformerXY.check_dataframe(pd.DataFrame({"A": [1], 0: ["x"]})) + with pytest.raises(TypeError): + TransformerXY.check_target(pd.DataFrame({"A": [1], 0: ["x"]}), pd.Series([1])) + with pytest.raises(TypeError): + TransformerXY.check_target(pd.DataFrame({"A": [1], "B": [2]}), [0]) + with pytest.raises(ValueError): + TransformerXY.check_target( + pd.DataFrame({"A": [1], "B": [2]}), pd.Series([1, 2], name="Y") + ) diff --git a/gators/transformers/transformer.py b/gators/transformers/transformer.py index d063ab0b..845b34b2 100644 --- a/gators/transformers/transformer.py +++ b/gators/transformers/transformer.py @@ -1,176 +1,177 @@ # License: Apache-2.0 from abc import ABC, abstractmethod -from typing import List, Union +from sklearn.base import BaseEstimator +from sklearn.base import TransformerMixin +from typing import List -import databricks.koalas as ks import numpy as np -import pandas as pd -NUMERICS_DTYPES = [np.int16, np.int32, np.int64, np.float32, np.float64] -PRINT_NUMERICS_DTYPES = ", ".join([dtype.__name__ for dtype in NUMERICS_DTYPES]) +from ..util import util +from gators import DataFrame, Series -class Transformer(ABC): + +class Transformer(ABC, BaseEstimator, TransformerMixin): """Abstract **gators** transformer class. Examples --------- - * A Gators transformer. + * A **Gators** transformer. >>> import pandas as pd - >>> import databricks.koalas as ks + >>> import pyspark.pandas as ps >>> import numpy as np >>> from gators.transformers import Transformer >>> class GetFirstColumn(Transformer): - ... def fit(self, X, y=None): - ... return self - ... def transform(self, X: pd.DataFrame): - ... return X[[X.columns[0]]] - ... def transform_numpy(self, X: np.ndarray): - ... return X[:, 0].reshape(-1, 1) + ... def fit(self, X, y: Series = None): + ... return self + ... def transform(self, X: pd.DataFrame): + ... return X[[X.columns[0]]] + ... def transform_numpy(self, X: np.ndarray): + ... return X[:, 0].reshape(-1, 1) + >>> obj = GetFirstColumn() - * fit & transform with `pandas` + The `fit`, `transform`, and `fit_transform` methods accept: - >>> GetFirstColumn().fit_transform( - ... pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) - A - 0 1 - 1 2 + * `dask` dataframes: - * fit with `pandas` & transform with `NumPy` + >>> import dask.dataframe as dd + >>> import pandas as pd + >>> import numpy as np + >>> X = dd.from_pandas(pd.DataFrame({'A':[1, 2], 'B':[3, 4]}), npartitions=1) - >>> obj = GetFirstColumn().fit( - ... pd.DataFrame({'A':[1, 2], 'B':[3, 4]})) - >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) - array([[5], - [7]]) + * `koalas` dataframes: - * fit & transform with `koalas` + >>> import pyspark.pandas as ps + >>> import numpy as np + >>> X = ps.DataFrame({'A':[1, 2], 'B':[3, 4]}) + + * and `pandas` dataframes: + + >>> import pandas as pd + >>> import numpy as np + >>> X = pd.DataFrame({'A':[1, 2], 'B':[3, 4]}) - >>> GetFirstColumn().fit_transform( - ... ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) + The result is a transformed dataframe belonging to the same dataframe library. + + >>> obj.fit_transform(X) A 0 1 1 2 - * fit with `koalas` & transform with `NumPy` - - >>> obj = GetFirstColumn().fit( - ... ks.DataFrame({'A':[1, 2], 'B':[3, 4]})) - >>> obj.transform_numpy(np.array([[5, 6], [7, 8]])) - array([[5], - [7]]) + Independly of the dataframe library used to fit the transformer, the `tranform_numpy` method only accepts NumPy arrays + and returns a transformed NumPy array. Note that this transformer should **only** be used + when the number of rows is small *e.g.* in real-time environment. + >>> X = pd.DataFrame({'A':[1, 2], 'B':[3, 4]}) + >>> obj.transform_numpy(X.to_numpy()) + array([[1], + [2]]) """ @abstractmethod - def fit( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> "Transformer": + def fit(self, X: DataFrame, y: Series = None) -> "Transformer": """Fit the transformer on the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : None - None. + y : Series, default None. + Target values. Returns ------- - Transformer: Instance of itself. + self : Transformer + Instance of itself. """ @abstractmethod - def transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - ) -> Union[pd.DataFrame, ks.DataFrame]: + def transform(self, X: DataFrame) -> DataFrame: """Transform the dataframe `X`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame Input dataframe. Returns ------- - Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Transformed dataframe. """ @abstractmethod - def transform_numpy( - self, X: Union[pd.Series, ks.Series], y: Union[pd.Series, ks.Series] = None - ): - """Transform the array X. + def transform_numpy(self, X: Series, y: Series = None): + """Transform the array `X`. Parameters ---------- X : np.ndarray - Array + Array. + + Returns + ------- + X : np.ndarray + Transformed array. """ - def fit_transform( - self, - X: Union[pd.DataFrame, ks.DataFrame], - y: Union[pd.Series, ks.Series] = None, - ) -> Union[pd.DataFrame, ks.DataFrame]: - """Fit and Transform the dataframe `X`. + def set_columns(self, X: DataFrame, include: List[type], suffix: str): + """Set the columns of the transformer. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : pd.DataFrame Input dataframe. - y : Union[pd.Series, ks.Series], default to None. - Input target. + include : List[type] + A list of dtypes. + suffix : str + Suffix for the column names. - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Transformed dataframe. """ - _ = self.fit(X, y) - return self.transform(X) + self.base_columns = list(X.columns) + if not self.columns: + self.columns = list(X.select_dtypes(include=include).columns) + self.column_names = ( + self.columns if self.inplace else [f"{c}__{suffix}" for c in self.columns] + ) + self.idx_columns = ( + util.get_idx_columns(X.columns, self.columns) + if self.columns + else np.array([]) + ) @staticmethod - def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): + def check_dataframe(X: DataFrame): """Validate dataframe. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. + X : DataFrame + Dataframe. """ - if not isinstance(X, (pd.DataFrame, ks.DataFrame)): - raise TypeError( - """`X` should be a pandas dataframe or a koalas dataframe.""" - ) + util.get_function(X) for c in X.columns: if not isinstance(c, str): - raise ValueError("Column names of `X` should be of type str.") + raise TypeError("Column names of `X` should be of type str.") @staticmethod - def check_y(X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series]): + def check_target(X: DataFrame, y: Series): """Validate target. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - y : Union[pd.Series, ks.Series] - Labels + X : DataFrame + Dataframe. + y : Series + Target values. """ - if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): - raise TypeError('`y` should be a pandas series.') - if not isinstance(X, pd.DataFrame) and (not isinstance(y, ks.Series)): - raise TypeError('`y` should be a koalas series.') + util.get_function(X).raise_y_dtype_error(y) if not isinstance(y.name, str): raise TypeError("Name of `y` should be a str.") - if X.shape[0] != y.shape[0]: + shape = util.get_function(X).shape + if shape(X)[0] != shape(y)[0]: raise ValueError("Length of `X` and `y` should match.") @staticmethod @@ -179,141 +180,29 @@ def check_array(X: np.ndarray): Parameters ---------- - X (np.ndarray): Array. + X : np.ndarray + Array. """ if not isinstance(X, np.ndarray): raise TypeError("`X` should be a NumPy array.") @staticmethod - def check_dataframe_is_numerics(X: Union[pd.DataFrame, ks.DataFrame]): - """Check if dataframe is only numerics. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - X_dtypes = X.dtypes.unique() - for x_dtype in X_dtypes: - if x_dtype not in NUMERICS_DTYPES: - raise ValueError(f"`X` should be of type {PRINT_NUMERICS_DTYPES}.") - - def check_datatype(self, dtype, accepted_dtypes): - """Check if dataframe is only numerics. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - print_dtypes = ", ".join([dtype.__name__ for dtype in accepted_dtypes]) - if dtype not in accepted_dtypes: - raise ValueError( - f"""`X` should be of type {print_dtypes}. - Use gators.converter.ConvertColumnDatatype before - calling the transformer {self.__class__.__name__}.""" - ) - - @staticmethod - def check_binary_target(y: Union[pd.Series, ks.Series]): - """Raise an error if the target datatype is not binary. + def get_column_names(inplace: bool, columns: List[str], suffix: str): + """Return the names of the modified columns. Parameters ---------- - y : Union[pd.Series, ks.Series] - Target values. - """ - if y.nunique() != 2 or "int" not in str(y.dtype): - raise ValueError("`y` should be binary.") - - @staticmethod - def check_multiclass_target(y: Union[pd.Series, ks.Series]): - """Raise an error if the target datatype is not discrete. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - """ - if "int" not in str(y.dtype): - raise ValueError("`y` should be discrete.") - - @staticmethod - def check_regression_target(y: Union[pd.Series, ks.Series]): - """Raise an error if the target datatype is not discrete. - - Parameters - ---------- - y : Union[pd.Series, ks.Series] - Target values. - """ - if "float" not in str(y.dtype): - raise ValueError("`y` should be float.") - - @staticmethod - def check_dataframe_contains_numerics(X: Union[pd.DataFrame, ks.DataFrame]): - """Check if dataframe is only numerics. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - X_dtypes = X.dtypes.unique() - for x_dtype in X_dtypes: - if x_dtype in NUMERICS_DTYPES: - return - raise ValueError( - f"""`X` should contains one of the following float dtypes: - {PRINT_NUMERICS_DTYPES}. - Use gators.converter.ConvertColumnDatatype before - calling this transformer.""" - ) - - def check_dataframe_with_objects(self, X: Union[pd.DataFrame, ks.DataFrame]): - """Check if dataframe contains object columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - """ - contains_object = object in X.dtypes.unique() - if not contains_object: - raise ValueError( - f"""`X` should contains object columns to use the transformer - {self.__class__.__name__}.""" - ) - - def check_array_is_numerics(self, X: np.ndarray): - """Check if array is only numerics. - - Parameters - ---------- - X : np.ndarray - Array - """ - if X.dtype not in NUMERICS_DTYPES: - raise ValueError( - f"""`X` should be of type {PRINT_NUMERICS_DTYPES} - to use the transformer {self.__class__.__name__}. - Use gators.converter.ConvertColumnDatatype before calling it. - """ - ) - - def check_nans(self, X: Union[pd.DataFrame, ks.DataFrame], columns: List[str]): - """Raise an error if X contains NaN values. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe. + inplace : bool + If True return `columns`. + If False return `columns__suffix`. columns : List[str] List of columns. + suffix : str + Suffix used if `inplace` is False. + + Returns + ------- + List[str] + List of column names. """ - if X[columns].isnull().sum().sum() != 0: - raise ValueError( - f"""The object columns should not contain NaN values - to use the transformer {self.__class__.__name__}. - Use `gators.imputers.ObjectImputer` before calling it.""" - ) + return columns if inplace else [f"{c}__{suffix}" for c in columns] diff --git a/gators/transformers/transformer_xy.py b/gators/transformers/transformer_xy.py index eb6f0420..cb6d56f3 100644 --- a/gators/transformers/transformer_xy.py +++ b/gators/transformers/transformer_xy.py @@ -1,13 +1,14 @@ # License: Apache-2.0 from abc import ABC, abstractmethod -from typing import Union -import databricks.koalas as ks -import pandas as pd + +from ..util import util + +from gators import DataFrame, Series class TransformerXY(ABC): - """Abstract **gators** class to transform both X and y. + """Abstract **gators** transformer class to transform both X and y. Examples --------- @@ -21,8 +22,8 @@ class TransformerXY(ABC): >>> import pandas as pd >>> X, y = FirsRows().transform( - ... X=pd.DataFrame({'A':[1, 2], 'B':[3, 4]}), - ... y=pd.Series([0, 1],name='TARGET')) + ... X=pd.DataFrame({'A':[1, 2], 'B':[3, 4]}), + ... y=pd.Series([0, 1],name='TARGET')) >>> X A B 0 1 3 @@ -32,10 +33,10 @@ class TransformerXY(ABC): * transform with `koalas` - >>> import databricks.koalas as ks + >>> import pyspark.pandas as ps >>> X, y = FirsRows().transform( - ... X=ks.DataFrame({'A':[1, 2], 'B':[3, 4]}), - ... y=ks.Series([0, 1],name='TARGET')) + ... X=ps.DataFrame({'A':[1, 2], 'B':[3, 4]}), + ... y=ps.Series([0, 1],name='TARGET')) >>> X A B 0 1 3 @@ -46,57 +47,50 @@ class TransformerXY(ABC): """ @abstractmethod - def transform( - self, X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series] - ): + def transform(self, X: DataFrame, y: Series): """Fit and Transform the dataframes `X`ad `y`. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame]. + X : DataFrame. Input dataframe. - y : Union[pd.Series, ks.Series] + y : Series None. Returns ------- - Tuple[Union[pd.DataFrame, ks.DataFrame], Union[pd.Series, ks.Series]] + Tuple[DataFrame, Series] Transformed dataframes. """ @staticmethod - def check_dataframe(X: Union[pd.DataFrame, ks.DataFrame]): + def check_dataframe(X: DataFrame): """Validate dataframe. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. """ - if not isinstance(X, (pd.DataFrame, ks.DataFrame)): - raise TypeError( - """`X` should be a pandas dataframe or a koalas dataframe.""" - ) + util.get_function(X) for c in X.columns: if not isinstance(c, str): raise TypeError("Column names of `X` should be of type str.") @staticmethod - def check_y(X: Union[pd.DataFrame, ks.DataFrame], y: Union[pd.Series, ks.Series]): + def check_target(X: DataFrame, y: Series): """Validate target. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Dataframe - y : Union[pd.Series, ks.Series] - Labels + X : DataFrame + Dataframe. + y : Series + Target values. """ - if isinstance(X, pd.DataFrame) and (not isinstance(y, pd.Series)): - raise TypeError('`y` should be a pandas series.') - if not isinstance(X, pd.DataFrame) and (not isinstance(y, ks.Series)): - raise TypeError('`y` should be a koalas series.') + util.get_function(X).raise_y_dtype_error(y) if not isinstance(y.name, str): raise TypeError("Name of `y` should be a str.") - if X.shape[0] != y.shape[0]: + shape = util.get_function(X).shape + if shape(X)[0] != shape(y)[0]: raise ValueError("Length of `X` and `y` should match.") diff --git a/gators/util/benchmark.py b/gators/util/benchmark.py deleted file mode 100644 index 49e84b65..00000000 --- a/gators/util/benchmark.py +++ /dev/null @@ -1,318 +0,0 @@ -# License: Apache-2.0 -from typing import List - -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -from IPython import get_ipython - -from ..transformers.transformer import Transformer - - -def get_runtime_in_milliseconds(ipynb_benchmark: str) -> float: - """Return the runtime in seconds. - - Parameters - ---------- - ipynb_benchmark : str - Output of the jupyter - timeit magic command. - - Returns - ------- - float: - Runtime in milliseconds. - """ - if not isinstance(ipynb_benchmark, str): - raise TypeError("`ipynb_benchmark` should be a str") - dump = ipynb_benchmark.split(" ± ")[0].split(" ") - if "s" not in ipynb_benchmark: - raise ValueError("`ipynb_benchmark` format not supported") - val = float(dump[0]) - t_unit = dump[1] - if "ms" in t_unit: - return val - if "µs" in t_unit: - return val * 1e-3 - if "ns" in t_unit: - return val * 1e-6 - if "s" in t_unit: - return val * 1e3 - - -def generate_per_sample_benchmarking( - objs: List[Transformer], - Xs: List[pd.DataFrame], - extra_info_X_vec: List[str] = None, - extra_info_O_vec: List[str] = None, - ys: List[np.ndarray] = None, - timeit_args="", -) -> pd.DataFrame: - """Calculate the per-sample benchmarking. - - Parameters - ---------- - objs List[Transformer]: - List of transformers. - Xs List[pd.DataFrame]: - List of dataFrames. - ys List[pd.Series], default to None: - List of target values. - - - Returns - ------- - pd.DataFrame: - Benchmarking results. - """ - if ys is None: - ys = len(Xs) * [None] - if not extra_info_O_vec: - index = [ - f"{obj.__class__.__name__}{extra_info_X}" - for obj, extra_info_X in zip(objs, extra_info_X_vec) - ] - elif not extra_info_X_vec: - index = [ - f"{obj.__class__.__name__}{extra_info_O}" - for obj, extra_info_O in zip(objs, extra_info_O_vec) - ] - else: - index = [ - f"{obj.__class__.__name__}{extra_info_O}{extra_info_X}" - for obj, extra_info_O, extra_info_X in zip( - objs, extra_info_X_vec, extra_info_O_vec - ) - ] - columns = ["pandas", "numpy"] - results = pd.DataFrame(np.nan, columns=columns, index=index) - if not extra_info_O_vec: - extra_info_O_vec = len(objs) * [""] - if not extra_info_X_vec: - extra_info_X_vec = len(Xs) * [""] - for i, (obj, extra_info_O) in enumerate(zip(objs, extra_info_O_vec)): - for X, y, extra_info_X in zip(Xs, ys, extra_info_X_vec): - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - "timeit", f"-o {timeit_args} -q obj.transform(X_row.copy())" - ) - results.loc[ - f"{obj.__class__.__name__}{extra_info_O}{extra_info_X}", "pandas" - ] = get_runtime_in_milliseconds(str(dummy)) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" - ) - results.loc[ - f"{obj.__class__.__name__}{extra_info_O}{extra_info_X}", "numpy" - ] = get_runtime_in_milliseconds(str(dummy)) - return results - - -def benchmark_with_same_X( - objs: List[Transformer], - X: pd.DataFrame, - info_vec: List[str], - y: pd.Series = None, - timeit_args="", -) -> pd.DataFrame: - index = [f"{obj.__class__.__name__}{info}" for obj, info in zip(objs, info_vec)] - columns = ["pandas", "numpy"] - results = pd.DataFrame(np.nan, columns=columns, index=index) - for obj, info in zip(objs, info_vec): - idx = f"{obj.__class__.__name__}{info}" - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform(X_row)" - ) - results.loc[idx, "pandas"] = get_runtime_in_milliseconds(str(dummy)) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" - ) - results.loc[idx, "numpy"] = get_runtime_in_milliseconds(str(dummy)) - return results - - -def benchmark( - objs: object, - Xs: List[pd.DataFrame], - info_vec: List[str], - y: pd.Series = None, - timeit_args="", -) -> pd.DataFrame: - - index = [f"{obj.__class__.__name__}{info}" for obj, info in zip(objs, info_vec)] - columns = ["pandas", "numpy"] - bench = pd.DataFrame(np.nan, columns=columns, index=index) - - for obj, X, info in zip(objs, Xs, info_vec): - idx = f"{obj.__class__.__name__}{info}" - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform(X_row)" - ) - bench.loc[idx, "pandas"] = get_runtime_in_milliseconds(str(dummy)) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" - ) - bench.loc[idx, "numpy"] = get_runtime_in_milliseconds(str(dummy)) - return bench - - -def benchmark_with_same_obj( - obj: object, - Xs: List[pd.DataFrame], - info_vec: List[str], - y: pd.Series = None, - timeit_args="", -) -> pd.DataFrame: - - index = [f"{obj.__class__.__name__}{info}" for info in info_vec] - columns = ["pandas", "numpy"] - results = pd.DataFrame(np.nan, columns=columns, index=index) - for X, info in zip(Xs, info_vec): - idx = f"{obj.__class__.__name__}{info}" - X_row = X.iloc[[0]].copy() - X_row_np = X_row.to_numpy() - _ = obj.fit(X.copy(), y) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform(X_row)" - ) - results.loc[idx, "pandas"] = get_runtime_in_milliseconds(str(dummy)) - dummy = get_ipython().run_line_magic( - "timeit", f"-o -q {timeit_args} obj.transform_numpy(X_row_np.copy())" - ) - results.loc[idx, "numpy"] = get_runtime_in_milliseconds(str(dummy)) - return results - - -def plot_comparison(bench_dict): - for key, val in bench_dict.items(): - column = "column" if key == 1 else "columns" - (val[columns] * 1e-3).plot.bar( - logy=True, - ylabel="runtime (s)", - xlabel="trasformer", - rot=90, - color=["#c73d22", "#0077ea"], - legend=True, - figsize=[5 * 1.61, 5], - title=f"per-sample transform vs transform_numpy\n datetime feature generation - {key} {column}", - width=0.75, - fontsize=10, - ) - plt.show() - - -def plot_ratios(bench_dict): - for key, val in bench_dict.items(): - ratio = val["pandas"] / val["numpy"] - column = "column" if key == 1 else "columns" - ax = ratio.plot.bar( - rot=90, - color=["#0077ea"], - legend=False, - figsize=[5 * 1.61, 5], - title=f"per-sample transform vs transform_numpy\n datetime feature generation - {key} {column}", - width=0.75, - fontsize=10, - ) - for p in ax.patches: - ax.annotate( - f"{round(p.get_height())}X", - (p.get_x() * 1 + 0.25, p.get_height() * 1.02), - ) - ax.spines["top"].set_visible(False) - ax.spines["right"].set_visible(False) - ax.spines["bottom"].set_visible(False) - ax.spines["left"].set_visible(False) - ax.get_yaxis().set_ticks([]) - plt.show() - - -def plot_all(bench_dict): - # key = list(bench_dict.keys())[-1] - # val = bench_dict[key] - # columns = (val['pandas']/val['numpy']).sort_values().index - # print(columns) - for key, val in bench_dict.items(): - # val = val.loc[columns] - fig, ax = plt.subplots(1, 2, figsize=[18, 8]) - column = "column" if key == 1 else "columns" - val.index = val.index.str.split("_").str[0] - (val * 1e-3).plot.bar( - ax=ax[0], - logy=True, - ylabel="runtime (s)", - xlabel="transformers", - rot=90, - color=["#c73d22", "#0077ea"], - legend=True, - figsize=[5 * 1.61, 5], - width=0.75, - fontsize=10, - ylim=[1e-6, 1], - ) - (val["pandas"] / val["numpy"]).plot.bar( - ax=ax[1], - rot=90, - color=["#0077ea"], - legend=False, - figsize=[5 * 1.61, 5], - ylabel="runtime speed-up", - xlabel="transformers", - width=0.75, - fontsize=10, - ) - for p in ax[1].patches: - ax[1].annotate( - f"{round(p.get_height())}X", - (p.get_x() + p.get_width() / 2.0, p.get_height()), - ha="center", - va="center", - xytext=(0, 10), - textcoords="offset points", - ) - - ax[1].spines["top"].set_visible(False) - ax[1].spines["right"].set_visible(False) - ax[1].spines["bottom"].set_visible(False) - ax[1].spines["left"].set_visible(False) - ax[1].get_yaxis().set_ticks([]) - - title = f"""per-sample transform vs transform_numpy - {key} {column}""" - plt.suptitle(title, fontsize=12) - plt.tight_layout() - plt.show() - - -def run_X(objs, X, columns, n_vec=[1, 10, 100], y=None, timeit_args=""): - bench_dict = {} - if y is None: - ys = None - else: - ys = [y] - for n in n_vec: - if n == 1: - bench_dict[1] = generate_per_sample_benchmarking( - objs, [X], extra_info_X_vec=["_1column"], ys=ys, timeit_args=timeit_args - ) - - else: - XN = X.copy() - for col in columns: - for i in range(n - 1): - XN[f"{col}{i}"] = X[col].copy() - bench_dict[n] = generate_per_sample_benchmarking( - objs, - [XN], - extra_info_X_vec=[f"_{n}column"], - ys=ys, - timeit_args=timeit_args, - ) - return bench_dict diff --git a/gators/util/iv.py b/gators/util/iv.py new file mode 100644 index 00000000..a75ef866 --- /dev/null +++ b/gators/util/iv.py @@ -0,0 +1,32 @@ +import numpy as np +from gators import DataFrame, Series +from . import util + + +def compute_iv(X: DataFrame, y: Series, regularization=0.1): + y_name = y.name + object_columns = util.get_datatype_columns(X, object) + stats = ( + util.get_function(X) + .melt(X[object_columns].join(y), id_vars=y_name) + .groupby(["variable", "value"]) + .agg(["sum", "count"])[y_name] + ) + stats = util.get_function(X).to_pandas(stats) + stats = stats.rename(columns={"sum": "1"}) + stats.loc[:, "0"] = stats["count"] - stats["1"] + stats = stats.drop("count", axis=1) + stats = stats[["0", "1"]] + stats["N"] = stats[["0", "1"]].sum(axis=1) + stats[["distrib_0", "distrib_1"]] = (stats[["0", "1"]] + regularization) / ( + stats[["0", "1"]].groupby("variable").sum() + 2 * regularization + ) + stats.loc[:, "woe"] = np.log(stats["distrib_1"] / stats["distrib_0"]) + iv = (stats["distrib_1"] - stats["distrib_0"]) * stats["woe"] + iv = iv.groupby("variable").sum() + iv.name = "iv" + iv.index.name = None + iv = iv.sort_values(ascending=False) + stats = stats.sort_values("woe", ascending=False) + + return iv, stats diff --git a/gators/util/tests/test_benchmark.py b/gators/util/tests/test_benchmark.py deleted file mode 100644 index 3c1aafef..00000000 --- a/gators/util/tests/test_benchmark.py +++ /dev/null @@ -1,43 +0,0 @@ -# # License: Apache-2.0 -# import pytest -# import numpy as np -# import pandas as pd -# from gators.scalers.minmax_scaler import MinMaxScaler -# from gators.scalers.standard_scaler import StandardScaler -# from gators.util import benchmark - - -# def test_get_runtime_in_milliseconds(): -# with pytest.raises(ValueError): -# benchmark.get_runtime_in_milliseconds('5X ± ') -# assert benchmark.get_runtime_in_milliseconds('2 ns ± ') == 2e-6 -# assert benchmark.get_runtime_in_milliseconds('3 µs ± ') == 3e-3 -# assert benchmark.get_runtime_in_milliseconds('4 ms ± ') == 4 -# assert benchmark.get_runtime_in_milliseconds('5 s ± ') == 5e3 - - -# def test_generate_per_sample_benchmarking(): -# data = np.arange(9).reshape(3, 3) -# Xs = [ -# pd.DataFrame( -# data, columns=list('ABC'), dtype=float), -# pd.DataFrame( -# data, columns=list('ABC'), dtype=float), -# ] -# objs = [ -# MinMaxScaler(), -# StandardScaler(), -# ] -# extra_info_X_vec = ['Int', 'Float'] -# timeit_args = '-n 1 -r 1' - -# bench = benchmark.generate_per_sample_benchmarking( -# Xs=Xs, -# objs=objs, -# extra_info_X_vec=extra_info_X_vec, -# timeit_args=timeit_args -# ) -# assert list(bench.columns) == ['pandas', 'numpy'] -# assert list(bench.index) == [ -# 'MinMaxScalerInt', 'StandardScalerFloat', -# 'MinMaxScalerFloat', 'StandardScalerInt'] diff --git a/gators/util/tests/test_iv_pd.py b/gators/util/tests/test_iv_pd.py new file mode 100644 index 00000000..4f903a66 --- /dev/null +++ b/gators/util/tests/test_iv_pd.py @@ -0,0 +1,119 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal +from pandas.testing import assert_series_equal + +from gators.util.iv import compute_iv + + +@pytest.fixture +def data(): + X = pd.DataFrame( + { + "Embarked": {0: "S", 1: "C", 2: "S", 3: "S", 4: "S"}, + "Sex": { + 0: "male", + 1: "female", + 2: "female", + 3: "female", + 4: "male", + }, + "Ticket": { + 0: "A", + 1: "B", + 2: "C", + 3: "D", + 4: "A", + }, + } + ) + + y = pd.Series({0: 0, 1: 1, 2: 1, 3: 1, 4: 0}, name="TARGET") + stats_expected = pd.DataFrame( + { + "0": { + ("Sex", "female"): 0, + ("Embarked", "C"): 0, + ("Ticket", "B"): 0, + ("Ticket", "C"): 0, + ("Ticket", "D"): 0, + ("Embarked", "S"): 2, + ("Sex", "male"): 2, + ("Ticket", "A"): 2, + }, + "1": { + ("Sex", "female"): 3, + ("Embarked", "C"): 1, + ("Ticket", "B"): 1, + ("Ticket", "C"): 1, + ("Ticket", "D"): 1, + ("Embarked", "S"): 2, + ("Sex", "male"): 0, + ("Ticket", "A"): 0, + }, + "N": { + ("Sex", "female"): 3, + ("Embarked", "C"): 1, + ("Ticket", "B"): 1, + ("Ticket", "C"): 1, + ("Ticket", "D"): 1, + ("Embarked", "S"): 4, + ("Sex", "male"): 2, + ("Ticket", "A"): 2, + }, + "distrib_0": { + ("Sex", "female"): 0.045454545454545456, + ("Embarked", "C"): 0.045454545454545456, + ("Ticket", "B"): 0.045454545454545456, + ("Ticket", "C"): 0.045454545454545456, + ("Ticket", "D"): 0.045454545454545456, + ("Embarked", "S"): 0.9545454545454545, + ("Sex", "male"): 0.9545454545454545, + ("Ticket", "A"): 0.9545454545454545, + }, + "distrib_1": { + ("Sex", "female"): 0.96875, + ("Embarked", "C"): 0.34375, + ("Ticket", "B"): 0.34375, + ("Ticket", "C"): 0.34375, + ("Ticket", "D"): 0.34375, + ("Embarked", "S"): 0.65625, + ("Sex", "male"): 0.03125, + ("Ticket", "A"): 0.03125, + }, + "woe": { + ("Sex", "female"): 3.0592937550437354, + ("Embarked", "C"): 2.0232018233569597, + ("Ticket", "B"): 2.0232018233569597, + ("Ticket", "C"): 2.0232018233569597, + ("Ticket", "D"): 2.0232018233569597, + ("Embarked", "S"): -0.3746934494414107, + ("Sex", "male"): -3.4192158871648335, + ("Ticket", "A"): -3.4192158871648335, + }, + } + ) + stats_expected.index.names = ["variable", "value"] + iv_expected = pd.Series( + { + "Sex": 5.981578504880071, + "Ticket": 4.967482209335264, + "Embarked": 0.7152812603517865, + } + ) + iv_expected.name = "iv" + return X, y, stats_expected, iv_expected + + +def test_stats(data): + X, y, stats_expected, _ = data + _, stats = compute_iv(X, y) + assert_frame_equal(stats, stats_expected) + + +def test_iv(data): + X, y, _, iv_expected = data + iv, _ = compute_iv(X, y) + assert_series_equal(iv, iv_expected) diff --git a/gators/util/tests/test_util.py b/gators/util/tests/test_util.py deleted file mode 100644 index 802542ce..00000000 --- a/gators/util/tests/test_util.py +++ /dev/null @@ -1,174 +0,0 @@ -# License: Apache-2.0 -import databricks.koalas as ks -import numpy as np -import pandas as pd -import pytest -from pandas.testing import assert_frame_equal - -from gators.util import util - -ks.set_option("compute.default_index_type", "distributed-sequence") - - -@pytest.fixture -def data(): - return pd.DataFrame( - {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] - ) - - -@pytest.fixture -def data_ks(): - return ks.DataFrame( - {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] - ) - - -def test_get_bounds(): - assert np.allclose(util.get_bounds(np.float32), [-3.4028235e38, 3.4028235e38]) - assert np.allclose(util.get_bounds(np.int32), [-2147483648, 2147483647]) - assert np.allclose(util.get_bounds(np.int16), [-32768, 32767]) - - -def test_get_datatype_columns_float_pd(data): - X = data - float_columns = util.get_datatype_columns(X, np.float64) - assert float_columns == ["A", "B", "C"] - - -def test_get_datatype_columns_int_pd(data): - X = data - int_columns = util.get_datatype_columns(X, np.int64) - assert int_columns == ["D", "E"] - - -def test_get_datatype_columns_object_pd(data): - X = data - object_columns = util.get_datatype_columns(X, object) - assert object_columns == ["F"] - - -def test_get_float_only_columns_pd(data): - X = data - float_only_columns = util.get_float_only_columns(X) - assert float_only_columns == ["A", "B", "C"] - - -def test_get_float_only_columns_pd_no(data): - X = pd.DataFrame({"F": "a"}, index=[0]) - float_only_columns = util.get_float_only_columns(X) - assert float_only_columns == [] - - -def test_get_int_only_columns_pd(data): - X = data - int_only_columns = util.get_int_only_columns(X) - assert int_only_columns == ["D", "E"] - - -def test_get_int_only_columns_pd_no(data): - X = pd.DataFrame({"A": "a", "B": "b", "C": "c", "F": "f"}, index=[0]) - int_only_columns = util.get_int_only_columns(X) - assert int_only_columns == [] - - -def test_get_idx_columns(): - columns = ["A", "B", "C", "D", "E"] - selected_columns = ["A", "C", "E"] - indx = util.get_idx_columns(columns, selected_columns) - assert np.allclose(indx, np.array([0, 2, 4])) - - -def test_exclude_idx_columns(): - columns = ["A", "B", "C", "D", "E"] - selected_columns = ["A", "C", "E"] - idx = util.exclude_idx_columns(columns, selected_columns) - assert np.allclose(idx, np.array([1, 3])) - - -def test_concat_pd(data): - X = data - assert_frame_equal( - util.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1), - pd.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1), - ) - - -@pytest.mark.koalas -def test_get_datatype_columns_float_ks(data_ks): - X = data_ks - float_columns = util.get_datatype_columns(X, np.float64) - assert float_columns == ["A", "B", "C"] - - -@pytest.mark.koalas -def test_get_datatype_columns_int_ks(data_ks): - X = data_ks - int_columns = util.get_datatype_columns(X, np.int64) - assert int_columns == ["D", "E"] - - -@pytest.mark.koalas -def test_get_datatype_columns_object_ks(data_ks): - X = data_ks - object_columns = util.get_datatype_columns(X, object) - assert object_columns == ["F"] - - -@pytest.mark.koalas -def test_get_float_only_columns_ks(data_ks): - X = data_ks - float_only_columns = util.get_float_only_columns(X) - assert float_only_columns == ["A", "B", "C"] - - -@pytest.mark.koalas -def test_get_int_only_columns_ks(data_ks): - X = data_ks - int_only_columns = util.get_int_only_columns(X) - assert int_only_columns == ["D", "E"] - - -@pytest.mark.koalas -def test_concat_ks(data_ks): - X = data_ks - assert_frame_equal( - util.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1).to_pandas(), - ks.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1).to_pandas(), - ) - - -@pytest.mark.koalas -def test_generate_spark_dataframe(): - X = ks.DataFrame({"A": [1, 2, 3], "B": [100, 50, 50]}) - y = ks.Series([0, 1, 0], name="TARGET") - ks_expected = ks.DataFrame( - { - "A": [1, 2, 3], - "B": [100, 50, 50], - "TARGET": [0, 1, 0], - "features": [[1.0, 100.0], [2.0, 50.0], [3.0, 50.0]], - } - ) - spark_df = util.generate_spark_dataframe(X=X, y=y) - spark_df_as_ks = ks.DataFrame(spark_df) - assert_frame_equal(ks_expected.to_pandas(), spark_df_as_ks.to_pandas()) - - -@pytest.mark.koalas -def test_generate_spark_dataframe_no_target(): - X = ks.DataFrame({"A": [1, 2, 3], "B": [100, 50, 50]}) - ks_expected = ks.DataFrame( - { - "A": [1, 2, 3], - "B": [100, 50, 50], - "features": [[1.0, 100.0], [2.0, 50.0], [3.0, 50.0]], - } - ) - spark_df = util.generate_spark_dataframe(X=X) - spark_df_as_ks = ks.DataFrame(spark_df) - assert_frame_equal(ks_expected.to_pandas(), spark_df_as_ks.to_pandas()) - - -def test_flatten_list(): - assert util.flatten_list([1, 2, [3, 4]]) == [1, 2, 3, 4] diff --git a/gators/util/tests/test_util_dd.py b/gators/util/tests/test_util_dd.py new file mode 100644 index 00000000..2c6b9a42 --- /dev/null +++ b/gators/util/tests/test_util_dd.py @@ -0,0 +1,61 @@ +# License: Apache-2.0 +import numpy as np +import dask.dataframe as dd +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.util import util + + +@pytest.fixture +def data(): + return dd.from_pandas( + pd.DataFrame( + {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] + ), + npartitions=1, + ) + + +def test_get_bounds(): + assert np.allclose(util.get_bounds(np.float32), [-3.4028235e38, 3.4028235e38]) + assert np.allclose(util.get_bounds(np.int32), [-2147483648, 2147483647]) + assert np.allclose(util.get_bounds(np.int16), [-32768, 32767]) + + +def test_get_datatype_columns_float_pd(data): + X = data + float_columns = util.get_datatype_columns(X, np.float64) + assert float_columns == ["A", "B", "C"] + + +def test_get_datatype_columns_int_pd(data): + X = data + int_columns = util.get_datatype_columns(X, np.int64) + assert int_columns == ["D", "E"] + + +def test_get_datatype_columns_object_pd(data): + X = data + object_columns = util.get_datatype_columns(X, object) + assert object_columns == ["F"] + + +def test_concat_pd(data): + X = data + assert_frame_equal( + util.get_function(X) + .concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1) + .compute(), + pd.concat( + [X.compute(), X[["A"]].compute().rename(columns={"A": "AA"})], axis=1 + ), + ) + + +def test_unique(data): + X = data + _ = util.get_function(X).nunique(X) + _ = util.get_function(X).nunique(X["A"]) + assert True diff --git a/gators/util/tests/test_util_ks.py b/gators/util/tests/test_util_ks.py new file mode 100644 index 00000000..8886a470 --- /dev/null +++ b/gators/util/tests/test_util_ks.py @@ -0,0 +1,50 @@ +# License: Apache-2.0 +import pyspark.pandas as ps +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.util import util + +ps.set_option("compute.default_index_type", "distributed-sequence") + + +@pytest.fixture +def data_ks(): + return ps.DataFrame( + {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] + ) + + +def test_concat_ks(data_ks): + X = data_ks + assert_frame_equal( + util.get_function(X).concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1), + pd.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1), + ) + + +@pytest.mark.pyspark +def test_get_datatype_columns_object_ks(data_ks): + X = data_ks + object_columns = util.get_datatype_columns(X, object) + assert object_columns == ["F"] + + +@pytest.mark.pyspark +def test_concat_ks(data_ks): + X = data_ks + assert_frame_equal( + util.get_function(X) + .concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1) + .to_pandas(), + ps.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1).to_pandas(), + ) + + +@pytest.mark.pyspark +def test_fillna(data_ks): + X = data_ks + _ = util.get_function(X).fillna(X.astype(int), value={"A": 0}) + assert True diff --git a/gators/util/tests/test_util_pd.py b/gators/util/tests/test_util_pd.py new file mode 100644 index 00000000..dc279296 --- /dev/null +++ b/gators/util/tests/test_util_pd.py @@ -0,0 +1,64 @@ +# License: Apache-2.0 +import numpy as np +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from gators.util import util + + +@pytest.fixture +def data(): + return pd.DataFrame( + {"A": 1.1, "B": 2.1, "C": 3.1, "D": 4, "E": 5, "F": "a"}, index=[0] + ) + + +def test_get_bounds(): + assert np.allclose(util.get_bounds(np.float32), [-3.4028235e38, 3.4028235e38]) + assert np.allclose(util.get_bounds(np.int32), [-2147483648, 2147483647]) + assert np.allclose(util.get_bounds(np.int16), [-32768, 32767]) + + +def test_get_datatype_columns_float_pd(data): + X = data + float_columns = util.get_datatype_columns(X, np.float64) + assert float_columns == ["A", "B", "C"] + + +def test_get_datatype_columns_int_pd(data): + X = data + int_columns = util.get_datatype_columns(X, np.int64) + assert int_columns == ["D", "E"] + + +def test_get_datatype_columns_object_pd(data): + X = data + object_columns = util.get_datatype_columns(X, object) + assert object_columns == ["F"] + + +def test_get_idx_columns(): + columns = ["A", "B", "C", "D", "E"] + selected_columns = ["A", "C", "E"] + indx = util.get_idx_columns(columns, selected_columns) + assert np.allclose(indx, np.array([0, 2, 4])) + + +def test_exclude_idx_columns(): + columns = ["A", "B", "C", "D", "E"] + selected_columns = ["A", "C", "E"] + idx = util.exclude_idx_columns(columns, selected_columns) + assert np.allclose(idx, np.array([1, 3])) + + +def test_concat_pd(data): + X = data + assert_frame_equal( + util.get_function(X).concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1), + pd.concat([X, X[["A"]].rename(columns={"A": "AA"})], axis=1), + ) + + +def test_flatten_list(): + assert util.flatten_list([1, 2, [3, 4]]) == [1, 2, 3, 4] diff --git a/gators/util/util.py b/gators/util/util.py index 090a7a4a..9137c538 100644 --- a/gators/util/util.py +++ b/gators/util/util.py @@ -1,10 +1,433 @@ # License: Apache-2.0 -from typing import List, Union +from abc import ABC +from typing import List -import databricks.koalas as ks import numpy as np import pandas as pd -from pyspark.ml.feature import VectorAssembler + +from gators import DataFrame + + +class FunctionFactory(ABC): + def fit(self): + """fit.""" + + def predict(self): + """predict.""" + + def predict_proba(self): + """predict_proba.""" + + def head(self): + """head.""" + + def tail(self): + """tail.""" + + def feature_importances_(self): + """feature_importances_.""" + + def shape(self): + """shape.""" + + def to_pandas(self): + """to_pandas.""" + + def to_numpy(self): + """to_numpy.""" + + def concat(self): + """concat.""" + + def nunique(self): + """nunique.""" + + def get_dummies(self): + """get_dummies.""" + + def to_dict(self): + """to_dict.""" + + def most_frequent(self): + """most_frequent.""" + + def fillna(self): + """fillna.""" + + def random_split(self): + """random_split.""" + + def delta_time(self): + """delta_time.""" + + def join(self): + """join.""" + + def replace(self): + """replace.""" + + +class FunctionPandas(FunctionFactory): + def set_option(self, option, value): + pass + + def head(self, X, n, compute=False): + return X.head(n) + + def tail(self, X, n): + return X.tail(n) + + def fit(self, model, X, y): + return model.fit(X.to_numpy(), y.to_numpy()) + + def predict(self, model, X): + return model.predict(X.to_numpy()) + + def predict_proba(self, model, X): + return model.predict_proba(X.to_numpy()) + + def feature_importances_(self, model, X, y): + model.fit(X.to_numpy(), y.to_numpy()) + feature_importances_ = pd.Series(model.feature_importances_, index=X.columns) + return feature_importances_ + + def shape(self, X): + return X.shape + + def to_pandas(self, X): + return X + + def to_numpy(self, X): + return X.to_numpy() + + def concat(self, objs, **kwargs): + return pd.concat(objs, **kwargs) + + def melt(self, frame, **kwargs): + return pd.melt(frame, **kwargs) + + def nunique(self, X): + return X.nunique() + + def get_dummies(self, X, columns, **kwargs): + return pd.get_dummies(X, columns=columns, **kwargs) + + def to_dict(self, X, **kwargs): + return X.to_dict(**kwargs) + + def most_frequent(self, X): + columns = list(X.columns) + values = [X[c].value_counts().index.to_numpy()[0] for c in columns] + return dict(zip(columns, values)) + + def to_numeric(self, X, columns): + for c in columns: + X[c] = pd.to_numeric(X[c], errors="coerce").fillna(0.0) + return X + + def fillna(self, X, **kwargs): + return X.fillna(**kwargs) + + def random_split(self, X, frac, random_state=None): + X_new = X.sample(frac=1.0 - frac, random_state=random_state) + return X_new, X.drop(X_new.index, axis=0) + + def delta_time(self, X, column_names, columns_a, columns_b, deltatime_dtype): + for name, c_a, c_b in zip(column_names, columns_a, columns_b): + X[name] = (X[c_a] - X[c_b]).dt.total_seconds() + return X + + def join(self, X, other): + return X.join(other) + + def replace(self, X, replace_dict): + return X.replace(replace_dict) + + def raise_y_dtype_error(self, y): + if not isinstance(y, pd.Series): + raise TypeError("`y` should be a pandas series.") + + +class FunctionPySpark(FunctionFactory): + def set_option(self, option, value): + import pyspark.pandas as ps + + ps.set_option(option, value) + + def head(self, X, n, compute=False): + return X.head(n) + + def tail(self, X, n): + return X.tail(n) + + def predict(self, model, X): + from pyspark.ml.feature import VectorAssembler + + columns = X.columns.tolist() + vector_assembler = VectorAssembler(inputCols=columns, outputCol="features") + X_spark = vector_assembler.transform(X.to_spark()) + return model.transform(X_spark).to_koalas()["prediction"] + + def predict_proba(self, model, X): + from pyspark.ml.feature import VectorAssembler + + columns = X.columns.tolist() + vector_assembler = VectorAssembler(inputCols=columns, outputCol="features") + X_spark = vector_assembler.transform(X.to_spark()) + return model.transform(X_spark).to_koalas()["probability"] + + def shape(self, X): + return X.shape + + def fit(self, model, X, y): + from pyspark.ml.feature import VectorAssembler + + columns = X.columns.tolist() + vector_assembler = VectorAssembler(inputCols=columns, outputCol="features") + spark_df = vector_assembler.transform(X.join(y).sort_index().to_spark()) + return model.fit(spark_df) + + def feature_importances_(self, model, X, y): + from pyspark.ml.feature import VectorAssembler + + columns = list(X.columns) + vector_assembler = VectorAssembler(inputCols=columns, outputCol="features") + spark_df = vector_assembler.transform(X.join(y).to_spark()) + trained_model = model.fit(spark_df) + feature_importances_ = pd.Series( + trained_model.featureImportances.toArray(), index=columns + ) + return feature_importances_ + + def to_pandas(self, X): + return X.to_pandas() + + def to_numpy(self, X): + return X.to_numpy() + + def concat(self, objs, **kwargs): + import pyspark.pandas as ps + + return ps.concat(objs, **kwargs) + + def melt(self, frame, **kwargs): + import pyspark.pandas as ps + + return ps.melt(frame, **kwargs) + + def nunique(self, X): + return X.nunique() + + def get_dummies(self, X, columns, **kwargs): + import pyspark.pandas as ps + + return ps.get_dummies(X, columns=columns, **kwargs) + + def to_dict(self, X, **kwargs): + return X.to_dict(**kwargs) + + def most_frequent(self, X): + columns = list(X.columns) + values = [X[c].value_counts().index.to_numpy()[0] for c in columns] + return dict(zip(columns, values)) + + def fillna(self, X, **kwargs): + for col, val in kwargs["value"].items(): + if "int" in str(X[col].dtype): + continue + X[col] = X[col].fillna(val) + return X + + def to_numeric(self, X, columns): + import pyspark.pandas as ps + + for c in columns: + X[c] = ps.to_numeric(X[c]).fillna(0.0) + return X + + def random_split(self, X, frac, random_state=None): + weights = [1 - frac, frac] + main_index_name = X.index.name + index_name = "index" if main_index_name is None else main_index_name + X[index_name] = X.index + train, test = X.to_spark().randomSplit(weights, seed=random_state) + train, test = train.to_koalas().set_index( + index_name + ), test.to_koalas().set_index(index_name) + train.index.name, test.index.name = main_index_name, main_index_name + return train, test + + def delta_time(self, X, column_names, columns_a, columns_b, deltatime_dtype=None): + for name, c_a, c_b in zip(column_names, columns_a, columns_b): + X = X.assign(dummy=(X[c_a].astype(float) - X[c_b].astype(float))).rename( + columns={"dummy": name} + ) + return X + + def join(self, X, other): + import pyspark.pandas as ps + + return X.join(other).sort_index() + + def replace(self, X, replace_dict): + return X.replace(replace_dict) + + def raise_y_dtype_error(self, y): + import pyspark.pandas as ps + + if not isinstance(y, ps.Series): + raise TypeError("`y` should be a pyspark series.") + + +class FunctionDask(FunctionFactory): + def set_option(self, option, value): + pass + + def head(self, X, n, compute=False): + return X.head(n, compute=compute, npartitions=X.npartitions) + + def tail(self, X, n): + return X.tail(n, compute=False) + + def fit(self, model, X, y): + return model.fit(X, y) + + def predict(self, model, X): + return model.predict(X.values) + + def predict_proba(self, model, X): + return model.predict_proba(X.values) + + def shape(self, X): + X_shape = X.shape + if len(X_shape) == 1: + return ( + X_shape[0] if isinstance(X_shape[0], int) else X_shape[0].compute(), + ) + return ( + X_shape[0] if isinstance(X_shape[0], int) else X_shape[0].compute(), + X_shape[1] if isinstance(X_shape[1], int) else X_shape[1].compute(), + ) + + def feature_importances_(self, model, X, y): + _ = model.fit(X, y) + feature_importances_ = pd.Series(model.feature_importances_, index=X.columns) + return feature_importances_ + + def to_pandas(self, X): + return X.compute() + + def to_numpy(self, X): + return X.compute().to_numpy() + + def concat(self, objs, **kwargs): + import dask.dataframe as dd + + return dd.concat(objs, **kwargs) + + def melt(self, frame, **kwargs): + import dask.dataframe as dd + + return dd.melt(frame, **kwargs) + + def nunique(self, X): + if "Series" in str(type(X)): + return X.nunique().compute() + return pd.Series([X[c].nunique().compute() for c in X], index=list(X.columns)) + + def get_dummies(self, X, columns, **kwargs): + import dask.dataframe as dd + + X[columns] = X[columns].astype(object).categorize() + return dd.get_dummies(X, **kwargs) + + def to_dict(self, X, **kwargs): + return X.compute().to_dict(**kwargs) + + def most_frequent(self, X): + columns = list(X.columns) + values = [ + X[c].value_counts().compute().sort_values().index[-1] for c in columns + ] + return dict(zip(columns, values)) + + def fillna(self, X, **kwargs): + return X.fillna(**kwargs) + + def to_numeric(self, X, columns): + import dask.dataframe as dd + + for c in columns: + X[c] = dd.to_numeric(X[c], errors="coerce").fillna(0.0) + return X + + def random_split(self, X, frac, random_state=None): + return X.random_split(frac=[1 - frac, frac], random_state=random_state) + + def delta_time(self, X, column_names, columns_a, columns_b, deltatime_dtype): + for name, c_a, c_b in zip(column_names, columns_a, columns_b): + X[name] = (X[c_a] - X[c_b]).dt.total_seconds() + return X + + def join(self, X, other): + return X.join(other) + + def replace(self, X, replace_dict): + return X.replace(replace_dict) + + # def replace_(X, replace_dict): + # return X.replace(replace_dict) + + # return X.map_partitions(replace_, replace_dict) + + def raise_y_dtype_error(self, y): + import dask.dataframe as dd + + if not isinstance(y, dd.Series): + raise TypeError("`y` should be a dask series.") + + +def get_function(X): + factories = { + "": FunctionPandas(), + "": FunctionPySpark(), + "pyspark.pandas.frame.DataFrame": FunctionPySpark(), # needed for python3.6 + "": FunctionDask(), + "": FunctionDask(), + "": FunctionPandas(), + "": FunctionPySpark(), + "pyspark.pandas.series.Series": FunctionPySpark(), # needed for python3.6 + "": FunctionDask(), + "": FunctionDask(), + } + if str(type(X)) not in factories: + raise TypeError( + """`X` should be a pandas, pyspark, or dask dataframe and + `y` should be a pandas, pyspark, or dask series""" + ) + return factories[str(type(X))] + + +# def get_function(X): +# import pandas as pd +# import pyspark.pandas as ps +# import dask.dataframe as dd + +# factories = { +# pd.DataFrame: FunctionPandas(), +# ps.DataFrame: FunctionPySpark(), +# dd.DataFrame: FunctionDask(), +# pd.Series: FunctionPandas(), +# ps.Series: FunctionPySpark(), +# dd.Series: FunctionDask(), +# } +# for key in factories: +# if isinstance(X, key): +# return factories[key] +# raise TypeError( +# """`X` should be a pandas, koalas, or dask dataframe and +# `y` should be a pandas, koalas, or dask series""" +# ) def get_bounds(X_dtype: type) -> List: @@ -12,7 +435,7 @@ def get_bounds(X_dtype: type) -> List: Parameters ---------- - X_dtype : type, default to np.float64 + X_dtype : type, default np.float64 Numerical NumPy datatype. Returns @@ -28,36 +451,12 @@ def get_bounds(X_dtype: type) -> List: return info.min, info.max -def concat( - objs: List[Union[pd.DataFrame, ks.DataFrame]], axis: int -) -> Union[pd.DataFrame, ks.DataFrame]: - """Concatenate the `objs` along an axis. - - Parameters - ---------- - objs : List[Union[pd.DataFrame, ks.DataFrame]] - List of dataframes to concatenate. - axis : int - The axis to concatenate along. - - Returns - ------- - Union[pd.DataFrame, ks.DataFrame] - Concatenated dataframe. - """ - if isinstance(objs[0], (pd.DataFrame, pd.Series)): - return pd.concat(objs, axis=axis) - return ks.concat(objs, axis=axis) - - -def get_datatype_columns( - X: Union[pd.DataFrame, ks.DataFrame], datatype: type -) -> List[str]: +def get_datatype_columns(X: DataFrame, datatype: type) -> List[str]: """Return the columns of the specified datatype. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. datatype : type Datatype. @@ -68,12 +467,16 @@ def get_datatype_columns( List of columns """ X_dtypes = X.dtypes - mask = X_dtypes == datatype - if isinstance(X, ks.DataFrame) and (datatype == object): - mask = (X_dtypes == object) | (X_dtypes.astype(str).str.startswith(" List[str]: @@ -81,9 +484,9 @@ def exclude_columns(columns: List[str], excluded_columns: List[str]) -> List[str Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - excluded_columns : List[str] + excluded_theta_vec : List[float] List of columns. Returns @@ -100,9 +503,9 @@ def get_idx_columns(columns: List[str], selected_columns: List[str]) -> np.ndarr Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - selected_columns : List[str] + selected_theta_vec : List[float] List of columns. Returns @@ -115,6 +518,7 @@ def get_idx_columns(columns: List[str], selected_columns: List[str]) -> np.ndarr for i, column in enumerate(columns): if column == selected_column: selected_idx_columns.append(i) + break return np.array(selected_idx_columns) @@ -124,9 +528,9 @@ def exclude_idx_columns(columns: List[str], excluded_columns: List[str]) -> np.n Parameters ---------- - columns : List[str] + theta_vec : List[float] List of columns. - excluded_columns : List[str] + excluded_theta_vec : List[float] List of columns. Returns @@ -141,12 +545,12 @@ def exclude_idx_columns(columns: List[str], excluded_columns: List[str]) -> np.n return np.array(selected_idx_columns) -def get_numerical_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: +def get_numerical_columns(X: DataFrame) -> List[str]: """Return the float columns. Parameters ---------- - X : Union[pd.DataFrame, ks.DataFrame] + X : DataFrame Input dataframe. Returns @@ -163,89 +567,7 @@ def get_numerical_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: | (X_dtypes == np.float16) | (X_dtypes == np.int16) ) - numerical_columns = [c for c, m in zip(X_dtypes.index, mask) if m] - return numerical_columns - - -def get_float_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: - """Return the float columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - List[str] - List of columns. - """ - numerical_columns = get_numerical_columns(X) - if not numerical_columns: - return [] - i_max = int(np.min(np.array([X.shape[0], 50000]))) - X_dummy = X[numerical_columns].head(i_max).to_numpy() - float_columns = [ - col - for i, col in enumerate(numerical_columns) - if not np.allclose(X_dummy[:, i].round(), X_dummy[:, i], equal_nan=True) - or (X_dummy[:, i] != X_dummy[:, i]).mean() == 1 - ] - return float_columns - - -def get_int_only_columns(X: Union[pd.DataFrame, ks.DataFrame]) -> List[str]: - """Return the list of integer columns. - - Parameters - ---------- - X : Union[pd.DataFrame, ks.DataFrame] - Input dataframe. - - Returns - ------- - List[str] - List of columns. - """ - numerical_columns = get_numerical_columns(X) - if not numerical_columns: - return [] - i_max = int(np.min(np.array([X.shape[0], 50000]))) - X_dummy = X[numerical_columns].head(i_max).to_numpy() - int_columns = [ - col - for i, col in enumerate(numerical_columns) - if np.allclose(X_dummy[:, i].round(), X_dummy[:, i], equal_nan=True) - and (X_dummy[:, i] != X_dummy[:, i]).mean() != 1 - ] - return int_columns - - -def generate_spark_dataframe(X: ks.DataFrame, y=None): - """ - Generates a Spark dataframe and transforms the features - to one column, ready for training in a SparkML model - - Parameters - ---------- - X : ks.DataFrame - Feature set. - y : ks.Series, default to None. - Target column. Defaults to None. - - Returns - ------- - pyspark.DataFrame - Contains the features transformed into one column. - """ - columns = list(X.columns) - if y is None: - spark_df = X.to_spark() - else: - spark_df = X.join(y).to_spark() - vector_assembler = VectorAssembler(inputCols=columns, outputCol="features") - transformed_spark_df = vector_assembler.transform(spark_df) - return transformed_spark_df + return [c for c, m in zip(X_dtypes.index, mask) if m] def flatten_list(list_to_flatten: List): @@ -268,3 +590,10 @@ def flatten_list(list_to_flatten: List): else: list_flatten += l return list_flatten + + +def prettify_number(x, precision): + if (abs(x) > 1) or (x == 0): + return round(x, precision) + exponent = np.floor(np.log10(abs(x))) + return round(x, int(precision - 1 - exponent)) diff --git a/myproject.toml b/myproject.toml new file mode 100644 index 00000000..842f66c3 --- /dev/null +++ b/myproject.toml @@ -0,0 +1,11 @@ +[tool.poetry] +name = 'gators' +version = '0.3.3' +description = 'Streamline model building and productionization processes.' +authors = ['The Gators Development Team'] +readme = 'README.md' +include = ['*.pyx', '*.c'] +keywords = ['machine learning'] + +[build-system] +requires = ['setuptools', 'wheel', 'numpy', 'Cython'] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 15047fad..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,33 +0,0 @@ -[tool.poetry] -name = 'gators' -version = '0.1.0' -description = 'Streamline model building and productionization processes.' -authors = ['Simility Data Team'] -readme = 'README.md' -include = ['*.so', 'gators/imputers/cython_imputer.pyx', '*.c'] -keywords = ['machine learning'] - -[build-system] -requires = ['setuptools', 'wheel', 'numpy==1.19.5', 'Cython'] - -[tool.poetry.dependencies] -python = '>=3.6,<3.9' -wheel = '>=0.36.0' -jupyter = '^1.0.0' -treelite = '^1.3.0' -xgboost = '^1.4.2' -treelite-runtime = '^1.3.0' -scikit-learn = '^0.24.2' -koalas = '^1.8.0' -matplotlib = '~3.3' -pytest = '^6.2.4' -dill = '^0.3.3' -hyperopt = '^0.2.5' -pytest-cov = '^2.12.0' -ipykernel = '^5.5.5' -Sphinx = '^4.0.2' -pydata-sphinx-theme = "^0.6.3" -pyspark = '^3.1.1' -pandas-profiling = '^3.0.0' -numpydoc = "^1.1.0" -autopep8 = "^1.5.7" diff --git a/pytest.ini b/pytest.ini index 941562d5..8e5c8d02 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,3 +1,3 @@ [pytest] markers = - koalas: test koalas. \ No newline at end of file + pyspark: test pyspark. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 8c4305e7..8b915442 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy<1.20.0 +setuptools +numpy<2 Cython wheel -tox-wheel==0.6.0 diff --git a/requirements_tox.txt b/requirements_tox.txt index b673351b..bd611241 100644 --- a/requirements_tox.txt +++ b/requirements_tox.txt @@ -1,29 +1,30 @@ -numpy==1.19.5 +wheel +numpy Cython -requests>=2.23.0 -tqdm>=4.43.0 -scipy>=1.5.2 -Cython>=0.29.21 -dill>=0.3.1.1 +scipy +Cython +dill scikit-learn -seaborn>=0.11.0 +seaborn pandas treelite>=0.93 treelite-runtime>=0.93 -pyDOE>=0.3.8 -scikit-optimize>=0.8.1 -emcee>=3.0.2 -pyspark>=2.4.3 -koalas -hyperopt>=0.2.5 -lightgbm -pytest>=5.0.0 -pytest-cov>=2.6.0 -pylama>=7.6.5 docutils==0.16.0 +pytest-cov +coverage +pylama>=7.6.5 +ipykernel +jupyter +numpydoc +sphinx==3.3.0 +nbsphinx>=0.8.0 +pydata_sphinx_theme +pandoc tox tox-wheel -xgboost>=0.90 -lightgbm -pytest>=5.0.0 -pytest-cov \ No newline at end of file +black +isort +pyspark +koalas +distributed +dask \ No newline at end of file diff --git a/run_doc.sh b/run_doc.sh index b8f53988..0cfaeff3 100644 --- a/run_doc.sh +++ b/run_doc.sh @@ -7,18 +7,19 @@ rm gators*rst mkdir _static/css +mkdir _static/benchmarks cp ../doc_data/gators.css _static/css/ cp ../doc_data/GATORS_LOGO.png _static/css/ cp ../doc_data/pandas_logo.png _static/ cp ../doc_data/koalas_logo.png _static/ +cp ../doc_data/dask_logo.png _static/ cp ../doc_data/cython_logo.jpeg _static/ cp ../doc_data/numpy_logo.png _static/ cp ../doc_data/sklearn_logo.png _static/ -cp ../doc_data/hyperopt_logo.png _static/ cp ../doc_data/xgboost_logo.png _static/ cp ../doc_data/lightgbm_logo.png _static/ cp ../doc_data/treelite_logo.png _static/ -cp -R ../doc_data/benchmarking_pandas_numpy _static/ +cp -R ../benchmarks/figs/ _static/benchmarks rm conf.py cat > conf.py < index.rst < user_guide/best_practices.rst < user_guide/best_practices.rst <\`__ or \`Koalas \`__ will be dictated by your data set. -For in-memory datasets it is recommended to use pandas, koalas otherwise. +The choice of using \`Pandas \`__, \`Dask \`__, or \`Koalas \`__ will be dictated by your dataset size. +For in-memory datasets it is recommended to use Pandas, Dask or Koalas otherwise. Does the transformation order matter? ##################################### -Absolutely! While Pandas and Koalas dataframes hold the datatype of each column, -Numpy does not. - -It is then important to group the transformations according to the datatype of the columns -they consider. - - 1. datetime column transformations - 2. object column transformations - 3. encoding transformation - 4. numerical transformations +The datetime feature generation steps should be done before the encoding. .. Note:: - After an encoding transformation, all the column datatypes with be set to *np.float32* or *np.float64*, + After an encoding transformation, the data will be only composed of numerical columns, any datetime columns should then be removed before this step. What are the models currently supported by gators? ################################################## -**Gators** mainly focuses on data pre-processing in both offline and in real-time but -a submodule uses the package \`treelite \`__ which compiles in C tree-based +**Gators** mainly focuses on data pre-processing in both offline and in real-time, and model deployment +with the package \`treelite \`__ which compiles in C tree-based models. Only this type of models is currently supported. Note that for deep learning models, the \`tvm package \`__ could be interesting to consider. -When using NumPy? -################## +When using the method \`transform_numpy()\`? +###################################################### + +The method \`transform_numpy()\`, have been designed to speed-up the pre-processing in a production-like environment, where the response time of the data pre-processing is critical. +It is recommended to use \`transform_numpy()\` off-line to validate the prouction pipeline. + -In **gators**, NumPy, by means of the method \`transform_numpy()\` , should only be used in the production environment where the response time of the data pre-processing is critical. Why the method \`fit_numpy()\` is not defined? ############################################## -The offline model building steps are only done with pandas or koalas dataframes. -First, the excellent \`Sklearn \`__ package already handle NumPy arrays, second, +The offline model building steps are only done with Pandas, Dask, or Koalas dataframes. +First, the excellent \`Sklearn \`__ package already handle NumPy arrays, second, NumPy is not suitable for large-scale data. EOL mkdir getting_started -ln ../examples/titanic.ipynb user_guide/ -ln ../examples/sf_crime.ipynb user_guide/ -ln ../examples/house_price.ipynb user_guide/ -ln ../examples/10min.ipynb getting_started/ +cp ../examples/10min.ipynb getting_started/ cat > getting_started/index.rst <=3.6 -* numpy == 1.19.5 +* numpy * cython * sklearn * pandas @@ -326,10 +317,20 @@ Prerequisites Install ======= -From PyPi or conda-forge repositories -##################################### +From PyPi or conda-forge +######################## + + +The default installation (in-memory data only): + +>>> pip install gators +>>> conda install gators + +To handle out-of-core data, you can choose to install Dask, Koalas, or both: + +>>> pip install gators"[dask, koalas]" +>>> conda install gators"[dask, koalas]" -Not yet available From source available on GitHub ############################### @@ -337,21 +338,21 @@ From source available on GitHub If you prefer, you can clone it and run the setup.py file. Use the following commands to get a copy from Github and install all dependencies: - >>> git clone git@github.paypal.com:Simility-R/gators.git - >>> cd gators - >>> pip3 install -r requirements.txt - >>> python3 setup.py build_ext --inplace - >>> pip3 install . +>>> git clone git@github.paypal.com:Simility-R/gators.git +>>> cd gators +>>> pip install -r requirements.txt +>>> python setup.py build_ext --inplace +>>> pip install . To install the dev gators enironment: Extra packages - >>> git clone git@github.paypal.com:Simility-R/gators.git - >>> cd gators - >>> pip3 install -r requirements.txt - >>> python3 setup.py build_ext --inplace - >>> brew install libomp - >>> brew install pandoc - >>> pip3 install .[dev] + +>>> git clone git@github.paypal.com:Simility-R/gators.git +>>> cd gators +>>> pip install -r requirements.txt +>>> python setup.py build_ext --inplace +>>> brew install libomp +>>> pip install .[dev] Test and coverage ################# @@ -363,7 +364,9 @@ Test Test coverage ============= - >>> coverage run -m pytest gators -v + + >>> pip install pytest-cov + >>> pytest -v --cov-report html:cov_html --cov=gators gators Contribute ########## @@ -376,6 +379,28 @@ continuous integration in the API. EOL +mkdir examples +cp ../examples/titanic.ipynb examples/ +cp ../examples/sf_crime.ipynb examples/ +cp ../examples/house_price.ipynb examples/ +cp ../examples/templates.ipynb examples/ +cp ../examples/libraries.ipynb examples/ + +cat > examples/index.rst < reference/index.rst < reference/imputers.rst < _templates/class.rst < benchmarking/index.rst < benchmarking/transform_numpy.rst < benchmarking/fit_transform.rst <=41.0.0', - 'numpy==1.19.5', - 'requests>=2.23.0', - 'tqdm>=4.43.0', - 'scipy>=1.5.2', - 'Cython>=0.29.21', - 'dill>=0.3.1.1', - 'scikit-learn', - 'seaborn>=0.11.0', - 'pandas', # >=0.25.3<1.2 - 'treelite>=0.93', - 'treelite-runtime>=0.93', - 'pyDOE>=0.3.8', - 'scikit-optimize>=0.8.1', - 'emcee>=3.0.2', - 'pyspark>=2.4.3', - 'koalas', - 'hyperopt>=0.2.5', - 'Lightgbm', - 'pytest>=5.0.0', - 'pytest-cov>=2.6.0', - 'pylama>=7.6.5', - 'docutils==0.16.0', - 'sphinx>=3.3.0', - 'nbsphinx>=0.8.0', - 'pydata_sphinx_theme', - 'ipykernel', - 'jupyter', - 'numpydoc', - 'tox', - 'tox-wheel', - 'xgboost>=0.90', - 'lightgbm', - 'pytest>=5.0.0', - 'pytest-cov', - ], + "scikit-learn>=1.0.1", + "pandas", + "pyarrow", + "lightgbm", + "xgboost", + # "treelite", + # "treelite-runtime", + "dill", + ], extras_require={ - 'dev': [ - 'pylama>=7.6.5', - 'ipykernel', - 'jupyter', - 'numpydoc', - 'sphinx>=3.3.0', - 'nbsphinx>=0.8.0', - 'pydata_sphinx_theme', - 'pandoc', - 'tox', - 'tox-wheel', - 'black', - 'isort', + "dev": [ + "docutils", + "pytest", + "pytest-cov", + "coverage", + "pylama", + "jupyter", + "numpydoc", + "sphinx", + "nbsphinx", + "pydata_sphinx_theme", + "pandoc", + "tox", + "tox-wheel", + "black", + "isort", + "pyspark", + "distributed", + "dask", + "numpy<2", ], + "pyspark": [ + "pyspark", + ], + "dask": [ + "fsspec>=0.3.3", + "distributed", + "dask", + ], + }, + package_data={ + "gators": [ + "*.pyx", + ] }, - package_data={'gators': [ - '*.c', - ]}, include_package_data=True, - ext_modules=cythonize(extensions, compiler_directives={ - 'language_level': "3"}), + ext_modules=cythonize(extensions, compiler_directives={"language_level": "3"}), zip_safe=False, ) diff --git a/setup_build.py b/setup_build.py index 8a68c2a7..e786e199 100644 --- a/setup_build.py +++ b/setup_build.py @@ -5,95 +5,91 @@ from Cython.Build import cythonize from gators import __version__ -with open('README.md', 'r') as f: - long_description = f.read().replace('![Gators logo](doc_data/GATORS_LOGO.png)\n\n', '') +with open("README.md", "r") as f: + long_description = f.read() -# rootdir = os.path.normpath(os.path.join(__file__, os.pardir)) -# print(rootdir) -# import sys -# sys.exit() extensions = [ setuptools.Extension( - 'imputer', - ['gators/imputers/imputer.pyx'], + "imputer", + ["gators/imputers/imputer.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'encoder', - ['gators/encoders/encoder.pyx'], + "encoder", + ["gators/encoders/encoder.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'data_cleaning', - ['gators/data_cleaning/data_cleaning.pyx'], + "data_cleaning", + ["gators/data_cleaning/data_cleaning.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'binning', - ['gators/binning/binning.pyx'], + "binning", + ["gators/binning/binning.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'clipping', - ['gators/clipping/clipping.pyx'], + "clipping", + ["gators/clipping/clipping.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'scaler', - ['gators/scalers/scaler.pyx'], + "scaler", + ["gators/scalers/scaler.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'feature_gen', - ['gators/feature_generation/feature_gen.pyx'], + "feature_gen", + ["gators/feature_generation/feature_gen.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'feature_gen_dt', - ['gators/feature_generation_dt/feature_gen_dt.pyx'], + "feature_gen_dt", + ["gators/feature_generation_dt/feature_gen_dt.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], + extra_compile_args=["-O3"], ), setuptools.Extension( - 'feature_gen_str', - ['gators/feature_generation_str/feature_gen_str.pyx'], + "feature_gen_str", + ["gators/feature_generation_str/feature_gen_str.pyx"], include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ) + extra_compile_args=["-O3"], + ), ] setuptools.setup( - name='gators', + name="gators", version=__version__, - url='https://paypal.github.io/gators/', - author='Simility Data Team', - options={'bdist_wheel': {'universal': True}}, + url="https://paypal.github.io/gators/", + author="Simility Data Team", + options={"bdist_wheel": {"universal": True}}, + long_description_content_type="text/markdown", long_description=long_description, - long_description_content_type="text_markdown", - description='Model building and Model deployment library', - maintainer='Charles Poli', - packages=setuptools.find_packages(exclude=['examples', 'doc']), + description="Model building and model scoring library", + maintainer="Charles Poli", + packages=setuptools.find_packages(exclude=["examples", "doc"]), classifiers=[ - 'Programming Language :: Python :: 3', - 'License :: OSI Approved :: Apache-2 License', - 'Operating System :: OS Independent', + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", ], - python_requires='>=3.6', - license='Apache-2.0 Software License', - setup_requires=['numpy', 'Cython'], - package_data={'gators': [ - '*.c', - ]}, + python_requires=">=3.6", + license="Apache-2.0 Software License", + setup_requires=["numpy", "Cython"], + package_data={ + "gators": [ + "*.c", + ] + }, include_package_data=True, - ext_modules=cythonize(extensions, compiler_directives={ - 'language_level': "3"}), + ext_modules=cythonize(extensions, compiler_directives={"language_level": "3"}), zip_safe=False, ) diff --git a/setup_docker.py b/setup_docker.py deleted file mode 100644 index c3cb4a87..00000000 --- a/setup_docker.py +++ /dev/null @@ -1,124 +0,0 @@ -# License: Apache-2.0 -import setuptools -import numpy -from Cython.Build import cythonize -from gators import __version__ -import pyximport -pyximport.install() - - -extensions = [ - setuptools.Extension( - 'imputer', - ['/gators/gators/imputers/imputer.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'encoder', - ['/gators/gators/encoders/encoder.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'data_cleaning', - ['/gators/gators/data_cleaning/data_cleaning.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'binning', - ['/gators/gators/binning/binning.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'clipping', - ['/gators/gators/clipping/clipping.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'scaler', - ['/gators/gators/scalers/scaler.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'feature_gen', - ['/gators/gators/feature_generation/feature_gen.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'feature_gen_dt', - ['/gators/gators/feature_generation_dt/feature_gen_dt.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ), - setuptools.Extension( - 'feature_gen_str', - ['/gators/gators/feature_generation_str/feature_gen_str.pyx'], - include_dirs=[numpy.get_include()], - extra_compile_args=['-O3'], - ) -] - -setuptools.setup( - name='gators', - version=__version__, - author='Simility Data Team', - author_email='cpoli@paypal.com', - options={'bdist_wheel': {'universal': True}}, - description='Model building and Model deployment library', - packages=setuptools.find_packages(exclude=['examples', 'doc']), - classifiers=[ - 'Programming Language :: Python :: 3', - 'License :: OSI Approved :: Apache-2 License', - 'Operating System :: OS Independent', - ], - python_requires='>=3.6', - license='Apache-2.0 Software License', - setup_requires=['numpy', 'Cython'], - install_requires=[ - 'setuptools>=41.0.0', - 'numpy==1.19.5', - 'requests>=2.23.0', - 'tqdm>=4.43.0', - 'scipy>=1.5.2', - 'Cython>=0.29.21', - 'dill>=0.3.1.1', - 'scikit-learn==0.23.1', - 'seaborn>=0.11.0', - 'pandas>=0.25.3<1.2', - 'treelite>=0.93', - 'treelite-runtime>=0.93', - 'xgboost>=0.90', - 'pyDOE>=0.3.8', - 'scikit-optimize>=0.8.1', - 'emcee>=3.0.2', - 'pyspark>=2.4.3', - 'koalas', - 'hyperopt>=0.2.5', - 'Lightgbm', - 'pytest>=5.0.0', - 'pytest-cov>=2.6.0', - 'pylama>=7.6.5', - 'sphinx>=3.3.0', - 'nbsphinx>=0.8.0', - 'pydata_sphinx_theme', - 'ipykernel', - 'jupyter', - 'numpydoc', - 'tox', - 'tox-wheel', - ], - package_data={'gators': [ - '*.c', - ]}, - include_package_data=True, - ext_modules=cythonize( - extensions, - compiler_directives={'language_level': "3"}), - zip_safe=False, -) diff --git a/tests b/tests new file mode 100644 index 00000000..a7218ff2 --- /dev/null +++ b/tests @@ -0,0 +1,790 @@ +============================= test session starts ============================== +platform darwin -- Python 3.11.9, pytest-7.4.4, pluggy-1.3.0 +rootdir: /Users/cpoli/opensource/gators +configfile: pytest.ini +plugins: cov-4.1.0, anyio-4.2.0, pylama-8.4.1 +collected 826 items + +gators/binning/tests/test_bin_rare_categories_dd.py .. [ 0%] +gators/binning/tests/test_bin_rare_categories_ks.py .......... [ 1%] +gators/binning/tests/test_bin_rare_categories_pd.py ........... [ 2%] +gators/binning/tests/test_bin_single_target_class_categories_dd.py .. [ 3%] +gators/binning/tests/test_bin_single_target_class_categories_ks.py . [ 3%] +gators/binning/tests/test_bin_single_target_class_categories_pd.py ..... [ 3%] +. [ 3%] +gators/binning/tests/test_binning_dd.py .......... [ 5%] +gators/binning/tests/test_binning_ks.py .......... [ 6%] +gators/binning/tests/test_binning_pd.py ........... [ 7%] +gators/binning/tests/test_custom_binning_dd.py .......... [ 8%] +gators/binning/tests/test_custom_binning_ks.py .......... [ 10%] +gators/binning/tests/test_custom_binning_pd.py ........... [ 11%] +gators/binning/tests/test_quantile_binning_dd.py .......... [ 12%] +gators/binning/tests/test_quantile_binning_ks.py .......... [ 13%] +gators/binning/tests/test_quantile_binning_pd.py ........... [ 15%] +gators/binning/tests/test_tree_binning_dd.py .... [ 15%] +gators/binning/tests/test_tree_binning_ks.py .... [ 16%] +gators/binning/tests/test_tree_binning_pd.py ....... [ 16%] +gators/clipping/tests/test_clipping_dd.py .. [ 17%] +gators/clipping/tests/test_clipping_ks.py .... [ 17%] +gators/clipping/tests/test_clipping_pd.py ....... [ 18%] +gators/clipping/tests/test_quantile_clipping_dd.py ..FF.. [ 19%] +gators/clipping/tests/test_quantile_clipping_ks.py ...... [ 19%] +gators/clipping/tests/test_quantile_clipping_pd.py ....... [ 20%] +gators/converter/tests/test_to_numpy_dd.py . [ 20%] +gators/converter/tests/test_to_numpy_ks.py . [ 21%] +gators/converter/tests/test_to_numpy_pd.py . [ 21%] +gators/converter/tests/test_to_pandas_dd.py . [ 21%] +gators/converter/tests/test_to_pandas_ks.py . [ 21%] +gators/converter/tests/test_to_pandas_pd.py . [ 21%] +gators/data_cleaning/tests/test_convert_column_datatype_dd.py .... [ 22%] +gators/data_cleaning/tests/test_convert_column_datatype_ks.py .... [ 22%] +gators/data_cleaning/tests/test_convert_column_datatype_pd.py ..... [ 23%] +gators/data_cleaning/tests/test_drop_columns_dd.py .. [ 23%] +gators/data_cleaning/tests/test_drop_columns_ks.py .. [ 23%] +gators/data_cleaning/tests/test_drop_columns_pd.py ..... [ 24%] +gators/data_cleaning/tests/test_drop_datatype_columns_dd.py .. [ 24%] +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py .. [ 24%] +gators/data_cleaning/tests/test_drop_datatype_columns_pd.py ... [ 25%] +gators/data_cleaning/tests/test_drop_high_cardinality_dd.py .. [ 25%] +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py ...... [ 26%] +gators/data_cleaning/tests/test_drop_high_cardinality_pd.py ....... [ 26%] +gators/data_cleaning/tests/test_drop_high_nan_ratio_dd.py .. [ 27%] +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py .... [ 27%] +gators/data_cleaning/tests/test_drop_high_nan_ratio_pd.py ..... [ 28%] +gators/data_cleaning/tests/test_drop_low_cardinality_dd.py ........ [ 29%] +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py ....... [ 30%] +gators/data_cleaning/tests/test_drop_low_cardinality_pd.py ........ [ 30%] +gators/data_cleaning/tests/test_keep_columns_dd.py .. [ 31%] +gators/data_cleaning/tests/test_keep_columns_ks.py .. [ 31%] +gators/data_cleaning/tests/test_keep_columns_pd.py ... [ 31%] +gators/data_cleaning/tests/test_rename_columns_dd.py .. [ 32%] +gators/data_cleaning/tests/test_rename_columns_ks.py .. [ 32%] +gators/data_cleaning/tests/test_rename_columns_pd.py ... [ 32%] +gators/data_cleaning/tests/test_replace_dd.py .. [ 32%] +gators/data_cleaning/tests/test_replace_ks.py .. [ 33%] +gators/data_cleaning/tests/test_replace_pd.py ..... [ 33%] +gators/encoders/tests/test_base_encoder.py . [ 33%] +gators/encoders/tests/test_count_encoder_pd.py ...... [ 34%] +gators/encoders/tests/test_onehot_encoder_dd.py .... [ 35%] +gators/encoders/tests/test_onehot_encoder_ks.py .... [ 35%] +gators/encoders/tests/test_onehot_encoder_pd.py ...... [ 36%] +gators/encoders/tests/test_ordinal_encoder_dd.py .... [ 36%] +gators/encoders/tests/test_ordinal_encoder_ks.py .... [ 37%] +gators/encoders/tests/test_ordinal_encoder_pd.py ....... [ 38%] +gators/encoders/tests/test_target_encoder_dd.py .... [ 38%] +gators/encoders/tests/test_target_encoder_ks.py .... [ 39%] +gators/encoders/tests/test_target_encoder_pd.py ...... [ 39%] +gators/encoders/tests/test_woe_encoder_dd.py ...... [ 40%] +gators/encoders/tests/test_woe_encoder_ks.py ...... [ 41%] +gators/encoders/tests/test_woe_encoder_pd.py ....... [ 42%] +gators/feature_generation/tests/test_cluster_statistics_dd.py ...... [ 42%] +gators/feature_generation/tests/test_cluster_statistics_ks.py ...... [ 43%] +gators/feature_generation/tests/test_cluster_statistics_pd.py ....... [ 44%] +gators/feature_generation/tests/test_elementary_arithmetics_dd.py ...... [ 45%] +.... [ 45%] +gators/feature_generation/tests/test_elementary_arithmetics_ks.py ...... [ 46%] +.... [ 46%] +gators/feature_generation/tests/test_elementary_arithmetics_pd.py ...... [ 47%] +...... [ 48%] +gators/feature_generation/tests/test_is_equal_dd.py ...... [ 49%] +gators/feature_generation/tests/test_is_equal_ks.py ...... [ 49%] +gators/feature_generation/tests/test_is_equal_pd.py ....... [ 50%] +gators/feature_generation/tests/test_is_null_dd.py ...... [ 51%] +gators/feature_generation/tests/test_is_null_ks.py ...... [ 52%] +gators/feature_generation/tests/test_is_null_pd.py ....... [ 52%] +gators/feature_generation/tests/test_one_hot_dd.py .... [ 53%] +gators/feature_generation/tests/test_one_hot_ks.py .... [ 53%] +gators/feature_generation/tests/test_one_hot_pd.py ..... [ 54%] +gators/feature_generation/tests/test_plane_rotation_dd.py .... [ 54%] +gators/feature_generation/tests/test_plane_rotation_ks.py .... [ 55%] +gators/feature_generation/tests/test_plane_rotation_pd.py ..... [ 56%] +gators/feature_generation/tests/test_polynomial_features_dd.py .... [ 56%] +gators/feature_generation/tests/test_polynomial_features_ks.py .... [ 57%] +gators/feature_generation/tests/test_polynomial_features_pd.py ..... [ 57%] +gators/feature_generation/tests/test_polynomial_object_features_dd.py .. [ 57%] + [ 57%] +gators/feature_generation/tests/test_polynomial_object_features_ks.py .. [ 58%] + [ 58%] +gators/feature_generation/tests/test_polynomial_object_features_pd.py .. [ 58%] +. [ 58%] +gators/feature_generation_dt/tests/test_base_datetime_features_dt.py .. [ 58%] +gators/feature_generation_dt/tests/test_cyclic_day_of_month_dd.py .. [ 58%] +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py .. [ 59%] +gators/feature_generation_dt/tests/test_cyclic_day_of_month_pd.py ... [ 59%] +gators/feature_generation_dt/tests/test_cyclic_day_of_week_dd.py .. [ 59%] +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py .. [ 60%] +gators/feature_generation_dt/tests/test_cyclic_day_of_week_pd.py ... [ 60%] +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_dd.py .. [ 60%] +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py .. [ 60%] +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_pd.py ... [ 61%] +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_dd.py .. [ 61%] +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py .. [ 61%] +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_pd.py ... [ 62%] +gators/feature_generation_dt/tests/test_cyclic_month_of_year_dd.py .. [ 62%] +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py .. [ 62%] +gators/feature_generation_dt/tests/test_cyclic_month_of_year_pd.py ... [ 62%] +gators/feature_generation_dt/tests/test_delta_time_dd.py .. [ 63%] +gators/feature_generation_dt/tests/test_delta_time_ks.py .. [ 63%] +gators/feature_generation_dt/tests/test_delta_time_pd.py ..... [ 64%] +gators/feature_generation_dt/tests/test_ordinal_day_of_month_dd.py .. [ 64%] +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py .. [ 64%] +gators/feature_generation_dt/tests/test_ordinal_day_of_month_pd.py ... [ 64%] +gators/feature_generation_dt/tests/test_ordinal_day_of_week_dd.py .. [ 65%] +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py .. [ 65%] +gators/feature_generation_dt/tests/test_ordinal_day_of_week_pd.py ... [ 65%] +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_dd.py .. [ 65%] +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py .. [ 66%] +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_pd.py ... [ 66%] +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_dd.py .. [ 66%] +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py .. [ 67%] +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_pd.py ... [ 67%] + [ 67%] +gators/feature_generation_dt/tests/test_ordinal_month_of_year_dd.py .. [ 67%] +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py .. [ 67%] +gators/feature_generation_dt/tests/test_ordinal_month_of_year_pd.py ... [ 68%] +gators/feature_generation_str/tests/test_extract_dd.py .. [ 68%] +gators/feature_generation_str/tests/test_extract_ks.py .. [ 68%] +gators/feature_generation_str/tests/test_extract_pd.py ... [ 69%] +gators/feature_generation_str/tests/test_lower_case_dd.py .. [ 69%] +gators/feature_generation_str/tests/test_lower_case_ks.py .. [ 69%] +gators/feature_generation_str/tests/test_lower_case_pd.py ....... [ 70%] +gators/feature_generation_str/tests/test_split_extract_pd.py ... [ 70%] +gators/feature_generation_str/tests/test_string_contains_dd.py .... [ 71%] +gators/feature_generation_str/tests/test_string_contains_ks.py .... [ 71%] +gators/feature_generation_str/tests/test_string_contains_pd.py ..... [ 72%] +gators/feature_generation_str/tests/test_string_length_dd.py .. [ 72%] +gators/feature_generation_str/tests/test_string_length_ks.py .. [ 72%] +gators/feature_generation_str/tests/test_string_length_pd.py ... [ 73%] +gators/feature_generation_str/tests/test_upper_case_dd.py .. [ 73%] +gators/feature_generation_str/tests/test_upper_case_ks.py .. [ 73%] +gators/feature_generation_str/tests/test_upper_case_pd.py ....... [ 74%] +gators/feature_selection/tests/test_correlation_filter_dd.py .. [ 74%] +gators/feature_selection/tests/test_correlation_filter_ks.py .. [ 75%] +gators/feature_selection/tests/test_correlation_filter_pd.py ... [ 75%] +gators/feature_selection/tests/test_information_value_dd.py .. [ 75%] +gators/feature_selection/tests/test_information_value_ks.py .. [ 75%] +gators/feature_selection/tests/test_information_value_pd.py ... [ 76%] +gators/feature_selection/tests/test_select_from_model_dd.py .. [ 76%] +gators/feature_selection/tests/test_select_from_model_ks.py .. [ 76%] +gators/feature_selection/tests/test_select_from_model_pd.py ... [ 77%] +gators/feature_selection/tests/test_select_from_models_dd.py .. [ 77%] +gators/feature_selection/tests/test_select_from_models_ks.py .. [ 77%] +gators/feature_selection/tests/test_select_from_models_pd.py ... [ 77%] +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py . [ 78%] +. [ 78%] +gators/feature_selection/tests/test_supervized_correlation_filter_pd.py . [ 78%] +.. [ 78%] +gators/feature_selection/tests/test_variance_filter_dd.py ... [ 78%] +gators/feature_selection/tests/test_variance_filter_ks.py .. [ 79%] +gators/feature_selection/tests/test_variance_filter_pd.py .... [ 79%] +gators/imputers/tests/test_imputers_dd.py .................. [ 81%] +gators/imputers/tests/test_imputers_ks.py .................. [ 84%] +gators/imputers/tests/test_imputers_pd.py .............................. [ 87%] +.... [ 88%] +gators/pipeline/tests/test_pipeline_dd.py .... [ 88%] +gators/pipeline/tests/test_pipeline_ks.py ... [ 88%] +gators/pipeline/tests/test_pipeline_pd.py ...... [ 89%] +gators/sampling/tests/test_supervised_sampling_dd.py . [ 89%] +gators/sampling/tests/test_supervised_sampling_ks.py . [ 89%] +gators/sampling/tests/test_supervised_sampling_pd.py .. [ 90%] +gators/sampling/tests/test_unsupervised_sampling_dd.py ... [ 90%] +gators/sampling/tests/test_unsupervised_sampling_ks.py . [ 90%] +gators/sampling/tests/test_unsupervised_sampling_pd.py ... [ 91%] +gators/scalers/tests/test_minmax_scaler_dd.py .... [ 91%] +gators/scalers/tests/test_minmax_scaler_ks.py .... [ 92%] +gators/scalers/tests/test_minmax_scaler_pd.py .... [ 92%] +gators/scalers/tests/test_standard_scaler_dd.py .. [ 92%] +gators/scalers/tests/test_standard_scaler_ks.py .... [ 93%] +gators/scalers/tests/test_standard_scaler_pd.py .... [ 93%] +gators/scalers/tests/test_yeo_johnson_dd.py ...... [ 94%] +gators/scalers/tests/test_yeo_johnson_ks.py ...... [ 95%] +gators/scalers/tests/test_yeo_johnson_pd.py ......... [ 96%] +gators/transformers/tests/test_transformer_dd.py . [ 96%] +gators/transformers/tests/test_transformer_ks.py . [ 96%] +gators/transformers/tests/test_transformer_pd.py ..... [ 97%] +gators/transformers/tests/test_transformer_xy_dd.py . [ 97%] +gators/transformers/tests/test_transformer_xy_ks.py . [ 97%] +gators/transformers/tests/test_transformer_xy_pd.py ... [ 97%] +gators/util/tests/test_iv_pd.py .. [ 97%] +gators/util/tests/test_util_dd.py ...... [ 98%] +gators/util/tests/test_util_ks.py ... [ 99%] +gators/util/tests/test_util_pd.py ........ [100%] + +=================================== FAILURES =================================== +_____________________________ test_not_inplace_dd ______________________________ + +data_not_inplace = (QuantileClipping(columns=['A', 'B', 'C'], inplace=False, max_quantile=0.8, + min_quantile=0.2), Dask D... 0.784 0.10 1.020 +4 0.80 0.10 0.40 0.800 0.10 0.400) + + def test_not_inplace_dd(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_new = obj.transform(X).compute() +> assert_frame_equal(X_new, X_expected) + +gators/clipping/tests/test_quantile_clipping_dd.py:136: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +testing.pyx:55: in pandas._libs.testing.assert_almost_equal + ??? +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +> ??? +E AssertionError: DataFrame.iloc[:, 4] (column name="B__quantile_clip") are different +E +E DataFrame.iloc[:, 4] (column name="B__quantile_clip") values are different (40.0 %) +E [index]: [0, 1, 2, 3, 4] +E [left]: [0.4, 0.46000000000000013, 0.08800000000000001, 0.1, 0.1] +E [right]: [0.4, 0.7, 0.04, 0.1, 0.1] +E At positional index 1, first diff: 0.46000000000000013 != 0.7 + +testing.pyx:173: AssertionError +____________________________ test_not_inplace_dd_np ____________________________ + +data_not_inplace = (QuantileClipping(columns=['A', 'B', 'C'], inplace=False, max_quantile=0.8, + min_quantile=0.2), Dask D... 0.784 0.10 1.020 +4 0.80 0.10 0.40 0.800 0.10 0.400) + + def test_not_inplace_dd_np(data_not_inplace): + obj, X, X_expected = data_not_inplace + X_numpy_new = obj.transform_numpy(X.compute().to_numpy()) + X_new = pd.DataFrame(X_numpy_new) +> assert np.allclose(X_new.to_numpy(), X_expected.to_numpy()) +E assert False +E + where False = (array([[ 1.8 , 0.4 , 1. , 1.8 , 0.4 , 1. ],\n [ 1.88 , 0.7 , -0.28 , 1.816, 0.46 , -0.136],\n ... ],\n [ 0.72 , 0.1 , 1.1 , 0.784, 0.1 , 1.02 ],\n [ 0.8 , 0.1 , 0.4 , 0.8 , 0.1 , 0.4 ]]), array([[ 1.8 , 0.4 , 1. , 1.8 , 0.4 , 1. ],\n [ 1.88 , 0.7 , -0.28 , 1.816, 0.7 , -0.136],\n ... ],\n [ 0.72 , 0.1 , 1.1 , 0.784, 0.1 , 1.02 ],\n [ 0.8 , 0.1 , 0.4 , 0.8 , 0.1 , 0.4 ]])) +E + where = np.allclose +E + and array([[ 1.8 , 0.4 , 1. , 1.8 , 0.4 , 1. ],\n [ 1.88 , 0.7 , -0.28 , 1.816, 0.46 , -0.136],\n ... ],\n [ 0.72 , 0.1 , 1.1 , 0.784, 0.1 , 1.02 ],\n [ 0.8 , 0.1 , 0.4 , 0.8 , 0.1 , 0.4 ]]) = () +E + where = 0 1 2 3 4 5\n0 1.80 0.40 1.00 1.800 0.400 1.000\n1 1.88 0.70 -0.28 1.816 0.460 -0...1.00 0.04 -0.10 1.000 0.088 -0.100\n3 0.72 0.10 1.10 0.784 0.100 1.020\n4 0.80 0.10 0.40 0.800 0.100 0.400.to_numpy +E + and array([[ 1.8 , 0.4 , 1. , 1.8 , 0.4 , 1. ],\n [ 1.88 , 0.7 , -0.28 , 1.816, 0.7 , -0.136],\n ... ],\n [ 0.72 , 0.1 , 1.1 , 0.784, 0.1 , 1.02 ],\n [ 0.8 , 0.1 , 0.4 , 0.8 , 0.1 , 0.4 ]]) = () +E + where = A B C A__quantile_clip B__quantile_clip C__quantile_clip\n0 1.80 0.40 1.00 1.800 ... 0.784 0.10 1.020\n4 0.80 0.10 0.40 0.800 0.10 0.400.to_numpy + +gators/clipping/tests/test_quantile_clipping_dd.py:143: AssertionError +=============================== warnings summary =============================== +gators/binning/tests/test_bin_rare_categories_ks.py: 3608 warnings +gators/binning/tests/test_bin_single_target_class_categories_ks.py: 554 warnings +gators/binning/tests/test_binning_ks.py: 22480 warnings +gators/binning/tests/test_custom_binning_ks.py: 9434 warnings +gators/binning/tests/test_quantile_binning_ks.py: 20288 warnings +gators/binning/tests/test_tree_binning_ks.py: 5668 warnings +gators/clipping/tests/test_clipping_ks.py: 640 warnings +gators/clipping/tests/test_quantile_clipping_ks.py: 1724 warnings +gators/converter/tests/test_to_numpy_ks.py: 64 warnings +gators/converter/tests/test_to_pandas_ks.py: 64 warnings +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 430 warnings +gators/data_cleaning/tests/test_drop_columns_ks.py: 76 warnings +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 108 warnings +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 746 warnings +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 1240 warnings +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 590 warnings +gators/data_cleaning/tests/test_keep_columns_ks.py: 76 warnings +gators/data_cleaning/tests/test_rename_columns_ks.py: 132 warnings +gators/data_cleaning/tests/test_replace_ks.py: 114 warnings +gators/encoders/tests/test_onehot_encoder_ks.py: 4406 warnings +gators/encoders/tests/test_ordinal_encoder_ks.py: 1330 warnings +gators/encoders/tests/test_target_encoder_ks.py: 1458 warnings +gators/encoders/tests/test_woe_encoder_ks.py: 2520 warnings +gators/feature_generation/tests/test_cluster_statistics_ks.py: 15496 warnings +gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 3484 warnings +gators/feature_generation/tests/test_is_equal_ks.py: 1332 warnings +gators/feature_generation/tests/test_is_null_ks.py: 1778 warnings +gators/feature_generation/tests/test_one_hot_ks.py: 2264 warnings +gators/feature_generation/tests/test_plane_rotation_ks.py: 5628 warnings +gators/feature_generation/tests/test_polynomial_features_ks.py: 3258 warnings +gators/feature_generation/tests/test_polynomial_object_features_ks.py: 1012 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 2382 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 1716 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 1710 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 1710 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 3706 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 2892 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 1616 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 1626 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 1616 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 1616 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 1616 warnings +gators/feature_generation_str/tests/test_extract_ks.py: 498 warnings +gators/feature_generation_str/tests/test_lower_case_ks.py: 528 warnings +gators/feature_generation_str/tests/test_string_contains_ks.py: 1188 warnings +gators/feature_generation_str/tests/test_string_length_ks.py: 810 warnings +gators/feature_generation_str/tests/test_upper_case_ks.py: 528 warnings +gators/feature_selection/tests/test_correlation_filter_ks.py: 222 warnings +gators/feature_selection/tests/test_information_value_ks.py: 396 warnings +gators/feature_selection/tests/test_select_from_model_ks.py: 242 warnings +gators/feature_selection/tests/test_select_from_models_ks.py: 326 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 242 warnings +gators/feature_selection/tests/test_variance_filter_ks.py: 502 warnings +gators/imputers/tests/test_imputers_ks.py: 4056 warnings +gators/pipeline/tests/test_pipeline_ks.py: 2350 warnings +gators/sampling/tests/test_supervised_sampling_ks.py: 964 warnings +gators/sampling/tests/test_unsupervised_sampling_ks.py: 366 warnings +gators/scalers/tests/test_minmax_scaler_ks.py: 4704 warnings +gators/scalers/tests/test_standard_scaler_ks.py: 5148 warnings +gators/scalers/tests/test_yeo_johnson_ks.py: 7824 warnings +gators/transformers/tests/test_transformer_ks.py: 132 warnings +gators/transformers/tests/test_transformer_xy_ks.py: 88 warnings +gators/util/tests/test_util_ks.py: 944 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/typedef/typehints.py:152: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead. + if sys.version_info >= (3, 8) and LooseVersion(np.__version__) >= LooseVersion("1.21"): + +gators/binning/tests/test_bin_rare_categories_ks.py: 936 warnings +gators/binning/tests/test_bin_single_target_class_categories_ks.py: 131 warnings +gators/binning/tests/test_binning_ks.py: 7207 warnings +gators/binning/tests/test_custom_binning_ks.py: 3022 warnings +gators/binning/tests/test_quantile_binning_ks.py: 6531 warnings +gators/binning/tests/test_tree_binning_ks.py: 1831 warnings +gators/clipping/tests/test_clipping_ks.py: 218 warnings +gators/clipping/tests/test_quantile_clipping_ks.py: 580 warnings +gators/converter/tests/test_to_numpy_ks.py: 24 warnings +gators/converter/tests/test_to_pandas_ks.py: 24 warnings +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 147 warnings +gators/data_cleaning/tests/test_drop_columns_ks.py: 26 warnings +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 36 warnings +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 160 warnings +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 386 warnings +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 117 warnings +gators/data_cleaning/tests/test_keep_columns_ks.py: 26 warnings +gators/data_cleaning/tests/test_rename_columns_ks.py: 39 warnings +gators/data_cleaning/tests/test_replace_ks.py: 32 warnings +gators/encoders/tests/test_onehot_encoder_ks.py: 1403 warnings +gators/encoders/tests/test_ordinal_encoder_ks.py: 385 warnings +gators/encoders/tests/test_target_encoder_ks.py: 413 warnings +gators/encoders/tests/test_woe_encoder_ks.py: 693 warnings +gators/feature_generation/tests/test_cluster_statistics_ks.py: 4188 warnings +gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 1178 warnings +gators/feature_generation/tests/test_is_equal_ks.py: 479 warnings +gators/feature_generation/tests/test_is_null_ks.py: 585 warnings +gators/feature_generation/tests/test_one_hot_ks.py: 706 warnings +gators/feature_generation/tests/test_plane_rotation_ks.py: 1872 warnings +gators/feature_generation/tests/test_polynomial_features_ks.py: 1070 warnings +gators/feature_generation/tests/test_polynomial_object_features_ks.py: 241 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 758 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 536 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 533 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 533 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 1159 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 916 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 489 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 494 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 489 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 489 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 489 warnings +gators/feature_generation_str/tests/test_extract_ks.py: 147 warnings +gators/feature_generation_str/tests/test_lower_case_ks.py: 153 warnings +gators/feature_generation_str/tests/test_string_contains_ks.py: 360 warnings +gators/feature_generation_str/tests/test_string_length_ks.py: 240 warnings +gators/feature_generation_str/tests/test_upper_case_ks.py: 153 warnings +gators/feature_selection/tests/test_correlation_filter_ks.py: 72 warnings +gators/feature_selection/tests/test_information_value_ks.py: 81 warnings +gators/feature_selection/tests/test_select_from_model_ks.py: 84 warnings +gators/feature_selection/tests/test_select_from_models_ks.py: 109 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 80 warnings +gators/feature_selection/tests/test_variance_filter_ks.py: 167 warnings +gators/imputers/tests/test_imputers_ks.py: 1292 warnings +gators/pipeline/tests/test_pipeline_ks.py: 779 warnings +gators/sampling/tests/test_supervised_sampling_ks.py: 307 warnings +gators/sampling/tests/test_unsupervised_sampling_ks.py: 112 warnings +gators/scalers/tests/test_minmax_scaler_ks.py: 1507 warnings +gators/scalers/tests/test_standard_scaler_ks.py: 1654 warnings +gators/scalers/tests/test_yeo_johnson_ks.py: 2610 warnings +gators/transformers/tests/test_transformer_ks.py: 51 warnings +gators/transformers/tests/test_transformer_xy_ks.py: 35 warnings +gators/util/tests/test_util_ks.py: 314 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/typedef/typehints.py:181: DeprecationWarning: Converting `np.character` to a dtype is deprecated. The current result is `np.dtype(np.str_)` which is not strictly correct. Note that `np.character` is generally deprecated and 'S1' should be used. + elif tpe in (bytes, np.character, np.bytes_, np.string_): + +gators/binning/tests/test_bin_rare_categories_ks.py: 62 warnings +gators/binning/tests/test_bin_single_target_class_categories_ks.py: 8 warnings +gators/binning/tests/test_binning_ks.py: 136 warnings +gators/binning/tests/test_custom_binning_ks.py: 40 warnings +gators/binning/tests/test_quantile_binning_ks.py: 56 warnings +gators/binning/tests/test_tree_binning_ks.py: 56 warnings +gators/clipping/tests/test_clipping_ks.py: 16 warnings +gators/clipping/tests/test_quantile_clipping_ks.py: 54 warnings +gators/converter/tests/test_to_numpy_ks.py: 8 warnings +gators/converter/tests/test_to_pandas_ks.py: 8 warnings +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 18 warnings +gators/data_cleaning/tests/test_drop_columns_ks.py: 8 warnings +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 8 warnings +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 32 warnings +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 40 warnings +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 32 warnings +gators/data_cleaning/tests/test_keep_columns_ks.py: 8 warnings +gators/data_cleaning/tests/test_rename_columns_ks.py: 8 warnings +gators/data_cleaning/tests/test_replace_ks.py: 8 warnings +gators/encoders/tests/test_onehot_encoder_ks.py: 20 warnings +gators/encoders/tests/test_ordinal_encoder_ks.py: 42 warnings +gators/encoders/tests/test_target_encoder_ks.py: 30 warnings +gators/encoders/tests/test_woe_encoder_ks.py: 48 warnings +gators/feature_generation/tests/test_cluster_statistics_ks.py: 96 warnings +gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 40 warnings +gators/feature_generation/tests/test_is_equal_ks.py: 24 warnings +gators/feature_generation/tests/test_is_null_ks.py: 24 warnings +gators/feature_generation/tests/test_one_hot_ks.py: 16 warnings +gators/feature_generation/tests/test_plane_rotation_ks.py: 16 warnings +gators/feature_generation/tests/test_polynomial_features_ks.py: 16 warnings +gators/feature_generation/tests/test_polynomial_object_features_ks.py: 8 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 106 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 40 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 28 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 28 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 40 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 40 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 40 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 60 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 40 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 40 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 40 warnings +gators/feature_generation_str/tests/test_extract_ks.py: 20 warnings +gators/feature_generation_str/tests/test_lower_case_ks.py: 8 warnings +gators/feature_generation_str/tests/test_string_contains_ks.py: 40 warnings +gators/feature_generation_str/tests/test_string_length_ks.py: 8 warnings +gators/feature_generation_str/tests/test_upper_case_ks.py: 8 warnings +gators/feature_selection/tests/test_correlation_filter_ks.py: 16 warnings +gators/feature_selection/tests/test_information_value_ks.py: 20 warnings +gators/feature_selection/tests/test_select_from_model_ks.py: 12 warnings +gators/feature_selection/tests/test_select_from_models_ks.py: 16 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 24 warnings +gators/feature_selection/tests/test_variance_filter_ks.py: 28 warnings +gators/imputers/tests/test_imputers_ks.py: 232 warnings +gators/pipeline/tests/test_pipeline_ks.py: 8 warnings +gators/sampling/tests/test_supervised_sampling_ks.py: 14 warnings +gators/sampling/tests/test_unsupervised_sampling_ks.py: 4 warnings +gators/scalers/tests/test_minmax_scaler_ks.py: 74 warnings +gators/scalers/tests/test_standard_scaler_ks.py: 84 warnings +gators/scalers/tests/test_yeo_johnson_ks.py: 24 warnings +gators/transformers/tests/test_transformer_ks.py: 16 warnings +gators/transformers/tests/test_transformer_xy_ks.py: 10 warnings +gators/util/tests/test_util_ks.py: 10 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/sql/pandas/utils.py:37: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead. + if LooseVersion(pandas.__version__) < LooseVersion(minimum_pandas_version): + +gators/binning/tests/test_bin_rare_categories_ks.py: 10 warnings +gators/binning/tests/test_bin_single_target_class_categories_ks.py: 1 warning +gators/binning/tests/test_binning_ks.py: 16 warnings +gators/converter/tests/test_to_pandas_ks.py: 2 warnings +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 4 warnings +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 4 warnings +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 4 warnings +gators/encoders/tests/test_ordinal_encoder_ks.py: 12 warnings +gators/encoders/tests/test_target_encoder_ks.py: 2 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 2 warnings +gators/feature_selection/tests/test_variance_filter_ks.py: 2 warnings +gators/scalers/tests/test_minmax_scaler_ks.py: 8 warnings +gators/scalers/tests/test_standard_scaler_ks.py: 8 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/utils.py:1016: PandasAPIOnSparkAdviceWarning: `to_pandas` loads all data into the driver's memory. It should only be used if the resulting pandas Series is expected to be small. + warnings.warn(message, PandasAPIOnSparkAdviceWarning) + +gators/binning/tests/test_bin_rare_categories_ks.py: 9 warnings +gators/binning/tests/test_bin_single_target_class_categories_ks.py: 1 warning +gators/binning/tests/test_binning_ks.py: 5 warnings +gators/binning/tests/test_custom_binning_ks.py: 5 warnings +gators/binning/tests/test_quantile_binning_ks.py: 13 warnings +gators/binning/tests/test_tree_binning_ks.py: 2 warnings +gators/clipping/tests/test_clipping_ks.py: 2 warnings +gators/clipping/tests/test_quantile_clipping_ks.py: 5 warnings +gators/converter/tests/test_to_pandas_ks.py: 2 warnings +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 2 warnings +gators/data_cleaning/tests/test_drop_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 7 warnings +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 4 warnings +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 7 warnings +gators/data_cleaning/tests/test_keep_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_rename_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_replace_ks.py: 1 warning +gators/encoders/tests/test_onehot_encoder_ks.py: 4 warnings +gators/encoders/tests/test_ordinal_encoder_ks.py: 4 warnings +gators/encoders/tests/test_target_encoder_ks.py: 4 warnings +gators/encoders/tests/test_woe_encoder_ks.py: 11 warnings +gators/feature_generation/tests/test_cluster_statistics_ks.py: 3 warnings +gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 5 warnings +gators/feature_generation/tests/test_is_equal_ks.py: 3 warnings +gators/feature_generation/tests/test_is_null_ks.py: 3 warnings +gators/feature_generation/tests/test_one_hot_ks.py: 2 warnings +gators/feature_generation/tests/test_plane_rotation_ks.py: 2 warnings +gators/feature_generation/tests/test_polynomial_features_ks.py: 2 warnings +gators/feature_generation/tests/test_polynomial_object_features_ks.py: 1 warning +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 3 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 3 warnings +gators/feature_generation_str/tests/test_extract_ks.py: 1 warning +gators/feature_generation_str/tests/test_lower_case_ks.py: 1 warning +gators/feature_generation_str/tests/test_string_contains_ks.py: 2 warnings +gators/feature_generation_str/tests/test_string_length_ks.py: 1 warning +gators/feature_generation_str/tests/test_upper_case_ks.py: 1 warning +gators/feature_selection/tests/test_correlation_filter_ks.py: 5 warnings +gators/feature_selection/tests/test_information_value_ks.py: 5 warnings +gators/feature_selection/tests/test_select_from_model_ks.py: 1 warning +gators/feature_selection/tests/test_select_from_models_ks.py: 3 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 5 warnings +gators/feature_selection/tests/test_variance_filter_ks.py: 3 warnings +gators/imputers/tests/test_imputers_ks.py: 27 warnings +gators/scalers/tests/test_minmax_scaler_ks.py: 1 warning +gators/scalers/tests/test_yeo_johnson_ks.py: 4 warnings +gators/util/tests/test_util_ks.py: 2 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/utils.py:1016: PandasAPIOnSparkAdviceWarning: `to_pandas` loads all data into the driver's memory. It should only be used if the resulting pandas DataFrame is expected to be small. + warnings.warn(message, PandasAPIOnSparkAdviceWarning) + +gators/binning/tests/test_bin_rare_categories_ks.py: 5 warnings +gators/binning/tests/test_binning_ks.py: 5 warnings +gators/binning/tests/test_custom_binning_ks.py: 5 warnings +gators/binning/tests/test_quantile_binning_ks.py: 5 warnings +gators/binning/tests/test_tree_binning_ks.py: 26 warnings +gators/clipping/tests/test_clipping_ks.py: 2 warnings +gators/clipping/tests/test_quantile_clipping_ks.py: 17 warnings +gators/converter/tests/test_to_numpy_ks.py: 3 warnings +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 3 warnings +gators/data_cleaning/tests/test_drop_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_drop_datatype_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_drop_high_cardinality_ks.py: 3 warnings +gators/data_cleaning/tests/test_drop_high_nan_ratio_ks.py: 2 warnings +gators/data_cleaning/tests/test_drop_low_cardinality_ks.py: 3 warnings +gators/data_cleaning/tests/test_keep_columns_ks.py: 1 warning +gators/data_cleaning/tests/test_rename_columns_ks.py: 2 warnings +gators/data_cleaning/tests/test_replace_ks.py: 1 warning +gators/encoders/tests/test_onehot_encoder_ks.py: 2 warnings +gators/encoders/tests/test_ordinal_encoder_ks.py: 2 warnings +gators/encoders/tests/test_target_encoder_ks.py: 2 warnings +gators/encoders/tests/test_woe_encoder_ks.py: 3 warnings +gators/feature_generation/tests/test_cluster_statistics_ks.py: 3 warnings +gators/feature_generation/tests/test_elementary_arithmetics_ks.py: 5 warnings +gators/feature_generation/tests/test_is_equal_ks.py: 3 warnings +gators/feature_generation/tests/test_is_null_ks.py: 3 warnings +gators/feature_generation/tests/test_one_hot_ks.py: 2 warnings +gators/feature_generation/tests/test_plane_rotation_ks.py: 2 warnings +gators/feature_generation/tests/test_polynomial_features_ks.py: 2 warnings +gators/feature_generation/tests/test_polynomial_object_features_ks.py: 1 warning +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 2 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 2 warnings +gators/feature_generation_str/tests/test_extract_ks.py: 1 warning +gators/feature_generation_str/tests/test_lower_case_ks.py: 1 warning +gators/feature_generation_str/tests/test_string_contains_ks.py: 2 warnings +gators/feature_generation_str/tests/test_string_length_ks.py: 1 warning +gators/feature_generation_str/tests/test_upper_case_ks.py: 1 warning +gators/feature_selection/tests/test_correlation_filter_ks.py: 1 warning +gators/feature_selection/tests/test_information_value_ks.py: 1 warning +gators/feature_selection/tests/test_select_from_model_ks.py: 1 warning +gators/feature_selection/tests/test_select_from_models_ks.py: 1 warning +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 1 warning +gators/feature_selection/tests/test_variance_filter_ks.py: 1 warning +gators/imputers/tests/test_imputers_ks.py: 13 warnings +gators/pipeline/tests/test_pipeline_ks.py: 1 warning +gators/scalers/tests/test_minmax_scaler_ks.py: 2 warnings +gators/scalers/tests/test_standard_scaler_ks.py: 2 warnings +gators/scalers/tests/test_yeo_johnson_ks.py: 2 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/utils.py:1016: PandasAPIOnSparkAdviceWarning: `to_numpy` loads all data into the driver's memory. It should only be used if the resulting NumPy ndarray is expected to be small. + warnings.warn(message, PandasAPIOnSparkAdviceWarning) + +gators/binning/tests/test_bin_single_target_class_categories_ks.py: 1 warning +gators/binning/tests/test_tree_binning_ks.py: 4 warnings +gators/converter/tests/test_to_numpy_ks.py: 1 warning +gators/converter/tests/test_to_pandas_ks.py: 1 warning +gators/encoders/tests/test_target_encoder_ks.py: 4 warnings +gators/encoders/tests/test_woe_encoder_ks.py: 6 warnings +gators/feature_selection/tests/test_information_value_ks.py: 2 warnings +gators/feature_selection/tests/test_select_from_model_ks.py: 2 warnings +gators/feature_selection/tests/test_select_from_models_ks.py: 2 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 2 warnings +gators/feature_selection/tests/test_variance_filter_ks.py: 2 warnings +gators/sampling/tests/test_supervised_sampling_ks.py: 1 warning +gators/sampling/tests/test_unsupervised_sampling_ks.py: 1 warning +gators/transformers/tests/test_transformer_ks.py: 2 warnings +gators/transformers/tests/test_transformer_xy_ks.py: 1 warning + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/series.py:422: DeprecationWarning: The 'fastpath' keyword in pd.Series is deprecated and will be removed in a future version. + s = pd.Series( + +gators/binning/tests/test_bin_single_target_class_categories_ks.py::test_ks +gators/encoders/tests/test_target_encoder_ks.py::test_ks +gators/encoders/tests/test_target_encoder_ks.py::test_ks_np + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/groupby.py:649: FutureWarning: Default value of `numeric_only` will be changed to `False` instead of `True` in 4.0.0. + warnings.warn( + +gators/binning/tests/test_quantile_binning_ks.py: 8 warnings +gators/clipping/tests/test_quantile_clipping_ks.py: 14 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/frame.py:12228: FutureWarning: Default value of `numeric_only` will be changed to `False` instead of `True` in 4.0.0. + warnings.warn( + +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 1 warning +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 15 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/sql/pandas/types.py:563: DeprecationWarning: is_datetime64tz_dtype is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.DatetimeTZDtype)` instead. + if not is_datetime64tz_dtype(pser.dtype): + +gators/data_cleaning/tests/test_convert_column_datatype_ks.py: 1 warning +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_hour_of_day_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_minute_of_hour_ks.py: 9 warnings +gators/feature_generation_dt/tests/test_cyclic_month_of_year_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_delta_time_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_month_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_hour_of_day_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_minute_of_hour_ks.py: 15 warnings +gators/feature_generation_dt/tests/test_ordinal_month_of_year_ks.py: 15 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/sql/pandas/types.py:379: DeprecationWarning: is_datetime64tz_dtype is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.DatetimeTZDtype)` instead. + if is_datetime64tz_dtype(s.dtype): + +gators/data_cleaning/tests/test_drop_low_cardinality_dd.py::test_dd +gators/data_cleaning/tests/test_drop_low_cardinality_dd.py::test_dd + /Users/cpoli/gators311/lib/python3.11/site-packages/partd/pandas.py:6: DeprecationWarning: create_block_manager_from_blocks is deprecated and will be removed in a future version. Use public APIs instead. + from pandas.core.internals import create_block_manager_from_blocks, make_block + +gators/data_cleaning/tests/test_drop_low_cardinality_dd.py: 4 warnings +gators/encoders/tests/test_ordinal_encoder_dd.py: 32 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pandas/core/frame.py:706: DeprecationWarning: Passing a BlockManager to DataFrame is deprecated and will raise in a future version. Use public APIs instead. + warnings.warn( + +gators/encoders/tests/test_ordinal_encoder_ks.py: 12 warnings +gators/imputers/tests/test_imputers_ks.py: 4 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/base.py:1437: FutureWarning: The resulting Series will have a fixed name of 'count' from 4.0.0. + warnings.warn( + +gators/feature_generation_dt/tests/test_cyclic_day_of_month_ks.py: 72 warnings +gators/feature_generation_dt/tests/test_cyclic_day_of_week_ks.py: 6 warnings +gators/feature_generation_dt/tests/test_ordinal_day_of_week_ks.py: 10 warnings +gators/feature_generation_str/tests/test_extract_ks.py: 6 warnings +gators/feature_generation_str/tests/test_string_contains_ks.py: 12 warnings + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/sql/pandas/utils.py:64: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead. + if LooseVersion(pyarrow.__version__) < LooseVersion(minimum_pyarrow_version): + +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/numpy/lib/function_base.py:520: RuntimeWarning: Mean of empty slice. + avg = a.mean(axis, **keepdims_kw) + +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/numpy/core/_methods.py:121: RuntimeWarning: invalid value encountered in divide + ret = um.true_divide( + +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/pandas/core/frame.py:11184: RuntimeWarning: Degrees of freedom <= 0 for slice + base_cov = np.cov(mat.T, ddof=ddof) + +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/numpy/lib/function_base.py:2748: RuntimeWarning: divide by zero encountered in divide + c *= np.true_divide(1, fact) + +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd +gators/feature_selection/tests/test_correlation_filter_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/numpy/lib/function_base.py:2748: RuntimeWarning: invalid value encountered in multiply + c *= np.true_divide(1, fact) + +gators/feature_selection/tests/test_select_from_model_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use. + Perhaps you already have a cluster running? + Hosting the HTTP server on port 64309 instead + warnings.warn( + +gators/feature_selection/tests/test_select_from_model_ks.py::test_ks +gators/feature_selection/tests/test_select_from_model_ks.py::test_ks_np +gators/feature_selection/tests/test_select_from_models_ks.py::test_ks +gators/feature_selection/tests/test_select_from_models_ks.py::test_ks_np + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/utils.py:1016: PandasAPIOnSparkAdviceWarning: If `index_col` is not specified for `to_spark`, the existing index is lost when converting to Spark DataFrame. + warnings.warn(message, PandasAPIOnSparkAdviceWarning) + +gators/feature_selection/tests/test_select_from_models_dd.py::test_dd + /Users/cpoli/gators311/lib/python3.11/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use. + Perhaps you already have a cluster running? + Hosting the HTTP server on port 64576 instead + warnings.warn( + +gators/feature_selection/tests/test_select_from_models_dd.py::test_dd + /Users/cpoli/gators311/lib/python3.11/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use. + Perhaps you already have a cluster running? + Hosting the HTTP server on port 64638 instead + warnings.warn( + +gators/feature_selection/tests/test_select_from_models_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use. + Perhaps you already have a cluster running? + Hosting the HTTP server on port 64727 instead + warnings.warn( + +gators/feature_selection/tests/test_select_from_models_dd.py::test_dd_np + /Users/cpoli/gators311/lib/python3.11/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use. + Perhaps you already have a cluster running? + Hosting the HTTP server on port 64790 instead + warnings.warn( + +gators/feature_selection/tests/test_supervized_correlation_filter_ks.py: 8 warnings +gators/feature_selection/tests/test_supervized_correlation_filter_pd.py: 8 warnings + /Users/cpoli/opensource/gators/gators/feature_selection/supervized_correlation_filter.py:111: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty. + if val >= self.max_corr: + +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd + /Users/cpoli/opensource/gators/gators/sampling/supervised_sampling.py:116: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected. + Before: .apply(func) + After: .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result + or: .apply(func, meta=('x', 'f8')) for series result + .apply(f, self.frac_dict, self.random_state) + +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd +gators/sampling/tests/test_supervised_sampling_dd.py::test_dd + /Users/cpoli/gators311/lib/python3.11/site-packages/dask/dataframe/groupby.py:210: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning. + return g.apply(func, *args, **kwargs) + +gators/sampling/tests/test_supervised_sampling_ks.py::test_ks + /Users/cpoli/gators311/lib/python3.11/site-packages/pyspark/pandas/utils.py:1016: PandasAPIOnSparkAdviceWarning: If the type hints is not specified for `groupby.apply`, it is expensive to infer the data type internally. + warnings.warn(message, PandasAPIOnSparkAdviceWarning) + +gators/sampling/tests/test_supervised_sampling_pd.py::test_pd + /Users/cpoli/opensource/gators/gators/sampling/supervised_sampling.py:116: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning. + .apply(f, self.frac_dict, self.random_state) + +gators/scalers/tests/test_yeo_johnson_pd.py::test_0lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_2lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_not_inplace_pd + /Users/cpoli/gators311/lib/python3.11/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in log1p + result = getattr(ufunc, method)(*inputs, **kwargs) + +gators/scalers/tests/test_yeo_johnson_pd.py::test_0lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_0lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_0lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_2lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_2lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_2lambda_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_not_inplace_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_not_inplace_pd +gators/scalers/tests/test_yeo_johnson_pd.py::test_not_inplace_pd + /Users/cpoli/gators311/lib/python3.11/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: invalid value encountered in log1p + result = getattr(ufunc, method)(*inputs, **kwargs) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED gators/clipping/tests/test_quantile_clipping_dd.py::test_not_inplace_dd +FAILED gators/clipping/tests/test_quantile_clipping_dd.py::test_not_inplace_dd_np +========== 2 failed, 824 passed, 221318 warnings in 434.53s (0:07:14) ========== diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 9adb1a3d..00000000 --- a/tox.ini +++ /dev/null @@ -1,45 +0,0 @@ -[tox] -envlist = {py36, py37, py38, py39}#-{darwin}#{darwin, linux} # darwin, -indexserver = - preinstall = https://pypi.python.org/simple - -[testenv] -deps = - :preinstall: numpy==1.19.5 - :preinstall: cython - -rrequirements_tox.txt - -commands= - pytest gators -m "not koalas" - - -; [tox] -; envlist = {py36}, py37, py38, py39}-{darwin, linux, windows} # darwin, -; indexserver = -; preinstall = https://pypi.python.org/simple -; -; platform = linux: linux -; windows: win32 -; macos: darwin -; -; [gh-actions] -; python = -; 3.6: py36 -; 3.7: py37 -; 3.8: py38 -; 3.9: py39 -; deps = -; linux: :preinstall: numpy==1.19.5 -; linux: :preinstall: cython -; linux: -rrequirements_tox.txt -; darwin: :preinstall: numpy==1.19.5 -; darwin: :preinstall: cython -; darwin: -rrequirements_tox.txt -; windows: :preinstall: numpy==1.19.5 -; windows: :preinstall: cython -; windows: -rrequirements_tox.txt - -; commands= -; darwin: pytest gators -m "not koalas" -; linux: pytest gators -m "not koalas" -; windows: pytest gators -m "not koalas"